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 _chkr31 経由で表引する。こうすることにより、プログラムのバイナリコードがアドレスに依存しなくなる。これをPIC (Position Independent Code)という。PICは、5-10%程度、遅くなると言われているが、Shared library などには必須。
r31は、
bl L_2 ... mflr r31bl (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_helperdyld で、r11 に格納されたアドレス(L_exit$lazy_ptr) に対して動的にコードが代入される。一度、格納されれば、次からは、L_exit$lazy_ptrには、代入されたコードへのアドレスが入る。