xref: /llvm-project/llvm/test/CodeGen/LoongArch/vector-fp-imm.ll (revision dedf014901cecd7ba3bbc1aadb17098a5a95b8a7)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32F
3; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D
4; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F
5; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D
6
7;; TODO: Merge the offset of address calculation into the offset field of instructions.
8
9%f2 = type <2 x float>
10%f4 = type <4 x float>
11%f8 = type <8 x float>
12%d2 = type <2 x double>
13%d4 = type <4 x double>
14%d8 = type <8 x double>
15
16define void @test_zero(ptr %P, ptr %S) nounwind {
17; LA32F-LABEL: test_zero:
18; LA32F:       # %bb.0:
19; LA32F-NEXT:    fld.s $fa0, $a0, 12
20; LA32F-NEXT:    fld.s $fa1, $a0, 0
21; LA32F-NEXT:    fld.s $fa2, $a0, 4
22; LA32F-NEXT:    fld.s $fa3, $a0, 8
23; LA32F-NEXT:    movgr2fr.w $fa4, $zero
24; LA32F-NEXT:    fadd.s $fa1, $fa1, $fa4
25; LA32F-NEXT:    fadd.s $fa2, $fa2, $fa4
26; LA32F-NEXT:    fadd.s $fa3, $fa3, $fa4
27; LA32F-NEXT:    fadd.s $fa0, $fa0, $fa4
28; LA32F-NEXT:    fst.s $fa0, $a1, 12
29; LA32F-NEXT:    fst.s $fa3, $a1, 8
30; LA32F-NEXT:    fst.s $fa2, $a1, 4
31; LA32F-NEXT:    fst.s $fa1, $a1, 0
32; LA32F-NEXT:    ret
33;
34; LA32D-LABEL: test_zero:
35; LA32D:       # %bb.0:
36; LA32D-NEXT:    fld.s $fa0, $a0, 12
37; LA32D-NEXT:    fld.s $fa1, $a0, 0
38; LA32D-NEXT:    fld.s $fa2, $a0, 4
39; LA32D-NEXT:    fld.s $fa3, $a0, 8
40; LA32D-NEXT:    movgr2fr.w $fa4, $zero
41; LA32D-NEXT:    fadd.s $fa1, $fa1, $fa4
42; LA32D-NEXT:    fadd.s $fa2, $fa2, $fa4
43; LA32D-NEXT:    fadd.s $fa3, $fa3, $fa4
44; LA32D-NEXT:    fadd.s $fa0, $fa0, $fa4
45; LA32D-NEXT:    fst.s $fa0, $a1, 12
46; LA32D-NEXT:    fst.s $fa3, $a1, 8
47; LA32D-NEXT:    fst.s $fa2, $a1, 4
48; LA32D-NEXT:    fst.s $fa1, $a1, 0
49; LA32D-NEXT:    ret
50;
51; LA64F-LABEL: test_zero:
52; LA64F:       # %bb.0:
53; LA64F-NEXT:    fld.s $fa0, $a0, 12
54; LA64F-NEXT:    fld.s $fa1, $a0, 0
55; LA64F-NEXT:    fld.s $fa2, $a0, 4
56; LA64F-NEXT:    fld.s $fa3, $a0, 8
57; LA64F-NEXT:    movgr2fr.w $fa4, $zero
58; LA64F-NEXT:    fadd.s $fa1, $fa1, $fa4
59; LA64F-NEXT:    fadd.s $fa2, $fa2, $fa4
60; LA64F-NEXT:    fadd.s $fa3, $fa3, $fa4
61; LA64F-NEXT:    fadd.s $fa0, $fa0, $fa4
62; LA64F-NEXT:    fst.s $fa0, $a1, 12
63; LA64F-NEXT:    fst.s $fa3, $a1, 8
64; LA64F-NEXT:    fst.s $fa2, $a1, 4
65; LA64F-NEXT:    fst.s $fa1, $a1, 0
66; LA64F-NEXT:    ret
67;
68; LA64D-LABEL: test_zero:
69; LA64D:       # %bb.0:
70; LA64D-NEXT:    vld $vr0, $a0, 0
71; LA64D-NEXT:    vrepli.b $vr1, 0
72; LA64D-NEXT:    vfadd.s $vr0, $vr0, $vr1
73; LA64D-NEXT:    vst $vr0, $a1, 0
74; LA64D-NEXT:    ret
75  %p = load %f4, ptr %P
76  %R = fadd %f4 %p, zeroinitializer
77  store %f4 %R, ptr %S
78  ret void
79}
80
81define void @test_f2(ptr %P, ptr %S) nounwind {
82; LA32F-LABEL: test_f2:
83; LA32F:       # %bb.0:
84; LA32F-NEXT:    fld.s $fa0, $a0, 4
85; LA32F-NEXT:    fld.s $fa1, $a0, 0
86; LA32F-NEXT:    addi.w $a0, $zero, 1
87; LA32F-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI1_0)
88; LA32F-NEXT:    fld.s $fa2, $a2, %pc_lo12(.LCPI1_0)
89; LA32F-NEXT:    movgr2fr.w $fa3, $a0
90; LA32F-NEXT:    ffint.s.w $fa3, $fa3
91; LA32F-NEXT:    fadd.s $fa1, $fa1, $fa3
92; LA32F-NEXT:    fadd.s $fa0, $fa0, $fa2
93; LA32F-NEXT:    fst.s $fa0, $a1, 4
94; LA32F-NEXT:    fst.s $fa1, $a1, 0
95; LA32F-NEXT:    ret
96;
97; LA32D-LABEL: test_f2:
98; LA32D:       # %bb.0:
99; LA32D-NEXT:    fld.s $fa0, $a0, 4
100; LA32D-NEXT:    fld.s $fa1, $a0, 0
101; LA32D-NEXT:    addi.w $a0, $zero, 1
102; LA32D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI1_0)
103; LA32D-NEXT:    fld.s $fa2, $a2, %pc_lo12(.LCPI1_0)
104; LA32D-NEXT:    movgr2fr.w $fa3, $a0
105; LA32D-NEXT:    ffint.s.w $fa3, $fa3
106; LA32D-NEXT:    fadd.s $fa1, $fa1, $fa3
107; LA32D-NEXT:    fadd.s $fa0, $fa0, $fa2
108; LA32D-NEXT:    fst.s $fa0, $a1, 4
109; LA32D-NEXT:    fst.s $fa1, $a1, 0
110; LA32D-NEXT:    ret
111;
112; LA64F-LABEL: test_f2:
113; LA64F:       # %bb.0:
114; LA64F-NEXT:    fld.s $fa0, $a0, 4
115; LA64F-NEXT:    fld.s $fa1, $a0, 0
116; LA64F-NEXT:    addi.w $a0, $zero, 1
117; LA64F-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI1_0)
118; LA64F-NEXT:    fld.s $fa2, $a2, %pc_lo12(.LCPI1_0)
119; LA64F-NEXT:    movgr2fr.w $fa3, $a0
120; LA64F-NEXT:    ffint.s.w $fa3, $fa3
121; LA64F-NEXT:    fadd.s $fa1, $fa1, $fa3
122; LA64F-NEXT:    fadd.s $fa0, $fa0, $fa2
123; LA64F-NEXT:    fst.s $fa0, $a1, 4
124; LA64F-NEXT:    fst.s $fa1, $a1, 0
125; LA64F-NEXT:    ret
126;
127; LA64D-LABEL: test_f2:
128; LA64D:       # %bb.0:
129; LA64D-NEXT:    ld.d $a0, $a0, 0
130; LA64D-NEXT:    vinsgr2vr.d $vr0, $a0, 0
131; LA64D-NEXT:    lu12i.w $a0, 260096
132; LA64D-NEXT:    lu52i.d $a0, $a0, 1024
133; LA64D-NEXT:    vreplgr2vr.d $vr1, $a0
134; LA64D-NEXT:    vfadd.s $vr0, $vr0, $vr1
135; LA64D-NEXT:    vpickve2gr.d $a0, $vr0, 0
136; LA64D-NEXT:    st.d $a0, $a1, 0
137; LA64D-NEXT:    ret
138  %p = load %f2, ptr %P
139  %R = fadd %f2 %p, < float 1.000000e+00, float 2.000000e+00 >
140  store %f2 %R, ptr %S
141  ret void
142}
143
144define void @test_f4(ptr %P, ptr %S) nounwind {
145; LA32F-LABEL: test_f4:
146; LA32F:       # %bb.0:
147; LA32F-NEXT:    fld.s $fa0, $a0, 12
148; LA32F-NEXT:    fld.s $fa1, $a0, 8
149; LA32F-NEXT:    fld.s $fa2, $a0, 4
150; LA32F-NEXT:    fld.s $fa3, $a0, 0
151; LA32F-NEXT:    addi.w $a0, $zero, 1
152; LA32F-NEXT:    movgr2fr.w $fa4, $a0
153; LA32F-NEXT:    ffint.s.w $fa4, $fa4
154; LA32F-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_0)
155; LA32F-NEXT:    fld.s $fa5, $a0, %pc_lo12(.LCPI2_0)
156; LA32F-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_1)
157; LA32F-NEXT:    fld.s $fa6, $a0, %pc_lo12(.LCPI2_1)
158; LA32F-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_2)
159; LA32F-NEXT:    fld.s $fa7, $a0, %pc_lo12(.LCPI2_2)
160; LA32F-NEXT:    fadd.s $fa3, $fa3, $fa4
161; LA32F-NEXT:    fadd.s $fa2, $fa2, $fa5
162; LA32F-NEXT:    fadd.s $fa1, $fa1, $fa6
163; LA32F-NEXT:    fadd.s $fa0, $fa0, $fa7
164; LA32F-NEXT:    fst.s $fa0, $a1, 12
165; LA32F-NEXT:    fst.s $fa1, $a1, 8
166; LA32F-NEXT:    fst.s $fa2, $a1, 4
167; LA32F-NEXT:    fst.s $fa3, $a1, 0
168; LA32F-NEXT:    ret
169;
170; LA32D-LABEL: test_f4:
171; LA32D:       # %bb.0:
172; LA32D-NEXT:    fld.s $fa0, $a0, 12
173; LA32D-NEXT:    fld.s $fa1, $a0, 8
174; LA32D-NEXT:    fld.s $fa2, $a0, 4
175; LA32D-NEXT:    fld.s $fa3, $a0, 0
176; LA32D-NEXT:    addi.w $a0, $zero, 1
177; LA32D-NEXT:    movgr2fr.w $fa4, $a0
178; LA32D-NEXT:    ffint.s.w $fa4, $fa4
179; LA32D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_0)
180; LA32D-NEXT:    fld.s $fa5, $a0, %pc_lo12(.LCPI2_0)
181; LA32D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_1)
182; LA32D-NEXT:    fld.s $fa6, $a0, %pc_lo12(.LCPI2_1)
183; LA32D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_2)
184; LA32D-NEXT:    fld.s $fa7, $a0, %pc_lo12(.LCPI2_2)
185; LA32D-NEXT:    fadd.s $fa3, $fa3, $fa4
186; LA32D-NEXT:    fadd.s $fa2, $fa2, $fa5
187; LA32D-NEXT:    fadd.s $fa1, $fa1, $fa6
188; LA32D-NEXT:    fadd.s $fa0, $fa0, $fa7
189; LA32D-NEXT:    fst.s $fa0, $a1, 12
190; LA32D-NEXT:    fst.s $fa1, $a1, 8
191; LA32D-NEXT:    fst.s $fa2, $a1, 4
192; LA32D-NEXT:    fst.s $fa3, $a1, 0
193; LA32D-NEXT:    ret
194;
195; LA64F-LABEL: test_f4:
196; LA64F:       # %bb.0:
197; LA64F-NEXT:    fld.s $fa0, $a0, 12
198; LA64F-NEXT:    fld.s $fa1, $a0, 8
199; LA64F-NEXT:    fld.s $fa2, $a0, 4
200; LA64F-NEXT:    fld.s $fa3, $a0, 0
201; LA64F-NEXT:    addi.w $a0, $zero, 1
202; LA64F-NEXT:    movgr2fr.w $fa4, $a0
203; LA64F-NEXT:    ffint.s.w $fa4, $fa4
204; LA64F-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_0)
205; LA64F-NEXT:    fld.s $fa5, $a0, %pc_lo12(.LCPI2_0)
206; LA64F-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_1)
207; LA64F-NEXT:    fld.s $fa6, $a0, %pc_lo12(.LCPI2_1)
208; LA64F-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_2)
209; LA64F-NEXT:    fld.s $fa7, $a0, %pc_lo12(.LCPI2_2)
210; LA64F-NEXT:    fadd.s $fa3, $fa3, $fa4
211; LA64F-NEXT:    fadd.s $fa2, $fa2, $fa5
212; LA64F-NEXT:    fadd.s $fa1, $fa1, $fa6
213; LA64F-NEXT:    fadd.s $fa0, $fa0, $fa7
214; LA64F-NEXT:    fst.s $fa0, $a1, 12
215; LA64F-NEXT:    fst.s $fa1, $a1, 8
216; LA64F-NEXT:    fst.s $fa2, $a1, 4
217; LA64F-NEXT:    fst.s $fa3, $a1, 0
218; LA64F-NEXT:    ret
219;
220; LA64D-LABEL: test_f4:
221; LA64D:       # %bb.0:
222; LA64D-NEXT:    vld $vr0, $a0, 0
223; LA64D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI2_0)
224; LA64D-NEXT:    vld $vr1, $a0, %pc_lo12(.LCPI2_0)
225; LA64D-NEXT:    vfadd.s $vr0, $vr0, $vr1
226; LA64D-NEXT:    vst $vr0, $a1, 0
227; LA64D-NEXT:    ret
228  %p = load %f4, ptr %P
229  %R = fadd %f4 %p, < float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00 >
230  store %f4 %R, ptr %S
231  ret void
232}
233
234define void @test_f8(ptr %P, ptr %S) nounwind {
235; LA32F-LABEL: test_f8:
236; LA32F:       # %bb.0:
237; LA32F-NEXT:    addi.w $a2, $zero, 1
238; LA32F-NEXT:    movgr2fr.w $fa0, $a2
239; LA32F-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_0)
240; LA32F-NEXT:    fld.s $fa1, $a2, %pc_lo12(.LCPI3_0)
241; LA32F-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_1)
242; LA32F-NEXT:    fld.s $fa2, $a2, %pc_lo12(.LCPI3_1)
243; LA32F-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_2)
244; LA32F-NEXT:    fld.s $fa3, $a2, %pc_lo12(.LCPI3_2)
245; LA32F-NEXT:    fld.s $fa4, $a0, 28
246; LA32F-NEXT:    fld.s $fa5, $a0, 24
247; LA32F-NEXT:    fld.s $fa6, $a0, 12
248; LA32F-NEXT:    fld.s $fa7, $a0, 8
249; LA32F-NEXT:    fld.s $ft0, $a0, 0
250; LA32F-NEXT:    fld.s $ft1, $a0, 16
251; LA32F-NEXT:    fld.s $ft2, $a0, 4
252; LA32F-NEXT:    ffint.s.w $fa0, $fa0
253; LA32F-NEXT:    fadd.s $ft0, $ft0, $fa0
254; LA32F-NEXT:    fadd.s $fa0, $ft1, $fa0
255; LA32F-NEXT:    fld.s $ft1, $a0, 20
256; LA32F-NEXT:    fadd.s $ft2, $ft2, $fa1
257; LA32F-NEXT:    fadd.s $fa7, $fa7, $fa2
258; LA32F-NEXT:    fadd.s $fa6, $fa6, $fa3
259; LA32F-NEXT:    fadd.s $fa1, $ft1, $fa1
260; LA32F-NEXT:    fadd.s $fa2, $fa5, $fa2
261; LA32F-NEXT:    fadd.s $fa3, $fa4, $fa3
262; LA32F-NEXT:    fst.s $fa3, $a1, 28
263; LA32F-NEXT:    fst.s $fa2, $a1, 24
264; LA32F-NEXT:    fst.s $fa1, $a1, 20
265; LA32F-NEXT:    fst.s $fa6, $a1, 12
266; LA32F-NEXT:    fst.s $fa7, $a1, 8
267; LA32F-NEXT:    fst.s $ft2, $a1, 4
268; LA32F-NEXT:    fst.s $fa0, $a1, 16
269; LA32F-NEXT:    fst.s $ft0, $a1, 0
270; LA32F-NEXT:    ret
271;
272; LA32D-LABEL: test_f8:
273; LA32D:       # %bb.0:
274; LA32D-NEXT:    addi.w $a2, $zero, 1
275; LA32D-NEXT:    movgr2fr.w $fa0, $a2
276; LA32D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_0)
277; LA32D-NEXT:    fld.s $fa1, $a2, %pc_lo12(.LCPI3_0)
278; LA32D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_1)
279; LA32D-NEXT:    fld.s $fa2, $a2, %pc_lo12(.LCPI3_1)
280; LA32D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_2)
281; LA32D-NEXT:    fld.s $fa3, $a2, %pc_lo12(.LCPI3_2)
282; LA32D-NEXT:    fld.s $fa4, $a0, 28
283; LA32D-NEXT:    fld.s $fa5, $a0, 24
284; LA32D-NEXT:    fld.s $fa6, $a0, 12
285; LA32D-NEXT:    fld.s $fa7, $a0, 8
286; LA32D-NEXT:    fld.s $ft0, $a0, 0
287; LA32D-NEXT:    fld.s $ft1, $a0, 16
288; LA32D-NEXT:    fld.s $ft2, $a0, 4
289; LA32D-NEXT:    ffint.s.w $fa0, $fa0
290; LA32D-NEXT:    fadd.s $ft0, $ft0, $fa0
291; LA32D-NEXT:    fadd.s $fa0, $ft1, $fa0
292; LA32D-NEXT:    fld.s $ft1, $a0, 20
293; LA32D-NEXT:    fadd.s $ft2, $ft2, $fa1
294; LA32D-NEXT:    fadd.s $fa7, $fa7, $fa2
295; LA32D-NEXT:    fadd.s $fa6, $fa6, $fa3
296; LA32D-NEXT:    fadd.s $fa1, $ft1, $fa1
297; LA32D-NEXT:    fadd.s $fa2, $fa5, $fa2
298; LA32D-NEXT:    fadd.s $fa3, $fa4, $fa3
299; LA32D-NEXT:    fst.s $fa3, $a1, 28
300; LA32D-NEXT:    fst.s $fa2, $a1, 24
301; LA32D-NEXT:    fst.s $fa1, $a1, 20
302; LA32D-NEXT:    fst.s $fa6, $a1, 12
303; LA32D-NEXT:    fst.s $fa7, $a1, 8
304; LA32D-NEXT:    fst.s $ft2, $a1, 4
305; LA32D-NEXT:    fst.s $fa0, $a1, 16
306; LA32D-NEXT:    fst.s $ft0, $a1, 0
307; LA32D-NEXT:    ret
308;
309; LA64F-LABEL: test_f8:
310; LA64F:       # %bb.0:
311; LA64F-NEXT:    addi.w $a2, $zero, 1
312; LA64F-NEXT:    movgr2fr.w $fa0, $a2
313; LA64F-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_0)
314; LA64F-NEXT:    fld.s $fa1, $a2, %pc_lo12(.LCPI3_0)
315; LA64F-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_1)
316; LA64F-NEXT:    fld.s $fa2, $a2, %pc_lo12(.LCPI3_1)
317; LA64F-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_2)
318; LA64F-NEXT:    fld.s $fa3, $a2, %pc_lo12(.LCPI3_2)
319; LA64F-NEXT:    fld.s $fa4, $a0, 28
320; LA64F-NEXT:    fld.s $fa5, $a0, 24
321; LA64F-NEXT:    fld.s $fa6, $a0, 12
322; LA64F-NEXT:    fld.s $fa7, $a0, 8
323; LA64F-NEXT:    fld.s $ft0, $a0, 0
324; LA64F-NEXT:    fld.s $ft1, $a0, 16
325; LA64F-NEXT:    fld.s $ft2, $a0, 4
326; LA64F-NEXT:    ffint.s.w $fa0, $fa0
327; LA64F-NEXT:    fadd.s $ft0, $ft0, $fa0
328; LA64F-NEXT:    fadd.s $fa0, $ft1, $fa0
329; LA64F-NEXT:    fld.s $ft1, $a0, 20
330; LA64F-NEXT:    fadd.s $ft2, $ft2, $fa1
331; LA64F-NEXT:    fadd.s $fa7, $fa7, $fa2
332; LA64F-NEXT:    fadd.s $fa6, $fa6, $fa3
333; LA64F-NEXT:    fadd.s $fa1, $ft1, $fa1
334; LA64F-NEXT:    fadd.s $fa2, $fa5, $fa2
335; LA64F-NEXT:    fadd.s $fa3, $fa4, $fa3
336; LA64F-NEXT:    fst.s $fa3, $a1, 28
337; LA64F-NEXT:    fst.s $fa2, $a1, 24
338; LA64F-NEXT:    fst.s $fa1, $a1, 20
339; LA64F-NEXT:    fst.s $fa6, $a1, 12
340; LA64F-NEXT:    fst.s $fa7, $a1, 8
341; LA64F-NEXT:    fst.s $ft2, $a1, 4
342; LA64F-NEXT:    fst.s $fa0, $a1, 16
343; LA64F-NEXT:    fst.s $ft0, $a1, 0
344; LA64F-NEXT:    ret
345;
346; LA64D-LABEL: test_f8:
347; LA64D:       # %bb.0:
348; LA64D-NEXT:    vld $vr0, $a0, 16
349; LA64D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI3_0)
350; LA64D-NEXT:    vld $vr1, $a2, %pc_lo12(.LCPI3_0)
351; LA64D-NEXT:    vld $vr2, $a0, 0
352; LA64D-NEXT:    vfadd.s $vr0, $vr0, $vr1
353; LA64D-NEXT:    vfadd.s $vr1, $vr2, $vr1
354; LA64D-NEXT:    vst $vr1, $a1, 0
355; LA64D-NEXT:    vst $vr0, $a1, 16
356; LA64D-NEXT:    ret
357  %p = load %f8, ptr %P
358  %R = fadd %f8 %p, < float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00, float 1.000000e+00, float 2.000000e+00, float 3.000000e+00, float 4.000000e+00 >
359  store %f8 %R, ptr %S
360  ret void
361}
362
363define void @test_d2(ptr %P, ptr %S) nounwind {
364; LA32F-LABEL: test_d2:
365; LA32F:       # %bb.0:
366; LA32F-NEXT:    addi.w $sp, $sp, -32
367; LA32F-NEXT:    st.w $ra, $sp, 28 # 4-byte Folded Spill
368; LA32F-NEXT:    st.w $fp, $sp, 24 # 4-byte Folded Spill
369; LA32F-NEXT:    st.w $s0, $sp, 20 # 4-byte Folded Spill
370; LA32F-NEXT:    st.w $s1, $sp, 16 # 4-byte Folded Spill
371; LA32F-NEXT:    st.w $s2, $sp, 12 # 4-byte Folded Spill
372; LA32F-NEXT:    st.w $s3, $sp, 8 # 4-byte Folded Spill
373; LA32F-NEXT:    ld.w $fp, $a0, 8
374; LA32F-NEXT:    ld.w $s0, $a0, 12
375; LA32F-NEXT:    ld.w $a2, $a0, 0
376; LA32F-NEXT:    ld.w $a4, $a0, 4
377; LA32F-NEXT:    move $s1, $a1
378; LA32F-NEXT:    lu12i.w $a3, 261888
379; LA32F-NEXT:    move $a0, $a2
380; LA32F-NEXT:    move $a1, $a4
381; LA32F-NEXT:    move $a2, $zero
382; LA32F-NEXT:    bl %plt(__adddf3)
383; LA32F-NEXT:    move $s2, $a0
384; LA32F-NEXT:    move $s3, $a1
385; LA32F-NEXT:    lu12i.w $a3, 262144
386; LA32F-NEXT:    move $a0, $fp
387; LA32F-NEXT:    move $a1, $s0
388; LA32F-NEXT:    move $a2, $zero
389; LA32F-NEXT:    bl %plt(__adddf3)
390; LA32F-NEXT:    st.w $a0, $s1, 8
391; LA32F-NEXT:    st.w $a1, $s1, 12
392; LA32F-NEXT:    st.w $s2, $s1, 0
393; LA32F-NEXT:    st.w $s3, $s1, 4
394; LA32F-NEXT:    ld.w $s3, $sp, 8 # 4-byte Folded Reload
395; LA32F-NEXT:    ld.w $s2, $sp, 12 # 4-byte Folded Reload
396; LA32F-NEXT:    ld.w $s1, $sp, 16 # 4-byte Folded Reload
397; LA32F-NEXT:    ld.w $s0, $sp, 20 # 4-byte Folded Reload
398; LA32F-NEXT:    ld.w $fp, $sp, 24 # 4-byte Folded Reload
399; LA32F-NEXT:    ld.w $ra, $sp, 28 # 4-byte Folded Reload
400; LA32F-NEXT:    addi.w $sp, $sp, 32
401; LA32F-NEXT:    ret
402;
403; LA32D-LABEL: test_d2:
404; LA32D:       # %bb.0:
405; LA32D-NEXT:    fld.d $fa0, $a0, 8
406; LA32D-NEXT:    fld.d $fa1, $a0, 0
407; LA32D-NEXT:    addi.w $a0, $zero, 1
408; LA32D-NEXT:    movgr2fr.w $fa2, $a0
409; LA32D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI4_0)
410; LA32D-NEXT:    fld.d $fa3, $a0, %pc_lo12(.LCPI4_0)
411; LA32D-NEXT:    ffint.s.w $fa2, $fa2
412; LA32D-NEXT:    fcvt.d.s $fa2, $fa2
413; LA32D-NEXT:    fadd.d $fa1, $fa1, $fa2
414; LA32D-NEXT:    fadd.d $fa0, $fa0, $fa3
415; LA32D-NEXT:    fst.d $fa0, $a1, 8
416; LA32D-NEXT:    fst.d $fa1, $a1, 0
417; LA32D-NEXT:    ret
418;
419; LA64F-LABEL: test_d2:
420; LA64F:       # %bb.0:
421; LA64F-NEXT:    addi.d $sp, $sp, -32
422; LA64F-NEXT:    st.d $ra, $sp, 24 # 8-byte Folded Spill
423; LA64F-NEXT:    st.d $fp, $sp, 16 # 8-byte Folded Spill
424; LA64F-NEXT:    st.d $s0, $sp, 8 # 8-byte Folded Spill
425; LA64F-NEXT:    st.d $s1, $sp, 0 # 8-byte Folded Spill
426; LA64F-NEXT:    ld.d $fp, $a0, 8
427; LA64F-NEXT:    ld.d $a0, $a0, 0
428; LA64F-NEXT:    move $s0, $a1
429; LA64F-NEXT:    lu52i.d $a1, $zero, 1023
430; LA64F-NEXT:    bl %plt(__adddf3)
431; LA64F-NEXT:    move $s1, $a0
432; LA64F-NEXT:    lu52i.d $a1, $zero, 1024
433; LA64F-NEXT:    move $a0, $fp
434; LA64F-NEXT:    bl %plt(__adddf3)
435; LA64F-NEXT:    st.d $a0, $s0, 8
436; LA64F-NEXT:    st.d $s1, $s0, 0
437; LA64F-NEXT:    ld.d $s1, $sp, 0 # 8-byte Folded Reload
438; LA64F-NEXT:    ld.d $s0, $sp, 8 # 8-byte Folded Reload
439; LA64F-NEXT:    ld.d $fp, $sp, 16 # 8-byte Folded Reload
440; LA64F-NEXT:    ld.d $ra, $sp, 24 # 8-byte Folded Reload
441; LA64F-NEXT:    addi.d $sp, $sp, 32
442; LA64F-NEXT:    ret
443;
444; LA64D-LABEL: test_d2:
445; LA64D:       # %bb.0:
446; LA64D-NEXT:    vld $vr0, $a0, 0
447; LA64D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI4_0)
448; LA64D-NEXT:    vld $vr1, $a0, %pc_lo12(.LCPI4_0)
449; LA64D-NEXT:    vfadd.d $vr0, $vr0, $vr1
450; LA64D-NEXT:    vst $vr0, $a1, 0
451; LA64D-NEXT:    ret
452  %p = load %d2, ptr %P
453  %R = fadd %d2 %p, < double 1.000000e+00, double 2.000000e+00 >
454  store %d2 %R, ptr %S
455  ret void
456}
457
458define void @test_d4(ptr %P, ptr %S) nounwind {
459; LA32F-LABEL: test_d4:
460; LA32F:       # %bb.0:
461; LA32F-NEXT:    addi.w $sp, $sp, -48
462; LA32F-NEXT:    st.w $ra, $sp, 44 # 4-byte Folded Spill
463; LA32F-NEXT:    st.w $fp, $sp, 40 # 4-byte Folded Spill
464; LA32F-NEXT:    st.w $s0, $sp, 36 # 4-byte Folded Spill
465; LA32F-NEXT:    st.w $s1, $sp, 32 # 4-byte Folded Spill
466; LA32F-NEXT:    st.w $s2, $sp, 28 # 4-byte Folded Spill
467; LA32F-NEXT:    st.w $s3, $sp, 24 # 4-byte Folded Spill
468; LA32F-NEXT:    st.w $s4, $sp, 20 # 4-byte Folded Spill
469; LA32F-NEXT:    st.w $s5, $sp, 16 # 4-byte Folded Spill
470; LA32F-NEXT:    st.w $s6, $sp, 12 # 4-byte Folded Spill
471; LA32F-NEXT:    st.w $s7, $sp, 8 # 4-byte Folded Spill
472; LA32F-NEXT:    ld.w $fp, $a0, 24
473; LA32F-NEXT:    ld.w $s0, $a0, 28
474; LA32F-NEXT:    ld.w $s1, $a0, 16
475; LA32F-NEXT:    ld.w $s2, $a0, 20
476; LA32F-NEXT:    ld.w $s3, $a0, 8
477; LA32F-NEXT:    ld.w $s4, $a0, 12
478; LA32F-NEXT:    ld.w $a2, $a0, 0
479; LA32F-NEXT:    ld.w $a4, $a0, 4
480; LA32F-NEXT:    move $s5, $a1
481; LA32F-NEXT:    lu12i.w $a3, 261888
482; LA32F-NEXT:    move $a0, $a2
483; LA32F-NEXT:    move $a1, $a4
484; LA32F-NEXT:    move $a2, $zero
485; LA32F-NEXT:    bl %plt(__adddf3)
486; LA32F-NEXT:    move $s6, $a0
487; LA32F-NEXT:    move $s7, $a1
488; LA32F-NEXT:    lu12i.w $a3, 262144
489; LA32F-NEXT:    move $a0, $s3
490; LA32F-NEXT:    move $a1, $s4
491; LA32F-NEXT:    move $a2, $zero
492; LA32F-NEXT:    bl %plt(__adddf3)
493; LA32F-NEXT:    move $s3, $a0
494; LA32F-NEXT:    move $s4, $a1
495; LA32F-NEXT:    lu12i.w $a3, 262272
496; LA32F-NEXT:    move $a0, $s1
497; LA32F-NEXT:    move $a1, $s2
498; LA32F-NEXT:    move $a2, $zero
499; LA32F-NEXT:    bl %plt(__adddf3)
500; LA32F-NEXT:    move $s1, $a0
501; LA32F-NEXT:    move $s2, $a1
502; LA32F-NEXT:    lu12i.w $a3, 262400
503; LA32F-NEXT:    move $a0, $fp
504; LA32F-NEXT:    move $a1, $s0
505; LA32F-NEXT:    move $a2, $zero
506; LA32F-NEXT:    bl %plt(__adddf3)
507; LA32F-NEXT:    st.w $a0, $s5, 24
508; LA32F-NEXT:    st.w $a1, $s5, 28
509; LA32F-NEXT:    st.w $s1, $s5, 16
510; LA32F-NEXT:    st.w $s2, $s5, 20
511; LA32F-NEXT:    st.w $s3, $s5, 8
512; LA32F-NEXT:    st.w $s4, $s5, 12
513; LA32F-NEXT:    st.w $s6, $s5, 0
514; LA32F-NEXT:    st.w $s7, $s5, 4
515; LA32F-NEXT:    ld.w $s7, $sp, 8 # 4-byte Folded Reload
516; LA32F-NEXT:    ld.w $s6, $sp, 12 # 4-byte Folded Reload
517; LA32F-NEXT:    ld.w $s5, $sp, 16 # 4-byte Folded Reload
518; LA32F-NEXT:    ld.w $s4, $sp, 20 # 4-byte Folded Reload
519; LA32F-NEXT:    ld.w $s3, $sp, 24 # 4-byte Folded Reload
520; LA32F-NEXT:    ld.w $s2, $sp, 28 # 4-byte Folded Reload
521; LA32F-NEXT:    ld.w $s1, $sp, 32 # 4-byte Folded Reload
522; LA32F-NEXT:    ld.w $s0, $sp, 36 # 4-byte Folded Reload
523; LA32F-NEXT:    ld.w $fp, $sp, 40 # 4-byte Folded Reload
524; LA32F-NEXT:    ld.w $ra, $sp, 44 # 4-byte Folded Reload
525; LA32F-NEXT:    addi.w $sp, $sp, 48
526; LA32F-NEXT:    ret
527;
528; LA32D-LABEL: test_d4:
529; LA32D:       # %bb.0:
530; LA32D-NEXT:    fld.d $fa0, $a0, 24
531; LA32D-NEXT:    fld.d $fa1, $a0, 16
532; LA32D-NEXT:    fld.d $fa2, $a0, 8
533; LA32D-NEXT:    fld.d $fa3, $a0, 0
534; LA32D-NEXT:    addi.w $a0, $zero, 1
535; LA32D-NEXT:    movgr2fr.w $fa4, $a0
536; LA32D-NEXT:    ffint.s.w $fa4, $fa4
537; LA32D-NEXT:    fcvt.d.s $fa4, $fa4
538; LA32D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI5_0)
539; LA32D-NEXT:    fld.d $fa5, $a0, %pc_lo12(.LCPI5_0)
540; LA32D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI5_1)
541; LA32D-NEXT:    fld.d $fa6, $a0, %pc_lo12(.LCPI5_1)
542; LA32D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI5_2)
543; LA32D-NEXT:    fld.d $fa7, $a0, %pc_lo12(.LCPI5_2)
544; LA32D-NEXT:    fadd.d $fa3, $fa3, $fa4
545; LA32D-NEXT:    fadd.d $fa2, $fa2, $fa5
546; LA32D-NEXT:    fadd.d $fa1, $fa1, $fa6
547; LA32D-NEXT:    fadd.d $fa0, $fa0, $fa7
548; LA32D-NEXT:    fst.d $fa0, $a1, 24
549; LA32D-NEXT:    fst.d $fa1, $a1, 16
550; LA32D-NEXT:    fst.d $fa2, $a1, 8
551; LA32D-NEXT:    fst.d $fa3, $a1, 0
552; LA32D-NEXT:    ret
553;
554; LA64F-LABEL: test_d4:
555; LA64F:       # %bb.0:
556; LA64F-NEXT:    addi.d $sp, $sp, -48
557; LA64F-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill
558; LA64F-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill
559; LA64F-NEXT:    st.d $s0, $sp, 24 # 8-byte Folded Spill
560; LA64F-NEXT:    st.d $s1, $sp, 16 # 8-byte Folded Spill
561; LA64F-NEXT:    st.d $s2, $sp, 8 # 8-byte Folded Spill
562; LA64F-NEXT:    st.d $s3, $sp, 0 # 8-byte Folded Spill
563; LA64F-NEXT:    ld.d $fp, $a0, 24
564; LA64F-NEXT:    ld.d $s0, $a0, 8
565; LA64F-NEXT:    ld.d $s1, $a0, 0
566; LA64F-NEXT:    ld.d $a0, $a0, 16
567; LA64F-NEXT:    move $s2, $a1
568; LA64F-NEXT:    ori $a1, $zero, 0
569; LA64F-NEXT:    lu32i.d $a1, -524288
570; LA64F-NEXT:    lu52i.d $a1, $a1, 1024
571; LA64F-NEXT:    bl %plt(__adddf3)
572; LA64F-NEXT:    move $s3, $a0
573; LA64F-NEXT:    lu52i.d $a1, $zero, 1023
574; LA64F-NEXT:    move $a0, $s1
575; LA64F-NEXT:    bl %plt(__adddf3)
576; LA64F-NEXT:    move $s1, $a0
577; LA64F-NEXT:    lu52i.d $a1, $zero, 1024
578; LA64F-NEXT:    move $a0, $s0
579; LA64F-NEXT:    bl %plt(__adddf3)
580; LA64F-NEXT:    move $s0, $a0
581; LA64F-NEXT:    lu52i.d $a1, $zero, 1025
582; LA64F-NEXT:    move $a0, $fp
583; LA64F-NEXT:    bl %plt(__adddf3)
584; LA64F-NEXT:    st.d $a0, $s2, 24
585; LA64F-NEXT:    st.d $s0, $s2, 8
586; LA64F-NEXT:    st.d $s1, $s2, 0
587; LA64F-NEXT:    st.d $s3, $s2, 16
588; LA64F-NEXT:    ld.d $s3, $sp, 0 # 8-byte Folded Reload
589; LA64F-NEXT:    ld.d $s2, $sp, 8 # 8-byte Folded Reload
590; LA64F-NEXT:    ld.d $s1, $sp, 16 # 8-byte Folded Reload
591; LA64F-NEXT:    ld.d $s0, $sp, 24 # 8-byte Folded Reload
592; LA64F-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload
593; LA64F-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload
594; LA64F-NEXT:    addi.d $sp, $sp, 48
595; LA64F-NEXT:    ret
596;
597; LA64D-LABEL: test_d4:
598; LA64D:       # %bb.0:
599; LA64D-NEXT:    vld $vr0, $a0, 0
600; LA64D-NEXT:    vld $vr1, $a0, 16
601; LA64D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI5_0)
602; LA64D-NEXT:    vld $vr2, $a0, %pc_lo12(.LCPI5_0)
603; LA64D-NEXT:    pcalau12i $a0, %pc_hi20(.LCPI5_1)
604; LA64D-NEXT:    vld $vr3, $a0, %pc_lo12(.LCPI5_1)
605; LA64D-NEXT:    vfadd.d $vr1, $vr1, $vr2
606; LA64D-NEXT:    vfadd.d $vr0, $vr0, $vr3
607; LA64D-NEXT:    vst $vr0, $a1, 0
608; LA64D-NEXT:    vst $vr1, $a1, 16
609; LA64D-NEXT:    ret
610  %p = load %d4, ptr %P
611  %R = fadd %d4 %p, < double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00 >
612  store %d4 %R, ptr %S
613  ret void
614}
615
616define void @test_d8(ptr %P, ptr %S) nounwind {
617; LA32F-LABEL: test_d8:
618; LA32F:       # %bb.0:
619; LA32F-NEXT:    addi.w $sp, $sp, -96
620; LA32F-NEXT:    st.w $ra, $sp, 92 # 4-byte Folded Spill
621; LA32F-NEXT:    st.w $fp, $sp, 88 # 4-byte Folded Spill
622; LA32F-NEXT:    st.w $s0, $sp, 84 # 4-byte Folded Spill
623; LA32F-NEXT:    st.w $s1, $sp, 80 # 4-byte Folded Spill
624; LA32F-NEXT:    st.w $s2, $sp, 76 # 4-byte Folded Spill
625; LA32F-NEXT:    st.w $s3, $sp, 72 # 4-byte Folded Spill
626; LA32F-NEXT:    st.w $s4, $sp, 68 # 4-byte Folded Spill
627; LA32F-NEXT:    st.w $s5, $sp, 64 # 4-byte Folded Spill
628; LA32F-NEXT:    st.w $s6, $sp, 60 # 4-byte Folded Spill
629; LA32F-NEXT:    st.w $s7, $sp, 56 # 4-byte Folded Spill
630; LA32F-NEXT:    st.w $s8, $sp, 52 # 4-byte Folded Spill
631; LA32F-NEXT:    ld.w $a2, $a0, 56
632; LA32F-NEXT:    st.w $a2, $sp, 48 # 4-byte Folded Spill
633; LA32F-NEXT:    ld.w $a2, $a0, 60
634; LA32F-NEXT:    st.w $a2, $sp, 44 # 4-byte Folded Spill
635; LA32F-NEXT:    ld.w $a2, $a0, 48
636; LA32F-NEXT:    st.w $a2, $sp, 32 # 4-byte Folded Spill
637; LA32F-NEXT:    ld.w $a2, $a0, 52
638; LA32F-NEXT:    st.w $a2, $sp, 28 # 4-byte Folded Spill
639; LA32F-NEXT:    ld.w $s8, $a0, 40
640; LA32F-NEXT:    ld.w $a2, $a0, 44
641; LA32F-NEXT:    st.w $a2, $sp, 16 # 4-byte Folded Spill
642; LA32F-NEXT:    ld.w $s3, $a0, 32
643; LA32F-NEXT:    ld.w $s4, $a0, 36
644; LA32F-NEXT:    ld.w $s5, $a0, 24
645; LA32F-NEXT:    ld.w $s6, $a0, 28
646; LA32F-NEXT:    ld.w $s1, $a0, 16
647; LA32F-NEXT:    ld.w $s2, $a0, 20
648; LA32F-NEXT:    ld.w $s7, $a0, 8
649; LA32F-NEXT:    ld.w $s0, $a0, 12
650; LA32F-NEXT:    ld.w $a2, $a0, 0
651; LA32F-NEXT:    ld.w $a4, $a0, 4
652; LA32F-NEXT:    move $fp, $a1
653; LA32F-NEXT:    lu12i.w $a3, 261888
654; LA32F-NEXT:    move $a0, $a2
655; LA32F-NEXT:    move $a1, $a4
656; LA32F-NEXT:    move $a2, $zero
657; LA32F-NEXT:    bl %plt(__adddf3)
658; LA32F-NEXT:    st.w $a0, $sp, 40 # 4-byte Folded Spill
659; LA32F-NEXT:    st.w $a1, $sp, 36 # 4-byte Folded Spill
660; LA32F-NEXT:    lu12i.w $a3, 262144
661; LA32F-NEXT:    move $a0, $s7
662; LA32F-NEXT:    move $a1, $s0
663; LA32F-NEXT:    move $a2, $zero
664; LA32F-NEXT:    move $s0, $a3
665; LA32F-NEXT:    bl %plt(__adddf3)
666; LA32F-NEXT:    st.w $a0, $sp, 24 # 4-byte Folded Spill
667; LA32F-NEXT:    st.w $a1, $sp, 20 # 4-byte Folded Spill
668; LA32F-NEXT:    lu12i.w $s7, 262272
669; LA32F-NEXT:    move $a0, $s1
670; LA32F-NEXT:    move $a1, $s2
671; LA32F-NEXT:    move $a2, $zero
672; LA32F-NEXT:    move $a3, $s7
673; LA32F-NEXT:    bl %plt(__adddf3)
674; LA32F-NEXT:    st.w $a0, $sp, 12 # 4-byte Folded Spill
675; LA32F-NEXT:    move $s2, $a1
676; LA32F-NEXT:    lu12i.w $a3, 262400
677; LA32F-NEXT:    move $a0, $s5
678; LA32F-NEXT:    move $a1, $s6
679; LA32F-NEXT:    move $a2, $zero
680; LA32F-NEXT:    bl %plt(__adddf3)
681; LA32F-NEXT:    move $s5, $a0
682; LA32F-NEXT:    move $s6, $a1
683; LA32F-NEXT:    move $a0, $s3
684; LA32F-NEXT:    move $a1, $s4
685; LA32F-NEXT:    move $a2, $zero
686; LA32F-NEXT:    lu12i.w $a3, 261888
687; LA32F-NEXT:    bl %plt(__adddf3)
688; LA32F-NEXT:    move $s3, $a0
689; LA32F-NEXT:    move $s4, $a1
690; LA32F-NEXT:    move $a0, $s8
691; LA32F-NEXT:    ld.w $a1, $sp, 16 # 4-byte Folded Reload
692; LA32F-NEXT:    move $a2, $zero
693; LA32F-NEXT:    move $a3, $s0
694; LA32F-NEXT:    bl %plt(__adddf3)
695; LA32F-NEXT:    move $s8, $a0
696; LA32F-NEXT:    move $s0, $a1
697; LA32F-NEXT:    ld.w $a0, $sp, 32 # 4-byte Folded Reload
698; LA32F-NEXT:    ld.w $a1, $sp, 28 # 4-byte Folded Reload
699; LA32F-NEXT:    move $a2, $zero
700; LA32F-NEXT:    move $a3, $s7
701; LA32F-NEXT:    bl %plt(__adddf3)
702; LA32F-NEXT:    move $s7, $a0
703; LA32F-NEXT:    move $s1, $a1
704; LA32F-NEXT:    ld.w $a0, $sp, 48 # 4-byte Folded Reload
705; LA32F-NEXT:    ld.w $a1, $sp, 44 # 4-byte Folded Reload
706; LA32F-NEXT:    move $a2, $zero
707; LA32F-NEXT:    lu12i.w $a3, 262400
708; LA32F-NEXT:    bl %plt(__adddf3)
709; LA32F-NEXT:    st.w $a0, $fp, 56
710; LA32F-NEXT:    st.w $a1, $fp, 60
711; LA32F-NEXT:    st.w $s7, $fp, 48
712; LA32F-NEXT:    st.w $s1, $fp, 52
713; LA32F-NEXT:    st.w $s8, $fp, 40
714; LA32F-NEXT:    st.w $s0, $fp, 44
715; LA32F-NEXT:    st.w $s3, $fp, 32
716; LA32F-NEXT:    st.w $s4, $fp, 36
717; LA32F-NEXT:    st.w $s5, $fp, 24
718; LA32F-NEXT:    st.w $s6, $fp, 28
719; LA32F-NEXT:    ld.w $a0, $sp, 12 # 4-byte Folded Reload
720; LA32F-NEXT:    st.w $a0, $fp, 16
721; LA32F-NEXT:    st.w $s2, $fp, 20
722; LA32F-NEXT:    ld.w $a0, $sp, 24 # 4-byte Folded Reload
723; LA32F-NEXT:    st.w $a0, $fp, 8
724; LA32F-NEXT:    ld.w $a0, $sp, 20 # 4-byte Folded Reload
725; LA32F-NEXT:    st.w $a0, $fp, 12
726; LA32F-NEXT:    ld.w $a0, $sp, 40 # 4-byte Folded Reload
727; LA32F-NEXT:    st.w $a0, $fp, 0
728; LA32F-NEXT:    ld.w $a0, $sp, 36 # 4-byte Folded Reload
729; LA32F-NEXT:    st.w $a0, $fp, 4
730; LA32F-NEXT:    ld.w $s8, $sp, 52 # 4-byte Folded Reload
731; LA32F-NEXT:    ld.w $s7, $sp, 56 # 4-byte Folded Reload
732; LA32F-NEXT:    ld.w $s6, $sp, 60 # 4-byte Folded Reload
733; LA32F-NEXT:    ld.w $s5, $sp, 64 # 4-byte Folded Reload
734; LA32F-NEXT:    ld.w $s4, $sp, 68 # 4-byte Folded Reload
735; LA32F-NEXT:    ld.w $s3, $sp, 72 # 4-byte Folded Reload
736; LA32F-NEXT:    ld.w $s2, $sp, 76 # 4-byte Folded Reload
737; LA32F-NEXT:    ld.w $s1, $sp, 80 # 4-byte Folded Reload
738; LA32F-NEXT:    ld.w $s0, $sp, 84 # 4-byte Folded Reload
739; LA32F-NEXT:    ld.w $fp, $sp, 88 # 4-byte Folded Reload
740; LA32F-NEXT:    ld.w $ra, $sp, 92 # 4-byte Folded Reload
741; LA32F-NEXT:    addi.w $sp, $sp, 96
742; LA32F-NEXT:    ret
743;
744; LA32D-LABEL: test_d8:
745; LA32D:       # %bb.0:
746; LA32D-NEXT:    addi.w $a2, $zero, 1
747; LA32D-NEXT:    movgr2fr.w $fa0, $a2
748; LA32D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI6_0)
749; LA32D-NEXT:    fld.d $fa1, $a2, %pc_lo12(.LCPI6_0)
750; LA32D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI6_1)
751; LA32D-NEXT:    fld.d $fa2, $a2, %pc_lo12(.LCPI6_1)
752; LA32D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI6_2)
753; LA32D-NEXT:    fld.d $fa3, $a2, %pc_lo12(.LCPI6_2)
754; LA32D-NEXT:    fld.d $fa4, $a0, 56
755; LA32D-NEXT:    fld.d $fa5, $a0, 48
756; LA32D-NEXT:    fld.d $fa6, $a0, 24
757; LA32D-NEXT:    fld.d $fa7, $a0, 16
758; LA32D-NEXT:    fld.d $ft0, $a0, 8
759; LA32D-NEXT:    fld.d $ft1, $a0, 0
760; LA32D-NEXT:    fld.d $ft2, $a0, 32
761; LA32D-NEXT:    ffint.s.w $fa0, $fa0
762; LA32D-NEXT:    fcvt.d.s $fa0, $fa0
763; LA32D-NEXT:    fadd.d $ft1, $ft1, $fa0
764; LA32D-NEXT:    fadd.d $fa0, $ft2, $fa0
765; LA32D-NEXT:    fld.d $ft2, $a0, 40
766; LA32D-NEXT:    fadd.d $ft0, $ft0, $fa1
767; LA32D-NEXT:    fadd.d $fa7, $fa7, $fa2
768; LA32D-NEXT:    fadd.d $fa6, $fa6, $fa3
769; LA32D-NEXT:    fadd.d $fa1, $ft2, $fa1
770; LA32D-NEXT:    fadd.d $fa2, $fa5, $fa2
771; LA32D-NEXT:    fadd.d $fa3, $fa4, $fa3
772; LA32D-NEXT:    fst.d $fa3, $a1, 56
773; LA32D-NEXT:    fst.d $fa2, $a1, 48
774; LA32D-NEXT:    fst.d $fa1, $a1, 40
775; LA32D-NEXT:    fst.d $fa6, $a1, 24
776; LA32D-NEXT:    fst.d $fa7, $a1, 16
777; LA32D-NEXT:    fst.d $ft0, $a1, 8
778; LA32D-NEXT:    fst.d $fa0, $a1, 32
779; LA32D-NEXT:    fst.d $ft1, $a1, 0
780; LA32D-NEXT:    ret
781;
782; LA64F-LABEL: test_d8:
783; LA64F:       # %bb.0:
784; LA64F-NEXT:    addi.d $sp, $sp, -112
785; LA64F-NEXT:    st.d $ra, $sp, 104 # 8-byte Folded Spill
786; LA64F-NEXT:    st.d $fp, $sp, 96 # 8-byte Folded Spill
787; LA64F-NEXT:    st.d $s0, $sp, 88 # 8-byte Folded Spill
788; LA64F-NEXT:    st.d $s1, $sp, 80 # 8-byte Folded Spill
789; LA64F-NEXT:    st.d $s2, $sp, 72 # 8-byte Folded Spill
790; LA64F-NEXT:    st.d $s3, $sp, 64 # 8-byte Folded Spill
791; LA64F-NEXT:    st.d $s4, $sp, 56 # 8-byte Folded Spill
792; LA64F-NEXT:    st.d $s5, $sp, 48 # 8-byte Folded Spill
793; LA64F-NEXT:    st.d $s6, $sp, 40 # 8-byte Folded Spill
794; LA64F-NEXT:    st.d $s7, $sp, 32 # 8-byte Folded Spill
795; LA64F-NEXT:    st.d $s8, $sp, 24 # 8-byte Folded Spill
796; LA64F-NEXT:    ld.d $a2, $a0, 56
797; LA64F-NEXT:    st.d $a2, $sp, 16 # 8-byte Folded Spill
798; LA64F-NEXT:    ld.d $s1, $a0, 40
799; LA64F-NEXT:    ld.d $s2, $a0, 32
800; LA64F-NEXT:    ld.d $s3, $a0, 24
801; LA64F-NEXT:    ld.d $s4, $a0, 8
802; LA64F-NEXT:    ld.d $s5, $a0, 0
803; LA64F-NEXT:    ld.d $s6, $a0, 48
804; LA64F-NEXT:    ld.d $a0, $a0, 16
805; LA64F-NEXT:    move $fp, $a1
806; LA64F-NEXT:    ori $a1, $zero, 0
807; LA64F-NEXT:    lu32i.d $a1, -524288
808; LA64F-NEXT:    lu52i.d $s7, $a1, 1024
809; LA64F-NEXT:    move $a1, $s7
810; LA64F-NEXT:    bl %plt(__adddf3)
811; LA64F-NEXT:    st.d $a0, $sp, 8 # 8-byte Folded Spill
812; LA64F-NEXT:    move $a0, $s6
813; LA64F-NEXT:    move $a1, $s7
814; LA64F-NEXT:    bl %plt(__adddf3)
815; LA64F-NEXT:    move $s6, $a0
816; LA64F-NEXT:    lu52i.d $s7, $zero, 1023
817; LA64F-NEXT:    move $a0, $s5
818; LA64F-NEXT:    move $a1, $s7
819; LA64F-NEXT:    bl %plt(__adddf3)
820; LA64F-NEXT:    move $s5, $a0
821; LA64F-NEXT:    lu52i.d $s0, $zero, 1024
822; LA64F-NEXT:    move $a0, $s4
823; LA64F-NEXT:    move $a1, $s0
824; LA64F-NEXT:    bl %plt(__adddf3)
825; LA64F-NEXT:    move $s4, $a0
826; LA64F-NEXT:    lu52i.d $s8, $zero, 1025
827; LA64F-NEXT:    move $a0, $s3
828; LA64F-NEXT:    move $a1, $s8
829; LA64F-NEXT:    bl %plt(__adddf3)
830; LA64F-NEXT:    move $s3, $a0
831; LA64F-NEXT:    move $a0, $s2
832; LA64F-NEXT:    move $a1, $s7
833; LA64F-NEXT:    bl %plt(__adddf3)
834; LA64F-NEXT:    move $s2, $a0
835; LA64F-NEXT:    move $a0, $s1
836; LA64F-NEXT:    move $a1, $s0
837; LA64F-NEXT:    bl %plt(__adddf3)
838; LA64F-NEXT:    move $s0, $a0
839; LA64F-NEXT:    ld.d $a0, $sp, 16 # 8-byte Folded Reload
840; LA64F-NEXT:    move $a1, $s8
841; LA64F-NEXT:    bl %plt(__adddf3)
842; LA64F-NEXT:    st.d $a0, $fp, 56
843; LA64F-NEXT:    st.d $s0, $fp, 40
844; LA64F-NEXT:    st.d $s2, $fp, 32
845; LA64F-NEXT:    st.d $s3, $fp, 24
846; LA64F-NEXT:    st.d $s4, $fp, 8
847; LA64F-NEXT:    st.d $s5, $fp, 0
848; LA64F-NEXT:    st.d $s6, $fp, 48
849; LA64F-NEXT:    ld.d $a0, $sp, 8 # 8-byte Folded Reload
850; LA64F-NEXT:    st.d $a0, $fp, 16
851; LA64F-NEXT:    ld.d $s8, $sp, 24 # 8-byte Folded Reload
852; LA64F-NEXT:    ld.d $s7, $sp, 32 # 8-byte Folded Reload
853; LA64F-NEXT:    ld.d $s6, $sp, 40 # 8-byte Folded Reload
854; LA64F-NEXT:    ld.d $s5, $sp, 48 # 8-byte Folded Reload
855; LA64F-NEXT:    ld.d $s4, $sp, 56 # 8-byte Folded Reload
856; LA64F-NEXT:    ld.d $s3, $sp, 64 # 8-byte Folded Reload
857; LA64F-NEXT:    ld.d $s2, $sp, 72 # 8-byte Folded Reload
858; LA64F-NEXT:    ld.d $s1, $sp, 80 # 8-byte Folded Reload
859; LA64F-NEXT:    ld.d $s0, $sp, 88 # 8-byte Folded Reload
860; LA64F-NEXT:    ld.d $fp, $sp, 96 # 8-byte Folded Reload
861; LA64F-NEXT:    ld.d $ra, $sp, 104 # 8-byte Folded Reload
862; LA64F-NEXT:    addi.d $sp, $sp, 112
863; LA64F-NEXT:    ret
864;
865; LA64D-LABEL: test_d8:
866; LA64D:       # %bb.0:
867; LA64D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI6_0)
868; LA64D-NEXT:    vld $vr0, $a2, %pc_lo12(.LCPI6_0)
869; LA64D-NEXT:    pcalau12i $a2, %pc_hi20(.LCPI6_1)
870; LA64D-NEXT:    vld $vr1, $a2, %pc_lo12(.LCPI6_1)
871; LA64D-NEXT:    vld $vr2, $a0, 16
872; LA64D-NEXT:    vld $vr3, $a0, 0
873; LA64D-NEXT:    vld $vr4, $a0, 48
874; LA64D-NEXT:    vld $vr5, $a0, 32
875; LA64D-NEXT:    vfadd.d $vr2, $vr2, $vr0
876; LA64D-NEXT:    vfadd.d $vr3, $vr3, $vr1
877; LA64D-NEXT:    vfadd.d $vr0, $vr4, $vr0
878; LA64D-NEXT:    vfadd.d $vr1, $vr5, $vr1
879; LA64D-NEXT:    vst $vr1, $a1, 32
880; LA64D-NEXT:    vst $vr0, $a1, 48
881; LA64D-NEXT:    vst $vr3, $a1, 0
882; LA64D-NEXT:    vst $vr2, $a1, 16
883; LA64D-NEXT:    ret
884  %p = load %d8, ptr %P
885  %R = fadd %d8 %p, < double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00, double 1.000000e+00, double 2.000000e+00, double 3.000000e+00, double 4.000000e+00 >
886  store %d8 %R, ptr %S
887  ret void
888}
889