11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
2- ; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s --check-prefix=LA32
3- ; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefix=LA64
2+ ; RUN: llc --mtriple=loongarch32 --mattr=+32s,+lasx < %s | FileCheck %s
3+ ; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s
44
55declare <8 x float > @llvm.log2.v8f32 (<8 x float >)
66declare <4 x double > @llvm.log2.v4f64 (<4 x double >)
77
88define void @flog2_v8f32 (ptr %res , ptr %a ) nounwind {
9- ; LA32-LABEL: flog2_v8f32:
10- ; LA32: # %bb.0: # %entry
11- ; LA32-NEXT: addi.w $sp, $sp, -128
12- ; LA32-NEXT: st.w $ra, $sp, 124 # 4-byte Folded Spill
13- ; LA32-NEXT: st.w $fp, $sp, 120 # 4-byte Folded Spill
14- ; LA32-NEXT: xvld $xr0, $a1, 0
15- ; LA32-NEXT: xvst $xr0, $sp, 80 # 32-byte Folded Spill
16- ; LA32-NEXT: move $fp, $a0
17- ; LA32-NEXT: xvpickve.w $xr0, $xr0, 5
18- ; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
19- ; LA32-NEXT: bl log2f
20- ; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
21- ; LA32-NEXT: vst $vr0, $sp, 48 # 16-byte Folded Spill
22- ; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
23- ; LA32-NEXT: xvpickve.w $xr0, $xr0, 4
24- ; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
25- ; LA32-NEXT: bl log2f
26- ; LA32-NEXT: # kill: def $f0 killed $f0 def $xr0
27- ; LA32-NEXT: vld $vr1, $sp, 48 # 16-byte Folded Reload
28- ; LA32-NEXT: vextrins.w $vr0, $vr1, 16
29- ; LA32-NEXT: xvst $xr0, $sp, 48 # 32-byte Folded Spill
30- ; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
31- ; LA32-NEXT: xvpickve.w $xr0, $xr0, 6
32- ; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
33- ; LA32-NEXT: bl log2f
34- ; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
35- ; LA32-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload
36- ; LA32-NEXT: vextrins.w $vr1, $vr0, 32
37- ; LA32-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill
38- ; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
39- ; LA32-NEXT: xvpickve.w $xr0, $xr0, 7
40- ; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
41- ; LA32-NEXT: bl log2f
42- ; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
43- ; LA32-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload
44- ; LA32-NEXT: vextrins.w $vr1, $vr0, 48
45- ; LA32-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill
46- ; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
47- ; LA32-NEXT: xvpickve.w $xr0, $xr0, 1
48- ; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
49- ; LA32-NEXT: bl log2f
50- ; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
51- ; LA32-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill
52- ; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
53- ; LA32-NEXT: xvpickve.w $xr0, $xr0, 0
54- ; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
55- ; LA32-NEXT: bl log2f
56- ; LA32-NEXT: # kill: def $f0 killed $f0 def $xr0
57- ; LA32-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload
58- ; LA32-NEXT: vextrins.w $vr0, $vr1, 16
59- ; LA32-NEXT: xvst $xr0, $sp, 16 # 32-byte Folded Spill
60- ; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
61- ; LA32-NEXT: xvpickve.w $xr0, $xr0, 2
62- ; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
63- ; LA32-NEXT: bl log2f
64- ; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
65- ; LA32-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload
66- ; LA32-NEXT: vextrins.w $vr1, $vr0, 32
67- ; LA32-NEXT: xvst $xr1, $sp, 16 # 32-byte Folded Spill
68- ; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
69- ; LA32-NEXT: xvpickve.w $xr0, $xr0, 3
70- ; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr0
71- ; LA32-NEXT: bl log2f
72- ; LA32-NEXT: # kill: def $f0 killed $f0 def $vr0
73- ; LA32-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload
74- ; LA32-NEXT: vextrins.w $vr1, $vr0, 48
75- ; LA32-NEXT: xvld $xr0, $sp, 48 # 32-byte Folded Reload
76- ; LA32-NEXT: xvpermi.q $xr1, $xr0, 2
77- ; LA32-NEXT: xvst $xr1, $fp, 0
78- ; LA32-NEXT: ld.w $fp, $sp, 120 # 4-byte Folded Reload
79- ; LA32-NEXT: ld.w $ra, $sp, 124 # 4-byte Folded Reload
80- ; LA32-NEXT: addi.w $sp, $sp, 128
81- ; LA32-NEXT: ret
82- ;
83- ; LA64-LABEL: flog2_v8f32:
84- ; LA64: # %bb.0: # %entry
85- ; LA64-NEXT: addi.d $sp, $sp, -128
86- ; LA64-NEXT: st.d $ra, $sp, 120 # 8-byte Folded Spill
87- ; LA64-NEXT: st.d $fp, $sp, 112 # 8-byte Folded Spill
88- ; LA64-NEXT: xvld $xr0, $a1, 0
89- ; LA64-NEXT: xvst $xr0, $sp, 80 # 32-byte Folded Spill
90- ; LA64-NEXT: move $fp, $a0
91- ; LA64-NEXT: xvpickve.w $xr0, $xr0, 5
92- ; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
93- ; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
94- ; LA64-NEXT: jirl $ra, $ra, 0
95- ; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
96- ; LA64-NEXT: vst $vr0, $sp, 48 # 16-byte Folded Spill
97- ; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
98- ; LA64-NEXT: xvpickve.w $xr0, $xr0, 4
99- ; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
100- ; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
101- ; LA64-NEXT: jirl $ra, $ra, 0
102- ; LA64-NEXT: # kill: def $f0 killed $f0 def $xr0
103- ; LA64-NEXT: vld $vr1, $sp, 48 # 16-byte Folded Reload
104- ; LA64-NEXT: vextrins.w $vr0, $vr1, 16
105- ; LA64-NEXT: xvst $xr0, $sp, 48 # 32-byte Folded Spill
106- ; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
107- ; LA64-NEXT: xvpickve.w $xr0, $xr0, 6
108- ; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
109- ; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
110- ; LA64-NEXT: jirl $ra, $ra, 0
111- ; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
112- ; LA64-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload
113- ; LA64-NEXT: vextrins.w $vr1, $vr0, 32
114- ; LA64-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill
115- ; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
116- ; LA64-NEXT: xvpickve.w $xr0, $xr0, 7
117- ; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
118- ; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
119- ; LA64-NEXT: jirl $ra, $ra, 0
120- ; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
121- ; LA64-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload
122- ; LA64-NEXT: vextrins.w $vr1, $vr0, 48
123- ; LA64-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill
124- ; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
125- ; LA64-NEXT: xvpickve.w $xr0, $xr0, 1
126- ; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
127- ; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
128- ; LA64-NEXT: jirl $ra, $ra, 0
129- ; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
130- ; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill
131- ; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
132- ; LA64-NEXT: xvpickve.w $xr0, $xr0, 0
133- ; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
134- ; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
135- ; LA64-NEXT: jirl $ra, $ra, 0
136- ; LA64-NEXT: # kill: def $f0 killed $f0 def $xr0
137- ; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload
138- ; LA64-NEXT: vextrins.w $vr0, $vr1, 16
139- ; LA64-NEXT: xvst $xr0, $sp, 16 # 32-byte Folded Spill
140- ; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
141- ; LA64-NEXT: xvpickve.w $xr0, $xr0, 2
142- ; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
143- ; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
144- ; LA64-NEXT: jirl $ra, $ra, 0
145- ; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
146- ; LA64-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload
147- ; LA64-NEXT: vextrins.w $vr1, $vr0, 32
148- ; LA64-NEXT: xvst $xr1, $sp, 16 # 32-byte Folded Spill
149- ; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload
150- ; LA64-NEXT: xvpickve.w $xr0, $xr0, 3
151- ; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0
152- ; LA64-NEXT: pcaddu18i $ra, %call36(log2f)
153- ; LA64-NEXT: jirl $ra, $ra, 0
154- ; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0
155- ; LA64-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload
156- ; LA64-NEXT: vextrins.w $vr1, $vr0, 48
157- ; LA64-NEXT: xvld $xr0, $sp, 48 # 32-byte Folded Reload
158- ; LA64-NEXT: xvpermi.q $xr1, $xr0, 2
159- ; LA64-NEXT: xvst $xr1, $fp, 0
160- ; LA64-NEXT: ld.d $fp, $sp, 112 # 8-byte Folded Reload
161- ; LA64-NEXT: ld.d $ra, $sp, 120 # 8-byte Folded Reload
162- ; LA64-NEXT: addi.d $sp, $sp, 128
163- ; LA64-NEXT: ret
9+ ; CHECK-LABEL: flog2_v8f32:
10+ ; CHECK: # %bb.0: # %entry
11+ ; CHECK-NEXT: xvld $xr0, $a1, 0
12+ ; CHECK-NEXT: xvflogb.s $xr0, $xr0
13+ ; CHECK-NEXT: xvst $xr0, $a0, 0
14+ ; CHECK-NEXT: ret
16415entry:
16516 %v = load <8 x float >, ptr %a
16617 %r = call <8 x float > @llvm.log2.v8f32 (<8 x float > %v )
@@ -169,93 +20,12 @@ entry:
16920}
17021
17122define void @flog2_v4f64 (ptr %res , ptr %a ) nounwind {
172- ; LA32-LABEL: flog2_v4f64:
173- ; LA32: # %bb.0: # %entry
174- ; LA32-NEXT: addi.w $sp, $sp, -112
175- ; LA32-NEXT: st.w $ra, $sp, 108 # 4-byte Folded Spill
176- ; LA32-NEXT: st.w $fp, $sp, 104 # 4-byte Folded Spill
177- ; LA32-NEXT: xvld $xr0, $a1, 0
178- ; LA32-NEXT: xvst $xr0, $sp, 64 # 32-byte Folded Spill
179- ; LA32-NEXT: move $fp, $a0
180- ; LA32-NEXT: xvpickve.d $xr0, $xr0, 3
181- ; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
182- ; LA32-NEXT: bl log2
183- ; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
184- ; LA32-NEXT: vst $vr0, $sp, 32 # 16-byte Folded Spill
185- ; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
186- ; LA32-NEXT: xvpickve.d $xr0, $xr0, 2
187- ; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
188- ; LA32-NEXT: bl log2
189- ; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
190- ; LA32-NEXT: vld $vr1, $sp, 32 # 16-byte Folded Reload
191- ; LA32-NEXT: vextrins.d $vr0, $vr1, 16
192- ; LA32-NEXT: xvst $xr0, $sp, 32 # 32-byte Folded Spill
193- ; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
194- ; LA32-NEXT: xvpickve.d $xr0, $xr0, 1
195- ; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
196- ; LA32-NEXT: bl log2
197- ; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
198- ; LA32-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill
199- ; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
200- ; LA32-NEXT: xvpickve.d $xr0, $xr0, 0
201- ; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
202- ; LA32-NEXT: bl log2
203- ; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
204- ; LA32-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload
205- ; LA32-NEXT: vextrins.d $vr0, $vr1, 16
206- ; LA32-NEXT: xvld $xr1, $sp, 32 # 32-byte Folded Reload
207- ; LA32-NEXT: xvpermi.q $xr0, $xr1, 2
208- ; LA32-NEXT: xvst $xr0, $fp, 0
209- ; LA32-NEXT: ld.w $fp, $sp, 104 # 4-byte Folded Reload
210- ; LA32-NEXT: ld.w $ra, $sp, 108 # 4-byte Folded Reload
211- ; LA32-NEXT: addi.w $sp, $sp, 112
212- ; LA32-NEXT: ret
213- ;
214- ; LA64-LABEL: flog2_v4f64:
215- ; LA64: # %bb.0: # %entry
216- ; LA64-NEXT: addi.d $sp, $sp, -112
217- ; LA64-NEXT: st.d $ra, $sp, 104 # 8-byte Folded Spill
218- ; LA64-NEXT: st.d $fp, $sp, 96 # 8-byte Folded Spill
219- ; LA64-NEXT: xvld $xr0, $a1, 0
220- ; LA64-NEXT: xvst $xr0, $sp, 64 # 32-byte Folded Spill
221- ; LA64-NEXT: move $fp, $a0
222- ; LA64-NEXT: xvpickve.d $xr0, $xr0, 3
223- ; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
224- ; LA64-NEXT: pcaddu18i $ra, %call36(log2)
225- ; LA64-NEXT: jirl $ra, $ra, 0
226- ; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
227- ; LA64-NEXT: vst $vr0, $sp, 32 # 16-byte Folded Spill
228- ; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
229- ; LA64-NEXT: xvpickve.d $xr0, $xr0, 2
230- ; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
231- ; LA64-NEXT: pcaddu18i $ra, %call36(log2)
232- ; LA64-NEXT: jirl $ra, $ra, 0
233- ; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
234- ; LA64-NEXT: vld $vr1, $sp, 32 # 16-byte Folded Reload
235- ; LA64-NEXT: vextrins.d $vr0, $vr1, 16
236- ; LA64-NEXT: xvst $xr0, $sp, 32 # 32-byte Folded Spill
237- ; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
238- ; LA64-NEXT: xvpickve.d $xr0, $xr0, 1
239- ; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
240- ; LA64-NEXT: pcaddu18i $ra, %call36(log2)
241- ; LA64-NEXT: jirl $ra, $ra, 0
242- ; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0
243- ; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill
244- ; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload
245- ; LA64-NEXT: xvpickve.d $xr0, $xr0, 0
246- ; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0
247- ; LA64-NEXT: pcaddu18i $ra, %call36(log2)
248- ; LA64-NEXT: jirl $ra, $ra, 0
249- ; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0
250- ; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload
251- ; LA64-NEXT: vextrins.d $vr0, $vr1, 16
252- ; LA64-NEXT: xvld $xr1, $sp, 32 # 32-byte Folded Reload
253- ; LA64-NEXT: xvpermi.q $xr0, $xr1, 2
254- ; LA64-NEXT: xvst $xr0, $fp, 0
255- ; LA64-NEXT: ld.d $fp, $sp, 96 # 8-byte Folded Reload
256- ; LA64-NEXT: ld.d $ra, $sp, 104 # 8-byte Folded Reload
257- ; LA64-NEXT: addi.d $sp, $sp, 112
258- ; LA64-NEXT: ret
23+ ; CHECK-LABEL: flog2_v4f64:
24+ ; CHECK: # %bb.0: # %entry
25+ ; CHECK-NEXT: xvld $xr0, $a1, 0
26+ ; CHECK-NEXT: xvflogb.d $xr0, $xr0
27+ ; CHECK-NEXT: xvst $xr0, $a0, 0
28+ ; CHECK-NEXT: ret
25929entry:
26030 %v = load <4 x double >, ptr %a
26131 %r = call <4 x double > @llvm.log2.v4f64 (<4 x double > %v )
0 commit comments