PowerPC アセンブラ ニーモニック

ysd@KLab > PowerPC > ニーモニック

整数数値演算命令

整数演算の比較結果はcr0に格納される。比較方法は符合つき比較である。addやsubfなどは、命令にoをつけることで、演算がオーバーフローしたかどうかを、整数例外レジスタのオーバーフロービットに反映させることができる。

add(o)(.) rD, rA, rB
rAとrBの和をrDに格納する。
addc(o)(.) rD, rA, rB
rAとrBの和をrDに格納し、加算による桁溢れはキャリービットに格納する。
adde(o)(.) rD, rA, rB
rAとrBとキャリービットの和をrDに格納する。多バイト整数の演算に使われると思われる。
addi rD, rA, SIMM
rAと符号あり16bit即値の和をrDに格納する。ただし、rAがr0の場合、rAの値は0であるとみなされ、ただの即値代入になる。
簡略ニーモニック li la subi
addic(.) rD, rA, SIMM
rAと符号あり16bit即値の和をrDに格納する。加算による桁溢れはキャリービットに格納する。
簡略ニーモニック subic(.)
addis rD, rA, SIMM
rrAと、符号あり16bit即値を16bit左シフトした値の和をrDに格納する。ただし、rAがr0の場合、rAの値は0であるとみなされ、ただの即値代入になる。
簡略ニーモニック lis subis
addme(o)(.) rD, rA
rAと-1とキャリービットとの和をrDに格納する。
addze(o)(.) rD, rA
rAとキャリービットとの和をrDに格納する。
cntlzw(.) rA, rS
rSの先頭のビット(一番左)から、連続で0が続いている数をrAに格納する。すなわち、値の領域は、0~32である。
divw(o)(.) rD, rA, rB
rAをrBで割った値をrDに格納する。(符号あり)
divwu(o)(.) rD, rA, rB
rAをrBで割った値をrDに格納する。(符号なし)
la rD, SIMM(rA)
rDに16bit符号付き整数とrAとの和のメモリアドレスをセットする。addi rD, rA, SIMMで実現。
li rD, SIMM
rDに16bit符号付き整数を代入する。addi rD, r0, SIMMで実現。
lis rD, SIMM
rDに16bit符号付き整数を16bit左シフトした値を代入する。addis rD, r0, SIMMで実現。
mulhw(.) rD, rA, rB
rDにrAとrBとの積の、上位32bitを格納する。符号付き乗算。rBに絶対値の小さい方を入れた場合、命令の実行が速くなる可能性がある
mulhwu(.) rD, rA, rB
rDにrAとrBとの積の、上位32bitを格納する。符号なし乗算。rBに絶対値の小さい方を入れた場合、命令の実行が速くなる可能性がある
mulli rD, rA, SIMM
rDにrAと16bit符号付き即値との積の下32bitを格納する。
mullw(o)(.) rD, rA, rB
rDにrAとrBとの積の下32bitを格納する。rBに絶対値の小さい方を入れた場合、命令の実行が速くなる可能性がある
sub(o)(.) rD, rA, rB
rAとrBとの差をrDに格納する。
この命令は、subf rD, rB, rAによって実現されている。
subc(o)(.) rD, rA, rB
rAとrBとの差をrDに格納する。減算による桁繰り下がりはキャリービットに格納。
この命令は、subfc rD, rB, rAによって実現されている。
subf(o)(.) rD, rA, rB
rBからrAの値を引き、rDに格納する。簡略ニーモニック sub
subfc(o)(.) rD, rA, rB
rBからrAの値を引き、rDに格納する。減算による桁繰り下がりはキャリービットに格納。 簡略ニーモニック subc
subfe(o)(.) rD, rA, rB
rB - rA - 1の演算結果に、キャリービットを足して、rDに格納する。つまり、キャリービットをボロービットとして、rBとrAの減算を行う。多バイト整数の減算に使われると思われる。
subfic rD, rA, SIMM
16bit符号付き即値からrAの値を引いてrDに格納する。演算結果はキャリービットに反映される。
subfme(o)(.) rD, rA
rAを符合反転した値に、キャリービットと-1を足す。
subfze(o)(.) rD, rA
-rA - 1にキャリービットを足して、rDに格納する。
subi rD, rA, SIMM
rAから符号あり16bit即値を引き、rDに格納する。ただし、rAがr0の場合、rAの値は0であるとみなされ、ただの即値代入になる。
この命令は、addi rD, rA, -(value)によって実現されている。
subic(.) rD, rA, SIMM
rAから符号あり16bit即値を引き、rDに格納する。減算による桁繰り下がりはキャリービットに格納。
この命令は、addic(.) rD, rA, -(value)によって実現されている。
subis rD, rA, SIMM
rAから符号あり16bit整数を16bit左シフトした値を引き、rDに格納する。ただし、rAがr0の場合、rAの値は0であるとみなされ、ただの即値代入になる。
この命令は、addis rD, rA, -(value)によって実現されている。

論理演算命令

論理演算の比較結果はcr0に格納される。比較方法は符合つき比較である。

and(.) rA, rS, rB
rSとrBとの論理積をrAに格納する。
andc(.) rA, rS, rB
rSとrBの否定との論理積をrDに格納する。
andi. rA, rS, UIMM
rSと符号なし16bit即値との論理積をrDに格納する。
andis. rA, rS, UIMM
rSと符号なし16bit即値を16bit左シフトした値との論理積をrDに格納する。
clrlwi(.) rA, rS, n
rSの上からn番目のbitまでを0クリアしてrAに格納する。ただし、nは32未満であること。
この命令は、rlwinm rA,rS, 0, n, 31で実現されている。
clrrwi(.) rA, rS, n
rSの下からn番目のbitまでを0クリアしてrAに格納する。ただし、nは32未満であること。
この命令は、rlwinm rA,rS, 0, 0, 31 - nで実現されている。
eqv(.) rA, rS, rB
rSと、rBの否定との排他的論理和をrAに格納する。
extsb(.) rA, rS
rSの内容を1byte符号拡張した値をrAに格納する。
extsh(.) rA, rS
rSの内容を2byte符号拡張した値をrAに格納する。
nand(.) rA, rS, rB
rSとrBとの論理積の否定をrAに格納する。
neg(o)(.) rD, rA
rDにrAの符号を反転した値を入れる。rD = rA * -1
nor(.) rA, rS, rB
rSとrBとの論理和の否定をrAに格納する。
簡略ニーモニック not
not(.) rD, rS
rSの否定をrDに格納する。この命令は、nor rD, rS, rSによって実現されている。
or(.) rA, rS, rB
rSとrBとの論理和をrAに格納する。
簡略ニーモニック mr
orc(.) rA, rS, rB
rSと,rBの否定との論理和をrAに格納する。
簡略ニーモニック mr
ori rA, rS, UIMM
rSと16bit符号なし即値との論理和をrAに格納する。
簡略ニーモニック nop
oris rA, rS, UIMM
rSと16bit符号なし即値を左に16bitシフトした値との論理和をrAに格納する。
rlwimi(.) rA, rS, SH, MB, ME
SHに与えられた値分だけrSの内容を左回転シフトし、その値で、MB bit目からME bit目までのrAの内容を書き換える。(最上位bitが0)MB > MEの場合、マスク範囲はループする。
rlwinm(.) rA, rS, SH, MB, ME
SHに与えられた値分だけrSの内容を左回転シフトし、その値のMB bit目からME bit目までの値をrAに格納する。(最上位bitが0)MB > MEの場合、マスク範囲はループする。
簡略ニーモニックrotlwi rotrwi slwi srwi clrlwi clrrwi
rlwnm(.) rA, rS, rB, MB, ME
rBの値分だけrSの内容を左回転シフトし、その値のMB bit目からME bit目までの値をrAに格納する。(最上位bitが0)MB > MEの場合、マスク範囲はループする。
簡略ニーモニックrotlw
rotlw(.) rA, rS, rB
rSをrBの値分だけ左回転シフトして、rAに格納する。
この命令は、rlwnm rA,rS, rB, 0, 31で実現されている。
rotlwi(.) rA, rS, n
rSを即値nだけ左回転シフトして、rAに格納する。
この命令は、rlwinm rA,rS, n, 0, 31で実現されている。
rotrwi(.) rA, rS, n
rSを即値nだけ右回転シフトして。rAに格納する。
この命令は、rlwinm rA,rS, 32 - n, 0, 31で実現されている。
slw(.) rA, rS, rB
rSをrBの値だけ左論理シフトを行い、rAに格納する。
slwi(.) rA, rS, n
rSを即値nだけ左論理シフトを行い、rAに格納する。ただし、nは32未満であること。
この命令は、rlwinm rA,rS, n, 0, 31 - nで実現されている。
sraw(.) rA, rS, rB
rSをrBの値だけ右算術シフトを行い、rAに格納する。
srawi(.) rA, rS, SH
rSを即値SHの値だけ右算術シフトを行い、rAに格納する。SHは32未満。
srw(.) rA, rS, rB
rSをrBの値だけ右論理シフトを行い、rAに格納する。
srwi(.) rA, rS, n
rSを即値nだけ右論理シフトを行い、rAに格納する。ただし、nは32未満であること。
この命令は、rlwinm rA,rS, 32 - n, n, 31で実現されている。
xor(.) rA, rS, rB
rSとrBとの排他的論理和をrAに格納する。
xori rA, rS, UIMM
rSと16bit符号なし即値との排他的論理和をrAに格納する。
xoris rA, rS, UIMM
rSと16bit符号なし即値を16bit左シフトした値 との排他的論理和をrAに格納する。

浮動小数演算命令

浮動小数演算と同時に比較結果を出した場合、cr1に格納される。ただし、その内容は演算結果の例外状態なので注意。浮動小数同士の値の大小を比べる場合は比較命令を使うこと。

また、浮動小数から整数への変換命令はあるが、整数から浮動小数への変換命令は存在しない。

fabs(.) fD, fB
fBの値の絶対値をfDに格納する。
fadd(.) fD, fA, fB
fAとfBの和をfDに格納する。(倍精度)
fadds(.) fD, fA, fB
fAとfBの和をfDに格納する。(単精度)
fctiw(.) fD, fB
fBの値を32bit符号付き整数値に変換し、fDの下32bitに格納する。小数の丸め方は、FPSCR[RN]で指定された方法。このとき、fDの上32bitは未定義なので注意。
fctiwz(.) fD, fB
fBの値を32bit符号付き整数値に変換し、fDの下32bitに格納する。小数は切り捨て。このとき、fDの上32bitは未定義なので注意。
fdiv(.) fD, fA, fB
fAとfBの商をfDに格納する。(倍精度)
fdivs(.) fD, fA, fB
fAとfBの商をfDに格納する。(単精度)
fmadd(.) fD, fA, fC, fB
fAとfCとの積の結果と、fBとの和をfDに格納する。(倍精度)
fmadds(.) fD, fA, fC, fB
fAとfCとの積の結果と、fBとの和をfDに格納する。(単精度)
fmr(.) fD, fB
fBの内容をfDに格納する。
fmsub(.) fD, fA, fC, fB
fAとfCとの積の結果と、fBとの差をfDに格納する。(倍精度)
fmsubs(.) fD, fA, fC, fB
fAとfCとの積の結果と、fBとの差をfDに格納する。(単精度)
fmul(.) fD, fA, fC, fB
fAとfCとの積をfDに格納する。(倍精度)
fmuls(.) fD, fA, fC, fB
fAとfCとの積をfDに格納する。(単精度)
fnabs(.) fD, fB
fBの値の絶対値の負の値をfDに格納する。
fneg(.) fD, fB
fBの値の符号を反転してfDに格納する。
fnmadd(.) fD, fA, fC, fB
fAとfCとの積の結果と、fBとの和に-1をかけた値をfDに格納する。(倍精度)
fnmadds(.) fD, fA, fC, fB
fAとfCとの積の結果と、fBとの和に-1をかけた値をfDに格納する。(単精度)
fnmsub(.) fD, fA, fC, fB
fAとfCとの積の結果と、fBとの差に-1をかけた値をfDに格納する。(倍精度)
fnmsubs(.) fD, fA, fC, fB
fAとfCとの積の結果と、fBとの差に-1をかけた値をfDに格納する。(単精度)
fres(.) fD, fB
fBの値の補数をfDに格納する。単精度のみ。
frsp(.) fD, fB
fBを単精度浮動小数値にまるめた値をfDに格納する。
frsqrte(.) fD, fB
fBの平方根の補数をfDに格納する。倍精度のみ。
fsel(.) fD, fA, fC, fB
fAが0以上の値ならfCを、負の値ならfBを、fDに格納する。
fsqrt(.) fD, fB
fBの平方根をfDに格納する。(倍精度)
fsqrts(.) fD, fB
fBの平方根をfDに格納する。(単精度)
fsub(.) fD, fA, fB
fAとfBとの差をfDに格納する。(倍精度)
fsubs(.) fD, fA, fB
fAとfBとの差をfDに格納する。(単精度)

データ転送命令

PowerPCでは、メモリアクセスを行う命令はアラインが正しい(4byteメモリアクセスの場合、アクセス先のアドレスは4の倍数なら、アラインが正しい)方がメモリアクセス効率がいい。別にアラインが正しくなくても、メモリアクセス効率が悪くなるものの、アクセスは可能。

lbz rD, d(rA)
rAの値(r0の場合は0)と16bit符号付き整数との和をメモリアドレス位置として、rDに1byte符号なし整数をロードする。
lbzu rD, d(rA)
rAの値と16bit符号付き整数との和をメモリアドレス位置として、rDに1byte符号なし整数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。
lbzux rD, rA, rB
rAの値とrBとの和をメモリアドレス位置として、rDに1byte符号なし整数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。
lbzx rD, rA, rB
rAの値(r0の場合は0)とrBとの和をメモリアドレス位置として、rDに1byte符号なし整数をロードする。
lfd fD, d(rA)
rAの値(r0の場合は0)と16bit符号付き整数との和をメモリアドレス位置として、fDに倍精度浮動小数をロードする。メモリアドレスが8の倍数であるほうが効率がいい。
lfdu fD, d(rA)
rAの値と16bit符号付き整数との和をメモリアドレス位置として、fDに倍精度浮動小数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。メモリアドレスが8の倍数であるほうが効率がいい。
lfdux fD, rA, rB
rAの値とrBとの和をメモリアドレス位置として、fDに倍精度浮動小数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。メモリアドレスが8の倍数であるほうが効率がいい。
lfdx fD, rA, rB
rAの値(r0の場合は0)とrBとの和をメモリアドレス位置として、fDに倍精度浮動小数をロードする。メモリアドレスが8の倍数であるほうが効率がいい。
lfd fD, d(rA)
rAの値(r0の場合は0)と16bit符号付き整数との和をメモリアドレス位置として、fDに単精度浮動小数をロードする。メモリアドレスが4の倍数であるほうが効率がいい。
lfdu fD, d(rA)
rAの値と16bit符号付き整数との和をメモリアドレス位置として、fDに単精度浮動小数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。メモリアドレスが4の倍数であるほうが効率がいい。
lfdux fD, rA, rB
rAの値とrBとの和をメモリアドレス位置として、fDに単精度浮動小数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。メモリアドレスが4の倍数であるほうが効率がいい。
lfsx fD, rA, rB
rAの値(r0の場合は0)とrBとの和をメモリアドレス位置として、fDに単精度浮動小数をロードする。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。メモリアドレスが4の倍数であるほうが効率がいい。
lha rD, d(rA)
rAの値(r0の場合は0)と16bit符号付き整数との和をメモリアドレス位置として、rDに2byte符号付き整数をロードする。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lhau rD, d(rA)
rAの値と16bit符号付き整数との和をメモリアドレス位置として、rDに2byte符号付き整数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lhaux rD, rA, rB
rAの値とrBとの和をメモリアドレス位置として、rDに2byte符号付き整数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lhax rD, rA, rB
rAの値(r0の場合は0)とrBとの和をメモリアドレス位置として、rDに2byte符号付き整数をロードする。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lhbrx rD, rA, rB
rAの値(r0の場合は0)とrBとの和をメモリアドレス位置として、rDに2byte符号なし整数をロードする。ただし、上1byteが下8bit、下1byteが上8bitとなり、構成が反転する。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lhz rD, d(rA)
rAの値(r0の場合は0)と16bit符号付き整数との和をメモリアドレス位置として、rDに2byte符号なし整数をロードする。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lhzu rD, d(rA)
rAの値と16bit符号付き整数との和をメモリアドレス位置として、rDに2byte符号なし整数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lhzux rD, rA, rB
rAの値とrBとの和をメモリアドレス位置として、rDに2byte符号なし整数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lhzx rD, rA, rB
rAの値(r0の場合は0)とrBとの和をメモリアドレス位置として、rDに2byte符号なし整数をロードする。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lmw rD, d(rA)
rAに格納された値(r0の場合は0)とdとの和のアドレスを始点として、メモリを4byte単位で、正方向に順番に読み込み、r31から順番に、rDに与えられた番号のレジスタまで格納する。読み込み先メモリのアドレスは4の倍数でなければならない。スタックにレジスタの内容をまとめて退避から復帰するのに便利だが、普通のロード命令より遅い。
lswi rD, rA, NB
rAに格納された値(r0の場合は0)の和のアドレスを始点として、rDの番号のレジスタから、NBに与えられたbyte数だけロードする。byteのサイズが4の倍数でない場合、最後のレジスタのあまりは0で埋められる。普通のロード命令より遅い。
lswx rD, rA, rB
rAと(r0の場合は0)とrBとの和のアドレスを始点として、rDの番号のレジスタから、整数例外レジスタの下7bitに与えられた値分のbyte数だけロードする。byteのサイズが4の倍数でない場合、最後のレジスタのあまりは0で埋められる。普通のロード命令より遅い。
lwarx rD, rA, rB
rA(r0の場合は0)とrBとの和のアドレスを始点として、メモリを4byte単位で正方向に順番に読み込み、r31から順番に、rDに与えられた番号のレジスタまで格納する。読み込み先メモリのアドレスは4の倍数でなければならない。この命令でアクセスされたアドレスには、stwcx.で使用するリザーベーションを作成する。以前に作成したリザーベーションは置き換えられる。
stwcxとlwarxは、排他的なアクセスを必要とする場合に使用する。普通のロード命令より遅い。
lwbrx rD, rA, rB
rAに格納された値(r0の場合は0)とdとの和のアドレスに、rDの値をbyte単位で反転して書き込む。(つまり、普通レジスタには[1, 2, 3, 4]と、順番にデータがロードされると考えると、この命令では[4, 3, 2, 1]と、リトルエンディアンのようになる)。読み込み先メモリのアドレスが4の倍数の方が効率がいい。普通のロード命令より遅い。
lwz rD, d(rA)
rAの値(r0の場合は0)と16bit符号付き整数との和をメモリアドレス位置として、rDに4byte符号なし整数をロードする。符号なしとは言っても、32bitモードでは同じことである。4の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lwzu rD, d(rA)
rAの値と16bit符号付き整数との和をメモリアドレス位置として、rDに4byte符号なし整数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。4の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lwzux rD, rA, rB
rAの値とrBとの和をメモリアドレス位置として、rDに4byte符号なし整数をロードする。さらに、rAにはこの命令で読み込んだメモリアドレスが格納される。4の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
lwzx rD, rA, rB
rAの値(r0の場合は0)とrBとの和をメモリアドレス位置として、rDに4byte符号なし整数をロードする。4の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
mr(.) rD, rS
rSの内容をrDに格納する。この命令は、or rD, rS, rSによって実現されている。
stb rS, d(rA)
rSの下1byteを、rA(r0の時は0)と16bit符号付き即値dとの和のアドレスのメモリに格納する。
stbu rS, d(rA)
rSの下1byteを、rAと16bit符号付き即値dとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。
stbux rS, rA, rB
rSの下1byteを、rAとrBとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。
stbx rS, rA, rB
rSの下1byteを、rA(r0の時は0)とrBとの和のアドレスのメモリに格納する。
stfd fS, d(rA)
fSの倍精度浮動小数8byteの内容を、rA(r0の時は0)と16bit符号付き即値dとの和のアドレスのメモリに格納する。メモリアドレスが8の倍数であるほうが効率がいい。
stfdu fS, d(rA)
fSの倍精度浮動小数8byteの内容を、rAと16bit符号付き即値dとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。メモリアドレスが8の倍数であるほうが効率がいい。
stfdux fS, rA, rB
fSの倍精度浮動小数8byteの内容を、rAとrBとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。メモリアドレスが8の倍数であるほうが効率がいい。
stfdx fS, rA, rB
fSの倍精度浮動小数8byteの内容を、rA(r0の時は0)とrBとの和のアドレスのメモリに格納する。メモリアドレスが8の倍数であるほうが効率がいい。
stfiwx fS, rA, rB
fSの内容の下32bitを、rA(r0の時は0)とrBとの和のアドレスのメモリに格納する。浮動小数を整数に変換する命令を実行してから、これを使ってメモリ経由で整数レジスタに値を渡すことができる。メモリアドレスが4の倍数であるほうが効率がいい。
stfs fS, d(rA)
fSの単精度浮動小数8byteの内容を、rA(r0の時は0)と16bit符号付き即値dとの和のアドレスのメモリに格納する。メモリアドレスが8の倍数であるほうが効率がいい。
stfsu fS, d(rA)
fSの単精度浮動小数8byteの内容を、rAと16bit符号付き即値dとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。メモリアドレスが8の倍数であるほうが効率がいい。
stfsux fS, rA, rB
fSの単精度浮動小数8byteの内容を、rAとrBとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。メモリアドレスが8の倍数であるほうが効率がいい。
stfsx fS, rA, rB
fSの単精度浮動小数8byteの内容を、rA(r0の時は0)とrBとの和のアドレスのメモリに格納する。メモリアドレスが8の倍数であるほうが効率がいい。
sth rS, d(rA)
rSの下2byteを、rA(r0の時は0)と16bit符号付き即値dとの和のアドレスのメモリに格納する。メモリアドレスが2の倍数であるほうが効率がいい。
sthbrx rD, rA, rB
rAの値(r0の場合は0)とrBとの和のメモリアドレスに、rDの下2byteをストアする。ただし、上1byteが下8bit、下1byteが上8bitとなり、構成が反転する。2の倍数のアドレスから読み込む方がメモリアクセス効率がいい。
sthu rS, d(rA)
rSの下2byteを、rAと16bit符号付き即値dとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。メモリアドレスが2の倍数であるほうが効率がいい。
sthux rS, rA, rB
rSの下2byteを、rAとrBとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。メモリアドレスが2の倍数であるほうが効率がいい。
sthx rS, rA, rB
rSの下2byteを、rA(r0の時は0)とrBとの和のアドレスのメモリに格納する。メモリアドレスが2の倍数であるほうが効率がいい。
stmw rS, d(rA)
rAに格納された値(r0の場合は0)とdとの和のアドレスを始点として、メモリを4byte単位で、r31から順番に、rDに与えられた番号のレジスタまで。正方向に順番に書き込む。書き込み先メモリのアドレスは4の倍数でなければならない。スタックにレジスタの内容をまとめて退避するのに便利だが、普通のストア命令より遅い。
stswi rD, rA, NB
rAに格納された値(r0の場合は0)の和のアドレスを始点として、rDの番号のレジスタから、NBに与えられたbyte数だけストアする。上のbyteから下のbyteへ転送するので、転送byte数が4の倍数でない場合、最後のレジスタは上数byteがストアされることになる。普通のストア命令より遅い。
stswx rD, rA, rB
rAと(r0の場合は0)とrBとの和のアドレスを始点として、rDの番号のレジスタから、整数例外レジスタの下7bitに与えられた値分のbyte数だけストアする。上のbyteから下のbyteへ転送するので、転送byte数が4の倍数でない場合、最後のレジスタは上数byteがストアされることになる。普通のストア命令より遅い。
stw rS, d(rA)
rSの4byte全てを、rA(r0の時は0)と16bit符号付き即値dとの和のアドレスのメモリに格納する。メモリアドレスが4の倍数であるほうが効率がいい。
stwbrx rD, rA, rB
rAに格納された値(r0の場合は0)とdとの和のアドレスに、rDの内容を1byte単位で反転して書き込む。(つまり、普通レジスタには[1, 2, 3, 4]と、順番にデータがストアされると考えると、この命令では[4, 3, 2, 1]と、リトルエンディアンのようになる)。書き込み先メモリのアドレスは4の倍数であるほうが効率がいい。
stwcx. rS, rA, rB
lwarxによって作成されたリザーベーションが存在する場合、rSの内容をrAとrBとの和のアドレスにストアし、リザーベーションをクリアする。リザーベーションが存在しない場合、書き込みは実行されない。cr0には書き込みが実行されたかどうかが格納される。アドレスは4の倍数でなければならない。
この命令を利用する方法についてはlwarxを参照。
stwu rS, d(rA)
rSの4byte全てを、rAと16bit符号付き即値dとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。メモリアドレスが4の倍数であるほうが効率がいい。
stwux rS, rA, rB
rSの4byte全てを、rAとrBとの和のアドレスのメモリに格納する。さらに、rAにはこの命令で書き出したメモリアドレスが格納される。メモリアドレスが4の倍数であるほうが効率がいい。
stwx rS, rA, rB
rSの4byte全てを、rA(r0の時は0)とrBとの和のアドレスのメモリに格納する。メモリアドレスが4の倍数であるほうが効率がいい。

条件比較命令

レジスタや即値の内容を比較し、その結果を状態レジスタに格納する命令。PowerPCには状態レジスタが8つあるので、比較結果を複数持つことができる。

cmp crD, L, rA, rB
rAとrBを数値比較した結果をcrDに格納する。L=1は無効。
簡略ニーモニックcmpw
cmpi crD, L, rA, SIMM
rAと符号あり16bit即値を数値比較した結果をcrDに格納する。L=1は無効。
簡略ニーモニックcmpwi
cmpl crD, L, rA, rB
rAとrBを論理比較した結果をcrDに格納する。L=1は無効。
簡略ニーモニックcmpwl
cmpli crD, L, rA, UIMM
rAと符号あり16bit即値を論理比較した結果をcrDに格納する。L=1は無効。
簡略ニーモニックcmplwi
cmplw (crD,) rA, rB
rAとrBを論理比較した結果をcrD(指定がなければcr0)に格納する。cmpl crD/cr0, 0, rA, rBで実現。
cmplwi (crD,) rA, UIMM
rAと符号あり16bit即値を論理比較した結果をcrD(指定がなければcr0)に格納する。cmpli crD/cr0, 0, rA, SIMMで実現。
cmpw crD, L, rA, rB
rAとrBを数値比較した結果をcrD(指定がなければcr0)に格納する。cmp crD/cr0, 0, rA, SIMMで実現。
cmpwi (crD,) rA, SIMM
rAと符号あり16bit即値を数値比較した結果をcrD(指定がなければcr0)に格納する。cmpi crD/cr0, 0, rA, SIMMで実現。
fcmpo (crD,) fA, fB
fAとfBの比較結果をcrD(指定がなければcr0)に格納する。???
fcmpu (crD,) fA, fB
fAとfBの比較結果をcrD(指定がなければcr0)に格納する。???

条件演算命令

PowerPCには状態レジスタが8つある上に、それらの内容同士で論理演算を行う事ができる。条件分岐は分岐予測が失敗した時、コストが大きくなってしまうため、小さな分岐条件(例えば、if(x == 0 && y == 1))をばらばらに実行するより、論理演算で分岐条件をまとめ、1つの分岐命令だけ実行する方が、分岐回数が減って効率がよくなる可能性がある。

1つの条件レジスタは4つの状態(等しい(eq)=2、未満(lt)=0、より大きい(gt)=1、オーバーフロー(so)=3)を持っているのだが、条件論理演算はその状態同士で論理演算するものである。

条件演算のソース/デスティネーションには数値しか使用できない。

例えば、cr1のeqの値が入っているのは、4 * 1 + 2。cr2のltの値が入っているのは4 * 2 + 0。cr7のgtの値が入っているのは4 * 7 + 1の場所である。

if(x > 0 && y <= 0) を一つにまとめようと思った場合、

cmpwi cr0, x, 0 ;xの比較
cmpwi cr1, y, 0 ;yの比較
crandc 2,1,5    ;cr0[eq] = cr0[gt] & ~cr1[gt]
bne cr0, ...
と書く。
crand crD, crA, crB
crAとcrBの条件ビットの論理積をcrDに格納する。
crandc crD, crA, crB
crAとcrBの否定との条件ビットの論理積をcrDに格納する。
crclr crD
crDの条件ビットを0にセットする。crxor crD, crD, crDで実現。
creqv crD, crA, crB
crAと、crBの条件ビットの否定との排他的論理和をcrDに格納する。
簡略ニーモニックcrset
crmove crD, crA
crAの条件ビットをcrDにコピーする。cror crD, crA, crAで実現。
crnand crD, crA, crB
crAとcrBの条件ビットの論理積の否定をcrDに格納する。
crnor crD, crA, crB
crAとcrBの条件ビットの論理和の否定をcrDに格納する。
簡略ニーモニックcrnot
crnot crD, crA
crAの条件ビットの否定をcrDに格納する。crnor crD, crA, crAで実現。
cror crD, crA, crB
crAとcrBの条件ビットの論理和をcrDに格納する。
簡略ニーモニックcrmove
crorc crD, crA, crB
crAとcrBの否定との条件ビットの論理和をcrDに格納する。
crset crD
crDの条件ビットを1にセットする。creqv crD, crD, crDで実現。
crxor crD, crA, crB
crAとcrBの条件ビットの排他的論理和をcrDに格納する。
簡略ニーモニックcrclr
mcrf crD, crS
crSの内容をcrDに格納する。

特殊レジスタアクセス命令

汎用レジスタと、状態制御などの役割を持つ特殊なレジスタとの間でデータを交換する命令。いくつかのレジスタはスーパバイザでなければアクセスできない。

mcrfs crD, crS
浮動小数演算状態/コントロールレジスタのフィールドのcrfSの内容をcrDに格納する。その後、crSの例外ビットは0にリセットされる。
mcrxr crD
整数演算例外レジスタの上4bitの内容をcrDに格納する。その後、整数演算例外レジスタの上4bitは0にリセットされる。
mfcr rD
全状態レジスタの内容を汎用レジスタrDに格納する(一番上の4bitがcr0、次の4bitがcr1…)。関数内でcr2 ~ cr5を使うのなら、この命令であらかじめレジスタ内容を保存しておくこと。
mfctr rD
カウンタレジスタの内容を汎用レジスタrDに格納する。mfspr rD, 9で実現。
mffs(.) fD
浮動小数演算状態/コントロールレジスタの内容を浮動小数レジスタfDの下32bitに格納する。上32bitは未定義。
mflr rD
リンクレジスタの内容を汎用レジスタrDに格納する。mfspr rD, 8で実現。
mfmsr rD
マシン状態レジスタの内容を汎用レジスタrDに格納する。スーパバイザモード用命令。
mfspr rD, SPR
SPRの番号の特殊レジスタの内容を汎用レジスタrDに格納する。ユーザレベルでアクセス可能なのは、1と8と9のみで、1の場合、整数演算例外レジスタ。8の場合、リンクレジスタ。9の場合、カウンタレジスタ。
簡略ニーモニックmfxer mflr mfctr
mfxer rD
整数演算例外レジスタの内容を汎用レジスタrDに格納する。mfspr rD, 1で実現。
mfsr rD, SR
SR番目のセグメントレジスタの内容を汎用レジスタrDに格納する。スーパバイザモード用命令。64bitモードでは使えない。
mfsrin rD, rB
rBの上4bitの番号のセグメントレジスタの内容を汎用レジスタrDに格納する。スーパバイザモード用命令。64bitモードでは使えない。
mftb rD(, TBR)
タイムベースレジスタTBRの内容をrDに読み込む。本当に意味があるのは上位32bitの269番と下位32bitの268番。簡易ニーモニックとして、TBRを省略した場合は268(下位)が仮定される。
簡易ニーモニックmftbu
mtcr rS
状態レジスタの内容を汎用レジスタrSで置き換える。mtcrf 0xff, rDで実現。
mtcrf CRM, rD
汎用レジスタrDの内容を、CRMをマスクとして状態レジスタに格納する。CRMのケタ数は8bit。ビットが1なら、その場所に対応する状態内容領域4bitを汎用レジスタの値に置き換える。0ならその領域は変更しない。
簡略ニーモニックmtcr
mtcrxr BF
整数例外レジスタの内容を、BF番目の状態レジスタにコピーする。その後、整数例外レジスタはクリアされる。
mtctr rS
カウンタレジスタの内容を汎用レジスタrDで置き換える。関数ポインタへのジャンプや、繰り返し条件分岐用の値をセットするのによく使われる。mtspr 9, rSで実現。
mtfsb0(.) crbD
浮動小数演算状態/コントロールレジスタのビットcrbDを0でクリアする。
mtfsb1(.) crbD
浮動小数演算状態/コントロールレジスタのビットcrbDを1でクリアする。
mtfsf(.) FM, fB
fBの下32bitを、FMをマスクとして浮動小数演算状態/コントロールレジスタに格納する。CRMのケタ数は8bit。ビットが1なら、その場所に対応する状態内容領域4bitを浮動小数レジスタの値に置き換える。0ならその領域は変更しない。
mtfsi(.) crfD, IMM
IMMの値を、crfDで示した浮動小数状態/コントロールレジスタのフィールドに格納する。
mtlr rS
リンクレジスタの内容を汎用レジスタrSで置き換える。関数から出るのに使うことが多い。mtspr 8, rSで実現。
mtmsr rS
マシン状態レジスタの内容を、汎用レジスタrSで置き換える。スーパバイザモード用。
mtspr SPR, rS
特殊レジスタの内容を、汎用レジスタrSで置き換える。SPRに指定する番号は、mfsprと同じ。
簡略ニーモニックmtxer mtlr mtctr
mtxer rS
整数演算例外レジスタの内容を汎用レジスタrSに置き換える。mtspr 1, rSで実現。
mtsr SR, rS
セグメントレジスタの内容を汎用レジスタrDに置き換える。スーパバイザモード用。64bitモードでは使えない。
mtsrin rS, rB
rBの上4bitの番号のセグメントレジスタの内容を汎用レジスタrSで置き換える。スーパバイザモード用命令。64bitモードでは使えない。

分岐命令

分岐命令には4つの分岐先指定方法と、たくさんの分岐条件の組み合わせがある。また、分岐成功時にリンクレジスタにジャンプ前アドレスを保存するかしないかも決められる。条件分岐命令の場合はさらに、分岐のヒント(静的分岐予測)フラグもセットできる。

ちなみに、分岐命令は大量に組み合わせられるので、bgtctrl(条件が『超える』を満たしている場合、カウンタレジスタのアドレスへジャンプし、さらにリンクレジスタに現在のアドレスを格納)やらbdnzne(カウンタレジスタの値を1引き、その値が0でなければ条件を見、条件が『等しくない』であれば相対アドレスジャンプ)やらと、非常にややこしい分岐条件も書ける。全くもって、RISCプロセッサとは思えんな(w

分岐先指定方法

PowerPCの分岐方法は、

の4つである。

即値指定分岐

PowerPCの命令のサイズは4byte(32bit)で、それらは必ず4の倍数のアドレスにセットされているため、PowerPCの即値分岐命令は、target_addrの値を4倍した値にアドレスジャンプを行う。

無条件即値分岐命令の場合、24bit符号付き即値の4倍のアドレスまでジャンプできるので、ほぼあらゆる場所にジャンプできる。

条件つきの場合は、ジャンプ幅は14bit符号付き即値の4倍なので、無条件の時と比べるとややジャンプ可能距離が狭い。

b(a) target_addr
相対(絶対)アドレスジャンプを無条件で行う。baの絶対アドレスジャンプは、ユーザレベルでプログラミングをしている限りではおそらく使うことはない。
bc(a) BO, crA, target_addr
相対(絶対)アドレスジャンプを条件つきで行う。条件はBOで、条件を満たすかチェックされるのはcrAである。BOのフラグは複雑なので、後述の条件分岐の項目を利用した方がいい。

レジスタ分岐

リンクレジスタやカウンタレジスタの格納されているアドレスへ直接ジャンプする命令。

bctr
カウンタレジスタに格納されたアドレスへのジャンプを無条件で行う。
この命令はbcctr 20, cr0で実現されている。
bcctr BO, crA
カウンタレジスタに格納されたアドレスへのジャンプを条件つきで行う。条件はBOで、条件を満たすかチェックされるのはcrAである。BOのフラグは複雑なので、後述の条件分岐の項目を利用した方がいい。なお、『カウンタレジスタの値を1減らし~』の条件とこの命令を組み合わせることはできないので注意。
簡略ニーモニックbctr
blr
リンクレジスタに格納されたアドレスへのジャンプを無条件で行う。関数から出るのに使われる。
この命令はbclr 20, cr0で実現されている。
bclr BO, crA
リンクレジスタに格納されたアドレスへのジャンプを条件つきで行う。条件はBOで、条件を満たすかチェックされるのはcrAである。BOのフラグは複雑なので、後述の条件分岐の組み合わせを利用した方がいい。
簡略ニーモニックblr

ジャンプ位置保存

bl target_addr
ジャンプ命令の次の命令のアドレスをリンクレジスタに格納してからジャンプを行う。関数を呼び出した時、関数を呼び出した場所に帰ってこなければならないので、この命令でジャンプ位置を保存する。

条件分岐

前述のように、条件つき分岐命令はジャンプ幅は14bit符号付き即値の4倍なので、無条件の時と比べるとややジャンプ可能距離が狭い。ただ、条件の組み合わせは無数にある。

なお、条件分岐の場合は、ニーモニックの末尾に+や-をつけることで、分岐のヒント(静的分岐予測)を与えることができる。+なら、分岐することを想定して命令実行、-なら、分岐しないことを想定して命令実行となる。例えばループの分岐は、ほとんどの確率で分岐して前に戻るので、分岐のヒントには+を与えたほうがよい。何も書かない場合、-の場合と同じとみなされる

なお、これらの命令はbcbcctrbclrといった命令を簡略にしたものである。

bdnz(+/-) target_addr
カウンタレジスタの値から1を引いた値をカウンタレジスタに格納する。その演算の後のカウンタレジスタの値が0以外であるのなら、ジャンプを行う。主にループ文のループ条件に使われる。
bdz(+/-) target_addr
カウンタレジスタの値から1を引いた値をカウンタレジスタに格納する。その演算の後のカウンタレジスタの値が0であるのなら、ジャンプを行う。
beq(+/-) (crA,) target_addr
指定した条件レジスタ(指定しない場合はcr0)が『等しい』条件を満たしている場合、ジャンプを行う。
bge(+/-) (crA,) target_addr
指定した条件レジスタ(指定しない場合はcr0)が『以上』条件を満たしている場合、ジャンプを行う。
bgt(+/-) (crA,) target_addr
指定した条件レジスタ(指定しない場合はcr0)が『上回る』条件を満たしている場合、ジャンプを行う。
ble(+/-) (crA,) target_addr
指定した条件レジスタ(指定しない場合はcr0)が『以下』条件を満たしている場合、ジャンプを行う。
blt(+/-) (crA,) target_addr
指定した条件レジスタ(指定しない場合はcr0)が『未満』条件を満たしている場合、ジャンプを行う。
bne(+/-) (crA,) target_addr
指定した条件レジスタ(指定しない場合はcr0)が『等しくない』条件を満たしている場合、ジャンプを行う。

分岐ニーモニックの条件組み合わせ

b[カウンタレジスタ条件分岐...dnz, dz][状態レジスタ条件分岐条件…eq, ge, gh, le, lt, ne][レジスタまたは、絶対アドレス分岐…ctr, lr, a][条件分岐の場合、分岐ヒント…+, -]

例:
ble    cr2, 10        ;cr2の内容が『以下』を満たしているなら、10命令先に分岐
beq-   EXIT_FUNC      ;cr0の内容が『等しい』を満たしているなら、EXIT_FUNCラベルの位置に分岐。分岐を期待しない。
bdnz+  CONTINUE_LOOP  ;カウンタレジスタの内容を1引き、その値が0以外なら、CONTINUE_LOOPに戻る。分岐を期待する。
bl     _abs           ;この命令のアドレスをリンクレジスタに格納してから、_absラベルへジャンプする。
blr                   ;リンクレジスタの内容のアドレスへジャンプする。

制御命令

キャッシュ制御や割り込み制御などの命令。大抵は通常は使用しない/できない命令である。

dcbf rA, rB
dcbi rA, rB
dcbst rA, rB
rA(r0の場合、0)とrBとの和をEAとする。EAの示すアドレスがCoherence Required(常に内容が一致する必要のある)モードで、EAの示すアドレスがいずれかのCPUのデータキャッシュに載っており、かつ、その内容が更新されているなら、メモリ内容とデータキャッシュ内容を更新する。EAの示すアドレスCoherence Not Required(常に内容が一致している必要のない)モードで、EAの示すアドレスのデータ内容がこの命令を実行したCPUのデータキャッシュに載っており、かつ、その内容が更新されているなら、そのCPUのメモリ内容とデータキャッシュ内容を更新する。
dcbt rA, rB
rA(r0の場合は0)とrBの内容の和のアドレスを含むメモリブロックの内容が、近々ロード命令でアクセスされることをプロセッサに伝える。
dcbtst rA, rB
rA(r0の場合は0)とrBの内容の和のアドレスを含むメモリブロックの内容が、近々ストア命令でアクセスされることをプロセッサに伝える。
dcbz rA, rB
rA(r0の場合は0)とrBの内容の和のアドレス先の内容がデータキャッシュに含まれているなら、それを無効化する。
eciwx rD, rA, rB
ecowx rS, rA, rB
eieio
icbi rA, rB
rA(r0の場合、0)とrBとの和をEAとする。EAの示すアドレスがCoherence Required(常に内容が一致する必要のある)モードの場合、EAの示すアドレスがいずれかのCPUの命令キャッシュに載っているなら、そのCPUの命令キャッシュから取り除く。EAの示すアドレスCoherence Not Required(常に内容が一致している必要のない)モードの場合、EAの示すアドレスのデータ内容がこの命令を実行したCPUの命令キャッシュに載っているなら、そのCPUの命令キャッシュから取り除く。
isync
この命令のより前の命令全てが実行を終えるのを待ち、プリフェッチした命令も破棄する。
nop
なにもしない。この命令は、ori r0, r0, 0によって実現されている。
rfi
割り込みから本来の処理に戻る。SRR1(スーパバイザモード用レジスタ)の下16bitをマシン状態レジスタの下16bitに入れ、アドレスSRR0(スーパバイザモード用レジスタ)の上30bitを4倍したアドレスから、命令フェッチを再開する。スーパバイザモード用。
sc
オペレーティングシステムをコールする。
sync
この命令のより前の命令全てが実行を終えるのを待つ。この命令が終わるまで、OSの割り込みがかかることはない。
複数のCPUで動いており、ロードストア命令がsyncの前にあったりする場合は、syncを実行したプロセッサがメモリアクセス権を独占して処理を行うので、この命令を使うのはお勧めできない。lwarxstwcx.で排他アクセスを行った方がいい。
tlbia
tlbie
tlbsync
tw TO, rA, rB
rAとrBを比較し、その結果がTOに与えられたフラグに引っかかっていれば、トラップを発行する。
twi TO, rA, SIMM
rAと16bit符号付き即値SIMMを比較し、その結果がTOに与えられたフラグに引っかかっていれば、トラップを発行する。

補足

厳密には、分岐と同時にリンクレジスタにアドレスを保存する命令で、リンクレジスタに保存されるアドレスは、その分岐命令+4のアドレスです。ちょうど分岐命令の次の命令にあたります。