summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
diff options
context:
space:
mode:
authorAdam Nemet <anemet@apple.com>2014-07-17 17:04:50 +0000
committerAdam Nemet <anemet@apple.com>2014-07-17 17:04:50 +0000
commit54adb0fcbca390dfe677e84b4e8918d7e5280334 (patch)
treed4f38b03d504342d4c44745d5f4697265096953f /llvm/lib/Target/X86/MCTargetDesc/X86MCCodeEmitter.cpp
parent4dc92b9a84da145ab537dfe6cfdefd49f7e74ccc (diff)
downloadbcm5719-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.cpp47
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)
OpenPOWER on IntegriCloud