@@ -602,7 +602,6 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
602
602
uint64_t Encoding = TSFlags & X86II::EncodingMask;
603
603
bool HasEVEX_K = TSFlags & X86II::EVEX_K;
604
604
bool HasVEX_4V = TSFlags & X86II::VEX_4V;
605
- bool HasVEX_4VOp3 = TSFlags & X86II::VEX_4VOp3;
606
605
bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;
607
606
608
607
// VEX_R: opcode externsion equivalent to REX.R in
@@ -768,13 +767,20 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
768
767
if (!HasVEX_4V) // Only needed with VSIB which don't use VVVV.
769
768
EVEX_V2 = ~(IndexRegEnc >> 4 ) & 1 ;
770
769
771
- if (HasVEX_4VOp3)
772
- // Instruction format for 4VOp3:
773
- // src1(ModR/M), MemAddr, src3(VEX_4V)
774
- // CurOp points to start of the MemoryOperand,
775
- // it skips TIED_TO operands if exist, then increments past src1.
776
- // CurOp + X86::AddrNumOperands will point to src3.
777
- VEX_4V = ~getX86RegEncoding (MI, CurOp + X86::AddrNumOperands) & 0xf ;
770
+ break ;
771
+ }
772
+ case X86II::MRMSrcMem4VOp3: {
773
+ // Instruction format for 4VOp3:
774
+ // src1(ModR/M), MemAddr, src3(VEX_4V)
775
+ unsigned RegEnc = getX86RegEncoding (MI, CurOp++);
776
+ VEX_R = ~(RegEnc >> 3 ) & 1 ;
777
+
778
+ unsigned BaseRegEnc = getX86RegEncoding (MI, MemOperand + X86::AddrBaseReg);
779
+ VEX_B = ~(BaseRegEnc >> 3 ) & 1 ;
780
+ unsigned IndexRegEnc = getX86RegEncoding (MI, MemOperand+X86::AddrIndexReg);
781
+ VEX_X = ~(IndexRegEnc >> 3 ) & 1 ;
782
+
783
+ VEX_4V = ~getX86RegEncoding (MI, CurOp + X86::AddrNumOperands) & 0xf ;
778
784
break ;
779
785
}
780
786
case X86II::MRMSrcMemOp4: {
@@ -837,8 +843,7 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
837
843
RegEnc = getX86RegEncoding (MI, CurOp++);
838
844
VEX_B = ~(RegEnc >> 3 ) & 1 ;
839
845
VEX_X = ~(RegEnc >> 4 ) & 1 ;
840
- if (HasVEX_4VOp3)
841
- VEX_4V = ~getX86RegEncoding (MI, CurOp++) & 0xf ;
846
+
842
847
if (EVEX_b) {
843
848
if (HasEVEX_RC) {
844
849
unsigned RcOperand = NumOps-1 ;
@@ -849,6 +854,18 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
849
854
}
850
855
break ;
851
856
}
857
+ case X86II::MRMSrcReg4VOp3: {
858
+ // Instruction format for 4VOp3:
859
+ // src1(ModR/M), src2(ModR/M), src3(VEX_4V)
860
+ unsigned RegEnc = getX86RegEncoding (MI, CurOp++);
861
+ VEX_R = ~(RegEnc >> 3 ) & 1 ;
862
+
863
+ RegEnc = getX86RegEncoding (MI, CurOp++);
864
+ VEX_B = ~(RegEnc >> 3 ) & 1 ;
865
+
866
+ VEX_4V = ~getX86RegEncoding (MI, CurOp++) & 0xf ;
867
+ break ;
868
+ }
852
869
case X86II::MRMSrcRegOp4: {
853
870
// dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
854
871
unsigned RegEnc = getX86RegEncoding (MI, CurOp++);
@@ -1157,7 +1174,6 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS,
1157
1174
1158
1175
// It uses the VEX.VVVV field?
1159
1176
bool HasVEX_4V = TSFlags & X86II::VEX_4V;
1160
- bool HasVEX_4VOp3 = TSFlags & X86II::VEX_4VOp3;
1161
1177
bool HasVEX_I8Reg = (TSFlags & X86II::ImmMask) == X86II::Imm8Reg;
1162
1178
1163
1179
// It uses the EVEX.aaa field?
@@ -1337,15 +1353,23 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS,
1337
1353
EmitRegModRMByte (MI.getOperand (SrcRegNum),
1338
1354
GetX86RegNum (MI.getOperand (CurOp)), CurByte, OS);
1339
1355
CurOp = SrcRegNum + 1 ;
1340
- if (HasVEX_4VOp3)
1341
- ++CurOp;
1342
1356
if (HasVEX_I8Reg)
1343
1357
I8RegNum = getX86RegEncoding (MI, CurOp++);
1344
1358
// do not count the rounding control operand
1345
1359
if (HasEVEX_RC)
1346
1360
--NumOps;
1347
1361
break ;
1348
1362
}
1363
+ case X86II::MRMSrcReg4VOp3: {
1364
+ EmitByte (BaseOpcode, CurByte, OS);
1365
+ unsigned SrcRegNum = CurOp + 1 ;
1366
+
1367
+ EmitRegModRMByte (MI.getOperand (SrcRegNum),
1368
+ GetX86RegNum (MI.getOperand (CurOp)), CurByte, OS);
1369
+ CurOp = SrcRegNum + 1 ;
1370
+ ++CurOp; // Encoded in VEX.VVVV
1371
+ break ;
1372
+ }
1349
1373
case X86II::MRMSrcRegOp4: {
1350
1374
EmitByte (BaseOpcode, CurByte, OS);
1351
1375
unsigned SrcRegNum = CurOp + 1 ;
@@ -1376,12 +1400,21 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS,
1376
1400
emitMemModRMByte (MI, FirstMemOp, GetX86RegNum (MI.getOperand (CurOp)),
1377
1401
TSFlags, Rex, CurByte, OS, Fixups, STI);
1378
1402
CurOp = FirstMemOp + X86::AddrNumOperands;
1379
- if (HasVEX_4VOp3)
1380
- ++CurOp;
1381
1403
if (HasVEX_I8Reg)
1382
1404
I8RegNum = getX86RegEncoding (MI, CurOp++);
1383
1405
break ;
1384
1406
}
1407
+ case X86II::MRMSrcMem4VOp3: {
1408
+ unsigned FirstMemOp = CurOp+1 ;
1409
+
1410
+ EmitByte (BaseOpcode, CurByte, OS);
1411
+
1412
+ emitMemModRMByte (MI, FirstMemOp, GetX86RegNum (MI.getOperand (CurOp)),
1413
+ TSFlags, Rex, CurByte, OS, Fixups, STI);
1414
+ CurOp = FirstMemOp + X86::AddrNumOperands;
1415
+ ++CurOp; // Encoded in VEX.VVVV.
1416
+ break ;
1417
+ }
1385
1418
case X86II::MRMSrcMemOp4: {
1386
1419
unsigned FirstMemOp = CurOp+1 ;
1387
1420
0 commit comments