xref: /llvm-project/llvm/test/CodeGen/AMDGPU/strict_ldexp.f32.ll (revision 9e9907f1cfa424366fba58d9520f9305b537cec9)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6,GFX6-SDAG %s
3; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,GFX8,GFX8-SDAG %s
4; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9-SDAG %s
5; RUN: llc -global-isel=0 -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-SDAG %s
6
7; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tahiti < %s | FileCheck -check-prefixes=GCN,GFX6,GFX6-GISEL %s
8; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=tonga < %s | FileCheck -check-prefixes=GCN,GFX8,GFX8-GISEL %s
9; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx900 < %s | FileCheck -check-prefixes=GCN,GFX9,GFX9-GISEL %s
10; RUN: llc -global-isel=1 -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -check-prefixes=GCN,GFX11,GFX11-GISEL %s
11
12; define float @test_ldexp_f32_i16(ptr addrspace(1) %out, float %a, i16 %b) #0 {
13;   %result = call float @llvm.experimental.constrained.ldexp.f32.i16(float %a, i16 %b, metadata !"round.dynamic", metadata !"fpexcept.strict")
14;   ret float %result
15; }
16
17define float @test_ldexp_f32_i32(ptr addrspace(1) %out, float %a, i32 %b) #0 {
18; GFX6-LABEL: test_ldexp_f32_i32:
19; GFX6:       ; %bb.0:
20; GFX6-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
21; GFX6-NEXT:    v_ldexp_f32_e32 v0, v2, v3
22; GFX6-NEXT:    s_setpc_b64 s[30:31]
23;
24; GFX8-LABEL: test_ldexp_f32_i32:
25; GFX8:       ; %bb.0:
26; GFX8-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
27; GFX8-NEXT:    v_ldexp_f32 v0, v2, v3
28; GFX8-NEXT:    s_setpc_b64 s[30:31]
29;
30; GFX9-LABEL: test_ldexp_f32_i32:
31; GFX9:       ; %bb.0:
32; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
33; GFX9-NEXT:    v_ldexp_f32 v0, v2, v3
34; GFX9-NEXT:    s_setpc_b64 s[30:31]
35;
36; GFX11-LABEL: test_ldexp_f32_i32:
37; GFX11:       ; %bb.0:
38; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
39; GFX11-NEXT:    v_ldexp_f32 v0, v2, v3
40; GFX11-NEXT:    s_setpc_b64 s[30:31]
41  %result = call float @llvm.experimental.constrained.ldexp.f32.i32(float %a, i32 %b, metadata !"round.dynamic", metadata !"fpexcept.strict")
42  ret float %result
43}
44
45; define <2 x float> @test_ldexp_v2f32_v2i16(ptr addrspace(1) %out, <2 x float> %a, <2 x i16> %b) #0 {
46;   %result = call <2 x float> @llvm.experimental.constrained.ldexp.v2f32.v2i16(<2 x float> %a, <2 x i16> %b, metadata !"round.dynamic", metadata !"fpexcept.strict")
47;   ret <2 x float> %result
48; }
49
50define <2 x float> @test_ldexp_v2f32_v2i32(ptr addrspace(1) %out, <2 x float> %a, <2 x i32> %b) #0 {
51; GFX6-SDAG-LABEL: test_ldexp_v2f32_v2i32:
52; GFX6-SDAG:       ; %bb.0:
53; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
54; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v3, v5
55; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v2, v4
56; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
57;
58; GFX8-SDAG-LABEL: test_ldexp_v2f32_v2i32:
59; GFX8-SDAG:       ; %bb.0:
60; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
61; GFX8-SDAG-NEXT:    v_ldexp_f32 v1, v3, v5
62; GFX8-SDAG-NEXT:    v_ldexp_f32 v0, v2, v4
63; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
64;
65; GFX9-SDAG-LABEL: test_ldexp_v2f32_v2i32:
66; GFX9-SDAG:       ; %bb.0:
67; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
68; GFX9-SDAG-NEXT:    v_ldexp_f32 v1, v3, v5
69; GFX9-SDAG-NEXT:    v_ldexp_f32 v0, v2, v4
70; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
71;
72; GFX11-LABEL: test_ldexp_v2f32_v2i32:
73; GFX11:       ; %bb.0:
74; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
75; GFX11-NEXT:    v_ldexp_f32 v0, v2, v4
76; GFX11-NEXT:    v_ldexp_f32 v1, v3, v5
77; GFX11-NEXT:    s_setpc_b64 s[30:31]
78;
79; GFX6-GISEL-LABEL: test_ldexp_v2f32_v2i32:
80; GFX6-GISEL:       ; %bb.0:
81; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
82; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v2, v4
83; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v3, v5
84; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
85;
86; GFX8-GISEL-LABEL: test_ldexp_v2f32_v2i32:
87; GFX8-GISEL:       ; %bb.0:
88; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
89; GFX8-GISEL-NEXT:    v_ldexp_f32 v0, v2, v4
90; GFX8-GISEL-NEXT:    v_ldexp_f32 v1, v3, v5
91; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
92;
93; GFX9-GISEL-LABEL: test_ldexp_v2f32_v2i32:
94; GFX9-GISEL:       ; %bb.0:
95; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
96; GFX9-GISEL-NEXT:    v_ldexp_f32 v0, v2, v4
97; GFX9-GISEL-NEXT:    v_ldexp_f32 v1, v3, v5
98; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
99  %result = call <2 x float> @llvm.experimental.constrained.ldexp.v2f32.v2i32(<2 x float> %a, <2 x i32> %b, metadata !"round.dynamic", metadata !"fpexcept.strict")
100  ret <2 x float> %result
101}
102
103define <3 x float> @test_ldexp_v3f32_v3i32(ptr addrspace(1) %out, <3 x float> %a, <3 x i32> %b) #0 {
104; GFX6-SDAG-LABEL: test_ldexp_v3f32_v3i32:
105; GFX6-SDAG:       ; %bb.0:
106; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
107; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v4, v4, v7
108; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v3, v6
109; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v2, v5
110; GFX6-SDAG-NEXT:    v_mov_b32_e32 v2, v4
111; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
112;
113; GFX8-SDAG-LABEL: test_ldexp_v3f32_v3i32:
114; GFX8-SDAG:       ; %bb.0:
115; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
116; GFX8-SDAG-NEXT:    v_ldexp_f32 v4, v4, v7
117; GFX8-SDAG-NEXT:    v_ldexp_f32 v1, v3, v6
118; GFX8-SDAG-NEXT:    v_ldexp_f32 v0, v2, v5
119; GFX8-SDAG-NEXT:    v_mov_b32_e32 v2, v4
120; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
121;
122; GFX9-SDAG-LABEL: test_ldexp_v3f32_v3i32:
123; GFX9-SDAG:       ; %bb.0:
124; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
125; GFX9-SDAG-NEXT:    v_ldexp_f32 v4, v4, v7
126; GFX9-SDAG-NEXT:    v_ldexp_f32 v1, v3, v6
127; GFX9-SDAG-NEXT:    v_ldexp_f32 v0, v2, v5
128; GFX9-SDAG-NEXT:    v_mov_b32_e32 v2, v4
129; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
130;
131; GFX11-LABEL: test_ldexp_v3f32_v3i32:
132; GFX11:       ; %bb.0:
133; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
134; GFX11-NEXT:    v_ldexp_f32 v0, v2, v5
135; GFX11-NEXT:    v_ldexp_f32 v1, v3, v6
136; GFX11-NEXT:    v_ldexp_f32 v2, v4, v7
137; GFX11-NEXT:    s_setpc_b64 s[30:31]
138;
139; GFX6-GISEL-LABEL: test_ldexp_v3f32_v3i32:
140; GFX6-GISEL:       ; %bb.0:
141; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
142; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v2, v5
143; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v3, v6
144; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v4, v7
145; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
146;
147; GFX8-GISEL-LABEL: test_ldexp_v3f32_v3i32:
148; GFX8-GISEL:       ; %bb.0:
149; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
150; GFX8-GISEL-NEXT:    v_ldexp_f32 v0, v2, v5
151; GFX8-GISEL-NEXT:    v_ldexp_f32 v1, v3, v6
152; GFX8-GISEL-NEXT:    v_ldexp_f32 v2, v4, v7
153; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
154;
155; GFX9-GISEL-LABEL: test_ldexp_v3f32_v3i32:
156; GFX9-GISEL:       ; %bb.0:
157; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
158; GFX9-GISEL-NEXT:    v_ldexp_f32 v0, v2, v5
159; GFX9-GISEL-NEXT:    v_ldexp_f32 v1, v3, v6
160; GFX9-GISEL-NEXT:    v_ldexp_f32 v2, v4, v7
161; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
162  %result = call <3 x float> @llvm.experimental.constrained.ldexp.v3f32.v3i32(<3 x float> %a, <3 x i32> %b, metadata !"round.dynamic", metadata !"fpexcept.strict")
163  ret <3 x float> %result
164}
165
166define <4 x float> @test_ldexp_v4f32_v4i32(ptr addrspace(1) %out, <4 x float> %a, <4 x i32> %b) #0 {
167; GFX6-SDAG-LABEL: test_ldexp_v4f32_v4i32:
168; GFX6-SDAG:       ; %bb.0:
169; GFX6-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
170; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v5, v5, v9
171; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v4, v4, v8
172; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v1, v3, v7
173; GFX6-SDAG-NEXT:    v_ldexp_f32_e32 v0, v2, v6
174; GFX6-SDAG-NEXT:    v_mov_b32_e32 v2, v4
175; GFX6-SDAG-NEXT:    v_mov_b32_e32 v3, v5
176; GFX6-SDAG-NEXT:    s_setpc_b64 s[30:31]
177;
178; GFX8-SDAG-LABEL: test_ldexp_v4f32_v4i32:
179; GFX8-SDAG:       ; %bb.0:
180; GFX8-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
181; GFX8-SDAG-NEXT:    v_ldexp_f32 v5, v5, v9
182; GFX8-SDAG-NEXT:    v_ldexp_f32 v4, v4, v8
183; GFX8-SDAG-NEXT:    v_ldexp_f32 v1, v3, v7
184; GFX8-SDAG-NEXT:    v_ldexp_f32 v0, v2, v6
185; GFX8-SDAG-NEXT:    v_mov_b32_e32 v2, v4
186; GFX8-SDAG-NEXT:    v_mov_b32_e32 v3, v5
187; GFX8-SDAG-NEXT:    s_setpc_b64 s[30:31]
188;
189; GFX9-SDAG-LABEL: test_ldexp_v4f32_v4i32:
190; GFX9-SDAG:       ; %bb.0:
191; GFX9-SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
192; GFX9-SDAG-NEXT:    v_ldexp_f32 v5, v5, v9
193; GFX9-SDAG-NEXT:    v_ldexp_f32 v4, v4, v8
194; GFX9-SDAG-NEXT:    v_ldexp_f32 v1, v3, v7
195; GFX9-SDAG-NEXT:    v_ldexp_f32 v0, v2, v6
196; GFX9-SDAG-NEXT:    v_mov_b32_e32 v2, v4
197; GFX9-SDAG-NEXT:    v_mov_b32_e32 v3, v5
198; GFX9-SDAG-NEXT:    s_setpc_b64 s[30:31]
199;
200; GFX11-LABEL: test_ldexp_v4f32_v4i32:
201; GFX11:       ; %bb.0:
202; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
203; GFX11-NEXT:    v_ldexp_f32 v0, v2, v6
204; GFX11-NEXT:    v_ldexp_f32 v1, v3, v7
205; GFX11-NEXT:    v_ldexp_f32 v2, v4, v8
206; GFX11-NEXT:    v_ldexp_f32 v3, v5, v9
207; GFX11-NEXT:    s_setpc_b64 s[30:31]
208;
209; GFX6-GISEL-LABEL: test_ldexp_v4f32_v4i32:
210; GFX6-GISEL:       ; %bb.0:
211; GFX6-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
212; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v0, v2, v6
213; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v1, v3, v7
214; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v2, v4, v8
215; GFX6-GISEL-NEXT:    v_ldexp_f32_e32 v3, v5, v9
216; GFX6-GISEL-NEXT:    s_setpc_b64 s[30:31]
217;
218; GFX8-GISEL-LABEL: test_ldexp_v4f32_v4i32:
219; GFX8-GISEL:       ; %bb.0:
220; GFX8-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
221; GFX8-GISEL-NEXT:    v_ldexp_f32 v0, v2, v6
222; GFX8-GISEL-NEXT:    v_ldexp_f32 v1, v3, v7
223; GFX8-GISEL-NEXT:    v_ldexp_f32 v2, v4, v8
224; GFX8-GISEL-NEXT:    v_ldexp_f32 v3, v5, v9
225; GFX8-GISEL-NEXT:    s_setpc_b64 s[30:31]
226;
227; GFX9-GISEL-LABEL: test_ldexp_v4f32_v4i32:
228; GFX9-GISEL:       ; %bb.0:
229; GFX9-GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
230; GFX9-GISEL-NEXT:    v_ldexp_f32 v0, v2, v6
231; GFX9-GISEL-NEXT:    v_ldexp_f32 v1, v3, v7
232; GFX9-GISEL-NEXT:    v_ldexp_f32 v2, v4, v8
233; GFX9-GISEL-NEXT:    v_ldexp_f32 v3, v5, v9
234; GFX9-GISEL-NEXT:    s_setpc_b64 s[30:31]
235  %result = call <4 x float> @llvm.experimental.constrained.ldexp.v4f32.v4i32(<4 x float> %a, <4 x i32> %b, metadata !"round.dynamic", metadata !"fpexcept.strict")
236  ret <4 x float> %result
237}
238
239declare float @llvm.experimental.constrained.ldexp.f32.i16(float, i16, metadata, metadata) #1
240declare float @llvm.experimental.constrained.ldexp.f32.i32(float, i32, metadata, metadata) #1
241declare <2 x float> @llvm.experimental.constrained.ldexp.v2f32.v2i16(<2 x float>, <2 x i16>, metadata, metadata) #1
242declare <2 x float> @llvm.experimental.constrained.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>, metadata, metadata) #1
243declare <3 x float> @llvm.experimental.constrained.ldexp.v3f32.v3i32(<3 x float>, <3 x i32>, metadata, metadata) #1
244declare <4 x float> @llvm.experimental.constrained.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>, metadata, metadata) #1
245
246attributes #0 = { strictfp }
247attributes #1 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
248;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
249; GCN: {{.*}}
250; GFX11-GISEL: {{.*}}
251; GFX11-SDAG: {{.*}}
252