xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/llvm.amdgcn.div.scale.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
4*9880d681SAndroid Build Coastguard Workerdeclare { float, i1 } @llvm.amdgcn.div.scale.f32(float, float, i1) nounwind readnone
5*9880d681SAndroid Build Coastguard Workerdeclare { double, i1 } @llvm.amdgcn.div.scale.f64(double, double, i1) nounwind readnone
6*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.fabs.f32(float) nounwind readnone
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_1:
9*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64
10*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
11*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]]
12*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
13*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
14*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_1(float addrspace(1)* %out, float addrspace(1)* %in) nounwind {
15*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
16*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
17*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
20*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false) nounwind readnone
23*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
24*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
25*9880d681SAndroid Build Coastguard Worker  ret void
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_2:
29*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64
30*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
31*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]]
32*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
33*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
34*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_2(float addrspace(1)* %out, float addrspace(1)* %in) nounwind {
35*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
36*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
37*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
40*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true) nounwind readnone
43*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
44*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
45*9880d681SAndroid Build Coastguard Worker  ret void
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_1:
49*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64
50*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8
51*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]]
52*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]]
53*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
54*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_1(double addrspace(1)* %out, double addrspace(1)* %aptr, double addrspace(1)* %in) nounwind {
55*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
56*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
57*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0, align 8
60*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1, align 8
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker  %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false) nounwind readnone
63*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { double, i1 } %result, 0
64*9880d681SAndroid Build Coastguard Worker  store double %result0, double addrspace(1)* %out, align 8
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_2:
69*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64
70*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:8
71*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]]
72*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]]
73*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
74*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_2(double addrspace(1)* %out, double addrspace(1)* %aptr, double addrspace(1)* %in) nounwind {
75*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
76*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr double, double addrspace(1)* %in, i32 %tid
77*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr double, double addrspace(1)* %gep.0, i32 1
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Worker  %a = load volatile double, double addrspace(1)* %gep.0, align 8
80*9880d681SAndroid Build Coastguard Worker  %b = load volatile double, double addrspace(1)* %gep.1, align 8
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker  %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true) nounwind readnone
83*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { double, i1 } %result, 0
84*9880d681SAndroid Build Coastguard Worker  store double %result0, double addrspace(1)* %out, align 8
85*9880d681SAndroid Build Coastguard Worker  ret void
86*9880d681SAndroid Build Coastguard Worker}
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_scalar_num_1:
89*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]]
90*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]]
91*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]]
92*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
93*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
94*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_scalar_num_1(float addrspace(1)* %out, float addrspace(1)* %in, float %a) nounwind {
95*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
96*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr float, float addrspace(1)* %in, i32 %tid
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker  %b = load float, float addrspace(1)* %gep, align 4
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false) nounwind readnone
101*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
102*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
103*9880d681SAndroid Build Coastguard Worker  ret void
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_scalar_num_2:
107*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]]
108*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]]
109*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]]
110*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
111*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
112*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_scalar_num_2(float addrspace(1)* %out, float addrspace(1)* %in, float %a) nounwind {
113*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
114*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr float, float addrspace(1)* %in, i32 %tid
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker  %b = load float, float addrspace(1)* %gep, align 4
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true) nounwind readnone
119*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
120*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
121*9880d681SAndroid Build Coastguard Worker  ret void
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_scalar_den_1:
125*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]]
126*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]]
127*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]]
128*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
129*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
130*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_scalar_den_1(float addrspace(1)* %out, float addrspace(1)* %in, float %b) nounwind {
131*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
132*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr float, float addrspace(1)* %in, i32 %tid
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep, align 4
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false) nounwind readnone
137*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
138*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
139*9880d681SAndroid Build Coastguard Worker  ret void
140*9880d681SAndroid Build Coastguard Worker}
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_scalar_den_2:
143*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]]
144*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]]
145*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]]
146*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
147*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
148*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_scalar_den_2(float addrspace(1)* %out, float addrspace(1)* %in, float %b) nounwind {
149*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
150*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr float, float addrspace(1)* %in, i32 %tid
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep, align 4
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true) nounwind readnone
155*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
156*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
157*9880d681SAndroid Build Coastguard Worker  ret void
158*9880d681SAndroid Build Coastguard Worker}
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_scalar_num_1:
161*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]]
162*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[A:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd
163*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]]
164*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]]
165*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
166*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_scalar_num_1(double addrspace(1)* %out, double addrspace(1)* %in, double %a) nounwind {
167*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
168*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr double, double addrspace(1)* %in, i32 %tid
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker  %b = load double, double addrspace(1)* %gep, align 8
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker  %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false) nounwind readnone
173*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { double, i1 } %result, 0
174*9880d681SAndroid Build Coastguard Worker  store double %result0, double addrspace(1)* %out, align 8
175*9880d681SAndroid Build Coastguard Worker  ret void
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_scalar_num_2:
179*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[A:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd
180*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[B:v\[[0-9]+:[0-9]+\]]]
181*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]]
182*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]]
183*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
184*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_scalar_num_2(double addrspace(1)* %out, double addrspace(1)* %in, double %a) nounwind {
185*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
186*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr double, double addrspace(1)* %in, i32 %tid
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker  %b = load double, double addrspace(1)* %gep, align 8
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker  %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true) nounwind readnone
191*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { double, i1 } %result, 0
192*9880d681SAndroid Build Coastguard Worker  store double %result0, double addrspace(1)* %out, align 8
193*9880d681SAndroid Build Coastguard Worker  ret void
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_scalar_den_1:
197*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]]
198*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[B:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd
199*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[A]]
200*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]]
201*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
202*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_scalar_den_1(double addrspace(1)* %out, double addrspace(1)* %in, double %b) nounwind {
203*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
204*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr double, double addrspace(1)* %in, i32 %tid
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker  %a = load double, double addrspace(1)* %gep, align 8
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker  %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false) nounwind readnone
209*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { double, i1 } %result, 0
210*9880d681SAndroid Build Coastguard Worker  store double %result0, double addrspace(1)* %out, align 8
211*9880d681SAndroid Build Coastguard Worker  ret void
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_scalar_den_2:
215*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dwordx2 [[A:v\[[0-9]+:[0-9]+\]]]
216*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[B:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd
217*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[B]], [[A]]
218*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]]
219*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
220*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_scalar_den_2(double addrspace(1)* %out, double addrspace(1)* %in, double %b) nounwind {
221*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
222*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr double, double addrspace(1)* %in, i32 %tid
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Worker  %a = load double, double addrspace(1)* %gep, align 8
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Worker  %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true) nounwind readnone
227*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { double, i1 } %result, 0
228*9880d681SAndroid Build Coastguard Worker  store double %result0, double addrspace(1)* %out, align 8
229*9880d681SAndroid Build Coastguard Worker  ret void
230*9880d681SAndroid Build Coastguard Worker}
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_all_scalar_1:
233*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
234*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc
235*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VA:v[0-9]+]], [[A]]
236*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], [[VA]]
237*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
238*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
239*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_all_scalar_1(float addrspace(1)* %out, float %a, float %b) nounwind {
240*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 false) nounwind readnone
241*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
242*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
243*9880d681SAndroid Build Coastguard Worker  ret void
244*9880d681SAndroid Build Coastguard Worker}
245*9880d681SAndroid Build Coastguard Worker
246*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_all_scalar_2:
247*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[A:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
248*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dword [[B:s[0-9]+]], {{s\[[0-9]+:[0-9]+\]}}, 0xc
249*9880d681SAndroid Build Coastguard Worker; SI: v_mov_b32_e32 [[VB:v[0-9]+]], [[B]]
250*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[VB]], [[A]]
251*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
252*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
253*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_all_scalar_2(float addrspace(1)* %out, float %a, float %b) nounwind {
254*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b, i1 true) nounwind readnone
255*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
256*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
257*9880d681SAndroid Build Coastguard Worker  ret void
258*9880d681SAndroid Build Coastguard Worker}
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_all_scalar_1:
261*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 s{{\[}}[[A_LO:[0-9]+]]:[[A_HI:[0-9]+]]{{\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0xb
262*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[B:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xd
263*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VA_LO:[0-9]+]], s[[A_LO]]
264*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VA_HI:[0-9]+]], s[[A_HI]]
265*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], v{{\[}}[[VA_LO]]:[[VA_HI]]{{\]}}
266*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]]
267*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
268*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_all_scalar_1(double addrspace(1)* %out, double %a, double %b) nounwind {
269*9880d681SAndroid Build Coastguard Worker  %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 false) nounwind readnone
270*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { double, i1 } %result, 0
271*9880d681SAndroid Build Coastguard Worker  store double %result0, double addrspace(1)* %out, align 8
272*9880d681SAndroid Build Coastguard Worker  ret void
273*9880d681SAndroid Build Coastguard Worker}
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f64_all_scalar_2:
276*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 [[A:s\[[0-9]+:[0-9]+\]]], {{s\[[0-9]+:[0-9]+\]}}, 0xb
277*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 s{{\[}}[[B_LO:[0-9]+]]:[[B_HI:[0-9]+]]{{\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0xd
278*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VB_LO:[0-9]+]], s[[B_LO]]
279*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v[[VB_HI:[0-9]+]], s[[B_HI]]
280*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f64 [[RESULT0:v\[[0-9]+:[0-9]+\]]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], v{{\[}}[[VB_LO]]:[[VB_HI]]{{\]}}, [[A]]
281*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2 [[RESULT0]]
282*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
283*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f64_all_scalar_2(double addrspace(1)* %out, double %a, double %b) nounwind {
284*9880d681SAndroid Build Coastguard Worker  %result = call { double, i1 } @llvm.amdgcn.div.scale.f64(double %a, double %b, i1 true) nounwind readnone
285*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { double, i1 } %result, 0
286*9880d681SAndroid Build Coastguard Worker  store double %result0, double addrspace(1)* %out, align 8
287*9880d681SAndroid Build Coastguard Worker  ret void
288*9880d681SAndroid Build Coastguard Worker}
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_inline_imm_num:
291*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
292*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[A]], [[A]], 1.0
293*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
294*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
295*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_inline_imm_num(float addrspace(1)* %out, float addrspace(1)* %in) nounwind {
296*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
297*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
298*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.0, align 4
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float 1.0, float %a, i1 false) nounwind readnone
301*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
302*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
303*9880d681SAndroid Build Coastguard Worker  ret void
304*9880d681SAndroid Build Coastguard Worker}
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_inline_imm_den:
307*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
308*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], 2.0, 2.0, [[A]]
309*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
310*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
311*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_inline_imm_den(float addrspace(1)* %out, float addrspace(1)* %in) nounwind {
312*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
313*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
314*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(1)* %gep.0, align 4
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float 2.0, i1 false) nounwind readnone
317*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
318*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
319*9880d681SAndroid Build Coastguard Worker  ret void
320*9880d681SAndroid Build Coastguard Worker}
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_fabs_num:
323*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64
324*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
325*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], [[B]], [[B]], |[[A]]|
326*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
327*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
328*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_fabs_num(float addrspace(1)* %out, float addrspace(1)* %in) nounwind {
329*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
330*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
331*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
332*9880d681SAndroid Build Coastguard Worker
333*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
334*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker  %a.fabs = call float @llvm.fabs.f32(float %a) nounwind readnone
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a.fabs, float %b, i1 false) nounwind readnone
339*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
340*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
341*9880d681SAndroid Build Coastguard Worker  ret void
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker; SI-LABEL: {{^}}test_div_scale_f32_fabs_den:
345*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[A:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64
346*9880d681SAndroid Build Coastguard Worker; SI-DAG: buffer_load_dword [[B:v[0-9]+]], {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:4
347*9880d681SAndroid Build Coastguard Worker; SI: v_div_scale_f32 [[RESULT0:v[0-9]+]], [[RESULT1:s\[[0-9]+:[0-9]+\]]], |[[B]]|, |[[B]]|, [[A]]
348*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dword [[RESULT0]]
349*9880d681SAndroid Build Coastguard Worker; SI: s_endpgm
350*9880d681SAndroid Build Coastguard Workerdefine void @test_div_scale_f32_fabs_den(float addrspace(1)* %out, float addrspace(1)* %in) nounwind {
351*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.workitem.id.x() nounwind readnone
352*9880d681SAndroid Build Coastguard Worker  %gep.0 = getelementptr float, float addrspace(1)* %in, i32 %tid
353*9880d681SAndroid Build Coastguard Worker  %gep.1 = getelementptr float, float addrspace(1)* %gep.0, i32 1
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker  %a = load volatile float, float addrspace(1)* %gep.0, align 4
356*9880d681SAndroid Build Coastguard Worker  %b = load volatile float, float addrspace(1)* %gep.1, align 4
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker  %b.fabs = call float @llvm.fabs.f32(float %b) nounwind readnone
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker  %result = call { float, i1 } @llvm.amdgcn.div.scale.f32(float %a, float %b.fabs, i1 false) nounwind readnone
361*9880d681SAndroid Build Coastguard Worker  %result0 = extractvalue { float, i1 } %result, 0
362*9880d681SAndroid Build Coastguard Worker  store float %result0, float addrspace(1)* %out, align 4
363*9880d681SAndroid Build Coastguard Worker  ret void
364*9880d681SAndroid Build Coastguard Worker}
365