xref: /llvm-project/llvm/test/CodeGen/Mips/fp16-promote.ll (revision 8cd348c96a845e4afb3e924355e98b5558683d01)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=mipsel-linux-gnu < %s | FileCheck %s -check-prefix=MIPS32
3; RUN: llc -mtriple=mips64el-linux-gnu < %s | FileCheck %s -check-prefix=MIPS64
4
5define void @test_fadd(ptr %p, ptr %q) nounwind {
6; MIPS32-LABEL: test_fadd:
7; MIPS32:       # %bb.0:
8; MIPS32-NEXT:    addiu $sp, $sp, -32
9; MIPS32-NEXT:    sdc1 $f20, 24($sp) # 8-byte Folded Spill
10; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
11; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
12; MIPS32-NEXT:    move $16, $4
13; MIPS32-NEXT:    lhu $4, 0($5)
14; MIPS32-NEXT:    jal __gnu_h2f_ieee
15; MIPS32-NEXT:    nop
16; MIPS32-NEXT:    lhu $4, 0($16)
17; MIPS32-NEXT:    jal __gnu_h2f_ieee
18; MIPS32-NEXT:    mov.s $f20, $f0
19; MIPS32-NEXT:    jal __gnu_f2h_ieee
20; MIPS32-NEXT:    add.s $f12, $f0, $f20
21; MIPS32-NEXT:    sh $2, 0($16)
22; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
23; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
24; MIPS32-NEXT:    ldc1 $f20, 24($sp) # 8-byte Folded Reload
25; MIPS32-NEXT:    jr $ra
26; MIPS32-NEXT:    addiu $sp, $sp, 32
27;
28; MIPS64-LABEL: test_fadd:
29; MIPS64:       # %bb.0:
30; MIPS64-NEXT:    daddiu $sp, $sp, -32
31; MIPS64-NEXT:    sdc1 $f24, 24($sp) # 8-byte Folded Spill
32; MIPS64-NEXT:    sd $ra, 16($sp) # 8-byte Folded Spill
33; MIPS64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
34; MIPS64-NEXT:    move $16, $4
35; MIPS64-NEXT:    lhu $4, 0($5)
36; MIPS64-NEXT:    jal __gnu_h2f_ieee
37; MIPS64-NEXT:    nop
38; MIPS64-NEXT:    lhu $4, 0($16)
39; MIPS64-NEXT:    jal __gnu_h2f_ieee
40; MIPS64-NEXT:    mov.s $f24, $f0
41; MIPS64-NEXT:    jal __gnu_f2h_ieee
42; MIPS64-NEXT:    add.s $f12, $f0, $f24
43; MIPS64-NEXT:    sh $2, 0($16)
44; MIPS64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
45; MIPS64-NEXT:    ld $ra, 16($sp) # 8-byte Folded Reload
46; MIPS64-NEXT:    ldc1 $f24, 24($sp) # 8-byte Folded Reload
47; MIPS64-NEXT:    jr $ra
48; MIPS64-NEXT:    daddiu $sp, $sp, 32
49  %a = load half, ptr %p, align 2
50  %b = load half, ptr %q, align 2
51  %r = fadd half %a, %b
52  store half %r, ptr %p
53  ret void
54}
55
56define float @test_fpext_float(ptr %p) nounwind {
57; MIPS32-LABEL: test_fpext_float:
58; MIPS32:       # %bb.0:
59; MIPS32-NEXT:    addiu $sp, $sp, -24
60; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
61; MIPS32-NEXT:    lhu $4, 0($4)
62; MIPS32-NEXT:    jal __gnu_h2f_ieee
63; MIPS32-NEXT:    nop
64; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
65; MIPS32-NEXT:    jr $ra
66; MIPS32-NEXT:    addiu $sp, $sp, 24
67;
68; MIPS64-LABEL: test_fpext_float:
69; MIPS64:       # %bb.0:
70; MIPS64-NEXT:    daddiu $sp, $sp, -16
71; MIPS64-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
72; MIPS64-NEXT:    lhu $4, 0($4)
73; MIPS64-NEXT:    jal __gnu_h2f_ieee
74; MIPS64-NEXT:    nop
75; MIPS64-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
76; MIPS64-NEXT:    jr $ra
77; MIPS64-NEXT:    daddiu $sp, $sp, 16
78  %a = load half, ptr %p, align 2
79  %r = fpext half %a to float
80  ret float %r
81}
82
83define double @test_fpext_double(ptr %p) nounwind {
84; MIPS32-LABEL: test_fpext_double:
85; MIPS32:       # %bb.0:
86; MIPS32-NEXT:    addiu $sp, $sp, -24
87; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
88; MIPS32-NEXT:    lhu $4, 0($4)
89; MIPS32-NEXT:    jal __gnu_h2f_ieee
90; MIPS32-NEXT:    nop
91; MIPS32-NEXT:    cvt.d.s $f0, $f0
92; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
93; MIPS32-NEXT:    jr $ra
94; MIPS32-NEXT:    addiu $sp, $sp, 24
95;
96; MIPS64-LABEL: test_fpext_double:
97; MIPS64:       # %bb.0:
98; MIPS64-NEXT:    daddiu $sp, $sp, -16
99; MIPS64-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
100; MIPS64-NEXT:    lhu $4, 0($4)
101; MIPS64-NEXT:    jal __gnu_h2f_ieee
102; MIPS64-NEXT:    nop
103; MIPS64-NEXT:    cvt.d.s $f0, $f0
104; MIPS64-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
105; MIPS64-NEXT:    jr $ra
106; MIPS64-NEXT:    daddiu $sp, $sp, 16
107  %a = load half, ptr %p, align 2
108  %r = fpext half %a to double
109  ret double %r
110}
111
112define void @test_fptrunc_float(float %f, ptr %p) nounwind {
113; MIPS32-LABEL: test_fptrunc_float:
114; MIPS32:       # %bb.0:
115; MIPS32-NEXT:    addiu $sp, $sp, -24
116; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
117; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
118; MIPS32-NEXT:    jal __gnu_f2h_ieee
119; MIPS32-NEXT:    move $16, $5
120; MIPS32-NEXT:    sh $2, 0($16)
121; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
122; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
123; MIPS32-NEXT:    jr $ra
124; MIPS32-NEXT:    addiu $sp, $sp, 24
125;
126; MIPS64-LABEL: test_fptrunc_float:
127; MIPS64:       # %bb.0:
128; MIPS64-NEXT:    daddiu $sp, $sp, -16
129; MIPS64-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
130; MIPS64-NEXT:    sd $16, 0($sp) # 8-byte Folded Spill
131; MIPS64-NEXT:    jal __gnu_f2h_ieee
132; MIPS64-NEXT:    move $16, $5
133; MIPS64-NEXT:    sh $2, 0($16)
134; MIPS64-NEXT:    ld $16, 0($sp) # 8-byte Folded Reload
135; MIPS64-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
136; MIPS64-NEXT:    jr $ra
137; MIPS64-NEXT:    daddiu $sp, $sp, 16
138  %a = fptrunc float %f to half
139  store half %a, ptr %p
140  ret void
141}
142
143define void @test_fptrunc_double(double %d, ptr %p) nounwind {
144; MIPS32-LABEL: test_fptrunc_double:
145; MIPS32:       # %bb.0:
146; MIPS32-NEXT:    addiu $sp, $sp, -24
147; MIPS32-NEXT:    sw $ra, 20($sp) # 4-byte Folded Spill
148; MIPS32-NEXT:    sw $16, 16($sp) # 4-byte Folded Spill
149; MIPS32-NEXT:    jal __truncdfhf2
150; MIPS32-NEXT:    move $16, $6
151; MIPS32-NEXT:    sh $2, 0($16)
152; MIPS32-NEXT:    lw $16, 16($sp) # 4-byte Folded Reload
153; MIPS32-NEXT:    lw $ra, 20($sp) # 4-byte Folded Reload
154; MIPS32-NEXT:    jr $ra
155; MIPS32-NEXT:    addiu $sp, $sp, 24
156;
157; MIPS64-LABEL: test_fptrunc_double:
158; MIPS64:       # %bb.0:
159; MIPS64-NEXT:    daddiu $sp, $sp, -16
160; MIPS64-NEXT:    sd $ra, 8($sp) # 8-byte Folded Spill
161; MIPS64-NEXT:    sd $16, 0($sp) # 8-byte Folded Spill
162; MIPS64-NEXT:    jal __truncdfhf2
163; MIPS64-NEXT:    move $16, $5
164; MIPS64-NEXT:    sh $2, 0($16)
165; MIPS64-NEXT:    ld $16, 0($sp) # 8-byte Folded Reload
166; MIPS64-NEXT:    ld $ra, 8($sp) # 8-byte Folded Reload
167; MIPS64-NEXT:    jr $ra
168; MIPS64-NEXT:    daddiu $sp, $sp, 16
169  %a = fptrunc double %d to half
170  store half %a, ptr %p
171  ret void
172}
173
174define <4 x float> @test_vec_fpext_float(ptr %p) nounwind {
175; MIPS32-LABEL: test_vec_fpext_float:
176; MIPS32:       # %bb.0:
177; MIPS32-NEXT:    addiu $sp, $sp, -32
178; MIPS32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
179; MIPS32-NEXT:    sw $17, 24($sp) # 4-byte Folded Spill
180; MIPS32-NEXT:    sw $16, 20($sp) # 4-byte Folded Spill
181; MIPS32-NEXT:    move $17, $4
182; MIPS32-NEXT:    lhu $4, 6($5)
183; MIPS32-NEXT:    jal __gnu_h2f_ieee
184; MIPS32-NEXT:    move $16, $5
185; MIPS32-NEXT:    lhu $4, 4($16)
186; MIPS32-NEXT:    jal __gnu_h2f_ieee
187; MIPS32-NEXT:    swc1 $f0, 12($17)
188; MIPS32-NEXT:    swc1 $f0, 8($17)
189; MIPS32-NEXT:    lhu $4, 2($16)
190; MIPS32-NEXT:    jal __gnu_h2f_ieee
191; MIPS32-NEXT:    nop
192; MIPS32-NEXT:    swc1 $f0, 4($17)
193; MIPS32-NEXT:    lhu $4, 0($16)
194; MIPS32-NEXT:    jal __gnu_h2f_ieee
195; MIPS32-NEXT:    nop
196; MIPS32-NEXT:    swc1 $f0, 0($17)
197; MIPS32-NEXT:    lw $16, 20($sp) # 4-byte Folded Reload
198; MIPS32-NEXT:    lw $17, 24($sp) # 4-byte Folded Reload
199; MIPS32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
200; MIPS32-NEXT:    jr $ra
201; MIPS32-NEXT:    addiu $sp, $sp, 32
202;
203; MIPS64-LABEL: test_vec_fpext_float:
204; MIPS64:       # %bb.0:
205; MIPS64-NEXT:    daddiu $sp, $sp, -32
206; MIPS64-NEXT:    sd $ra, 24($sp) # 8-byte Folded Spill
207; MIPS64-NEXT:    sd $18, 16($sp) # 8-byte Folded Spill
208; MIPS64-NEXT:    sd $17, 8($sp) # 8-byte Folded Spill
209; MIPS64-NEXT:    sd $16, 0($sp) # 8-byte Folded Spill
210; MIPS64-NEXT:    move $16, $4
211; MIPS64-NEXT:    lhu $4, 2($4)
212; MIPS64-NEXT:    jal __gnu_h2f_ieee
213; MIPS64-NEXT:    nop
214; MIPS64-NEXT:    lhu $4, 6($16)
215; MIPS64-NEXT:    jal __gnu_h2f_ieee
216; MIPS64-NEXT:    mfc1 $17, $f0
217; MIPS64-NEXT:    mfc1 $18, $f0
218; MIPS64-NEXT:    lhu $4, 0($16)
219; MIPS64-NEXT:    jal __gnu_h2f_ieee
220; MIPS64-NEXT:    dsll $17, $17, 32
221; MIPS64-NEXT:    mfc1 $1, $f0
222; MIPS64-NEXT:    dsll $1, $1, 32
223; MIPS64-NEXT:    dsrl $1, $1, 32
224; MIPS64-NEXT:    or $17, $1, $17
225; MIPS64-NEXT:    lhu $4, 4($16)
226; MIPS64-NEXT:    jal __gnu_h2f_ieee
227; MIPS64-NEXT:    dsll $18, $18, 32
228; MIPS64-NEXT:    mfc1 $1, $f0
229; MIPS64-NEXT:    dsll $1, $1, 32
230; MIPS64-NEXT:    dsrl $1, $1, 32
231; MIPS64-NEXT:    or $3, $1, $18
232; MIPS64-NEXT:    move $2, $17
233; MIPS64-NEXT:    ld $16, 0($sp) # 8-byte Folded Reload
234; MIPS64-NEXT:    ld $17, 8($sp) # 8-byte Folded Reload
235; MIPS64-NEXT:    ld $18, 16($sp) # 8-byte Folded Reload
236; MIPS64-NEXT:    ld $ra, 24($sp) # 8-byte Folded Reload
237; MIPS64-NEXT:    jr $ra
238; MIPS64-NEXT:    daddiu $sp, $sp, 32
239  %a = load <4 x half>, ptr %p, align 8
240  %b = fpext <4 x half> %a to <4 x float>
241  ret <4 x float> %b
242}
243
244define <4 x double> @test_vec_fpext_double(ptr %p) nounwind {
245; MIPS32-LABEL: test_vec_fpext_double:
246; MIPS32:       # %bb.0:
247; MIPS32-NEXT:    addiu $sp, $sp, -40
248; MIPS32-NEXT:    sdc1 $f20, 32($sp) # 8-byte Folded Spill
249; MIPS32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
250; MIPS32-NEXT:    sw $17, 24($sp) # 4-byte Folded Spill
251; MIPS32-NEXT:    sw $16, 20($sp) # 4-byte Folded Spill
252; MIPS32-NEXT:    move $17, $4
253; MIPS32-NEXT:    lhu $4, 6($5)
254; MIPS32-NEXT:    jal __gnu_h2f_ieee
255; MIPS32-NEXT:    move $16, $5
256; MIPS32-NEXT:    lhu $4, 4($16)
257; MIPS32-NEXT:    jal __gnu_h2f_ieee
258; MIPS32-NEXT:    mov.s $f20, $f0
259; MIPS32-NEXT:    lhu $4, 2($16)
260; MIPS32-NEXT:    cvt.d.s $f0, $f0
261; MIPS32-NEXT:    cvt.d.s $f2, $f20
262; MIPS32-NEXT:    sdc1 $f2, 24($17)
263; MIPS32-NEXT:    jal __gnu_h2f_ieee
264; MIPS32-NEXT:    sdc1 $f0, 16($17)
265; MIPS32-NEXT:    cvt.d.s $f0, $f0
266; MIPS32-NEXT:    sdc1 $f0, 8($17)
267; MIPS32-NEXT:    lhu $4, 0($16)
268; MIPS32-NEXT:    jal __gnu_h2f_ieee
269; MIPS32-NEXT:    nop
270; MIPS32-NEXT:    cvt.d.s $f0, $f0
271; MIPS32-NEXT:    sdc1 $f0, 0($17)
272; MIPS32-NEXT:    lw $16, 20($sp) # 4-byte Folded Reload
273; MIPS32-NEXT:    lw $17, 24($sp) # 4-byte Folded Reload
274; MIPS32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
275; MIPS32-NEXT:    ldc1 $f20, 32($sp) # 8-byte Folded Reload
276; MIPS32-NEXT:    jr $ra
277; MIPS32-NEXT:    addiu $sp, $sp, 40
278;
279; MIPS64-LABEL: test_vec_fpext_double:
280; MIPS64:       # %bb.0:
281; MIPS64-NEXT:    daddiu $sp, $sp, -32
282; MIPS64-NEXT:    sdc1 $f24, 24($sp) # 8-byte Folded Spill
283; MIPS64-NEXT:    sd $ra, 16($sp) # 8-byte Folded Spill
284; MIPS64-NEXT:    sd $17, 8($sp) # 8-byte Folded Spill
285; MIPS64-NEXT:    sd $16, 0($sp) # 8-byte Folded Spill
286; MIPS64-NEXT:    move $17, $4
287; MIPS64-NEXT:    lhu $4, 6($5)
288; MIPS64-NEXT:    jal __gnu_h2f_ieee
289; MIPS64-NEXT:    move $16, $5
290; MIPS64-NEXT:    lhu $4, 4($16)
291; MIPS64-NEXT:    jal __gnu_h2f_ieee
292; MIPS64-NEXT:    mov.s $f24, $f0
293; MIPS64-NEXT:    lhu $4, 2($16)
294; MIPS64-NEXT:    cvt.d.s $f0, $f0
295; MIPS64-NEXT:    cvt.d.s $f1, $f24
296; MIPS64-NEXT:    sdc1 $f1, 24($17)
297; MIPS64-NEXT:    jal __gnu_h2f_ieee
298; MIPS64-NEXT:    sdc1 $f0, 16($17)
299; MIPS64-NEXT:    cvt.d.s $f0, $f0
300; MIPS64-NEXT:    sdc1 $f0, 8($17)
301; MIPS64-NEXT:    lhu $4, 0($16)
302; MIPS64-NEXT:    jal __gnu_h2f_ieee
303; MIPS64-NEXT:    nop
304; MIPS64-NEXT:    cvt.d.s $f0, $f0
305; MIPS64-NEXT:    sdc1 $f0, 0($17)
306; MIPS64-NEXT:    ld $16, 0($sp) # 8-byte Folded Reload
307; MIPS64-NEXT:    ld $17, 8($sp) # 8-byte Folded Reload
308; MIPS64-NEXT:    ld $ra, 16($sp) # 8-byte Folded Reload
309; MIPS64-NEXT:    ldc1 $f24, 24($sp) # 8-byte Folded Reload
310; MIPS64-NEXT:    jr $ra
311; MIPS64-NEXT:    daddiu $sp, $sp, 32
312  %a = load <4 x half>, ptr %p, align 8
313  %b = fpext <4 x half> %a to <4 x double>
314  ret <4 x double> %b
315}
316
317define void @test_vec_fptrunc_float(<4 x float> %a, ptr %p) nounwind {
318; MIPS32-LABEL: test_vec_fptrunc_float:
319; MIPS32:       # %bb.0:
320; MIPS32-NEXT:    addiu $sp, $sp, -40
321; MIPS32-NEXT:    sw $ra, 36($sp) # 4-byte Folded Spill
322; MIPS32-NEXT:    sw $19, 32($sp) # 4-byte Folded Spill
323; MIPS32-NEXT:    sw $18, 28($sp) # 4-byte Folded Spill
324; MIPS32-NEXT:    sw $17, 24($sp) # 4-byte Folded Spill
325; MIPS32-NEXT:    sw $16, 20($sp) # 4-byte Folded Spill
326; MIPS32-NEXT:    move $16, $7
327; MIPS32-NEXT:    move $17, $5
328; MIPS32-NEXT:    move $18, $4
329; MIPS32-NEXT:    jal __gnu_f2h_ieee
330; MIPS32-NEXT:    mtc1 $6, $f12
331; MIPS32-NEXT:    move $19, $2
332; MIPS32-NEXT:    jal __gnu_f2h_ieee
333; MIPS32-NEXT:    mtc1 $16, $f12
334; MIPS32-NEXT:    mtc1 $17, $f12
335; MIPS32-NEXT:    lw $16, 56($sp)
336; MIPS32-NEXT:    sh $2, 6($16)
337; MIPS32-NEXT:    jal __gnu_f2h_ieee
338; MIPS32-NEXT:    sh $19, 4($16)
339; MIPS32-NEXT:    sh $2, 2($16)
340; MIPS32-NEXT:    jal __gnu_f2h_ieee
341; MIPS32-NEXT:    mtc1 $18, $f12
342; MIPS32-NEXT:    sh $2, 0($16)
343; MIPS32-NEXT:    lw $16, 20($sp) # 4-byte Folded Reload
344; MIPS32-NEXT:    lw $17, 24($sp) # 4-byte Folded Reload
345; MIPS32-NEXT:    lw $18, 28($sp) # 4-byte Folded Reload
346; MIPS32-NEXT:    lw $19, 32($sp) # 4-byte Folded Reload
347; MIPS32-NEXT:    lw $ra, 36($sp) # 4-byte Folded Reload
348; MIPS32-NEXT:    jr $ra
349; MIPS32-NEXT:    addiu $sp, $sp, 40
350;
351; MIPS64-LABEL: test_vec_fptrunc_float:
352; MIPS64:       # %bb.0:
353; MIPS64-NEXT:    daddiu $sp, $sp, -48
354; MIPS64-NEXT:    sd $ra, 40($sp) # 8-byte Folded Spill
355; MIPS64-NEXT:    sd $19, 32($sp) # 8-byte Folded Spill
356; MIPS64-NEXT:    sd $18, 24($sp) # 8-byte Folded Spill
357; MIPS64-NEXT:    sd $17, 16($sp) # 8-byte Folded Spill
358; MIPS64-NEXT:    sd $16, 8($sp) # 8-byte Folded Spill
359; MIPS64-NEXT:    move $16, $6
360; MIPS64-NEXT:    move $17, $5
361; MIPS64-NEXT:    move $18, $4
362; MIPS64-NEXT:    sll $1, $18, 0
363; MIPS64-NEXT:    jal __gnu_f2h_ieee
364; MIPS64-NEXT:    mtc1 $1, $f12
365; MIPS64-NEXT:    move $19, $2
366; MIPS64-NEXT:    sll $1, $17, 0
367; MIPS64-NEXT:    jal __gnu_f2h_ieee
368; MIPS64-NEXT:    mtc1 $1, $f12
369; MIPS64-NEXT:    dsrl $1, $17, 32
370; MIPS64-NEXT:    sll $1, $1, 0
371; MIPS64-NEXT:    mtc1 $1, $f12
372; MIPS64-NEXT:    sh $2, 4($16)
373; MIPS64-NEXT:    jal __gnu_f2h_ieee
374; MIPS64-NEXT:    sh $19, 0($16)
375; MIPS64-NEXT:    sh $2, 6($16)
376; MIPS64-NEXT:    dsrl $1, $18, 32
377; MIPS64-NEXT:    sll $1, $1, 0
378; MIPS64-NEXT:    jal __gnu_f2h_ieee
379; MIPS64-NEXT:    mtc1 $1, $f12
380; MIPS64-NEXT:    sh $2, 2($16)
381; MIPS64-NEXT:    ld $16, 8($sp) # 8-byte Folded Reload
382; MIPS64-NEXT:    ld $17, 16($sp) # 8-byte Folded Reload
383; MIPS64-NEXT:    ld $18, 24($sp) # 8-byte Folded Reload
384; MIPS64-NEXT:    ld $19, 32($sp) # 8-byte Folded Reload
385; MIPS64-NEXT:    ld $ra, 40($sp) # 8-byte Folded Reload
386; MIPS64-NEXT:    jr $ra
387; MIPS64-NEXT:    daddiu $sp, $sp, 48
388  %b = fptrunc <4 x float> %a to <4 x half>
389  store <4 x half> %b, ptr %p, align 8
390  ret void
391}
392
393define void @test_vec_fptrunc_double(<4 x double> %a, ptr %p) nounwind {
394; MIPS32-LABEL: test_vec_fptrunc_double:
395; MIPS32:       # %bb.0:
396; MIPS32-NEXT:    addiu $sp, $sp, -72
397; MIPS32-NEXT:    sw $ra, 68($sp) # 4-byte Folded Spill
398; MIPS32-NEXT:    sw $19, 64($sp) # 4-byte Folded Spill
399; MIPS32-NEXT:    sw $18, 60($sp) # 4-byte Folded Spill
400; MIPS32-NEXT:    sw $17, 56($sp) # 4-byte Folded Spill
401; MIPS32-NEXT:    sw $16, 52($sp) # 4-byte Folded Spill
402; MIPS32-NEXT:    move $16, $5
403; MIPS32-NEXT:    move $17, $4
404; MIPS32-NEXT:    lw $1, 92($sp)
405; MIPS32-NEXT:    sw $1, 36($sp)
406; MIPS32-NEXT:    lw $1, 88($sp)
407; MIPS32-NEXT:    sw $1, 32($sp)
408; MIPS32-NEXT:    lw $1, 96($sp)
409; MIPS32-NEXT:    lw $2, 100($sp)
410; MIPS32-NEXT:    sw $2, 44($sp)
411; MIPS32-NEXT:    sw $1, 40($sp)
412; MIPS32-NEXT:    ldc1 $f12, 32($sp)
413; MIPS32-NEXT:    sw $7, 28($sp)
414; MIPS32-NEXT:    jal __truncdfhf2
415; MIPS32-NEXT:    sw $6, 24($sp)
416; MIPS32-NEXT:    move $18, $2
417; MIPS32-NEXT:    jal __truncdfhf2
418; MIPS32-NEXT:    ldc1 $f12, 40($sp)
419; MIPS32-NEXT:    ldc1 $f12, 24($sp)
420; MIPS32-NEXT:    lw $19, 104($sp)
421; MIPS32-NEXT:    sh $2, 6($19)
422; MIPS32-NEXT:    jal __truncdfhf2
423; MIPS32-NEXT:    sh $18, 4($19)
424; MIPS32-NEXT:    sh $2, 2($19)
425; MIPS32-NEXT:    sw $16, 20($sp)
426; MIPS32-NEXT:    sw $17, 16($sp)
427; MIPS32-NEXT:    jal __truncdfhf2
428; MIPS32-NEXT:    ldc1 $f12, 16($sp)
429; MIPS32-NEXT:    sh $2, 0($19)
430; MIPS32-NEXT:    lw $16, 52($sp) # 4-byte Folded Reload
431; MIPS32-NEXT:    lw $17, 56($sp) # 4-byte Folded Reload
432; MIPS32-NEXT:    lw $18, 60($sp) # 4-byte Folded Reload
433; MIPS32-NEXT:    lw $19, 64($sp) # 4-byte Folded Reload
434; MIPS32-NEXT:    lw $ra, 68($sp) # 4-byte Folded Reload
435; MIPS32-NEXT:    jr $ra
436; MIPS32-NEXT:    addiu $sp, $sp, 72
437;
438; MIPS64-LABEL: test_vec_fptrunc_double:
439; MIPS64:       # %bb.0:
440; MIPS64-NEXT:    daddiu $sp, $sp, -48
441; MIPS64-NEXT:    sd $ra, 40($sp) # 8-byte Folded Spill
442; MIPS64-NEXT:    sd $20, 32($sp) # 8-byte Folded Spill
443; MIPS64-NEXT:    sd $19, 24($sp) # 8-byte Folded Spill
444; MIPS64-NEXT:    sd $18, 16($sp) # 8-byte Folded Spill
445; MIPS64-NEXT:    sd $17, 8($sp) # 8-byte Folded Spill
446; MIPS64-NEXT:    sd $16, 0($sp) # 8-byte Folded Spill
447; MIPS64-NEXT:    move $16, $8
448; MIPS64-NEXT:    move $17, $7
449; MIPS64-NEXT:    move $18, $5
450; MIPS64-NEXT:    move $19, $4
451; MIPS64-NEXT:    jal __truncdfhf2
452; MIPS64-NEXT:    dmtc1 $6, $f12
453; MIPS64-NEXT:    move $20, $2
454; MIPS64-NEXT:    jal __truncdfhf2
455; MIPS64-NEXT:    dmtc1 $17, $f12
456; MIPS64-NEXT:    dmtc1 $18, $f12
457; MIPS64-NEXT:    sh $2, 6($16)
458; MIPS64-NEXT:    jal __truncdfhf2
459; MIPS64-NEXT:    sh $20, 4($16)
460; MIPS64-NEXT:    sh $2, 2($16)
461; MIPS64-NEXT:    jal __truncdfhf2
462; MIPS64-NEXT:    dmtc1 $19, $f12
463; MIPS64-NEXT:    sh $2, 0($16)
464; MIPS64-NEXT:    ld $16, 0($sp) # 8-byte Folded Reload
465; MIPS64-NEXT:    ld $17, 8($sp) # 8-byte Folded Reload
466; MIPS64-NEXT:    ld $18, 16($sp) # 8-byte Folded Reload
467; MIPS64-NEXT:    ld $19, 24($sp) # 8-byte Folded Reload
468; MIPS64-NEXT:    ld $20, 32($sp) # 8-byte Folded Reload
469; MIPS64-NEXT:    ld $ra, 40($sp) # 8-byte Folded Reload
470; MIPS64-NEXT:    jr $ra
471; MIPS64-NEXT:    daddiu $sp, $sp, 48
472  %b = fptrunc <4 x double> %a to <4 x half>
473  store <4 x half> %b, ptr %p, align 8
474  ret void
475}
476
477define half @test_fadd_fadd(half %a, half %b, half %c) nounwind {
478; MIPS32-LABEL: test_fadd_fadd:
479; MIPS32:       # %bb.0:
480; MIPS32-NEXT:    addiu $sp, $sp, -40
481; MIPS32-NEXT:    sdc1 $f20, 32($sp) # 8-byte Folded Spill
482; MIPS32-NEXT:    sw $ra, 28($sp) # 4-byte Folded Spill
483; MIPS32-NEXT:    sw $17, 24($sp) # 4-byte Folded Spill
484; MIPS32-NEXT:    sw $16, 20($sp) # 4-byte Folded Spill
485; MIPS32-NEXT:    move $16, $6
486; MIPS32-NEXT:    move $17, $4
487; MIPS32-NEXT:    jal __gnu_h2f_ieee
488; MIPS32-NEXT:    move $4, $5
489; MIPS32-NEXT:    mov.s $f20, $f0
490; MIPS32-NEXT:    jal __gnu_h2f_ieee
491; MIPS32-NEXT:    move $4, $17
492; MIPS32-NEXT:    jal __gnu_f2h_ieee
493; MIPS32-NEXT:    add.s $f12, $f0, $f20
494; MIPS32-NEXT:    jal __gnu_h2f_ieee
495; MIPS32-NEXT:    move $4, $2
496; MIPS32-NEXT:    mov.s $f20, $f0
497; MIPS32-NEXT:    jal __gnu_h2f_ieee
498; MIPS32-NEXT:    move $4, $16
499; MIPS32-NEXT:    jal __gnu_f2h_ieee
500; MIPS32-NEXT:    add.s $f12, $f20, $f0
501; MIPS32-NEXT:    lw $16, 20($sp) # 4-byte Folded Reload
502; MIPS32-NEXT:    lw $17, 24($sp) # 4-byte Folded Reload
503; MIPS32-NEXT:    lw $ra, 28($sp) # 4-byte Folded Reload
504; MIPS32-NEXT:    ldc1 $f20, 32($sp) # 8-byte Folded Reload
505; MIPS32-NEXT:    jr $ra
506; MIPS32-NEXT:    addiu $sp, $sp, 40
507;
508; MIPS64-LABEL: test_fadd_fadd:
509; MIPS64:       # %bb.0:
510; MIPS64-NEXT:    daddiu $sp, $sp, -32
511; MIPS64-NEXT:    sdc1 $f24, 24($sp) # 8-byte Folded Spill
512; MIPS64-NEXT:    sd $ra, 16($sp) # 8-byte Folded Spill
513; MIPS64-NEXT:    sd $17, 8($sp) # 8-byte Folded Spill
514; MIPS64-NEXT:    sd $16, 0($sp) # 8-byte Folded Spill
515; MIPS64-NEXT:    move $16, $6
516; MIPS64-NEXT:    move $17, $4
517; MIPS64-NEXT:    jal __gnu_h2f_ieee
518; MIPS64-NEXT:    sll $4, $5, 0
519; MIPS64-NEXT:    mov.s $f24, $f0
520; MIPS64-NEXT:    jal __gnu_h2f_ieee
521; MIPS64-NEXT:    sll $4, $17, 0
522; MIPS64-NEXT:    jal __gnu_f2h_ieee
523; MIPS64-NEXT:    add.s $f12, $f0, $f24
524; MIPS64-NEXT:    jal __gnu_h2f_ieee
525; MIPS64-NEXT:    sll $4, $2, 0
526; MIPS64-NEXT:    mov.s $f24, $f0
527; MIPS64-NEXT:    jal __gnu_h2f_ieee
528; MIPS64-NEXT:    sll $4, $16, 0
529; MIPS64-NEXT:    jal __gnu_f2h_ieee
530; MIPS64-NEXT:    add.s $f12, $f24, $f0
531; MIPS64-NEXT:    ld $16, 0($sp) # 8-byte Folded Reload
532; MIPS64-NEXT:    ld $17, 8($sp) # 8-byte Folded Reload
533; MIPS64-NEXT:    ld $ra, 16($sp) # 8-byte Folded Reload
534; MIPS64-NEXT:    ldc1 $f24, 24($sp) # 8-byte Folded Reload
535; MIPS64-NEXT:    jr $ra
536; MIPS64-NEXT:    daddiu $sp, $sp, 32
537  %d = fadd half %a, %b
538  %e = fadd half %d, %c
539  ret half %e
540}
541
542define half @to_half(i16 %bits) nounwind {
543; MIPS32-LABEL: to_half:
544; MIPS32:       # %bb.0:
545; MIPS32-NEXT:    jr $ra
546; MIPS32-NEXT:    move $2, $4
547;
548; MIPS64-LABEL: to_half:
549; MIPS64:       # %bb.0:
550; MIPS64-NEXT:    jr $ra
551; MIPS64-NEXT:    sll $2, $4, 0
552  %f = bitcast i16 %bits to half
553  ret half %f
554}
555
556define i16 @from_half(half %f) nounwind {
557; MIPS32-LABEL: from_half:
558; MIPS32:       # %bb.0:
559; MIPS32-NEXT:    jr $ra
560; MIPS32-NEXT:    move $2, $4
561;
562; MIPS64-LABEL: from_half:
563; MIPS64:       # %bb.0:
564; MIPS64-NEXT:    jr $ra
565; MIPS64-NEXT:    sll $2, $4, 0
566  %bits = bitcast half %f to i16
567  ret i16 %bits
568}
569