|
|
|
|
@ -0,0 +1,793 @@
|
|
|
|
|
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
|
|
|
|
|
; REQUIRES: aarch64-registered-target
|
|
|
|
|
; REQUIRES: amdgpu-registered-target
|
|
|
|
|
; REQUIRES: x86-registered-target
|
|
|
|
|
|
|
|
|
|
; RUN: llc -mtriple=aarch64-linux-gnu -O0 -stop-after=irtranslator -global-isel %s -o - 2>&1 | FileCheck %s --check-prefix=AARCH64
|
|
|
|
|
; RUN: llc -mtriple=amdgcn--mesa-mesa3d -O0 -stop-after=irtranslator -global-isel %s -o - 2>&1 | FileCheck %s --check-prefix=AMDGPU
|
|
|
|
|
; RUN: llc -mtriple=x86_64-linux-gnu -O0 -stop-after=irtranslator -global-isel %s -o - 2>&1 | FileCheck %s --check-prefix=X86
|
|
|
|
|
|
|
|
|
|
; IRTranslator handling of LLVM IR's byte type (bN), constants and loads /
|
|
|
|
|
; stores of byte values, and bitcasts to/from byte types. Byte values are
|
|
|
|
|
; translated as the equi-sized integer scalar (sN) at the IR-to-MIR boundary.
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; Byte type plumbing: arguments, returns, control flow.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
; A byte-typed argument and return is plumbed through as the equi-sized
|
|
|
|
|
; integer scalar.
|
|
|
|
|
define b32 @byte_arg_ret_b32(b32 %b) {
|
|
|
|
|
; AARCH64-LABEL: name: byte_arg_ret_b32
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: byte_arg_ret_b32
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: byte_arg_ret_b32
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: $eax = COPY [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $eax
|
|
|
|
|
ret b32 %b
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Single-bit byte (b1) maps to s1.
|
|
|
|
|
define void @byte_b1_store(b1 %b, ptr %p) {
|
|
|
|
|
; AARCH64-LABEL: name: byte_b1_store
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0, $x1
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(i1) = G_TRUNC [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
|
|
|
|
|
; AARCH64-NEXT: G_STORE [[TRUNC]](i1), [[COPY1]](p0) :: (store (i1) into %ir.p)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: byte_b1_store
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
|
|
|
|
|
; AMDGPU-NEXT: G_STORE [[TRUNC]](s1), [[MV]](p0) :: (store (s1) into %ir.p)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: byte_b1_store
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi, $rsi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $rsi
|
|
|
|
|
; X86-NEXT: G_STORE [[TRUNC]](s1), [[COPY1]](p0) :: (store (s1) into %ir.p)
|
|
|
|
|
; X86-NEXT: RET 0
|
|
|
|
|
store b1 %b, ptr %p
|
|
|
|
|
ret void
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Non-power-of-two byte width still maps to the same-width integer.
|
|
|
|
|
define void @byte_b24_store(b24 %b, ptr %p) {
|
|
|
|
|
; AARCH64-LABEL: name: byte_b24_store
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0, $x1
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(i24) = G_TRUNC [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $x1
|
|
|
|
|
; AARCH64-NEXT: G_STORE [[TRUNC]](i24), [[COPY1]](p0) :: (store (i24) into %ir.p, align 4)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: byte_b24_store
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(s24) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY1]](s32), [[COPY2]](s32)
|
|
|
|
|
; AMDGPU-NEXT: G_STORE [[TRUNC]](s24), [[MV]](p0) :: (store (s24) into %ir.p, align 4)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: byte_b24_store
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi, $rsi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s24) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: [[COPY1:%[0-9]+]]:_(p0) = COPY $rsi
|
|
|
|
|
; X86-NEXT: G_STORE [[TRUNC]](s24), [[COPY1]](p0) :: (store (s24) into %ir.p, align 4)
|
|
|
|
|
; X86-NEXT: RET 0
|
|
|
|
|
store b24 %b, ptr %p
|
|
|
|
|
ret void
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; phi over byte values.
|
|
|
|
|
define b32 @byte_phi(i1 %c, b32 %x, b32 %y) {
|
|
|
|
|
; AARCH64-LABEL: name: byte_phi
|
|
|
|
|
; AARCH64: bb.1.entry:
|
|
|
|
|
; AARCH64-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0, $w1, $w2
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(i8) = G_TRUNC [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: [[COPY1:%[0-9]+]]:_(i32) = COPY $w1
|
|
|
|
|
; AARCH64-NEXT: [[COPY2:%[0-9]+]]:_(i32) = COPY $w2
|
|
|
|
|
; AARCH64-NEXT: [[ASSERT_ZEXT:%[0-9]+]]:_(i8) = G_ASSERT_ZEXT [[TRUNC]], 1
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC1:%[0-9]+]]:_(i1) = G_TRUNC [[ASSERT_ZEXT]](i8)
|
|
|
|
|
; AARCH64-NEXT: G_BRCOND [[TRUNC1]](i1), %bb.2
|
|
|
|
|
; AARCH64-NEXT: G_BR %bb.3
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: bb.2.t:
|
|
|
|
|
; AARCH64-NEXT: successors: %bb.4(0x80000000)
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: G_BR %bb.4
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: bb.3.f:
|
|
|
|
|
; AARCH64-NEXT: successors: %bb.4(0x80000000)
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: G_BR %bb.4
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: bb.4.join:
|
|
|
|
|
; AARCH64-NEXT: [[PHI:%[0-9]+]]:_(i32) = G_PHI [[COPY1]](i32), %bb.2, [[COPY2]](i32), %bb.3
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[PHI]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: byte_phi
|
|
|
|
|
; AMDGPU: bb.1.entry:
|
|
|
|
|
; AMDGPU-NEXT: successors: %bb.4(0x40000000), %bb.2(0x40000000)
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: [[C:%[0-9]+]]:_(s1) = G_CONSTANT i1 true
|
|
|
|
|
; AMDGPU-NEXT: [[XOR:%[0-9]+]]:_(s1) = G_XOR [[TRUNC]], [[C]]
|
|
|
|
|
; AMDGPU-NEXT: [[INT:%[0-9]+]]:_(s1), [[INT1:%[0-9]+]]:_(s64) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.if), [[XOR]](s1)
|
|
|
|
|
; AMDGPU-NEXT: G_BRCOND [[INT]](s1), %bb.4
|
|
|
|
|
; AMDGPU-NEXT: G_BR %bb.2
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: bb.2.Flow:
|
|
|
|
|
; AMDGPU-NEXT: successors: %bb.3(0x40000000), %bb.5(0x40000000)
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[INT2:%[0-9]+]]:_(s1), [[INT3:%[0-9]+]]:_(s64) = G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.else), [[INT1]](s64)
|
|
|
|
|
; AMDGPU-NEXT: G_BRCOND [[INT2]](s1), %bb.3
|
|
|
|
|
; AMDGPU-NEXT: G_BR %bb.5
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: bb.3.t:
|
|
|
|
|
; AMDGPU-NEXT: successors: %bb.5(0x80000000)
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: G_BR %bb.5
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: bb.4.f:
|
|
|
|
|
; AMDGPU-NEXT: successors: %bb.2(0x80000000)
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: G_BR %bb.2
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: bb.5.join:
|
|
|
|
|
; AMDGPU-NEXT: [[PHI:%[0-9]+]]:_(s32) = G_PHI [[COPY2]](s32), %bb.2, [[COPY1]](s32), %bb.3
|
|
|
|
|
; AMDGPU-NEXT: G_INTRINSIC_W_SIDE_EFFECTS intrinsic(@llvm.amdgcn.end.cf), [[INT3]](s64)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[PHI]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: byte_phi
|
|
|
|
|
; X86: bb.1.entry:
|
|
|
|
|
; X86-NEXT: successors: %bb.2(0x40000000), %bb.3(0x40000000)
|
|
|
|
|
; X86-NEXT: liveins: $edi, $edx, $esi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $esi
|
|
|
|
|
; X86-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $edx
|
|
|
|
|
; X86-NEXT: G_BRCOND [[TRUNC]](s1), %bb.2
|
|
|
|
|
; X86-NEXT: G_BR %bb.3
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: bb.2.t:
|
|
|
|
|
; X86-NEXT: successors: %bb.4(0x80000000)
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: G_BR %bb.4
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: bb.3.f:
|
|
|
|
|
; X86-NEXT: successors: %bb.4(0x80000000)
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: G_BR %bb.4
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: bb.4.join:
|
|
|
|
|
; X86-NEXT: [[PHI:%[0-9]+]]:_(s32) = G_PHI [[COPY1]](s32), %bb.2, [[COPY2]](s32), %bb.3
|
|
|
|
|
; X86-NEXT: $eax = COPY [[PHI]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $eax
|
|
|
|
|
entry:
|
|
|
|
|
br i1 %c, label %t, label %f
|
|
|
|
|
t:
|
|
|
|
|
br label %join
|
|
|
|
|
f:
|
|
|
|
|
br label %join
|
|
|
|
|
join:
|
|
|
|
|
%r = phi b32 [ %x, %t ], [ %y, %f ]
|
|
|
|
|
ret b32 %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; select on a byte type.
|
|
|
|
|
define b32 @byte_select(i1 %c, b32 %x, b32 %y) {
|
|
|
|
|
; AARCH64-LABEL: name: byte_select
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0, $w1, $w2
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(i8) = G_TRUNC [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: [[COPY1:%[0-9]+]]:_(i32) = COPY $w1
|
|
|
|
|
; AARCH64-NEXT: [[COPY2:%[0-9]+]]:_(i32) = COPY $w2
|
|
|
|
|
; AARCH64-NEXT: [[ASSERT_ZEXT:%[0-9]+]]:_(i8) = G_ASSERT_ZEXT [[TRUNC]], 1
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC1:%[0-9]+]]:_(i1) = G_TRUNC [[ASSERT_ZEXT]](i8)
|
|
|
|
|
; AARCH64-NEXT: [[SELECT:%[0-9]+]]:_(i32) = G_SELECT [[TRUNC1]](i1), [[COPY1]], [[COPY2]]
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[SELECT]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: byte_select
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[TRUNC]](s1), [[COPY1]], [[COPY2]]
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[SELECT]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: byte_select
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi, $edx, $esi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s1) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $esi
|
|
|
|
|
; X86-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $edx
|
|
|
|
|
; X86-NEXT: [[SELECT:%[0-9]+]]:_(s32) = G_SELECT [[TRUNC]](s1), [[COPY1]], [[COPY2]]
|
|
|
|
|
; X86-NEXT: $eax = COPY [[SELECT]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $eax
|
|
|
|
|
%r = select i1 %c, b32 %x, b32 %y
|
|
|
|
|
ret b32 %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; A b8 loaded through a flat pointer.
|
|
|
|
|
define b8 @load_b8(ptr %p) {
|
|
|
|
|
; AARCH64-LABEL: name: load_b8
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $x0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
|
|
|
|
|
; AARCH64-NEXT: [[LOAD:%[0-9]+]]:_(i8) = G_LOAD [[COPY]](p0) :: (load (i8) from %ir.p)
|
|
|
|
|
; AARCH64-NEXT: [[ANYEXT:%[0-9]+]]:_(i32) = G_ANYEXT [[LOAD]](i8)
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[ANYEXT]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: load_b8
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[MV]](p0) :: (load (s8) from %ir.p)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[LOAD]](s8)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: load_b8
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $rdi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi
|
|
|
|
|
; X86-NEXT: [[LOAD:%[0-9]+]]:_(s8) = G_LOAD [[COPY]](p0) :: (load (s8) from %ir.p)
|
|
|
|
|
; X86-NEXT: $al = COPY [[LOAD]](s8)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $al
|
|
|
|
|
%b = load b8, ptr %p
|
|
|
|
|
ret b8 %b
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; A b64 constant should materialise as a G_CONSTANT with an integer LLT.
|
|
|
|
|
define void @byte_constant_store(ptr %p) {
|
|
|
|
|
; AARCH64-LABEL: name: byte_constant_store
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $x0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
|
|
|
|
|
; AARCH64-NEXT: [[C:%[0-9]+]]:_(i64) = G_CONSTANT i64 42
|
|
|
|
|
; AARCH64-NEXT: G_STORE [[C]](i64), [[COPY]](p0) :: (store (i64) into %ir.p)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: byte_constant_store
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 42
|
|
|
|
|
; AMDGPU-NEXT: G_STORE [[C]](s64), [[MV]](p0) :: (store (s64) into %ir.p)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: byte_constant_store
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $rdi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi
|
|
|
|
|
; X86-NEXT: [[C:%[0-9]+]]:_(s64) = G_CONSTANT i64 42
|
|
|
|
|
; X86-NEXT: G_STORE [[C]](s64), [[COPY]](p0) :: (store (s64) into %ir.p)
|
|
|
|
|
; X86-NEXT: RET 0
|
|
|
|
|
store b64 42, ptr %p
|
|
|
|
|
ret void
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; Bitcasts to/from byte: same-LLT collapses to a copy, distinct-LLT keeps
|
|
|
|
|
;; G_BITCAST, ptr/non-ptr crossings use G_INTTOPTR / G_PTRTOINT.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
; Byte-to-byte bitcast of the same width is a no-op copy.
|
|
|
|
|
define b32 @bitcast_b32_to_b32(b32 %b) {
|
|
|
|
|
; AARCH64-LABEL: name: bitcast_b32_to_b32
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bitcast_b32_to_b32
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bitcast_b32_to_b32
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: $eax = COPY [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $eax
|
|
|
|
|
%r = bitcast b32 %b to b32
|
|
|
|
|
ret b32 %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Vector of bytes to vector of same-width integers shares an LLT - copy.
|
|
|
|
|
define <4 x i8> @bitcast_v4b8_to_v4i8(<4 x b8> %v) {
|
|
|
|
|
; AARCH64-LABEL: name: bitcast_v4b8_to_v4i8
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $d0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(<4 x i16>) = COPY $d0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x i8>) = G_TRUNC [[COPY]](<4 x i16>)
|
|
|
|
|
; AARCH64-NEXT: [[ANYEXT:%[0-9]+]]:_(<4 x i16>) = G_ANYEXT [[TRUNC]](<4 x i8>)
|
|
|
|
|
; AARCH64-NEXT: $d0 = COPY [[ANYEXT]](<4 x i16>)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $d0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bitcast_v4b8_to_v4i8
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
|
|
|
|
|
; AMDGPU-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[COPY3]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x s8>) = G_TRUNC [[BUILD_VECTOR]](<4 x s32>)
|
|
|
|
|
; AMDGPU-NEXT: [[UV:%[0-9]+]]:_(s8), [[UV1:%[0-9]+]]:_(s8), [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[TRUNC]](<4 x s8>)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s8)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr1 = COPY [[ANYEXT1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr2 = COPY [[ANYEXT2]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr3 = COPY [[ANYEXT3]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1, implicit $vgpr2, implicit $vgpr3
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bitcast_v4b8_to_v4i8
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $xmm0
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $xmm0
|
|
|
|
|
; X86-NEXT: [[UV:%[0-9]+]]:_(<4 x s8>), [[UV1:%[0-9]+]]:_(<4 x s8>), [[UV2:%[0-9]+]]:_(<4 x s8>), [[UV3:%[0-9]+]]:_(<4 x s8>) = G_UNMERGE_VALUES [[COPY]](<16 x s8>)
|
|
|
|
|
; X86-NEXT: [[UV4:%[0-9]+]]:_(s8), [[UV5:%[0-9]+]]:_(s8), [[UV6:%[0-9]+]]:_(s8), [[UV7:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[UV]](<4 x s8>)
|
|
|
|
|
; X86-NEXT: [[DEF:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF
|
|
|
|
|
; X86-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<16 x s8>) = G_BUILD_VECTOR [[UV4]](s8), [[UV5]](s8), [[UV6]](s8), [[UV7]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8)
|
|
|
|
|
; X86-NEXT: $xmm0 = COPY [[BUILD_VECTOR]](<16 x s8>)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $xmm0
|
|
|
|
|
%r = bitcast <4 x b8> %v to <4 x i8>
|
|
|
|
|
ret <4 x i8> %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Vector of bytes to a scalar integer with the same total size: distinct LLTs,
|
|
|
|
|
; G_BITCAST is required.
|
|
|
|
|
define i32 @bitcast_v4b8_to_i32(<4 x b8> %v) {
|
|
|
|
|
; AARCH64-LABEL: name: bitcast_v4b8_to_i32
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $d0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(<4 x i16>) = COPY $d0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x i8>) = G_TRUNC [[COPY]](<4 x i16>)
|
|
|
|
|
; AARCH64-NEXT: [[BITCAST:%[0-9]+]]:_(i32) = G_BITCAST [[TRUNC]](<4 x i8>)
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[BITCAST]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bitcast_v4b8_to_i32
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
|
|
|
|
|
; AMDGPU-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[COPY3]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x s8>) = G_TRUNC [[BUILD_VECTOR]](<4 x s32>)
|
|
|
|
|
; AMDGPU-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[TRUNC]](<4 x s8>)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[BITCAST]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bitcast_v4b8_to_i32
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $xmm0
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $xmm0
|
|
|
|
|
; X86-NEXT: [[UV:%[0-9]+]]:_(<4 x s8>), [[UV1:%[0-9]+]]:_(<4 x s8>), [[UV2:%[0-9]+]]:_(<4 x s8>), [[UV3:%[0-9]+]]:_(<4 x s8>) = G_UNMERGE_VALUES [[COPY]](<16 x s8>)
|
|
|
|
|
; X86-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[UV]](<4 x s8>)
|
|
|
|
|
; X86-NEXT: $eax = COPY [[BITCAST]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $eax
|
|
|
|
|
%r = bitcast <4 x b8> %v to i32
|
|
|
|
|
ret i32 %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Scalar byte to a vector of bytes of the same total width: distinct LLTs,
|
|
|
|
|
; G_BITCAST is required.
|
|
|
|
|
define <4 x b8> @bitcast_b32_to_v4b8(b32 %b) {
|
|
|
|
|
; AARCH64-LABEL: name: bitcast_b32_to_v4b8
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: [[BITCAST:%[0-9]+]]:_(<4 x i8>) = G_BITCAST [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: [[ANYEXT:%[0-9]+]]:_(<4 x i16>) = G_ANYEXT [[BITCAST]](<4 x i8>)
|
|
|
|
|
; AARCH64-NEXT: $d0 = COPY [[ANYEXT]](<4 x i16>)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $d0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bitcast_b32_to_v4b8
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[BITCAST:%[0-9]+]]:_(<4 x s8>) = G_BITCAST [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[UV:%[0-9]+]]:_(s8), [[UV1:%[0-9]+]]:_(s8), [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[BITCAST]](<4 x s8>)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s8)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr1 = COPY [[ANYEXT1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr2 = COPY [[ANYEXT2]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr3 = COPY [[ANYEXT3]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1, implicit $vgpr2, implicit $vgpr3
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bitcast_b32_to_v4b8
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: [[BITCAST:%[0-9]+]]:_(<4 x s8>) = G_BITCAST [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: [[UV:%[0-9]+]]:_(s8), [[UV1:%[0-9]+]]:_(s8), [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[BITCAST]](<4 x s8>)
|
|
|
|
|
; X86-NEXT: [[DEF:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF
|
|
|
|
|
; X86-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<16 x s8>) = G_BUILD_VECTOR [[UV]](s8), [[UV1]](s8), [[UV2]](s8), [[UV3]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8)
|
|
|
|
|
; X86-NEXT: $xmm0 = COPY [[BUILD_VECTOR]](<16 x s8>)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $xmm0
|
|
|
|
|
%r = bitcast b32 %b to <4 x b8>
|
|
|
|
|
ret <4 x b8> %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Vector of bytes back to a scalar byte: distinct LLTs, G_BITCAST.
|
|
|
|
|
define b32 @bitcast_v4b8_to_b32(<4 x b8> %v) {
|
|
|
|
|
; AARCH64-LABEL: name: bitcast_v4b8_to_b32
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $d0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(<4 x i16>) = COPY $d0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x i8>) = G_TRUNC [[COPY]](<4 x i16>)
|
|
|
|
|
; AARCH64-NEXT: [[BITCAST:%[0-9]+]]:_(i32) = G_BITCAST [[TRUNC]](<4 x i8>)
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[BITCAST]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bitcast_v4b8_to_b32
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
|
|
|
|
|
; AMDGPU-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[COPY3]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x s8>) = G_TRUNC [[BUILD_VECTOR]](<4 x s32>)
|
|
|
|
|
; AMDGPU-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[TRUNC]](<4 x s8>)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[BITCAST]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bitcast_v4b8_to_b32
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $xmm0
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $xmm0
|
|
|
|
|
; X86-NEXT: [[UV:%[0-9]+]]:_(<4 x s8>), [[UV1:%[0-9]+]]:_(<4 x s8>), [[UV2:%[0-9]+]]:_(<4 x s8>), [[UV3:%[0-9]+]]:_(<4 x s8>) = G_UNMERGE_VALUES [[COPY]](<16 x s8>)
|
|
|
|
|
; X86-NEXT: [[BITCAST:%[0-9]+]]:_(s32) = G_BITCAST [[UV]](<4 x s8>)
|
|
|
|
|
; X86-NEXT: $eax = COPY [[BITCAST]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $eax
|
|
|
|
|
%r = bitcast <4 x b8> %v to b32
|
|
|
|
|
ret b32 %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Byte to float (different LLT in extended mode, same in default mode).
|
|
|
|
|
; All in-tree backends run in default mode, so this collapses to a copy.
|
|
|
|
|
define float @bitcast_b32_to_float(b32 %b) {
|
|
|
|
|
; AARCH64-LABEL: name: bitcast_b32_to_float
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: [[BITCAST:%[0-9]+]]:_(f32) = G_BITCAST [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: $s0 = COPY [[BITCAST]](f32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $s0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bitcast_b32_to_float
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bitcast_b32_to_float
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: $xmm0 = COPY [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $xmm0
|
|
|
|
|
%r = bitcast b32 %b to float
|
|
|
|
|
ret float %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Pointer (p0) to b64 - lowers to G_PTRTOINT.
|
|
|
|
|
define b64 @bitcast_p0_to_b64(ptr %p) {
|
|
|
|
|
; AARCH64-LABEL: name: bitcast_p0_to_b64
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $x0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $x0
|
|
|
|
|
; AARCH64-NEXT: [[PTRTOINT:%[0-9]+]]:_(i64) = G_PTRTOINT [[COPY]](p0)
|
|
|
|
|
; AARCH64-NEXT: $x0 = COPY [[PTRTOINT]](i64)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $x0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bitcast_p0_to_b64
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[MV:%[0-9]+]]:_(p0) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[MV]](p0)
|
|
|
|
|
; AMDGPU-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[PTRTOINT]](s64)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[UV]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr1 = COPY [[UV1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bitcast_p0_to_b64
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $rdi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(p0) = COPY $rdi
|
|
|
|
|
; X86-NEXT: [[PTRTOINT:%[0-9]+]]:_(s64) = G_PTRTOINT [[COPY]](p0)
|
|
|
|
|
; X86-NEXT: $rax = COPY [[PTRTOINT]](s64)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $rax
|
|
|
|
|
%r = bitcast ptr %p to b64
|
|
|
|
|
ret b64 %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; Inverse: b64 to a pointer - G_INTTOPTR.
|
|
|
|
|
define ptr @bitcast_b64_to_p0(b64 %b) {
|
|
|
|
|
; AARCH64-LABEL: name: bitcast_b64_to_p0
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $x0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i64) = COPY $x0
|
|
|
|
|
; AARCH64-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[COPY]](i64)
|
|
|
|
|
; AARCH64-NEXT: $x0 = COPY [[INTTOPTR]](p0)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $x0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bitcast_b64_to_p0
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[MV:%[0-9]+]]:_(s64) = G_MERGE_VALUES [[COPY]](s32), [[COPY1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[MV]](s64)
|
|
|
|
|
; AMDGPU-NEXT: [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[INTTOPTR]](p0)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[UV]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr1 = COPY [[UV1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bitcast_b64_to_p0
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $rdi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $rdi
|
|
|
|
|
; X86-NEXT: [[INTTOPTR:%[0-9]+]]:_(p0) = G_INTTOPTR [[COPY]](s64)
|
|
|
|
|
; X86-NEXT: $rax = COPY [[INTTOPTR]](p0)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $rax
|
|
|
|
|
%r = bitcast b64 %b to ptr
|
|
|
|
|
ret ptr %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; The "bytecast" surface: bitcast is the only IR cast that may produce or
|
|
|
|
|
;; consume a byte type. The cases below correspond to LangRef's
|
|
|
|
|
;; "If `value` is of the byte type" subsection.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
; byte -> integer scalar, same width: same LLT, no instruction emitted.
|
|
|
|
|
define i32 @bytecast_b32_to_i32(b32 %b) {
|
|
|
|
|
; AARCH64-LABEL: name: bytecast_b32_to_i32
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bytecast_b32_to_i32
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bytecast_b32_to_i32
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: $eax = COPY [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $eax
|
|
|
|
|
%r = bitcast b32 %b to i32
|
|
|
|
|
ret i32 %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; integer -> byte, same width: same LLT, no instruction emitted.
|
|
|
|
|
define b32 @bytecast_i32_to_b32(i32 %i) {
|
|
|
|
|
; AARCH64-LABEL: name: bytecast_i32_to_b32
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: $w0 = COPY [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $w0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bytecast_i32_to_b32
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bytecast_i32_to_b32
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: $eax = COPY [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $eax
|
|
|
|
|
%r = bitcast i32 %i to b32
|
|
|
|
|
ret b32 %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; byte vector -> byte vector of identical layout: copy.
|
|
|
|
|
define <4 x b8> @bytecast_v4b8_to_v4b8(<4 x b8> %v) {
|
|
|
|
|
; AARCH64-LABEL: name: bytecast_v4b8_to_v4b8
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $d0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(<4 x i16>) = COPY $d0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x i8>) = G_TRUNC [[COPY]](<4 x i16>)
|
|
|
|
|
; AARCH64-NEXT: [[ANYEXT:%[0-9]+]]:_(<4 x i16>) = G_ANYEXT [[TRUNC]](<4 x i8>)
|
|
|
|
|
; AARCH64-NEXT: $d0 = COPY [[ANYEXT]](<4 x i16>)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $d0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bytecast_v4b8_to_v4b8
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
|
|
|
|
|
; AMDGPU-NEXT: [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
|
|
|
|
|
; AMDGPU-NEXT: [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
|
|
|
|
|
; AMDGPU-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<4 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32), [[COPY2]](s32), [[COPY3]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(<4 x s8>) = G_TRUNC [[BUILD_VECTOR]](<4 x s32>)
|
|
|
|
|
; AMDGPU-NEXT: [[UV:%[0-9]+]]:_(s8), [[UV1:%[0-9]+]]:_(s8), [[UV2:%[0-9]+]]:_(s8), [[UV3:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[TRUNC]](<4 x s8>)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[UV]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT1:%[0-9]+]]:_(s32) = G_ANYEXT [[UV1]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT2:%[0-9]+]]:_(s32) = G_ANYEXT [[UV2]](s8)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT3:%[0-9]+]]:_(s32) = G_ANYEXT [[UV3]](s8)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr1 = COPY [[ANYEXT1]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr2 = COPY [[ANYEXT2]](s32)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr3 = COPY [[ANYEXT3]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0, implicit $vgpr1, implicit $vgpr2, implicit $vgpr3
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bytecast_v4b8_to_v4b8
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $xmm0
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(<16 x s8>) = COPY $xmm0
|
|
|
|
|
; X86-NEXT: [[UV:%[0-9]+]]:_(<4 x s8>), [[UV1:%[0-9]+]]:_(<4 x s8>), [[UV2:%[0-9]+]]:_(<4 x s8>), [[UV3:%[0-9]+]]:_(<4 x s8>) = G_UNMERGE_VALUES [[COPY]](<16 x s8>)
|
|
|
|
|
; X86-NEXT: [[UV4:%[0-9]+]]:_(s8), [[UV5:%[0-9]+]]:_(s8), [[UV6:%[0-9]+]]:_(s8), [[UV7:%[0-9]+]]:_(s8) = G_UNMERGE_VALUES [[UV]](<4 x s8>)
|
|
|
|
|
; X86-NEXT: [[DEF:%[0-9]+]]:_(s8) = G_IMPLICIT_DEF
|
|
|
|
|
; X86-NEXT: [[BUILD_VECTOR:%[0-9]+]]:_(<16 x s8>) = G_BUILD_VECTOR [[UV4]](s8), [[UV5]](s8), [[UV6]](s8), [[UV7]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8), [[DEF]](s8)
|
|
|
|
|
; X86-NEXT: $xmm0 = COPY [[BUILD_VECTOR]](<16 x s8>)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $xmm0
|
|
|
|
|
%r = bitcast <4 x b8> %v to <4 x b8>
|
|
|
|
|
ret <4 x b8> %r
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
; byte -> half (16-bit float).
|
|
|
|
|
define half @bytecast_b16_to_half(b16 %b) {
|
|
|
|
|
; AARCH64-LABEL: name: bytecast_b16_to_half
|
|
|
|
|
; AARCH64: bb.1 (%ir-block.0):
|
|
|
|
|
; AARCH64-NEXT: liveins: $w0
|
|
|
|
|
; AARCH64-NEXT: {{ $}}
|
|
|
|
|
; AARCH64-NEXT: [[COPY:%[0-9]+]]:_(i32) = COPY $w0
|
|
|
|
|
; AARCH64-NEXT: [[TRUNC:%[0-9]+]]:_(i16) = G_TRUNC [[COPY]](i32)
|
|
|
|
|
; AARCH64-NEXT: [[BITCAST:%[0-9]+]]:_(f16) = G_BITCAST [[TRUNC]](i16)
|
|
|
|
|
; AARCH64-NEXT: $h0 = COPY [[BITCAST]](f16)
|
|
|
|
|
; AARCH64-NEXT: RET_ReallyLR implicit $h0
|
|
|
|
|
;
|
|
|
|
|
; AMDGPU-LABEL: name: bytecast_b16_to_half
|
|
|
|
|
; AMDGPU: bb.1 (%ir-block.0):
|
|
|
|
|
; AMDGPU-NEXT: liveins: $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: {{ $}}
|
|
|
|
|
; AMDGPU-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
|
|
|
|
|
; AMDGPU-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; AMDGPU-NEXT: [[ANYEXT:%[0-9]+]]:_(s32) = G_ANYEXT [[TRUNC]](s16)
|
|
|
|
|
; AMDGPU-NEXT: $vgpr0 = COPY [[ANYEXT]](s32)
|
|
|
|
|
; AMDGPU-NEXT: SI_RETURN implicit $vgpr0
|
|
|
|
|
;
|
|
|
|
|
; X86-LABEL: name: bytecast_b16_to_half
|
|
|
|
|
; X86: bb.1 (%ir-block.0):
|
|
|
|
|
; X86-NEXT: liveins: $edi
|
|
|
|
|
; X86-NEXT: {{ $}}
|
|
|
|
|
; X86-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $edi
|
|
|
|
|
; X86-NEXT: [[TRUNC:%[0-9]+]]:_(s16) = G_TRUNC [[COPY]](s32)
|
|
|
|
|
; X86-NEXT: $xmm0 = COPY [[TRUNC]](s16)
|
|
|
|
|
; X86-NEXT: RET 0, implicit $xmm0
|
|
|
|
|
%r = bitcast b16 %b to half
|
|
|
|
|
ret half %r
|
|
|
|
|
}
|