const LLT s16 = LLT::scalar(16);
const LLT s32 = LLT::scalar(32);
const LLT s64 = LLT::scalar(64);
+ const LLT s128 = LLT::scalar(128);
const LLT v2s32 = LLT::vector(2, 32);
const LLT v4s32 = LLT::vector(4, 32);
const LLT v2s64 = LLT::vector(2, 64);
setAction({G_INTTOPTR, 1, s64}, Legal);
// Casts for 32 and 64-bit width type are just copies.
- for (auto Ty : {s1, s8, s16, s32, s64}) {
+ // Same for 128-bit width type, except they are on the FPR bank.
+ for (auto Ty : {s1, s8, s16, s32, s64, s128}) {
setAction({G_BITCAST, 0, Ty}, Legal);
setAction({G_BITCAST, 1, Ty}, Legal);
}
next:
ret void
}
+ define void @bitcast128() {
+ ret void
+ }
...
---
%15(<4 x s8>) = G_BITCAST %0
%16(<2 x s16>) = G_BITCAST %0
...
+
+---
+name: bitcast128
+tracksRegLiveness: true
+registers:
+ - { id: 0, class: _}
+ - { id: 1, class: _}
+ - { id: 2, class: _}
+ - { id: 3, class: _}
+body: |
+ bb.1:
+ liveins: %x0, %x1
+ ; CHECK-LABEL: bitcast128
+ ; This is legal and shouldn't be changed.
+ ; CHECK: %2(<2 x s64>) = G_BITCAST %3(s128)
+ %0(s64) = COPY %x0
+ %1(s64) = COPY %x1
+ %3(s128) = G_MERGE_VALUES %0(s64), %1(s64)
+ %2(<2 x s64>) = G_BITCAST %3(s128)
+ %q0 = COPY %2(<2 x s64>)
+ RET_ReallyLR implicit %q0
+
+...