xref: /llvm-project/llvm/test/CodeGen/VE/Scalar/fp_extload_truncstore.ll (revision 61f9cb002debd4b28d9d03c603df9bd428969cb6)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2; RUN: llc < %s -mtriple=ve-unknown-unknown | FileCheck %s
3
4declare i16 @llvm.convert.to.fp16.f32(float %a)
5declare i16 @llvm.convert.to.fp16.f64(double %a)
6
7declare float @llvm.convert.from.fp16.f32(i16 %a)
8declare double @llvm.convert.from.fp16.f64(i16 %a)
9
10define float @func_i16fp32(ptr %a) {
11; CHECK-LABEL: func_i16fp32:
12; CHECK:       # %bb.0:
13; CHECK-NEXT:    st %s9, (, %s11)
14; CHECK-NEXT:    st %s10, 8(, %s11)
15; CHECK-NEXT:    or %s9, 0, %s11
16; CHECK-NEXT:    lea %s11, -240(, %s11)
17; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB0_2
18; CHECK-NEXT:  # %bb.1:
19; CHECK-NEXT:    ld %s61, 24(, %s14)
20; CHECK-NEXT:    or %s62, 0, %s0
21; CHECK-NEXT:    lea %s63, 315
22; CHECK-NEXT:    shm.l %s63, (%s61)
23; CHECK-NEXT:    shm.l %s8, 8(%s61)
24; CHECK-NEXT:    shm.l %s11, 16(%s61)
25; CHECK-NEXT:    monc
26; CHECK-NEXT:    or %s0, 0, %s62
27; CHECK-NEXT:  .LBB0_2:
28; CHECK-NEXT:    ld2b.zx %s0, (, %s0)
29; CHECK-NEXT:    lea %s1, __gnu_h2f_ieee@lo
30; CHECK-NEXT:    and %s1, %s1, (32)0
31; CHECK-NEXT:    lea.sl %s12, __gnu_h2f_ieee@hi(, %s1)
32; CHECK-NEXT:    bsic %s10, (, %s12)
33; CHECK-NEXT:    or %s11, 0, %s9
34; CHECK-NEXT:    ld %s10, 8(, %s11)
35; CHECK-NEXT:    ld %s9, (, %s11)
36; CHECK-NEXT:    b.l.t (, %s10)
37  %a.val = load i16, ptr %a, align 4
38  %a.asd = call float @llvm.convert.from.fp16.f32(i16 %a.val)
39  ret float %a.asd
40}
41
42define double @func_i16fp64(ptr %a) {
43; CHECK-LABEL: func_i16fp64:
44; CHECK:       # %bb.0:
45; CHECK-NEXT:    st %s9, (, %s11)
46; CHECK-NEXT:    st %s10, 8(, %s11)
47; CHECK-NEXT:    or %s9, 0, %s11
48; CHECK-NEXT:    lea %s11, -240(, %s11)
49; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB1_2
50; CHECK-NEXT:  # %bb.1:
51; CHECK-NEXT:    ld %s61, 24(, %s14)
52; CHECK-NEXT:    or %s62, 0, %s0
53; CHECK-NEXT:    lea %s63, 315
54; CHECK-NEXT:    shm.l %s63, (%s61)
55; CHECK-NEXT:    shm.l %s8, 8(%s61)
56; CHECK-NEXT:    shm.l %s11, 16(%s61)
57; CHECK-NEXT:    monc
58; CHECK-NEXT:    or %s0, 0, %s62
59; CHECK-NEXT:  .LBB1_2:
60; CHECK-NEXT:    ld2b.zx %s0, (, %s0)
61; CHECK-NEXT:    lea %s1, __gnu_h2f_ieee@lo
62; CHECK-NEXT:    and %s1, %s1, (32)0
63; CHECK-NEXT:    lea.sl %s12, __gnu_h2f_ieee@hi(, %s1)
64; CHECK-NEXT:    bsic %s10, (, %s12)
65; CHECK-NEXT:    cvt.d.s %s0, %s0
66; CHECK-NEXT:    or %s11, 0, %s9
67; CHECK-NEXT:    ld %s10, 8(, %s11)
68; CHECK-NEXT:    ld %s9, (, %s11)
69; CHECK-NEXT:    b.l.t (, %s10)
70  %a.val = load i16, ptr %a, align 4
71  %a.asd = call double @llvm.convert.from.fp16.f64(i16 %a.val)
72  ret double %a.asd
73}
74
75define float @func_fp16fp32(ptr %a) {
76; CHECK-LABEL: func_fp16fp32:
77; CHECK:       # %bb.0:
78; CHECK-NEXT:    st %s9, (, %s11)
79; CHECK-NEXT:    st %s10, 8(, %s11)
80; CHECK-NEXT:    or %s9, 0, %s11
81; CHECK-NEXT:    lea %s11, -240(, %s11)
82; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB2_2
83; CHECK-NEXT:  # %bb.1:
84; CHECK-NEXT:    ld %s61, 24(, %s14)
85; CHECK-NEXT:    or %s62, 0, %s0
86; CHECK-NEXT:    lea %s63, 315
87; CHECK-NEXT:    shm.l %s63, (%s61)
88; CHECK-NEXT:    shm.l %s8, 8(%s61)
89; CHECK-NEXT:    shm.l %s11, 16(%s61)
90; CHECK-NEXT:    monc
91; CHECK-NEXT:    or %s0, 0, %s62
92; CHECK-NEXT:  .LBB2_2:
93; CHECK-NEXT:    ld2b.zx %s0, (, %s0)
94; CHECK-NEXT:    lea %s1, __gnu_h2f_ieee@lo
95; CHECK-NEXT:    and %s1, %s1, (32)0
96; CHECK-NEXT:    lea.sl %s12, __gnu_h2f_ieee@hi(, %s1)
97; CHECK-NEXT:    bsic %s10, (, %s12)
98; CHECK-NEXT:    or %s11, 0, %s9
99; CHECK-NEXT:    ld %s10, 8(, %s11)
100; CHECK-NEXT:    ld %s9, (, %s11)
101; CHECK-NEXT:    b.l.t (, %s10)
102  %a.val = load half, ptr %a, align 4
103  %a.asd = fpext half %a.val to float
104  ret float %a.asd
105}
106
107define double @func_fp16fp64(ptr %a) {
108; CHECK-LABEL: func_fp16fp64:
109; CHECK:       # %bb.0:
110; CHECK-NEXT:    st %s9, (, %s11)
111; CHECK-NEXT:    st %s10, 8(, %s11)
112; CHECK-NEXT:    or %s9, 0, %s11
113; CHECK-NEXT:    lea %s11, -240(, %s11)
114; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB3_2
115; CHECK-NEXT:  # %bb.1:
116; CHECK-NEXT:    ld %s61, 24(, %s14)
117; CHECK-NEXT:    or %s62, 0, %s0
118; CHECK-NEXT:    lea %s63, 315
119; CHECK-NEXT:    shm.l %s63, (%s61)
120; CHECK-NEXT:    shm.l %s8, 8(%s61)
121; CHECK-NEXT:    shm.l %s11, 16(%s61)
122; CHECK-NEXT:    monc
123; CHECK-NEXT:    or %s0, 0, %s62
124; CHECK-NEXT:  .LBB3_2:
125; CHECK-NEXT:    ld2b.zx %s0, (, %s0)
126; CHECK-NEXT:    lea %s1, __gnu_h2f_ieee@lo
127; CHECK-NEXT:    and %s1, %s1, (32)0
128; CHECK-NEXT:    lea.sl %s12, __gnu_h2f_ieee@hi(, %s1)
129; CHECK-NEXT:    bsic %s10, (, %s12)
130; CHECK-NEXT:    cvt.d.s %s0, %s0
131; CHECK-NEXT:    or %s11, 0, %s9
132; CHECK-NEXT:    ld %s10, 8(, %s11)
133; CHECK-NEXT:    ld %s9, (, %s11)
134; CHECK-NEXT:    b.l.t (, %s10)
135  %a.val = load half, ptr %a, align 4
136  %a.asd = fpext half %a.val to double
137  ret double %a.asd
138}
139
140define void @func_fp32i16(ptr %fl.ptr, float %val) {
141; CHECK-LABEL: func_fp32i16:
142; CHECK:       # %bb.0:
143; CHECK-NEXT:    st %s9, (, %s11)
144; CHECK-NEXT:    st %s10, 8(, %s11)
145; CHECK-NEXT:    or %s9, 0, %s11
146; CHECK-NEXT:    lea %s11, -240(, %s11)
147; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB4_2
148; CHECK-NEXT:  # %bb.1:
149; CHECK-NEXT:    ld %s61, 24(, %s14)
150; CHECK-NEXT:    or %s62, 0, %s0
151; CHECK-NEXT:    lea %s63, 315
152; CHECK-NEXT:    shm.l %s63, (%s61)
153; CHECK-NEXT:    shm.l %s8, 8(%s61)
154; CHECK-NEXT:    shm.l %s11, 16(%s61)
155; CHECK-NEXT:    monc
156; CHECK-NEXT:    or %s0, 0, %s62
157; CHECK-NEXT:  .LBB4_2:
158; CHECK-NEXT:    st %s18, 288(, %s11) # 8-byte Folded Spill
159; CHECK-NEXT:    or %s18, 0, %s0
160; CHECK-NEXT:    lea %s0, __gnu_f2h_ieee@lo
161; CHECK-NEXT:    and %s0, %s0, (32)0
162; CHECK-NEXT:    lea.sl %s12, __gnu_f2h_ieee@hi(, %s0)
163; CHECK-NEXT:    or %s0, 0, %s1
164; CHECK-NEXT:    bsic %s10, (, %s12)
165; CHECK-NEXT:    st2b %s0, (, %s18)
166; CHECK-NEXT:    ld %s18, 288(, %s11) # 8-byte Folded Reload
167; CHECK-NEXT:    or %s11, 0, %s9
168; CHECK-NEXT:    ld %s10, 8(, %s11)
169; CHECK-NEXT:    ld %s9, (, %s11)
170; CHECK-NEXT:    b.l.t (, %s10)
171  %val.asf = call i16 @llvm.convert.to.fp16.f32(float %val)
172  store i16 %val.asf, ptr %fl.ptr
173  ret void
174}
175
176define half @func_fp32fp16(ptr %fl.ptr, float %a) {
177; CHECK-LABEL: func_fp32fp16:
178; CHECK:       # %bb.0:
179; CHECK-NEXT:    st %s9, (, %s11)
180; CHECK-NEXT:    st %s10, 8(, %s11)
181; CHECK-NEXT:    or %s9, 0, %s11
182; CHECK-NEXT:    lea %s11, -240(, %s11)
183; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB5_2
184; CHECK-NEXT:  # %bb.1:
185; CHECK-NEXT:    ld %s61, 24(, %s14)
186; CHECK-NEXT:    or %s62, 0, %s0
187; CHECK-NEXT:    lea %s63, 315
188; CHECK-NEXT:    shm.l %s63, (%s61)
189; CHECK-NEXT:    shm.l %s8, 8(%s61)
190; CHECK-NEXT:    shm.l %s11, 16(%s61)
191; CHECK-NEXT:    monc
192; CHECK-NEXT:    or %s0, 0, %s62
193; CHECK-NEXT:  .LBB5_2:
194; CHECK-NEXT:    st %s18, 288(, %s11) # 8-byte Folded Spill
195; CHECK-NEXT:    st %s19, 296(, %s11) # 8-byte Folded Spill
196; CHECK-NEXT:    or %s18, 0, %s0
197; CHECK-NEXT:    lea %s0, __gnu_f2h_ieee@lo
198; CHECK-NEXT:    and %s0, %s0, (32)0
199; CHECK-NEXT:    lea.sl %s12, __gnu_f2h_ieee@hi(, %s0)
200; CHECK-NEXT:    or %s0, 0, %s1
201; CHECK-NEXT:    bsic %s10, (, %s12)
202; CHECK-NEXT:    or %s19, 0, %s0
203; CHECK-NEXT:    lea %s0, __gnu_h2f_ieee@lo
204; CHECK-NEXT:    and %s0, %s0, (32)0
205; CHECK-NEXT:    lea.sl %s12, __gnu_h2f_ieee@hi(, %s0)
206; CHECK-NEXT:    or %s0, 0, %s19
207; CHECK-NEXT:    bsic %s10, (, %s12)
208; CHECK-NEXT:    st2b %s19, (, %s18)
209; CHECK-NEXT:    ld %s19, 296(, %s11) # 8-byte Folded Reload
210; CHECK-NEXT:    ld %s18, 288(, %s11) # 8-byte Folded Reload
211; CHECK-NEXT:    or %s11, 0, %s9
212; CHECK-NEXT:    ld %s10, 8(, %s11)
213; CHECK-NEXT:    ld %s9, (, %s11)
214; CHECK-NEXT:    b.l.t (, %s10)
215  %a.asd = fptrunc float %a to half
216  store half %a.asd, ptr %fl.ptr
217  ret half %a.asd
218}
219
220define double @func_fp32fp64(ptr %a) {
221; CHECK-LABEL: func_fp32fp64:
222; CHECK:       # %bb.0:
223; CHECK-NEXT:    ldu %s0, (, %s0)
224; CHECK-NEXT:    cvt.d.s %s0, %s0
225; CHECK-NEXT:    b.l.t (, %s10)
226  %a.val = load float, ptr %a, align 4
227  %a.asd = fpext float %a.val to double
228  ret double %a.asd
229}
230
231define void @func_fp64i16(ptr %fl.ptr, double %val) {
232; CHECK-LABEL: func_fp64i16:
233; CHECK:       # %bb.0:
234; CHECK-NEXT:    st %s9, (, %s11)
235; CHECK-NEXT:    st %s10, 8(, %s11)
236; CHECK-NEXT:    or %s9, 0, %s11
237; CHECK-NEXT:    lea %s11, -240(, %s11)
238; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB7_2
239; CHECK-NEXT:  # %bb.1:
240; CHECK-NEXT:    ld %s61, 24(, %s14)
241; CHECK-NEXT:    or %s62, 0, %s0
242; CHECK-NEXT:    lea %s63, 315
243; CHECK-NEXT:    shm.l %s63, (%s61)
244; CHECK-NEXT:    shm.l %s8, 8(%s61)
245; CHECK-NEXT:    shm.l %s11, 16(%s61)
246; CHECK-NEXT:    monc
247; CHECK-NEXT:    or %s0, 0, %s62
248; CHECK-NEXT:  .LBB7_2:
249; CHECK-NEXT:    st %s18, 288(, %s11) # 8-byte Folded Spill
250; CHECK-NEXT:    or %s18, 0, %s0
251; CHECK-NEXT:    lea %s0, __truncdfhf2@lo
252; CHECK-NEXT:    and %s0, %s0, (32)0
253; CHECK-NEXT:    lea.sl %s12, __truncdfhf2@hi(, %s0)
254; CHECK-NEXT:    or %s0, 0, %s1
255; CHECK-NEXT:    bsic %s10, (, %s12)
256; CHECK-NEXT:    st2b %s0, (, %s18)
257; CHECK-NEXT:    ld %s18, 288(, %s11) # 8-byte Folded Reload
258; CHECK-NEXT:    or %s11, 0, %s9
259; CHECK-NEXT:    ld %s10, 8(, %s11)
260; CHECK-NEXT:    ld %s9, (, %s11)
261; CHECK-NEXT:    b.l.t (, %s10)
262  %val.asf = call i16 @llvm.convert.to.fp16.f64(double %val)
263  store i16 %val.asf, ptr %fl.ptr
264  ret void
265}
266
267define void @func_fp64fp16(ptr %fl.ptr, double %val) {
268; CHECK-LABEL: func_fp64fp16:
269; CHECK:       # %bb.0:
270; CHECK-NEXT:    st %s9, (, %s11)
271; CHECK-NEXT:    st %s10, 8(, %s11)
272; CHECK-NEXT:    or %s9, 0, %s11
273; CHECK-NEXT:    lea %s11, -240(, %s11)
274; CHECK-NEXT:    brge.l.t %s11, %s8, .LBB8_2
275; CHECK-NEXT:  # %bb.1:
276; CHECK-NEXT:    ld %s61, 24(, %s14)
277; CHECK-NEXT:    or %s62, 0, %s0
278; CHECK-NEXT:    lea %s63, 315
279; CHECK-NEXT:    shm.l %s63, (%s61)
280; CHECK-NEXT:    shm.l %s8, 8(%s61)
281; CHECK-NEXT:    shm.l %s11, 16(%s61)
282; CHECK-NEXT:    monc
283; CHECK-NEXT:    or %s0, 0, %s62
284; CHECK-NEXT:  .LBB8_2:
285; CHECK-NEXT:    st %s18, 288(, %s11) # 8-byte Folded Spill
286; CHECK-NEXT:    or %s18, 0, %s0
287; CHECK-NEXT:    lea %s0, __truncdfhf2@lo
288; CHECK-NEXT:    and %s0, %s0, (32)0
289; CHECK-NEXT:    lea.sl %s12, __truncdfhf2@hi(, %s0)
290; CHECK-NEXT:    or %s0, 0, %s1
291; CHECK-NEXT:    bsic %s10, (, %s12)
292; CHECK-NEXT:    st2b %s0, (, %s18)
293; CHECK-NEXT:    ld %s18, 288(, %s11) # 8-byte Folded Reload
294; CHECK-NEXT:    or %s11, 0, %s9
295; CHECK-NEXT:    ld %s10, 8(, %s11)
296; CHECK-NEXT:    ld %s9, (, %s11)
297; CHECK-NEXT:    b.l.t (, %s10)
298  %val.asf = fptrunc double %val to half
299  store half %val.asf, ptr %fl.ptr
300  ret void
301}
302
303define void @func_fp64fp32(ptr %fl.ptr, double %val) {
304; CHECK-LABEL: func_fp64fp32:
305; CHECK:       # %bb.0:
306; CHECK-NEXT:    cvt.s.d %s1, %s1
307; CHECK-NEXT:    stu %s1, (, %s0)
308; CHECK-NEXT:    b.l.t (, %s10)
309  %val.asf = fptrunc double %val to float
310  store float %val.asf, ptr %fl.ptr
311  ret void
312}
313