@@ -977,7 +977,7 @@ AND.rm64.reg64 dest, src
977977# BSWAP
978978BSWAP.reg16 dest
979979 *16* dest := ((dest & 0x00FF) << 8) |
980- ((dest & 0xFF00) > 8)
980+ ((dest & 0xFF00) >> 8)
981981;
982982
983983
@@ -1262,87 +1262,143 @@ CMC
12621262
12631263
12641264# CMOVcc
1265+ CMOVA.reg16.reg16 dest, src *16* dest := [(~%CF && ~%ZF) ? src : dest];
1266+ CMOVA.reg16.rm16 dest, src *16* dest := [(~%CF && ~%ZF) ? src : dest];
12651267CMOVA.reg32.reg32 dest, src *32* dest := [(~%CF && ~%ZF) ? src : dest];
12661268CMOVA.reg32.rm32 dest, src *32* dest := [(~%CF && ~%ZF) ? src : dest];
12671269
1270+ CMOVAE.reg16.reg16 dest, src *16* dest := [(%CF = 0) ? src : dest];
1271+ CMOVAE.reg16.rm16 dest, src *16* dest := [(%CF = 0) ? src : dest];
12681272CMOVAE.reg32.reg32 dest, src *32* dest := [(%CF = 0) ? src : dest];
12691273CMOVAE.reg32.rm32 dest, src *32* dest := [(%CF = 0) ? src : dest];
12701274
1275+ CMOVB.reg16.reg16 dest, src *16* dest := [(%CF = 1) ? src : dest];
1276+ CMOVB.reg16.rm16 dest, src *16* dest := [(%CF = 1) ? src : dest];
12711277CMOVB.reg32.reg32 dest, src *32* dest := [(%CF = 1) ? src : dest];
12721278CMOVB.reg32.rm32 dest, src *32* dest := [(%CF = 1) ? src : dest];
12731279
1280+ CMOVBE.reg16.reg16 dest, src *16* dest := [(%CF || %ZF) ? src : dest];
1281+ CMOVBE.reg16.rm16 dest, src *16* dest := [(%CF || %ZF) ? src : dest];
12741282CMOVBE.reg32.reg32 dest, src *32* dest := [(%CF || %ZF) ? src : dest];
12751283CMOVBE.reg32.rm32 dest, src *32* dest := [(%CF || %ZF) ? src : dest];
12761284
1285+ CMOVC.reg16.reg16 dest, src *16* dest := [(%CF = 1) ? src : dest];
1286+ CMOVC.reg16.rm16 dest, src *16* dest := [(%CF = 1) ? src : dest];
12771287CMOVC.reg32.reg32 dest, src *32* dest := [(%CF = 1) ? src : dest];
12781288CMOVC.reg32.rm32 dest, src *32* dest := [(%CF = 1) ? src : dest];
12791289
1290+ CMOVE.reg16.reg16 dest, src *16* dest := [(%ZF = 1) ? src : dest];
1291+ CMOVE.reg16.rm16 dest, src *16* dest := [(%ZF = 1) ? src : dest];
12801292CMOVE.reg32.reg32 dest, src *32* dest := [(%ZF = 1) ? src : dest];
12811293CMOVE.reg32.rm32 dest, src *32* dest := [(%ZF = 1) ? src : dest];
12821294
1295+ CMOVG.reg16.reg16 dest, src *16* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
1296+ CMOVG.reg16.rm16 dest, src *16* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
12831297CMOVG.reg32.reg32 dest, src *32* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
12841298CMOVG.reg32.rm32 dest, src *32* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
12851299
1300+ CMOVGE.reg16.reg16 dest, src *16* dest := [(~(%SF ^ %OF)) ? src : dest];
1301+ CMOVGE.reg16.rm16 dest, src *16* dest := [(~(%SF ^ %OF)) ? src : dest];
12861302CMOVGE.reg32.reg32 dest, src *32* dest := [(~(%SF ^ %OF)) ? src : dest];
12871303CMOVGE.reg32.rm32 dest, src *32* dest := [(~(%SF ^ %OF)) ? src : dest];
12881304
1305+ CMOVL.reg16.reg16 dest, src *16* dest := [(%SF ^ %OF) ? src : dest];
1306+ CMOVL.reg16.rm16 dest, src *16* dest := [(%SF ^ %OF) ? src : dest];
12891307CMOVL.reg32.reg32 dest, src *32* dest := [(%SF ^ %OF) ? src : dest];
12901308CMOVL.reg32.rm32 dest, src *32* dest := [(%SF ^ %OF) ? src : dest];
12911309
1310+ CMOVLE.reg16.reg16 dest, src *16* dest := [(%ZF || (%SF ^ %OF)) ? src : dest];
1311+ CMOVLE.reg16.rm16 dest, src *16* dest := [(%ZF || (%SF ^ %OF)) ? src : dest];
12921312CMOVLE.reg32.reg32 dest, src *32* dest := [(%ZF || (%SF ^ %OF)) ? src : dest];
12931313CMOVLE.reg32.rm32 dest, src *32* dest := [(%ZF || (%SF ^ %OF)) ? src : dest];
12941314
1315+ CMOVNA.reg16.reg16 dest, src *16* dest := [(%CF || %ZF) ? src : dest];
1316+ CMOVNA.reg16.rm16 dest, src *16* dest := [(%CF || %ZF) ? src : dest];
12951317CMOVNA.reg32.reg32 dest, src *32* dest := [(%CF || %ZF) ? src : dest];
12961318CMOVNA.reg32.rm32 dest, src *32* dest := [(%CF || %ZF) ? src : dest];
12971319
1320+ CMOVNAE.reg16.reg16 dest, src *16* dest := [(%CF = 1) ? src : dest];
1321+ CMOVNAE.reg16.rm16 dest, src *16* dest := [(%CF = 1) ? src : dest];
12981322CMOVNAE.reg32.reg32 dest, src *32* dest := [(%CF = 1) ? src : dest];
12991323CMOVNAE.reg32.rm32 dest, src *32* dest := [(%CF = 1) ? src : dest];
13001324
1325+ CMOVNB.reg16.reg16 dest, src *16* dest := [(%CF = 0) ? src : dest];
1326+ CMOVNB.reg16.rm16 dest, src *16* dest := [(%CF = 0) ? src : dest];
13011327CMOVNB.reg32.reg32 dest, src *32* dest := [(%CF = 0) ? src : dest];
13021328CMOVNB.reg32.rm32 dest, src *32* dest := [(%CF = 0) ? src : dest];
13031329
1330+ CMOVNBE.reg16.reg16 dest, src *16* dest := [(~%CF && ~%ZF) ? src : dest];
1331+ CMOVNBE.reg16.rm16 dest, src *16* dest := [(~%CF && ~%ZF) ? src : dest];
13041332CMOVNBE.reg32.reg32 dest, src *32* dest := [(~%CF && ~%ZF) ? src : dest];
13051333CMOVNBE.reg32.rm32 dest, src *32* dest := [(~%CF && ~%ZF) ? src : dest];
13061334
1335+ CMOVNC.reg16.reg16 dest, src *16* dest := [(%CF = 0) ? src : dest];
1336+ CMOVNC.reg16.rm16 dest, src *16* dest := [(%CF = 0) ? src : dest];
13071337CMOVNC.reg32.reg32 dest, src *32* dest := [(%CF = 0) ? src : dest];
13081338CMOVNC.reg32.rm32 dest, src *32* dest := [(%CF = 0) ? src : dest];
13091339
1340+ CMOVNE.reg16.reg16 dest, src *16* dest := [(%ZF = 0) ? src : dest];
1341+ CMOVNE.reg16.rm16 dest, src *16* dest := [(%ZF = 0) ? src : dest];
13101342CMOVNE.reg32.reg32 dest, src *32* dest := [(%ZF = 0) ? src : dest];
13111343CMOVNE.reg32.rm32 dest, src *32* dest := [(%ZF = 0) ? src : dest];
13121344
1345+ CMOVNG.reg16.reg16 dest, src *16* dest := [(%ZF || (%SF ^ %OF)) ? src : dest];
1346+ CMOVNG.reg16.rm16 dest, src *16* dest := [(%ZF || (%SF ^ %OF)) ? src : dest];
13131347CMOVNG.reg32.reg32 dest, src *32* dest := [(%ZF || (%SF ^ %OF)) ? src : dest];
13141348CMOVNG.reg32.rm32 dest, src *32* dest := [(%ZF || (%SF ^ %OF)) ? src : dest];
13151349
1350+ CMOVNGE.reg16.reg16 dest, src *16* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
1351+ CMOVNGE.reg16.rm16 dest, src *16* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
13161352CMOVNGE.reg32.reg32 dest, src *32* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
13171353CMOVNGE.reg32.rm32 dest, src *32* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
13181354
1355+ CMOVNL.reg16.reg16 dest, src *16* dest := [(~(%SF ^ %OF)) ? src : dest];
1356+ CMOVNL.reg16.rm16 dest, src *16* dest := [(~(%SF ^ %OF)) ? src : dest];
13191357CMOVNL.reg32.reg32 dest, src *32* dest := [(~(%SF ^ %OF)) ? src : dest];
13201358CMOVNL.reg32.rm32 dest, src *32* dest := [(~(%SF ^ %OF)) ? src : dest];
13211359
1360+ CMOVNLE.reg16.reg16 dest, src *16* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
1361+ CMOVNLE.reg16.rm16 dest, src *16* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
13221362CMOVNLE.reg32.reg32 dest, src *32* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
13231363CMOVNLE.reg32.rm32 dest, src *32* dest := [(~%ZF && ~(%SF ^ %OF)) ? src : dest];
13241364
1365+ CMOVNO.reg16.reg16 dest, src *16* dest := [(~%OF) ? src : dest];
1366+ CMOVNO.reg16.rm16 dest, src *16* dest := [(~%OF) ? src : dest];
13251367CMOVNO.reg32.reg32 dest, src *32* dest := [(~%OF) ? src : dest];
13261368CMOVNO.reg32.rm32 dest, src *32* dest := [(~%OF) ? src : dest];
13271369
1370+ CMOVNP.reg16.reg16 dest, src *16* dest := [(~%PF) ? src : dest];
1371+ CMOVNP.reg16.rm16 dest, src *16* dest := [(~%PF) ? src : dest];
13281372CMOVNP.reg32.reg32 dest, src *32* dest := [(~%PF) ? src : dest];
13291373CMOVNP.reg32.rm32 dest, src *32* dest := [(~%PF) ? src : dest];
13301374
1375+ CMOVNS.reg16.reg16 dest, src *16* dest := [(~%SF) ? src : dest];
1376+ CMOVNS.reg16.rm16 dest, src *16* dest := [(~%SF) ? src : dest];
13311377CMOVNS.reg32.reg32 dest, src *32* dest := [(~%SF) ? src : dest];
13321378CMOVNS.reg32.rm32 dest, src *32* dest := [(~%SF) ? src : dest];
13331379
1380+ CMOVNZ.reg16.reg16 dest, src *16* dest := [(~%ZF) ? src : dest];
1381+ CMOVNZ.reg16.rm16 dest, src *16* dest := [(~%ZF) ? src : dest];
13341382CMOVNZ.reg32.reg32 dest, src *32* dest := [(~%ZF) ? src : dest];
13351383CMOVNZ.reg32.rm32 dest, src *32* dest := [(~%ZF) ? src : dest];
13361384
1385+ CMOVO.reg16.reg16 dest, src *16* dest := [(%OF) ? src : dest];
1386+ CMOVO.reg16.rm16 dest, src *16* dest := [(%OF) ? src : dest];
13371387CMOVO.reg32.reg32 dest, src *32* dest := [(%OF) ? src : dest];
13381388CMOVO.reg32.rm32 dest, src *32* dest := [(%OF) ? src : dest];
13391389
1390+ CMOVP.reg16.reg16 dest, src *16* dest := [(%PF) ? src : dest];
1391+ CMOVP.reg16.rm16 dest, src *16* dest := [(%PF) ? src : dest];
13401392CMOVP.reg32.reg32 dest, src *32* dest := [(%PF) ? src : dest];
13411393CMOVP.reg32.rm32 dest, src *32* dest := [(%PF) ? src : dest];
13421394
1395+ CMOVS.reg16.reg16 dest, src *16* dest := [(%SF) ? src : dest];
1396+ CMOVS.reg16.rm16 dest, src *16* dest := [(%SF) ? src : dest];
13431397CMOVS.reg32.reg32 dest, src *32* dest := [(%SF) ? src : dest];
13441398CMOVS.reg32.rm32 dest, src *32* dest := [(%SF) ? src : dest];
13451399
1400+ CMOVZ.reg16.reg16 dest, src *16* dest := [(%ZF) ? src : dest];
1401+ CMOVZ.reg16.rm16 dest, src *16* dest := [(%ZF) ? src : dest];
13461402CMOVZ.reg32.reg32 dest, src *32* dest := [(%ZF) ? src : dest];
13471403CMOVZ.reg32.rm32 dest, src *32* dest := [(%ZF) ? src : dest];
13481404
@@ -1465,13 +1521,40 @@ CMP.rm64.reg64 lhs, rhs
14651521
14661522
14671523# CMPXCHG
1524+ CMPXCHG.reg8.reg8 dest, src
1525+ *1* %ZF := %al = dest
1526+ *8* %ZF = 1 => dest := src
1527+ *8* %ZF = 0 => %al := dest
1528+ ;
1529+
1530+ CMPXCHG.reg16.reg16 dest, src
1531+ *1* %ZF := %ax = dest
1532+ *16* %ZF = 1 => dest := src
1533+ *16* %ZF = 0 => %ax := dest
1534+ ;
1535+
1536+ CMPXCHG.reg32.reg32 dest, src
1537+ *1* %ZF := %eax = dest
1538+ *32* %ZF = 1 => dest := src
1539+ *32* %ZF = 0 => %eax := dest
1540+ ;
1541+
14681542CMPXCHG.rm32.reg32 dest, src
14691543 *1* %ZF := %eax = dest
14701544 *32* %ZF = 1 => dest := src
14711545 *32* %ZF = 0 => %eax := dest
14721546;
14731547
14741548
1549+ # CMPXCHG8B
1550+ CMPXCHG8B.rm64 dest
1551+ *1* %ZF := (dest@[0:31] = %eax) && (dest@[32:63] = %edx)
1552+ *64* %ZF = 1 => dest := %ebx | %ecx << 32
1553+ *32* %ZF = 0 => %eax := dest@[0:31]
1554+ *32* %ZF = 0 => %edx := dest@[32:63]
1555+ ;
1556+
1557+
14751558# CWD
14761559CWD
14771560 *16* %dx := [%ax@[15:15] = 0 ? 0:0xFFFF]
@@ -4116,28 +4199,60 @@ WAIT
41164199
41174200
41184201# XADD
4202+ XADD.reg8.reg8 dest, src
4203+ *8* tmp_src := src
4204+ *8* tmpb := src + dest
4205+ *8* src := dest
4206+ *8* dest := tmpb
4207+ ADDFLAGS8(tmp_src, src, dest)
4208+ ;
4209+
41194210XADD.rm8.reg8 dest, src
4211+ *8* tmp_src := src
41204212 *8* tmpb := src + dest
41214213 *8* src := dest
41224214 *8* dest := tmpb
4215+ ADDFLAGS8(tmp_src, src, dest)
4216+ ;
4217+
4218+ XADD.reg16.reg16 dest, src
4219+ *16* tmp_src := src
4220+ *16* tmph := src + dest
4221+ *16* src := dest
4222+ *16* dest := tmph
4223+ ADDFLAGS16(tmp_src, src, dest)
41234224;
41244225
41254226XADD.rm16.reg16 dest, src
4227+ *16* tmp_src := src
41264228 *16* tmph := src + dest
41274229 *16* src := dest
41284230 *16* dest := tmph
4231+ ADDFLAGS16(tmp_src, src, dest)
4232+ ;
4233+
4234+ XADD.reg32.reg32 dest, src
4235+ *32* tmp_src := src
4236+ *32* tmp1 := src + dest
4237+ *32* src := dest
4238+ *32* dest := tmp1
4239+ ADDFLAGS32(tmp_src, src, dest)
41294240;
41304241
41314242XADD.rm32.reg32 dest, src
4132- *8* tmp1 := src + dest
4133- *8* src := dest
4134- *8* dest := tmp1
4243+ *32* tmp_src := src
4244+ *32* tmp1 := src + dest
4245+ *32* src := dest
4246+ *32* dest := tmp1
4247+ ADDFLAGS32(tmp_src, src, dest)
41354248;
41364249
41374250XADD.rm64.reg64 dest, src
4138- *8* tmp1 := src + dest
4139- *8* src := dest
4140- *8* dest := tmp1
4251+ *64* tmp_src := src
4252+ *64* tmp1 := src + dest
4253+ *64* src := dest
4254+ *64* dest := tmp1
4255+ ADDFLAGS64(tmp_src, src, dest)
41414256;
41424257
41434258
0 commit comments