Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / llvm.powi.ll
blob9d586e3e4a09a400a549d95b6c0ad305587bc215
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=hawaii < %s | FileCheck -check-prefixes=GFX78,GFX7 %s
3 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=fiji < %s | FileCheck -check-prefixes=GFX78,GFX8 %s
4 ; RUN: llc -global-isel -mtriple=amdgcn-mesa-mesa3d -mcpu=gfx1100 < %s | FileCheck -check-prefixes=GFX11 %s
6 define i16 @v_powi_f16(i16 %l, i32 %r) {
7 ; GFX7-LABEL: v_powi_f16:
8 ; GFX7:       ; %bb.0:
9 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
10 ; GFX7-NEXT:    v_cvt_f32_f16_e32 v0, v0
11 ; GFX7-NEXT:    v_cvt_f32_i32_e32 v1, v1
12 ; GFX7-NEXT:    v_mov_b32_e32 v2, 0xc2fc0000
13 ; GFX7-NEXT:    v_mov_b32_e32 v3, 0x42800000
14 ; GFX7-NEXT:    v_log_f32_e32 v0, v0
15 ; GFX7-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
16 ; GFX7-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
17 ; GFX7-NEXT:    v_cndmask_b32_e32 v1, 0, v3, vcc
18 ; GFX7-NEXT:    v_add_f32_e32 v0, v0, v1
19 ; GFX7-NEXT:    v_exp_f32_e32 v0, v0
20 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0x1f800000
21 ; GFX7-NEXT:    v_cndmask_b32_e32 v1, 1.0, v1, vcc
22 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v1
23 ; GFX7-NEXT:    v_cvt_f16_f32_e32 v0, v0
24 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
26 ; GFX8-LABEL: v_powi_f16:
27 ; GFX8:       ; %bb.0:
28 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
29 ; GFX8-NEXT:    v_cvt_f32_i32_e32 v1, v1
30 ; GFX8-NEXT:    v_log_f16_e32 v0, v0
31 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v1, v1
32 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v0, v0
33 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v1, v1
34 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
35 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0
36 ; GFX8-NEXT:    v_exp_f16_e32 v0, v0
37 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
39 ; GFX11-LABEL: v_powi_f16:
40 ; GFX11:       ; %bb.0:
41 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
42 ; GFX11-NEXT:    v_log_f16_e32 v0, v0
43 ; GFX11-NEXT:    v_cvt_f32_i32_e32 v1, v1
44 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_3) | instid1(VALU_DEP_1)
45 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v1, v1
46 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
47 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v0, v0
48 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v1, v1
49 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, v0, v1
50 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
51 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v0, v0
52 ; GFX11-NEXT:    v_exp_f16_e32 v0, v0
53 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
54   %l.cast = bitcast i16 %l to half
55   %res = call half @llvm.powi.f16.i32(half %l.cast, i32 %r)
56   %res.cast = bitcast half %res to i16
57   ret i16 %res.cast
60 define float @v_powi_f32(float %l, i32 %r) {
61 ; GFX78-LABEL: v_powi_f32:
62 ; GFX78:       ; %bb.0:
63 ; GFX78-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
64 ; GFX78-NEXT:    v_mov_b32_e32 v2, 0x800000
65 ; GFX78-NEXT:    v_mov_b32_e32 v3, 0x4f800000
66 ; GFX78-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
67 ; GFX78-NEXT:    v_cndmask_b32_e32 v2, 1.0, v3, vcc
68 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v2
69 ; GFX78-NEXT:    v_log_f32_e32 v0, v0
70 ; GFX78-NEXT:    v_cvt_f32_i32_e32 v1, v1
71 ; GFX78-NEXT:    v_mov_b32_e32 v2, 0x42000000
72 ; GFX78-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
73 ; GFX78-NEXT:    v_sub_f32_e32 v0, v0, v2
74 ; GFX78-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
75 ; GFX78-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
76 ; GFX78-NEXT:    v_mov_b32_e32 v2, 0x42800000
77 ; GFX78-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
78 ; GFX78-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
79 ; GFX78-NEXT:    v_add_f32_e32 v0, v0, v1
80 ; GFX78-NEXT:    v_exp_f32_e32 v0, v0
81 ; GFX78-NEXT:    v_mov_b32_e32 v1, 0x1f800000
82 ; GFX78-NEXT:    v_cndmask_b32_e32 v1, 1.0, v1, vcc
83 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v1
84 ; GFX78-NEXT:    s_setpc_b64 s[30:31]
86 ; GFX11-LABEL: v_powi_f32:
87 ; GFX11:       ; %bb.0:
88 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
89 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
90 ; GFX11-NEXT:    v_cvt_f32_i32_e32 v1, v1
91 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 1.0, 0x4f800000, vcc_lo
92 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
93 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v2
94 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, vcc_lo
95 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
96 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
97 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v2
98 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
99 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, v0, v1
100 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
101 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
102 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
103 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
104 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 1.0, 0x1f800000, vcc_lo
105 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
106 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
107 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v1
108 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
109   %res = call float @llvm.powi.f32.i32(float %l, i32 %r)
110   ret float %res
113 define float @v_powi_0_f32(float %l) {
114 ; GFX78-LABEL: v_powi_0_f32:
115 ; GFX78:       ; %bb.0:
116 ; GFX78-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
117 ; GFX78-NEXT:    v_mov_b32_e32 v0, 1.0
118 ; GFX78-NEXT:    s_setpc_b64 s[30:31]
120 ; GFX11-LABEL: v_powi_0_f32:
121 ; GFX11:       ; %bb.0:
122 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
123 ; GFX11-NEXT:    v_mov_b32_e32 v0, 1.0
124 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
125   %res = call float @llvm.powi.f32.i32(float %l, i32 0)
126   ret float %res
129 define float @v_powi_1_f32(float %l) {
130 ; GFX78-LABEL: v_powi_1_f32:
131 ; GFX78:       ; %bb.0:
132 ; GFX78-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
133 ; GFX78-NEXT:    s_setpc_b64 s[30:31]
135 ; GFX11-LABEL: v_powi_1_f32:
136 ; GFX11:       ; %bb.0:
137 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
138 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
139   %res = call float @llvm.powi.f32.i32(float %l, i32 1)
140   ret float %res
143 define float @v_powi_neg1_f32(float %l) {
144 ; GFX7-LABEL: v_powi_neg1_f32:
145 ; GFX7:       ; %bb.0:
146 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
147 ; GFX7-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
148 ; GFX7-NEXT:    v_rcp_f32_e32 v2, v1
149 ; GFX7-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
150 ; GFX7-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
151 ; GFX7-NEXT:    v_fma_f32 v2, v4, v2, v2
152 ; GFX7-NEXT:    v_mul_f32_e32 v4, v3, v2
153 ; GFX7-NEXT:    v_fma_f32 v5, -v1, v4, v3
154 ; GFX7-NEXT:    v_fma_f32 v4, v5, v2, v4
155 ; GFX7-NEXT:    v_fma_f32 v1, -v1, v4, v3
156 ; GFX7-NEXT:    v_div_fmas_f32 v1, v1, v2, v4
157 ; GFX7-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
158 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
160 ; GFX8-LABEL: v_powi_neg1_f32:
161 ; GFX8:       ; %bb.0:
162 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
163 ; GFX8-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
164 ; GFX8-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v0, 1.0
165 ; GFX8-NEXT:    v_rcp_f32_e32 v3, v1
166 ; GFX8-NEXT:    v_fma_f32 v4, -v1, v3, 1.0
167 ; GFX8-NEXT:    v_fma_f32 v3, v4, v3, v3
168 ; GFX8-NEXT:    v_mul_f32_e32 v4, v2, v3
169 ; GFX8-NEXT:    v_fma_f32 v5, -v1, v4, v2
170 ; GFX8-NEXT:    v_fma_f32 v4, v5, v3, v4
171 ; GFX8-NEXT:    v_fma_f32 v1, -v1, v4, v2
172 ; GFX8-NEXT:    v_div_fmas_f32 v1, v1, v3, v4
173 ; GFX8-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
174 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
176 ; GFX11-LABEL: v_powi_neg1_f32:
177 ; GFX11:       ; %bb.0:
178 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
179 ; GFX11-NEXT:    v_div_scale_f32 v1, null, v0, v0, 1.0
180 ; GFX11-NEXT:    v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0
181 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
182 ; GFX11-NEXT:    v_rcp_f32_e32 v2, v1
183 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
184 ; GFX11-NEXT:    v_fma_f32 v3, -v1, v2, 1.0
185 ; GFX11-NEXT:    v_fmac_f32_e32 v2, v3, v2
186 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
187 ; GFX11-NEXT:    v_mul_f32_e32 v3, v4, v2
188 ; GFX11-NEXT:    v_fma_f32 v5, -v1, v3, v4
189 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
190 ; GFX11-NEXT:    v_fmac_f32_e32 v3, v5, v2
191 ; GFX11-NEXT:    v_fma_f32 v1, -v1, v3, v4
192 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
193 ; GFX11-NEXT:    v_div_fmas_f32 v1, v1, v2, v3
194 ; GFX11-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
195 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
196   %res = call float @llvm.powi.f32.i32(float %l, i32 -1)
197   ret float %res
200 define float @v_powi_2_f32(float %l) {
201 ; GFX78-LABEL: v_powi_2_f32:
202 ; GFX78:       ; %bb.0:
203 ; GFX78-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
204 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
205 ; GFX78-NEXT:    s_setpc_b64 s[30:31]
207 ; GFX11-LABEL: v_powi_2_f32:
208 ; GFX11:       ; %bb.0:
209 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
210 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
211 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
212   %res = call float @llvm.powi.f32.i32(float %l, i32 2)
213   ret float %res
216 define float @v_powi_neg2_f32(float %l) {
217 ; GFX7-LABEL: v_powi_neg2_f32:
218 ; GFX7:       ; %bb.0:
219 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
220 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v0
221 ; GFX7-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
222 ; GFX7-NEXT:    v_rcp_f32_e32 v2, v1
223 ; GFX7-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
224 ; GFX7-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
225 ; GFX7-NEXT:    v_fma_f32 v2, v4, v2, v2
226 ; GFX7-NEXT:    v_mul_f32_e32 v4, v3, v2
227 ; GFX7-NEXT:    v_fma_f32 v5, -v1, v4, v3
228 ; GFX7-NEXT:    v_fma_f32 v4, v5, v2, v4
229 ; GFX7-NEXT:    v_fma_f32 v1, -v1, v4, v3
230 ; GFX7-NEXT:    v_div_fmas_f32 v1, v1, v2, v4
231 ; GFX7-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
232 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
234 ; GFX8-LABEL: v_powi_neg2_f32:
235 ; GFX8:       ; %bb.0:
236 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
237 ; GFX8-NEXT:    v_mul_f32_e32 v0, v0, v0
238 ; GFX8-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
239 ; GFX8-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v0, 1.0
240 ; GFX8-NEXT:    v_rcp_f32_e32 v3, v1
241 ; GFX8-NEXT:    v_fma_f32 v4, -v1, v3, 1.0
242 ; GFX8-NEXT:    v_fma_f32 v3, v4, v3, v3
243 ; GFX8-NEXT:    v_mul_f32_e32 v4, v2, v3
244 ; GFX8-NEXT:    v_fma_f32 v5, -v1, v4, v2
245 ; GFX8-NEXT:    v_fma_f32 v4, v5, v3, v4
246 ; GFX8-NEXT:    v_fma_f32 v1, -v1, v4, v2
247 ; GFX8-NEXT:    v_div_fmas_f32 v1, v1, v3, v4
248 ; GFX8-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
249 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
251 ; GFX11-LABEL: v_powi_neg2_f32:
252 ; GFX11:       ; %bb.0:
253 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
254 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
255 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
256 ; GFX11-NEXT:    v_div_scale_f32 v1, null, v0, v0, 1.0
257 ; GFX11-NEXT:    v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0
258 ; GFX11-NEXT:    v_rcp_f32_e32 v2, v1
259 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
260 ; GFX11-NEXT:    v_fma_f32 v3, -v1, v2, 1.0
261 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
262 ; GFX11-NEXT:    v_fmac_f32_e32 v2, v3, v2
263 ; GFX11-NEXT:    v_mul_f32_e32 v3, v4, v2
264 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
265 ; GFX11-NEXT:    v_fma_f32 v5, -v1, v3, v4
266 ; GFX11-NEXT:    v_fmac_f32_e32 v3, v5, v2
267 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
268 ; GFX11-NEXT:    v_fma_f32 v1, -v1, v3, v4
269 ; GFX11-NEXT:    v_div_fmas_f32 v1, v1, v2, v3
270 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
271 ; GFX11-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
272 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
273   %res = call float @llvm.powi.f32.i32(float %l, i32 -2)
274   ret float %res
277 define float @v_powi_4_f32(float %l) {
278 ; GFX78-LABEL: v_powi_4_f32:
279 ; GFX78:       ; %bb.0:
280 ; GFX78-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
281 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
282 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
283 ; GFX78-NEXT:    s_setpc_b64 s[30:31]
285 ; GFX11-LABEL: v_powi_4_f32:
286 ; GFX11:       ; %bb.0:
287 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
288 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
289 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
290 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
291 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
292   %res = call float @llvm.powi.f32.i32(float %l, i32 4)
293   ret float %res
296 define float @v_powi_8_f32(float %l) {
297 ; GFX78-LABEL: v_powi_8_f32:
298 ; GFX78:       ; %bb.0:
299 ; GFX78-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
300 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
301 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
302 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
303 ; GFX78-NEXT:    s_setpc_b64 s[30:31]
305 ; GFX11-LABEL: v_powi_8_f32:
306 ; GFX11:       ; %bb.0:
307 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
308 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
309 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
310 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
311 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
312 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
313   %res = call float @llvm.powi.f32.i32(float %l, i32 8)
314   ret float %res
317 define float @v_powi_16_f32(float %l) {
318 ; GFX78-LABEL: v_powi_16_f32:
319 ; GFX78:       ; %bb.0:
320 ; GFX78-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
321 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
322 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
323 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
324 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
325 ; GFX78-NEXT:    s_setpc_b64 s[30:31]
327 ; GFX11-LABEL: v_powi_16_f32:
328 ; GFX11:       ; %bb.0:
329 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
330 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
331 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
332 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
333 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
334 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
335 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
336 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
337   %res = call float @llvm.powi.f32.i32(float %l, i32 16)
338   ret float %res
341 define float @v_powi_128_f32(float %l) {
342 ; GFX78-LABEL: v_powi_128_f32:
343 ; GFX78:       ; %bb.0:
344 ; GFX78-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
345 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
346 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
347 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
348 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
349 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
350 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
351 ; GFX78-NEXT:    v_mul_f32_e32 v0, v0, v0
352 ; GFX78-NEXT:    s_setpc_b64 s[30:31]
354 ; GFX11-LABEL: v_powi_128_f32:
355 ; GFX11:       ; %bb.0:
356 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
357 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
358 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
359 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
360 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
361 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
362 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
363 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
364 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
365 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
366 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
367 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
368   %res = call float @llvm.powi.f32.i32(float %l, i32 128)
369   ret float %res
372 define float @v_powi_neg128_f32(float %l) {
373 ; GFX7-LABEL: v_powi_neg128_f32:
374 ; GFX7:       ; %bb.0:
375 ; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
376 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v0
377 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v0
378 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v0
379 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v0
380 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v0
381 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v0
382 ; GFX7-NEXT:    v_mul_f32_e32 v0, v0, v0
383 ; GFX7-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
384 ; GFX7-NEXT:    v_rcp_f32_e32 v2, v1
385 ; GFX7-NEXT:    v_div_scale_f32 v3, vcc, 1.0, v0, 1.0
386 ; GFX7-NEXT:    v_fma_f32 v4, -v1, v2, 1.0
387 ; GFX7-NEXT:    v_fma_f32 v2, v4, v2, v2
388 ; GFX7-NEXT:    v_mul_f32_e32 v4, v3, v2
389 ; GFX7-NEXT:    v_fma_f32 v5, -v1, v4, v3
390 ; GFX7-NEXT:    v_fma_f32 v4, v5, v2, v4
391 ; GFX7-NEXT:    v_fma_f32 v1, -v1, v4, v3
392 ; GFX7-NEXT:    v_div_fmas_f32 v1, v1, v2, v4
393 ; GFX7-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
394 ; GFX7-NEXT:    s_setpc_b64 s[30:31]
396 ; GFX8-LABEL: v_powi_neg128_f32:
397 ; GFX8:       ; %bb.0:
398 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
399 ; GFX8-NEXT:    v_mul_f32_e32 v0, v0, v0
400 ; GFX8-NEXT:    v_mul_f32_e32 v0, v0, v0
401 ; GFX8-NEXT:    v_mul_f32_e32 v0, v0, v0
402 ; GFX8-NEXT:    v_mul_f32_e32 v0, v0, v0
403 ; GFX8-NEXT:    v_mul_f32_e32 v0, v0, v0
404 ; GFX8-NEXT:    v_mul_f32_e32 v0, v0, v0
405 ; GFX8-NEXT:    v_mul_f32_e32 v0, v0, v0
406 ; GFX8-NEXT:    v_div_scale_f32 v1, s[4:5], v0, v0, 1.0
407 ; GFX8-NEXT:    v_div_scale_f32 v2, vcc, 1.0, v0, 1.0
408 ; GFX8-NEXT:    v_rcp_f32_e32 v3, v1
409 ; GFX8-NEXT:    v_fma_f32 v4, -v1, v3, 1.0
410 ; GFX8-NEXT:    v_fma_f32 v3, v4, v3, v3
411 ; GFX8-NEXT:    v_mul_f32_e32 v4, v2, v3
412 ; GFX8-NEXT:    v_fma_f32 v5, -v1, v4, v2
413 ; GFX8-NEXT:    v_fma_f32 v4, v5, v3, v4
414 ; GFX8-NEXT:    v_fma_f32 v1, -v1, v4, v2
415 ; GFX8-NEXT:    v_div_fmas_f32 v1, v1, v3, v4
416 ; GFX8-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
417 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
419 ; GFX11-LABEL: v_powi_neg128_f32:
420 ; GFX11:       ; %bb.0:
421 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
422 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
423 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
424 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
425 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
426 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
427 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
428 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
429 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
430 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
431 ; GFX11-NEXT:    v_mul_f32_e32 v0, v0, v0
432 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
433 ; GFX11-NEXT:    v_div_scale_f32 v1, null, v0, v0, 1.0
434 ; GFX11-NEXT:    v_div_scale_f32 v4, vcc_lo, 1.0, v0, 1.0
435 ; GFX11-NEXT:    v_rcp_f32_e32 v2, v1
436 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
437 ; GFX11-NEXT:    v_fma_f32 v3, -v1, v2, 1.0
438 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
439 ; GFX11-NEXT:    v_fmac_f32_e32 v2, v3, v2
440 ; GFX11-NEXT:    v_mul_f32_e32 v3, v4, v2
441 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
442 ; GFX11-NEXT:    v_fma_f32 v5, -v1, v3, v4
443 ; GFX11-NEXT:    v_fmac_f32_e32 v3, v5, v2
444 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
445 ; GFX11-NEXT:    v_fma_f32 v1, -v1, v3, v4
446 ; GFX11-NEXT:    v_div_fmas_f32 v1, v1, v2, v3
447 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
448 ; GFX11-NEXT:    v_div_fixup_f32 v0, v1, v0, 1.0
449 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
450   %res = call float @llvm.powi.f32.i32(float %l, i32 -128)
451   ret float %res
454 ; FIXME: f64 broken
455 ; define double @v_powi_f64(double %l, i32 %r) {
456 ;   %res = call double @llvm.powi.f64.i32(double %l, i32 %r)
457 ;   ret double %res
458 ; }
460 declare half @llvm.powi.f16.i32(half, i32) #0
461 declare float @llvm.powi.f32.i32(float, i32) #0
462 declare double @llvm.powi.f64.i32(double, i32) #0
464 attributes #0 = { nounwind readnone speculatable willreturn }