diff options
author | JF Bastien <jfbastien@apple.com> | 2018-09-08 16:43:49 +0000 |
---|---|---|
committer | JF Bastien <jfbastien@apple.com> | 2018-09-08 16:43:49 +0000 |
commit | 1825d10d3c1deba8040672a6975f6945e58548c9 (patch) | |
tree | ae1a45ed68d90aa46265e2ebc148da80ae27d56a /llvm/lib/Target/AArch64 | |
parent | dc79c7187cf0b638ffa452adaecfb43192c59f11 (diff) | |
download | bcm5719-llvm-1825d10d3c1deba8040672a6975f6945e58548c9.tar.gz bcm5719-llvm-1825d10d3c1deba8040672a6975f6945e58548c9.zip |
NFC: use bit_cast more in AArch64AddressingModes
llvm-svn: 341749
Diffstat (limited to 'llvm/lib/Target/AArch64')
-rw-r--r-- | llvm/lib/Target/AArch64/MCTargetDesc/AArch64AddressingModes.h | 35 |
1 files changed, 11 insertions, 24 deletions
diff --git a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AddressingModes.h b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AddressingModes.h index 34b732a1ff4..688ca755d0b 100644 --- a/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AddressingModes.h +++ b/llvm/lib/Target/AArch64/MCTargetDesc/AArch64AddressingModes.h @@ -754,12 +754,8 @@ static inline uint64_t decodeAdvSIMDModImmType12(uint8_t Imm) { /// Returns true if Imm is the concatenation of a repeating pattern of type T. template <typename T> static inline bool isSVEMaskOfIdenticalElements(int64_t Imm) { - union { - int64_t Whole; - T Parts[sizeof(int64_t)/sizeof(T)]; - } Vec { Imm }; - - return all_of(Vec.Parts, [Vec](T Elem) { return Elem == Vec.Parts[0]; }); + auto Parts = bit_cast<std::array<T, sizeof(int64_t) / sizeof(T)>>(Imm); + return all_of(Parts, [&](T Elem) { return Elem == Parts[0]; }); } /// Returns true if Imm is valid for CPY/DUP. @@ -787,29 +783,20 @@ static inline bool isSVEAddSubImm(int64_t Imm) { /// Return true if Imm is valid for DUPM and has no single CPY/DUP equivalent. static inline bool isSVEMoveMaskPreferredLogicalImmediate(int64_t Imm) { - union { - int64_t D; - int32_t S[2]; - int16_t H[4]; - int8_t B[8]; - } Vec = { Imm }; - - if (isSVECpyImm<int64_t>(Vec.D)) + if (isSVECpyImm<int64_t>(Imm)) return false; - if (isSVEMaskOfIdenticalElements<int32_t>(Imm) && - isSVECpyImm<int32_t>(Vec.S[0])) - return false; + auto S = bit_cast<std::array<int32_t, 2>>(Imm); + auto H = bit_cast<std::array<int16_t, 4>>(Imm); + auto B = bit_cast<std::array<int8_t, 8>>(Imm); - if (isSVEMaskOfIdenticalElements<int16_t>(Imm) && - isSVECpyImm<int16_t>(Vec.H[0])) + if (isSVEMaskOfIdenticalElements<int32_t>(Imm) && isSVECpyImm<int32_t>(S[0])) return false; - - if (isSVEMaskOfIdenticalElements<int8_t>(Imm) && - isSVECpyImm<int8_t>(Vec.B[0])) + if (isSVEMaskOfIdenticalElements<int16_t>(Imm) && isSVECpyImm<int16_t>(H[0])) return false; - - return isLogicalImmediate(Vec.D, 64); + if (isSVEMaskOfIdenticalElements<int8_t>(Imm) && isSVECpyImm<int8_t>(B[0])) + return false; + return isLogicalImmediate(Imm, 64); } inline static bool isAnyMOVZMovAlias(uint64_t Value, int RegWidth) { |