diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h b/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h --- a/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h +++ b/llvm/lib/Target/X86/MCTargetDesc/X86BaseInfo.h @@ -955,10 +955,10 @@ // The scaling factor for the AVX512's 8-bit compressed displacement. CD8_Scale_Shift = EVEX_BShift + 1, - CD8_Scale_Mask = 127ULL << CD8_Scale_Shift, + CD8_Scale_Mask = 7ULL << CD8_Scale_Shift, /// Explicitly specified rounding control - EVEX_RCShift = CD8_Scale_Shift + 7, + EVEX_RCShift = CD8_Scale_Shift + 3, EVEX_RC = 1ULL << EVEX_RCShift, // NOTRACK prefix diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -319,6 +319,8 @@ int CD8_Scale = (TSFlags & X86II::CD8_Scale_Mask) >> X86II::CD8_Scale_Shift; + assert(CD8_Scale >=0 && "Invalid CD8_Scale!"); + CD8_Scale = CD8_Scale ? static_cast(1U << (CD8_Scale - 1)) : 0; if (!HasEVEX || CD8_Scale == 0) return isInt<8>(Value); diff --git a/llvm/lib/Target/X86/X86InstrFormats.td b/llvm/lib/Target/X86/X86InstrFormats.td --- a/llvm/lib/Target/X86/X86InstrFormats.td +++ b/llvm/lib/Target/X86/X86InstrFormats.td @@ -389,11 +389,10 @@ let TSFlags{42} = hasEVEX_Z; let TSFlags{43} = hasEVEX_L2; let TSFlags{44} = hasEVEX_B; - // If we run out of TSFlags bits, it's possible to encode this in 3 bits. - let TSFlags{51-45} = CD8_Scale; - let TSFlags{52} = hasEVEX_RC; - let TSFlags{53} = hasNoTrackPrefix; - let TSFlags{54} = ExplicitVEXPrefix; + let TSFlags{47-45} = !if(!eq(CD8_Scale, 0), 0, !add(!logtwo(CD8_Scale), 1)); + let TSFlags{48} = hasEVEX_RC; + let TSFlags{49} = hasNoTrackPrefix; + let TSFlags{50} = ExplicitVEXPrefix; } class PseudoI pattern>