summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/AArch64
diff options
context:
space:
mode:
authorJF Bastien <jfbastien@apple.com>2018-09-08 16:43:49 +0000
committerJF Bastien <jfbastien@apple.com>2018-09-08 16:43:49 +0000
commit1825d10d3c1deba8040672a6975f6945e58548c9 (patch)
treeae1a45ed68d90aa46265e2ebc148da80ae27d56a /llvm/lib/Target/AArch64
parentdc79c7187cf0b638ffa452adaecfb43192c59f11 (diff)
downloadbcm5719-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.h35
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) {
OpenPOWER on IntegriCloud