1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1030 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX10,GFX1030 %s
3; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1013 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX10,GFX1013 %s
4; RUN: llc -global-isel -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX11 %s
5; RUN: not --crash llc -global-isel -march=amdgcn -mcpu=gfx1012 -verify-machineinstrs < %s -o /dev/null 2>&1 | FileCheck -check-prefix=ERR %s
6
7; uint4 llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(uint node_ptr, float ray_extent, float3 ray_origin, float3 ray_dir, float3 ray_inv_dir, uint4 texture_descr)
8; uint4 llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(uint node_ptr, float ray_extent, float3 ray_origin, half3 ray_dir, half3 ray_inv_dir, uint4 texture_descr)
9; uint4 llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(ulong node_ptr, float ray_extent, float3 ray_origin, float3 ray_dir, float3 ray_inv_dir, uint4 texture_descr)
10; uint4 llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(ulong node_ptr, float ray_extent, float3 ray_origin, half3 ray_dir, half3 ray_inv_dir, uint4 texture_descr)
11
12declare <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(i32, float, <3 x float>, <3 x float>, <3 x float>, <4 x i32>)
13declare <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(i32, float, <3 x float>, <3 x half>, <3 x half>, <4 x i32>)
14declare <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(i64, float, <3 x float>, <3 x float>, <3 x float>, <4 x i32>)
15declare <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(i64, float, <3 x float>, <3 x half>, <3 x half>, <4 x i32>)
16declare i32 @llvm.amdgcn.workitem.id.x()
17
18define amdgpu_ps <4 x float> @image_bvh_intersect_ray(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> inreg %tdescr) {
19; GCN-LABEL: image_bvh_intersect_ray:
20; GCN:       ; %bb.0:
21; GCN-NEXT:    image_bvh_intersect_ray v[0:3], v[0:15], s[0:3]
22; GCN-NEXT:    s_waitcnt vmcnt(0)
23; GCN-NEXT:    ; return to shader part epilog
24; ERR: in function image_bvh_intersect_ray{{.*}}intrinsic not supported on subtarget
25  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)
26  %r = bitcast <4 x i32> %v to <4 x float>
27  ret <4 x float> %r
28}
29
30define amdgpu_ps <4 x float> @image_bvh_intersect_ray_flat(i32 %node_ptr, float %ray_extent, float %ray_origin_x, float %ray_origin_y, float %ray_origin_z, float %ray_dir_x, float %ray_dir_y, float %ray_dir_z, float %ray_inv_dir_x, float %ray_inv_dir_y, float %ray_inv_dir_z, <4 x i32> inreg %tdescr) {
31; GCN-LABEL: image_bvh_intersect_ray_flat:
32; GCN:       ; %bb.0:
33; GCN-NEXT:    image_bvh_intersect_ray v[0:3], v[0:15], s[0:3]
34; GCN-NEXT:    s_waitcnt vmcnt(0)
35; GCN-NEXT:    ; return to shader part epilog
36  %ray_origin0 = insertelement <3 x float> undef, float %ray_origin_x, i32 0
37  %ray_origin1 = insertelement <3 x float> %ray_origin0, float %ray_origin_y, i32 1
38  %ray_origin = insertelement <3 x float> %ray_origin1, float %ray_origin_z, i32 2
39  %ray_dir0 = insertelement <3 x float> undef, float %ray_dir_x, i32 0
40  %ray_dir1 = insertelement <3 x float> %ray_dir0, float %ray_dir_y, i32 1
41  %ray_dir = insertelement <3 x float> %ray_dir1, float %ray_dir_z, i32 2
42  %ray_inv_dir0 = insertelement <3 x float> undef, float %ray_inv_dir_x, i32 0
43  %ray_inv_dir1 = insertelement <3 x float> %ray_inv_dir0, float %ray_inv_dir_y, i32 1
44  %ray_inv_dir = insertelement <3 x float> %ray_inv_dir1, float %ray_inv_dir_z, i32 2
45  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)
46 %r = bitcast <4 x i32> %v to <4 x float>
47 ret <4 x float> %r
48}
49
50define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> inreg %tdescr) {
51; GFX10-LABEL: image_bvh_intersect_ray_a16:
52; GFX10:       ; %bb.0:
53; GFX10-NEXT:    v_lshrrev_b32_e32 v9, 16, v5
54; GFX10-NEXT:    v_and_b32_e32 v10, 0xffff, v7
55; GFX10-NEXT:    v_and_b32_e32 v8, 0xffff, v8
56; GFX10-NEXT:    v_lshlrev_b32_e32 v9, 16, v9
57; GFX10-NEXT:    v_lshlrev_b32_e32 v10, 16, v10
58; GFX10-NEXT:    v_alignbit_b32 v7, v8, v7, 16
59; GFX10-NEXT:    v_and_or_b32 v5, v5, 0xffff, v9
60; GFX10-NEXT:    v_and_or_b32 v6, v6, 0xffff, v10
61; GFX10-NEXT:    image_bvh_intersect_ray v[0:3], v[0:7], s[0:3] a16
62; GFX10-NEXT:    s_waitcnt vmcnt(0)
63; GFX10-NEXT:    ; return to shader part epilog
64;
65; GFX11-LABEL: image_bvh_intersect_ray_a16:
66; GFX11:       ; %bb.0:
67; GFX11-NEXT:    v_lshrrev_b32_e32 v9, 16, v5
68; GFX11-NEXT:    v_lshrrev_b32_e32 v10, 16, v7
69; GFX11-NEXT:    v_lshlrev_b32_e32 v5, 16, v5
70; GFX11-NEXT:    v_lshlrev_b32_e32 v11, 16, v6
71; GFX11-NEXT:    v_lshlrev_b32_e32 v9, 16, v9
72; GFX11-NEXT:    v_and_or_b32 v5, 0xffff, v7, v5
73; GFX11-NEXT:    v_and_or_b32 v7, 0xffff, v8, v11
74; GFX11-NEXT:    v_and_or_b32 v6, 0xffff, v10, v9
75; GFX11-NEXT:    image_bvh_intersect_ray v[0:3], v[0:7], s[0:3] a16
76; GFX11-NEXT:    s_waitcnt vmcnt(0)
77; GFX11-NEXT:    ; return to shader part epilog
78  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)
79  %r = bitcast <4 x i32> %v to <4 x float>
80  ret <4 x float> %r
81}
82
83define amdgpu_ps <4 x float> @image_bvh64_intersect_ray(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> inreg %tdescr) {
84; GCN-LABEL: image_bvh64_intersect_ray:
85; GCN:       ; %bb.0:
86; GCN-NEXT:    image_bvh64_intersect_ray v[0:3], v[0:15], s[0:3]
87; GCN-NEXT:    s_waitcnt vmcnt(0)
88; GCN-NEXT:    ; return to shader part epilog
89  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)
90  %r = bitcast <4 x i32> %v to <4 x float>
91  ret <4 x float> %r
92}
93
94define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_flat(<2 x i32> %node_ptr_vec, float %ray_extent, float %ray_origin_x, float %ray_origin_y, float %ray_origin_z, float %ray_dir_x, float %ray_dir_y, float %ray_dir_z, float %ray_inv_dir_x, float %ray_inv_dir_y, float %ray_inv_dir_z, <4 x i32> inreg %tdescr) {
95; GCN-LABEL: image_bvh64_intersect_ray_flat:
96; GCN:       ; %bb.0:
97; GCN-NEXT:    image_bvh64_intersect_ray v[0:3], v[0:15], s[0:3]
98; GCN-NEXT:    s_waitcnt vmcnt(0)
99; GCN-NEXT:    ; return to shader part epilog
100  %node_ptr = bitcast <2 x i32> %node_ptr_vec to i64
101  %ray_origin0 = insertelement <3 x float> undef, float %ray_origin_x, i32 0
102  %ray_origin1 = insertelement <3 x float> %ray_origin0, float %ray_origin_y, i32 1
103  %ray_origin = insertelement <3 x float> %ray_origin1, float %ray_origin_z, i32 2
104  %ray_dir0 = insertelement <3 x float> undef, float %ray_dir_x, i32 0
105  %ray_dir1 = insertelement <3 x float> %ray_dir0, float %ray_dir_y, i32 1
106  %ray_dir = insertelement <3 x float> %ray_dir1, float %ray_dir_z, i32 2
107  %ray_inv_dir0 = insertelement <3 x float> undef, float %ray_inv_dir_x, i32 0
108  %ray_inv_dir1 = insertelement <3 x float> %ray_inv_dir0, float %ray_inv_dir_y, i32 1
109  %ray_inv_dir = insertelement <3 x float> %ray_inv_dir1, float %ray_inv_dir_z, i32 2
110  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)
111 %r = bitcast <4 x i32> %v to <4 x float>
112 ret <4 x float> %r
113}
114
115define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> inreg %tdescr) {
116; GFX10-LABEL: image_bvh64_intersect_ray_a16:
117; GFX10:       ; %bb.0:
118; GFX10-NEXT:    v_lshrrev_b32_e32 v10, 16, v6
119; GFX10-NEXT:    v_and_b32_e32 v11, 0xffff, v8
120; GFX10-NEXT:    v_and_b32_e32 v9, 0xffff, v9
121; GFX10-NEXT:    v_lshlrev_b32_e32 v10, 16, v10
122; GFX10-NEXT:    v_lshlrev_b32_e32 v11, 16, v11
123; GFX10-NEXT:    v_alignbit_b32 v8, v9, v8, 16
124; GFX10-NEXT:    v_and_or_b32 v6, v6, 0xffff, v10
125; GFX10-NEXT:    v_and_or_b32 v7, v7, 0xffff, v11
126; GFX10-NEXT:    image_bvh64_intersect_ray v[0:3], v[0:15], s[0:3] a16
127; GFX10-NEXT:    s_waitcnt vmcnt(0)
128; GFX10-NEXT:    ; return to shader part epilog
129;
130; GFX11-LABEL: image_bvh64_intersect_ray_a16:
131; GFX11:       ; %bb.0:
132; GFX11-NEXT:    v_lshrrev_b32_e32 v10, 16, v6
133; GFX11-NEXT:    v_lshrrev_b32_e32 v11, 16, v8
134; GFX11-NEXT:    v_lshlrev_b32_e32 v6, 16, v6
135; GFX11-NEXT:    v_lshlrev_b32_e32 v12, 16, v7
136; GFX11-NEXT:    v_lshlrev_b32_e32 v10, 16, v10
137; GFX11-NEXT:    v_and_or_b32 v6, 0xffff, v8, v6
138; GFX11-NEXT:    v_and_or_b32 v8, 0xffff, v9, v12
139; GFX11-NEXT:    v_and_or_b32 v7, 0xffff, v11, v10
140; GFX11-NEXT:    image_bvh64_intersect_ray v[0:3], v[0:15], s[0:3] a16
141; GFX11-NEXT:    s_waitcnt vmcnt(0)
142; GFX11-NEXT:    ; return to shader part epilog
143  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)
144  %r = bitcast <4 x i32> %v to <4 x float>
145  ret <4 x float> %r
146}
147
148define amdgpu_ps <4 x float> @image_bvh_intersect_ray_vgpr_descr(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr) {
149; GFX1030-LABEL: image_bvh_intersect_ray_vgpr_descr:
150; GFX1030:       ; %bb.0:
151; GFX1030-NEXT:    v_mov_b32_e32 v15, v0
152; GFX1030-NEXT:    v_mov_b32_e32 v16, v1
153; GFX1030-NEXT:    v_mov_b32_e32 v17, v2
154; GFX1030-NEXT:    v_mov_b32_e32 v18, v3
155; GFX1030-NEXT:    v_mov_b32_e32 v19, v4
156; GFX1030-NEXT:    v_mov_b32_e32 v20, v5
157; GFX1030-NEXT:    v_mov_b32_e32 v21, v6
158; GFX1030-NEXT:    v_mov_b32_e32 v22, v7
159; GFX1030-NEXT:    v_mov_b32_e32 v23, v8
160; GFX1030-NEXT:    v_mov_b32_e32 v24, v9
161; GFX1030-NEXT:    v_mov_b32_e32 v25, v10
162; GFX1030-NEXT:    s_mov_b32 s1, exec_lo
163; GFX1030-NEXT:  .LBB6_1: ; =>This Inner Loop Header: Depth=1
164; GFX1030-NEXT:    v_readfirstlane_b32 s4, v11
165; GFX1030-NEXT:    v_readfirstlane_b32 s5, v12
166; GFX1030-NEXT:    v_readfirstlane_b32 s6, v13
167; GFX1030-NEXT:    v_readfirstlane_b32 s7, v14
168; GFX1030-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[11:12]
169; GFX1030-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[13:14]
170; GFX1030-NEXT:    s_and_b32 s0, vcc_lo, s0
171; GFX1030-NEXT:    s_and_saveexec_b32 s0, s0
172; GFX1030-NEXT:    image_bvh_intersect_ray v[0:3], v[15:30], s[4:7]
173; GFX1030-NEXT:    ; implicit-def: $vgpr11
174; GFX1030-NEXT:    ; implicit-def: $vgpr15
175; GFX1030-NEXT:    ; implicit-def: $vgpr16
176; GFX1030-NEXT:    ; implicit-def: $vgpr17
177; GFX1030-NEXT:    ; implicit-def: $vgpr18
178; GFX1030-NEXT:    ; implicit-def: $vgpr19
179; GFX1030-NEXT:    ; implicit-def: $vgpr20
180; GFX1030-NEXT:    ; implicit-def: $vgpr21
181; GFX1030-NEXT:    ; implicit-def: $vgpr22
182; GFX1030-NEXT:    ; implicit-def: $vgpr23
183; GFX1030-NEXT:    ; implicit-def: $vgpr24
184; GFX1030-NEXT:    ; implicit-def: $vgpr25
185; GFX1030-NEXT:    ; implicit-def: $vgpr11_vgpr12_vgpr13_vgpr14
186; GFX1030-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
187; GFX1030-NEXT:    s_cbranch_execnz .LBB6_1
188; GFX1030-NEXT:  ; %bb.2:
189; GFX1030-NEXT:    s_mov_b32 exec_lo, s1
190; GFX1030-NEXT:    s_waitcnt vmcnt(0)
191; GFX1030-NEXT:    ; return to shader part epilog
192;
193; GFX1013-LABEL: image_bvh_intersect_ray_vgpr_descr:
194; GFX1013:       ; %bb.0:
195; GFX1013-NEXT:    v_mov_b32_e32 v16, v11
196; GFX1013-NEXT:    v_mov_b32_e32 v17, v12
197; GFX1013-NEXT:    v_mov_b32_e32 v18, v13
198; GFX1013-NEXT:    v_mov_b32_e32 v19, v14
199; GFX1013-NEXT:    s_mov_b32 s1, exec_lo
200; GFX1013-NEXT:  .LBB6_1: ; =>This Inner Loop Header: Depth=1
201; GFX1013-NEXT:    v_readfirstlane_b32 s4, v16
202; GFX1013-NEXT:    v_readfirstlane_b32 s5, v17
203; GFX1013-NEXT:    v_readfirstlane_b32 s6, v18
204; GFX1013-NEXT:    v_readfirstlane_b32 s7, v19
205; GFX1013-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[16:17]
206; GFX1013-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[18:19]
207; GFX1013-NEXT:    s_and_b32 s0, vcc_lo, s0
208; GFX1013-NEXT:    s_and_saveexec_b32 s0, s0
209; GFX1013-NEXT:    image_bvh_intersect_ray v[20:23], v[0:15], s[4:7]
210; GFX1013-NEXT:    ; implicit-def: $vgpr16
211; GFX1013-NEXT:    ; implicit-def: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15
212; GFX1013-NEXT:    ; implicit-def: $vgpr16_vgpr17_vgpr18_vgpr19
213; GFX1013-NEXT:    s_waitcnt_depctr 0xffe3
214; GFX1013-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
215; GFX1013-NEXT:    s_cbranch_execnz .LBB6_1
216; GFX1013-NEXT:  ; %bb.2:
217; GFX1013-NEXT:    s_mov_b32 exec_lo, s1
218; GFX1013-NEXT:    s_waitcnt vmcnt(0)
219; GFX1013-NEXT:    v_mov_b32_e32 v0, v20
220; GFX1013-NEXT:    v_mov_b32_e32 v1, v21
221; GFX1013-NEXT:    v_mov_b32_e32 v2, v22
222; GFX1013-NEXT:    v_mov_b32_e32 v3, v23
223; GFX1013-NEXT:    ; return to shader part epilog
224;
225; GFX11-LABEL: image_bvh_intersect_ray_vgpr_descr:
226; GFX11:       ; %bb.0:
227; GFX11-NEXT:    v_mov_b32_e32 v18, v0
228; GFX11-NEXT:    v_mov_b32_e32 v19, v1
229; GFX11-NEXT:    v_mov_b32_e32 v15, v2
230; GFX11-NEXT:    v_mov_b32_e32 v16, v3
231; GFX11-NEXT:    v_mov_b32_e32 v17, v4
232; GFX11-NEXT:    s_mov_b32 s1, exec_lo
233; GFX11-NEXT:  .LBB6_1: ; =>This Inner Loop Header: Depth=1
234; GFX11-NEXT:    v_readfirstlane_b32 s4, v11
235; GFX11-NEXT:    v_readfirstlane_b32 s5, v12
236; GFX11-NEXT:    v_readfirstlane_b32 s6, v13
237; GFX11-NEXT:    v_readfirstlane_b32 s7, v14
238; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[11:12]
239; GFX11-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[13:14]
240; GFX11-NEXT:    s_and_b32 s0, vcc_lo, s0
241; GFX11-NEXT:    s_and_saveexec_b32 s0, s0
242; GFX11-NEXT:    image_bvh_intersect_ray v[0:3], [v18, v19, v[15:17], v[5:7], v[8:10]], s[4:7]
243; GFX11-NEXT:    ; implicit-def: $vgpr11
244; GFX11-NEXT:    ; implicit-def: $vgpr18
245; GFX11-NEXT:    ; implicit-def: $vgpr19
246; GFX11-NEXT:    ; implicit-def: $vgpr15_vgpr16_vgpr17
247; GFX11-NEXT:    ; implicit-def: $vgpr5_vgpr6_vgpr7
248; GFX11-NEXT:    ; implicit-def: $vgpr8_vgpr9_vgpr10
249; GFX11-NEXT:    ; implicit-def: $vgpr11_vgpr12_vgpr13_vgpr14
250; GFX11-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
251; GFX11-NEXT:    s_cbranch_execnz .LBB6_1
252; GFX11-NEXT:  ; %bb.2:
253; GFX11-NEXT:    s_mov_b32 exec_lo, s1
254; GFX11-NEXT:    s_waitcnt vmcnt(0)
255; GFX11-NEXT:    ; return to shader part epilog
256  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)
257  %r = bitcast <4 x i32> %v to <4 x float>
258  ret <4 x float> %r
259}
260
261define amdgpu_ps <4 x float> @image_bvh_intersect_ray_a16_vgpr_descr(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr) {
262; GFX1030-LABEL: image_bvh_intersect_ray_a16_vgpr_descr:
263; GFX1030:       ; %bb.0:
264; GFX1030-NEXT:    v_mov_b32_e32 v13, v0
265; GFX1030-NEXT:    v_mov_b32_e32 v14, v1
266; GFX1030-NEXT:    v_lshrrev_b32_e32 v0, 16, v5
267; GFX1030-NEXT:    v_and_b32_e32 v1, 0xffff, v7
268; GFX1030-NEXT:    v_mov_b32_e32 v15, v2
269; GFX1030-NEXT:    v_and_b32_e32 v2, 0xffff, v8
270; GFX1030-NEXT:    v_mov_b32_e32 v16, v3
271; GFX1030-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
272; GFX1030-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
273; GFX1030-NEXT:    v_mov_b32_e32 v17, v4
274; GFX1030-NEXT:    v_alignbit_b32 v20, v2, v7, 16
275; GFX1030-NEXT:    s_mov_b32 s1, exec_lo
276; GFX1030-NEXT:    v_and_or_b32 v18, v5, 0xffff, v0
277; GFX1030-NEXT:    v_and_or_b32 v19, v6, 0xffff, v1
278; GFX1030-NEXT:  .LBB7_1: ; =>This Inner Loop Header: Depth=1
279; GFX1030-NEXT:    v_readfirstlane_b32 s4, v9
280; GFX1030-NEXT:    v_readfirstlane_b32 s5, v10
281; GFX1030-NEXT:    v_readfirstlane_b32 s6, v11
282; GFX1030-NEXT:    v_readfirstlane_b32 s7, v12
283; GFX1030-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[9:10]
284; GFX1030-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[11:12]
285; GFX1030-NEXT:    s_and_b32 s0, vcc_lo, s0
286; GFX1030-NEXT:    s_and_saveexec_b32 s0, s0
287; GFX1030-NEXT:    image_bvh_intersect_ray v[0:3], v[13:20], s[4:7] a16
288; GFX1030-NEXT:    ; implicit-def: $vgpr9
289; GFX1030-NEXT:    ; implicit-def: $vgpr13
290; GFX1030-NEXT:    ; implicit-def: $vgpr14
291; GFX1030-NEXT:    ; implicit-def: $vgpr15
292; GFX1030-NEXT:    ; implicit-def: $vgpr16
293; GFX1030-NEXT:    ; implicit-def: $vgpr17
294; GFX1030-NEXT:    ; implicit-def: $vgpr18
295; GFX1030-NEXT:    ; implicit-def: $vgpr19
296; GFX1030-NEXT:    ; implicit-def: $vgpr20
297; GFX1030-NEXT:    ; implicit-def: $vgpr9_vgpr10_vgpr11_vgpr12
298; GFX1030-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
299; GFX1030-NEXT:    s_cbranch_execnz .LBB7_1
300; GFX1030-NEXT:  ; %bb.2:
301; GFX1030-NEXT:    s_mov_b32 exec_lo, s1
302; GFX1030-NEXT:    s_waitcnt vmcnt(0)
303; GFX1030-NEXT:    ; return to shader part epilog
304;
305; GFX1013-LABEL: image_bvh_intersect_ray_a16_vgpr_descr:
306; GFX1013:       ; %bb.0:
307; GFX1013-NEXT:    v_lshrrev_b32_e32 v13, 16, v5
308; GFX1013-NEXT:    v_and_b32_e32 v14, 0xffff, v7
309; GFX1013-NEXT:    v_and_b32_e32 v8, 0xffff, v8
310; GFX1013-NEXT:    s_mov_b32 s1, exec_lo
311; GFX1013-NEXT:    v_lshlrev_b32_e32 v13, 16, v13
312; GFX1013-NEXT:    v_lshlrev_b32_e32 v14, 16, v14
313; GFX1013-NEXT:    v_alignbit_b32 v7, v8, v7, 16
314; GFX1013-NEXT:    v_and_or_b32 v5, v5, 0xffff, v13
315; GFX1013-NEXT:    v_and_or_b32 v6, v6, 0xffff, v14
316; GFX1013-NEXT:  .LBB7_1: ; =>This Inner Loop Header: Depth=1
317; GFX1013-NEXT:    v_readfirstlane_b32 s4, v9
318; GFX1013-NEXT:    v_readfirstlane_b32 s5, v10
319; GFX1013-NEXT:    v_readfirstlane_b32 s6, v11
320; GFX1013-NEXT:    v_readfirstlane_b32 s7, v12
321; GFX1013-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[9:10]
322; GFX1013-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[11:12]
323; GFX1013-NEXT:    s_and_b32 s0, vcc_lo, s0
324; GFX1013-NEXT:    s_and_saveexec_b32 s0, s0
325; GFX1013-NEXT:    image_bvh_intersect_ray v[13:16], v[0:7], s[4:7] a16
326; GFX1013-NEXT:    ; implicit-def: $vgpr9
327; GFX1013-NEXT:    ; implicit-def: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7
328; GFX1013-NEXT:    ; implicit-def: $vgpr9_vgpr10_vgpr11_vgpr12
329; GFX1013-NEXT:    s_waitcnt_depctr 0xffe3
330; GFX1013-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
331; GFX1013-NEXT:    s_cbranch_execnz .LBB7_1
332; GFX1013-NEXT:  ; %bb.2:
333; GFX1013-NEXT:    s_mov_b32 exec_lo, s1
334; GFX1013-NEXT:    s_waitcnt vmcnt(0)
335; GFX1013-NEXT:    v_mov_b32_e32 v0, v13
336; GFX1013-NEXT:    v_mov_b32_e32 v1, v14
337; GFX1013-NEXT:    v_mov_b32_e32 v2, v15
338; GFX1013-NEXT:    v_mov_b32_e32 v3, v16
339; GFX1013-NEXT:    ; return to shader part epilog
340;
341; GFX11-LABEL: image_bvh_intersect_ray_a16_vgpr_descr:
342; GFX11:       ; %bb.0:
343; GFX11-NEXT:    v_mov_b32_e32 v13, v0
344; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v5
345; GFX11-NEXT:    v_mov_b32_e32 v14, v1
346; GFX11-NEXT:    v_mov_b32_e32 v15, v2
347; GFX11-NEXT:    v_mov_b32_e32 v16, v3
348; GFX11-NEXT:    v_lshrrev_b32_e32 v1, 16, v7
349; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 16, v5
350; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
351; GFX11-NEXT:    v_lshlrev_b32_e32 v3, 16, v6
352; GFX11-NEXT:    v_mov_b32_e32 v17, v4
353; GFX11-NEXT:    s_mov_b32 s1, exec_lo
354; GFX11-NEXT:    v_and_or_b32 v4, 0xffff, v7, v2
355; GFX11-NEXT:    v_and_or_b32 v5, 0xffff, v1, v0
356; GFX11-NEXT:    v_and_or_b32 v6, 0xffff, v8, v3
357; GFX11-NEXT:  .LBB7_1: ; =>This Inner Loop Header: Depth=1
358; GFX11-NEXT:    v_readfirstlane_b32 s4, v9
359; GFX11-NEXT:    v_readfirstlane_b32 s5, v10
360; GFX11-NEXT:    v_readfirstlane_b32 s6, v11
361; GFX11-NEXT:    v_readfirstlane_b32 s7, v12
362; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[9:10]
363; GFX11-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[11:12]
364; GFX11-NEXT:    s_and_b32 s0, vcc_lo, s0
365; GFX11-NEXT:    s_and_saveexec_b32 s0, s0
366; GFX11-NEXT:    image_bvh_intersect_ray v[0:3], [v13, v14, v[15:17], v[4:6]], s[4:7] a16
367; GFX11-NEXT:    ; implicit-def: $vgpr9
368; GFX11-NEXT:    ; implicit-def: $vgpr13
369; GFX11-NEXT:    ; implicit-def: $vgpr14
370; GFX11-NEXT:    ; implicit-def: $vgpr15_vgpr16_vgpr17
371; GFX11-NEXT:    ; implicit-def: $vgpr4_vgpr5_vgpr6
372; GFX11-NEXT:    ; implicit-def: $vgpr9_vgpr10_vgpr11_vgpr12
373; GFX11-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
374; GFX11-NEXT:    s_cbranch_execnz .LBB7_1
375; GFX11-NEXT:  ; %bb.2:
376; GFX11-NEXT:    s_mov_b32 exec_lo, s1
377; GFX11-NEXT:    s_waitcnt vmcnt(0)
378; GFX11-NEXT:    ; return to shader part epilog
379  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)
380  %r = bitcast <4 x i32> %v to <4 x float>
381  ret <4 x float> %r
382}
383
384define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_vgpr_descr(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr) {
385; GFX1030-LABEL: image_bvh64_intersect_ray_vgpr_descr:
386; GFX1030:       ; %bb.0:
387; GFX1030-NEXT:    v_mov_b32_e32 v16, v0
388; GFX1030-NEXT:    v_mov_b32_e32 v17, v1
389; GFX1030-NEXT:    v_mov_b32_e32 v18, v2
390; GFX1030-NEXT:    v_mov_b32_e32 v19, v3
391; GFX1030-NEXT:    v_mov_b32_e32 v20, v4
392; GFX1030-NEXT:    v_mov_b32_e32 v21, v5
393; GFX1030-NEXT:    v_mov_b32_e32 v22, v6
394; GFX1030-NEXT:    v_mov_b32_e32 v23, v7
395; GFX1030-NEXT:    v_mov_b32_e32 v24, v8
396; GFX1030-NEXT:    v_mov_b32_e32 v25, v9
397; GFX1030-NEXT:    v_mov_b32_e32 v26, v10
398; GFX1030-NEXT:    v_mov_b32_e32 v27, v11
399; GFX1030-NEXT:    s_mov_b32 s1, exec_lo
400; GFX1030-NEXT:  .LBB8_1: ; =>This Inner Loop Header: Depth=1
401; GFX1030-NEXT:    v_readfirstlane_b32 s4, v12
402; GFX1030-NEXT:    v_readfirstlane_b32 s5, v13
403; GFX1030-NEXT:    v_readfirstlane_b32 s6, v14
404; GFX1030-NEXT:    v_readfirstlane_b32 s7, v15
405; GFX1030-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[12:13]
406; GFX1030-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[14:15]
407; GFX1030-NEXT:    s_and_b32 s0, vcc_lo, s0
408; GFX1030-NEXT:    s_and_saveexec_b32 s0, s0
409; GFX1030-NEXT:    image_bvh64_intersect_ray v[0:3], v[16:31], s[4:7]
410; GFX1030-NEXT:    ; implicit-def: $vgpr12
411; GFX1030-NEXT:    ; implicit-def: $vgpr16
412; GFX1030-NEXT:    ; implicit-def: $vgpr17
413; GFX1030-NEXT:    ; implicit-def: $vgpr18
414; GFX1030-NEXT:    ; implicit-def: $vgpr19
415; GFX1030-NEXT:    ; implicit-def: $vgpr20
416; GFX1030-NEXT:    ; implicit-def: $vgpr21
417; GFX1030-NEXT:    ; implicit-def: $vgpr22
418; GFX1030-NEXT:    ; implicit-def: $vgpr23
419; GFX1030-NEXT:    ; implicit-def: $vgpr24
420; GFX1030-NEXT:    ; implicit-def: $vgpr25
421; GFX1030-NEXT:    ; implicit-def: $vgpr26
422; GFX1030-NEXT:    ; implicit-def: $vgpr27
423; GFX1030-NEXT:    ; implicit-def: $vgpr12_vgpr13_vgpr14_vgpr15
424; GFX1030-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
425; GFX1030-NEXT:    s_cbranch_execnz .LBB8_1
426; GFX1030-NEXT:  ; %bb.2:
427; GFX1030-NEXT:    s_mov_b32 exec_lo, s1
428; GFX1030-NEXT:    s_waitcnt vmcnt(0)
429; GFX1030-NEXT:    ; return to shader part epilog
430;
431; GFX1013-LABEL: image_bvh64_intersect_ray_vgpr_descr:
432; GFX1013:       ; %bb.0:
433; GFX1013-NEXT:    v_mov_b32_e32 v16, v12
434; GFX1013-NEXT:    v_mov_b32_e32 v17, v13
435; GFX1013-NEXT:    v_mov_b32_e32 v18, v14
436; GFX1013-NEXT:    v_mov_b32_e32 v19, v15
437; GFX1013-NEXT:    s_mov_b32 s1, exec_lo
438; GFX1013-NEXT:  .LBB8_1: ; =>This Inner Loop Header: Depth=1
439; GFX1013-NEXT:    v_readfirstlane_b32 s4, v16
440; GFX1013-NEXT:    v_readfirstlane_b32 s5, v17
441; GFX1013-NEXT:    v_readfirstlane_b32 s6, v18
442; GFX1013-NEXT:    v_readfirstlane_b32 s7, v19
443; GFX1013-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[16:17]
444; GFX1013-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[18:19]
445; GFX1013-NEXT:    s_and_b32 s0, vcc_lo, s0
446; GFX1013-NEXT:    s_and_saveexec_b32 s0, s0
447; GFX1013-NEXT:    image_bvh64_intersect_ray v[20:23], v[0:15], s[4:7]
448; GFX1013-NEXT:    ; implicit-def: $vgpr16
449; GFX1013-NEXT:    ; implicit-def: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15
450; GFX1013-NEXT:    ; implicit-def: $vgpr16_vgpr17_vgpr18_vgpr19
451; GFX1013-NEXT:    s_waitcnt_depctr 0xffe3
452; GFX1013-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
453; GFX1013-NEXT:    s_cbranch_execnz .LBB8_1
454; GFX1013-NEXT:  ; %bb.2:
455; GFX1013-NEXT:    s_mov_b32 exec_lo, s1
456; GFX1013-NEXT:    s_waitcnt vmcnt(0)
457; GFX1013-NEXT:    v_mov_b32_e32 v0, v20
458; GFX1013-NEXT:    v_mov_b32_e32 v1, v21
459; GFX1013-NEXT:    v_mov_b32_e32 v2, v22
460; GFX1013-NEXT:    v_mov_b32_e32 v3, v23
461; GFX1013-NEXT:    ; return to shader part epilog
462;
463; GFX11-LABEL: image_bvh64_intersect_ray_vgpr_descr:
464; GFX11:       ; %bb.0:
465; GFX11-NEXT:    v_mov_b32_e32 v19, v0
466; GFX11-NEXT:    v_mov_b32_e32 v20, v1
467; GFX11-NEXT:    v_mov_b32_e32 v21, v2
468; GFX11-NEXT:    v_mov_b32_e32 v16, v3
469; GFX11-NEXT:    v_mov_b32_e32 v17, v4
470; GFX11-NEXT:    v_mov_b32_e32 v18, v5
471; GFX11-NEXT:    s_mov_b32 s1, exec_lo
472; GFX11-NEXT:  .LBB8_1: ; =>This Inner Loop Header: Depth=1
473; GFX11-NEXT:    v_readfirstlane_b32 s4, v12
474; GFX11-NEXT:    v_readfirstlane_b32 s5, v13
475; GFX11-NEXT:    v_readfirstlane_b32 s6, v14
476; GFX11-NEXT:    v_readfirstlane_b32 s7, v15
477; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[12:13]
478; GFX11-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[14:15]
479; GFX11-NEXT:    s_and_b32 s0, vcc_lo, s0
480; GFX11-NEXT:    s_and_saveexec_b32 s0, s0
481; GFX11-NEXT:    image_bvh64_intersect_ray v[0:3], [v[19:20], v21, v[16:18], v[6:8], v[9:11]], s[4:7]
482; GFX11-NEXT:    ; implicit-def: $vgpr12
483; GFX11-NEXT:    ; implicit-def: $vgpr19_vgpr20
484; GFX11-NEXT:    ; implicit-def: $vgpr21
485; GFX11-NEXT:    ; implicit-def: $vgpr16_vgpr17_vgpr18
486; GFX11-NEXT:    ; implicit-def: $vgpr6_vgpr7_vgpr8
487; GFX11-NEXT:    ; implicit-def: $vgpr9_vgpr10_vgpr11
488; GFX11-NEXT:    ; implicit-def: $vgpr12_vgpr13_vgpr14_vgpr15
489; GFX11-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
490; GFX11-NEXT:    s_cbranch_execnz .LBB8_1
491; GFX11-NEXT:  ; %bb.2:
492; GFX11-NEXT:    s_mov_b32 exec_lo, s1
493; GFX11-NEXT:    s_waitcnt vmcnt(0)
494; GFX11-NEXT:    ; return to shader part epilog
495  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)
496  %r = bitcast <4 x i32> %v to <4 x float>
497  ret <4 x float> %r
498}
499
500define amdgpu_ps <4 x float> @image_bvh64_intersect_ray_a16_vgpr_descr(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr) {
501; GFX1030-LABEL: image_bvh64_intersect_ray_a16_vgpr_descr:
502; GFX1030:       ; %bb.0:
503; GFX1030-NEXT:    v_mov_b32_e32 v14, v0
504; GFX1030-NEXT:    v_mov_b32_e32 v15, v1
505; GFX1030-NEXT:    v_lshrrev_b32_e32 v0, 16, v6
506; GFX1030-NEXT:    v_and_b32_e32 v1, 0xffff, v8
507; GFX1030-NEXT:    v_mov_b32_e32 v16, v2
508; GFX1030-NEXT:    v_and_b32_e32 v2, 0xffff, v9
509; GFX1030-NEXT:    v_mov_b32_e32 v17, v3
510; GFX1030-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
511; GFX1030-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
512; GFX1030-NEXT:    v_mov_b32_e32 v18, v4
513; GFX1030-NEXT:    v_mov_b32_e32 v19, v5
514; GFX1030-NEXT:    v_alignbit_b32 v22, v2, v8, 16
515; GFX1030-NEXT:    v_and_or_b32 v20, v6, 0xffff, v0
516; GFX1030-NEXT:    v_and_or_b32 v21, v7, 0xffff, v1
517; GFX1030-NEXT:    s_mov_b32 s1, exec_lo
518; GFX1030-NEXT:  .LBB9_1: ; =>This Inner Loop Header: Depth=1
519; GFX1030-NEXT:    v_readfirstlane_b32 s4, v10
520; GFX1030-NEXT:    v_readfirstlane_b32 s5, v11
521; GFX1030-NEXT:    v_readfirstlane_b32 s6, v12
522; GFX1030-NEXT:    v_readfirstlane_b32 s7, v13
523; GFX1030-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[10:11]
524; GFX1030-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[12:13]
525; GFX1030-NEXT:    s_and_b32 s0, vcc_lo, s0
526; GFX1030-NEXT:    s_and_saveexec_b32 s0, s0
527; GFX1030-NEXT:    image_bvh64_intersect_ray v[0:3], v[14:29], s[4:7] a16
528; GFX1030-NEXT:    ; implicit-def: $vgpr10
529; GFX1030-NEXT:    ; implicit-def: $vgpr14
530; GFX1030-NEXT:    ; implicit-def: $vgpr15
531; GFX1030-NEXT:    ; implicit-def: $vgpr16
532; GFX1030-NEXT:    ; implicit-def: $vgpr17
533; GFX1030-NEXT:    ; implicit-def: $vgpr18
534; GFX1030-NEXT:    ; implicit-def: $vgpr19
535; GFX1030-NEXT:    ; implicit-def: $vgpr20
536; GFX1030-NEXT:    ; implicit-def: $vgpr21
537; GFX1030-NEXT:    ; implicit-def: $vgpr22
538; GFX1030-NEXT:    ; implicit-def: $vgpr10_vgpr11_vgpr12_vgpr13
539; GFX1030-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
540; GFX1030-NEXT:    s_cbranch_execnz .LBB9_1
541; GFX1030-NEXT:  ; %bb.2:
542; GFX1030-NEXT:    s_mov_b32 exec_lo, s1
543; GFX1030-NEXT:    s_waitcnt vmcnt(0)
544; GFX1030-NEXT:    ; return to shader part epilog
545;
546; GFX1013-LABEL: image_bvh64_intersect_ray_a16_vgpr_descr:
547; GFX1013:       ; %bb.0:
548; GFX1013-NEXT:    v_mov_b32_e32 v16, v10
549; GFX1013-NEXT:    v_mov_b32_e32 v17, v11
550; GFX1013-NEXT:    v_lshrrev_b32_e32 v10, 16, v6
551; GFX1013-NEXT:    v_and_b32_e32 v11, 0xffff, v8
552; GFX1013-NEXT:    v_and_b32_e32 v9, 0xffff, v9
553; GFX1013-NEXT:    v_mov_b32_e32 v18, v12
554; GFX1013-NEXT:    v_mov_b32_e32 v19, v13
555; GFX1013-NEXT:    v_lshlrev_b32_e32 v10, 16, v10
556; GFX1013-NEXT:    v_lshlrev_b32_e32 v11, 16, v11
557; GFX1013-NEXT:    v_alignbit_b32 v8, v9, v8, 16
558; GFX1013-NEXT:    s_mov_b32 s1, exec_lo
559; GFX1013-NEXT:    v_and_or_b32 v6, v6, 0xffff, v10
560; GFX1013-NEXT:    v_and_or_b32 v7, v7, 0xffff, v11
561; GFX1013-NEXT:  .LBB9_1: ; =>This Inner Loop Header: Depth=1
562; GFX1013-NEXT:    v_readfirstlane_b32 s4, v16
563; GFX1013-NEXT:    v_readfirstlane_b32 s5, v17
564; GFX1013-NEXT:    v_readfirstlane_b32 s6, v18
565; GFX1013-NEXT:    v_readfirstlane_b32 s7, v19
566; GFX1013-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[16:17]
567; GFX1013-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[18:19]
568; GFX1013-NEXT:    s_and_b32 s0, vcc_lo, s0
569; GFX1013-NEXT:    s_and_saveexec_b32 s0, s0
570; GFX1013-NEXT:    image_bvh64_intersect_ray v[20:23], v[0:15], s[4:7] a16
571; GFX1013-NEXT:    ; implicit-def: $vgpr16
572; GFX1013-NEXT:    ; implicit-def: $vgpr0_vgpr1_vgpr2_vgpr3_vgpr4_vgpr5_vgpr6_vgpr7_vgpr8_vgpr9_vgpr10_vgpr11_vgpr12_vgpr13_vgpr14_vgpr15
573; GFX1013-NEXT:    ; implicit-def: $vgpr16_vgpr17_vgpr18_vgpr19
574; GFX1013-NEXT:    s_waitcnt_depctr 0xffe3
575; GFX1013-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
576; GFX1013-NEXT:    s_cbranch_execnz .LBB9_1
577; GFX1013-NEXT:  ; %bb.2:
578; GFX1013-NEXT:    s_mov_b32 exec_lo, s1
579; GFX1013-NEXT:    s_waitcnt vmcnt(0)
580; GFX1013-NEXT:    v_mov_b32_e32 v0, v20
581; GFX1013-NEXT:    v_mov_b32_e32 v1, v21
582; GFX1013-NEXT:    v_mov_b32_e32 v2, v22
583; GFX1013-NEXT:    v_mov_b32_e32 v3, v23
584; GFX1013-NEXT:    ; return to shader part epilog
585;
586; GFX11-LABEL: image_bvh64_intersect_ray_a16_vgpr_descr:
587; GFX11:       ; %bb.0:
588; GFX11-NEXT:    v_mov_b32_e32 v14, v0
589; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v6
590; GFX11-NEXT:    v_mov_b32_e32 v15, v1
591; GFX11-NEXT:    v_mov_b32_e32 v16, v2
592; GFX11-NEXT:    v_mov_b32_e32 v17, v3
593; GFX11-NEXT:    v_lshrrev_b32_e32 v1, 16, v8
594; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 16, v6
595; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 16, v0
596; GFX11-NEXT:    v_lshlrev_b32_e32 v3, 16, v7
597; GFX11-NEXT:    v_mov_b32_e32 v18, v4
598; GFX11-NEXT:    v_mov_b32_e32 v19, v5
599; GFX11-NEXT:    v_and_or_b32 v4, 0xffff, v8, v2
600; GFX11-NEXT:    v_and_or_b32 v5, 0xffff, v1, v0
601; GFX11-NEXT:    v_and_or_b32 v6, 0xffff, v9, v3
602; GFX11-NEXT:    s_mov_b32 s1, exec_lo
603; GFX11-NEXT:  .LBB9_1: ; =>This Inner Loop Header: Depth=1
604; GFX11-NEXT:    v_readfirstlane_b32 s4, v10
605; GFX11-NEXT:    v_readfirstlane_b32 s5, v11
606; GFX11-NEXT:    v_readfirstlane_b32 s6, v12
607; GFX11-NEXT:    v_readfirstlane_b32 s7, v13
608; GFX11-NEXT:    v_cmp_eq_u64_e32 vcc_lo, s[4:5], v[10:11]
609; GFX11-NEXT:    v_cmp_eq_u64_e64 s0, s[6:7], v[12:13]
610; GFX11-NEXT:    s_and_b32 s0, vcc_lo, s0
611; GFX11-NEXT:    s_and_saveexec_b32 s0, s0
612; GFX11-NEXT:    image_bvh64_intersect_ray v[0:3], [v[14:15], v16, v[17:19], v[4:6]], s[4:7] a16
613; GFX11-NEXT:    ; implicit-def: $vgpr10
614; GFX11-NEXT:    ; implicit-def: $vgpr14_vgpr15
615; GFX11-NEXT:    ; implicit-def: $vgpr16
616; GFX11-NEXT:    ; implicit-def: $vgpr17_vgpr18_vgpr19
617; GFX11-NEXT:    ; implicit-def: $vgpr4_vgpr5_vgpr6
618; GFX11-NEXT:    ; implicit-def: $vgpr10_vgpr11_vgpr12_vgpr13
619; GFX11-NEXT:    s_xor_b32 exec_lo, exec_lo, s0
620; GFX11-NEXT:    s_cbranch_execnz .LBB9_1
621; GFX11-NEXT:  ; %bb.2:
622; GFX11-NEXT:    s_mov_b32 exec_lo, s1
623; GFX11-NEXT:    s_waitcnt vmcnt(0)
624; GFX11-NEXT:    ; return to shader part epilog
625  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(i64 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)
626  %r = bitcast <4 x i32> %v to <4 x float>
627  ret <4 x float> %r
628}
629
630define amdgpu_kernel void @image_bvh_intersect_ray_nsa_reassign(i32* %p_node_ptr, float* %p_ray, <4 x i32> inreg %tdescr) {
631; GFX1030-LABEL: image_bvh_intersect_ray_nsa_reassign:
632; GFX1030:       ; %bb.0:
633; GFX1030-NEXT:    s_clause 0x1
634; GFX1030-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
635; GFX1030-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x34
636; GFX1030-NEXT:    v_lshlrev_b32_e32 v4, 2, v0
637; GFX1030-NEXT:    v_mov_b32_e32 v5, 0x40400000
638; GFX1030-NEXT:    v_mov_b32_e32 v6, 4.0
639; GFX1030-NEXT:    v_mov_b32_e32 v7, 0x40a00000
640; GFX1030-NEXT:    v_mov_b32_e32 v8, 0x40c00000
641; GFX1030-NEXT:    v_mov_b32_e32 v9, 0x40e00000
642; GFX1030-NEXT:    v_mov_b32_e32 v10, 0x41000000
643; GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
644; GFX1030-NEXT:    v_mov_b32_e32 v0, s4
645; GFX1030-NEXT:    v_mov_b32_e32 v1, s5
646; GFX1030-NEXT:    v_mov_b32_e32 v2, s6
647; GFX1030-NEXT:    v_mov_b32_e32 v3, s7
648; GFX1030-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v4
649; GFX1030-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
650; GFX1030-NEXT:    v_add_co_u32 v2, vcc_lo, v2, v4
651; GFX1030-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
652; GFX1030-NEXT:    v_mov_b32_e32 v4, 2.0
653; GFX1030-NEXT:    flat_load_dword v0, v[0:1]
654; GFX1030-NEXT:    flat_load_dword v1, v[2:3]
655; GFX1030-NEXT:    v_mov_b32_e32 v2, 0
656; GFX1030-NEXT:    v_mov_b32_e32 v3, 1.0
657; GFX1030-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
658; GFX1030-NEXT:    image_bvh_intersect_ray v[0:3], v[0:15], s[0:3]
659; GFX1030-NEXT:    s_waitcnt vmcnt(0)
660; GFX1030-NEXT:    flat_store_dwordx4 v[0:1], v[0:3]
661; GFX1030-NEXT:    s_endpgm
662;
663; GFX1013-LABEL: image_bvh_intersect_ray_nsa_reassign:
664; GFX1013:       ; %bb.0:
665; GFX1013-NEXT:    s_clause 0x1
666; GFX1013-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
667; GFX1013-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x34
668; GFX1013-NEXT:    v_lshlrev_b32_e32 v6, 2, v0
669; GFX1013-NEXT:    v_mov_b32_e32 v7, 0x40a00000
670; GFX1013-NEXT:    v_mov_b32_e32 v8, 0x40c00000
671; GFX1013-NEXT:    v_mov_b32_e32 v9, 0x40e00000
672; GFX1013-NEXT:    v_mov_b32_e32 v10, 0x41000000
673; GFX1013-NEXT:    s_waitcnt lgkmcnt(0)
674; GFX1013-NEXT:    v_mov_b32_e32 v0, s4
675; GFX1013-NEXT:    v_mov_b32_e32 v1, s5
676; GFX1013-NEXT:    v_mov_b32_e32 v2, s6
677; GFX1013-NEXT:    v_mov_b32_e32 v3, s7
678; GFX1013-NEXT:    v_add_co_u32 v4, vcc_lo, v0, v6
679; GFX1013-NEXT:    v_add_co_ci_u32_e32 v5, vcc_lo, 0, v1, vcc_lo
680; GFX1013-NEXT:    v_add_co_u32 v2, vcc_lo, v2, v6
681; GFX1013-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
682; GFX1013-NEXT:    v_mov_b32_e32 v6, 4.0
683; GFX1013-NEXT:    flat_load_dword v0, v[4:5]
684; GFX1013-NEXT:    flat_load_dword v1, v[2:3]
685; GFX1013-NEXT:    v_mov_b32_e32 v2, 0
686; GFX1013-NEXT:    v_mov_b32_e32 v3, 1.0
687; GFX1013-NEXT:    v_mov_b32_e32 v4, 2.0
688; GFX1013-NEXT:    v_mov_b32_e32 v5, 0x40400000
689; GFX1013-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
690; GFX1013-NEXT:    image_bvh_intersect_ray v[0:3], v[0:15], s[8:11]
691; GFX1013-NEXT:    s_waitcnt vmcnt(0)
692; GFX1013-NEXT:    flat_store_dwordx4 v[0:1], v[0:3]
693; GFX1013-NEXT:    s_endpgm
694;
695; GFX11-LABEL: image_bvh_intersect_ray_nsa_reassign:
696; GFX11:       ; %bb.0:
697; GFX11-NEXT:    s_clause 0x1
698; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
699; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x34
700; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 2, v0
701; GFX11-NEXT:    s_mov_b32 s9, 0x40400000
702; GFX11-NEXT:    s_mov_b32 s12, 0x40c00000
703; GFX11-NEXT:    s_mov_b32 s8, 2.0
704; GFX11-NEXT:    s_mov_b32 s11, 0x40a00000
705; GFX11-NEXT:    s_mov_b32 s10, 4.0
706; GFX11-NEXT:    s_mov_b32 s14, 0x41000000
707; GFX11-NEXT:    s_mov_b32 s13, 0x40e00000
708; GFX11-NEXT:    v_mov_b32_e32 v6, s12
709; GFX11-NEXT:    v_mov_b32_e32 v7, s13
710; GFX11-NEXT:    v_mov_b32_e32 v8, s14
711; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
712; GFX11-NEXT:    v_mov_b32_e32 v0, s4
713; GFX11-NEXT:    v_mov_b32_e32 v1, s5
714; GFX11-NEXT:    v_mov_b32_e32 v2, s6
715; GFX11-NEXT:    v_mov_b32_e32 v3, s7
716; GFX11-NEXT:    s_mov_b32 s6, 0
717; GFX11-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v4
718; GFX11-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
719; GFX11-NEXT:    v_add_co_u32 v2, vcc_lo, v2, v4
720; GFX11-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
721; GFX11-NEXT:    s_mov_b32 s7, 1.0
722; GFX11-NEXT:    flat_load_b32 v9, v[0:1]
723; GFX11-NEXT:    flat_load_b32 v10, v[2:3]
724; GFX11-NEXT:    v_mov_b32_e32 v0, s6
725; GFX11-NEXT:    v_mov_b32_e32 v3, s9
726; GFX11-NEXT:    v_mov_b32_e32 v1, s7
727; GFX11-NEXT:    v_mov_b32_e32 v2, s8
728; GFX11-NEXT:    v_mov_b32_e32 v4, s10
729; GFX11-NEXT:    v_mov_b32_e32 v5, s11
730; GFX11-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
731; GFX11-NEXT:    image_bvh_intersect_ray v[0:3], [v9, v10, v[0:2], v[3:5], v[6:8]], s[0:3]
732; GFX11-NEXT:    s_waitcnt vmcnt(0)
733; GFX11-NEXT:    flat_store_b128 v[0:1], v[0:3]
734; GFX11-NEXT:    s_endpgm
735  %lid = tail call i32 @llvm.amdgcn.workitem.id.x()
736  %gep_node_ptr = getelementptr inbounds i32, i32* %p_node_ptr, i32 %lid
737  %node_ptr = load i32, i32* %gep_node_ptr, align 4
738  %gep_ray = getelementptr inbounds float, float* %p_ray, i32 %lid
739  %ray_extent = load float, float* %gep_ray, align 4
740  %ray_origin0 = insertelement <3 x float> undef, float 0.0, i32 0
741  %ray_origin1 = insertelement <3 x float> %ray_origin0, float 1.0, i32 1
742  %ray_origin = insertelement <3 x float> %ray_origin1, float 2.0, i32 2
743  %ray_dir0 = insertelement <3 x float> undef, float 3.0, i32 0
744  %ray_dir1 = insertelement <3 x float> %ray_dir0, float 4.0, i32 1
745  %ray_dir = insertelement <3 x float> %ray_dir1, float 5.0, i32 2
746  %ray_inv_dir0 = insertelement <3 x float> undef, float 6.0, i32 0
747  %ray_inv_dir1 = insertelement <3 x float> %ray_inv_dir0, float 7.0, i32 1
748  %ray_inv_dir = insertelement <3 x float> %ray_inv_dir1, float 8.0, i32 2
749  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f32(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)
750  store <4 x i32> %v, <4 x i32>* undef
751  ret void
752}
753
754define amdgpu_kernel void @image_bvh_intersect_ray_a16_nsa_reassign(i32* %p_node_ptr, float* %p_ray, <4 x i32> inreg %tdescr) {
755; GFX1030-LABEL: image_bvh_intersect_ray_a16_nsa_reassign:
756; GFX1030:       ; %bb.0:
757; GFX1030-NEXT:    s_clause 0x1
758; GFX1030-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
759; GFX1030-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x34
760; GFX1030-NEXT:    v_lshlrev_b32_e32 v4, 2, v0
761; GFX1030-NEXT:    s_movk_i32 s9, 0x4600
762; GFX1030-NEXT:    s_movk_i32 s8, 0x4700
763; GFX1030-NEXT:    s_bfe_u32 s8, s8, 0x100000
764; GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
765; GFX1030-NEXT:    v_mov_b32_e32 v0, s4
766; GFX1030-NEXT:    v_mov_b32_e32 v1, s5
767; GFX1030-NEXT:    v_mov_b32_e32 v2, s6
768; GFX1030-NEXT:    v_mov_b32_e32 v3, s7
769; GFX1030-NEXT:    s_movk_i32 s5, 0x4400
770; GFX1030-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v4
771; GFX1030-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
772; GFX1030-NEXT:    v_add_co_u32 v2, vcc_lo, v2, v4
773; GFX1030-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
774; GFX1030-NEXT:    s_movk_i32 s6, 0x4200
775; GFX1030-NEXT:    flat_load_dword v0, v[0:1]
776; GFX1030-NEXT:    flat_load_dword v1, v[2:3]
777; GFX1030-NEXT:    s_bfe_u32 s5, s5, 0x100000
778; GFX1030-NEXT:    s_movk_i32 s7, 0x4800
779; GFX1030-NEXT:    s_bfe_u32 s6, s6, 0x100000
780; GFX1030-NEXT:    s_lshl_b32 s5, s5, 16
781; GFX1030-NEXT:    s_movk_i32 s4, 0x4500
782; GFX1030-NEXT:    s_or_b32 s5, s6, s5
783; GFX1030-NEXT:    s_bfe_u32 s6, s9, 0x100000
784; GFX1030-NEXT:    s_bfe_u32 s7, s7, 0x100000
785; GFX1030-NEXT:    s_bfe_u32 s4, s4, 0x100000
786; GFX1030-NEXT:    s_lshl_b32 s6, s6, 16
787; GFX1030-NEXT:    s_lshl_b32 s7, s7, 16
788; GFX1030-NEXT:    s_or_b32 s4, s4, s6
789; GFX1030-NEXT:    s_or_b32 s6, s8, s7
790; GFX1030-NEXT:    v_mov_b32_e32 v2, 0
791; GFX1030-NEXT:    v_mov_b32_e32 v3, 1.0
792; GFX1030-NEXT:    v_mov_b32_e32 v4, 2.0
793; GFX1030-NEXT:    v_mov_b32_e32 v5, s5
794; GFX1030-NEXT:    v_mov_b32_e32 v6, s4
795; GFX1030-NEXT:    v_mov_b32_e32 v7, s6
796; GFX1030-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
797; GFX1030-NEXT:    image_bvh_intersect_ray v[0:3], v[0:7], s[0:3] a16
798; GFX1030-NEXT:    s_waitcnt vmcnt(0)
799; GFX1030-NEXT:    flat_store_dwordx4 v[0:1], v[0:3]
800; GFX1030-NEXT:    s_endpgm
801;
802; GFX1013-LABEL: image_bvh_intersect_ray_a16_nsa_reassign:
803; GFX1013:       ; %bb.0:
804; GFX1013-NEXT:    s_clause 0x1
805; GFX1013-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x24
806; GFX1013-NEXT:    s_load_dwordx4 s[8:11], s[0:1], 0x34
807; GFX1013-NEXT:    v_lshlrev_b32_e32 v6, 2, v0
808; GFX1013-NEXT:    s_movk_i32 s1, 0x4400
809; GFX1013-NEXT:    s_movk_i32 s2, 0x4200
810; GFX1013-NEXT:    s_bfe_u32 s1, s1, 0x100000
811; GFX1013-NEXT:    s_movk_i32 s3, 0x4800
812; GFX1013-NEXT:    s_bfe_u32 s2, s2, 0x100000
813; GFX1013-NEXT:    s_lshl_b32 s1, s1, 16
814; GFX1013-NEXT:    s_movk_i32 s0, 0x4500
815; GFX1013-NEXT:    s_or_b32 s1, s2, s1
816; GFX1013-NEXT:    s_bfe_u32 s3, s3, 0x100000
817; GFX1013-NEXT:    s_bfe_u32 s0, s0, 0x100000
818; GFX1013-NEXT:    s_lshl_b32 s3, s3, 16
819; GFX1013-NEXT:    s_waitcnt lgkmcnt(0)
820; GFX1013-NEXT:    v_mov_b32_e32 v0, s4
821; GFX1013-NEXT:    v_mov_b32_e32 v1, s5
822; GFX1013-NEXT:    v_mov_b32_e32 v2, s6
823; GFX1013-NEXT:    v_mov_b32_e32 v3, s7
824; GFX1013-NEXT:    s_movk_i32 s5, 0x4600
825; GFX1013-NEXT:    v_add_co_u32 v4, vcc_lo, v0, v6
826; GFX1013-NEXT:    v_add_co_ci_u32_e32 v5, vcc_lo, 0, v1, vcc_lo
827; GFX1013-NEXT:    v_add_co_u32 v2, vcc_lo, v2, v6
828; GFX1013-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
829; GFX1013-NEXT:    s_movk_i32 s4, 0x4700
830; GFX1013-NEXT:    flat_load_dword v0, v[4:5]
831; GFX1013-NEXT:    flat_load_dword v1, v[2:3]
832; GFX1013-NEXT:    s_bfe_u32 s2, s5, 0x100000
833; GFX1013-NEXT:    s_bfe_u32 s4, s4, 0x100000
834; GFX1013-NEXT:    s_lshl_b32 s2, s2, 16
835; GFX1013-NEXT:    v_mov_b32_e32 v2, 0
836; GFX1013-NEXT:    s_or_b32 s0, s0, s2
837; GFX1013-NEXT:    s_or_b32 s2, s4, s3
838; GFX1013-NEXT:    v_mov_b32_e32 v3, 1.0
839; GFX1013-NEXT:    v_mov_b32_e32 v4, 2.0
840; GFX1013-NEXT:    v_mov_b32_e32 v5, s1
841; GFX1013-NEXT:    v_mov_b32_e32 v6, s0
842; GFX1013-NEXT:    v_mov_b32_e32 v7, s2
843; GFX1013-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
844; GFX1013-NEXT:    image_bvh_intersect_ray v[0:3], v[0:7], s[8:11] a16
845; GFX1013-NEXT:    s_waitcnt vmcnt(0)
846; GFX1013-NEXT:    flat_store_dwordx4 v[0:1], v[0:3]
847; GFX1013-NEXT:    s_endpgm
848;
849; GFX11-LABEL: image_bvh_intersect_ray_a16_nsa_reassign:
850; GFX11:       ; %bb.0:
851; GFX11-NEXT:    s_clause 0x1
852; GFX11-NEXT:    s_load_b128 s[4:7], s[0:1], 0x24
853; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x34
854; GFX11-NEXT:    v_lshlrev_b32_e32 v4, 2, v0
855; GFX11-NEXT:    s_mov_b32 s9, 0x42004600
856; GFX11-NEXT:    s_mov_b32 s8, 2.0
857; GFX11-NEXT:    s_mov_b32 s10, 0x44004700
858; GFX11-NEXT:    s_mov_b32 s11, 0x45004800
859; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
860; GFX11-NEXT:    v_mov_b32_e32 v0, s4
861; GFX11-NEXT:    v_mov_b32_e32 v1, s5
862; GFX11-NEXT:    v_mov_b32_e32 v2, s6
863; GFX11-NEXT:    v_mov_b32_e32 v3, s7
864; GFX11-NEXT:    s_mov_b32 s6, 0
865; GFX11-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v4
866; GFX11-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
867; GFX11-NEXT:    v_add_co_u32 v2, vcc_lo, v2, v4
868; GFX11-NEXT:    v_add_co_ci_u32_e32 v3, vcc_lo, 0, v3, vcc_lo
869; GFX11-NEXT:    s_mov_b32 s7, 1.0
870; GFX11-NEXT:    flat_load_b32 v6, v[0:1]
871; GFX11-NEXT:    flat_load_b32 v7, v[2:3]
872; GFX11-NEXT:    v_mov_b32_e32 v0, s6
873; GFX11-NEXT:    v_mov_b32_e32 v3, s9
874; GFX11-NEXT:    v_mov_b32_e32 v1, s7
875; GFX11-NEXT:    v_mov_b32_e32 v2, s8
876; GFX11-NEXT:    v_mov_b32_e32 v4, s10
877; GFX11-NEXT:    v_mov_b32_e32 v5, s11
878; GFX11-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
879; GFX11-NEXT:    image_bvh_intersect_ray v[0:3], [v6, v7, v[0:2], v[3:5]], s[0:3] a16
880; GFX11-NEXT:    s_waitcnt vmcnt(0)
881; GFX11-NEXT:    flat_store_b128 v[0:1], v[0:3]
882; GFX11-NEXT:    s_endpgm
883  %lid = tail call i32 @llvm.amdgcn.workitem.id.x()
884  %gep_node_ptr = getelementptr inbounds i32, i32* %p_node_ptr, i32 %lid
885  %node_ptr = load i32, i32* %gep_node_ptr, align 4
886  %gep_ray = getelementptr inbounds float, float* %p_ray, i32 %lid
887  %ray_extent = load float, float* %gep_ray, align 4
888  %ray_origin0 = insertelement <3 x float> undef, float 0.0, i32 0
889  %ray_origin1 = insertelement <3 x float> %ray_origin0, float 1.0, i32 1
890  %ray_origin = insertelement <3 x float> %ray_origin1, float 2.0, i32 2
891  %ray_dir0 = insertelement <3 x half> undef, half 3.0, i32 0
892  %ray_dir1 = insertelement <3 x half> %ray_dir0, half 4.0, i32 1
893  %ray_dir = insertelement <3 x half> %ray_dir1, half 5.0, i32 2
894  %ray_inv_dir0 = insertelement <3 x half> undef, half 6.0, i32 0
895  %ray_inv_dir1 = insertelement <3 x half> %ray_inv_dir0, half 7.0, i32 1
896  %ray_inv_dir = insertelement <3 x half> %ray_inv_dir1, half 8.0, i32 2
897  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i32.v4f16(i32 %node_ptr, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)
898  store <4 x i32> %v, <4 x i32>* undef
899  ret void
900}
901
902define amdgpu_kernel void @image_bvh64_intersect_ray_nsa_reassign(float* %p_ray, <4 x i32> inreg %tdescr) {
903; GFX1030-LABEL: image_bvh64_intersect_ray_nsa_reassign:
904; GFX1030:       ; %bb.0:
905; GFX1030-NEXT:    s_clause 0x1
906; GFX1030-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
907; GFX1030-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x34
908; GFX1030-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
909; GFX1030-NEXT:    v_mov_b32_e32 v3, 0
910; GFX1030-NEXT:    v_mov_b32_e32 v4, 1.0
911; GFX1030-NEXT:    v_mov_b32_e32 v5, 2.0
912; GFX1030-NEXT:    v_mov_b32_e32 v6, 0x40400000
913; GFX1030-NEXT:    v_mov_b32_e32 v7, 4.0
914; GFX1030-NEXT:    v_mov_b32_e32 v8, 0x40a00000
915; GFX1030-NEXT:    v_mov_b32_e32 v9, 0x40c00000
916; GFX1030-NEXT:    v_mov_b32_e32 v10, 0x40e00000
917; GFX1030-NEXT:    v_mov_b32_e32 v11, 0x41000000
918; GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
919; GFX1030-NEXT:    v_mov_b32_e32 v0, s4
920; GFX1030-NEXT:    v_mov_b32_e32 v1, s5
921; GFX1030-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
922; GFX1030-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
923; GFX1030-NEXT:    flat_load_dword v2, v[0:1]
924; GFX1030-NEXT:    v_mov_b32_e32 v0, 0xb36211c7
925; GFX1030-NEXT:    v_mov_b32_e32 v1, 0x102
926; GFX1030-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
927; GFX1030-NEXT:    image_bvh64_intersect_ray v[0:3], v[0:15], s[0:3]
928; GFX1030-NEXT:    s_waitcnt vmcnt(0)
929; GFX1030-NEXT:    flat_store_dwordx4 v[0:1], v[0:3]
930; GFX1030-NEXT:    s_endpgm
931;
932; GFX1013-LABEL: image_bvh64_intersect_ray_nsa_reassign:
933; GFX1013:       ; %bb.0:
934; GFX1013-NEXT:    s_clause 0x1
935; GFX1013-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
936; GFX1013-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
937; GFX1013-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
938; GFX1013-NEXT:    v_mov_b32_e32 v3, 0
939; GFX1013-NEXT:    v_mov_b32_e32 v4, 1.0
940; GFX1013-NEXT:    v_mov_b32_e32 v5, 2.0
941; GFX1013-NEXT:    v_mov_b32_e32 v6, 0x40400000
942; GFX1013-NEXT:    v_mov_b32_e32 v7, 4.0
943; GFX1013-NEXT:    v_mov_b32_e32 v8, 0x40a00000
944; GFX1013-NEXT:    v_mov_b32_e32 v9, 0x40c00000
945; GFX1013-NEXT:    v_mov_b32_e32 v10, 0x40e00000
946; GFX1013-NEXT:    v_mov_b32_e32 v11, 0x41000000
947; GFX1013-NEXT:    s_waitcnt lgkmcnt(0)
948; GFX1013-NEXT:    v_mov_b32_e32 v0, s2
949; GFX1013-NEXT:    v_mov_b32_e32 v1, s3
950; GFX1013-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
951; GFX1013-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
952; GFX1013-NEXT:    flat_load_dword v2, v[0:1]
953; GFX1013-NEXT:    v_mov_b32_e32 v0, 0xb36211c7
954; GFX1013-NEXT:    v_mov_b32_e32 v1, 0x102
955; GFX1013-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
956; GFX1013-NEXT:    image_bvh64_intersect_ray v[0:3], v[0:15], s[4:7]
957; GFX1013-NEXT:    s_waitcnt vmcnt(0)
958; GFX1013-NEXT:    flat_store_dwordx4 v[0:1], v[0:3]
959; GFX1013-NEXT:    s_endpgm
960;
961; GFX11-LABEL: image_bvh64_intersect_ray_nsa_reassign:
962; GFX11:       ; %bb.0:
963; GFX11-NEXT:    s_clause 0x1
964; GFX11-NEXT:    s_load_b64 s[4:5], s[0:1], 0x24
965; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x34
966; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
967; GFX11-NEXT:    s_mov_b32 s6, 0
968; GFX11-NEXT:    s_mov_b32 s9, 0x40400000
969; GFX11-NEXT:    s_mov_b32 s12, 0x40c00000
970; GFX11-NEXT:    s_mov_b32 s8, 2.0
971; GFX11-NEXT:    s_mov_b32 s7, 1.0
972; GFX11-NEXT:    s_mov_b32 s11, 0x40a00000
973; GFX11-NEXT:    s_mov_b32 s10, 4.0
974; GFX11-NEXT:    s_mov_b32 s14, 0x41000000
975; GFX11-NEXT:    s_mov_b32 s13, 0x40e00000
976; GFX11-NEXT:    v_mov_b32_e32 v3, s9
977; GFX11-NEXT:    v_mov_b32_e32 v6, s12
978; GFX11-NEXT:    v_mov_b32_e32 v4, s10
979; GFX11-NEXT:    v_mov_b32_e32 v5, s11
980; GFX11-NEXT:    v_mov_b32_e32 v7, s13
981; GFX11-NEXT:    v_mov_b32_e32 v8, s14
982; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
983; GFX11-NEXT:    v_mov_b32_e32 v0, s4
984; GFX11-NEXT:    v_mov_b32_e32 v1, s5
985; GFX11-NEXT:    s_mov_b32 s4, 0xb36211c7
986; GFX11-NEXT:    s_movk_i32 s5, 0x102
987; GFX11-NEXT:    v_mov_b32_e32 v10, s5
988; GFX11-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
989; GFX11-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
990; GFX11-NEXT:    v_mov_b32_e32 v9, s4
991; GFX11-NEXT:    flat_load_b32 v11, v[0:1]
992; GFX11-NEXT:    v_mov_b32_e32 v0, s6
993; GFX11-NEXT:    v_mov_b32_e32 v1, s7
994; GFX11-NEXT:    v_mov_b32_e32 v2, s8
995; GFX11-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
996; GFX11-NEXT:    image_bvh64_intersect_ray v[0:3], [v[9:10], v11, v[0:2], v[3:5], v[6:8]], s[0:3]
997; GFX11-NEXT:    s_waitcnt vmcnt(0)
998; GFX11-NEXT:    flat_store_b128 v[0:1], v[0:3]
999; GFX11-NEXT:    s_endpgm
1000  %lid = tail call i32 @llvm.amdgcn.workitem.id.x()
1001  %gep_ray = getelementptr inbounds float, float* %p_ray, i32 %lid
1002  %ray_extent = load float, float* %gep_ray, align 4
1003  %ray_origin0 = insertelement <3 x float> undef, float 0.0, i32 0
1004  %ray_origin1 = insertelement <3 x float> %ray_origin0, float 1.0, i32 1
1005  %ray_origin = insertelement <3 x float> %ray_origin1, float 2.0, i32 2
1006  %ray_dir0 = insertelement <3 x float> undef, float 3.0, i32 0
1007  %ray_dir1 = insertelement <3 x float> %ray_dir0, float 4.0, i32 1
1008  %ray_dir = insertelement <3 x float> %ray_dir1, float 5.0, i32 2
1009  %ray_inv_dir0 = insertelement <3 x float> undef, float 6.0, i32 0
1010  %ray_inv_dir1 = insertelement <3 x float> %ray_inv_dir0, float 7.0, i32 1
1011  %ray_inv_dir = insertelement <3 x float> %ray_inv_dir1, float 8.0, i32 2
1012  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f32(i64 1111111111111, float %ray_extent, <3 x float> %ray_origin, <3 x float> %ray_dir, <3 x float> %ray_inv_dir, <4 x i32> %tdescr)
1013  store <4 x i32> %v, <4 x i32>* undef
1014  ret void
1015}
1016
1017define amdgpu_kernel void @image_bvh64_intersect_ray_a16_nsa_reassign(float* %p_ray, <4 x i32> inreg %tdescr) {
1018; GFX1030-LABEL: image_bvh64_intersect_ray_a16_nsa_reassign:
1019; GFX1030:       ; %bb.0:
1020; GFX1030-NEXT:    s_clause 0x1
1021; GFX1030-NEXT:    s_load_dwordx2 s[4:5], s[0:1], 0x24
1022; GFX1030-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x34
1023; GFX1030-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1024; GFX1030-NEXT:    s_movk_i32 s6, 0x4200
1025; GFX1030-NEXT:    s_movk_i32 s7, 0x4800
1026; GFX1030-NEXT:    s_bfe_u32 s6, s6, 0x100000
1027; GFX1030-NEXT:    s_movk_i32 s9, 0x4600
1028; GFX1030-NEXT:    s_movk_i32 s8, 0x4700
1029; GFX1030-NEXT:    s_bfe_u32 s7, s7, 0x100000
1030; GFX1030-NEXT:    s_bfe_u32 s8, s8, 0x100000
1031; GFX1030-NEXT:    s_lshl_b32 s7, s7, 16
1032; GFX1030-NEXT:    v_mov_b32_e32 v3, 0
1033; GFX1030-NEXT:    v_mov_b32_e32 v4, 1.0
1034; GFX1030-NEXT:    v_mov_b32_e32 v5, 2.0
1035; GFX1030-NEXT:    s_waitcnt lgkmcnt(0)
1036; GFX1030-NEXT:    v_mov_b32_e32 v0, s4
1037; GFX1030-NEXT:    v_mov_b32_e32 v1, s5
1038; GFX1030-NEXT:    s_movk_i32 s5, 0x4400
1039; GFX1030-NEXT:    s_movk_i32 s4, 0x4500
1040; GFX1030-NEXT:    s_bfe_u32 s5, s5, 0x100000
1041; GFX1030-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
1042; GFX1030-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
1043; GFX1030-NEXT:    s_lshl_b32 s5, s5, 16
1044; GFX1030-NEXT:    s_bfe_u32 s4, s4, 0x100000
1045; GFX1030-NEXT:    s_or_b32 s5, s6, s5
1046; GFX1030-NEXT:    flat_load_dword v2, v[0:1]
1047; GFX1030-NEXT:    s_bfe_u32 s6, s9, 0x100000
1048; GFX1030-NEXT:    v_mov_b32_e32 v0, 0xb36211c6
1049; GFX1030-NEXT:    s_lshl_b32 s6, s6, 16
1050; GFX1030-NEXT:    v_mov_b32_e32 v1, 0x102
1051; GFX1030-NEXT:    s_or_b32 s4, s4, s6
1052; GFX1030-NEXT:    s_or_b32 s6, s8, s7
1053; GFX1030-NEXT:    v_mov_b32_e32 v6, s5
1054; GFX1030-NEXT:    v_mov_b32_e32 v7, s4
1055; GFX1030-NEXT:    v_mov_b32_e32 v8, s6
1056; GFX1030-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1057; GFX1030-NEXT:    image_bvh64_intersect_ray v[0:3], v[0:15], s[0:3] a16
1058; GFX1030-NEXT:    s_waitcnt vmcnt(0)
1059; GFX1030-NEXT:    flat_store_dwordx4 v[0:1], v[0:3]
1060; GFX1030-NEXT:    s_endpgm
1061;
1062; GFX1013-LABEL: image_bvh64_intersect_ray_a16_nsa_reassign:
1063; GFX1013:       ; %bb.0:
1064; GFX1013-NEXT:    s_clause 0x1
1065; GFX1013-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
1066; GFX1013-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
1067; GFX1013-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1068; GFX1013-NEXT:    s_movk_i32 s1, 0x4400
1069; GFX1013-NEXT:    s_movk_i32 s9, 0x4600
1070; GFX1013-NEXT:    s_bfe_u32 s1, s1, 0x100000
1071; GFX1013-NEXT:    s_movk_i32 s0, 0x4500
1072; GFX1013-NEXT:    s_lshl_b32 s1, s1, 16
1073; GFX1013-NEXT:    s_movk_i32 s8, 0x4700
1074; GFX1013-NEXT:    s_bfe_u32 s0, s0, 0x100000
1075; GFX1013-NEXT:    s_bfe_u32 s8, s8, 0x100000
1076; GFX1013-NEXT:    v_mov_b32_e32 v3, 0
1077; GFX1013-NEXT:    v_mov_b32_e32 v4, 1.0
1078; GFX1013-NEXT:    v_mov_b32_e32 v5, 2.0
1079; GFX1013-NEXT:    s_waitcnt lgkmcnt(0)
1080; GFX1013-NEXT:    v_mov_b32_e32 v0, s2
1081; GFX1013-NEXT:    v_mov_b32_e32 v1, s3
1082; GFX1013-NEXT:    s_movk_i32 s2, 0x4200
1083; GFX1013-NEXT:    s_movk_i32 s3, 0x4800
1084; GFX1013-NEXT:    s_bfe_u32 s2, s2, 0x100000
1085; GFX1013-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
1086; GFX1013-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
1087; GFX1013-NEXT:    s_or_b32 s1, s2, s1
1088; GFX1013-NEXT:    s_bfe_u32 s2, s9, 0x100000
1089; GFX1013-NEXT:    s_bfe_u32 s3, s3, 0x100000
1090; GFX1013-NEXT:    flat_load_dword v2, v[0:1]
1091; GFX1013-NEXT:    s_lshl_b32 s2, s2, 16
1092; GFX1013-NEXT:    s_lshl_b32 s3, s3, 16
1093; GFX1013-NEXT:    s_or_b32 s0, s0, s2
1094; GFX1013-NEXT:    s_or_b32 s2, s8, s3
1095; GFX1013-NEXT:    v_mov_b32_e32 v0, 0xb36211c6
1096; GFX1013-NEXT:    v_mov_b32_e32 v1, 0x102
1097; GFX1013-NEXT:    v_mov_b32_e32 v6, s1
1098; GFX1013-NEXT:    v_mov_b32_e32 v7, s0
1099; GFX1013-NEXT:    v_mov_b32_e32 v8, s2
1100; GFX1013-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1101; GFX1013-NEXT:    image_bvh64_intersect_ray v[0:3], v[0:15], s[4:7] a16
1102; GFX1013-NEXT:    s_waitcnt vmcnt(0)
1103; GFX1013-NEXT:    flat_store_dwordx4 v[0:1], v[0:3]
1104; GFX1013-NEXT:    s_endpgm
1105;
1106; GFX11-LABEL: image_bvh64_intersect_ray_a16_nsa_reassign:
1107; GFX11:       ; %bb.0:
1108; GFX11-NEXT:    s_clause 0x1
1109; GFX11-NEXT:    s_load_b64 s[4:5], s[0:1], 0x24
1110; GFX11-NEXT:    s_load_b128 s[0:3], s[0:1], 0x34
1111; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1112; GFX11-NEXT:    s_mov_b32 s6, 0
1113; GFX11-NEXT:    s_mov_b32 s9, 0x42004600
1114; GFX11-NEXT:    s_mov_b32 s8, 2.0
1115; GFX11-NEXT:    s_mov_b32 s7, 1.0
1116; GFX11-NEXT:    s_mov_b32 s10, 0x44004700
1117; GFX11-NEXT:    s_mov_b32 s11, 0x45004800
1118; GFX11-NEXT:    v_mov_b32_e32 v3, s9
1119; GFX11-NEXT:    v_mov_b32_e32 v4, s10
1120; GFX11-NEXT:    v_mov_b32_e32 v5, s11
1121; GFX11-NEXT:    s_waitcnt lgkmcnt(0)
1122; GFX11-NEXT:    v_mov_b32_e32 v0, s4
1123; GFX11-NEXT:    v_mov_b32_e32 v1, s5
1124; GFX11-NEXT:    s_mov_b32 s4, 0xb36211c6
1125; GFX11-NEXT:    s_movk_i32 s5, 0x102
1126; GFX11-NEXT:    v_mov_b32_e32 v7, s5
1127; GFX11-NEXT:    v_add_co_u32 v0, vcc_lo, v0, v2
1128; GFX11-NEXT:    v_add_co_ci_u32_e32 v1, vcc_lo, 0, v1, vcc_lo
1129; GFX11-NEXT:    v_mov_b32_e32 v6, s4
1130; GFX11-NEXT:    flat_load_b32 v8, v[0:1]
1131; GFX11-NEXT:    v_mov_b32_e32 v0, s6
1132; GFX11-NEXT:    v_mov_b32_e32 v1, s7
1133; GFX11-NEXT:    v_mov_b32_e32 v2, s8
1134; GFX11-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1135; GFX11-NEXT:    image_bvh64_intersect_ray v[0:3], [v[6:7], v8, v[0:2], v[3:5]], s[0:3] a16
1136; GFX11-NEXT:    s_waitcnt vmcnt(0)
1137; GFX11-NEXT:    flat_store_b128 v[0:1], v[0:3]
1138; GFX11-NEXT:    s_endpgm
1139  %lid = tail call i32 @llvm.amdgcn.workitem.id.x()
1140  %gep_ray = getelementptr inbounds float, float* %p_ray, i32 %lid
1141  %ray_extent = load float, float* %gep_ray, align 4
1142  %ray_origin0 = insertelement <3 x float> undef, float 0.0, i32 0
1143  %ray_origin1 = insertelement <3 x float> %ray_origin0, float 1.0, i32 1
1144  %ray_origin = insertelement <3 x float> %ray_origin1, float 2.0, i32 2
1145  %ray_dir0 = insertelement <3 x half> undef, half 3.0, i32 0
1146  %ray_dir1 = insertelement <3 x half> %ray_dir0, half 4.0, i32 1
1147  %ray_dir = insertelement <3 x half> %ray_dir1, half 5.0, i32 2
1148  %ray_inv_dir0 = insertelement <3 x half> undef, half 6.0, i32 0
1149  %ray_inv_dir1 = insertelement <3 x half> %ray_inv_dir0, half 7.0, i32 1
1150  %ray_inv_dir = insertelement <3 x half> %ray_inv_dir1, half 8.0, i32 2
1151  %v = call <4 x i32> @llvm.amdgcn.image.bvh.intersect.ray.i64.v4f16(i64 1111111111110, float %ray_extent, <3 x float> %ray_origin, <3 x half> %ray_dir, <3 x half> %ray_inv_dir, <4 x i32> %tdescr)
1152  store <4 x i32> %v, <4 x i32>* undef
1153  ret void
1154}
1155