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 @@ -317,16 +317,17 @@ static bool isDispOrCDisp8(uint64_t TSFlags, int Value, int &ImmOffset) { bool HasEVEX = (TSFlags & X86II::EncodingMask) == X86II::EVEX; - int CD8_Scale = + unsigned CD8_Scale = (TSFlags & X86II::CD8_Scale_Mask) >> X86II::CD8_Scale_Shift; - if (!HasEVEX || CD8_Scale == 0) + CD8_Scale = CD8_Scale ? 1U << (CD8_Scale - 1) : 0U; + if (!HasEVEX || !CD8_Scale) return isInt<8>(Value); assert(isPowerOf2_32(CD8_Scale) && "Unexpected CD8 scale!"); if (Value & (CD8_Scale - 1)) // Unaligned offset return false; - int CDisp8 = Value / CD8_Scale; + int CDisp8 = Value / static_cast(CD8_Scale); if (!isInt<8>(CDisp8)) return false; 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 @@ -388,11 +388,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>