Skip to content

Commit cda651c

Browse files
committed
[LoongArch][test] Add tests for issue 97975 and 97981
1 parent 235cada commit cda651c

File tree

2 files changed

+319
-0
lines changed

2 files changed

+319
-0
lines changed
Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc --mtriple=loongarch32 --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA32S
3+
; RUN: llc --mtriple=loongarch32 --mattr=+f --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA32F
4+
; RUN: llc --mtriple=loongarch32 --mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA32D
5+
; RUN: llc --mtriple=loongarch64 --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA64S
6+
; RUN: llc --mtriple=loongarch64 --mattr=+f --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA64F
7+
; RUN: llc --mtriple=loongarch64 --mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA64D
8+
9+
define half @f(half %a, half %b, half %c) {
10+
; LA32S-LABEL: f:
11+
; LA32S: # %bb.0:
12+
; LA32S-NEXT: addi.w $sp, $sp, -16
13+
; LA32S-NEXT: .cfi_def_cfa_offset 16
14+
; LA32S-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
15+
; LA32S-NEXT: st.w $fp, $sp, 8 # 4-byte Folded Spill
16+
; LA32S-NEXT: st.w $s0, $sp, 4 # 4-byte Folded Spill
17+
; LA32S-NEXT: st.w $s1, $sp, 0 # 4-byte Folded Spill
18+
; LA32S-NEXT: .cfi_offset 1, -4
19+
; LA32S-NEXT: .cfi_offset 22, -8
20+
; LA32S-NEXT: .cfi_offset 23, -12
21+
; LA32S-NEXT: .cfi_offset 24, -16
22+
; LA32S-NEXT: move $fp, $a2
23+
; LA32S-NEXT: move $s0, $a0
24+
; LA32S-NEXT: bstrpick.w $a0, $a1, 15, 0
25+
; LA32S-NEXT: bl %plt(__gnu_h2f_ieee)
26+
; LA32S-NEXT: move $s1, $a0
27+
; LA32S-NEXT: bstrpick.w $a0, $s0, 15, 0
28+
; LA32S-NEXT: bl %plt(__gnu_h2f_ieee)
29+
; LA32S-NEXT: move $a1, $s1
30+
; LA32S-NEXT: bl %plt(__addsf3)
31+
; LA32S-NEXT: bl %plt(__gnu_f2h_ieee)
32+
; LA32S-NEXT: move $s0, $a0
33+
; LA32S-NEXT: bstrpick.w $a0, $fp, 15, 0
34+
; LA32S-NEXT: bl %plt(__gnu_h2f_ieee)
35+
; LA32S-NEXT: move $fp, $a0
36+
; LA32S-NEXT: bstrpick.w $a0, $s0, 15, 0
37+
; LA32S-NEXT: bl %plt(__gnu_h2f_ieee)
38+
; LA32S-NEXT: move $a1, $fp
39+
; LA32S-NEXT: bl %plt(__addsf3)
40+
; LA32S-NEXT: bl %plt(__gnu_f2h_ieee)
41+
; LA32S-NEXT: ld.w $s1, $sp, 0 # 4-byte Folded Reload
42+
; LA32S-NEXT: ld.w $s0, $sp, 4 # 4-byte Folded Reload
43+
; LA32S-NEXT: ld.w $fp, $sp, 8 # 4-byte Folded Reload
44+
; LA32S-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
45+
; LA32S-NEXT: addi.w $sp, $sp, 16
46+
; LA32S-NEXT: ret
47+
;
48+
; LA32F-LABEL: f:
49+
; LA32F: # %bb.0:
50+
; LA32F-NEXT: addi.w $sp, $sp, -16
51+
; LA32F-NEXT: .cfi_def_cfa_offset 16
52+
; LA32F-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
53+
; LA32F-NEXT: fst.s $fs0, $sp, 8 # 4-byte Folded Spill
54+
; LA32F-NEXT: fst.s $fs1, $sp, 4 # 4-byte Folded Spill
55+
; LA32F-NEXT: fst.s $fs2, $sp, 0 # 4-byte Folded Spill
56+
; LA32F-NEXT: .cfi_offset 1, -4
57+
; LA32F-NEXT: .cfi_offset 56, -8
58+
; LA32F-NEXT: .cfi_offset 57, -12
59+
; LA32F-NEXT: .cfi_offset 58, -16
60+
; LA32F-NEXT: fmov.s $fs0, $fa2
61+
; LA32F-NEXT: fmov.s $fs1, $fa0
62+
; LA32F-NEXT: fmov.s $fa0, $fa1
63+
; LA32F-NEXT: bl %plt(__gnu_h2f_ieee)
64+
; LA32F-NEXT: fmov.s $fs2, $fa0
65+
; LA32F-NEXT: fmov.s $fa0, $fs1
66+
; LA32F-NEXT: bl %plt(__gnu_h2f_ieee)
67+
; LA32F-NEXT: fadd.s $fa0, $fa0, $fs2
68+
; LA32F-NEXT: bl %plt(__gnu_f2h_ieee)
69+
; LA32F-NEXT: bl %plt(__gnu_h2f_ieee)
70+
; LA32F-NEXT: fmov.s $fs1, $fa0
71+
; LA32F-NEXT: fmov.s $fa0, $fs0
72+
; LA32F-NEXT: bl %plt(__gnu_h2f_ieee)
73+
; LA32F-NEXT: fadd.s $fa0, $fs1, $fa0
74+
; LA32F-NEXT: bl %plt(__gnu_f2h_ieee)
75+
; LA32F-NEXT: movfr2gr.s $a0, $fa0
76+
; LA32F-NEXT: lu12i.w $a1, -16
77+
; LA32F-NEXT: or $a0, $a0, $a1
78+
; LA32F-NEXT: movgr2fr.w $fa0, $a0
79+
; LA32F-NEXT: fld.s $fs2, $sp, 0 # 4-byte Folded Reload
80+
; LA32F-NEXT: fld.s $fs1, $sp, 4 # 4-byte Folded Reload
81+
; LA32F-NEXT: fld.s $fs0, $sp, 8 # 4-byte Folded Reload
82+
; LA32F-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
83+
; LA32F-NEXT: addi.w $sp, $sp, 16
84+
; LA32F-NEXT: ret
85+
;
86+
; LA32D-LABEL: f:
87+
; LA32D: # %bb.0:
88+
; LA32D-NEXT: addi.w $sp, $sp, -32
89+
; LA32D-NEXT: .cfi_def_cfa_offset 32
90+
; LA32D-NEXT: st.w $ra, $sp, 28 # 4-byte Folded Spill
91+
; LA32D-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill
92+
; LA32D-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill
93+
; LA32D-NEXT: fst.d $fs2, $sp, 0 # 8-byte Folded Spill
94+
; LA32D-NEXT: .cfi_offset 1, -4
95+
; LA32D-NEXT: .cfi_offset 56, -16
96+
; LA32D-NEXT: .cfi_offset 57, -24
97+
; LA32D-NEXT: .cfi_offset 58, -32
98+
; LA32D-NEXT: fmov.s $fs0, $fa2
99+
; LA32D-NEXT: fmov.s $fs1, $fa0
100+
; LA32D-NEXT: fmov.s $fa0, $fa1
101+
; LA32D-NEXT: bl %plt(__gnu_h2f_ieee)
102+
; LA32D-NEXT: fmov.s $fs2, $fa0
103+
; LA32D-NEXT: fmov.s $fa0, $fs1
104+
; LA32D-NEXT: bl %plt(__gnu_h2f_ieee)
105+
; LA32D-NEXT: fadd.s $fa0, $fa0, $fs2
106+
; LA32D-NEXT: bl %plt(__gnu_f2h_ieee)
107+
; LA32D-NEXT: bl %plt(__gnu_h2f_ieee)
108+
; LA32D-NEXT: fmov.s $fs1, $fa0
109+
; LA32D-NEXT: fmov.s $fa0, $fs0
110+
; LA32D-NEXT: bl %plt(__gnu_h2f_ieee)
111+
; LA32D-NEXT: fadd.s $fa0, $fs1, $fa0
112+
; LA32D-NEXT: bl %plt(__gnu_f2h_ieee)
113+
; LA32D-NEXT: movfr2gr.s $a0, $fa0
114+
; LA32D-NEXT: lu12i.w $a1, -16
115+
; LA32D-NEXT: or $a0, $a0, $a1
116+
; LA32D-NEXT: movgr2fr.w $fa0, $a0
117+
; LA32D-NEXT: fld.d $fs2, $sp, 0 # 8-byte Folded Reload
118+
; LA32D-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload
119+
; LA32D-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload
120+
; LA32D-NEXT: ld.w $ra, $sp, 28 # 4-byte Folded Reload
121+
; LA32D-NEXT: addi.w $sp, $sp, 32
122+
; LA32D-NEXT: ret
123+
;
124+
; LA64S-LABEL: f:
125+
; LA64S: # %bb.0:
126+
; LA64S-NEXT: addi.d $sp, $sp, -32
127+
; LA64S-NEXT: .cfi_def_cfa_offset 32
128+
; LA64S-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
129+
; LA64S-NEXT: st.d $fp, $sp, 16 # 8-byte Folded Spill
130+
; LA64S-NEXT: st.d $s0, $sp, 8 # 8-byte Folded Spill
131+
; LA64S-NEXT: st.d $s1, $sp, 0 # 8-byte Folded Spill
132+
; LA64S-NEXT: .cfi_offset 1, -8
133+
; LA64S-NEXT: .cfi_offset 22, -16
134+
; LA64S-NEXT: .cfi_offset 23, -24
135+
; LA64S-NEXT: .cfi_offset 24, -32
136+
; LA64S-NEXT: move $fp, $a2
137+
; LA64S-NEXT: move $s0, $a0
138+
; LA64S-NEXT: bstrpick.d $a0, $a1, 15, 0
139+
; LA64S-NEXT: bl %plt(__gnu_h2f_ieee)
140+
; LA64S-NEXT: move $s1, $a0
141+
; LA64S-NEXT: bstrpick.d $a0, $s0, 15, 0
142+
; LA64S-NEXT: bl %plt(__gnu_h2f_ieee)
143+
; LA64S-NEXT: move $a1, $s1
144+
; LA64S-NEXT: bl %plt(__addsf3)
145+
; LA64S-NEXT: bl %plt(__gnu_f2h_ieee)
146+
; LA64S-NEXT: move $s0, $a0
147+
; LA64S-NEXT: bstrpick.d $a0, $fp, 15, 0
148+
; LA64S-NEXT: bl %plt(__gnu_h2f_ieee)
149+
; LA64S-NEXT: move $fp, $a0
150+
; LA64S-NEXT: bstrpick.d $a0, $s0, 15, 0
151+
; LA64S-NEXT: bl %plt(__gnu_h2f_ieee)
152+
; LA64S-NEXT: move $a1, $fp
153+
; LA64S-NEXT: bl %plt(__addsf3)
154+
; LA64S-NEXT: bl %plt(__gnu_f2h_ieee)
155+
; LA64S-NEXT: ld.d $s1, $sp, 0 # 8-byte Folded Reload
156+
; LA64S-NEXT: ld.d $s0, $sp, 8 # 8-byte Folded Reload
157+
; LA64S-NEXT: ld.d $fp, $sp, 16 # 8-byte Folded Reload
158+
; LA64S-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
159+
; LA64S-NEXT: addi.d $sp, $sp, 32
160+
; LA64S-NEXT: ret
161+
;
162+
; LA64F-LABEL: f:
163+
; LA64F: # %bb.0:
164+
; LA64F-NEXT: addi.d $sp, $sp, -32
165+
; LA64F-NEXT: .cfi_def_cfa_offset 32
166+
; LA64F-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
167+
; LA64F-NEXT: fst.s $fs0, $sp, 20 # 4-byte Folded Spill
168+
; LA64F-NEXT: fst.s $fs1, $sp, 16 # 4-byte Folded Spill
169+
; LA64F-NEXT: fst.s $fs2, $sp, 12 # 4-byte Folded Spill
170+
; LA64F-NEXT: .cfi_offset 1, -8
171+
; LA64F-NEXT: .cfi_offset 56, -12
172+
; LA64F-NEXT: .cfi_offset 57, -16
173+
; LA64F-NEXT: .cfi_offset 58, -20
174+
; LA64F-NEXT: fmov.s $fs0, $fa2
175+
; LA64F-NEXT: fmov.s $fs1, $fa0
176+
; LA64F-NEXT: fmov.s $fa0, $fa1
177+
; LA64F-NEXT: bl %plt(__gnu_h2f_ieee)
178+
; LA64F-NEXT: fmov.s $fs2, $fa0
179+
; LA64F-NEXT: fmov.s $fa0, $fs1
180+
; LA64F-NEXT: bl %plt(__gnu_h2f_ieee)
181+
; LA64F-NEXT: fadd.s $fa0, $fa0, $fs2
182+
; LA64F-NEXT: bl %plt(__gnu_f2h_ieee)
183+
; LA64F-NEXT: bl %plt(__gnu_h2f_ieee)
184+
; LA64F-NEXT: fmov.s $fs1, $fa0
185+
; LA64F-NEXT: fmov.s $fa0, $fs0
186+
; LA64F-NEXT: bl %plt(__gnu_h2f_ieee)
187+
; LA64F-NEXT: fadd.s $fa0, $fs1, $fa0
188+
; LA64F-NEXT: bl %plt(__gnu_f2h_ieee)
189+
; LA64F-NEXT: movfr2gr.s $a0, $fa0
190+
; LA64F-NEXT: lu12i.w $a1, -16
191+
; LA64F-NEXT: or $a0, $a0, $a1
192+
; LA64F-NEXT: movgr2fr.w $fa0, $a0
193+
; LA64F-NEXT: fld.s $fs2, $sp, 12 # 4-byte Folded Reload
194+
; LA64F-NEXT: fld.s $fs1, $sp, 16 # 4-byte Folded Reload
195+
; LA64F-NEXT: fld.s $fs0, $sp, 20 # 4-byte Folded Reload
196+
; LA64F-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
197+
; LA64F-NEXT: addi.d $sp, $sp, 32
198+
; LA64F-NEXT: ret
199+
;
200+
; LA64D-LABEL: f:
201+
; LA64D: # %bb.0:
202+
; LA64D-NEXT: addi.d $sp, $sp, -32
203+
; LA64D-NEXT: .cfi_def_cfa_offset 32
204+
; LA64D-NEXT: st.d $ra, $sp, 24 # 8-byte Folded Spill
205+
; LA64D-NEXT: fst.d $fs0, $sp, 16 # 8-byte Folded Spill
206+
; LA64D-NEXT: fst.d $fs1, $sp, 8 # 8-byte Folded Spill
207+
; LA64D-NEXT: fst.d $fs2, $sp, 0 # 8-byte Folded Spill
208+
; LA64D-NEXT: .cfi_offset 1, -8
209+
; LA64D-NEXT: .cfi_offset 56, -16
210+
; LA64D-NEXT: .cfi_offset 57, -24
211+
; LA64D-NEXT: .cfi_offset 58, -32
212+
; LA64D-NEXT: fmov.s $fs0, $fa2
213+
; LA64D-NEXT: fmov.s $fs1, $fa0
214+
; LA64D-NEXT: fmov.s $fa0, $fa1
215+
; LA64D-NEXT: bl %plt(__gnu_h2f_ieee)
216+
; LA64D-NEXT: fmov.s $fs2, $fa0
217+
; LA64D-NEXT: fmov.s $fa0, $fs1
218+
; LA64D-NEXT: bl %plt(__gnu_h2f_ieee)
219+
; LA64D-NEXT: fadd.s $fa0, $fa0, $fs2
220+
; LA64D-NEXT: bl %plt(__gnu_f2h_ieee)
221+
; LA64D-NEXT: bl %plt(__gnu_h2f_ieee)
222+
; LA64D-NEXT: fmov.s $fs1, $fa0
223+
; LA64D-NEXT: fmov.s $fa0, $fs0
224+
; LA64D-NEXT: bl %plt(__gnu_h2f_ieee)
225+
; LA64D-NEXT: fadd.s $fa0, $fs1, $fa0
226+
; LA64D-NEXT: bl %plt(__gnu_f2h_ieee)
227+
; LA64D-NEXT: movfr2gr.s $a0, $fa0
228+
; LA64D-NEXT: lu12i.w $a1, -16
229+
; LA64D-NEXT: or $a0, $a0, $a1
230+
; LA64D-NEXT: movgr2fr.w $fa0, $a0
231+
; LA64D-NEXT: fld.d $fs2, $sp, 0 # 8-byte Folded Reload
232+
; LA64D-NEXT: fld.d $fs1, $sp, 8 # 8-byte Folded Reload
233+
; LA64D-NEXT: fld.d $fs0, $sp, 16 # 8-byte Folded Reload
234+
; LA64D-NEXT: ld.d $ra, $sp, 24 # 8-byte Folded Reload
235+
; LA64D-NEXT: addi.d $sp, $sp, 32
236+
; LA64D-NEXT: ret
237+
%d = fadd half %a, %b
238+
%e = fadd half %d, %c
239+
ret half %e
240+
}
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc --mtriple=loongarch32 --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA32S
3+
; RUN: llc --mtriple=loongarch32 --mattr=+f --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA32F
4+
; RUN: llc --mtriple=loongarch32 --mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA32D
5+
; RUN: llc --mtriple=loongarch64 --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA64S
6+
; RUN: llc --mtriple=loongarch64 --mattr=+f --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA64F
7+
; RUN: llc --mtriple=loongarch64 --mattr=+d --verify-machineinstrs < %s | FileCheck %s --check-prefix=LA64D
8+
9+
define half @to_half(i16 %bits) {
10+
; LA32S-LABEL: to_half:
11+
; LA32S: # %bb.0:
12+
; LA32S-NEXT: ret
13+
;
14+
; LA32F-LABEL: to_half:
15+
; LA32F: # %bb.0:
16+
; LA32F-NEXT: lu12i.w $a1, -16
17+
; LA32F-NEXT: or $a0, $a0, $a1
18+
; LA32F-NEXT: movgr2fr.w $fa0, $a0
19+
; LA32F-NEXT: ret
20+
;
21+
; LA32D-LABEL: to_half:
22+
; LA32D: # %bb.0:
23+
; LA32D-NEXT: lu12i.w $a1, -16
24+
; LA32D-NEXT: or $a0, $a0, $a1
25+
; LA32D-NEXT: movgr2fr.w $fa0, $a0
26+
; LA32D-NEXT: ret
27+
;
28+
; LA64S-LABEL: to_half:
29+
; LA64S: # %bb.0:
30+
; LA64S-NEXT: ret
31+
;
32+
; LA64F-LABEL: to_half:
33+
; LA64F: # %bb.0:
34+
; LA64F-NEXT: lu12i.w $a1, -16
35+
; LA64F-NEXT: or $a0, $a0, $a1
36+
; LA64F-NEXT: movgr2fr.w $fa0, $a0
37+
; LA64F-NEXT: ret
38+
;
39+
; LA64D-LABEL: to_half:
40+
; LA64D: # %bb.0:
41+
; LA64D-NEXT: lu12i.w $a1, -16
42+
; LA64D-NEXT: or $a0, $a0, $a1
43+
; LA64D-NEXT: movgr2fr.w $fa0, $a0
44+
; LA64D-NEXT: ret
45+
%f = bitcast i16 %bits to half
46+
ret half %f
47+
}
48+
49+
define i16 @from_half(half %f) {
50+
; LA32S-LABEL: from_half:
51+
; LA32S: # %bb.0:
52+
; LA32S-NEXT: ret
53+
;
54+
; LA32F-LABEL: from_half:
55+
; LA32F: # %bb.0:
56+
; LA32F-NEXT: movfr2gr.s $a0, $fa0
57+
; LA32F-NEXT: ret
58+
;
59+
; LA32D-LABEL: from_half:
60+
; LA32D: # %bb.0:
61+
; LA32D-NEXT: movfr2gr.s $a0, $fa0
62+
; LA32D-NEXT: ret
63+
;
64+
; LA64S-LABEL: from_half:
65+
; LA64S: # %bb.0:
66+
; LA64S-NEXT: ret
67+
;
68+
; LA64F-LABEL: from_half:
69+
; LA64F: # %bb.0:
70+
; LA64F-NEXT: movfr2gr.s $a0, $fa0
71+
; LA64F-NEXT: ret
72+
;
73+
; LA64D-LABEL: from_half:
74+
; LA64D: # %bb.0:
75+
; LA64D-NEXT: movfr2gr.s $a0, $fa0
76+
; LA64D-NEXT: ret
77+
%bits = bitcast half %f to i16
78+
ret i16 %bits
79+
}

0 commit comments

Comments
 (0)