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には、代入されたコードへのアドレスが入る。