フラグ条件付きデータの転送を行います。(Conditional Move)
[指定形式]
- | cmov imm4, reg1, reg2, reg3 |
- | cmov imm4, imm, reg2, reg3 |
- | cmovcnd reg1, reg2, reg3 |
imm4に指定可能なものを以下に示します。
注 | 機械語命令のcmov命令は,第1オペランドに0〜15(0x0〜0xF)の範囲のイミーディエトをとります。 |
immに指定可能なものを以下に示します。
[機能]
- | “cmov imm4, reg1, reg2, reg3”の形式 |
第1オペランドに指定した定数式の値の下位4ビットの値で示されるフラグ状態と,現在のフラグ状態を比較し,値が一致した場合は,第2オペランドに指定したレジスタ値を,一致しなかった場合は第3オペランドに指定したレジスタ値を,第4オペランドに指定したレジスタに格納します。
- | “cmov imm4, imm, reg2, reg3”の形式 |
第1オペランドに指定した定数式の値の下位4ビットの値で示されるフラグ状態と,現在のフラグ状態を比較し,値が一致した場合は,第2オペランドに指定した絶対値式の値を,一致しなかった場合は第3オペランドに指定したレジスタ値を,第4オペランドに指定したレジスタに格納します。
- | “cmovcnd reg1, reg2, reg3”の形式 |
cnd部分の文字列で示されるフラグ状態と現在のフラグの状態を比較し,値が一致した場合は,第1オペランドに指定したレジスタ値を,一致しなかった場合は第2オペランドに指定したレジスタ値を,第3オペランドに指定したレジスタに格納します。
- | “cmovcnd imm, reg2, reg3”の形式 |
cnd部分の文字列で示されるフラグ状態と現在のフラグの状態を比較し,値が一致した場合は,第1オペランドに指定した絶対値式の値を,一致しなかった場合は第2オペランドに指定したレジスタ値を,第3オペランドに指定したレジスタに格納します。
|
|
|
|
cmovgt
|
((S xor OV)or Z)= 0
|
Greater than(signed)
|
cmov 0xF
|
cmovge
|
(S xor OV)= 0
|
Greater than or equal(signed)
|
cmov 0xE
|
cmovlt
|
(S xor OV)= 1
|
Less than(signed)
|
cmov 0x6
|
cmovle
|
((S xor OV)or Z)= 1
|
Less than or equal(signed)
|
cmov 0x7
|
cmovh
|
(CY or Z)= 0
|
Higher(Greater than)
|
cmov 0xB
|
cmovnl
|
CY = 0
|
Not lower(Greater than or equal)
|
cmov 0x9
|
cmovl
|
CY = 1
|
Lower(Less than)
|
cmov 0x1
|
cmovnh
|
(CY or Z)= 1
|
Not higher(Less than or equal)
|
cmov 0x3
|
cmove
|
Z = 1
|
Equal
|
cmov 0x2
|
cmovne
|
Z = 0
|
Not equal
|
cmov 0xA
|
cmovv
|
OV = 1
|
Overflow
|
cmov 0x0
|
cmovnv
|
OV = 0
|
No overflow
|
cmov 0x8
|
cmovn
|
S = 1
|
Negative
|
cmov 0x4
|
cmovp
|
S = 0
|
Positive
|
cmov 0xC
|
cmovc
|
CY = 1
|
Carry
|
cmov 0x1
|
cmovnc
|
CY = 0
|
No carry
|
cmov 0x9
|
cmovz
|
Z = 1
|
Zero
|
cmov 0x2
|
cmovnz
|
Z = 0
|
Not zero
|
cmov 0xA
|
cmovt
|
always 1
|
Always 1
|
cmov 0x5
|
cmovsa
|
SAT = 1
|
Saturated
|
cmov 0xD
|
[詳細説明]
- | “cmov imm4, reg1, reg2, reg3”の形式の命令に対し,アセンブラでは,機械語命令のcmov命令注が1つ生成されます。 |
注 | 機械語命令のcmov命令は,第2オペランドにレジスタ,または-16〜+15(0xFFFFFFF0〜0xF)の範囲のイミーディエトをとります。 |
- | “cmov imm4, imm, reg2, reg3”の形式でimmに次のものを指定した場合,アセンブラでは,機械語命令のcmov命令が1つ生成されます。 |
cmov imm4, imm5, reg2, reg3
|
cmov imm4, imm5, reg2, reg3
|
- | “cmov imm4, imm, reg2, reg3”の形式でimmに次のものを指定した場合,アセンブラでは,命令展開が行われ,複数個の機械語命令が生成されます。 |
(a) | -16〜+15の範囲を越え,-32768〜+32767の範囲の絶対値式 |
cmov imm4, imm16, reg2, reg3
|
movea imm16, r0, r1
cmov imm4, r1, reg2, reg3
|
(b) | -32768〜+32767の範囲を越える絶対値式 |
immの値の下位16ビットがすべて0の場合
cmov imm4, imm, reg2, reg3
|
movhi HIGHW(imm), r0, r1
cmov imm4, r1, reg2, reg3
|
上記以外の場合
cmov imm4, imm, reg2, reg3
|
mov imm, r1
cmov imm4, r1, reg2, reg3
|
(c) | #label,またはlabelを持つ相対値式,およびsdata/sbss属性セクションに定義を持たないラベルの$labelを持つ相対値式 |
cmov imm4, #label, reg2, reg3
|
mov #label, r1
cmov imm4, r1, reg2, reg3
|
cmov imm4, label, reg2, reg3
|
mov label, r1
cmov imm4, r1, reg2, reg3
|
cmov imm4, $label, reg2, reg3
|
mov $label, r1
cmov imm4, r1, reg2, reg3
|
(d) | !label,または%labelを持つ相対値式,およびsdata/sbss属性セクションに定義を持つラベルの$labelを持つ相対値式 |
cmov imm4, !label, reg2, reg3
|
movea !label, r0, r1
cmov imm4, r1, reg2, reg3
|
cmov imm4, %label, reg2, reg3
|
movea %label, r0, r1
cmov imm4, r1, reg2, reg3
|
cmov imm4, $label, reg2, reg3
|
movea $label, r0, r1
cmov imm4, r1, reg2, reg3
|
- | “cmovcnd reg1, reg2, reg3”の形式の命令に対し,アセンブラでは,対応するcmov命令が生成され(「表 5.31 cmovcnd命令」を参照),“cmov imm4, reg1, reg2, reg3”の形式に変換されます。 |
- | “cmovcnd imm, reg2, reg3”の形式でimmに次のものを指定した場合,アセンブラでは,対応するcmov命令が生成され(「表 5.31 cmovcnd命令」を参照),“cmov imm, reg2, reg3”の形式に変換されます。 |
- | “cmovcnd imm, reg2, reg3”の形式でimmに次のものを指定した場合,アセンブラでは,命令展開が行われ,複数個の機械語命令が生成されます。 |
(a) | -16〜+15の範囲を越え,-32768〜+32767の範囲の絶対値式 |
cmovcnd imm16, reg2, reg3
|
movea imm16, r0, r1
cmovcnd r1, reg2, reg3
|
(b) | -32768〜+32767の範囲を越える絶対値式 |
immの値の下位16ビットがすべて0の場合
cmovcnd imm, reg2, reg3
|
movhi HIGHW(imm), r0, r1
cmovcnd r1, reg2, reg3
|
上記以外の場合
cmovcnd imm, reg2, reg3
|
mov imm, r1
cmovcnd r1, reg2, reg3
|
(c) | #label,またはlabelを持つ相対値式,およびsdata/sbss属性セクションに定義を持たないラベルの$labelを持つ相対値式 |
cmovcnd #label, reg2, reg3
|
mov #label, r1
cmovcnd r1, reg2, reg3
|
cmovcnd label, reg2, reg3
|
mov label, r1
cmovcnd r1, reg2, reg3
|
cmovcnd $label, reg2, reg3
|
mov $label, r1
cmovcnd r1, reg2, reg3
|
(d) | !label,または%labelを持つ相対値式,およびsdata/sbss属性セクションに定義を持つラベルの$labelを持つ相対値式 |
cmovcnd !label, reg2, reg3
|
movea !label, r0, r1
cmovcnd r1, reg2, reg3
|
cmovcnd %label, reg2, reg3
|
movea %label, r0, r1
cmovcnd r1, reg2, reg3
|
cmovcnd $label, reg2, reg3
|
movea $label, r0, r1
cmovcnd r1, reg2, reg3
|
[フラグ]
[注意事項]
- | cmov命令のimm4に4ビットの範囲を越える定数式を指定した場合,次のメッセージが出力されます。
なお,4ビット幅を越える場合は,0xFでマスクした値を用いてアセンブルが続行されます。 |
W0550011 : イミーディエトの値が指定可能な値の範囲を越えています。
|