@@ -251,6 +251,7 @@ class X86OpcodePrefixHelper {
251
251
void setAAA (const MCInst &MI, unsigned OpNum) {
252
252
EVEX_aaa = getRegEncoding (MI, OpNum);
253
253
}
254
+ void setNF (bool V) { EVEX_aaa |= V << 2 ; }
254
255
255
256
X86OpcodePrefixHelper (const MCRegisterInfo &MRI)
256
257
: W(0 ), R(0 ), X(0 ), B(0 ), M(0 ), R2(0 ), X2(0 ), B2(0 ), VEX_4V(0 ), VEX_L(0 ),
@@ -987,9 +988,11 @@ X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
987
988
}
988
989
989
990
Prefix.setW (TSFlags & X86II::REX_W);
991
+ Prefix.setNF (TSFlags & X86II::EVEX_NF);
990
992
991
993
bool HasEVEX_K = TSFlags & X86II::EVEX_K;
992
994
bool HasVEX_4V = TSFlags & X86II::VEX_4V;
995
+ bool IsND = X86II::hasNewDataDest (TSFlags); // IsND implies HasVEX_4V
993
996
bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;
994
997
995
998
switch (TSFlags & X86II::OpMapMask) {
@@ -1049,6 +1052,7 @@ X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
1049
1052
1050
1053
bool EncodeRC = false ;
1051
1054
uint8_t EVEX_rc = 0 ;
1055
+
1052
1056
unsigned CurOp = X86II::getOperandBias (Desc);
1053
1057
1054
1058
switch (TSFlags & X86II::FormMask) {
@@ -1073,16 +1077,21 @@ X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
1073
1077
// MemAddr, src1(VEX_4V), src2(ModR/M)
1074
1078
// MemAddr, src1(ModR/M), imm8
1075
1079
//
1080
+ // NDD:
1081
+ // dst(VEX_4V), MemAddr, src1(ModR/M)
1076
1082
Prefix.setBB2 (MI, MemOperand + X86::AddrBaseReg);
1077
1083
Prefix.setXX2 (MI, MemOperand + X86::AddrIndexReg);
1078
1084
Prefix.setV2 (MI, MemOperand + X86::AddrIndexReg, HasVEX_4V);
1079
1085
1086
+ if (IsND)
1087
+ Prefix.set4VV2 (MI, CurOp++);
1088
+
1080
1089
CurOp += X86::AddrNumOperands;
1081
1090
1082
1091
if (HasEVEX_K)
1083
1092
Prefix.setAAA (MI, CurOp++);
1084
1093
1085
- if (HasVEX_4V)
1094
+ if (!IsND && HasVEX_4V)
1086
1095
Prefix.set4VV2 (MI, CurOp++);
1087
1096
1088
1097
Prefix.setRR2 (MI, CurOp++);
@@ -1098,12 +1107,18 @@ X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
1098
1107
//
1099
1108
// FMA4:
1100
1109
// dst(ModR/M.reg), src1(VEX_4V), src2(ModR/M), src3(Imm[7:4])
1110
+ //
1111
+ // NDD:
1112
+ // dst(VEX_4V), src1(ModR/M), MemAddr
1113
+ if (IsND)
1114
+ Prefix.set4VV2 (MI, CurOp++);
1115
+
1101
1116
Prefix.setRR2 (MI, CurOp++);
1102
1117
1103
1118
if (HasEVEX_K)
1104
1119
Prefix.setAAA (MI, CurOp++);
1105
1120
1106
- if (HasVEX_4V)
1121
+ if (!IsND && HasVEX_4V)
1107
1122
Prefix.set4VV2 (MI, CurOp++);
1108
1123
1109
1124
Prefix.setBB2 (MI, MemOperand + X86::AddrBaseReg);
@@ -1160,12 +1175,17 @@ X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
1160
1175
//
1161
1176
// FMA4:
1162
1177
// dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
1178
+ //
1179
+ // NDD:
1180
+ // dst(VEX_4V), src1(ModR/M.reg), src2(ModR/M)
1181
+ if (IsND)
1182
+ Prefix.set4VV2 (MI, CurOp++);
1163
1183
Prefix.setRR2 (MI, CurOp++);
1164
1184
1165
1185
if (HasEVEX_K)
1166
1186
Prefix.setAAA (MI, CurOp++);
1167
1187
1168
- if (HasVEX_4V)
1188
+ if (!IsND && HasVEX_4V)
1169
1189
Prefix.set4VV2 (MI, CurOp++);
1170
1190
1171
1191
Prefix.setBB2 (MI, CurOp);
@@ -1209,14 +1229,19 @@ X86MCCodeEmitter::emitVEXOpcodePrefix(int MemOperand, const MCInst &MI,
1209
1229
// dst(ModR/M), src(ModR/M)
1210
1230
// dst(ModR/M), src(ModR/M), imm8
1211
1231
// dst(ModR/M), src1(VEX_4V), src2(ModR/M)
1232
+ //
1233
+ // NDD:
1234
+ // dst(VEX_4V), src1(ModR/M), src2(ModR/M)
1235
+ if (IsND)
1236
+ Prefix.set4VV2 (MI, CurOp++);
1212
1237
Prefix.setBB2 (MI, CurOp);
1213
1238
Prefix.setX (MI, CurOp, 4 );
1214
1239
++CurOp;
1215
1240
1216
1241
if (HasEVEX_K)
1217
1242
Prefix.setAAA (MI, CurOp++);
1218
1243
1219
- if (HasVEX_4V)
1244
+ if (!IsND && HasVEX_4V)
1220
1245
Prefix.set4VV2 (MI, CurOp++);
1221
1246
1222
1247
Prefix.setRR2 (MI, CurOp++);
@@ -1508,6 +1533,8 @@ void X86MCCodeEmitter::encodeInstruction(const MCInst &MI,
1508
1533
1509
1534
unsigned OpcodeOffset = 0 ;
1510
1535
1536
+ bool IsND = X86II::hasNewDataDest (TSFlags);
1537
+
1511
1538
uint64_t Form = TSFlags & X86II::FormMask;
1512
1539
switch (Form) {
1513
1540
default :
@@ -1576,6 +1603,8 @@ void X86MCCodeEmitter::encodeInstruction(const MCInst &MI,
1576
1603
1577
1604
if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
1578
1605
++SrcRegNum;
1606
+ if (IsND) // Skip the NDD operand encoded in EVEX_VVVV
1607
+ ++CurOp;
1579
1608
1580
1609
emitRegModRMByte (MI.getOperand (CurOp),
1581
1610
getX86RegNum (MI.getOperand (SrcRegNum)), CB);
@@ -1602,6 +1631,9 @@ void X86MCCodeEmitter::encodeInstruction(const MCInst &MI,
1602
1631
if (HasVEX_4V) // Skip 1st src (which is encoded in VEX_VVVV)
1603
1632
++SrcRegNum;
1604
1633
1634
+ if (IsND) // Skip new data destination
1635
+ ++CurOp;
1636
+
1605
1637
bool ForceSIB = (Form == X86II::MRMDestMemFSIB);
1606
1638
emitMemModRMByte (MI, CurOp, getX86RegNum (MI.getOperand (SrcRegNum)), TSFlags,
1607
1639
Kind, StartByte, CB, Fixups, STI, ForceSIB);
@@ -1669,6 +1701,9 @@ void X86MCCodeEmitter::encodeInstruction(const MCInst &MI,
1669
1701
case X86II::MRMSrcMem: {
1670
1702
unsigned FirstMemOp = CurOp + 1 ;
1671
1703
1704
+ if (IsND) // Skip new data destination
1705
+ CurOp++;
1706
+
1672
1707
if (HasEVEX_K) // Skip writemask
1673
1708
++FirstMemOp;
1674
1709
0 commit comments