cmov


フラグ条件付きデータの転送を行います。(Conditional Move)

[指定形式]

-

cmov imm4, reg1, reg2, reg3

-

cmov imm4, imm, reg2, reg3

-

cmovcnd reg1, reg2, reg3

-

cmovcnd imm, reg2, reg3

 

imm4に指定可能なものを以下に示します。

-

4ビット幅までの値を持つ絶対値式

機械語命令のcmov命令は,第1オペランドに0〜15(0x0〜0xF)の範囲のイミーディエトをとります。

 

immに指定可能なものを以下に示します。

-

32ビット幅までの値を持つ絶対値式

-

相対値式

[機能]

-

“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オペランドに指定したレジスタに格納します。

表 5.31

cmovcnd命令

命令

フラグ状態

フラグ状態の意味

命令変換

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つ生成されます。

(a)

-16〜+15の範囲の絶対値式

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”の形式に変換されます。

(a)

-16〜+15の範囲の絶対値式

 

-

“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

[フラグ]

CY

OV

S

Z

SAT

[注意事項]

-

cmov命令のimm4に4ビットの範囲を越える定数式を指定した場合,次のメッセージが出力されます。
なお,4ビット幅を越える場合は,0xFでマスクした値を用いてアセンブルが続行されます。

W0550011 : イミーディエトの値が指定可能な値の範囲を越えています。