PA-RISC1.1の演算命令(2)
続き。十進補正命令、ビットフィールド命令など。
前回:PA-RISC1.1の演算命令(1)
□比較命令
COMPARE AND CLEAR
COMCLR,cond r1,r2,t
r1,r2を比較し、rを0クリアする。condを満たすと次の命令をNullfy。
これどうやって使うかというと、if (rb!=rc) ra=0 else ra=1の場合:
COMCLR,<> rb,rc,ra
LDO 1,ra
のように分岐命令なしの2命令で実現できる。(COMCLRで条件が成立すると次のra←1動作をスキップ)
他にも演算命令分類ではないが、COMPARE AND BRANCHやADD AND BRANCHといった複合命令がある。
□論理演算命令
これらは他のRISCとあまり変わらない。
OR,cond r1,r2,t
XOR,cond r1,r2,t
AND,cond r1,r2,t
ANDCM,cond r1,r2,t # ANDCMは t←r1 & ~r2 (SPARCのandn命令相当)
UXOR,cond r1,r2,t # XORの反転出力
UADDCM,cond r1,r2,t # t← r1 + ~r2、r1をゼロレジスタにすれば NOT r2。1の補数の加算と兼用しているっぽい。
UADDCMT,cond r1,r2,t # UADDCMのconditional_trap付き
□十進補正命令
DECIMAL CORRECT
RISCでは珍しい。あとはPOWERにあるくらい。
DCOR,cond r,t
IDCOR,cond r,t
BCD8桁と見なして補正をかける。
□シフト命令/ビットフィールド命令
この辺が本命。
ShiftAmountRegister CR11(5bit)を併用する。これはシフト量を表す。
あと、注意としてPA-RISCのレジスタはMSB側が0と数える。GR1[0..31]
VARIABLE SHIFT DOUBLE
VSHD,cond r1,r2,t
r1[1..31]とr2[0:31]を連結したものを右シフトして、LSB側32bitをtに入れる。
r1にゼロレジスタを指定すれば他のRISCの論理右シフトと同様。
SHIFT DOUBLE
SHD,cond r1,r2,p,t
r1[1..31]とr2[0:31]を連結したものをpで指定した分右シフトして、LSB側32bitをtに入れる。
shd r1,r1,p,r1 でr1の右ローテートが可能。
VARIABLE EXTRACT UNSIGNED/SIGNED
EXTRACT UNSIGNED/SIGNED
VEXTRU,cond r,len,t
レジスタrのCR11で示した位置からMSB方向にlen分切り取ったフィールドを右詰めでレジスタtに格納する。tの左側余白は0で埋める。
VEXTRS,cond r,len,t
レジスタrのCR11で示した位置からMSB方向にlen分切り取ったフィールドを右詰めでレジスタtに格納する。tの左側余白は符号拡張。
EXTRU,cond r,p,len,t
VEXTRUと同じ動作。位置はpで指定。
EXTRS,cond r,p,len,t
VEXTRSと同じ動作。位置はpで指定。
VARIABLE DEPOSIT/DEPOSIT
EXTRACTの逆っぽい動作。
VDEP,cond r,len,t
レジスタrのLSB側からlen分切り取ったフィールドをレジスタtのCR11で示した位置から左方向に埋め込む。
DEP,cond r,p,len,t
レジスタrのLSB側からlen分切り取ったフィールドをレジスタtのpで示した位置から左方向に埋め込む。
ZVDEP,cond r,len,t
VDEPと同じだが、置き換えたフィールドより下位を0にする。
ZDEP,cond r,p,len,t
DEPと同じだが、置き換えたフィールドより下位を0にする。
これは論理左シフトとして使える。
この挿入したり置き換えたりする命令、似たようなのをあるプロプライエタリな32bitプロセッサでいじったことがある。命令セット策定時に参考にしたのかな?ConditionalMove的なことがこれらの組み合わせでできたんだけど思い出せない。シフト量や長さがレジスタで指定できたのでさらに柔軟だったのだが。
前回:PA-RISC1.1の演算命令(1)
□比較命令
COMPARE AND CLEAR
COMCLR,cond r1,r2,t
r1,r2を比較し、rを0クリアする。condを満たすと次の命令をNullfy。
これどうやって使うかというと、if (rb!=rc) ra=0 else ra=1の場合:
COMCLR,<> rb,rc,ra
LDO 1,ra
のように分岐命令なしの2命令で実現できる。(COMCLRで条件が成立すると次のra←1動作をスキップ)
他にも演算命令分類ではないが、COMPARE AND BRANCHやADD AND BRANCHといった複合命令がある。
□論理演算命令
これらは他のRISCとあまり変わらない。
OR,cond r1,r2,t
XOR,cond r1,r2,t
AND,cond r1,r2,t
ANDCM,cond r1,r2,t # ANDCMは t←r1 & ~r2 (SPARCのandn命令相当)
UXOR,cond r1,r2,t # XORの反転出力
UADDCM,cond r1,r2,t # t← r1 + ~r2、r1をゼロレジスタにすれば NOT r2。1の補数の加算と兼用しているっぽい。
UADDCMT,cond r1,r2,t # UADDCMのconditional_trap付き
□十進補正命令
DECIMAL CORRECT
RISCでは珍しい。あとはPOWERにあるくらい。
DCOR,cond r,t
IDCOR,cond r,t
BCD8桁と見なして補正をかける。
□シフト命令/ビットフィールド命令
この辺が本命。
ShiftAmountRegister CR11(5bit)を併用する。これはシフト量を表す。
あと、注意としてPA-RISCのレジスタはMSB側が0と数える。GR1[0..31]
VARIABLE SHIFT DOUBLE
VSHD,cond r1,r2,t
r1[1..31]とr2[0:31]を連結したものを右シフトして、LSB側32bitをtに入れる。
r1にゼロレジスタを指定すれば他のRISCの論理右シフトと同様。
SHIFT DOUBLE
SHD,cond r1,r2,p,t
r1[1..31]とr2[0:31]を連結したものをpで指定した分右シフトして、LSB側32bitをtに入れる。
shd r1,r1,p,r1 でr1の右ローテートが可能。
VARIABLE EXTRACT UNSIGNED/SIGNED
EXTRACT UNSIGNED/SIGNED
VEXTRU,cond r,len,t
レジスタrのCR11で示した位置からMSB方向にlen分切り取ったフィールドを右詰めでレジスタtに格納する。tの左側余白は0で埋める。
VEXTRS,cond r,len,t
レジスタrのCR11で示した位置からMSB方向にlen分切り取ったフィールドを右詰めでレジスタtに格納する。tの左側余白は符号拡張。
EXTRU,cond r,p,len,t
VEXTRUと同じ動作。位置はpで指定。
EXTRS,cond r,p,len,t
VEXTRSと同じ動作。位置はpで指定。
VARIABLE DEPOSIT/DEPOSIT
EXTRACTの逆っぽい動作。
VDEP,cond r,len,t
レジスタrのLSB側からlen分切り取ったフィールドをレジスタtのCR11で示した位置から左方向に埋め込む。
DEP,cond r,p,len,t
レジスタrのLSB側からlen分切り取ったフィールドをレジスタtのpで示した位置から左方向に埋め込む。
ZVDEP,cond r,len,t
VDEPと同じだが、置き換えたフィールドより下位を0にする。
ZDEP,cond r,p,len,t
DEPと同じだが、置き換えたフィールドより下位を0にする。
これは論理左シフトとして使える。
この挿入したり置き換えたりする命令、似たようなのをあるプロプライエタリな32bitプロセッサでいじったことがある。命令セット策定時に参考にしたのかな?ConditionalMove的なことがこれらの組み合わせでできたんだけど思い出せない。シフト量や長さがレジスタで指定できたのでさらに柔軟だったのだが。
この記事へのコメント