@@ -602,7 +602,6 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
602602 uint64_t Encoding = TSFlags & X86II::EncodingMask;
603603 bool HasEVEX_K = TSFlags & X86II::EVEX_K;
604604 bool HasVEX_4V = TSFlags & X86II::VEX_4V;
605- bool HasVEX_4VOp3 = TSFlags & X86II::VEX_4VOp3;
606605 bool HasEVEX_RC = TSFlags & X86II::EVEX_RC;
607606
608607 // VEX_R: opcode externsion equivalent to REX.R in
@@ -768,13 +767,20 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
768767 if (!HasVEX_4V) // Only needed with VSIB which don't use VVVV.
769768 EVEX_V2 = ~(IndexRegEnc >> 4 ) & 1 ;
770769
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 ;
778784 break ;
779785 }
780786 case X86II::MRMSrcMemOp4: {
@@ -837,8 +843,7 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
837843 RegEnc = getX86RegEncoding (MI, CurOp++);
838844 VEX_B = ~(RegEnc >> 3 ) & 1 ;
839845 VEX_X = ~(RegEnc >> 4 ) & 1 ;
840- if (HasVEX_4VOp3)
841- VEX_4V = ~getX86RegEncoding (MI, CurOp++) & 0xf ;
846+
842847 if (EVEX_b) {
843848 if (HasEVEX_RC) {
844849 unsigned RcOperand = NumOps-1 ;
@@ -849,6 +854,18 @@ void X86MCCodeEmitter::EmitVEXOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
849854 }
850855 break ;
851856 }
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+ }
852869 case X86II::MRMSrcRegOp4: {
853870 // dst(ModR/M.reg), src1(VEX_4V), src2(Imm[7:4]), src3(ModR/M),
854871 unsigned RegEnc = getX86RegEncoding (MI, CurOp++);
@@ -1157,7 +1174,6 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS,
11571174
11581175 // It uses the VEX.VVVV field?
11591176 bool HasVEX_4V = TSFlags & X86II::VEX_4V;
1160- bool HasVEX_4VOp3 = TSFlags & X86II::VEX_4VOp3;
11611177 bool HasVEX_I8Reg = (TSFlags & X86II::ImmMask) == X86II::Imm8Reg;
11621178
11631179 // It uses the EVEX.aaa field?
@@ -1337,15 +1353,23 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS,
13371353 EmitRegModRMByte (MI.getOperand (SrcRegNum),
13381354 GetX86RegNum (MI.getOperand (CurOp)), CurByte, OS);
13391355 CurOp = SrcRegNum + 1 ;
1340- if (HasVEX_4VOp3)
1341- ++CurOp;
13421356 if (HasVEX_I8Reg)
13431357 I8RegNum = getX86RegEncoding (MI, CurOp++);
13441358 // do not count the rounding control operand
13451359 if (HasEVEX_RC)
13461360 --NumOps;
13471361 break ;
13481362 }
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+ }
13491373 case X86II::MRMSrcRegOp4: {
13501374 EmitByte (BaseOpcode, CurByte, OS);
13511375 unsigned SrcRegNum = CurOp + 1 ;
@@ -1376,12 +1400,21 @@ encodeInstruction(const MCInst &MI, raw_ostream &OS,
13761400 emitMemModRMByte (MI, FirstMemOp, GetX86RegNum (MI.getOperand (CurOp)),
13771401 TSFlags, Rex, CurByte, OS, Fixups, STI);
13781402 CurOp = FirstMemOp + X86::AddrNumOperands;
1379- if (HasVEX_4VOp3)
1380- ++CurOp;
13811403 if (HasVEX_I8Reg)
13821404 I8RegNum = getX86RegEncoding (MI, CurOp++);
13831405 break ;
13841406 }
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+ }
13851418 case X86II::MRMSrcMemOp4: {
13861419 unsigned FirstMemOp = CurOp+1 ;
13871420
0 commit comments