[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / GlobalISel / fpow.ll
blobd81faf91801b0b13f1265c8cba90a620e693b811
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -global-isel -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefix=GFX6 %s
3 ; RUN: llc -global-isel -mtriple=amdgcn -mcpu=fiji < %s | FileCheck -check-prefix=GFX8 %s
4 ; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefix=GFX9 %s
5 ; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1010 < %s | FileCheck -check-prefix=GFX10 %s
6 ; RUN: llc -global-isel -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11 %s
8 define float @v_pow_f32(float %x, float %y) {
9 ; GFX6-LABEL: v_pow_f32:
10 ; GFX6:       ; %bb.0:
11 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
12 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x800000
13 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
14 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
15 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
16 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v2
17 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
18 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42000000
19 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
20 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v2
21 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
22 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
23 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
24 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
25 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
26 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
27 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
28 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
29 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
30 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
31 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
33 ; GFX8-LABEL: v_pow_f32:
34 ; GFX8:       ; %bb.0:
35 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
36 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x800000
37 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
38 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
39 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
40 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v2
41 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
42 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42000000
43 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
44 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v2
45 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
46 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
47 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
48 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
49 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
50 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
51 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
52 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
53 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
54 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
55 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
57 ; GFX9-LABEL: v_pow_f32:
58 ; GFX9:       ; %bb.0:
59 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
60 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x800000
61 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
62 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
63 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
64 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v2
65 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
66 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42000000
67 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
68 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v2
69 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
70 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
71 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
72 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
73 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
74 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
75 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
76 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
77 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
78 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
79 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
81 ; GFX10-LABEL: v_pow_f32:
82 ; GFX10:       ; %bb.0:
83 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
84 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
85 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
86 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
87 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v2
88 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, vcc_lo
89 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
90 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v2
91 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
92 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
93 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
94 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
95 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
96 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
97 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
98 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
100 ; GFX11-LABEL: v_pow_f32:
101 ; GFX11:       ; %bb.0:
102 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
103 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
104 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
105 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
106 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
107 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v2
108 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, vcc_lo
109 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
110 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
111 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
112 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v2
113 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, v0, v1
114 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
115 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
116 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
117 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
118 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
119 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
120 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
121 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
122 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
123 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
124   %pow = call float @llvm.pow.f32(float %x, float %y)
125   ret float %pow
128 define <2 x float> @v_pow_v2f32(<2 x float> %x, <2 x float> %y) {
129 ; GFX6-LABEL: v_pow_v2f32:
130 ; GFX6:       ; %bb.0:
131 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
132 ; GFX6-NEXT:    v_mov_b32_e32 v4, 0x800000
133 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v4
134 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
135 ; GFX6-NEXT:    v_cmp_lt_f32_e64 s[4:5], v1, v4
136 ; GFX6-NEXT:    v_lshlrev_b32_e32 v5, 5, v5
137 ; GFX6-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s[4:5]
138 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v5
139 ; GFX6-NEXT:    v_lshlrev_b32_e32 v4, 5, v4
140 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
141 ; GFX6-NEXT:    v_ldexp_f32_e32 v1, v1, v4
142 ; GFX6-NEXT:    v_log_f32_e32 v1, v1
143 ; GFX6-NEXT:    v_mov_b32_e32 v5, 0x42000000
144 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, 0, v5, vcc
145 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v6
146 ; GFX6-NEXT:    v_cndmask_b32_e64 v5, 0, v5, s[4:5]
147 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v2
148 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0xc2fc0000
149 ; GFX6-NEXT:    v_sub_f32_e32 v1, v1, v5
150 ; GFX6-NEXT:    v_mov_b32_e32 v6, 0x42800000
151 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
152 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v1, v1, v3
153 ; GFX6-NEXT:    v_cndmask_b32_e32 v7, 0, v6, vcc
154 ; GFX6-NEXT:    v_cmp_lt_f32_e64 s[4:5], v1, v2
155 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v7
156 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, v6, s[4:5]
157 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
158 ; GFX6-NEXT:    v_add_f32_e32 v1, v1, v2
159 ; GFX6-NEXT:    v_exp_f32_e32 v1, v1
160 ; GFX6-NEXT:    v_not_b32_e32 v4, 63
161 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v4, vcc
162 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v2
163 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, v4, s[4:5]
164 ; GFX6-NEXT:    v_ldexp_f32_e32 v1, v1, v2
165 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
167 ; GFX8-LABEL: v_pow_v2f32:
168 ; GFX8:       ; %bb.0:
169 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
170 ; GFX8-NEXT:    v_mov_b32_e32 v4, 0x800000
171 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v4
172 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
173 ; GFX8-NEXT:    v_cmp_lt_f32_e64 s[4:5], v1, v4
174 ; GFX8-NEXT:    v_lshlrev_b32_e32 v5, 5, v5
175 ; GFX8-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s[4:5]
176 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v5
177 ; GFX8-NEXT:    v_lshlrev_b32_e32 v4, 5, v4
178 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
179 ; GFX8-NEXT:    v_ldexp_f32 v1, v1, v4
180 ; GFX8-NEXT:    v_log_f32_e32 v1, v1
181 ; GFX8-NEXT:    v_mov_b32_e32 v5, 0x42000000
182 ; GFX8-NEXT:    v_cndmask_b32_e32 v6, 0, v5, vcc
183 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v6
184 ; GFX8-NEXT:    v_cndmask_b32_e64 v5, 0, v5, s[4:5]
185 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v2
186 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0xc2fc0000
187 ; GFX8-NEXT:    v_sub_f32_e32 v1, v1, v5
188 ; GFX8-NEXT:    v_mov_b32_e32 v6, 0x42800000
189 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
190 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v1, v1, v3
191 ; GFX8-NEXT:    v_cndmask_b32_e32 v7, 0, v6, vcc
192 ; GFX8-NEXT:    v_cmp_lt_f32_e64 s[4:5], v1, v2
193 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v7
194 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, v6, s[4:5]
195 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
196 ; GFX8-NEXT:    v_add_f32_e32 v1, v1, v2
197 ; GFX8-NEXT:    v_exp_f32_e32 v1, v1
198 ; GFX8-NEXT:    v_not_b32_e32 v4, 63
199 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, 0, v4, vcc
200 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v2
201 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, v4, s[4:5]
202 ; GFX8-NEXT:    v_ldexp_f32 v1, v1, v2
203 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
205 ; GFX9-LABEL: v_pow_v2f32:
206 ; GFX9:       ; %bb.0:
207 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
208 ; GFX9-NEXT:    v_mov_b32_e32 v4, 0x800000
209 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v4
210 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, 1, vcc
211 ; GFX9-NEXT:    v_cmp_lt_f32_e64 s[4:5], v1, v4
212 ; GFX9-NEXT:    v_lshlrev_b32_e32 v5, 5, v5
213 ; GFX9-NEXT:    v_cndmask_b32_e64 v4, 0, 1, s[4:5]
214 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v5
215 ; GFX9-NEXT:    v_lshlrev_b32_e32 v4, 5, v4
216 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
217 ; GFX9-NEXT:    v_ldexp_f32 v1, v1, v4
218 ; GFX9-NEXT:    v_log_f32_e32 v1, v1
219 ; GFX9-NEXT:    v_mov_b32_e32 v5, 0x42000000
220 ; GFX9-NEXT:    v_cndmask_b32_e32 v6, 0, v5, vcc
221 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v6
222 ; GFX9-NEXT:    v_cndmask_b32_e64 v5, 0, v5, s[4:5]
223 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v2
224 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0xc2fc0000
225 ; GFX9-NEXT:    v_sub_f32_e32 v1, v1, v5
226 ; GFX9-NEXT:    v_mov_b32_e32 v6, 0x42800000
227 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
228 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v1, v1, v3
229 ; GFX9-NEXT:    v_cndmask_b32_e32 v7, 0, v6, vcc
230 ; GFX9-NEXT:    v_cmp_lt_f32_e64 s[4:5], v1, v2
231 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v7
232 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, v6, s[4:5]
233 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
234 ; GFX9-NEXT:    v_add_f32_e32 v1, v1, v2
235 ; GFX9-NEXT:    v_exp_f32_e32 v1, v1
236 ; GFX9-NEXT:    v_not_b32_e32 v4, 63
237 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v4, vcc
238 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v2
239 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, v4, s[4:5]
240 ; GFX9-NEXT:    v_ldexp_f32 v1, v1, v2
241 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
243 ; GFX10-LABEL: v_pow_v2f32:
244 ; GFX10:       ; %bb.0:
245 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
246 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
247 ; GFX10-NEXT:    v_cmp_gt_f32_e64 s4, 0x800000, v1
248 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc_lo
249 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s4
250 ; GFX10-NEXT:    v_lshlrev_b32_e32 v4, 5, v4
251 ; GFX10-NEXT:    v_lshlrev_b32_e32 v5, 5, v5
252 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v4
253 ; GFX10-NEXT:    v_ldexp_f32 v1, v1, v5
254 ; GFX10-NEXT:    v_cndmask_b32_e64 v4, 0, 0x42000000, vcc_lo
255 ; GFX10-NEXT:    v_cndmask_b32_e64 v5, 0, 0x42000000, s4
256 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
257 ; GFX10-NEXT:    v_log_f32_e32 v1, v1
258 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v4
259 ; GFX10-NEXT:    v_sub_f32_e32 v1, v1, v5
260 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v2
261 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v1, v1, v3
262 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
263 ; GFX10-NEXT:    v_cmp_gt_f32_e64 s4, 0xc2fc0000, v1
264 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42800000, vcc_lo
265 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, 0, 0x42800000, s4
266 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v2
267 ; GFX10-NEXT:    v_add_f32_e32 v1, v1, v3
268 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0xffffffc0, vcc_lo
269 ; GFX10-NEXT:    v_cndmask_b32_e64 v3, 0, 0xffffffc0, s4
270 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
271 ; GFX10-NEXT:    v_exp_f32_e32 v1, v1
272 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v2
273 ; GFX10-NEXT:    v_ldexp_f32 v1, v1, v3
274 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
276 ; GFX11-LABEL: v_pow_v2f32:
277 ; GFX11:       ; %bb.0:
278 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
279 ; GFX11-NEXT:    v_cmp_gt_f32_e64 s0, 0x800000, v1
280 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
281 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
282 ; GFX11-NEXT:    v_cndmask_b32_e64 v5, 0, 1, s0
283 ; GFX11-NEXT:    v_cndmask_b32_e64 v4, 0, 1, vcc_lo
284 ; GFX11-NEXT:    v_lshlrev_b32_e32 v5, 5, v5
285 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
286 ; GFX11-NEXT:    v_ldexp_f32 v1, v1, v5
287 ; GFX11-NEXT:    v_cndmask_b32_e64 v5, 0, 0x42000000, s0
288 ; GFX11-NEXT:    v_log_f32_e32 v1, v1
289 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
290 ; GFX11-NEXT:    v_dual_sub_f32 v1, v1, v5 :: v_dual_lshlrev_b32 v4, 5, v4
291 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_3)
292 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v4
293 ; GFX11-NEXT:    v_cndmask_b32_e64 v4, 0, 0x42000000, vcc_lo
294 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v1, v1, v3
295 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_1)
296 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
297 ; GFX11-NEXT:    v_cmp_gt_f32_e64 s0, 0xc2fc0000, v1
298 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)
299 ; GFX11-NEXT:    v_cndmask_b32_e64 v3, 0, 0x42800000, s0
300 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
301 ; GFX11-NEXT:    v_dual_sub_f32 v0, v0, v4 :: v_dual_add_f32 v1, v1, v3
302 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, v0, v2
303 ; GFX11-NEXT:    v_cndmask_b32_e64 v3, 0, 0xffffffc0, s0
304 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
305 ; GFX11-NEXT:    v_exp_f32_e32 v1, v1
306 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
307 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42800000, vcc_lo
308 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
309 ; GFX11-NEXT:    v_ldexp_f32 v1, v1, v3
310 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v2
311 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0xffffffc0, vcc_lo
312 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
313 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
314 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
315 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v2
316 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
317   %pow = call <2 x float> @llvm.pow.v2f32(<2 x float> %x, <2 x float> %y)
318   ret <2 x float> %pow
321 define half @v_pow_f16(half %x, half %y) {
322 ; GFX6-LABEL: v_pow_f16:
323 ; GFX6:       ; %bb.0:
324 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
325 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
326 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
327 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0xc2fc0000
328 ; GFX6-NEXT:    v_mov_b32_e32 v3, 0x42800000
329 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
330 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
331 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
332 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v3, vcc
333 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
334 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
335 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
336 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
337 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
338 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
339 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
341 ; GFX8-LABEL: v_pow_f16:
342 ; GFX8:       ; %bb.0:
343 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
344 ; GFX8-NEXT:    v_log_f16_e32 v0, v0
345 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v1, v1
346 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v0, v0
347 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
348 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0
349 ; GFX8-NEXT:    v_exp_f16_e32 v0, v0
350 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
352 ; GFX9-LABEL: v_pow_f16:
353 ; GFX9:       ; %bb.0:
354 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
355 ; GFX9-NEXT:    v_log_f16_e32 v0, v0
356 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v1, v1
357 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v0, v0
358 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
359 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v0, v0
360 ; GFX9-NEXT:    v_exp_f16_e32 v0, v0
361 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
363 ; GFX10-LABEL: v_pow_f16:
364 ; GFX10:       ; %bb.0:
365 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
366 ; GFX10-NEXT:    v_log_f16_e32 v0, v0
367 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v1, v1
368 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v0
369 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
370 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0
371 ; GFX10-NEXT:    v_exp_f16_e32 v0, v0
372 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
374 ; GFX11-LABEL: v_pow_f16:
375 ; GFX11:       ; %bb.0:
376 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
377 ; GFX11-NEXT:    v_log_f16_e32 v0, v0
378 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v1, v1
379 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
380 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v0, v0
381 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
382 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, v0, v1
383 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v0, v0
384 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
385 ; GFX11-NEXT:    v_exp_f16_e32 v0, v0
386 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
387   %pow = call half @llvm.pow.f16(half %x, half %y)
388   ret half %pow
391 define <2 x half> @v_pow_v2f16(<2 x half> %x, <2 x half> %y) {
392 ; GFX6-LABEL: v_pow_v2f16:
393 ; GFX6:       ; %bb.0:
394 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
395 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
396 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
397 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
398 ; GFX6-NEXT:    v_mov_b32_e32 v4, 0xc2fc0000
399 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
400 ; GFX6-NEXT:    v_mov_b32_e32 v5, 0x42800000
401 ; GFX6-NEXT:    v_log_f32_e32 v1, v1
402 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v2
403 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v4
404 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v5, vcc
405 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v2
406 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v3
407 ; GFX6-NEXT:    v_not_b32_e32 v3, 63
408 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, 0, v3, vcc
409 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
410 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v1, v1, v2
411 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v1, v4
412 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v5, vcc
413 ; GFX6-NEXT:    v_add_f32_e32 v1, v1, v2
414 ; GFX6-NEXT:    v_exp_f32_e32 v1, v1
415 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v3, vcc
416 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v6
417 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
418 ; GFX6-NEXT:    v_ldexp_f32_e32 v1, v1, v2
419 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
420 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
422 ; GFX8-LABEL: v_pow_v2f16:
423 ; GFX8:       ; %bb.0:
424 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
425 ; GFX8-NEXT:    v_log_f16_e32 v2, v0
426 ; GFX8-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
427 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v3, v1
428 ; GFX8-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
429 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v2, v2
430 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v0, v0
431 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
432 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
433 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v1, v2
434 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0
435 ; GFX8-NEXT:    v_exp_f16_e32 v1, v1
436 ; GFX8-NEXT:    v_exp_f16_sdwa v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD
437 ; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
438 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
440 ; GFX9-LABEL: v_pow_v2f16:
441 ; GFX9:       ; %bb.0:
442 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
443 ; GFX9-NEXT:    v_log_f16_e32 v2, v0
444 ; GFX9-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
445 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v3, v1
446 ; GFX9-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
447 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v2, v2
448 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v0, v0
449 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
450 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
451 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v1, v2
452 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v0, v0
453 ; GFX9-NEXT:    v_exp_f16_e32 v1, v1
454 ; GFX9-NEXT:    v_exp_f16_e32 v0, v0
455 ; GFX9-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
456 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
458 ; GFX10-LABEL: v_pow_v2f16:
459 ; GFX10:       ; %bb.0:
460 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
461 ; GFX10-NEXT:    v_log_f16_e32 v2, v0
462 ; GFX10-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
463 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v3, v1
464 ; GFX10-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
465 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v2, v2
466 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v0
467 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
468 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
469 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v2, v2
470 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0
471 ; GFX10-NEXT:    v_exp_f16_e32 v1, v2
472 ; GFX10-NEXT:    v_exp_f16_e32 v0, v0
473 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff, v1
474 ; GFX10-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
475 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
477 ; GFX11-LABEL: v_pow_v2f16:
478 ; GFX11:       ; %bb.0:
479 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
480 ; GFX11-NEXT:    v_log_f16_e32 v2, v0
481 ; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
482 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
483 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v1, v1
484 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
485 ; GFX11-NEXT:    v_log_f16_e32 v0, v0
486 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v3, v3
487 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
488 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v2, v2
489 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v0, v0
490 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
491 ; GFX11-NEXT:    v_dual_mul_dx9_zero_f32 v1, v2, v1 :: v_dual_mul_dx9_zero_f32 v0, v0, v3
492 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v1, v1
493 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
494 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v0, v0
495 ; GFX11-NEXT:    v_exp_f16_e32 v1, v1
496 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)
497 ; GFX11-NEXT:    v_exp_f16_e32 v0, v0
498 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
499 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff, v1
500 ; GFX11-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
501 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
502   %pow = call <2 x half> @llvm.pow.v2f16(<2 x half> %x, <2 x half> %y)
503   ret <2 x half> %pow
506 define <2 x half> @v_pow_v2f16_fneg_lhs(<2 x half> %x, <2 x half> %y) {
507 ; GFX6-LABEL: v_pow_v2f16_fneg_lhs:
508 ; GFX6:       ; %bb.0:
509 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
510 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
511 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
512 ; GFX6-NEXT:    v_or_b32_e32 v0, v1, v0
513 ; GFX6-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
514 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v0
515 ; GFX6-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
516 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
517 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
518 ; GFX6-NEXT:    v_log_f32_e32 v1, v1
519 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v3
520 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
521 ; GFX6-NEXT:    v_mov_b32_e32 v4, 0x42800000
522 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v1, v1, v2
523 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0xc2fc0000
524 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v1, v2
525 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, 0, v4, vcc
526 ; GFX6-NEXT:    v_add_f32_e32 v1, v1, v5
527 ; GFX6-NEXT:    v_not_b32_e32 v5, 63
528 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v3
529 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, 0, v5, vcc
530 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
531 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v4, vcc
532 ; GFX6-NEXT:    v_exp_f32_e32 v1, v1
533 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v2
534 ; GFX6-NEXT:    v_exp_f32_e32 v2, v0
535 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v1, v6
536 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v5, vcc
537 ; GFX6-NEXT:    v_ldexp_f32_e32 v1, v2, v1
538 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
539 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
540 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
542 ; GFX8-LABEL: v_pow_v2f16_fneg_lhs:
543 ; GFX8:       ; %bb.0:
544 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
545 ; GFX8-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
546 ; GFX8-NEXT:    v_log_f16_e32 v2, v0
547 ; GFX8-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
548 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v3, v1
549 ; GFX8-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
550 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v2, v2
551 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v0, v0
552 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
553 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
554 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v1, v2
555 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0
556 ; GFX8-NEXT:    v_exp_f16_e32 v1, v1
557 ; GFX8-NEXT:    v_exp_f16_sdwa v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD
558 ; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
559 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
561 ; GFX9-LABEL: v_pow_v2f16_fneg_lhs:
562 ; GFX9:       ; %bb.0:
563 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
564 ; GFX9-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
565 ; GFX9-NEXT:    v_log_f16_e32 v2, v0
566 ; GFX9-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
567 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v3, v1
568 ; GFX9-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
569 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v2, v2
570 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v0, v0
571 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
572 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
573 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v1, v2
574 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v0, v0
575 ; GFX9-NEXT:    v_exp_f16_e32 v1, v1
576 ; GFX9-NEXT:    v_exp_f16_e32 v0, v0
577 ; GFX9-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
578 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
580 ; GFX10-LABEL: v_pow_v2f16_fneg_lhs:
581 ; GFX10:       ; %bb.0:
582 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
583 ; GFX10-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
584 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v3, v1
585 ; GFX10-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
586 ; GFX10-NEXT:    v_log_f16_e32 v2, v0
587 ; GFX10-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
588 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v2, v2
589 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v0
590 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
591 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
592 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v2, v2
593 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0
594 ; GFX10-NEXT:    v_exp_f16_e32 v1, v2
595 ; GFX10-NEXT:    v_exp_f16_e32 v0, v0
596 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff, v1
597 ; GFX10-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
598 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
600 ; GFX11-LABEL: v_pow_v2f16_fneg_lhs:
601 ; GFX11:       ; %bb.0:
602 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
603 ; GFX11-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
604 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
605 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v1, v1
606 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(SKIP_1) | instid1(VALU_DEP_3)
607 ; GFX11-NEXT:    v_log_f16_e32 v2, v0
608 ; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
609 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v3, v3
610 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_3) | instid1(VALU_DEP_1)
611 ; GFX11-NEXT:    v_log_f16_e32 v0, v0
612 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
613 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v2, v2
614 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v0, v0
615 ; GFX11-NEXT:    v_dual_mul_dx9_zero_f32 v1, v2, v1 :: v_dual_mul_dx9_zero_f32 v0, v0, v3
616 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_2)
617 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v1, v1
618 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v0, v0
619 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
620 ; GFX11-NEXT:    v_exp_f16_e32 v1, v1
621 ; GFX11-NEXT:    v_exp_f16_e32 v0, v0
622 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
623 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff, v1
624 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1)
625 ; GFX11-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
626 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
627   %x.fneg = fneg <2 x half> %x
628   %pow = call <2 x half> @llvm.pow.v2f16(<2 x half> %x.fneg, <2 x half> %y)
629   ret <2 x half> %pow
632 define <2 x half> @v_pow_v2f16_fneg_rhs(<2 x half> %x, <2 x half> %y) {
633 ; GFX6-LABEL: v_pow_v2f16_fneg_rhs:
634 ; GFX6:       ; %bb.0:
635 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
636 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
637 ; GFX6-NEXT:    v_lshlrev_b32_e32 v3, 16, v3
638 ; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff, v2
639 ; GFX6-NEXT:    v_or_b32_e32 v2, v3, v2
640 ; GFX6-NEXT:    v_xor_b32_e32 v2, 0x80008000, v2
641 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
642 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v2
643 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
644 ; GFX6-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
645 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v2
646 ; GFX6-NEXT:    v_log_f32_e32 v1, v1
647 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v3
648 ; GFX6-NEXT:    v_mov_b32_e32 v3, 0xc2fc0000
649 ; GFX6-NEXT:    v_mov_b32_e32 v4, 0x42800000
650 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v3
651 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, 0, v4, vcc
652 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v5
653 ; GFX6-NEXT:    v_not_b32_e32 v5, 63
654 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v1, v1, v2
655 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, 0, v5, vcc
656 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v1, v3
657 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v4, vcc
658 ; GFX6-NEXT:    v_add_f32_e32 v1, v1, v2
659 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
660 ; GFX6-NEXT:    v_exp_f32_e32 v1, v1
661 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v5, vcc
662 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v6
663 ; GFX6-NEXT:    v_ldexp_f32_e32 v1, v1, v2
664 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
665 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
666 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
668 ; GFX8-LABEL: v_pow_v2f16_fneg_rhs:
669 ; GFX8:       ; %bb.0:
670 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
671 ; GFX8-NEXT:    v_log_f16_e32 v2, v0
672 ; GFX8-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
673 ; GFX8-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
674 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v3, v1
675 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v2, v2
676 ; GFX8-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
677 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v0, v0
678 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
679 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v2, v2
680 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
681 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0
682 ; GFX8-NEXT:    v_exp_f16_e32 v1, v2
683 ; GFX8-NEXT:    v_exp_f16_sdwa v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD
684 ; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
685 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
687 ; GFX9-LABEL: v_pow_v2f16_fneg_rhs:
688 ; GFX9:       ; %bb.0:
689 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
690 ; GFX9-NEXT:    v_log_f16_e32 v2, v0
691 ; GFX9-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
692 ; GFX9-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
693 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v3, v1
694 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v2, v2
695 ; GFX9-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
696 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v0, v0
697 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
698 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v2, v2
699 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
700 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v0, v0
701 ; GFX9-NEXT:    v_exp_f16_e32 v1, v2
702 ; GFX9-NEXT:    v_exp_f16_e32 v0, v0
703 ; GFX9-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
704 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
706 ; GFX10-LABEL: v_pow_v2f16_fneg_rhs:
707 ; GFX10:       ; %bb.0:
708 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
709 ; GFX10-NEXT:    v_log_f16_e32 v2, v0
710 ; GFX10-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
711 ; GFX10-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
712 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v3, v1
713 ; GFX10-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
714 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v2, v2
715 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v0
716 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
717 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
718 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v2, v2
719 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0
720 ; GFX10-NEXT:    v_exp_f16_e32 v1, v2
721 ; GFX10-NEXT:    v_exp_f16_e32 v0, v0
722 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff, v1
723 ; GFX10-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
724 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
726 ; GFX11-LABEL: v_pow_v2f16_fneg_rhs:
727 ; GFX11:       ; %bb.0:
728 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
729 ; GFX11-NEXT:    v_log_f16_e32 v2, v0
730 ; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
731 ; GFX11-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
732 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_1)
733 ; GFX11-NEXT:    v_log_f16_e32 v0, v0
734 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
735 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v1, v1
736 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
737 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v2, v2
738 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v3, v3
739 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v0, v0
740 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
741 ; GFX11-NEXT:    v_dual_mul_dx9_zero_f32 v1, v2, v1 :: v_dual_mul_dx9_zero_f32 v0, v0, v3
742 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v1, v1
743 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
744 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v0, v0
745 ; GFX11-NEXT:    v_exp_f16_e32 v1, v1
746 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)
747 ; GFX11-NEXT:    v_exp_f16_e32 v0, v0
748 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
749 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff, v1
750 ; GFX11-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
751 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
752   %y.fneg = fneg <2 x half> %y
753   %pow = call <2 x half> @llvm.pow.v2f16(<2 x half> %x, <2 x half> %y.fneg)
754   ret <2 x half> %pow
757 define <2 x half> @v_pow_v2f16_fneg_lhs_rhs(<2 x half> %x, <2 x half> %y) {
758 ; GFX6-LABEL: v_pow_v2f16_fneg_lhs_rhs:
759 ; GFX6:       ; %bb.0:
760 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
761 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
762 ; GFX6-NEXT:    v_and_b32_e32 v0, 0xffff, v0
763 ; GFX6-NEXT:    v_or_b32_e32 v0, v1, v0
764 ; GFX6-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
765 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 16, v3
766 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v3, v0
767 ; GFX6-NEXT:    v_and_b32_e32 v2, 0xffff, v2
768 ; GFX6-NEXT:    v_or_b32_e32 v1, v1, v2
769 ; GFX6-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
770 ; GFX6-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
771 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v0, v0
772 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v2, v1
773 ; GFX6-NEXT:    v_log_f32_e32 v3, v3
774 ; GFX6-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
775 ; GFX6-NEXT:    v_cvt_f32_f16_e32 v1, v1
776 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
777 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v2, v3, v2
778 ; GFX6-NEXT:    v_mov_b32_e32 v3, 0xc2fc0000
779 ; GFX6-NEXT:    v_mov_b32_e32 v4, 0x42800000
780 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v2, v3
781 ; GFX6-NEXT:    v_cndmask_b32_e32 v5, 0, v4, vcc
782 ; GFX6-NEXT:    v_add_f32_e32 v2, v2, v5
783 ; GFX6-NEXT:    v_not_b32_e32 v5, 63
784 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
785 ; GFX6-NEXT:    v_cndmask_b32_e32 v6, 0, v5, vcc
786 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v3
787 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v4, vcc
788 ; GFX6-NEXT:    v_exp_f32_e32 v2, v2
789 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
790 ; GFX6-NEXT:    v_exp_f32_e32 v1, v0
791 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v2, v6
792 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v5, vcc
793 ; GFX6-NEXT:    v_ldexp_f32_e32 v1, v1, v2
794 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v0, v0
795 ; GFX6-NEXT:    v_cvt_f16_f32_e32 v1, v1
796 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
798 ; GFX8-LABEL: v_pow_v2f16_fneg_lhs_rhs:
799 ; GFX8:       ; %bb.0:
800 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
801 ; GFX8-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
802 ; GFX8-NEXT:    v_log_f16_e32 v2, v0
803 ; GFX8-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
804 ; GFX8-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
805 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v3, v1
806 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v2, v2
807 ; GFX8-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
808 ; GFX8-NEXT:    v_cvt_f32_f16_e32 v0, v0
809 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
810 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v2, v2
811 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
812 ; GFX8-NEXT:    v_cvt_f16_f32_e32 v0, v0
813 ; GFX8-NEXT:    v_exp_f16_e32 v1, v2
814 ; GFX8-NEXT:    v_exp_f16_sdwa v0, v0 dst_sel:WORD_1 dst_unused:UNUSED_PAD src0_sel:DWORD
815 ; GFX8-NEXT:    v_or_b32_e32 v0, v1, v0
816 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
818 ; GFX9-LABEL: v_pow_v2f16_fneg_lhs_rhs:
819 ; GFX9:       ; %bb.0:
820 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
821 ; GFX9-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
822 ; GFX9-NEXT:    v_log_f16_e32 v2, v0
823 ; GFX9-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
824 ; GFX9-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
825 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v3, v1
826 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v2, v2
827 ; GFX9-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
828 ; GFX9-NEXT:    v_cvt_f32_f16_e32 v0, v0
829 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
830 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v2, v2
831 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
832 ; GFX9-NEXT:    v_cvt_f16_f32_e32 v0, v0
833 ; GFX9-NEXT:    v_exp_f16_e32 v1, v2
834 ; GFX9-NEXT:    v_exp_f16_e32 v0, v0
835 ; GFX9-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
836 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
838 ; GFX10-LABEL: v_pow_v2f16_fneg_lhs_rhs:
839 ; GFX10:       ; %bb.0:
840 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
841 ; GFX10-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
842 ; GFX10-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
843 ; GFX10-NEXT:    v_log_f16_e32 v2, v0
844 ; GFX10-NEXT:    v_log_f16_sdwa v0, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
845 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v3, v1
846 ; GFX10-NEXT:    v_cvt_f32_f16_sdwa v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1
847 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v2, v2
848 ; GFX10-NEXT:    v_cvt_f32_f16_e32 v0, v0
849 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v2, v2, v3
850 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
851 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v2, v2
852 ; GFX10-NEXT:    v_cvt_f16_f32_e32 v0, v0
853 ; GFX10-NEXT:    v_exp_f16_e32 v1, v2
854 ; GFX10-NEXT:    v_exp_f16_e32 v0, v0
855 ; GFX10-NEXT:    v_and_b32_e32 v1, 0xffff, v1
856 ; GFX10-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
857 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
859 ; GFX11-LABEL: v_pow_v2f16_fneg_lhs_rhs:
860 ; GFX11:       ; %bb.0:
861 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
862 ; GFX11-NEXT:    v_xor_b32_e32 v0, 0x80008000, v0
863 ; GFX11-NEXT:    v_xor_b32_e32 v1, 0x80008000, v1
864 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_1) | instid1(VALU_DEP_2)
865 ; GFX11-NEXT:    v_log_f16_e32 v2, v0
866 ; GFX11-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
867 ; GFX11-NEXT:    v_lshrrev_b32_e32 v3, 16, v1
868 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v1, v1
869 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_3) | instskip(NEXT) | instid1(VALU_DEP_2)
870 ; GFX11-NEXT:    v_log_f16_e32 v0, v0
871 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v3, v3
872 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
873 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v2, v2
874 ; GFX11-NEXT:    v_cvt_f32_f16_e32 v0, v0
875 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
876 ; GFX11-NEXT:    v_dual_mul_dx9_zero_f32 v1, v2, v1 :: v_dual_mul_dx9_zero_f32 v0, v0, v3
877 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v1, v1
878 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(NEXT) | instid1(VALU_DEP_2)
879 ; GFX11-NEXT:    v_cvt_f16_f32_e32 v0, v0
880 ; GFX11-NEXT:    v_exp_f16_e32 v1, v1
881 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_2) | instid1(VALU_DEP_1)
882 ; GFX11-NEXT:    v_exp_f16_e32 v0, v0
883 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
884 ; GFX11-NEXT:    v_and_b32_e32 v1, 0xffff, v1
885 ; GFX11-NEXT:    v_lshl_or_b32 v0, v0, 16, v1
886 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
887   %x.fneg = fneg <2 x half> %x
888   %y.fneg = fneg <2 x half> %y
889   %pow = call <2 x half> @llvm.pow.v2f16(<2 x half> %x.fneg, <2 x half> %y.fneg)
890   ret <2 x half> %pow
893 ; FIXME
894 ; define double @v_pow_f64(double %x, double %y) {
895 ;   %pow = call double @llvm.pow.f64(double %x, double %y)
896 ;   ret double %pow
897 ; }
899 define float @v_pow_f32_fabs_lhs(float %x, float %y) {
900 ; GFX6-LABEL: v_pow_f32_fabs_lhs:
901 ; GFX6:       ; %bb.0:
902 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
903 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x800000
904 ; GFX6-NEXT:    v_cmp_lt_f32_e64 vcc, |v0|, v2
905 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
906 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
907 ; GFX6-NEXT:    v_ldexp_f32_e64 v0, |v0|, v2
908 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
909 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42000000
910 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
911 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v2
912 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
913 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
914 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
915 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
916 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
917 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
918 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
919 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
920 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
921 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
922 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
924 ; GFX8-LABEL: v_pow_f32_fabs_lhs:
925 ; GFX8:       ; %bb.0:
926 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
927 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x800000
928 ; GFX8-NEXT:    v_cmp_lt_f32_e64 vcc, |v0|, v2
929 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
930 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
931 ; GFX8-NEXT:    v_ldexp_f32 v0, |v0|, v2
932 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
933 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42000000
934 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
935 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v2
936 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
937 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
938 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
939 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
940 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
941 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
942 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
943 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
944 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
945 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
946 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
948 ; GFX9-LABEL: v_pow_f32_fabs_lhs:
949 ; GFX9:       ; %bb.0:
950 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
951 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x800000
952 ; GFX9-NEXT:    v_cmp_lt_f32_e64 vcc, |v0|, v2
953 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
954 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
955 ; GFX9-NEXT:    v_ldexp_f32 v0, |v0|, v2
956 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
957 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42000000
958 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
959 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v2
960 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
961 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
962 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
963 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
964 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
965 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
966 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
967 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
968 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
969 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
970 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
972 ; GFX10-LABEL: v_pow_f32_fabs_lhs:
973 ; GFX10:       ; %bb.0:
974 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
975 ; GFX10-NEXT:    v_cmp_gt_f32_e64 s4, 0x800000, |v0|
976 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s4
977 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
978 ; GFX10-NEXT:    v_ldexp_f32 v0, |v0|, v2
979 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, s4
980 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
981 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v2
982 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
983 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
984 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
985 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
986 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
987 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
988 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
989 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
991 ; GFX11-LABEL: v_pow_f32_fabs_lhs:
992 ; GFX11:       ; %bb.0:
993 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
994 ; GFX11-NEXT:    v_cmp_gt_f32_e64 s0, 0x800000, |v0|
995 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
996 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s0
997 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
998 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
999 ; GFX11-NEXT:    v_ldexp_f32 v0, |v0|, v2
1000 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, s0
1001 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
1002 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1003 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v2
1004 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1005 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, v0, v1
1006 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1007 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1008 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1009 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
1010 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1011 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
1012 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1013 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1014 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1015   %fabs.x = call float @llvm.fabs.f32(float %x)
1016   %pow = call float @llvm.pow.f32(float %fabs.x, float %y)
1017   ret float %pow
1020 define float @v_pow_f32_fabs_rhs(float %x, float %y) {
1021 ; GFX6-LABEL: v_pow_f32_fabs_rhs:
1022 ; GFX6:       ; %bb.0:
1023 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1024 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x800000
1025 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
1026 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1027 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1028 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v2
1029 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
1030 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42000000
1031 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1032 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v2
1033 ; GFX6-NEXT:    v_mul_legacy_f32_e64 v0, v0, |v1|
1034 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1035 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
1036 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1037 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1038 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
1039 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
1040 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
1041 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1042 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
1043 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1045 ; GFX8-LABEL: v_pow_f32_fabs_rhs:
1046 ; GFX8:       ; %bb.0:
1047 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1048 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x800000
1049 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
1050 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1051 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1052 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v2
1053 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
1054 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42000000
1055 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1056 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v2
1057 ; GFX8-NEXT:    v_mul_legacy_f32_e64 v0, v0, |v1|
1058 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1059 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
1060 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1061 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1062 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
1063 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
1064 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
1065 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1066 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
1067 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1069 ; GFX9-LABEL: v_pow_f32_fabs_rhs:
1070 ; GFX9:       ; %bb.0:
1071 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1072 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x800000
1073 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
1074 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1075 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1076 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v2
1077 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
1078 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42000000
1079 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1080 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v2
1081 ; GFX9-NEXT:    v_mul_legacy_f32_e64 v0, v0, |v1|
1082 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1083 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
1084 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1085 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1086 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
1087 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
1088 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
1089 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1090 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
1091 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1093 ; GFX10-LABEL: v_pow_f32_fabs_rhs:
1094 ; GFX10:       ; %bb.0:
1095 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1096 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
1097 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1098 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1099 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v2
1100 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, vcc_lo
1101 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
1102 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v2
1103 ; GFX10-NEXT:    v_mul_legacy_f32_e64 v0, v0, |v1|
1104 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1105 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1106 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
1107 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1108 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
1109 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
1110 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1112 ; GFX11-LABEL: v_pow_f32_fabs_rhs:
1113 ; GFX11:       ; %bb.0:
1114 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1115 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
1116 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1117 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1118 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1119 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v2
1120 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, vcc_lo
1121 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
1122 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
1123 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1124 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v2
1125 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e64 v0, v0, |v1|
1126 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
1127 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1128 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1129 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
1130 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1131 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1132 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
1133 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1134 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1135 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1136   %fabs.y = call float @llvm.fabs.f32(float %y)
1137   %pow = call float @llvm.pow.f32(float %x, float %fabs.y)
1138   ret float %pow
1141 define float @v_pow_f32_fabs_lhs_rhs(float %x, float %y) {
1142 ; GFX6-LABEL: v_pow_f32_fabs_lhs_rhs:
1143 ; GFX6:       ; %bb.0:
1144 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1145 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x800000
1146 ; GFX6-NEXT:    v_cmp_lt_f32_e64 vcc, |v0|, v2
1147 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1148 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1149 ; GFX6-NEXT:    v_ldexp_f32_e64 v0, |v0|, v2
1150 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
1151 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42000000
1152 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1153 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v2
1154 ; GFX6-NEXT:    v_mul_legacy_f32_e64 v0, v0, |v1|
1155 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1156 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
1157 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1158 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1159 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
1160 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
1161 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
1162 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1163 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
1164 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1166 ; GFX8-LABEL: v_pow_f32_fabs_lhs_rhs:
1167 ; GFX8:       ; %bb.0:
1168 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1169 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x800000
1170 ; GFX8-NEXT:    v_cmp_lt_f32_e64 vcc, |v0|, v2
1171 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1172 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1173 ; GFX8-NEXT:    v_ldexp_f32 v0, |v0|, v2
1174 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
1175 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42000000
1176 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1177 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v2
1178 ; GFX8-NEXT:    v_mul_legacy_f32_e64 v0, v0, |v1|
1179 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1180 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
1181 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1182 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1183 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
1184 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
1185 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
1186 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1187 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
1188 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1190 ; GFX9-LABEL: v_pow_f32_fabs_lhs_rhs:
1191 ; GFX9:       ; %bb.0:
1192 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1193 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x800000
1194 ; GFX9-NEXT:    v_cmp_lt_f32_e64 vcc, |v0|, v2
1195 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1196 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1197 ; GFX9-NEXT:    v_ldexp_f32 v0, |v0|, v2
1198 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
1199 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42000000
1200 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1201 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v2
1202 ; GFX9-NEXT:    v_mul_legacy_f32_e64 v0, v0, |v1|
1203 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1204 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
1205 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1206 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1207 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
1208 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
1209 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
1210 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1211 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
1212 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1214 ; GFX10-LABEL: v_pow_f32_fabs_lhs_rhs:
1215 ; GFX10:       ; %bb.0:
1216 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1217 ; GFX10-NEXT:    v_cmp_gt_f32_e64 s4, 0x800000, |v0|
1218 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s4
1219 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1220 ; GFX10-NEXT:    v_ldexp_f32 v0, |v0|, v2
1221 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, s4
1222 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
1223 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v2
1224 ; GFX10-NEXT:    v_mul_legacy_f32_e64 v0, v0, |v1|
1225 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1226 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1227 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
1228 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1229 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
1230 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
1231 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1233 ; GFX11-LABEL: v_pow_f32_fabs_lhs_rhs:
1234 ; GFX11:       ; %bb.0:
1235 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1236 ; GFX11-NEXT:    v_cmp_gt_f32_e64 s0, 0x800000, |v0|
1237 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1238 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s0
1239 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1240 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1241 ; GFX11-NEXT:    v_ldexp_f32 v0, |v0|, v2
1242 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, s0
1243 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
1244 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1245 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v2
1246 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1247 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e64 v0, v0, |v1|
1248 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1249 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1250 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1251 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
1252 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1253 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
1254 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1255 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1256 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1257   %fabs.x = call float @llvm.fabs.f32(float %x)
1258   %fabs.y = call float @llvm.fabs.f32(float %y)
1259   %pow = call float @llvm.pow.f32(float %fabs.x, float %fabs.y)
1260   ret float %pow
1263 define amdgpu_ps float @v_pow_f32_sgpr_vgpr(float inreg %x, float %y) {
1264 ; GFX6-LABEL: v_pow_f32_sgpr_vgpr:
1265 ; GFX6:       ; %bb.0:
1266 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0x800000
1267 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, s0, v1
1268 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1269 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1270 ; GFX6-NEXT:    v_ldexp_f32_e32 v1, s0, v1
1271 ; GFX6-NEXT:    v_log_f32_e32 v1, v1
1272 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42000000
1273 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1274 ; GFX6-NEXT:    v_sub_f32_e32 v1, v1, v2
1275 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v1, v0
1276 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1277 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
1278 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1279 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1280 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
1281 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
1282 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
1283 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1284 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
1285 ; GFX6-NEXT:    ; return to shader part epilog
1287 ; GFX8-LABEL: v_pow_f32_sgpr_vgpr:
1288 ; GFX8:       ; %bb.0:
1289 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0x800000
1290 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, s0, v1
1291 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1292 ; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1293 ; GFX8-NEXT:    v_ldexp_f32 v1, s0, v1
1294 ; GFX8-NEXT:    v_log_f32_e32 v1, v1
1295 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42000000
1296 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1297 ; GFX8-NEXT:    v_sub_f32_e32 v1, v1, v2
1298 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v1, v0
1299 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1300 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
1301 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1302 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1303 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
1304 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
1305 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
1306 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1307 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
1308 ; GFX8-NEXT:    ; return to shader part epilog
1310 ; GFX9-LABEL: v_pow_f32_sgpr_vgpr:
1311 ; GFX9:       ; %bb.0:
1312 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x800000
1313 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, s0, v1
1314 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1315 ; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1316 ; GFX9-NEXT:    v_ldexp_f32 v1, s0, v1
1317 ; GFX9-NEXT:    v_log_f32_e32 v1, v1
1318 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42000000
1319 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1320 ; GFX9-NEXT:    v_sub_f32_e32 v1, v1, v2
1321 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v1, v0
1322 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1323 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
1324 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1325 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1326 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
1327 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
1328 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
1329 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1330 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
1331 ; GFX9-NEXT:    ; return to shader part epilog
1333 ; GFX10-LABEL: v_pow_f32_sgpr_vgpr:
1334 ; GFX10:       ; %bb.0:
1335 ; GFX10-NEXT:    v_cmp_gt_f32_e64 s1, 0x800000, s0
1336 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s1
1337 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, s1
1338 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1339 ; GFX10-NEXT:    v_ldexp_f32 v1, s0, v1
1340 ; GFX10-NEXT:    v_log_f32_e32 v1, v1
1341 ; GFX10-NEXT:    v_sub_f32_e32 v1, v1, v2
1342 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v1, v0
1343 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1344 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1345 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
1346 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1347 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
1348 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
1349 ; GFX10-NEXT:    ; return to shader part epilog
1351 ; GFX11-LABEL: v_pow_f32_sgpr_vgpr:
1352 ; GFX11:       ; %bb.0:
1353 ; GFX11-NEXT:    v_cmp_gt_f32_e64 s1, 0x800000, s0
1354 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1355 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, s1
1356 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, s1
1357 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1358 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1359 ; GFX11-NEXT:    v_ldexp_f32 v1, s0, v1
1360 ; GFX11-NEXT:    v_log_f32_e32 v1, v1
1361 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1362 ; GFX11-NEXT:    v_sub_f32_e32 v1, v1, v2
1363 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1364 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, v1, v0
1365 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1366 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1367 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1368 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
1369 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1370 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
1371 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1372 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1373 ; GFX11-NEXT:    ; return to shader part epilog
1374   %pow = call float @llvm.pow.f32(float %x, float %y)
1375   ret float %pow
1378 define amdgpu_ps float @v_pow_f32_vgpr_sgpr(float %x, float inreg %y) {
1379 ; GFX6-LABEL: v_pow_f32_vgpr_sgpr:
1380 ; GFX6:       ; %bb.0:
1381 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0x800000
1382 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1383 ; GFX6-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1384 ; GFX6-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1385 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
1386 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
1387 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0x42000000
1388 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1389 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
1390 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v1
1391 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, s0, v0
1392 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1393 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1394 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1395 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
1396 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
1397 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
1398 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1399 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
1400 ; GFX6-NEXT:    ; return to shader part epilog
1402 ; GFX8-LABEL: v_pow_f32_vgpr_sgpr:
1403 ; GFX8:       ; %bb.0:
1404 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0x800000
1405 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1406 ; GFX8-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1407 ; GFX8-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1408 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
1409 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
1410 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0x42000000
1411 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1412 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
1413 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v1
1414 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, s0, v0
1415 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1416 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1417 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1418 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
1419 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
1420 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
1421 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1422 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
1423 ; GFX8-NEXT:    ; return to shader part epilog
1425 ; GFX9-LABEL: v_pow_f32_vgpr_sgpr:
1426 ; GFX9:       ; %bb.0:
1427 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x800000
1428 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1429 ; GFX9-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc
1430 ; GFX9-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1431 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
1432 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
1433 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x42000000
1434 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1435 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
1436 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v1
1437 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, s0, v0
1438 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1439 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1440 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1441 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
1442 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
1443 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
1444 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1445 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
1446 ; GFX9-NEXT:    ; return to shader part epilog
1448 ; GFX10-LABEL: v_pow_f32_vgpr_sgpr:
1449 ; GFX10:       ; %bb.0:
1450 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
1451 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc_lo
1452 ; GFX10-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1453 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
1454 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42000000, vcc_lo
1455 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
1456 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v1
1457 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, s0, v0
1458 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1459 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1460 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
1461 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1462 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
1463 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
1464 ; GFX10-NEXT:    ; return to shader part epilog
1466 ; GFX11-LABEL: v_pow_f32_vgpr_sgpr:
1467 ; GFX11:       ; %bb.0:
1468 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
1469 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 1, vcc_lo
1470 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1471 ; GFX11-NEXT:    v_lshlrev_b32_e32 v1, 5, v1
1472 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1473 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42000000, vcc_lo
1474 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
1475 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
1476 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1477 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v1
1478 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, s0, v0
1479 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
1480 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1481 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1482 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
1483 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1484 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1485 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
1486 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1487 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1488 ; GFX11-NEXT:    ; return to shader part epilog
1489   %pow = call float @llvm.pow.f32(float %x, float %y)
1490   ret float %pow
1493 define amdgpu_ps float @v_pow_f32_sgpr_sgpr(float inreg %x, float inreg %y) {
1494 ; GFX6-LABEL: v_pow_f32_sgpr_sgpr:
1495 ; GFX6:       ; %bb.0:
1496 ; GFX6-NEXT:    v_mov_b32_e32 v0, 0x800000
1497 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, s0, v0
1498 ; GFX6-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1499 ; GFX6-NEXT:    v_lshlrev_b32_e32 v0, 5, v0
1500 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, s0, v0
1501 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
1502 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0x42000000
1503 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1504 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
1505 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v1
1506 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, s1, v0
1507 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1508 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1509 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1510 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
1511 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
1512 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
1513 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1514 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
1515 ; GFX6-NEXT:    ; return to shader part epilog
1517 ; GFX8-LABEL: v_pow_f32_sgpr_sgpr:
1518 ; GFX8:       ; %bb.0:
1519 ; GFX8-NEXT:    v_mov_b32_e32 v0, 0x800000
1520 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, s0, v0
1521 ; GFX8-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1522 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 5, v0
1523 ; GFX8-NEXT:    v_ldexp_f32 v0, s0, v0
1524 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
1525 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0x42000000
1526 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1527 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
1528 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v1
1529 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, s1, v0
1530 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1531 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1532 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1533 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
1534 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
1535 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
1536 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1537 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
1538 ; GFX8-NEXT:    ; return to shader part epilog
1540 ; GFX9-LABEL: v_pow_f32_sgpr_sgpr:
1541 ; GFX9:       ; %bb.0:
1542 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x800000
1543 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, s0, v0
1544 ; GFX9-NEXT:    v_cndmask_b32_e64 v0, 0, 1, vcc
1545 ; GFX9-NEXT:    v_lshlrev_b32_e32 v0, 5, v0
1546 ; GFX9-NEXT:    v_ldexp_f32 v0, s0, v0
1547 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
1548 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0x42000000
1549 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1550 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
1551 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v1
1552 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, s1, v0
1553 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1554 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1555 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1556 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
1557 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
1558 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
1559 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1560 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
1561 ; GFX9-NEXT:    ; return to shader part epilog
1563 ; GFX10-LABEL: v_pow_f32_sgpr_sgpr:
1564 ; GFX10:       ; %bb.0:
1565 ; GFX10-NEXT:    v_cmp_gt_f32_e64 s2, 0x800000, s0
1566 ; GFX10-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s2
1567 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42000000, s2
1568 ; GFX10-NEXT:    v_lshlrev_b32_e32 v0, 5, v0
1569 ; GFX10-NEXT:    v_ldexp_f32 v0, s0, v0
1570 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
1571 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v1
1572 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, s1, v0
1573 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1574 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1575 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
1576 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1577 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
1578 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
1579 ; GFX10-NEXT:    ; return to shader part epilog
1581 ; GFX11-LABEL: v_pow_f32_sgpr_sgpr:
1582 ; GFX11:       ; %bb.0:
1583 ; GFX11-NEXT:    v_cmp_gt_f32_e64 s2, 0x800000, s0
1584 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1585 ; GFX11-NEXT:    v_cndmask_b32_e64 v0, 0, 1, s2
1586 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42000000, s2
1587 ; GFX11-NEXT:    v_lshlrev_b32_e32 v0, 5, v0
1588 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1589 ; GFX11-NEXT:    v_ldexp_f32 v0, s0, v0
1590 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
1591 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1592 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v1
1593 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1594 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, s1, v0
1595 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1596 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1597 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1598 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
1599 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1600 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
1601 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1602 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1603 ; GFX11-NEXT:    ; return to shader part epilog
1604   %pow = call float @llvm.pow.f32(float %x, float %y)
1605   ret float %pow
1608 define float @v_pow_f32_fneg_lhs(float %x, float %y) {
1609 ; GFX6-LABEL: v_pow_f32_fneg_lhs:
1610 ; GFX6:       ; %bb.0:
1611 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1612 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x800000
1613 ; GFX6-NEXT:    v_cmp_lt_f32_e64 vcc, -v0, v2
1614 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1615 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1616 ; GFX6-NEXT:    v_ldexp_f32_e64 v0, -v0, v2
1617 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
1618 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42000000
1619 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1620 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v2
1621 ; GFX6-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
1622 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1623 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
1624 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1625 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1626 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
1627 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
1628 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
1629 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1630 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
1631 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1633 ; GFX8-LABEL: v_pow_f32_fneg_lhs:
1634 ; GFX8:       ; %bb.0:
1635 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1636 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x800000
1637 ; GFX8-NEXT:    v_cmp_lt_f32_e64 vcc, -v0, v2
1638 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1639 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1640 ; GFX8-NEXT:    v_ldexp_f32 v0, -v0, v2
1641 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
1642 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42000000
1643 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1644 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v2
1645 ; GFX8-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
1646 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1647 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
1648 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1649 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1650 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
1651 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
1652 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
1653 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1654 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
1655 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1657 ; GFX9-LABEL: v_pow_f32_fneg_lhs:
1658 ; GFX9:       ; %bb.0:
1659 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1660 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x800000
1661 ; GFX9-NEXT:    v_cmp_lt_f32_e64 vcc, -v0, v2
1662 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1663 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1664 ; GFX9-NEXT:    v_ldexp_f32 v0, -v0, v2
1665 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
1666 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42000000
1667 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1668 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v2
1669 ; GFX9-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
1670 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1671 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
1672 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1673 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1674 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
1675 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
1676 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
1677 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1678 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
1679 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1681 ; GFX10-LABEL: v_pow_f32_fneg_lhs:
1682 ; GFX10:       ; %bb.0:
1683 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1684 ; GFX10-NEXT:    v_cmp_gt_f32_e64 s4, 0x800000, -v0
1685 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s4
1686 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1687 ; GFX10-NEXT:    v_ldexp_f32 v0, -v0, v2
1688 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, s4
1689 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
1690 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v2
1691 ; GFX10-NEXT:    v_mul_legacy_f32_e32 v0, v0, v1
1692 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1693 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1694 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
1695 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1696 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
1697 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
1698 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1700 ; GFX11-LABEL: v_pow_f32_fneg_lhs:
1701 ; GFX11:       ; %bb.0:
1702 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1703 ; GFX11-NEXT:    v_cmp_gt_f32_e64 s0, 0x800000, -v0
1704 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1705 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, s0
1706 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1707 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1708 ; GFX11-NEXT:    v_ldexp_f32 v0, -v0, v2
1709 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, s0
1710 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
1711 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1712 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v2
1713 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1714 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e32 v0, v0, v1
1715 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1716 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1717 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_2)
1718 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
1719 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1720 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
1721 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1722 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1723 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1724   %neg.x = fneg float %x
1725   %pow = call float @llvm.pow.f32(float %neg.x, float %y)
1726   ret float %pow
1729 define float @v_pow_f32_fneg_rhs(float %x, float %y) {
1730 ; GFX6-LABEL: v_pow_f32_fneg_rhs:
1731 ; GFX6:       ; %bb.0:
1732 ; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1733 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x800000
1734 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
1735 ; GFX6-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1736 ; GFX6-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1737 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v2
1738 ; GFX6-NEXT:    v_log_f32_e32 v0, v0
1739 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42000000
1740 ; GFX6-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1741 ; GFX6-NEXT:    v_sub_f32_e32 v0, v0, v2
1742 ; GFX6-NEXT:    v_mul_legacy_f32_e64 v0, v0, -v1
1743 ; GFX6-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1744 ; GFX6-NEXT:    v_mov_b32_e32 v2, 0x42800000
1745 ; GFX6-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1746 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1747 ; GFX6-NEXT:    v_add_f32_e32 v0, v0, v1
1748 ; GFX6-NEXT:    v_exp_f32_e32 v0, v0
1749 ; GFX6-NEXT:    v_not_b32_e32 v1, 63
1750 ; GFX6-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1751 ; GFX6-NEXT:    v_ldexp_f32_e32 v0, v0, v1
1752 ; GFX6-NEXT:    s_setpc_b64 s[30:31]
1754 ; GFX8-LABEL: v_pow_f32_fneg_rhs:
1755 ; GFX8:       ; %bb.0:
1756 ; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1757 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x800000
1758 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
1759 ; GFX8-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1760 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1761 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v2
1762 ; GFX8-NEXT:    v_log_f32_e32 v0, v0
1763 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42000000
1764 ; GFX8-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1765 ; GFX8-NEXT:    v_sub_f32_e32 v0, v0, v2
1766 ; GFX8-NEXT:    v_mul_legacy_f32_e64 v0, v0, -v1
1767 ; GFX8-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1768 ; GFX8-NEXT:    v_mov_b32_e32 v2, 0x42800000
1769 ; GFX8-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1770 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1771 ; GFX8-NEXT:    v_add_f32_e32 v0, v0, v1
1772 ; GFX8-NEXT:    v_exp_f32_e32 v0, v0
1773 ; GFX8-NEXT:    v_not_b32_e32 v1, 63
1774 ; GFX8-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1775 ; GFX8-NEXT:    v_ldexp_f32 v0, v0, v1
1776 ; GFX8-NEXT:    s_setpc_b64 s[30:31]
1778 ; GFX9-LABEL: v_pow_f32_fneg_rhs:
1779 ; GFX9:       ; %bb.0:
1780 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1781 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x800000
1782 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v2
1783 ; GFX9-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc
1784 ; GFX9-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1785 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v2
1786 ; GFX9-NEXT:    v_log_f32_e32 v0, v0
1787 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42000000
1788 ; GFX9-NEXT:    v_cndmask_b32_e32 v2, 0, v2, vcc
1789 ; GFX9-NEXT:    v_sub_f32_e32 v0, v0, v2
1790 ; GFX9-NEXT:    v_mul_legacy_f32_e64 v0, v0, -v1
1791 ; GFX9-NEXT:    v_mov_b32_e32 v1, 0xc2fc0000
1792 ; GFX9-NEXT:    v_mov_b32_e32 v2, 0x42800000
1793 ; GFX9-NEXT:    v_cmp_lt_f32_e32 vcc, v0, v1
1794 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v2, vcc
1795 ; GFX9-NEXT:    v_add_f32_e32 v0, v0, v1
1796 ; GFX9-NEXT:    v_exp_f32_e32 v0, v0
1797 ; GFX9-NEXT:    v_not_b32_e32 v1, 63
1798 ; GFX9-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
1799 ; GFX9-NEXT:    v_ldexp_f32 v0, v0, v1
1800 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
1802 ; GFX10-LABEL: v_pow_f32_fneg_rhs:
1803 ; GFX10:       ; %bb.0:
1804 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1805 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
1806 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1807 ; GFX10-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1808 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v2
1809 ; GFX10-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, vcc_lo
1810 ; GFX10-NEXT:    v_log_f32_e32 v0, v0
1811 ; GFX10-NEXT:    v_sub_f32_e32 v0, v0, v2
1812 ; GFX10-NEXT:    v_mul_legacy_f32_e64 v0, v0, -v1
1813 ; GFX10-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1814 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1815 ; GFX10-NEXT:    v_add_f32_e32 v0, v0, v1
1816 ; GFX10-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1817 ; GFX10-NEXT:    v_exp_f32_e32 v0, v0
1818 ; GFX10-NEXT:    v_ldexp_f32 v0, v0, v1
1819 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
1821 ; GFX11-LABEL: v_pow_f32_fneg_rhs:
1822 ; GFX11:       ; %bb.0:
1823 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
1824 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0x800000, v0
1825 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 1, vcc_lo
1826 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(NEXT) | instid1(VALU_DEP_1)
1827 ; GFX11-NEXT:    v_lshlrev_b32_e32 v2, 5, v2
1828 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v2
1829 ; GFX11-NEXT:    v_cndmask_b32_e64 v2, 0, 0x42000000, vcc_lo
1830 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2) | instskip(SKIP_2) | instid1(VALU_DEP_1)
1831 ; GFX11-NEXT:    v_log_f32_e32 v0, v0
1832 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1833 ; GFX11-NEXT:    v_sub_f32_e32 v0, v0, v2
1834 ; GFX11-NEXT:    v_mul_dx9_zero_f32_e64 v0, v0, -v1
1835 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
1836 ; GFX11-NEXT:    v_cmp_gt_f32_e32 vcc_lo, 0xc2fc0000, v0
1837 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0x42800000, vcc_lo
1838 ; GFX11-NEXT:    v_add_f32_e32 v0, v0, v1
1839 ; GFX11-NEXT:    v_cndmask_b32_e64 v1, 0, 0xffffffc0, vcc_lo
1840 ; GFX11-NEXT:    s_delay_alu instid0(VALU_DEP_2)
1841 ; GFX11-NEXT:    v_exp_f32_e32 v0, v0
1842 ; GFX11-NEXT:    s_waitcnt_depctr 0xfff
1843 ; GFX11-NEXT:    v_ldexp_f32 v0, v0, v1
1844 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
1845   %neg.y = fneg float %y
1846   %pow = call float @llvm.pow.f32(float %x, float %neg.y)
1847   ret float %pow
1850 declare half @llvm.pow.f16(half, half)
1851 declare float @llvm.pow.f32(float, float)
1852 declare double @llvm.pow.f64(double, double)
1854 declare half @llvm.fabs.f16(half)
1855 declare float @llvm.fabs.f32(float)
1857 declare <2 x half> @llvm.pow.v2f16(<2 x half>, <2 x half>)
1858 declare <2 x float> @llvm.pow.v2f32(<2 x float>, <2 x float>)