PowerPC の命令

Menu Menu


PowerPC の命令


addressing mode

    (r11)        *(r11)       indexed
    2(r11)        *(r11+2)    indexed + offset 
    r11           r11        register参照
    lo16(234)     234         数値 (16bit 下半分)
    ha16(234)     234         数値 (16bit 上半分)


load store

    lwz     load  from memory 
        lwz r11,0(r6)               word  32bit
        lhz r7,lo16(0)(r7)          short 16bit 
        lbz r7,lo16(0)(r7)          byte  8bit  r7 = *((int*)r7+0)
            z は上位bitを0にするという意味
        lbz r8,lo16(0)(r8)
        extsb r8,r8                 符号拡張 (signed char)
    stw     store into memory
        stw r11,0(r6)               word  32bit
        sth r7,lo16(0)(r7)          short 16bit
        stb r7,lo16(0)(r7)          byte  8bit
    la    load effective address
        la r11,lo16(-16)(r30)       add と同じ r1==r30-16


compuation

    add
        add r10,r10,r11
    and
        and r11,r11,r3
    arithmetic shift left (<<)
        slw r11,r11,r3
    arithmetic shift right (>>)
        sraw r11,r11,r3
    cmp    compare  (結果は condition register cr0-cr7 に入る)
        cmpw cr1,r8,r11
        cmplw cr1,r8,r11 (unsigned compare)
    neg    -r11
        neg r11,r11
    not    ~r11
        nor r11,r11,r11
    exclusiv or ^r11
        xor r29,r29,r3
    multiply              
        mullw r11,r11,r3
    divide    (signed)
        divw r11,r11,r3
    divide    (unsigned)
        divwu r11,r11,r3
    or
        or r11,r11,r3
    subtract
        sub r11,r11,r3


branch

    relative jump 
        b       L_11
    subroutine call (branch and link)
        bl      L_set_converter$stub
    conditional branch (condition register を指定)
        bne cr5,L_431
            be, bne, 
            blt, ble, bgt, bge       signed/unsigned
    return from subroutine
        blr                blanch to link register
    間接 jump (ctr レジスタへのjump)
        mtctr r0
        bctr


miscellaneous

    即値代入
        li r11,-1
    シフト即値代入
        lis r31,ha16(-L_89)
    レジスタ移動
       mr r7,r11    (r11 をr7に移動)
    任意のビット幅の取り出し
        rlwinm r6,r6,0,0xff
    link register から移動
        mflr  r0        
    link register へ移動 
        mtlr  r0        
    スタックへの格納  (store and update)
        stwux r1,r1,r31
    ブランチ予測
        beq+, beq-
    .align   alignment


大域変数の扱い

        addis r9,r31,ha16(L_chk$non_lazy_ptr-L_3)
        lwz r9,lo16(L_chk$non_lazy_ptr-L_3)(r9)
        stw r11,0(r9)
           ...
    L_chk$non_lazy_ptr:
            .long   _chk

r31 経由で表引する。こうすることにより、プログラムのバイナリコードがアドレスに依存しなくなる。これをPIC (Position Independent Code)という。PICは、5-10%程度、遅くなると言われているが、Shared library などには必須。

r31は、

        bl L_2
          ...
        mflr r31

bl (branch and linke) で、プログラムカウンタ(pc)がlink regiser (lr) に、代入される。mflr で、lr レジスタからr31 に代入される。lr 自体は、引き続くサブルーチンコールで破壊されてしまうし、直接、移動演算命令では使えない。

サブルーチンコールも、stub 経由の表引となる。こちらは、ダイナミックリンクなどの処理も行われる。

        bl      L_exit$stub
           ...
    .picsymbol_stub
    L_exit$stub:
            .indirect_symbol _exit
            mflr r0
            bcl 20,31,L0$_exit
    L0$_exit:
            mflr r11
            addis r11,r11,ha16(L_exit$lazy_ptr-L0$_exit)
            mtlr r0
            lwz r12,lo16(L_exit$lazy_ptr-L0$_exit)(r11)
            mtctr r12
            addi r11,r11,lo16(L_exit$lazy_ptr-L0$_exit)
            bctr
    .data
    .lazy_symbol_pointer
    L_exit$lazy_ptr:
            .indirect_symbol _exit
            .long dyld_stub_binding_helper

dyld で、r11 に格納されたアドレス(L_exit$lazy_ptr) に対して動的にコードが代入される。一度、格納されれば、次からは、L_exit$lazy_ptrには、代入されたコードへのアドレスが入る。


Shinji KONO / Fri Oct 22 13:46:32 2004