命令セットアーキテクチャを考える8 (シフト/ローテート/バイトスワップ命令)
続いて、シフト/ローテート/バイトスワップ命令の定義です。
[シフト命令]:4命令
sll [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd
・Rsの内容を、Rtまたはimmで示されるビット数分、論理左シフト(shift left logical)し、Rdに格納する。
・CCR0は変化しない。
・byteモード/half-wordモード/wordモードモードの場合、Rsの下位8ビット/16ビット/32ビットがシフトされ、残りの上位ビットは変更されない。
・byteモード/half-wordモード/wordモード/double-wordモードの場合、Rtの下位3ビット/4ビット/5ビット/6ビットのみが有効であり、符号無し二進数とみなされる。
・immモードの場合、同様に下位ビットが符号無し二進数とみなされる。
・SIMDモードの場合、Rsレジスタ内のデータを8bit*8、16bit*4、32bit*2のデータとしてシフト演算に使用される。
・SIMDモードの場合、Rtまたはimmの下位ビットが用いられ、すべてのパックドデータに対して同じビット数だけシフトされる。
srl [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd
・論理右シフト(shift right logical)となることを除いて、sll命令と同様。
sla [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd
・算術左シフト(shift left arithmetic)となることを除いて、sll命令と同様。
sra [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd
・算術右シフト(shift right arithmetic)となることを除いて、sll命令と同様。
[ローテート命令]:1命令
rot [v] [b|hw|w|dw] Rs,{Rt|=imm},Rd
・Rsの内容をRtまたはimmで示されるビット数分だけ左ローテートし、Rdに格納する。(右ローテート命令はないが、ローテート量を大きく指定することにより同じ結果が得られる)
・CCR0は変化しない。
・byteモード/half-wordモード/wordモードモードの場合、Rsの下位8ビット/16ビット/32ビットがシフトされ、残りの上位ビットは変更されない。
・byteモード/half-wordモード/wordモード/double-wordモードの場合、Rtまたはimmの下位3ビット/4ビット/5ビット/6ビットのみが有効であり、符号無し二進数とみなされる。
・SIMDモードの場合、Rsレジスタ内のデータを8bit*8、16bit*4、32bit*2のデータとしてそれぞれローテートされる。
・SIMDモードの場合、Rtまたはimmの下位ビットが用いられ、すべてのパックドデータに対して同じビット数だけローテートされる。
[バイトスワップ命令]:1命令
boswap [hw|w|dw] Rs,Rd
・Rsの内容を2byte/4byte/8byte単位でbyte order swappingしてRdに格納する。
・Rsの内容が16進表記で0123456789ABCDEFであった場合、Rdの内容は以下のようになる。
hwモード :23016745AB89EFCD
w モード :67452301EFCDAB89
dwモード :EFCDAB8967452301
| 固定リンク
この記事へのコメントは終了しました。


コメント