diff options
author | Adam Nemet <anemet@apple.com> | 2014-07-17 17:04:50 +0000 |
---|---|---|
committer | Adam Nemet <anemet@apple.com> | 2014-07-17 17:04:50 +0000 |
commit | 54adb0fcbca390dfe677e84b4e8918d7e5280334 (patch) | |
tree | d4f38b03d504342d4c44745d5f4697265096953f /llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp | |
parent | 4dc92b9a84da145ab537dfe6cfdefd49f7e74ccc (diff) | |
download | bcm5719-llvm-54adb0fcbca390dfe677e84b4e8918d7e5280334.tar.gz bcm5719-llvm-54adb0fcbca390dfe677e84b4e8918d7e5280334.zip |
[X86] AVX512: Use the TD version of CD8_Scale in the assembler
Passes the computed scaling factor in TSFlags rather than the old attributes.
Also removes the C++ version of computing the scaling factor (MemObjSize)
along with the asserts added by the previous patch.
No functional change.
llvm-svn: 213279
Diffstat (limited to 'llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp')
-rw-r--r-- | llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp | 47 |
1 files changed, 7 insertions, 40 deletions
diff --git a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp index df0778d3ce6..075db11027d 100644 --- a/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp @@ -189,51 +189,18 @@ static bool isCDisp8(uint64_t TSFlags, int Value, int& CValue) { X86II::EncodingShift == X86II::EVEX) && "Compressed 8-bit displacement is only valid for EVEX inst."); - unsigned CD8E = (TSFlags >> X86II::EVEX_CD8EShift) & X86II::EVEX_CD8EMask; - unsigned CD8V = (TSFlags >> X86II::EVEX_CD8VShift) & X86II::EVEX_CD8VMask; - unsigned CD8_Scale = (TSFlags >> 56) & 0x7f; - - if (CD8V == 0 && CD8E == 0) { + unsigned CD8_Scale = + (TSFlags >> X86II::CD8_Scale_Shift) & X86II::CD8_Scale_Mask; + if (CD8_Scale == 0) { CValue = Value; - assert(CD8_Scale == 0); return isDisp8(Value); } - unsigned ElemSize = 1U << CD8E; - unsigned MemObjSize; - // The unit of displacement is either - // - the size of a power-of-two number of elements or - // - the size of a single element for broadcasts or - // - the total vector size divided by a power-of-two number. - if (CD8V & 4) { - // Fixed vector length - unsigned NumElems = 1U << (CD8V & 0x3); - MemObjSize = ElemSize * NumElems; - } else { - // Modified vector length - bool EVEX_b = (TSFlags >> X86II::VEXShift) & X86II::EVEX_B; - if (EVEX_b) - // Broadcast implies element size units. - MemObjSize = ElemSize; - else { - unsigned EVEX_LL = ((TSFlags >> X86II::VEXShift) & X86II::VEX_L) ? 1 : 0; - EVEX_LL += ((TSFlags >> X86II::VEXShift) & X86II::EVEX_L2) ? 2 : 0; - assert(EVEX_LL < 3 && ""); - - unsigned VectorByteSize = 1U << (EVEX_LL + 4); - unsigned Divider = 1U << (CD8V & 0x3); - MemObjSize = VectorByteSize / Divider; - } - } - - assert(MemObjSize == CD8_Scale); - - unsigned MemObjMask = MemObjSize - 1; - assert((MemObjSize & MemObjMask) == 0 && "Invalid memory object size."); - - if (Value & MemObjMask) // Unaligned offset + unsigned Mask = CD8_Scale - 1; + assert((CD8_Scale & Mask) == 0 && "Invalid memory object size."); + if (Value & Mask) // Unaligned offset return false; - Value /= (int)MemObjSize; + Value /= (int)CD8_Scale; bool Ret = (Value == (signed char)Value); if (Ret) |