Skip to content

Instantly share code, notes, and snippets.

@Mrmkroll
Created March 15, 2022 14:31
Show Gist options
  • Save Mrmkroll/cc17e8abaf3c65ebfd49755405089857 to your computer and use it in GitHub Desktop.
Save Mrmkroll/cc17e8abaf3c65ebfd49755405089857 to your computer and use it in GitHub Desktop.

PowerPC Documentation

Index

Registers

高水準言語(C, C++といったコンパイル言語やPython, JavaScriptといったインタプリタ言語)にある変数に近いもの。
しかし自分で変数名を宣言することはできず、元々値が入っている場合もあり自由度が低い。
※既に値がある場合、無闇に変更するとエラー(フリーズ)が発生するため注意が必要

レジスタには 汎用レジスタ (General Purpose Registers / GPR)、浮動小数点レジスタ (Floating Point Registers / FPR)、リンクレジスタ (Link Register / LR)、カウントレジスタ (Count Register / CTR)、条件レジスタ (Condition Register / CR)、整数例外レジスタ (Integer Exception Register) の6種類があり、GPRを使用すれば大体のコードは作れる。
特にGPRとFPRはそれぞれ32本ずつあり、指定する際は r0, r1, … r31、f0, f1, … f31 と表す。
※どちらのレジスタであっても32本すべてが自由に使えるというわけではなく、前後で使用されている場合、正確にプログラムの流れを読み解かなければフリーズの原因になる

Mario Kart Wiiの場合、r12とr11は基本的に使用できるが、r1(sp)やr2(rtoc), r13は十割方使用できない。
※しかし前者は例外的に使えない場合があるため注意が必要

またFPRは、浮動小数点を使用するプログラムで用いると、使えるレジスタの数を増やすことができるため、積極的に使うことを推奨する。
※これもGPRと同様に使用できるレジスタの制限があるため、その点についての注意は必要

その他(各レジスタの安全度、LR、CTRなどについて)は、MarioKartWii.com(英語)を参照されたい。
※整数例外レジスタについての詳細はこちらを参照

Format

先にも述べたが、GPRは r0, r1, … r31、FPRは f0, f1, … f31 と表す。これは実際にプログラムを書く場合に使用するが、ここでは少々異なる書き方をするため、それについて先に記載しておく。

ここではレジスタを rD, rS, rA, rB と記述していくが、それらの意味はそれぞれ以下の通りである。

rD: 目的レジスタ (Destination Register)
    値を入れる先のレジスタ
rS: ソースレジスタ (Source Register)
    アドレスが入っているレジスタ
rA: ソースレジスタ(1) (1st Source Ragister)
    値が入っているひとつ目のレジスタ(rSの意味も兼ね備えている)
rB: ソースレジスタ(2) (2nd Source Ragister)
    値が入っているふたつ目のレジスタ

またレジスタの他に、OffsetやValue などと記述されている場合もあるが、その場合も以下の通りである。

Offset: rSにプラスまたはマイナスする値
Value: 入れる値や基準となる値
Label: 分岐先の題名

Symbol

: ラベル名に使用
+ 分岐が高頻度を表す場合に使用
- 分岐が低頻度を表す場合に使用
. if文やset(定数宣言)時に使用
# コメントアウトに使用
; コメントアウトに使用
0x 16進数で記述時に使用

Instructions

Load Immediate

レジスタに値をロードします。

li (Load Immediate)

li rD,Value

lis (Load Immediate Shifted)

lis rD,Value

Load and Zero

レジスタにソースレジスタから指定した値分移動した場所の値をロードします。空いているビットには 0 が挿入されます。

lwz (Load Word and Zero)

lwz rD,Offset (rS)

lhz (Load Half and Zero)

lhz rD,Offset (rS)

lbz (Load Byte and Zero)

lbz rD,Offset (rS)

Load Half Algebraic

レジスタにソースレジスタから指定した値分移動した場所の値を上位16ビットロードします。空いている下位16ビットには 0 が挿入されます。

lha (Load Half Algebraic)

lha rD,Offset (rS)

Load Multiple Words

指定したレジスタからレジスタ31まで、ソースレジスタから指定した値分移動した場所から順に値をロードします。ソースレジスタは、指定レジスタよりも大きいと使用できません。

lmw (Load Multiple)

lmw rD,Offset (rS)

Load String Word

レジスタにソースレジスタから指定したバイトの範囲内にある値を連続するレジスタ内にロードします。ロードする値の長さによって必要な空きレジスタの数か変わります。

lswi (Load String Word Immediate)

lswi rD,rA,Value

Store

レジスタの値を保存します。

stw (Store Word)

stw rD,Offset (rS)

sth (Store Half)

sth rD,Offset (rS)

stb (Store Byte)

stb rD,Offset (rS)

Store Multiple Words

指定したレジスタからレジスタ31までの各値を、ソースレジスタから指定した値分移動した場所にそれぞれ保存します。ソースレジスタは、指定レジスタよりも大きいと使用できません。

stmw (Store Multiple Words)

stmw rD,Offset (rS)

Store String Word

レジスタの値を指定したバイトの範囲分を保存します。

stswi (Store String Word Immediate)

stswi rD,rA, Value

Move

レジスタの値を移動(コピー)します。

mr (Move Register)

mr rD,rA

Move To Register

ソースレジスタの値をリンク/カウントレジスタに保存します。

mtlr (Move To Link Register)

mtlr rA

mtctr (Move To Count Register)

mtctr rA

Move From Register

レジスタにリンク/カウントレジスタから値をロードします。

mflr (Move From Link Register)

mflr rD

mfctr (Move From Count Register)

mfctr rD

Add

レジスタに加算した値をロードします。

add (Add)

add rD, rA, rB

addi (Add Immediate)

addi rD, rA, Value

addis (Add Immediate Shifted)

addis rD, rA, Value

Subtract

レジスタに減算した値をロードします。

sub (Subtract)

sub rD, rA, rB

subf (Subtract From)

subf rD, rB, rA

subi (Subtract Immediate)

subi rD, rA, Value

subis (Subtract Immediate Shifted)

subis rD, rA, Value

Muliply

レジスタに乗算した値をロードします。

mulhw (Multiply High Word)

mulhw rD, rA, rB

mullw (Multiply Low Word)

mullw rD, rA, rB

mulli (Multiply Low Immediate)

mulli rD, rA, Value

Divide

レジスタに除算した値をロードします。

divw (Divide Word)

divw rD, rA, rB

Not

レジスタの値の正負を反転します。正負は2進数で考えます。

not (Not)

not rD,rA

And

ふたつの値を比較し、両方が正であれば抽出します。比較は2進数で行います。

and (And)

and rD,rA,rB

andi. (And Immediate)

andi. rD,rA,Value

andis. (And Immediate Shifted)

andis. rD,rA,Value

Or

ふたつの値を比較し、一方が正であれば抽出します。比較は2進数で行います。

or (Or)

or rD,rA,rB

ori (Or Immediate)

ori rD,rA,Value

oris (Or Immediate Shifted)

oris rD,rA,Value

Rotate

レジスタの値を指定したビット数分回転させます。処理は2進数で行います。

rotlwi (Rotate Left Immediate)

rotlwi rD,rA,Value

rotrwi (Rotate Right Immediate)

rotrwi rD,rA,Value

Shift

レジスタの値を指定したビット数分ずらします。ずらして空いたビットには 0 が挿入されます。処理は2進数で行います。

slw (Shift Left Word)

slw rD,rA,rB

slwi (Shift Left Word Immediate)

slwi rD,rA,Value

srw (Shift Right Word)

srw rD,rA,rB

srwi (Shift Right Word Immediate)

srwi rD,rA,Value

Clear

レジスタの値を指定したビット数分クリアします。処理は2進数で行います。

clrlwi (Clear Left Immediate)

clrlwi rD,rA,Value

clrrwi (Clear Right Immediate)

clrrwi rD,rA,Value

Compare

レジスタの値を比較します。

cmpw (Compare Word)

cmpw rD,rA

cmpwi (Compare Word Immediate)

cmpwi rD,Value

cmplw (Compare Logical Word)

cmplw rD,rA

cmplwi (Compare Logical Word Immediate)

cmplwi rD,Value

Branch

指定した値の分だけ移動します。ラベルを指定した場合はそのラベルに移動します。

b (Branch)

b Value
b Label

bl (Branch and Link)

bl Value
bl Label

Branch to Link Register

リンク (Branch and Link) で移動した場合に、元の分岐地点に戻ります。

blr (Branch to Link Register)

blr

Branch to Count Register

カウントレジスタに格納されているアドレスへ移動します。

bctr (Branch to Count Register)

bctr

bctrl (Branch to Count Register and Link)

bctrl

Branch Conditional

直上にあるCompareの比較結果を自動で参照し、条件に当てはまれば指定した分だけ移動します。
ニーモニックの後に+-をつけることで分岐処理の補助を行えます。

beq (Branch Equal)

beq Value
beq Label

bne (Branch Not Equal)

bne Value
bne Label

ble (Branch Less than or Equal)

ble Value
ble Label

bge (Branch Grater than or Equal)

bge Value
bge Label

blt (Branch Less Than)

blt Value
blt Label

bgt (Branch Grater Than)

bgt Value
bgt Label

bnl (Branch Not Less than)

bnl Value
bnl Label

bng (Branch Not Grater than)

bng Value
bng Label
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment