CMPccXADD

如果条件满足, 则比较和添加

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
VEX.128.66.0F38.W0 E6 !(11):rrr:bbbCMPBEXADD m32, r32, r32A有效不可编码以 r32(第二个操作数)比值,以 m32为值。如果低于或等于(CF=1或ZF=1),则从 r32(第三个操作数)加到 m32,再用 m32 写新值。第二个操作数 总是用 m32 的原始值更新。
VEX.128.66.0F38.W1 E6 !(11):rrr:bbbCMPBEXADD m64, r64, r64A有效不可编码以 r64(第二个操作数)比值,以 m64为值。如果低于或等于(CF=1或ZF=1),则从 r64(第三个操作数)加到 m64,再用 m64 写新值。第二个操作数 总是用 m64 的原始值更新。
VEX.128.66.0F38.W0 E2 !(11):rrr:bbbCMPBXADD m32, r32, r32A有效不可编码比较r32(第二个操作数)中的值,其值为m32. 如果低于(CF=1),则将r32(第三个操作数)的值增加至m32,并以m32写出新值. 第二个操作数总是以来自m32的原始值更新.
VEX.128.66.0F38.W1 E2 !(11):rrr:bbbCMPBXADD m64, r64, r64A有效不可编码比较r64(第二个操作数)中的值,其值为m64. 如果低于(CF=1),则将r64(第三个操作数)的值增加至m64,并以m64写出新值. 第二个操作数总是以来自m64的原始值更新.
VEX.128.66.0F38.W0 EE !(11):rrr:bbbCMPLEXADD m32, r32, r32A有效不可编码比较r32(第二操作数)中的值与m32中的值。如果小于或等于(ZF=1或SFOF),则从r32(第三操作数)加到m32,并用m32写入新值。第二操作数总是用m32的原始值更新。
VEX.128.66.0F38.W1 EE !(11):rrr:bbbCMPLEXADD m64, r64, r64A有效不可编码比较r64(第二操作数)中的值与m64中的值。如果小于或等于(ZF=1或SFOF),则从r64(第三操作数)加到m64,并用m64写入新值。第二操作数总是用m64的原始值更新。
VEX.128.66.0F38.W0 EC !(11):rrr:bbbCMPLXADD m32, r32, r32A有效不可编码比较r32(第二操作数)中的值,以m32的值为单位. 如果小于(SFOF),则从r32(第三操作数)加到m32,并用m32写入新值. 第二操作数总是用m32的原始值更新.
VEX.128.66.0F38.W1 EC !(11):rrr:bbbCMPLXADD m64, r64, r64A有效不可编码比较r64(第二操作数)中的值,以m64的值为单位. 如果小于(SFOF),则从r64(第三操作数)加到m64,并用m64写入新值. 第二操作数总是用m64的原始值更新.
VEX.128.66.0F38.W0 E7 !(11):rrr:bbbCMPNBEXADD m32, r32, r32 Opcode/ InstructionA有效不可编码以 r32 值( 秒 操作数) 值与 m32 值的比较。 如果不低于或等于 (CF=0 和 ZF=0 ) , 则将 r32 值( 第三个 操作数 ) 添加到 m32 值, 用 m32 写新值 。 第二 操作数 总是用 m32 的原始值更新 。 O p/64/32 bit CPUID 特性描述 E n 模式支持旗帜 。
VEX.128.66.0F38.W1 E7 !(11):rrr:bbbCMPNBEXADD m64, r64, r64A有效不可编码比较r64(第二个操作数)中的值与m64中的值。如果不低于或等于(CF=0和ZF=0),则将r64(第三个操作数)的值增加为m64,并将新值写入m64。第二个操作数总是用m64的原始值进行更新。
VEX.128.66.0F38.W0 E3 !(11):rrr:bbbCMPNBXADD m32, r32, r32A有效不可编码比较r32(第二操作数)中的值,其数值为m32. 如果不低于(CF=0),则将r32(第三操作数)的值增加至m32,并以m32写入新值. 第二操作数总是用m32的原始值更新.
VEX.128.66.0F38.W1 E3 !(11):rrr:bbbCMPNBXADD m64, r64, r64A有效不可编码比较r64(第二操作数)中的值,其数值为m64. 如果不低于(CF=0),则将r64(第三操作数)的值增加至m64,并以m64写入新值. 第二操作数总是用m64的原始值更新.
VEX.128.66.0F38.W0 EF !(11):rrr:bbbCMPNLEXADD m32, r32, r32A有效不可编码比较r32(第二个操作数)中的值与m32中的值。如果不小于或等于(ZF=0和SF=OF),则从r32(第三个操作数)加到m32,并用m32写入新值。第二个操作数总是用来自m32的原始值进行更新。
VEX.128.66.0F38.W1 EF !(11):rrr:bbbCMPNLEXADD m64, r64, r64A有效不可编码比较r64(第二个操作数)中的值与m64中的值。如果不小于或等于(ZF=0和SF=OF),则从r64(第三个操作数)加到m64,并用m64写入新值。第二个操作数总是用来自m64的原始值进行更新。
VEX.128.66.0F38.W0 ED !(11):rrr:bbbCMPNLXADD m32, r32, r32A有效不可编码比较r32(第二位操作数)与m32(SF=OF)的值。如果不小于(SF=OF),则将r32(第三位操作数)的值添加到m32,并用m32写入新值。第二位操作数总是用m32的原始值更新.
VEX.128.66.0F38.W1 ED !(11):rrr:bbbCMPNLXADD m64, r64, r64A有效不可编码比较r64(第二位操作数)与m64(SF=OF)的值。如果不小于(SF=OF),则将r64(第三位操作数)的值添加到m64,并用m64写入新值。第二位操作数总是用m64的原始值更新.
VEX.128.66.0F38.W0 E1 !(11):rrr:bbbCMPNOXADD m32, r32, r32A有效不可编码比较以 r32(第二个操作数)计值,以 m32(OF=0)计值。如果不溢出,则从 r32(第三个操作数)增加为 m32(第三个操作数),并用 m32 书写新值。第二个操作数总是用 m32 的原始值更新。
VEX.128.66.0F38.W1 E1 !(11):rrr:bbbCMPNOXADD m64, r64, r64 Opcode/ InstructionA有效不可编码比较r64(第二位操作数)与m64的值。如果不溢出(OF=0),则将r64(第三位操作数)的值增加至m64,并用m64写出新值。第二位操作数总是用来自m64的原始值更新. O p/64/32 bit CPUID 特性描述 En Mode 支持旗帜
VEX.128.66.0F38.W0 EB !(11):rrr:bbbCMPNPXADD m32, r32, r32A有效不可编码比较r32(第二个操作数)与m32的值。如果不是等值(PF=0),则将r32(第三个操作数)的值增加至m32,并以m32写出新值。第二个操作数总是用来自m32的原始值更新.
VEX.128.66.0F38.W1 EB !(11):rrr:bbbCMPNPXADD m64, r64, r64A有效不可编码比较r64(第二个操作数)与m64的值。如果不是等值(PF=0),则将r64(第三个操作数)的值增加至m64,并以m64写出新值。第二个操作数总是用来自m64的原始值更新.
VEX.128.66.0F38.W0 E9 !(11):rrr:bbbCMPNSXADD m32, r32, r32A有效不可编码比较r32(第二个操作数)中的值,其数值为m32. 如果不签名(SF=0),则将r32(第三个操作数)的值增加为m32,并用m32写入新值. 第二个操作数总是以来自m32的原始值更新.
VEX.128.66.0F38.W1 E9 !(11):rrr:bbbCMPNSXADD m64, r64, r64A有效不可编码比较r64(第二个操作数)中的值,其数值为m64. 如果不签名(SF=0),则将r64(第三个操作数)的值增加为m64,并用m64写入新值. 第二个操作数总是以来自m64的原始值更新.
VEX.128.66.0F38.W0 E5 !(11):rrr:bbbCMPNZXADD m32, r32, r32A有效不可编码比较r32(第二个操作数)中的值与m32中的值。如果不是零(ZF=0),则从r32(第三个操作数)增加到m32,并以m32写入新值。第二个操作数总是用m32的原始值更新。
VEX.128.66.0F38.W1 E5 !(11):rrr:bbbCMPNZXADD m64, r64, r64A有效不可编码比较r64(第二个操作数)中的值与m64中的值。如果不是零(ZF=0),则从r64(第三个操作数)增加到m64,并以m64写入新值。第二个操作数总是用m64的原始值更新。
VEX.128.66.0F38.W0 E0 !(11):rrr:bbbCMPOXADD m32, r32, r32A有效不可编码比较以 r32(第二个操作数)计值,以 m32(OF=1)计值。如果溢出值从 r32(第三个操作数)增加到 m32, 用 m32 来写新值。 第二个 操作数 总是用 m32 的原始值更新 。
VEX.128.66.0F38.W1 E0 !(11):rrr:bbbCMPOXADD m64, r64, r64A有效不可编码比较以 r64(第二个操作数)计值,以 m64(OF=1)计值。如果溢出值从 r64(第三个操作数)增加到 m64, 用 m64 来写新值。 第二个 操作数 总是用 m64 的原始值更新 。
VEX.128.66.0F38.W0 EA !(11):rrr:bbbCMPPXADD m32, r32, r32A有效不可编码比较r32(第二个操作数)与m32的值. 如果等值(PF=1)从r32(第三个操作数)加到m32,并用m32写入新值. 第二个操作数总是用m32的原始值更新.
VEX.128.66.0F38.W1 EA !(11):rrr:bbbCMPPXADD m64, r64, r64 Opcode/ InstructionA有效不可编码比较 r64(第二个操作数)与m64的值。如果等值(PF=1)从r64(第三个操作数)增加到m64,并用m64写新值。第二个操作数总是用m64的原始值更新。 O p/64/32 bit CPUID 特性描述 E n 模式支持旗帜
VEX.128.66.0F38.W0 E8 !(11):rrr:bbbCMPSXADD m32, r32, r32A有效不可编码比较r32(第二个操作数)中的值,其数值为m32。如果符号(SF=1)从r32(第三个操作数)增加到m32,并用m32写入新的值。第二个操作数总是用来自m32的原始值更新。
VEX.128.66.0F38.W1 E8 !(11):rrr:bbbCMPSXADD m64, r64, r64A有效不可编码比较r64(第二个操作数)中的值,其数值为m64。如果符号(SF=1)从r64(第三个操作数)增加到m64,并用m64写入新的值。第二个操作数总是用来自m64的原始值更新。
VEX.128.66.0F38.W0 E4 !(11):rrr:bbbCMPZXADD m32, r32, r32A有效不可编码比较r32(第二个操作数)中的值,其数值为m32. 如果为零(ZF=1),则将r32(第三个操作数)的值增加为m32,并用m32写入新值. 第二个操作数总是用来自m32的原始值更新.
VEX.128.66.0F38.W1 E4 !(11):rrr:bbbCMPZXADD m64, r64, r64 Op/En Tuple Type Operand 1 A N/A ModRM:r/m (r,A有效不可编码比较 r64(第二行)和 m64(第二行)的数值。如果零(ZF=1),则从 r64(第三行)到 m64(第三行)增加值,并以 m64 写入新值。第二行总是用 m64 的原始值来更新。 Instructio n Opcod ing1 Op raind 2 Opernd 4 w) ModRM:reg (r, w) VEX.vvvv (r) N/A

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

A

  1. modrm.rm lectura y escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  2. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  3. vex.vvvv lecturaVEX 前缀的 vvvv 字段(按位取反)

实测开销

未实测:不在 64 位处理器上运行。

说明

本指令将内存中的值与第二个操作数的值进行比较. 如果满足了指定的条件,那么处理器会将第三个 操作数 添加到 内存操作数 中并写入内存,否则内存会被这个指令所改变.

此指令必须使 MODRM.MOD 等于 0, 1 或 2 。 MODRM.MOD的值为3,将会导致无效的操作码例外(#UD).

第二个操作数总是以内存操作数的原始值更新. EFLAGS条件通过比较结果更新. 指令使用隐含锁. 本指令不允许使用明确的锁定前缀.

行动

CMPCCXADD srcdest1, srcdest2, src3
tmp1 := load lock srcdest1
tmp2 := tmp1 + src3
EFLAGS.CS,OF,SF,ZF,AF,PF := CMP tmp1, srcdest2
IF <condition>:

    srcdest1 := store unlock tmp2
ELSE

    srcdest1 := store unlock tmp1
srcdest2 :=tmp1

1. ModRM.MOD != 011B

受影响的旗帜

EFLAGS条件由比较结果更新.

Intel C/C++ 内在编译器

CMPCCXADD int _cmpccxadd_epi32 (void* __A, int __B, int __C, const int __D);
CMPCCXADD __int64 _cmpccxadd_epi64 (void* __A, __int64 __B, __int64 __C, const int __D);

SIMD 浮点 例外

None.

例外14型;见表2-31。

来源