blob: 3c1aa8b4792bab9b5cf454f39c643fa6e8758bf7 [file] [log] [blame]
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
Aleksandar Beserminji6c5dfcb2019-01-28 14:59:30 +00002; RUN: llc -relocation-model=pic -mtriple=mipsel-- -mcpu=mips32r5 -mattr=+abs2008 \
Vladimir Stefanovic3daf8bc2019-01-17 21:50:37 +00003; RUN: -mattr=+fp64,+msa -verify-machineinstrs -mips-jalr-reloc=false < %s | FileCheck %s \
Simon Dardis40a50402016-11-21 20:34:10 +00004; RUN: --check-prefixes=ALL,MIPS32,MIPSR5,MIPS32-O32,MIPS32R5-O32
Aleksandar Beserminji6c5dfcb2019-01-28 14:59:30 +00005; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r5 -mattr=+abs2008 \
Vladimir Stefanovic3daf8bc2019-01-17 21:50:37 +00006; RUN: -mattr=+fp64,+msa -verify-machineinstrs -target-abi n32 -mips-jalr-reloc=false < %s | FileCheck %s \
Simon Dardis40a50402016-11-21 20:34:10 +00007; RUN: --check-prefixes=ALL,MIPS64,MIPSR5,MIPS64-N32,MIPS64R5-N32
Aleksandar Beserminji6c5dfcb2019-01-28 14:59:30 +00008; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r5 -mattr=+abs2008 \
Vladimir Stefanovic3daf8bc2019-01-17 21:50:37 +00009; RUN: -mattr=+fp64,+msa -verify-machineinstrs -target-abi n64 -mips-jalr-reloc=false < %s | FileCheck %s \
Simon Dardis40a50402016-11-21 20:34:10 +000010; RUN: --check-prefixes=ALL,MIPS64,MIPSR5,MIPS64-N64,MIPS64R5-N64
11
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +000012; RUN: llc -relocation-model=pic -mtriple=mipsel-- -mcpu=mips32r6 \
Vladimir Stefanovic3daf8bc2019-01-17 21:50:37 +000013; RUN: -mattr=+fp64,+msa -verify-machineinstrs -mips-jalr-reloc=false < %s | FileCheck %s \
Simon Dardis40a50402016-11-21 20:34:10 +000014; RUN: --check-prefixes=ALL,MIPS32,MIPSR6,MIPSR6-O32
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +000015; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r6 \
Vladimir Stefanovic3daf8bc2019-01-17 21:50:37 +000016; RUN: -mattr=+fp64,+msa -verify-machineinstrs -target-abi n32 -mips-jalr-reloc=false < %s | FileCheck %s \
Simon Dardis40a50402016-11-21 20:34:10 +000017; RUN: --check-prefixes=ALL,MIPS64,MIPSR6,MIPS64-N32,MIPSR6-N32
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +000018; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r6 \
Vladimir Stefanovic3daf8bc2019-01-17 21:50:37 +000019; RUN: -mattr=+fp64,+msa -verify-machineinstrs -target-abi n64 -mips-jalr-reloc=false < %s | FileCheck %s \
Simon Dardis40a50402016-11-21 20:34:10 +000020; RUN: --check-prefixes=ALL,MIPS64,MIPSR6,MIPS64-N64,MIPSR6-N64
21
22
23; Check the use of frame indexes in the msa pseudo f16 instructions.
24
25@k = external global float
26
27declare float @k2(half *)
28
29define void @f3(i16 %b) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +000030; MIPS32-LABEL: f3:
31; MIPS32: # %bb.0: # %entry
32; MIPS32-NEXT: lui $2, %hi(_gp_disp)
33; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
34; MIPS32-NEXT: addiu $sp, $sp, -32
35; MIPS32-NEXT: .cfi_def_cfa_offset 32
36; MIPS32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill
37; MIPS32-NEXT: sw $16, 24($sp) # 4-byte Folded Spill
38; MIPS32-NEXT: .cfi_offset 31, -4
39; MIPS32-NEXT: .cfi_offset 16, -8
40; MIPS32-NEXT: addu $16, $2, $25
41; MIPS32-NEXT: sh $4, 22($sp)
42; MIPS32-NEXT: addiu $4, $sp, 22
43; MIPS32-NEXT: lw $25, %call16(k2)($16)
44; MIPS32-NEXT: jalr $25
45; MIPS32-NEXT: move $gp, $16
46; MIPS32-NEXT: lw $1, %got(k)($16)
47; MIPS32-NEXT: swc1 $f0, 0($1)
48; MIPS32-NEXT: lw $16, 24($sp) # 4-byte Folded Reload
49; MIPS32-NEXT: lw $ra, 28($sp) # 4-byte Folded Reload
50; MIPS32-NEXT: jr $ra
51; MIPS32-NEXT: addiu $sp, $sp, 32
52;
53; MIPS64-N32-LABEL: f3:
54; MIPS64-N32: # %bb.0: # %entry
55; MIPS64-N32-NEXT: addiu $sp, $sp, -32
56; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
57; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
58; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
59; MIPS64-N32-NEXT: .cfi_offset 31, -8
60; MIPS64-N32-NEXT: .cfi_offset 28, -16
61; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(f3)))
62; MIPS64-N32-NEXT: addu $1, $1, $25
63; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f3)))
64; MIPS64-N32-NEXT: sh $4, 14($sp)
65; MIPS64-N32-NEXT: lw $25, %call16(k2)($gp)
66; MIPS64-N32-NEXT: jalr $25
67; MIPS64-N32-NEXT: addiu $4, $sp, 14
68; MIPS64-N32-NEXT: lw $1, %got_disp(k)($gp)
69; MIPS64-N32-NEXT: swc1 $f0, 0($1)
70; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
71; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
72; MIPS64-N32-NEXT: jr $ra
73; MIPS64-N32-NEXT: addiu $sp, $sp, 32
74;
75; MIPS64-N64-LABEL: f3:
76; MIPS64-N64: # %bb.0: # %entry
77; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
78; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
79; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
80; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
81; MIPS64-N64-NEXT: .cfi_offset 31, -8
82; MIPS64-N64-NEXT: .cfi_offset 28, -16
83; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(f3)))
84; MIPS64-N64-NEXT: daddu $1, $1, $25
85; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f3)))
86; MIPS64-N64-NEXT: sh $4, 14($sp)
87; MIPS64-N64-NEXT: ld $25, %call16(k2)($gp)
88; MIPS64-N64-NEXT: jalr $25
89; MIPS64-N64-NEXT: daddiu $4, $sp, 14
90; MIPS64-N64-NEXT: ld $1, %got_disp(k)($gp)
91; MIPS64-N64-NEXT: swc1 $f0, 0($1)
92; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
93; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
94; MIPS64-N64-NEXT: jr $ra
95; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +000096entry:
Simon Dardis40a50402016-11-21 20:34:10 +000097 %0 = alloca half
98 %1 = bitcast i16 %b to half
99 store half %1, half * %0
100 %2 = call float @k2(half * %0)
101 store float %2, float * @k
102 ret void
103}
104
105define void @f(i16 %b) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000106; MIPS32-LABEL: f:
107; MIPS32: # %bb.0:
108; MIPS32-NEXT: lui $2, %hi(_gp_disp)
109; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
110; MIPS32-NEXT: addiu $sp, $sp, -8
111; MIPS32-NEXT: .cfi_def_cfa_offset 8
112; MIPS32-NEXT: addu $1, $2, $25
113; MIPS32-NEXT: sh $4, 4($sp)
114; MIPS32-NEXT: lh $2, 4($sp)
115; MIPS32-NEXT: fill.h $w0, $2
116; MIPS32-NEXT: fexupr.w $w0, $w0
117; MIPS32-NEXT: copy_s.w $2, $w0[0]
118; MIPS32-NEXT: mtc1 $2, $f0
119; MIPS32-NEXT: lw $1, %got(k)($1)
120; MIPS32-NEXT: swc1 $f0, 0($1)
121; MIPS32-NEXT: jr $ra
122; MIPS32-NEXT: addiu $sp, $sp, 8
123;
124; MIPS64-N32-LABEL: f:
125; MIPS64-N32: # %bb.0:
126; MIPS64-N32-NEXT: addiu $sp, $sp, -16
127; MIPS64-N32-NEXT: .cfi_def_cfa_offset 16
128; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(f)))
129; MIPS64-N32-NEXT: addu $1, $1, $25
130; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(f)))
131; MIPS64-N32-NEXT: sh $4, 12($sp)
132; MIPS64-N32-NEXT: lh $2, 12($sp)
133; MIPS64-N32-NEXT: fill.h $w0, $2
134; MIPS64-N32-NEXT: fexupr.w $w0, $w0
135; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
136; MIPS64-N32-NEXT: mtc1 $2, $f0
137; MIPS64-N32-NEXT: lw $1, %got_disp(k)($1)
138; MIPS64-N32-NEXT: swc1 $f0, 0($1)
139; MIPS64-N32-NEXT: jr $ra
140; MIPS64-N32-NEXT: addiu $sp, $sp, 16
141;
142; MIPS64-N64-LABEL: f:
143; MIPS64-N64: # %bb.0:
144; MIPS64-N64-NEXT: daddiu $sp, $sp, -16
145; MIPS64-N64-NEXT: .cfi_def_cfa_offset 16
146; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(f)))
147; MIPS64-N64-NEXT: daddu $1, $1, $25
148; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(f)))
149; MIPS64-N64-NEXT: sh $4, 12($sp)
150; MIPS64-N64-NEXT: lh $2, 12($sp)
151; MIPS64-N64-NEXT: fill.h $w0, $2
152; MIPS64-N64-NEXT: fexupr.w $w0, $w0
153; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
154; MIPS64-N64-NEXT: mtc1 $2, $f0
155; MIPS64-N64-NEXT: ld $1, %got_disp(k)($1)
156; MIPS64-N64-NEXT: swc1 $f0, 0($1)
157; MIPS64-N64-NEXT: jr $ra
158; MIPS64-N64-NEXT: daddiu $sp, $sp, 16
Simon Dardis40a50402016-11-21 20:34:10 +0000159 %1 = bitcast i16 %b to half
160 %2 = fpext half %1 to float
161 store float %2, float * @k
162 ret void
163}
164
165@g = external global i16, align 2
166@h = external global half, align 2
167
168; Check that fext f16 to double has a fexupr.w, fexupr.d sequence.
169; Check that ftrunc double to f16 has fexdo.w, fexdo.h sequence.
170; Check that MIPS64R5+ uses 64-bit floating point <-> 64-bit GPR transfers.
171
172; We don't need to check if pre-MIPSR5 expansions occur, the MSA ASE requires
173; MIPSR5. Additionally, fp64 mode / FR=1 is required to use MSA.
174
175define void @fadd_f64() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000176; MIPS32-LABEL: fadd_f64:
177; MIPS32: # %bb.0: # %entry
178; MIPS32-NEXT: lui $2, %hi(_gp_disp)
179; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
180; MIPS32-NEXT: addu $1, $2, $25
181; MIPS32-NEXT: lw $1, %got(h)($1)
182; MIPS32-NEXT: lh $2, 0($1)
183; MIPS32-NEXT: fill.h $w0, $2
184; MIPS32-NEXT: fexupr.w $w0, $w0
185; MIPS32-NEXT: fexupr.d $w0, $w0
186; MIPS32-NEXT: copy_s.w $2, $w0[0]
187; MIPS32-NEXT: mtc1 $2, $f1
188; MIPS32-NEXT: copy_s.w $2, $w0[1]
189; MIPS32-NEXT: mthc1 $2, $f1
190; MIPS32-NEXT: add.d $f0, $f1, $f1
191; MIPS32-NEXT: mfc1 $2, $f0
192; MIPS32-NEXT: fill.w $w1, $2
193; MIPS32-NEXT: mfhc1 $2, $f0
194; MIPS32-NEXT: insert.w $w1[1], $2
195; MIPS32-NEXT: insert.w $w1[3], $2
196; MIPS32-NEXT: fexdo.w $w0, $w1, $w1
197; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
198; MIPS32-NEXT: copy_u.h $2, $w0[0]
199; MIPS32-NEXT: jr $ra
200; MIPS32-NEXT: sh $2, 0($1)
201;
202; MIPS64-N32-LABEL: fadd_f64:
203; MIPS64-N32: # %bb.0: # %entry
204; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fadd_f64)))
205; MIPS64-N32-NEXT: addu $1, $1, $25
206; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fadd_f64)))
207; MIPS64-N32-NEXT: lw $1, %got_disp(h)($1)
208; MIPS64-N32-NEXT: lh $2, 0($1)
209; MIPS64-N32-NEXT: fill.h $w0, $2
210; MIPS64-N32-NEXT: fexupr.w $w0, $w0
211; MIPS64-N32-NEXT: fexupr.d $w0, $w0
212; MIPS64-N32-NEXT: copy_s.d $2, $w0[0]
213; MIPS64-N32-NEXT: dmtc1 $2, $f0
214; MIPS64-N32-NEXT: add.d $f0, $f0, $f0
215; MIPS64-N32-NEXT: dmfc1 $2, $f0
216; MIPS64-N32-NEXT: fill.d $w0, $2
217; MIPS64-N32-NEXT: fexdo.w $w0, $w0, $w0
218; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
219; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
220; MIPS64-N32-NEXT: jr $ra
221; MIPS64-N32-NEXT: sh $2, 0($1)
222;
223; MIPS64-N64-LABEL: fadd_f64:
224; MIPS64-N64: # %bb.0: # %entry
225; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fadd_f64)))
226; MIPS64-N64-NEXT: daddu $1, $1, $25
227; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fadd_f64)))
228; MIPS64-N64-NEXT: ld $1, %got_disp(h)($1)
229; MIPS64-N64-NEXT: lh $2, 0($1)
230; MIPS64-N64-NEXT: fill.h $w0, $2
231; MIPS64-N64-NEXT: fexupr.w $w0, $w0
232; MIPS64-N64-NEXT: fexupr.d $w0, $w0
233; MIPS64-N64-NEXT: copy_s.d $2, $w0[0]
234; MIPS64-N64-NEXT: dmtc1 $2, $f0
235; MIPS64-N64-NEXT: add.d $f0, $f0, $f0
236; MIPS64-N64-NEXT: dmfc1 $2, $f0
237; MIPS64-N64-NEXT: fill.d $w0, $2
238; MIPS64-N64-NEXT: fexdo.w $w0, $w0, $w0
239; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
240; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
241; MIPS64-N64-NEXT: jr $ra
242; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +0000243entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000244 %0 = load half, half * @h, align 2
245 %1 = fpext half %0 to double
Simon Dardis40a50402016-11-21 20:34:10 +0000246 %2 = load half, half * @h, align 2
247 %3 = fpext half %2 to double
248 %add = fadd double %1, %3
Simon Dardis40a50402016-11-21 20:34:10 +0000249 %4 = fptrunc double %add to half
Simon Dardis40a50402016-11-21 20:34:10 +0000250 store half %4, half * @h, align 2
251 ret void
252}
253
Simon Pilgrimde3605f2018-11-19 19:16:13 +0000254; Entire fp16 (unsigned) range fits into (signed) i32.
Simon Dardis40a50402016-11-21 20:34:10 +0000255define i32 @ffptoui() {
Simon Pilgrimde3605f2018-11-19 19:16:13 +0000256; MIPS32-LABEL: ffptoui:
257; MIPS32: # %bb.0: # %entry
258; MIPS32-NEXT: lui $2, %hi(_gp_disp)
259; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
260; MIPS32-NEXT: addu $1, $2, $25
261; MIPS32-NEXT: lw $1, %got(h)($1)
262; MIPS32-NEXT: lh $1, 0($1)
263; MIPS32-NEXT: fill.h $w0, $1
264; MIPS32-NEXT: fexupr.w $w0, $w0
265; MIPS32-NEXT: fexupr.d $w0, $w0
266; MIPS32-NEXT: copy_s.w $1, $w0[0]
267; MIPS32-NEXT: mtc1 $1, $f1
268; MIPS32-NEXT: copy_s.w $1, $w0[1]
269; MIPS32-NEXT: mthc1 $1, $f1
270; MIPS32-NEXT: trunc.w.d $f0, $f1
271; MIPS32-NEXT: jr $ra
272; MIPS32-NEXT: mfc1 $2, $f0
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000273;
Simon Pilgrimde3605f2018-11-19 19:16:13 +0000274; MIPS64-N32-LABEL: ffptoui:
275; MIPS64-N32: # %bb.0: # %entry
276; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffptoui)))
277; MIPS64-N32-NEXT: addu $1, $1, $25
278; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffptoui)))
279; MIPS64-N32-NEXT: lw $1, %got_disp(h)($1)
280; MIPS64-N32-NEXT: lh $1, 0($1)
281; MIPS64-N32-NEXT: fill.h $w0, $1
282; MIPS64-N32-NEXT: fexupr.w $w0, $w0
283; MIPS64-N32-NEXT: fexupr.d $w0, $w0
284; MIPS64-N32-NEXT: copy_s.d $1, $w0[0]
285; MIPS64-N32-NEXT: dmtc1 $1, $f0
286; MIPS64-N32-NEXT: trunc.w.d $f0, $f0
287; MIPS64-N32-NEXT: jr $ra
288; MIPS64-N32-NEXT: mfc1 $2, $f0
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000289;
Simon Pilgrimde3605f2018-11-19 19:16:13 +0000290; MIPS64-N64-LABEL: ffptoui:
291; MIPS64-N64: # %bb.0: # %entry
292; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffptoui)))
293; MIPS64-N64-NEXT: daddu $1, $1, $25
294; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffptoui)))
295; MIPS64-N64-NEXT: ld $1, %got_disp(h)($1)
296; MIPS64-N64-NEXT: lh $1, 0($1)
297; MIPS64-N64-NEXT: fill.h $w0, $1
298; MIPS64-N64-NEXT: fexupr.w $w0, $w0
299; MIPS64-N64-NEXT: fexupr.d $w0, $w0
300; MIPS64-N64-NEXT: copy_s.d $1, $w0[0]
301; MIPS64-N64-NEXT: dmtc1 $1, $f0
302; MIPS64-N64-NEXT: trunc.w.d $f0, $f0
303; MIPS64-N64-NEXT: jr $ra
304; MIPS64-N64-NEXT: mfc1 $2, $f0
Simon Dardis40a50402016-11-21 20:34:10 +0000305entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000306 %0 = load half, half * @h, align 2
307 %1 = fptoui half %0 to i32
Simon Dardis40a50402016-11-21 20:34:10 +0000308 ret i32 %1
309}
310
311define i32 @ffptosi() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000312; MIPS32-LABEL: ffptosi:
313; MIPS32: # %bb.0: # %entry
314; MIPS32-NEXT: lui $2, %hi(_gp_disp)
315; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
316; MIPS32-NEXT: addu $1, $2, $25
317; MIPS32-NEXT: lw $1, %got(h)($1)
318; MIPS32-NEXT: lh $1, 0($1)
319; MIPS32-NEXT: fill.h $w0, $1
320; MIPS32-NEXT: fexupr.w $w0, $w0
321; MIPS32-NEXT: fexupr.d $w0, $w0
322; MIPS32-NEXT: copy_s.w $1, $w0[0]
323; MIPS32-NEXT: mtc1 $1, $f1
324; MIPS32-NEXT: copy_s.w $1, $w0[1]
325; MIPS32-NEXT: mthc1 $1, $f1
326; MIPS32-NEXT: trunc.w.d $f0, $f1
327; MIPS32-NEXT: jr $ra
328; MIPS32-NEXT: mfc1 $2, $f0
329;
330; MIPS64-N32-LABEL: ffptosi:
331; MIPS64-N32: # %bb.0: # %entry
332; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffptosi)))
333; MIPS64-N32-NEXT: addu $1, $1, $25
334; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffptosi)))
335; MIPS64-N32-NEXT: lw $1, %got_disp(h)($1)
336; MIPS64-N32-NEXT: lh $1, 0($1)
337; MIPS64-N32-NEXT: fill.h $w0, $1
338; MIPS64-N32-NEXT: fexupr.w $w0, $w0
339; MIPS64-N32-NEXT: fexupr.d $w0, $w0
340; MIPS64-N32-NEXT: copy_s.d $1, $w0[0]
341; MIPS64-N32-NEXT: dmtc1 $1, $f0
342; MIPS64-N32-NEXT: trunc.w.d $f0, $f0
343; MIPS64-N32-NEXT: jr $ra
344; MIPS64-N32-NEXT: mfc1 $2, $f0
345;
346; MIPS64-N64-LABEL: ffptosi:
347; MIPS64-N64: # %bb.0: # %entry
348; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffptosi)))
349; MIPS64-N64-NEXT: daddu $1, $1, $25
350; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffptosi)))
351; MIPS64-N64-NEXT: ld $1, %got_disp(h)($1)
352; MIPS64-N64-NEXT: lh $1, 0($1)
353; MIPS64-N64-NEXT: fill.h $w0, $1
354; MIPS64-N64-NEXT: fexupr.w $w0, $w0
355; MIPS64-N64-NEXT: fexupr.d $w0, $w0
356; MIPS64-N64-NEXT: copy_s.d $1, $w0[0]
357; MIPS64-N64-NEXT: dmtc1 $1, $f0
358; MIPS64-N64-NEXT: trunc.w.d $f0, $f0
359; MIPS64-N64-NEXT: jr $ra
360; MIPS64-N64-NEXT: mfc1 $2, $f0
Simon Dardis40a50402016-11-21 20:34:10 +0000361entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000362 %0 = load half, half * @h, align 2
363 %1 = fptosi half %0 to i32
364 ret i32 %1
365
Simon Dardis40a50402016-11-21 20:34:10 +0000366
Simon Dardis40a50402016-11-21 20:34:10 +0000367
Simon Dardis40a50402016-11-21 20:34:10 +0000368
Simon Dardis40a50402016-11-21 20:34:10 +0000369}
370
371define void @uitofp(i32 %a) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000372; MIPS32-LABEL: uitofp:
373; MIPS32: # %bb.0: # %entry
374; MIPS32-NEXT: lui $2, %hi(_gp_disp)
375; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
376; MIPS32-NEXT: addiu $sp, $sp, -8
377; MIPS32-NEXT: .cfi_def_cfa_offset 8
378; MIPS32-NEXT: addu $1, $2, $25
379; MIPS32-NEXT: lui $2, 17200
380; MIPS32-NEXT: sw $2, 4($sp)
381; MIPS32-NEXT: sw $4, 0($sp)
382; MIPS32-NEXT: lw $2, %got($CPI5_0)($1)
383; MIPS32-NEXT: ldc1 $f0, %lo($CPI5_0)($2)
384; MIPS32-NEXT: ldc1 $f1, 0($sp)
385; MIPS32-NEXT: sub.d $f0, $f1, $f0
386; MIPS32-NEXT: mfc1 $2, $f0
387; MIPS32-NEXT: fill.w $w1, $2
388; MIPS32-NEXT: mfhc1 $2, $f0
389; MIPS32-NEXT: insert.w $w1[1], $2
390; MIPS32-NEXT: insert.w $w1[3], $2
391; MIPS32-NEXT: fexdo.w $w0, $w1, $w1
392; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
393; MIPS32-NEXT: lw $1, %got(h)($1)
394; MIPS32-NEXT: copy_u.h $2, $w0[0]
395; MIPS32-NEXT: sh $2, 0($1)
396; MIPS32-NEXT: jr $ra
397; MIPS32-NEXT: addiu $sp, $sp, 8
398;
399; MIPS64-N32-LABEL: uitofp:
400; MIPS64-N32: # %bb.0: # %entry
401; MIPS64-N32-NEXT: addiu $sp, $sp, -16
402; MIPS64-N32-NEXT: .cfi_def_cfa_offset 16
403; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(uitofp)))
404; MIPS64-N32-NEXT: addu $1, $1, $25
405; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(uitofp)))
406; MIPS64-N32-NEXT: lui $2, 17200
407; MIPS64-N32-NEXT: sw $2, 12($sp)
408; MIPS64-N32-NEXT: sll $2, $4, 0
409; MIPS64-N32-NEXT: sw $2, 8($sp)
410; MIPS64-N32-NEXT: lw $2, %got_page(.LCPI5_0)($1)
411; MIPS64-N32-NEXT: ldc1 $f0, %got_ofst(.LCPI5_0)($2)
412; MIPS64-N32-NEXT: ldc1 $f1, 8($sp)
413; MIPS64-N32-NEXT: sub.d $f0, $f1, $f0
414; MIPS64-N32-NEXT: dmfc1 $2, $f0
415; MIPS64-N32-NEXT: fill.d $w0, $2
416; MIPS64-N32-NEXT: fexdo.w $w0, $w0, $w0
417; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
418; MIPS64-N32-NEXT: lw $1, %got_disp(h)($1)
419; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
420; MIPS64-N32-NEXT: sh $2, 0($1)
421; MIPS64-N32-NEXT: jr $ra
422; MIPS64-N32-NEXT: addiu $sp, $sp, 16
423;
424; MIPS64-N64-LABEL: uitofp:
425; MIPS64-N64: # %bb.0: # %entry
426; MIPS64-N64-NEXT: daddiu $sp, $sp, -16
427; MIPS64-N64-NEXT: .cfi_def_cfa_offset 16
428; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(uitofp)))
429; MIPS64-N64-NEXT: daddu $1, $1, $25
430; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(uitofp)))
431; MIPS64-N64-NEXT: lui $2, 17200
432; MIPS64-N64-NEXT: sw $2, 12($sp)
433; MIPS64-N64-NEXT: sll $2, $4, 0
434; MIPS64-N64-NEXT: sw $2, 8($sp)
435; MIPS64-N64-NEXT: ld $2, %got_page(.LCPI5_0)($1)
436; MIPS64-N64-NEXT: ldc1 $f0, %got_ofst(.LCPI5_0)($2)
437; MIPS64-N64-NEXT: ldc1 $f1, 8($sp)
438; MIPS64-N64-NEXT: sub.d $f0, $f1, $f0
439; MIPS64-N64-NEXT: dmfc1 $2, $f0
440; MIPS64-N64-NEXT: fill.d $w0, $2
441; MIPS64-N64-NEXT: fexdo.w $w0, $w0, $w0
442; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
443; MIPS64-N64-NEXT: ld $1, %got_disp(h)($1)
444; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
445; MIPS64-N64-NEXT: sh $2, 0($1)
446; MIPS64-N64-NEXT: jr $ra
447; MIPS64-N64-NEXT: daddiu $sp, $sp, 16
Simon Dardis40a50402016-11-21 20:34:10 +0000448entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000449
Simon Dardis40a50402016-11-21 20:34:10 +0000450
Simon Dardis40a50402016-11-21 20:34:10 +0000451
Simon Dardis40a50402016-11-21 20:34:10 +0000452
Simon Dardis40a50402016-11-21 20:34:10 +0000453
Simon Dardis40a50402016-11-21 20:34:10 +0000454
Simon Dardis40a50402016-11-21 20:34:10 +0000455
Simon Dardis40a50402016-11-21 20:34:10 +0000456
Simon Dardis40a50402016-11-21 20:34:10 +0000457
Simon Dardis40a50402016-11-21 20:34:10 +0000458 %0 = uitofp i32 %a to half
459 store half %0, half * @h, align 2
460 ret void
461}
462
463
464; Check that f16 is expanded to f32 and relevant transfer ops occur.
465; We don't check f16 -> f64 expansion occurs, as we expand f16 to f32.
466
467define void @fadd() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000468; MIPS32-LABEL: fadd:
469; MIPS32: # %bb.0: # %entry
470; MIPS32-NEXT: lui $2, %hi(_gp_disp)
471; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
472; MIPS32-NEXT: addu $1, $2, $25
473; MIPS32-NEXT: lw $1, %got(g)($1)
474; MIPS32-NEXT: lh $2, 0($1)
475; MIPS32-NEXT: fill.h $w0, $2
476; MIPS32-NEXT: fexupr.w $w0, $w0
477; MIPS32-NEXT: copy_s.w $2, $w0[0]
478; MIPS32-NEXT: mtc1 $2, $f0
479; MIPS32-NEXT: add.s $f0, $f0, $f0
480; MIPS32-NEXT: mfc1 $2, $f0
481; MIPS32-NEXT: fill.w $w0, $2
482; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
483; MIPS32-NEXT: copy_u.h $2, $w0[0]
484; MIPS32-NEXT: jr $ra
485; MIPS32-NEXT: sh $2, 0($1)
486;
487; MIPS64-N32-LABEL: fadd:
488; MIPS64-N32: # %bb.0: # %entry
489; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fadd)))
490; MIPS64-N32-NEXT: addu $1, $1, $25
491; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fadd)))
492; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)
493; MIPS64-N32-NEXT: lh $2, 0($1)
494; MIPS64-N32-NEXT: fill.h $w0, $2
495; MIPS64-N32-NEXT: fexupr.w $w0, $w0
496; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
497; MIPS64-N32-NEXT: mtc1 $2, $f0
498; MIPS64-N32-NEXT: add.s $f0, $f0, $f0
499; MIPS64-N32-NEXT: mfc1 $2, $f0
500; MIPS64-N32-NEXT: fill.w $w0, $2
501; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
502; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
503; MIPS64-N32-NEXT: jr $ra
504; MIPS64-N32-NEXT: sh $2, 0($1)
505;
506; MIPS64-N64-LABEL: fadd:
507; MIPS64-N64: # %bb.0: # %entry
508; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fadd)))
509; MIPS64-N64-NEXT: daddu $1, $1, $25
510; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fadd)))
511; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)
512; MIPS64-N64-NEXT: lh $2, 0($1)
513; MIPS64-N64-NEXT: fill.h $w0, $2
514; MIPS64-N64-NEXT: fexupr.w $w0, $w0
515; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
516; MIPS64-N64-NEXT: mtc1 $2, $f0
517; MIPS64-N64-NEXT: add.s $f0, $f0, $f0
518; MIPS64-N64-NEXT: mfc1 $2, $f0
519; MIPS64-N64-NEXT: fill.w $w0, $2
520; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
521; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
522; MIPS64-N64-NEXT: jr $ra
523; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +0000524entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000525 %0 = load i16, i16* @g, align 2
526 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
527
Simon Dardis40a50402016-11-21 20:34:10 +0000528
529 %2 = load i16, i16* @g, align 2
530 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
531 %add = fadd float %1, %3
532
Simon Dardis40a50402016-11-21 20:34:10 +0000533
534 %4 = call i16 @llvm.convert.to.fp16.f32(float %add)
535
Simon Dardis40a50402016-11-21 20:34:10 +0000536 store i16 %4, i16* @g, align 2
537 ret void
538}
539
540; Function Attrs: nounwind readnone
541declare float @llvm.convert.from.fp16.f32(i16)
542
543; Function Attrs: nounwind readnone
544declare i16 @llvm.convert.to.fp16.f32(float)
545
546; Function Attrs: nounwind
547define void @fsub() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000548; MIPS32-LABEL: fsub:
549; MIPS32: # %bb.0: # %entry
550; MIPS32-NEXT: lui $2, %hi(_gp_disp)
551; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
552; MIPS32-NEXT: addu $1, $2, $25
553; MIPS32-NEXT: lw $1, %got(g)($1)
554; MIPS32-NEXT: lh $2, 0($1)
555; MIPS32-NEXT: fill.h $w0, $2
556; MIPS32-NEXT: fexupr.w $w0, $w0
557; MIPS32-NEXT: copy_s.w $2, $w0[0]
558; MIPS32-NEXT: mtc1 $2, $f0
559; MIPS32-NEXT: sub.s $f0, $f0, $f0
560; MIPS32-NEXT: mfc1 $2, $f0
561; MIPS32-NEXT: fill.w $w0, $2
562; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
563; MIPS32-NEXT: copy_u.h $2, $w0[0]
564; MIPS32-NEXT: jr $ra
565; MIPS32-NEXT: sh $2, 0($1)
566;
567; MIPS64-N32-LABEL: fsub:
568; MIPS64-N32: # %bb.0: # %entry
569; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsub)))
570; MIPS64-N32-NEXT: addu $1, $1, $25
571; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fsub)))
572; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)
573; MIPS64-N32-NEXT: lh $2, 0($1)
574; MIPS64-N32-NEXT: fill.h $w0, $2
575; MIPS64-N32-NEXT: fexupr.w $w0, $w0
576; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
577; MIPS64-N32-NEXT: mtc1 $2, $f0
578; MIPS64-N32-NEXT: sub.s $f0, $f0, $f0
579; MIPS64-N32-NEXT: mfc1 $2, $f0
580; MIPS64-N32-NEXT: fill.w $w0, $2
581; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
582; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
583; MIPS64-N32-NEXT: jr $ra
584; MIPS64-N32-NEXT: sh $2, 0($1)
585;
586; MIPS64-N64-LABEL: fsub:
587; MIPS64-N64: # %bb.0: # %entry
588; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsub)))
589; MIPS64-N64-NEXT: daddu $1, $1, $25
590; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fsub)))
591; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)
592; MIPS64-N64-NEXT: lh $2, 0($1)
593; MIPS64-N64-NEXT: fill.h $w0, $2
594; MIPS64-N64-NEXT: fexupr.w $w0, $w0
595; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
596; MIPS64-N64-NEXT: mtc1 $2, $f0
597; MIPS64-N64-NEXT: sub.s $f0, $f0, $f0
598; MIPS64-N64-NEXT: mfc1 $2, $f0
599; MIPS64-N64-NEXT: fill.w $w0, $2
600; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
601; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
602; MIPS64-N64-NEXT: jr $ra
603; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +0000604entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000605 %0 = load i16, i16* @g, align 2
606 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
607
Simon Dardis40a50402016-11-21 20:34:10 +0000608
609 %2 = load i16, i16* @g, align 2
610 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
611 %sub = fsub float %1, %3
612
Simon Dardis40a50402016-11-21 20:34:10 +0000613
614 %4 = call i16 @llvm.convert.to.fp16.f32(float %sub)
615
Simon Dardis40a50402016-11-21 20:34:10 +0000616
617 store i16 %4, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +0000618 ret void
619}
620
621define void @fmult() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000622; MIPS32-LABEL: fmult:
623; MIPS32: # %bb.0: # %entry
624; MIPS32-NEXT: lui $2, %hi(_gp_disp)
625; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
626; MIPS32-NEXT: addu $1, $2, $25
627; MIPS32-NEXT: lw $1, %got(g)($1)
628; MIPS32-NEXT: lh $2, 0($1)
629; MIPS32-NEXT: fill.h $w0, $2
630; MIPS32-NEXT: fexupr.w $w0, $w0
631; MIPS32-NEXT: copy_s.w $2, $w0[0]
632; MIPS32-NEXT: mtc1 $2, $f0
633; MIPS32-NEXT: mul.s $f0, $f0, $f0
634; MIPS32-NEXT: mfc1 $2, $f0
635; MIPS32-NEXT: fill.w $w0, $2
636; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
637; MIPS32-NEXT: copy_u.h $2, $w0[0]
638; MIPS32-NEXT: jr $ra
639; MIPS32-NEXT: sh $2, 0($1)
640;
641; MIPS64-N32-LABEL: fmult:
642; MIPS64-N32: # %bb.0: # %entry
643; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fmult)))
644; MIPS64-N32-NEXT: addu $1, $1, $25
645; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fmult)))
646; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)
647; MIPS64-N32-NEXT: lh $2, 0($1)
648; MIPS64-N32-NEXT: fill.h $w0, $2
649; MIPS64-N32-NEXT: fexupr.w $w0, $w0
650; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
651; MIPS64-N32-NEXT: mtc1 $2, $f0
652; MIPS64-N32-NEXT: mul.s $f0, $f0, $f0
653; MIPS64-N32-NEXT: mfc1 $2, $f0
654; MIPS64-N32-NEXT: fill.w $w0, $2
655; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
656; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
657; MIPS64-N32-NEXT: jr $ra
658; MIPS64-N32-NEXT: sh $2, 0($1)
659;
660; MIPS64-N64-LABEL: fmult:
661; MIPS64-N64: # %bb.0: # %entry
662; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fmult)))
663; MIPS64-N64-NEXT: daddu $1, $1, $25
664; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fmult)))
665; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)
666; MIPS64-N64-NEXT: lh $2, 0($1)
667; MIPS64-N64-NEXT: fill.h $w0, $2
668; MIPS64-N64-NEXT: fexupr.w $w0, $w0
669; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
670; MIPS64-N64-NEXT: mtc1 $2, $f0
671; MIPS64-N64-NEXT: mul.s $f0, $f0, $f0
672; MIPS64-N64-NEXT: mfc1 $2, $f0
673; MIPS64-N64-NEXT: fill.w $w0, $2
674; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
675; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
676; MIPS64-N64-NEXT: jr $ra
677; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +0000678entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000679 %0 = load i16, i16* @g, align 2
680 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
681
Simon Dardis40a50402016-11-21 20:34:10 +0000682
683 %2 = load i16, i16* @g, align 2
684 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
685 %mul = fmul float %1, %3
686
Simon Dardis40a50402016-11-21 20:34:10 +0000687
688 %4 = call i16 @llvm.convert.to.fp16.f32(float %mul)
689
Simon Dardis40a50402016-11-21 20:34:10 +0000690
691 store i16 %4, i16* @g, align 2
692
Simon Dardis40a50402016-11-21 20:34:10 +0000693 ret void
694}
695
696define void @fdiv() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000697; MIPS32-LABEL: fdiv:
698; MIPS32: # %bb.0: # %entry
699; MIPS32-NEXT: lui $2, %hi(_gp_disp)
700; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
701; MIPS32-NEXT: addu $1, $2, $25
702; MIPS32-NEXT: lw $1, %got(g)($1)
703; MIPS32-NEXT: lh $2, 0($1)
704; MIPS32-NEXT: fill.h $w0, $2
705; MIPS32-NEXT: fexupr.w $w0, $w0
706; MIPS32-NEXT: copy_s.w $2, $w0[0]
707; MIPS32-NEXT: mtc1 $2, $f0
708; MIPS32-NEXT: div.s $f0, $f0, $f0
709; MIPS32-NEXT: mfc1 $2, $f0
710; MIPS32-NEXT: fill.w $w0, $2
711; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
712; MIPS32-NEXT: copy_u.h $2, $w0[0]
713; MIPS32-NEXT: jr $ra
714; MIPS32-NEXT: sh $2, 0($1)
715;
716; MIPS64-N32-LABEL: fdiv:
717; MIPS64-N32: # %bb.0: # %entry
718; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fdiv)))
719; MIPS64-N32-NEXT: addu $1, $1, $25
720; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fdiv)))
721; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)
722; MIPS64-N32-NEXT: lh $2, 0($1)
723; MIPS64-N32-NEXT: fill.h $w0, $2
724; MIPS64-N32-NEXT: fexupr.w $w0, $w0
725; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
726; MIPS64-N32-NEXT: mtc1 $2, $f0
727; MIPS64-N32-NEXT: div.s $f0, $f0, $f0
728; MIPS64-N32-NEXT: mfc1 $2, $f0
729; MIPS64-N32-NEXT: fill.w $w0, $2
730; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
731; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
732; MIPS64-N32-NEXT: jr $ra
733; MIPS64-N32-NEXT: sh $2, 0($1)
734;
735; MIPS64-N64-LABEL: fdiv:
736; MIPS64-N64: # %bb.0: # %entry
737; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fdiv)))
738; MIPS64-N64-NEXT: daddu $1, $1, $25
739; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fdiv)))
740; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)
741; MIPS64-N64-NEXT: lh $2, 0($1)
742; MIPS64-N64-NEXT: fill.h $w0, $2
743; MIPS64-N64-NEXT: fexupr.w $w0, $w0
744; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
745; MIPS64-N64-NEXT: mtc1 $2, $f0
746; MIPS64-N64-NEXT: div.s $f0, $f0, $f0
747; MIPS64-N64-NEXT: mfc1 $2, $f0
748; MIPS64-N64-NEXT: fill.w $w0, $2
749; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
750; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
751; MIPS64-N64-NEXT: jr $ra
752; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +0000753entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000754
755 %0 = load i16, i16* @g, align 2
756 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
757
Simon Dardis40a50402016-11-21 20:34:10 +0000758
759 %2 = load i16, i16* @g, align 2
760 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
761 %div = fdiv float %1, %3
762
Simon Dardis40a50402016-11-21 20:34:10 +0000763
764 %4 = call i16 @llvm.convert.to.fp16.f32(float %div)
765
Simon Dardis40a50402016-11-21 20:34:10 +0000766 store i16 %4, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +0000767 ret void
768}
769
770define void @frem() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000771; MIPS32-LABEL: frem:
772; MIPS32: # %bb.0: # %entry
773; MIPS32-NEXT: lui $2, %hi(_gp_disp)
774; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
775; MIPS32-NEXT: addiu $sp, $sp, -24
776; MIPS32-NEXT: .cfi_def_cfa_offset 24
777; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
778; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
779; MIPS32-NEXT: .cfi_offset 31, -4
780; MIPS32-NEXT: .cfi_offset 16, -8
781; MIPS32-NEXT: addu $gp, $2, $25
782; MIPS32-NEXT: lw $16, %got(g)($gp)
783; MIPS32-NEXT: lh $1, 0($16)
784; MIPS32-NEXT: fill.h $w0, $1
785; MIPS32-NEXT: fexupr.w $w0, $w0
786; MIPS32-NEXT: copy_s.w $1, $w0[0]
787; MIPS32-NEXT: mtc1 $1, $f12
788; MIPS32-NEXT: lw $25, %call16(fmodf)($gp)
789; MIPS32-NEXT: jalr $25
790; MIPS32-NEXT: mov.s $f14, $f12
791; MIPS32-NEXT: mfc1 $1, $f0
792; MIPS32-NEXT: fill.w $w0, $1
793; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
794; MIPS32-NEXT: copy_u.h $1, $w0[0]
795; MIPS32-NEXT: sh $1, 0($16)
796; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
797; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
798; MIPS32-NEXT: jr $ra
799; MIPS32-NEXT: addiu $sp, $sp, 24
800;
801; MIPS64-N32-LABEL: frem:
802; MIPS64-N32: # %bb.0: # %entry
803; MIPS64-N32-NEXT: addiu $sp, $sp, -32
804; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
805; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
806; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
807; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
808; MIPS64-N32-NEXT: .cfi_offset 31, -8
809; MIPS64-N32-NEXT: .cfi_offset 28, -16
810; MIPS64-N32-NEXT: .cfi_offset 16, -24
811; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(frem)))
812; MIPS64-N32-NEXT: addu $1, $1, $25
813; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(frem)))
814; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
815; MIPS64-N32-NEXT: lh $1, 0($16)
816; MIPS64-N32-NEXT: fill.h $w0, $1
817; MIPS64-N32-NEXT: fexupr.w $w0, $w0
818; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
819; MIPS64-N32-NEXT: mtc1 $1, $f12
820; MIPS64-N32-NEXT: lw $25, %call16(fmodf)($gp)
821; MIPS64-N32-NEXT: jalr $25
822; MIPS64-N32-NEXT: mov.s $f13, $f12
823; MIPS64-N32-NEXT: mfc1 $1, $f0
824; MIPS64-N32-NEXT: fill.w $w0, $1
825; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
826; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
827; MIPS64-N32-NEXT: sh $1, 0($16)
828; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
829; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
830; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
831; MIPS64-N32-NEXT: jr $ra
832; MIPS64-N32-NEXT: addiu $sp, $sp, 32
833;
834; MIPS64-N64-LABEL: frem:
835; MIPS64-N64: # %bb.0: # %entry
836; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
837; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
838; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
839; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
840; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
841; MIPS64-N64-NEXT: .cfi_offset 31, -8
842; MIPS64-N64-NEXT: .cfi_offset 28, -16
843; MIPS64-N64-NEXT: .cfi_offset 16, -24
844; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(frem)))
845; MIPS64-N64-NEXT: daddu $1, $1, $25
846; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(frem)))
847; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
848; MIPS64-N64-NEXT: lh $1, 0($16)
849; MIPS64-N64-NEXT: fill.h $w0, $1
850; MIPS64-N64-NEXT: fexupr.w $w0, $w0
851; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
852; MIPS64-N64-NEXT: mtc1 $1, $f12
853; MIPS64-N64-NEXT: ld $25, %call16(fmodf)($gp)
854; MIPS64-N64-NEXT: jalr $25
855; MIPS64-N64-NEXT: mov.s $f13, $f12
856; MIPS64-N64-NEXT: mfc1 $1, $f0
857; MIPS64-N64-NEXT: fill.w $w0, $1
858; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
859; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
860; MIPS64-N64-NEXT: sh $1, 0($16)
861; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
862; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
863; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
864; MIPS64-N64-NEXT: jr $ra
865; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +0000866entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000867 %0 = load i16, i16* @g, align 2
868 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
869
Simon Dardis40a50402016-11-21 20:34:10 +0000870
871 %2 = load i16, i16* @g, align 2
872 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
873 %rem = frem float %1, %3
874
Simon Dardis40a50402016-11-21 20:34:10 +0000875
876 %4 = call i16 @llvm.convert.to.fp16.f32(float %rem)
877
Simon Dardis40a50402016-11-21 20:34:10 +0000878
879 store i16 %4, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +0000880
881 ret void
882}
883
884@i1 = external global i16, align 1
885
886define void @fcmp() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +0000887; MIPS32-O32-LABEL: fcmp:
888; MIPS32-O32: # %bb.0: # %entry
889; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp)
890; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp)
891; MIPS32-O32-NEXT: addu $1, $2, $25
892; MIPS32-O32-NEXT: lw $2, %got(g)($1)
893; MIPS32-O32-NEXT: lh $2, 0($2)
894; MIPS32-O32-NEXT: fill.h $w0, $2
895; MIPS32-O32-NEXT: fexupr.w $w0, $w0
896; MIPS32-O32-NEXT: copy_s.w $2, $w0[0]
897; MIPS32-O32-NEXT: mtc1 $2, $f0
898; MIPS32-O32-NEXT: addiu $2, $zero, 1
899; MIPS32-O32-NEXT: c.un.s $f0, $f0
900; MIPS32-O32-NEXT: movt $2, $zero, $fcc0
901; MIPS32-O32-NEXT: lw $1, %got(i1)($1)
902; MIPS32-O32-NEXT: jr $ra
903; MIPS32-O32-NEXT: sh $2, 0($1)
904;
905; MIPS64R5-N32-LABEL: fcmp:
906; MIPS64R5-N32: # %bb.0: # %entry
907; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp)))
908; MIPS64R5-N32-NEXT: addu $1, $1, $25
909; MIPS64R5-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcmp)))
910; MIPS64R5-N32-NEXT: lw $2, %got_disp(g)($1)
911; MIPS64R5-N32-NEXT: lh $2, 0($2)
912; MIPS64R5-N32-NEXT: fill.h $w0, $2
913; MIPS64R5-N32-NEXT: fexupr.w $w0, $w0
914; MIPS64R5-N32-NEXT: copy_s.w $2, $w0[0]
915; MIPS64R5-N32-NEXT: mtc1 $2, $f0
916; MIPS64R5-N32-NEXT: addiu $2, $zero, 1
917; MIPS64R5-N32-NEXT: c.un.s $f0, $f0
918; MIPS64R5-N32-NEXT: movt $2, $zero, $fcc0
919; MIPS64R5-N32-NEXT: lw $1, %got_disp(i1)($1)
920; MIPS64R5-N32-NEXT: jr $ra
921; MIPS64R5-N32-NEXT: sh $2, 0($1)
922;
923; MIPS64R5-N64-LABEL: fcmp:
924; MIPS64R5-N64: # %bb.0: # %entry
925; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp)))
926; MIPS64R5-N64-NEXT: daddu $1, $1, $25
927; MIPS64R5-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcmp)))
928; MIPS64R5-N64-NEXT: ld $2, %got_disp(g)($1)
929; MIPS64R5-N64-NEXT: lh $2, 0($2)
930; MIPS64R5-N64-NEXT: fill.h $w0, $2
931; MIPS64R5-N64-NEXT: fexupr.w $w0, $w0
932; MIPS64R5-N64-NEXT: copy_s.w $2, $w0[0]
933; MIPS64R5-N64-NEXT: mtc1 $2, $f0
934; MIPS64R5-N64-NEXT: addiu $2, $zero, 1
935; MIPS64R5-N64-NEXT: c.un.s $f0, $f0
936; MIPS64R5-N64-NEXT: movt $2, $zero, $fcc0
937; MIPS64R5-N64-NEXT: ld $1, %got_disp(i1)($1)
938; MIPS64R5-N64-NEXT: jr $ra
939; MIPS64R5-N64-NEXT: sh $2, 0($1)
940;
941; MIPSR6-O32-LABEL: fcmp:
942; MIPSR6-O32: # %bb.0: # %entry
943; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp)
944; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp)
945; MIPSR6-O32-NEXT: addu $1, $2, $25
946; MIPSR6-O32-NEXT: lw $2, %got(g)($1)
947; MIPSR6-O32-NEXT: lh $2, 0($2)
948; MIPSR6-O32-NEXT: fill.h $w0, $2
949; MIPSR6-O32-NEXT: fexupr.w $w0, $w0
950; MIPSR6-O32-NEXT: copy_s.w $2, $w0[0]
951; MIPSR6-O32-NEXT: mtc1 $2, $f0
952; MIPSR6-O32-NEXT: cmp.un.s $f0, $f0, $f0
953; MIPSR6-O32-NEXT: mfc1 $2, $f0
954; MIPSR6-O32-NEXT: not $2, $2
955; MIPSR6-O32-NEXT: andi $2, $2, 1
956; MIPSR6-O32-NEXT: lw $1, %got(i1)($1)
957; MIPSR6-O32-NEXT: jr $ra
958; MIPSR6-O32-NEXT: sh $2, 0($1)
959;
960; MIPSR6-N32-LABEL: fcmp:
961; MIPSR6-N32: # %bb.0: # %entry
962; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp)))
963; MIPSR6-N32-NEXT: addu $1, $1, $25
964; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcmp)))
965; MIPSR6-N32-NEXT: lw $2, %got_disp(g)($1)
966; MIPSR6-N32-NEXT: lh $2, 0($2)
967; MIPSR6-N32-NEXT: fill.h $w0, $2
968; MIPSR6-N32-NEXT: fexupr.w $w0, $w0
969; MIPSR6-N32-NEXT: copy_s.w $2, $w0[0]
970; MIPSR6-N32-NEXT: mtc1 $2, $f0
971; MIPSR6-N32-NEXT: cmp.un.s $f0, $f0, $f0
972; MIPSR6-N32-NEXT: mfc1 $2, $f0
973; MIPSR6-N32-NEXT: not $2, $2
974; MIPSR6-N32-NEXT: andi $2, $2, 1
975; MIPSR6-N32-NEXT: lw $1, %got_disp(i1)($1)
976; MIPSR6-N32-NEXT: jr $ra
977; MIPSR6-N32-NEXT: sh $2, 0($1)
978;
979; MIPSR6-N64-LABEL: fcmp:
980; MIPSR6-N64: # %bb.0: # %entry
981; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcmp)))
982; MIPSR6-N64-NEXT: daddu $1, $1, $25
983; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcmp)))
984; MIPSR6-N64-NEXT: ld $2, %got_disp(g)($1)
985; MIPSR6-N64-NEXT: lh $2, 0($2)
986; MIPSR6-N64-NEXT: fill.h $w0, $2
987; MIPSR6-N64-NEXT: fexupr.w $w0, $w0
988; MIPSR6-N64-NEXT: copy_s.w $2, $w0[0]
989; MIPSR6-N64-NEXT: mtc1 $2, $f0
990; MIPSR6-N64-NEXT: cmp.un.s $f0, $f0, $f0
991; MIPSR6-N64-NEXT: mfc1 $2, $f0
992; MIPSR6-N64-NEXT: not $2, $2
993; MIPSR6-N64-NEXT: andi $2, $2, 1
994; MIPSR6-N64-NEXT: ld $1, %got_disp(i1)($1)
995; MIPSR6-N64-NEXT: jr $ra
996; MIPSR6-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +0000997entry:
Simon Dardis40a50402016-11-21 20:34:10 +0000998 %0 = load i16, i16* @g, align 2
999 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
Simon Dardis40a50402016-11-21 20:34:10 +00001000
1001 %2 = load i16, i16* @g, align 2
1002 %3 = call float @llvm.convert.from.fp16.f32(i16 %2)
1003 %fcmp = fcmp oeq float %1, %3
1004
Simon Dardis40a50402016-11-21 20:34:10 +00001005
1006 %4 = zext i1 %fcmp to i16
1007 store i16 %4, i16* @i1, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001008
1009 ret void
1010}
1011
1012declare float @llvm.powi.f32(float, i32)
1013
1014define void @fpowi() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001015; MIPS32-LABEL: fpowi:
1016; MIPS32: # %bb.0: # %entry
1017; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1018; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1019; MIPS32-NEXT: addu $1, $2, $25
1020; MIPS32-NEXT: lw $1, %got(g)($1)
1021; MIPS32-NEXT: lh $2, 0($1)
1022; MIPS32-NEXT: fill.h $w0, $2
1023; MIPS32-NEXT: fexupr.w $w0, $w0
1024; MIPS32-NEXT: copy_s.w $2, $w0[0]
1025; MIPS32-NEXT: mtc1 $2, $f0
1026; MIPS32-NEXT: mul.s $f0, $f0, $f0
1027; MIPS32-NEXT: mfc1 $2, $f0
1028; MIPS32-NEXT: fill.w $w0, $2
1029; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1030; MIPS32-NEXT: copy_u.h $2, $w0[0]
1031; MIPS32-NEXT: jr $ra
1032; MIPS32-NEXT: sh $2, 0($1)
1033;
1034; MIPS64-N32-LABEL: fpowi:
1035; MIPS64-N32: # %bb.0: # %entry
1036; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi)))
1037; MIPS64-N32-NEXT: addu $1, $1, $25
1038; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fpowi)))
1039; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)
1040; MIPS64-N32-NEXT: lh $2, 0($1)
1041; MIPS64-N32-NEXT: fill.h $w0, $2
1042; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1043; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
1044; MIPS64-N32-NEXT: mtc1 $2, $f0
1045; MIPS64-N32-NEXT: mul.s $f0, $f0, $f0
1046; MIPS64-N32-NEXT: mfc1 $2, $f0
1047; MIPS64-N32-NEXT: fill.w $w0, $2
1048; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1049; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
1050; MIPS64-N32-NEXT: jr $ra
1051; MIPS64-N32-NEXT: sh $2, 0($1)
1052;
1053; MIPS64-N64-LABEL: fpowi:
1054; MIPS64-N64: # %bb.0: # %entry
1055; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi)))
1056; MIPS64-N64-NEXT: daddu $1, $1, $25
1057; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fpowi)))
1058; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)
1059; MIPS64-N64-NEXT: lh $2, 0($1)
1060; MIPS64-N64-NEXT: fill.h $w0, $2
1061; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1062; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
1063; MIPS64-N64-NEXT: mtc1 $2, $f0
1064; MIPS64-N64-NEXT: mul.s $f0, $f0, $f0
1065; MIPS64-N64-NEXT: mfc1 $2, $f0
1066; MIPS64-N64-NEXT: fill.w $w0, $2
1067; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1068; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
1069; MIPS64-N64-NEXT: jr $ra
1070; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +00001071entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001072 %0 = load i16, i16* @g, align 2
1073 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1074
Simon Dardis40a50402016-11-21 20:34:10 +00001075
1076 %powi = call float @llvm.powi.f32(float %1, i32 2)
1077
Simon Dardis40a50402016-11-21 20:34:10 +00001078
1079 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)
1080
Simon Dardis40a50402016-11-21 20:34:10 +00001081
1082 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001083 ret void
1084}
1085
1086define void @fpowi_var(i32 %var) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001087; MIPS32-LABEL: fpowi_var:
1088; MIPS32: # %bb.0: # %entry
1089; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1090; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1091; MIPS32-NEXT: addiu $sp, $sp, -24
1092; MIPS32-NEXT: .cfi_def_cfa_offset 24
1093; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
1094; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
1095; MIPS32-NEXT: .cfi_offset 31, -4
1096; MIPS32-NEXT: .cfi_offset 16, -8
1097; MIPS32-NEXT: addu $gp, $2, $25
1098; MIPS32-NEXT: lw $16, %got(g)($gp)
1099; MIPS32-NEXT: lh $1, 0($16)
1100; MIPS32-NEXT: fill.h $w0, $1
1101; MIPS32-NEXT: fexupr.w $w0, $w0
1102; MIPS32-NEXT: copy_s.w $1, $w0[0]
1103; MIPS32-NEXT: mtc1 $1, $f12
1104; MIPS32-NEXT: lw $25, %call16(__powisf2)($gp)
1105; MIPS32-NEXT: jalr $25
1106; MIPS32-NEXT: move $5, $4
1107; MIPS32-NEXT: mfc1 $1, $f0
1108; MIPS32-NEXT: fill.w $w0, $1
1109; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1110; MIPS32-NEXT: copy_u.h $1, $w0[0]
1111; MIPS32-NEXT: sh $1, 0($16)
1112; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
1113; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
1114; MIPS32-NEXT: jr $ra
1115; MIPS32-NEXT: addiu $sp, $sp, 24
1116;
1117; MIPS64-N32-LABEL: fpowi_var:
1118; MIPS64-N32: # %bb.0: # %entry
1119; MIPS64-N32-NEXT: addiu $sp, $sp, -32
1120; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
1121; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1122; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1123; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1124; MIPS64-N32-NEXT: .cfi_offset 31, -8
1125; MIPS64-N32-NEXT: .cfi_offset 28, -16
1126; MIPS64-N32-NEXT: .cfi_offset 16, -24
1127; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi_var)))
1128; MIPS64-N32-NEXT: addu $1, $1, $25
1129; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fpowi_var)))
1130; MIPS64-N32-NEXT: sll $5, $4, 0
1131; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
1132; MIPS64-N32-NEXT: lh $1, 0($16)
1133; MIPS64-N32-NEXT: fill.h $w0, $1
1134; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1135; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
1136; MIPS64-N32-NEXT: lw $25, %call16(__powisf2)($gp)
1137; MIPS64-N32-NEXT: jalr $25
1138; MIPS64-N32-NEXT: mtc1 $1, $f12
1139; MIPS64-N32-NEXT: mfc1 $1, $f0
1140; MIPS64-N32-NEXT: fill.w $w0, $1
1141; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1142; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
1143; MIPS64-N32-NEXT: sh $1, 0($16)
1144; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1145; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1146; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1147; MIPS64-N32-NEXT: jr $ra
1148; MIPS64-N32-NEXT: addiu $sp, $sp, 32
1149;
1150; MIPS64-N64-LABEL: fpowi_var:
1151; MIPS64-N64: # %bb.0: # %entry
1152; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
1153; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
1154; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1155; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1156; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1157; MIPS64-N64-NEXT: .cfi_offset 31, -8
1158; MIPS64-N64-NEXT: .cfi_offset 28, -16
1159; MIPS64-N64-NEXT: .cfi_offset 16, -24
1160; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpowi_var)))
1161; MIPS64-N64-NEXT: daddu $1, $1, $25
1162; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fpowi_var)))
1163; MIPS64-N64-NEXT: sll $5, $4, 0
1164; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
1165; MIPS64-N64-NEXT: lh $1, 0($16)
1166; MIPS64-N64-NEXT: fill.h $w0, $1
1167; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1168; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
1169; MIPS64-N64-NEXT: ld $25, %call16(__powisf2)($gp)
1170; MIPS64-N64-NEXT: jalr $25
1171; MIPS64-N64-NEXT: mtc1 $1, $f12
1172; MIPS64-N64-NEXT: mfc1 $1, $f0
1173; MIPS64-N64-NEXT: fill.w $w0, $1
1174; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1175; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
1176; MIPS64-N64-NEXT: sh $1, 0($16)
1177; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1178; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1179; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1180; MIPS64-N64-NEXT: jr $ra
1181; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00001182entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001183 %0 = load i16, i16* @g, align 2
1184 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1185
Simon Dardis40a50402016-11-21 20:34:10 +00001186
1187 %powi = call float @llvm.powi.f32(float %1, i32 %var)
1188
Simon Dardis40a50402016-11-21 20:34:10 +00001189
1190 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)
1191
Simon Dardis40a50402016-11-21 20:34:10 +00001192
1193 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001194 ret void
1195}
1196
1197declare float @llvm.pow.f32(float %Val, float %power)
1198
1199define void @fpow(float %var) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001200; MIPS32-LABEL: fpow:
1201; MIPS32: # %bb.0: # %entry
1202; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1203; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1204; MIPS32-NEXT: addiu $sp, $sp, -24
1205; MIPS32-NEXT: .cfi_def_cfa_offset 24
1206; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
1207; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
1208; MIPS32-NEXT: .cfi_offset 31, -4
1209; MIPS32-NEXT: .cfi_offset 16, -8
1210; MIPS32-NEXT: addu $gp, $2, $25
1211; MIPS32-NEXT: mov.s $f14, $f12
1212; MIPS32-NEXT: lw $16, %got(g)($gp)
1213; MIPS32-NEXT: lh $1, 0($16)
1214; MIPS32-NEXT: fill.h $w0, $1
1215; MIPS32-NEXT: fexupr.w $w0, $w0
1216; MIPS32-NEXT: copy_s.w $1, $w0[0]
1217; MIPS32-NEXT: lw $25, %call16(powf)($gp)
1218; MIPS32-NEXT: jalr $25
1219; MIPS32-NEXT: mtc1 $1, $f12
1220; MIPS32-NEXT: mfc1 $1, $f0
1221; MIPS32-NEXT: fill.w $w0, $1
1222; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1223; MIPS32-NEXT: copy_u.h $1, $w0[0]
1224; MIPS32-NEXT: sh $1, 0($16)
1225; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
1226; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
1227; MIPS32-NEXT: jr $ra
1228; MIPS32-NEXT: addiu $sp, $sp, 24
1229;
1230; MIPS64-N32-LABEL: fpow:
1231; MIPS64-N32: # %bb.0: # %entry
1232; MIPS64-N32-NEXT: addiu $sp, $sp, -32
1233; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
1234; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1235; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1236; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1237; MIPS64-N32-NEXT: .cfi_offset 31, -8
1238; MIPS64-N32-NEXT: .cfi_offset 28, -16
1239; MIPS64-N32-NEXT: .cfi_offset 16, -24
1240; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fpow)))
1241; MIPS64-N32-NEXT: addu $1, $1, $25
1242; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fpow)))
1243; MIPS64-N32-NEXT: mov.s $f13, $f12
1244; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
1245; MIPS64-N32-NEXT: lh $1, 0($16)
1246; MIPS64-N32-NEXT: fill.h $w0, $1
1247; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1248; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
1249; MIPS64-N32-NEXT: lw $25, %call16(powf)($gp)
1250; MIPS64-N32-NEXT: jalr $25
1251; MIPS64-N32-NEXT: mtc1 $1, $f12
1252; MIPS64-N32-NEXT: mfc1 $1, $f0
1253; MIPS64-N32-NEXT: fill.w $w0, $1
1254; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1255; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
1256; MIPS64-N32-NEXT: sh $1, 0($16)
1257; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1258; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1259; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1260; MIPS64-N32-NEXT: jr $ra
1261; MIPS64-N32-NEXT: addiu $sp, $sp, 32
1262;
1263; MIPS64-N64-LABEL: fpow:
1264; MIPS64-N64: # %bb.0: # %entry
1265; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
1266; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
1267; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1268; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1269; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1270; MIPS64-N64-NEXT: .cfi_offset 31, -8
1271; MIPS64-N64-NEXT: .cfi_offset 28, -16
1272; MIPS64-N64-NEXT: .cfi_offset 16, -24
1273; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fpow)))
1274; MIPS64-N64-NEXT: daddu $1, $1, $25
1275; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fpow)))
1276; MIPS64-N64-NEXT: mov.s $f13, $f12
1277; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
1278; MIPS64-N64-NEXT: lh $1, 0($16)
1279; MIPS64-N64-NEXT: fill.h $w0, $1
1280; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1281; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
1282; MIPS64-N64-NEXT: ld $25, %call16(powf)($gp)
1283; MIPS64-N64-NEXT: jalr $25
1284; MIPS64-N64-NEXT: mtc1 $1, $f12
1285; MIPS64-N64-NEXT: mfc1 $1, $f0
1286; MIPS64-N64-NEXT: fill.w $w0, $1
1287; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1288; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
1289; MIPS64-N64-NEXT: sh $1, 0($16)
1290; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1291; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1292; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1293; MIPS64-N64-NEXT: jr $ra
1294; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00001295entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001296 %0 = load i16, i16* @g, align 2
1297 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1298
Simon Dardis40a50402016-11-21 20:34:10 +00001299
1300 %powi = call float @llvm.pow.f32(float %1, float %var)
1301
Simon Dardis40a50402016-11-21 20:34:10 +00001302
1303 %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)
1304
Simon Dardis40a50402016-11-21 20:34:10 +00001305
1306 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001307 ret void
1308}
1309
1310declare float @llvm.log2.f32(float %Val)
1311
1312define void @flog2() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001313; MIPS32-LABEL: flog2:
1314; MIPS32: # %bb.0: # %entry
1315; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1316; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1317; MIPS32-NEXT: addiu $sp, $sp, -24
1318; MIPS32-NEXT: .cfi_def_cfa_offset 24
1319; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
1320; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
1321; MIPS32-NEXT: .cfi_offset 31, -4
1322; MIPS32-NEXT: .cfi_offset 16, -8
1323; MIPS32-NEXT: addu $gp, $2, $25
1324; MIPS32-NEXT: lw $16, %got(g)($gp)
1325; MIPS32-NEXT: lh $1, 0($16)
1326; MIPS32-NEXT: fill.h $w0, $1
1327; MIPS32-NEXT: fexupr.w $w0, $w0
1328; MIPS32-NEXT: copy_s.w $1, $w0[0]
1329; MIPS32-NEXT: lw $25, %call16(log2f)($gp)
1330; MIPS32-NEXT: jalr $25
1331; MIPS32-NEXT: mtc1 $1, $f12
1332; MIPS32-NEXT: mfc1 $1, $f0
1333; MIPS32-NEXT: fill.w $w0, $1
1334; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1335; MIPS32-NEXT: copy_u.h $1, $w0[0]
1336; MIPS32-NEXT: sh $1, 0($16)
1337; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
1338; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
1339; MIPS32-NEXT: jr $ra
1340; MIPS32-NEXT: addiu $sp, $sp, 24
1341;
1342; MIPS64-N32-LABEL: flog2:
1343; MIPS64-N32: # %bb.0: # %entry
1344; MIPS64-N32-NEXT: addiu $sp, $sp, -32
1345; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
1346; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1347; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1348; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1349; MIPS64-N32-NEXT: .cfi_offset 31, -8
1350; MIPS64-N32-NEXT: .cfi_offset 28, -16
1351; MIPS64-N32-NEXT: .cfi_offset 16, -24
1352; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(flog2)))
1353; MIPS64-N32-NEXT: addu $1, $1, $25
1354; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(flog2)))
1355; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
1356; MIPS64-N32-NEXT: lh $1, 0($16)
1357; MIPS64-N32-NEXT: fill.h $w0, $1
1358; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1359; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
1360; MIPS64-N32-NEXT: lw $25, %call16(log2f)($gp)
1361; MIPS64-N32-NEXT: jalr $25
1362; MIPS64-N32-NEXT: mtc1 $1, $f12
1363; MIPS64-N32-NEXT: mfc1 $1, $f0
1364; MIPS64-N32-NEXT: fill.w $w0, $1
1365; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1366; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
1367; MIPS64-N32-NEXT: sh $1, 0($16)
1368; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1369; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1370; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1371; MIPS64-N32-NEXT: jr $ra
1372; MIPS64-N32-NEXT: addiu $sp, $sp, 32
1373;
1374; MIPS64-N64-LABEL: flog2:
1375; MIPS64-N64: # %bb.0: # %entry
1376; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
1377; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
1378; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1379; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1380; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1381; MIPS64-N64-NEXT: .cfi_offset 31, -8
1382; MIPS64-N64-NEXT: .cfi_offset 28, -16
1383; MIPS64-N64-NEXT: .cfi_offset 16, -24
1384; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(flog2)))
1385; MIPS64-N64-NEXT: daddu $1, $1, $25
1386; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(flog2)))
1387; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
1388; MIPS64-N64-NEXT: lh $1, 0($16)
1389; MIPS64-N64-NEXT: fill.h $w0, $1
1390; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1391; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
1392; MIPS64-N64-NEXT: ld $25, %call16(log2f)($gp)
1393; MIPS64-N64-NEXT: jalr $25
1394; MIPS64-N64-NEXT: mtc1 $1, $f12
1395; MIPS64-N64-NEXT: mfc1 $1, $f0
1396; MIPS64-N64-NEXT: fill.w $w0, $1
1397; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1398; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
1399; MIPS64-N64-NEXT: sh $1, 0($16)
1400; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1401; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1402; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1403; MIPS64-N64-NEXT: jr $ra
1404; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00001405entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001406 %0 = load i16, i16* @g, align 2
1407 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1408
Simon Dardis40a50402016-11-21 20:34:10 +00001409
1410 %log2 = call float @llvm.log2.f32(float %1)
1411 %2 = call i16 @llvm.convert.to.fp16.f32(float %log2)
1412
Simon Dardis40a50402016-11-21 20:34:10 +00001413
1414 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001415
1416 ret void
1417}
1418
1419declare float @llvm.log10.f32(float %Val)
1420
1421define void @flog10() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001422; MIPS32-LABEL: flog10:
1423; MIPS32: # %bb.0: # %entry
1424; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1425; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1426; MIPS32-NEXT: addiu $sp, $sp, -24
1427; MIPS32-NEXT: .cfi_def_cfa_offset 24
1428; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
1429; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
1430; MIPS32-NEXT: .cfi_offset 31, -4
1431; MIPS32-NEXT: .cfi_offset 16, -8
1432; MIPS32-NEXT: addu $gp, $2, $25
1433; MIPS32-NEXT: lw $16, %got(g)($gp)
1434; MIPS32-NEXT: lh $1, 0($16)
1435; MIPS32-NEXT: fill.h $w0, $1
1436; MIPS32-NEXT: fexupr.w $w0, $w0
1437; MIPS32-NEXT: copy_s.w $1, $w0[0]
1438; MIPS32-NEXT: lw $25, %call16(log10f)($gp)
1439; MIPS32-NEXT: jalr $25
1440; MIPS32-NEXT: mtc1 $1, $f12
1441; MIPS32-NEXT: mfc1 $1, $f0
1442; MIPS32-NEXT: fill.w $w0, $1
1443; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1444; MIPS32-NEXT: copy_u.h $1, $w0[0]
1445; MIPS32-NEXT: sh $1, 0($16)
1446; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
1447; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
1448; MIPS32-NEXT: jr $ra
1449; MIPS32-NEXT: addiu $sp, $sp, 24
1450;
1451; MIPS64-N32-LABEL: flog10:
1452; MIPS64-N32: # %bb.0: # %entry
1453; MIPS64-N32-NEXT: addiu $sp, $sp, -32
1454; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
1455; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1456; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1457; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1458; MIPS64-N32-NEXT: .cfi_offset 31, -8
1459; MIPS64-N32-NEXT: .cfi_offset 28, -16
1460; MIPS64-N32-NEXT: .cfi_offset 16, -24
1461; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(flog10)))
1462; MIPS64-N32-NEXT: addu $1, $1, $25
1463; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(flog10)))
1464; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
1465; MIPS64-N32-NEXT: lh $1, 0($16)
1466; MIPS64-N32-NEXT: fill.h $w0, $1
1467; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1468; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
1469; MIPS64-N32-NEXT: lw $25, %call16(log10f)($gp)
1470; MIPS64-N32-NEXT: jalr $25
1471; MIPS64-N32-NEXT: mtc1 $1, $f12
1472; MIPS64-N32-NEXT: mfc1 $1, $f0
1473; MIPS64-N32-NEXT: fill.w $w0, $1
1474; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1475; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
1476; MIPS64-N32-NEXT: sh $1, 0($16)
1477; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1478; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1479; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1480; MIPS64-N32-NEXT: jr $ra
1481; MIPS64-N32-NEXT: addiu $sp, $sp, 32
1482;
1483; MIPS64-N64-LABEL: flog10:
1484; MIPS64-N64: # %bb.0: # %entry
1485; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
1486; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
1487; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1488; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1489; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1490; MIPS64-N64-NEXT: .cfi_offset 31, -8
1491; MIPS64-N64-NEXT: .cfi_offset 28, -16
1492; MIPS64-N64-NEXT: .cfi_offset 16, -24
1493; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(flog10)))
1494; MIPS64-N64-NEXT: daddu $1, $1, $25
1495; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(flog10)))
1496; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
1497; MIPS64-N64-NEXT: lh $1, 0($16)
1498; MIPS64-N64-NEXT: fill.h $w0, $1
1499; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1500; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
1501; MIPS64-N64-NEXT: ld $25, %call16(log10f)($gp)
1502; MIPS64-N64-NEXT: jalr $25
1503; MIPS64-N64-NEXT: mtc1 $1, $f12
1504; MIPS64-N64-NEXT: mfc1 $1, $f0
1505; MIPS64-N64-NEXT: fill.w $w0, $1
1506; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1507; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
1508; MIPS64-N64-NEXT: sh $1, 0($16)
1509; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1510; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1511; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1512; MIPS64-N64-NEXT: jr $ra
1513; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00001514entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001515 %0 = load i16, i16* @g, align 2
1516 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1517
Simon Dardis40a50402016-11-21 20:34:10 +00001518
1519 %log10 = call float @llvm.log10.f32(float %1)
1520 %2 = call i16 @llvm.convert.to.fp16.f32(float %log10)
1521
Simon Dardis40a50402016-11-21 20:34:10 +00001522
1523 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001524
1525 ret void
1526}
1527
1528declare float @llvm.sqrt.f32(float %Val)
1529
1530define void @fsqrt() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001531; MIPS32-LABEL: fsqrt:
1532; MIPS32: # %bb.0: # %entry
1533; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1534; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1535; MIPS32-NEXT: addu $1, $2, $25
1536; MIPS32-NEXT: lw $1, %got(g)($1)
1537; MIPS32-NEXT: lh $2, 0($1)
1538; MIPS32-NEXT: fill.h $w0, $2
1539; MIPS32-NEXT: fexupr.w $w0, $w0
1540; MIPS32-NEXT: copy_s.w $2, $w0[0]
1541; MIPS32-NEXT: mtc1 $2, $f0
1542; MIPS32-NEXT: sqrt.s $f0, $f0
1543; MIPS32-NEXT: mfc1 $2, $f0
1544; MIPS32-NEXT: fill.w $w0, $2
1545; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1546; MIPS32-NEXT: copy_u.h $2, $w0[0]
1547; MIPS32-NEXT: jr $ra
1548; MIPS32-NEXT: sh $2, 0($1)
1549;
1550; MIPS64-N32-LABEL: fsqrt:
1551; MIPS64-N32: # %bb.0: # %entry
1552; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsqrt)))
1553; MIPS64-N32-NEXT: addu $1, $1, $25
1554; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fsqrt)))
1555; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)
1556; MIPS64-N32-NEXT: lh $2, 0($1)
1557; MIPS64-N32-NEXT: fill.h $w0, $2
1558; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1559; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
1560; MIPS64-N32-NEXT: mtc1 $2, $f0
1561; MIPS64-N32-NEXT: sqrt.s $f0, $f0
1562; MIPS64-N32-NEXT: mfc1 $2, $f0
1563; MIPS64-N32-NEXT: fill.w $w0, $2
1564; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1565; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
1566; MIPS64-N32-NEXT: jr $ra
1567; MIPS64-N32-NEXT: sh $2, 0($1)
1568;
1569; MIPS64-N64-LABEL: fsqrt:
1570; MIPS64-N64: # %bb.0: # %entry
1571; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsqrt)))
1572; MIPS64-N64-NEXT: daddu $1, $1, $25
1573; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fsqrt)))
1574; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)
1575; MIPS64-N64-NEXT: lh $2, 0($1)
1576; MIPS64-N64-NEXT: fill.h $w0, $2
1577; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1578; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
1579; MIPS64-N64-NEXT: mtc1 $2, $f0
1580; MIPS64-N64-NEXT: sqrt.s $f0, $f0
1581; MIPS64-N64-NEXT: mfc1 $2, $f0
1582; MIPS64-N64-NEXT: fill.w $w0, $2
1583; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1584; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
1585; MIPS64-N64-NEXT: jr $ra
1586; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +00001587entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001588 %0 = load i16, i16* @g, align 2
1589 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1590
Simon Dardis40a50402016-11-21 20:34:10 +00001591
1592 %sqrt = call float @llvm.sqrt.f32(float %1)
1593 %2 = call i16 @llvm.convert.to.fp16.f32(float %sqrt)
1594
Simon Dardis40a50402016-11-21 20:34:10 +00001595
1596 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001597
1598 ret void
1599}
1600
1601declare float @llvm.sin.f32(float %Val)
1602
1603define void @fsin() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001604; MIPS32-LABEL: fsin:
1605; MIPS32: # %bb.0: # %entry
1606; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1607; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1608; MIPS32-NEXT: addiu $sp, $sp, -24
1609; MIPS32-NEXT: .cfi_def_cfa_offset 24
1610; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
1611; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
1612; MIPS32-NEXT: .cfi_offset 31, -4
1613; MIPS32-NEXT: .cfi_offset 16, -8
1614; MIPS32-NEXT: addu $gp, $2, $25
1615; MIPS32-NEXT: lw $16, %got(g)($gp)
1616; MIPS32-NEXT: lh $1, 0($16)
1617; MIPS32-NEXT: fill.h $w0, $1
1618; MIPS32-NEXT: fexupr.w $w0, $w0
1619; MIPS32-NEXT: copy_s.w $1, $w0[0]
1620; MIPS32-NEXT: lw $25, %call16(sinf)($gp)
1621; MIPS32-NEXT: jalr $25
1622; MIPS32-NEXT: mtc1 $1, $f12
1623; MIPS32-NEXT: mfc1 $1, $f0
1624; MIPS32-NEXT: fill.w $w0, $1
1625; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1626; MIPS32-NEXT: copy_u.h $1, $w0[0]
1627; MIPS32-NEXT: sh $1, 0($16)
1628; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
1629; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
1630; MIPS32-NEXT: jr $ra
1631; MIPS32-NEXT: addiu $sp, $sp, 24
1632;
1633; MIPS64-N32-LABEL: fsin:
1634; MIPS64-N32: # %bb.0: # %entry
1635; MIPS64-N32-NEXT: addiu $sp, $sp, -32
1636; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
1637; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1638; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1639; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1640; MIPS64-N32-NEXT: .cfi_offset 31, -8
1641; MIPS64-N32-NEXT: .cfi_offset 28, -16
1642; MIPS64-N32-NEXT: .cfi_offset 16, -24
1643; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fsin)))
1644; MIPS64-N32-NEXT: addu $1, $1, $25
1645; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fsin)))
1646; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
1647; MIPS64-N32-NEXT: lh $1, 0($16)
1648; MIPS64-N32-NEXT: fill.h $w0, $1
1649; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1650; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
1651; MIPS64-N32-NEXT: lw $25, %call16(sinf)($gp)
1652; MIPS64-N32-NEXT: jalr $25
1653; MIPS64-N32-NEXT: mtc1 $1, $f12
1654; MIPS64-N32-NEXT: mfc1 $1, $f0
1655; MIPS64-N32-NEXT: fill.w $w0, $1
1656; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1657; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
1658; MIPS64-N32-NEXT: sh $1, 0($16)
1659; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1660; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1661; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1662; MIPS64-N32-NEXT: jr $ra
1663; MIPS64-N32-NEXT: addiu $sp, $sp, 32
1664;
1665; MIPS64-N64-LABEL: fsin:
1666; MIPS64-N64: # %bb.0: # %entry
1667; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
1668; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
1669; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1670; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1671; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1672; MIPS64-N64-NEXT: .cfi_offset 31, -8
1673; MIPS64-N64-NEXT: .cfi_offset 28, -16
1674; MIPS64-N64-NEXT: .cfi_offset 16, -24
1675; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fsin)))
1676; MIPS64-N64-NEXT: daddu $1, $1, $25
1677; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fsin)))
1678; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
1679; MIPS64-N64-NEXT: lh $1, 0($16)
1680; MIPS64-N64-NEXT: fill.h $w0, $1
1681; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1682; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
1683; MIPS64-N64-NEXT: ld $25, %call16(sinf)($gp)
1684; MIPS64-N64-NEXT: jalr $25
1685; MIPS64-N64-NEXT: mtc1 $1, $f12
1686; MIPS64-N64-NEXT: mfc1 $1, $f0
1687; MIPS64-N64-NEXT: fill.w $w0, $1
1688; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1689; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
1690; MIPS64-N64-NEXT: sh $1, 0($16)
1691; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1692; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1693; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1694; MIPS64-N64-NEXT: jr $ra
1695; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00001696entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001697 %0 = load i16, i16* @g, align 2
1698 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1699
Simon Dardis40a50402016-11-21 20:34:10 +00001700
1701 %sin = call float @llvm.sin.f32(float %1)
1702 %2 = call i16 @llvm.convert.to.fp16.f32(float %sin)
1703
Simon Dardis40a50402016-11-21 20:34:10 +00001704
1705 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001706
1707 ret void
1708}
1709
1710declare float @llvm.cos.f32(float %Val)
1711
1712define void @fcos() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001713; MIPS32-LABEL: fcos:
1714; MIPS32: # %bb.0: # %entry
1715; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1716; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1717; MIPS32-NEXT: addiu $sp, $sp, -24
1718; MIPS32-NEXT: .cfi_def_cfa_offset 24
1719; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
1720; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
1721; MIPS32-NEXT: .cfi_offset 31, -4
1722; MIPS32-NEXT: .cfi_offset 16, -8
1723; MIPS32-NEXT: addu $gp, $2, $25
1724; MIPS32-NEXT: lw $16, %got(g)($gp)
1725; MIPS32-NEXT: lh $1, 0($16)
1726; MIPS32-NEXT: fill.h $w0, $1
1727; MIPS32-NEXT: fexupr.w $w0, $w0
1728; MIPS32-NEXT: copy_s.w $1, $w0[0]
1729; MIPS32-NEXT: lw $25, %call16(cosf)($gp)
1730; MIPS32-NEXT: jalr $25
1731; MIPS32-NEXT: mtc1 $1, $f12
1732; MIPS32-NEXT: mfc1 $1, $f0
1733; MIPS32-NEXT: fill.w $w0, $1
1734; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1735; MIPS32-NEXT: copy_u.h $1, $w0[0]
1736; MIPS32-NEXT: sh $1, 0($16)
1737; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
1738; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
1739; MIPS32-NEXT: jr $ra
1740; MIPS32-NEXT: addiu $sp, $sp, 24
1741;
1742; MIPS64-N32-LABEL: fcos:
1743; MIPS64-N32: # %bb.0: # %entry
1744; MIPS64-N32-NEXT: addiu $sp, $sp, -32
1745; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
1746; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1747; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1748; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1749; MIPS64-N32-NEXT: .cfi_offset 31, -8
1750; MIPS64-N32-NEXT: .cfi_offset 28, -16
1751; MIPS64-N32-NEXT: .cfi_offset 16, -24
1752; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcos)))
1753; MIPS64-N32-NEXT: addu $1, $1, $25
1754; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fcos)))
1755; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
1756; MIPS64-N32-NEXT: lh $1, 0($16)
1757; MIPS64-N32-NEXT: fill.h $w0, $1
1758; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1759; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
1760; MIPS64-N32-NEXT: lw $25, %call16(cosf)($gp)
1761; MIPS64-N32-NEXT: jalr $25
1762; MIPS64-N32-NEXT: mtc1 $1, $f12
1763; MIPS64-N32-NEXT: mfc1 $1, $f0
1764; MIPS64-N32-NEXT: fill.w $w0, $1
1765; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1766; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
1767; MIPS64-N32-NEXT: sh $1, 0($16)
1768; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1769; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1770; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1771; MIPS64-N32-NEXT: jr $ra
1772; MIPS64-N32-NEXT: addiu $sp, $sp, 32
1773;
1774; MIPS64-N64-LABEL: fcos:
1775; MIPS64-N64: # %bb.0: # %entry
1776; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
1777; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
1778; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1779; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1780; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1781; MIPS64-N64-NEXT: .cfi_offset 31, -8
1782; MIPS64-N64-NEXT: .cfi_offset 28, -16
1783; MIPS64-N64-NEXT: .cfi_offset 16, -24
1784; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcos)))
1785; MIPS64-N64-NEXT: daddu $1, $1, $25
1786; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fcos)))
1787; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
1788; MIPS64-N64-NEXT: lh $1, 0($16)
1789; MIPS64-N64-NEXT: fill.h $w0, $1
1790; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1791; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
1792; MIPS64-N64-NEXT: ld $25, %call16(cosf)($gp)
1793; MIPS64-N64-NEXT: jalr $25
1794; MIPS64-N64-NEXT: mtc1 $1, $f12
1795; MIPS64-N64-NEXT: mfc1 $1, $f0
1796; MIPS64-N64-NEXT: fill.w $w0, $1
1797; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1798; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
1799; MIPS64-N64-NEXT: sh $1, 0($16)
1800; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1801; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1802; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1803; MIPS64-N64-NEXT: jr $ra
1804; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00001805entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001806 %0 = load i16, i16* @g, align 2
1807 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1808
Simon Dardis40a50402016-11-21 20:34:10 +00001809
1810 %cos = call float @llvm.cos.f32(float %1)
1811 %2 = call i16 @llvm.convert.to.fp16.f32(float %cos)
1812
Simon Dardis40a50402016-11-21 20:34:10 +00001813
1814 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001815
1816 ret void
1817}
1818
1819declare float @llvm.exp.f32(float %Val)
1820
1821define void @fexp() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001822; MIPS32-LABEL: fexp:
1823; MIPS32: # %bb.0: # %entry
1824; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1825; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1826; MIPS32-NEXT: addiu $sp, $sp, -24
1827; MIPS32-NEXT: .cfi_def_cfa_offset 24
1828; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
1829; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
1830; MIPS32-NEXT: .cfi_offset 31, -4
1831; MIPS32-NEXT: .cfi_offset 16, -8
1832; MIPS32-NEXT: addu $gp, $2, $25
1833; MIPS32-NEXT: lw $16, %got(g)($gp)
1834; MIPS32-NEXT: lh $1, 0($16)
1835; MIPS32-NEXT: fill.h $w0, $1
1836; MIPS32-NEXT: fexupr.w $w0, $w0
1837; MIPS32-NEXT: copy_s.w $1, $w0[0]
1838; MIPS32-NEXT: lw $25, %call16(expf)($gp)
1839; MIPS32-NEXT: jalr $25
1840; MIPS32-NEXT: mtc1 $1, $f12
1841; MIPS32-NEXT: mfc1 $1, $f0
1842; MIPS32-NEXT: fill.w $w0, $1
1843; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1844; MIPS32-NEXT: copy_u.h $1, $w0[0]
1845; MIPS32-NEXT: sh $1, 0($16)
1846; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
1847; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
1848; MIPS32-NEXT: jr $ra
1849; MIPS32-NEXT: addiu $sp, $sp, 24
1850;
1851; MIPS64-N32-LABEL: fexp:
1852; MIPS64-N32: # %bb.0: # %entry
1853; MIPS64-N32-NEXT: addiu $sp, $sp, -32
1854; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
1855; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1856; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1857; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1858; MIPS64-N32-NEXT: .cfi_offset 31, -8
1859; MIPS64-N32-NEXT: .cfi_offset 28, -16
1860; MIPS64-N32-NEXT: .cfi_offset 16, -24
1861; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fexp)))
1862; MIPS64-N32-NEXT: addu $1, $1, $25
1863; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fexp)))
1864; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
1865; MIPS64-N32-NEXT: lh $1, 0($16)
1866; MIPS64-N32-NEXT: fill.h $w0, $1
1867; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1868; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
1869; MIPS64-N32-NEXT: lw $25, %call16(expf)($gp)
1870; MIPS64-N32-NEXT: jalr $25
1871; MIPS64-N32-NEXT: mtc1 $1, $f12
1872; MIPS64-N32-NEXT: mfc1 $1, $f0
1873; MIPS64-N32-NEXT: fill.w $w0, $1
1874; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1875; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
1876; MIPS64-N32-NEXT: sh $1, 0($16)
1877; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1878; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1879; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1880; MIPS64-N32-NEXT: jr $ra
1881; MIPS64-N32-NEXT: addiu $sp, $sp, 32
1882;
1883; MIPS64-N64-LABEL: fexp:
1884; MIPS64-N64: # %bb.0: # %entry
1885; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
1886; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
1887; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1888; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1889; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1890; MIPS64-N64-NEXT: .cfi_offset 31, -8
1891; MIPS64-N64-NEXT: .cfi_offset 28, -16
1892; MIPS64-N64-NEXT: .cfi_offset 16, -24
1893; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fexp)))
1894; MIPS64-N64-NEXT: daddu $1, $1, $25
1895; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fexp)))
1896; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
1897; MIPS64-N64-NEXT: lh $1, 0($16)
1898; MIPS64-N64-NEXT: fill.h $w0, $1
1899; MIPS64-N64-NEXT: fexupr.w $w0, $w0
1900; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
1901; MIPS64-N64-NEXT: ld $25, %call16(expf)($gp)
1902; MIPS64-N64-NEXT: jalr $25
1903; MIPS64-N64-NEXT: mtc1 $1, $f12
1904; MIPS64-N64-NEXT: mfc1 $1, $f0
1905; MIPS64-N64-NEXT: fill.w $w0, $1
1906; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
1907; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
1908; MIPS64-N64-NEXT: sh $1, 0($16)
1909; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1910; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1911; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1912; MIPS64-N64-NEXT: jr $ra
1913; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00001914entry:
Simon Dardis40a50402016-11-21 20:34:10 +00001915 %0 = load i16, i16* @g, align 2
1916 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
Simon Dardis40a50402016-11-21 20:34:10 +00001917
1918 %exp = call float @llvm.exp.f32(float %1)
1919 %2 = call i16 @llvm.convert.to.fp16.f32(float %exp)
1920
Simon Dardis40a50402016-11-21 20:34:10 +00001921
1922 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00001923
1924 ret void
1925}
1926
1927declare float @llvm.exp2.f32(float %Val)
1928
1929define void @fexp2() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00001930; MIPS32-LABEL: fexp2:
1931; MIPS32: # %bb.0: # %entry
1932; MIPS32-NEXT: lui $2, %hi(_gp_disp)
1933; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
1934; MIPS32-NEXT: addiu $sp, $sp, -24
1935; MIPS32-NEXT: .cfi_def_cfa_offset 24
1936; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
1937; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
1938; MIPS32-NEXT: .cfi_offset 31, -4
1939; MIPS32-NEXT: .cfi_offset 16, -8
1940; MIPS32-NEXT: addu $gp, $2, $25
1941; MIPS32-NEXT: lw $16, %got(g)($gp)
1942; MIPS32-NEXT: lh $1, 0($16)
1943; MIPS32-NEXT: fill.h $w0, $1
1944; MIPS32-NEXT: fexupr.w $w0, $w0
1945; MIPS32-NEXT: copy_s.w $1, $w0[0]
1946; MIPS32-NEXT: lw $25, %call16(exp2f)($gp)
1947; MIPS32-NEXT: jalr $25
1948; MIPS32-NEXT: mtc1 $1, $f12
1949; MIPS32-NEXT: mfc1 $1, $f0
1950; MIPS32-NEXT: fill.w $w0, $1
1951; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
1952; MIPS32-NEXT: copy_u.h $1, $w0[0]
1953; MIPS32-NEXT: sh $1, 0($16)
1954; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
1955; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
1956; MIPS32-NEXT: jr $ra
1957; MIPS32-NEXT: addiu $sp, $sp, 24
1958;
1959; MIPS64-N32-LABEL: fexp2:
1960; MIPS64-N32: # %bb.0: # %entry
1961; MIPS64-N32-NEXT: addiu $sp, $sp, -32
1962; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
1963; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1964; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1965; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1966; MIPS64-N32-NEXT: .cfi_offset 31, -8
1967; MIPS64-N32-NEXT: .cfi_offset 28, -16
1968; MIPS64-N32-NEXT: .cfi_offset 16, -24
1969; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fexp2)))
1970; MIPS64-N32-NEXT: addu $1, $1, $25
1971; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fexp2)))
1972; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
1973; MIPS64-N32-NEXT: lh $1, 0($16)
1974; MIPS64-N32-NEXT: fill.h $w0, $1
1975; MIPS64-N32-NEXT: fexupr.w $w0, $w0
1976; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
1977; MIPS64-N32-NEXT: lw $25, %call16(exp2f)($gp)
1978; MIPS64-N32-NEXT: jalr $25
1979; MIPS64-N32-NEXT: mtc1 $1, $f12
1980; MIPS64-N32-NEXT: mfc1 $1, $f0
1981; MIPS64-N32-NEXT: fill.w $w0, $1
1982; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
1983; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
1984; MIPS64-N32-NEXT: sh $1, 0($16)
1985; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
1986; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
1987; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
1988; MIPS64-N32-NEXT: jr $ra
1989; MIPS64-N32-NEXT: addiu $sp, $sp, 32
1990;
1991; MIPS64-N64-LABEL: fexp2:
1992; MIPS64-N64: # %bb.0: # %entry
1993; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
1994; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
1995; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
1996; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
1997; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
1998; MIPS64-N64-NEXT: .cfi_offset 31, -8
1999; MIPS64-N64-NEXT: .cfi_offset 28, -16
2000; MIPS64-N64-NEXT: .cfi_offset 16, -24
2001; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fexp2)))
2002; MIPS64-N64-NEXT: daddu $1, $1, $25
2003; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fexp2)))
2004; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
2005; MIPS64-N64-NEXT: lh $1, 0($16)
2006; MIPS64-N64-NEXT: fill.h $w0, $1
2007; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2008; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
2009; MIPS64-N64-NEXT: ld $25, %call16(exp2f)($gp)
2010; MIPS64-N64-NEXT: jalr $25
2011; MIPS64-N64-NEXT: mtc1 $1, $f12
2012; MIPS64-N64-NEXT: mfc1 $1, $f0
2013; MIPS64-N64-NEXT: fill.w $w0, $1
2014; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2015; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
2016; MIPS64-N64-NEXT: sh $1, 0($16)
2017; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2018; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2019; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2020; MIPS64-N64-NEXT: jr $ra
2021; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00002022entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002023 %0 = load i16, i16* @g, align 2
2024 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2025
Simon Dardis40a50402016-11-21 20:34:10 +00002026
2027 %exp2 = call float @llvm.exp2.f32(float %1)
2028 %2 = call i16 @llvm.convert.to.fp16.f32(float %exp2)
2029
Simon Dardis40a50402016-11-21 20:34:10 +00002030
2031 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002032
2033 ret void
2034}
2035
2036declare float @llvm.fma.f32(float, float, float)
2037
2038define void @ffma(float %b, float %c) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002039; MIPS32-LABEL: ffma:
2040; MIPS32: # %bb.0: # %entry
2041; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2042; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2043; MIPS32-NEXT: addiu $sp, $sp, -24
2044; MIPS32-NEXT: .cfi_def_cfa_offset 24
2045; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
2046; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
2047; MIPS32-NEXT: .cfi_offset 31, -4
2048; MIPS32-NEXT: .cfi_offset 16, -8
2049; MIPS32-NEXT: addu $gp, $2, $25
2050; MIPS32-NEXT: mov.s $f0, $f12
2051; MIPS32-NEXT: mfc1 $6, $f14
2052; MIPS32-NEXT: lw $16, %got(g)($gp)
2053; MIPS32-NEXT: lh $1, 0($16)
2054; MIPS32-NEXT: fill.h $w1, $1
2055; MIPS32-NEXT: fexupr.w $w1, $w1
2056; MIPS32-NEXT: copy_s.w $1, $w1[0]
2057; MIPS32-NEXT: mtc1 $1, $f12
2058; MIPS32-NEXT: lw $25, %call16(fmaf)($gp)
2059; MIPS32-NEXT: jalr $25
2060; MIPS32-NEXT: mov.s $f14, $f0
2061; MIPS32-NEXT: mfc1 $1, $f0
2062; MIPS32-NEXT: fill.w $w0, $1
2063; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
2064; MIPS32-NEXT: copy_u.h $1, $w0[0]
2065; MIPS32-NEXT: sh $1, 0($16)
2066; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
2067; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
2068; MIPS32-NEXT: jr $ra
2069; MIPS32-NEXT: addiu $sp, $sp, 24
2070;
2071; MIPS64-N32-LABEL: ffma:
2072; MIPS64-N32: # %bb.0: # %entry
2073; MIPS64-N32-NEXT: addiu $sp, $sp, -32
2074; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
2075; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2076; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2077; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2078; MIPS64-N32-NEXT: .cfi_offset 31, -8
2079; MIPS64-N32-NEXT: .cfi_offset 28, -16
2080; MIPS64-N32-NEXT: .cfi_offset 16, -24
2081; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffma)))
2082; MIPS64-N32-NEXT: addu $1, $1, $25
2083; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ffma)))
2084; MIPS64-N32-NEXT: mov.s $f14, $f13
2085; MIPS64-N32-NEXT: mov.s $f13, $f12
2086; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
2087; MIPS64-N32-NEXT: lh $1, 0($16)
2088; MIPS64-N32-NEXT: fill.h $w0, $1
2089; MIPS64-N32-NEXT: fexupr.w $w0, $w0
2090; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
2091; MIPS64-N32-NEXT: lw $25, %call16(fmaf)($gp)
2092; MIPS64-N32-NEXT: jalr $25
2093; MIPS64-N32-NEXT: mtc1 $1, $f12
2094; MIPS64-N32-NEXT: mfc1 $1, $f0
2095; MIPS64-N32-NEXT: fill.w $w0, $1
2096; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
2097; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
2098; MIPS64-N32-NEXT: sh $1, 0($16)
2099; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2100; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2101; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2102; MIPS64-N32-NEXT: jr $ra
2103; MIPS64-N32-NEXT: addiu $sp, $sp, 32
2104;
2105; MIPS64-N64-LABEL: ffma:
2106; MIPS64-N64: # %bb.0: # %entry
2107; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
2108; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
2109; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2110; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2111; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2112; MIPS64-N64-NEXT: .cfi_offset 31, -8
2113; MIPS64-N64-NEXT: .cfi_offset 28, -16
2114; MIPS64-N64-NEXT: .cfi_offset 16, -24
2115; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffma)))
2116; MIPS64-N64-NEXT: daddu $1, $1, $25
2117; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ffma)))
2118; MIPS64-N64-NEXT: mov.s $f14, $f13
2119; MIPS64-N64-NEXT: mov.s $f13, $f12
2120; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
2121; MIPS64-N64-NEXT: lh $1, 0($16)
2122; MIPS64-N64-NEXT: fill.h $w0, $1
2123; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2124; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
2125; MIPS64-N64-NEXT: ld $25, %call16(fmaf)($gp)
2126; MIPS64-N64-NEXT: jalr $25
2127; MIPS64-N64-NEXT: mtc1 $1, $f12
2128; MIPS64-N64-NEXT: mfc1 $1, $f0
2129; MIPS64-N64-NEXT: fill.w $w0, $1
2130; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2131; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
2132; MIPS64-N64-NEXT: sh $1, 0($16)
2133; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2134; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2135; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2136; MIPS64-N64-NEXT: jr $ra
2137; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00002138entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002139 %0 = load i16, i16* @g, align 2
2140 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2141
Simon Dardis40a50402016-11-21 20:34:10 +00002142
2143 %fma = call float @llvm.fma.f32(float %1, float %b, float %c)
2144 %2 = call i16 @llvm.convert.to.fp16.f32(float %fma)
2145
Simon Dardis40a50402016-11-21 20:34:10 +00002146
2147 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002148
2149 ret void
2150}
2151
2152; FIXME: For MIPSR6, this should produced the maddf.s instruction. MIPSR5 cannot
2153; fuse the operation such that the intermediate result is not rounded.
2154
2155declare float @llvm.fmuladd.f32(float, float, float)
2156
2157define void @ffmuladd(float %b, float %c) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002158; MIPS32-O32-LABEL: ffmuladd:
2159; MIPS32-O32: # %bb.0: # %entry
2160; MIPS32-O32-NEXT: lui $2, %hi(_gp_disp)
2161; MIPS32-O32-NEXT: addiu $2, $2, %lo(_gp_disp)
2162; MIPS32-O32-NEXT: addu $1, $2, $25
2163; MIPS32-O32-NEXT: lw $1, %got(g)($1)
2164; MIPS32-O32-NEXT: lh $2, 0($1)
2165; MIPS32-O32-NEXT: fill.h $w0, $2
2166; MIPS32-O32-NEXT: fexupr.w $w0, $w0
2167; MIPS32-O32-NEXT: copy_s.w $2, $w0[0]
2168; MIPS32-O32-NEXT: mtc1 $2, $f0
2169; MIPS32-O32-NEXT: madd.s $f0, $f14, $f0, $f12
2170; MIPS32-O32-NEXT: mfc1 $2, $f0
2171; MIPS32-O32-NEXT: fill.w $w0, $2
2172; MIPS32-O32-NEXT: fexdo.h $w0, $w0, $w0
2173; MIPS32-O32-NEXT: copy_u.h $2, $w0[0]
2174; MIPS32-O32-NEXT: jr $ra
2175; MIPS32-O32-NEXT: sh $2, 0($1)
2176;
2177; MIPS64R5-N32-LABEL: ffmuladd:
2178; MIPS64R5-N32: # %bb.0: # %entry
2179; MIPS64R5-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd)))
2180; MIPS64R5-N32-NEXT: addu $1, $1, $25
2181; MIPS64R5-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))
2182; MIPS64R5-N32-NEXT: lw $1, %got_disp(g)($1)
2183; MIPS64R5-N32-NEXT: lh $2, 0($1)
2184; MIPS64R5-N32-NEXT: fill.h $w0, $2
2185; MIPS64R5-N32-NEXT: fexupr.w $w0, $w0
2186; MIPS64R5-N32-NEXT: copy_s.w $2, $w0[0]
2187; MIPS64R5-N32-NEXT: mtc1 $2, $f0
2188; MIPS64R5-N32-NEXT: madd.s $f0, $f13, $f0, $f12
2189; MIPS64R5-N32-NEXT: mfc1 $2, $f0
2190; MIPS64R5-N32-NEXT: fill.w $w0, $2
2191; MIPS64R5-N32-NEXT: fexdo.h $w0, $w0, $w0
2192; MIPS64R5-N32-NEXT: copy_u.h $2, $w0[0]
2193; MIPS64R5-N32-NEXT: jr $ra
2194; MIPS64R5-N32-NEXT: sh $2, 0($1)
2195;
2196; MIPS64R5-N64-LABEL: ffmuladd:
2197; MIPS64R5-N64: # %bb.0: # %entry
2198; MIPS64R5-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd)))
2199; MIPS64R5-N64-NEXT: daddu $1, $1, $25
2200; MIPS64R5-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))
2201; MIPS64R5-N64-NEXT: ld $1, %got_disp(g)($1)
2202; MIPS64R5-N64-NEXT: lh $2, 0($1)
2203; MIPS64R5-N64-NEXT: fill.h $w0, $2
2204; MIPS64R5-N64-NEXT: fexupr.w $w0, $w0
2205; MIPS64R5-N64-NEXT: copy_s.w $2, $w0[0]
2206; MIPS64R5-N64-NEXT: mtc1 $2, $f0
2207; MIPS64R5-N64-NEXT: madd.s $f0, $f13, $f0, $f12
2208; MIPS64R5-N64-NEXT: mfc1 $2, $f0
2209; MIPS64R5-N64-NEXT: fill.w $w0, $2
2210; MIPS64R5-N64-NEXT: fexdo.h $w0, $w0, $w0
2211; MIPS64R5-N64-NEXT: copy_u.h $2, $w0[0]
2212; MIPS64R5-N64-NEXT: jr $ra
2213; MIPS64R5-N64-NEXT: sh $2, 0($1)
2214;
2215; MIPSR6-O32-LABEL: ffmuladd:
2216; MIPSR6-O32: # %bb.0: # %entry
2217; MIPSR6-O32-NEXT: lui $2, %hi(_gp_disp)
2218; MIPSR6-O32-NEXT: addiu $2, $2, %lo(_gp_disp)
2219; MIPSR6-O32-NEXT: addu $1, $2, $25
2220; MIPSR6-O32-NEXT: lw $1, %got(g)($1)
2221; MIPSR6-O32-NEXT: lh $2, 0($1)
2222; MIPSR6-O32-NEXT: fill.h $w0, $2
2223; MIPSR6-O32-NEXT: fexupr.w $w0, $w0
2224; MIPSR6-O32-NEXT: copy_s.w $2, $w0[0]
2225; MIPSR6-O32-NEXT: mtc1 $2, $f0
2226; MIPSR6-O32-NEXT: mul.s $f0, $f0, $f12
2227; MIPSR6-O32-NEXT: add.s $f0, $f0, $f14
2228; MIPSR6-O32-NEXT: mfc1 $2, $f0
2229; MIPSR6-O32-NEXT: fill.w $w0, $2
2230; MIPSR6-O32-NEXT: fexdo.h $w0, $w0, $w0
2231; MIPSR6-O32-NEXT: copy_u.h $2, $w0[0]
2232; MIPSR6-O32-NEXT: jr $ra
2233; MIPSR6-O32-NEXT: sh $2, 0($1)
2234;
2235; MIPSR6-N32-LABEL: ffmuladd:
2236; MIPSR6-N32: # %bb.0: # %entry
2237; MIPSR6-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd)))
2238; MIPSR6-N32-NEXT: addu $1, $1, $25
2239; MIPSR6-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))
2240; MIPSR6-N32-NEXT: lw $1, %got_disp(g)($1)
2241; MIPSR6-N32-NEXT: lh $2, 0($1)
2242; MIPSR6-N32-NEXT: fill.h $w0, $2
2243; MIPSR6-N32-NEXT: fexupr.w $w0, $w0
2244; MIPSR6-N32-NEXT: copy_s.w $2, $w0[0]
2245; MIPSR6-N32-NEXT: mtc1 $2, $f0
2246; MIPSR6-N32-NEXT: mul.s $f0, $f0, $f12
2247; MIPSR6-N32-NEXT: add.s $f0, $f0, $f13
2248; MIPSR6-N32-NEXT: mfc1 $2, $f0
2249; MIPSR6-N32-NEXT: fill.w $w0, $2
2250; MIPSR6-N32-NEXT: fexdo.h $w0, $w0, $w0
2251; MIPSR6-N32-NEXT: copy_u.h $2, $w0[0]
2252; MIPSR6-N32-NEXT: jr $ra
2253; MIPSR6-N32-NEXT: sh $2, 0($1)
2254;
2255; MIPSR6-N64-LABEL: ffmuladd:
2256; MIPSR6-N64: # %bb.0: # %entry
2257; MIPSR6-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffmuladd)))
2258; MIPSR6-N64-NEXT: daddu $1, $1, $25
2259; MIPSR6-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffmuladd)))
2260; MIPSR6-N64-NEXT: ld $1, %got_disp(g)($1)
2261; MIPSR6-N64-NEXT: lh $2, 0($1)
2262; MIPSR6-N64-NEXT: fill.h $w0, $2
2263; MIPSR6-N64-NEXT: fexupr.w $w0, $w0
2264; MIPSR6-N64-NEXT: copy_s.w $2, $w0[0]
2265; MIPSR6-N64-NEXT: mtc1 $2, $f0
2266; MIPSR6-N64-NEXT: mul.s $f0, $f0, $f12
2267; MIPSR6-N64-NEXT: add.s $f0, $f0, $f13
2268; MIPSR6-N64-NEXT: mfc1 $2, $f0
2269; MIPSR6-N64-NEXT: fill.w $w0, $2
2270; MIPSR6-N64-NEXT: fexdo.h $w0, $w0, $w0
2271; MIPSR6-N64-NEXT: copy_u.h $2, $w0[0]
2272; MIPSR6-N64-NEXT: jr $ra
2273; MIPSR6-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +00002274entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002275 %0 = load i16, i16* @g, align 2
2276 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2277
Simon Dardis40a50402016-11-21 20:34:10 +00002278; MIPS32-N32: madd.s $f[[F1:[0-9]]], $f13, $f[[F0]], $f12
2279; MIPS32-N64: madd.s $f[[F1:[0-9]]], $f13, $f[[F0]], $f12
Simon Dardis40a50402016-11-21 20:34:10 +00002280
2281 %fmuladd = call float @llvm.fmuladd.f32(float %1, float %b, float %c)
2282 %2 = call i16 @llvm.convert.to.fp16.f32(float %fmuladd)
2283
Simon Dardis40a50402016-11-21 20:34:10 +00002284
2285 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002286
2287 ret void
2288}
2289
2290declare float @llvm.fabs.f32(float %Val)
2291
2292define void @ffabs() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002293; MIPS32-LABEL: ffabs:
2294; MIPS32: # %bb.0: # %entry
2295; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2296; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2297; MIPS32-NEXT: addu $1, $2, $25
2298; MIPS32-NEXT: lw $1, %got(g)($1)
2299; MIPS32-NEXT: lh $2, 0($1)
2300; MIPS32-NEXT: fill.h $w0, $2
2301; MIPS32-NEXT: fexupr.w $w0, $w0
2302; MIPS32-NEXT: copy_s.w $2, $w0[0]
2303; MIPS32-NEXT: mtc1 $2, $f0
2304; MIPS32-NEXT: abs.s $f0, $f0
2305; MIPS32-NEXT: mfc1 $2, $f0
2306; MIPS32-NEXT: fill.w $w0, $2
2307; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
2308; MIPS32-NEXT: copy_u.h $2, $w0[0]
2309; MIPS32-NEXT: jr $ra
2310; MIPS32-NEXT: sh $2, 0($1)
2311;
2312; MIPS64-N32-LABEL: ffabs:
2313; MIPS64-N32: # %bb.0: # %entry
2314; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffabs)))
2315; MIPS64-N32-NEXT: addu $1, $1, $25
2316; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(ffabs)))
2317; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)
2318; MIPS64-N32-NEXT: lh $2, 0($1)
2319; MIPS64-N32-NEXT: fill.h $w0, $2
2320; MIPS64-N32-NEXT: fexupr.w $w0, $w0
2321; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
2322; MIPS64-N32-NEXT: mtc1 $2, $f0
2323; MIPS64-N32-NEXT: abs.s $f0, $f0
2324; MIPS64-N32-NEXT: mfc1 $2, $f0
2325; MIPS64-N32-NEXT: fill.w $w0, $2
2326; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
2327; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
2328; MIPS64-N32-NEXT: jr $ra
2329; MIPS64-N32-NEXT: sh $2, 0($1)
2330;
2331; MIPS64-N64-LABEL: ffabs:
2332; MIPS64-N64: # %bb.0: # %entry
2333; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffabs)))
2334; MIPS64-N64-NEXT: daddu $1, $1, $25
2335; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(ffabs)))
2336; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)
2337; MIPS64-N64-NEXT: lh $2, 0($1)
2338; MIPS64-N64-NEXT: fill.h $w0, $2
2339; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2340; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
2341; MIPS64-N64-NEXT: mtc1 $2, $f0
2342; MIPS64-N64-NEXT: abs.s $f0, $f0
2343; MIPS64-N64-NEXT: mfc1 $2, $f0
2344; MIPS64-N64-NEXT: fill.w $w0, $2
2345; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2346; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
2347; MIPS64-N64-NEXT: jr $ra
2348; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +00002349entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002350 %0 = load i16, i16* @g, align 2
2351 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2352
Simon Dardis40a50402016-11-21 20:34:10 +00002353
2354 %fabs = call float @llvm.fabs.f32(float %1)
2355 %2 = call i16 @llvm.convert.to.fp16.f32(float %fabs)
2356
Simon Dardis40a50402016-11-21 20:34:10 +00002357
2358 store i16 %2, i16* @g, align 2
2359
Simon Dardis40a50402016-11-21 20:34:10 +00002360 ret void
2361}
2362
2363declare float @llvm.minnum.f32(float %Val, float %b)
2364
2365define void @fminnum(float %b) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002366; MIPS32-LABEL: fminnum:
2367; MIPS32: # %bb.0: # %entry
2368; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2369; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2370; MIPS32-NEXT: addiu $sp, $sp, -24
2371; MIPS32-NEXT: .cfi_def_cfa_offset 24
2372; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
2373; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
2374; MIPS32-NEXT: .cfi_offset 31, -4
2375; MIPS32-NEXT: .cfi_offset 16, -8
2376; MIPS32-NEXT: addu $gp, $2, $25
2377; MIPS32-NEXT: mov.s $f14, $f12
2378; MIPS32-NEXT: lw $16, %got(g)($gp)
2379; MIPS32-NEXT: lh $1, 0($16)
2380; MIPS32-NEXT: fill.h $w0, $1
2381; MIPS32-NEXT: fexupr.w $w0, $w0
2382; MIPS32-NEXT: copy_s.w $1, $w0[0]
2383; MIPS32-NEXT: lw $25, %call16(fminf)($gp)
2384; MIPS32-NEXT: jalr $25
2385; MIPS32-NEXT: mtc1 $1, $f12
2386; MIPS32-NEXT: mfc1 $1, $f0
2387; MIPS32-NEXT: fill.w $w0, $1
2388; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
2389; MIPS32-NEXT: copy_u.h $1, $w0[0]
2390; MIPS32-NEXT: sh $1, 0($16)
2391; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
2392; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
2393; MIPS32-NEXT: jr $ra
2394; MIPS32-NEXT: addiu $sp, $sp, 24
2395;
2396; MIPS64-N32-LABEL: fminnum:
2397; MIPS64-N32: # %bb.0: # %entry
2398; MIPS64-N32-NEXT: addiu $sp, $sp, -32
2399; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
2400; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2401; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2402; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2403; MIPS64-N32-NEXT: .cfi_offset 31, -8
2404; MIPS64-N32-NEXT: .cfi_offset 28, -16
2405; MIPS64-N32-NEXT: .cfi_offset 16, -24
2406; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum)))
2407; MIPS64-N32-NEXT: addu $1, $1, $25
2408; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fminnum)))
2409; MIPS64-N32-NEXT: mov.s $f13, $f12
2410; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
2411; MIPS64-N32-NEXT: lh $1, 0($16)
2412; MIPS64-N32-NEXT: fill.h $w0, $1
2413; MIPS64-N32-NEXT: fexupr.w $w0, $w0
2414; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
2415; MIPS64-N32-NEXT: lw $25, %call16(fminf)($gp)
2416; MIPS64-N32-NEXT: jalr $25
2417; MIPS64-N32-NEXT: mtc1 $1, $f12
2418; MIPS64-N32-NEXT: mfc1 $1, $f0
2419; MIPS64-N32-NEXT: fill.w $w0, $1
2420; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
2421; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
2422; MIPS64-N32-NEXT: sh $1, 0($16)
2423; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2424; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2425; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2426; MIPS64-N32-NEXT: jr $ra
2427; MIPS64-N32-NEXT: addiu $sp, $sp, 32
2428;
2429; MIPS64-N64-LABEL: fminnum:
2430; MIPS64-N64: # %bb.0: # %entry
2431; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
2432; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
2433; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2434; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2435; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2436; MIPS64-N64-NEXT: .cfi_offset 31, -8
2437; MIPS64-N64-NEXT: .cfi_offset 28, -16
2438; MIPS64-N64-NEXT: .cfi_offset 16, -24
2439; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fminnum)))
2440; MIPS64-N64-NEXT: daddu $1, $1, $25
2441; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fminnum)))
2442; MIPS64-N64-NEXT: mov.s $f13, $f12
2443; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
2444; MIPS64-N64-NEXT: lh $1, 0($16)
2445; MIPS64-N64-NEXT: fill.h $w0, $1
2446; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2447; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
2448; MIPS64-N64-NEXT: ld $25, %call16(fminf)($gp)
2449; MIPS64-N64-NEXT: jalr $25
2450; MIPS64-N64-NEXT: mtc1 $1, $f12
2451; MIPS64-N64-NEXT: mfc1 $1, $f0
2452; MIPS64-N64-NEXT: fill.w $w0, $1
2453; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2454; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
2455; MIPS64-N64-NEXT: sh $1, 0($16)
2456; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2457; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2458; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2459; MIPS64-N64-NEXT: jr $ra
2460; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00002461entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002462 %0 = load i16, i16* @g, align 2
2463 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2464
Simon Dardis40a50402016-11-21 20:34:10 +00002465
2466 %minnum = call float @llvm.minnum.f32(float %1, float %b)
2467 %2 = call i16 @llvm.convert.to.fp16.f32(float %minnum)
2468
Simon Dardis40a50402016-11-21 20:34:10 +00002469
2470 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002471
2472 ret void
2473}
2474
2475declare float @llvm.maxnum.f32(float %Val, float %b)
2476
2477define void @fmaxnum(float %b) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002478; MIPS32-LABEL: fmaxnum:
2479; MIPS32: # %bb.0: # %entry
2480; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2481; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2482; MIPS32-NEXT: addiu $sp, $sp, -24
2483; MIPS32-NEXT: .cfi_def_cfa_offset 24
2484; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
2485; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
2486; MIPS32-NEXT: .cfi_offset 31, -4
2487; MIPS32-NEXT: .cfi_offset 16, -8
2488; MIPS32-NEXT: addu $gp, $2, $25
2489; MIPS32-NEXT: mov.s $f14, $f12
2490; MIPS32-NEXT: lw $16, %got(g)($gp)
2491; MIPS32-NEXT: lh $1, 0($16)
2492; MIPS32-NEXT: fill.h $w0, $1
2493; MIPS32-NEXT: fexupr.w $w0, $w0
2494; MIPS32-NEXT: copy_s.w $1, $w0[0]
2495; MIPS32-NEXT: lw $25, %call16(fmaxf)($gp)
2496; MIPS32-NEXT: jalr $25
2497; MIPS32-NEXT: mtc1 $1, $f12
2498; MIPS32-NEXT: mfc1 $1, $f0
2499; MIPS32-NEXT: fill.w $w0, $1
2500; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
2501; MIPS32-NEXT: copy_u.h $1, $w0[0]
2502; MIPS32-NEXT: sh $1, 0($16)
2503; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
2504; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
2505; MIPS32-NEXT: jr $ra
2506; MIPS32-NEXT: addiu $sp, $sp, 24
2507;
2508; MIPS64-N32-LABEL: fmaxnum:
2509; MIPS64-N32: # %bb.0: # %entry
2510; MIPS64-N32-NEXT: addiu $sp, $sp, -32
2511; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
2512; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2513; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2514; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2515; MIPS64-N32-NEXT: .cfi_offset 31, -8
2516; MIPS64-N32-NEXT: .cfi_offset 28, -16
2517; MIPS64-N32-NEXT: .cfi_offset 16, -24
2518; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum)))
2519; MIPS64-N32-NEXT: addu $1, $1, $25
2520; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum)))
2521; MIPS64-N32-NEXT: mov.s $f13, $f12
2522; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
2523; MIPS64-N32-NEXT: lh $1, 0($16)
2524; MIPS64-N32-NEXT: fill.h $w0, $1
2525; MIPS64-N32-NEXT: fexupr.w $w0, $w0
2526; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
2527; MIPS64-N32-NEXT: lw $25, %call16(fmaxf)($gp)
2528; MIPS64-N32-NEXT: jalr $25
2529; MIPS64-N32-NEXT: mtc1 $1, $f12
2530; MIPS64-N32-NEXT: mfc1 $1, $f0
2531; MIPS64-N32-NEXT: fill.w $w0, $1
2532; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
2533; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
2534; MIPS64-N32-NEXT: sh $1, 0($16)
2535; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2536; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2537; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2538; MIPS64-N32-NEXT: jr $ra
2539; MIPS64-N32-NEXT: addiu $sp, $sp, 32
2540;
2541; MIPS64-N64-LABEL: fmaxnum:
2542; MIPS64-N64: # %bb.0: # %entry
2543; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
2544; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
2545; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2546; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2547; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2548; MIPS64-N64-NEXT: .cfi_offset 31, -8
2549; MIPS64-N64-NEXT: .cfi_offset 28, -16
2550; MIPS64-N64-NEXT: .cfi_offset 16, -24
2551; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fmaxnum)))
2552; MIPS64-N64-NEXT: daddu $1, $1, $25
2553; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fmaxnum)))
2554; MIPS64-N64-NEXT: mov.s $f13, $f12
2555; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
2556; MIPS64-N64-NEXT: lh $1, 0($16)
2557; MIPS64-N64-NEXT: fill.h $w0, $1
2558; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2559; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
2560; MIPS64-N64-NEXT: ld $25, %call16(fmaxf)($gp)
2561; MIPS64-N64-NEXT: jalr $25
2562; MIPS64-N64-NEXT: mtc1 $1, $f12
2563; MIPS64-N64-NEXT: mfc1 $1, $f0
2564; MIPS64-N64-NEXT: fill.w $w0, $1
2565; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2566; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
2567; MIPS64-N64-NEXT: sh $1, 0($16)
2568; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2569; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2570; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2571; MIPS64-N64-NEXT: jr $ra
2572; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00002573entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002574 %0 = load i16, i16* @g, align 2
2575 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2576
Simon Dardis40a50402016-11-21 20:34:10 +00002577
2578 %maxnum = call float @llvm.maxnum.f32(float %1, float %b)
2579 %2 = call i16 @llvm.convert.to.fp16.f32(float %maxnum)
2580
Simon Dardis40a50402016-11-21 20:34:10 +00002581
2582 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002583
2584 ret void
2585}
2586
2587; This expansion of fcopysign could be done without converting f16 to float.
2588
2589declare float @llvm.copysign.f32(float %Val, float %b)
2590
2591define void @fcopysign(float %b) {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002592; MIPS32-LABEL: fcopysign:
2593; MIPS32: # %bb.0: # %entry
2594; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2595; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2596; MIPS32-NEXT: addu $1, $2, $25
2597; MIPS32-NEXT: lw $1, %got(g)($1)
2598; MIPS32-NEXT: lh $2, 0($1)
2599; MIPS32-NEXT: fill.h $w0, $2
2600; MIPS32-NEXT: fexupr.w $w0, $w0
2601; MIPS32-NEXT: copy_s.w $2, $w0[0]
2602; MIPS32-NEXT: mfc1 $3, $f12
2603; MIPS32-NEXT: ext $3, $3, 31, 1
2604; MIPS32-NEXT: ins $2, $3, 31, 1
2605; MIPS32-NEXT: fill.w $w0, $2
2606; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
2607; MIPS32-NEXT: copy_u.h $2, $w0[0]
2608; MIPS32-NEXT: jr $ra
2609; MIPS32-NEXT: sh $2, 0($1)
2610;
2611; MIPS64-N32-LABEL: fcopysign:
2612; MIPS64-N32: # %bb.0: # %entry
2613; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fcopysign)))
2614; MIPS64-N32-NEXT: addu $1, $1, $25
2615; MIPS64-N32-NEXT: addiu $1, $1, %lo(%neg(%gp_rel(fcopysign)))
2616; MIPS64-N32-NEXT: lw $1, %got_disp(g)($1)
2617; MIPS64-N32-NEXT: lh $2, 0($1)
2618; MIPS64-N32-NEXT: fill.h $w0, $2
2619; MIPS64-N32-NEXT: fexupr.w $w0, $w0
2620; MIPS64-N32-NEXT: copy_s.w $2, $w0[0]
2621; MIPS64-N32-NEXT: mfc1 $3, $f12
2622; MIPS64-N32-NEXT: ext $3, $3, 31, 1
2623; MIPS64-N32-NEXT: ins $2, $3, 31, 1
2624; MIPS64-N32-NEXT: fill.w $w0, $2
2625; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
2626; MIPS64-N32-NEXT: copy_u.h $2, $w0[0]
2627; MIPS64-N32-NEXT: jr $ra
2628; MIPS64-N32-NEXT: sh $2, 0($1)
2629;
2630; MIPS64-N64-LABEL: fcopysign:
2631; MIPS64-N64: # %bb.0: # %entry
2632; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fcopysign)))
2633; MIPS64-N64-NEXT: daddu $1, $1, $25
2634; MIPS64-N64-NEXT: daddiu $1, $1, %lo(%neg(%gp_rel(fcopysign)))
2635; MIPS64-N64-NEXT: ld $1, %got_disp(g)($1)
2636; MIPS64-N64-NEXT: lh $2, 0($1)
2637; MIPS64-N64-NEXT: fill.h $w0, $2
2638; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2639; MIPS64-N64-NEXT: copy_s.w $2, $w0[0]
2640; MIPS64-N64-NEXT: mfc1 $3, $f12
2641; MIPS64-N64-NEXT: ext $3, $3, 31, 1
2642; MIPS64-N64-NEXT: ins $2, $3, 31, 1
2643; MIPS64-N64-NEXT: fill.w $w0, $2
2644; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2645; MIPS64-N64-NEXT: copy_u.h $2, $w0[0]
2646; MIPS64-N64-NEXT: jr $ra
2647; MIPS64-N64-NEXT: sh $2, 0($1)
Simon Dardis40a50402016-11-21 20:34:10 +00002648entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002649 %0 = load i16, i16* @g, align 2
2650 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2651
Simon Dardis40a50402016-11-21 20:34:10 +00002652
2653 %copysign = call float @llvm.copysign.f32(float %1, float %b)
2654 %2 = call i16 @llvm.convert.to.fp16.f32(float %copysign)
2655
Simon Dardis40a50402016-11-21 20:34:10 +00002656
2657 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002658
2659 ret void
2660}
2661
2662declare float @llvm.floor.f32(float %Val)
2663
2664define void @ffloor() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002665; MIPS32-LABEL: ffloor:
2666; MIPS32: # %bb.0: # %entry
2667; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2668; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2669; MIPS32-NEXT: addiu $sp, $sp, -24
2670; MIPS32-NEXT: .cfi_def_cfa_offset 24
2671; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
2672; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
2673; MIPS32-NEXT: .cfi_offset 31, -4
2674; MIPS32-NEXT: .cfi_offset 16, -8
2675; MIPS32-NEXT: addu $gp, $2, $25
2676; MIPS32-NEXT: lw $16, %got(g)($gp)
2677; MIPS32-NEXT: lh $1, 0($16)
2678; MIPS32-NEXT: fill.h $w0, $1
2679; MIPS32-NEXT: fexupr.w $w0, $w0
2680; MIPS32-NEXT: copy_s.w $1, $w0[0]
2681; MIPS32-NEXT: lw $25, %call16(floorf)($gp)
2682; MIPS32-NEXT: jalr $25
2683; MIPS32-NEXT: mtc1 $1, $f12
2684; MIPS32-NEXT: mfc1 $1, $f0
2685; MIPS32-NEXT: fill.w $w0, $1
2686; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
2687; MIPS32-NEXT: copy_u.h $1, $w0[0]
2688; MIPS32-NEXT: sh $1, 0($16)
2689; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
2690; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
2691; MIPS32-NEXT: jr $ra
2692; MIPS32-NEXT: addiu $sp, $sp, 24
2693;
2694; MIPS64-N32-LABEL: ffloor:
2695; MIPS64-N32: # %bb.0: # %entry
2696; MIPS64-N32-NEXT: addiu $sp, $sp, -32
2697; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
2698; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2699; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2700; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2701; MIPS64-N32-NEXT: .cfi_offset 31, -8
2702; MIPS64-N32-NEXT: .cfi_offset 28, -16
2703; MIPS64-N32-NEXT: .cfi_offset 16, -24
2704; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ffloor)))
2705; MIPS64-N32-NEXT: addu $1, $1, $25
2706; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ffloor)))
2707; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
2708; MIPS64-N32-NEXT: lh $1, 0($16)
2709; MIPS64-N32-NEXT: fill.h $w0, $1
2710; MIPS64-N32-NEXT: fexupr.w $w0, $w0
2711; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
2712; MIPS64-N32-NEXT: lw $25, %call16(floorf)($gp)
2713; MIPS64-N32-NEXT: jalr $25
2714; MIPS64-N32-NEXT: mtc1 $1, $f12
2715; MIPS64-N32-NEXT: mfc1 $1, $f0
2716; MIPS64-N32-NEXT: fill.w $w0, $1
2717; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
2718; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
2719; MIPS64-N32-NEXT: sh $1, 0($16)
2720; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2721; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2722; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2723; MIPS64-N32-NEXT: jr $ra
2724; MIPS64-N32-NEXT: addiu $sp, $sp, 32
2725;
2726; MIPS64-N64-LABEL: ffloor:
2727; MIPS64-N64: # %bb.0: # %entry
2728; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
2729; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
2730; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2731; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2732; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2733; MIPS64-N64-NEXT: .cfi_offset 31, -8
2734; MIPS64-N64-NEXT: .cfi_offset 28, -16
2735; MIPS64-N64-NEXT: .cfi_offset 16, -24
2736; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ffloor)))
2737; MIPS64-N64-NEXT: daddu $1, $1, $25
2738; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ffloor)))
2739; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
2740; MIPS64-N64-NEXT: lh $1, 0($16)
2741; MIPS64-N64-NEXT: fill.h $w0, $1
2742; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2743; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
2744; MIPS64-N64-NEXT: ld $25, %call16(floorf)($gp)
2745; MIPS64-N64-NEXT: jalr $25
2746; MIPS64-N64-NEXT: mtc1 $1, $f12
2747; MIPS64-N64-NEXT: mfc1 $1, $f0
2748; MIPS64-N64-NEXT: fill.w $w0, $1
2749; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2750; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
2751; MIPS64-N64-NEXT: sh $1, 0($16)
2752; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2753; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2754; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2755; MIPS64-N64-NEXT: jr $ra
2756; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00002757entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002758 %0 = load i16, i16* @g, align 2
2759 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2760
Simon Dardis40a50402016-11-21 20:34:10 +00002761
2762 %floor = call float @llvm.floor.f32(float %1)
2763 %2 = call i16 @llvm.convert.to.fp16.f32(float %floor)
2764
Simon Dardis40a50402016-11-21 20:34:10 +00002765
2766 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002767
2768 ret void
2769}
2770
2771declare float @llvm.ceil.f32(float %Val)
2772
2773define void @fceil() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002774; MIPS32-LABEL: fceil:
2775; MIPS32: # %bb.0: # %entry
2776; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2777; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2778; MIPS32-NEXT: addiu $sp, $sp, -24
2779; MIPS32-NEXT: .cfi_def_cfa_offset 24
2780; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
2781; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
2782; MIPS32-NEXT: .cfi_offset 31, -4
2783; MIPS32-NEXT: .cfi_offset 16, -8
2784; MIPS32-NEXT: addu $gp, $2, $25
2785; MIPS32-NEXT: lw $16, %got(g)($gp)
2786; MIPS32-NEXT: lh $1, 0($16)
2787; MIPS32-NEXT: fill.h $w0, $1
2788; MIPS32-NEXT: fexupr.w $w0, $w0
2789; MIPS32-NEXT: copy_s.w $1, $w0[0]
2790; MIPS32-NEXT: lw $25, %call16(ceilf)($gp)
2791; MIPS32-NEXT: jalr $25
2792; MIPS32-NEXT: mtc1 $1, $f12
2793; MIPS32-NEXT: mfc1 $1, $f0
2794; MIPS32-NEXT: fill.w $w0, $1
2795; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
2796; MIPS32-NEXT: copy_u.h $1, $w0[0]
2797; MIPS32-NEXT: sh $1, 0($16)
2798; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
2799; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
2800; MIPS32-NEXT: jr $ra
2801; MIPS32-NEXT: addiu $sp, $sp, 24
2802;
2803; MIPS64-N32-LABEL: fceil:
2804; MIPS64-N32: # %bb.0: # %entry
2805; MIPS64-N32-NEXT: addiu $sp, $sp, -32
2806; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
2807; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2808; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2809; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2810; MIPS64-N32-NEXT: .cfi_offset 31, -8
2811; MIPS64-N32-NEXT: .cfi_offset 28, -16
2812; MIPS64-N32-NEXT: .cfi_offset 16, -24
2813; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fceil)))
2814; MIPS64-N32-NEXT: addu $1, $1, $25
2815; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fceil)))
2816; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
2817; MIPS64-N32-NEXT: lh $1, 0($16)
2818; MIPS64-N32-NEXT: fill.h $w0, $1
2819; MIPS64-N32-NEXT: fexupr.w $w0, $w0
2820; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
2821; MIPS64-N32-NEXT: lw $25, %call16(ceilf)($gp)
2822; MIPS64-N32-NEXT: jalr $25
2823; MIPS64-N32-NEXT: mtc1 $1, $f12
2824; MIPS64-N32-NEXT: mfc1 $1, $f0
2825; MIPS64-N32-NEXT: fill.w $w0, $1
2826; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
2827; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
2828; MIPS64-N32-NEXT: sh $1, 0($16)
2829; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2830; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2831; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2832; MIPS64-N32-NEXT: jr $ra
2833; MIPS64-N32-NEXT: addiu $sp, $sp, 32
2834;
2835; MIPS64-N64-LABEL: fceil:
2836; MIPS64-N64: # %bb.0: # %entry
2837; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
2838; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
2839; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2840; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2841; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2842; MIPS64-N64-NEXT: .cfi_offset 31, -8
2843; MIPS64-N64-NEXT: .cfi_offset 28, -16
2844; MIPS64-N64-NEXT: .cfi_offset 16, -24
2845; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fceil)))
2846; MIPS64-N64-NEXT: daddu $1, $1, $25
2847; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fceil)))
2848; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
2849; MIPS64-N64-NEXT: lh $1, 0($16)
2850; MIPS64-N64-NEXT: fill.h $w0, $1
2851; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2852; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
2853; MIPS64-N64-NEXT: ld $25, %call16(ceilf)($gp)
2854; MIPS64-N64-NEXT: jalr $25
2855; MIPS64-N64-NEXT: mtc1 $1, $f12
2856; MIPS64-N64-NEXT: mfc1 $1, $f0
2857; MIPS64-N64-NEXT: fill.w $w0, $1
2858; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2859; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
2860; MIPS64-N64-NEXT: sh $1, 0($16)
2861; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2862; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2863; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2864; MIPS64-N64-NEXT: jr $ra
2865; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00002866entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002867 %0 = load i16, i16* @g, align 2
2868 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2869
Simon Dardis40a50402016-11-21 20:34:10 +00002870
2871 %ceil = call float @llvm.ceil.f32(float %1)
2872 %2 = call i16 @llvm.convert.to.fp16.f32(float %ceil)
2873
Simon Dardis40a50402016-11-21 20:34:10 +00002874
2875 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002876
2877 ret void
2878}
2879
2880declare float @llvm.trunc.f32(float %Val)
2881
2882define void @ftrunc() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002883; MIPS32-LABEL: ftrunc:
2884; MIPS32: # %bb.0: # %entry
2885; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2886; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2887; MIPS32-NEXT: addiu $sp, $sp, -24
2888; MIPS32-NEXT: .cfi_def_cfa_offset 24
2889; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
2890; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
2891; MIPS32-NEXT: .cfi_offset 31, -4
2892; MIPS32-NEXT: .cfi_offset 16, -8
2893; MIPS32-NEXT: addu $gp, $2, $25
2894; MIPS32-NEXT: lw $16, %got(g)($gp)
2895; MIPS32-NEXT: lh $1, 0($16)
2896; MIPS32-NEXT: fill.h $w0, $1
2897; MIPS32-NEXT: fexupr.w $w0, $w0
2898; MIPS32-NEXT: copy_s.w $1, $w0[0]
2899; MIPS32-NEXT: lw $25, %call16(truncf)($gp)
2900; MIPS32-NEXT: jalr $25
2901; MIPS32-NEXT: mtc1 $1, $f12
2902; MIPS32-NEXT: mfc1 $1, $f0
2903; MIPS32-NEXT: fill.w $w0, $1
2904; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
2905; MIPS32-NEXT: copy_u.h $1, $w0[0]
2906; MIPS32-NEXT: sh $1, 0($16)
2907; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
2908; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
2909; MIPS32-NEXT: jr $ra
2910; MIPS32-NEXT: addiu $sp, $sp, 24
2911;
2912; MIPS64-N32-LABEL: ftrunc:
2913; MIPS64-N32: # %bb.0: # %entry
2914; MIPS64-N32-NEXT: addiu $sp, $sp, -32
2915; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
2916; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2917; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2918; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2919; MIPS64-N32-NEXT: .cfi_offset 31, -8
2920; MIPS64-N32-NEXT: .cfi_offset 28, -16
2921; MIPS64-N32-NEXT: .cfi_offset 16, -24
2922; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(ftrunc)))
2923; MIPS64-N32-NEXT: addu $1, $1, $25
2924; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(ftrunc)))
2925; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
2926; MIPS64-N32-NEXT: lh $1, 0($16)
2927; MIPS64-N32-NEXT: fill.h $w0, $1
2928; MIPS64-N32-NEXT: fexupr.w $w0, $w0
2929; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
2930; MIPS64-N32-NEXT: lw $25, %call16(truncf)($gp)
2931; MIPS64-N32-NEXT: jalr $25
2932; MIPS64-N32-NEXT: mtc1 $1, $f12
2933; MIPS64-N32-NEXT: mfc1 $1, $f0
2934; MIPS64-N32-NEXT: fill.w $w0, $1
2935; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
2936; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
2937; MIPS64-N32-NEXT: sh $1, 0($16)
2938; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2939; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2940; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2941; MIPS64-N32-NEXT: jr $ra
2942; MIPS64-N32-NEXT: addiu $sp, $sp, 32
2943;
2944; MIPS64-N64-LABEL: ftrunc:
2945; MIPS64-N64: # %bb.0: # %entry
2946; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
2947; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
2948; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
2949; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
2950; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
2951; MIPS64-N64-NEXT: .cfi_offset 31, -8
2952; MIPS64-N64-NEXT: .cfi_offset 28, -16
2953; MIPS64-N64-NEXT: .cfi_offset 16, -24
2954; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(ftrunc)))
2955; MIPS64-N64-NEXT: daddu $1, $1, $25
2956; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(ftrunc)))
2957; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
2958; MIPS64-N64-NEXT: lh $1, 0($16)
2959; MIPS64-N64-NEXT: fill.h $w0, $1
2960; MIPS64-N64-NEXT: fexupr.w $w0, $w0
2961; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
2962; MIPS64-N64-NEXT: ld $25, %call16(truncf)($gp)
2963; MIPS64-N64-NEXT: jalr $25
2964; MIPS64-N64-NEXT: mtc1 $1, $f12
2965; MIPS64-N64-NEXT: mfc1 $1, $f0
2966; MIPS64-N64-NEXT: fill.w $w0, $1
2967; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
2968; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
2969; MIPS64-N64-NEXT: sh $1, 0($16)
2970; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
2971; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
2972; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
2973; MIPS64-N64-NEXT: jr $ra
2974; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00002975entry:
Simon Dardis40a50402016-11-21 20:34:10 +00002976 %0 = load i16, i16* @g, align 2
2977 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2978
Simon Dardis40a50402016-11-21 20:34:10 +00002979
2980 %trunc = call float @llvm.trunc.f32(float %1)
2981 %2 = call i16 @llvm.convert.to.fp16.f32(float %trunc)
2982
Simon Dardis40a50402016-11-21 20:34:10 +00002983
2984 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00002985
2986 ret void
2987}
2988
2989declare float @llvm.rint.f32(float %Val)
2990
2991define void @frint() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00002992; MIPS32-LABEL: frint:
2993; MIPS32: # %bb.0: # %entry
2994; MIPS32-NEXT: lui $2, %hi(_gp_disp)
2995; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
2996; MIPS32-NEXT: addiu $sp, $sp, -24
2997; MIPS32-NEXT: .cfi_def_cfa_offset 24
2998; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
2999; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
3000; MIPS32-NEXT: .cfi_offset 31, -4
3001; MIPS32-NEXT: .cfi_offset 16, -8
3002; MIPS32-NEXT: addu $gp, $2, $25
3003; MIPS32-NEXT: lw $16, %got(g)($gp)
3004; MIPS32-NEXT: lh $1, 0($16)
3005; MIPS32-NEXT: fill.h $w0, $1
3006; MIPS32-NEXT: fexupr.w $w0, $w0
3007; MIPS32-NEXT: copy_s.w $1, $w0[0]
3008; MIPS32-NEXT: lw $25, %call16(rintf)($gp)
3009; MIPS32-NEXT: jalr $25
3010; MIPS32-NEXT: mtc1 $1, $f12
3011; MIPS32-NEXT: mfc1 $1, $f0
3012; MIPS32-NEXT: fill.w $w0, $1
3013; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
3014; MIPS32-NEXT: copy_u.h $1, $w0[0]
3015; MIPS32-NEXT: sh $1, 0($16)
3016; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
3017; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
3018; MIPS32-NEXT: jr $ra
3019; MIPS32-NEXT: addiu $sp, $sp, 24
3020;
3021; MIPS64-N32-LABEL: frint:
3022; MIPS64-N32: # %bb.0: # %entry
3023; MIPS64-N32-NEXT: addiu $sp, $sp, -32
3024; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
3025; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
3026; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
3027; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
3028; MIPS64-N32-NEXT: .cfi_offset 31, -8
3029; MIPS64-N32-NEXT: .cfi_offset 28, -16
3030; MIPS64-N32-NEXT: .cfi_offset 16, -24
3031; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(frint)))
3032; MIPS64-N32-NEXT: addu $1, $1, $25
3033; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(frint)))
3034; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
3035; MIPS64-N32-NEXT: lh $1, 0($16)
3036; MIPS64-N32-NEXT: fill.h $w0, $1
3037; MIPS64-N32-NEXT: fexupr.w $w0, $w0
3038; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
3039; MIPS64-N32-NEXT: lw $25, %call16(rintf)($gp)
3040; MIPS64-N32-NEXT: jalr $25
3041; MIPS64-N32-NEXT: mtc1 $1, $f12
3042; MIPS64-N32-NEXT: mfc1 $1, $f0
3043; MIPS64-N32-NEXT: fill.w $w0, $1
3044; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
3045; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
3046; MIPS64-N32-NEXT: sh $1, 0($16)
3047; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
3048; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
3049; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
3050; MIPS64-N32-NEXT: jr $ra
3051; MIPS64-N32-NEXT: addiu $sp, $sp, 32
3052;
3053; MIPS64-N64-LABEL: frint:
3054; MIPS64-N64: # %bb.0: # %entry
3055; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
3056; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
3057; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
3058; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
3059; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
3060; MIPS64-N64-NEXT: .cfi_offset 31, -8
3061; MIPS64-N64-NEXT: .cfi_offset 28, -16
3062; MIPS64-N64-NEXT: .cfi_offset 16, -24
3063; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(frint)))
3064; MIPS64-N64-NEXT: daddu $1, $1, $25
3065; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(frint)))
3066; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
3067; MIPS64-N64-NEXT: lh $1, 0($16)
3068; MIPS64-N64-NEXT: fill.h $w0, $1
3069; MIPS64-N64-NEXT: fexupr.w $w0, $w0
3070; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
3071; MIPS64-N64-NEXT: ld $25, %call16(rintf)($gp)
3072; MIPS64-N64-NEXT: jalr $25
3073; MIPS64-N64-NEXT: mtc1 $1, $f12
3074; MIPS64-N64-NEXT: mfc1 $1, $f0
3075; MIPS64-N64-NEXT: fill.w $w0, $1
3076; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
3077; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
3078; MIPS64-N64-NEXT: sh $1, 0($16)
3079; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
3080; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
3081; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
3082; MIPS64-N64-NEXT: jr $ra
3083; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00003084entry:
Simon Dardis40a50402016-11-21 20:34:10 +00003085 %0 = load i16, i16* @g, align 2
3086 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
3087
Simon Dardis40a50402016-11-21 20:34:10 +00003088 %rint = call float @llvm.rint.f32(float %1)
3089 %2 = call i16 @llvm.convert.to.fp16.f32(float %rint)
3090
Simon Dardis40a50402016-11-21 20:34:10 +00003091 store i16 %2, i16* @g, align 2
3092
Simon Dardis40a50402016-11-21 20:34:10 +00003093 ret void
3094}
3095
3096declare float @llvm.nearbyint.f32(float %Val)
3097
3098define void @fnearbyint() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00003099; MIPS32-LABEL: fnearbyint:
3100; MIPS32: # %bb.0: # %entry
3101; MIPS32-NEXT: lui $2, %hi(_gp_disp)
3102; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
3103; MIPS32-NEXT: addiu $sp, $sp, -24
3104; MIPS32-NEXT: .cfi_def_cfa_offset 24
3105; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
3106; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
3107; MIPS32-NEXT: .cfi_offset 31, -4
3108; MIPS32-NEXT: .cfi_offset 16, -8
3109; MIPS32-NEXT: addu $gp, $2, $25
3110; MIPS32-NEXT: lw $16, %got(g)($gp)
3111; MIPS32-NEXT: lh $1, 0($16)
3112; MIPS32-NEXT: fill.h $w0, $1
3113; MIPS32-NEXT: fexupr.w $w0, $w0
3114; MIPS32-NEXT: copy_s.w $1, $w0[0]
3115; MIPS32-NEXT: lw $25, %call16(nearbyintf)($gp)
3116; MIPS32-NEXT: jalr $25
3117; MIPS32-NEXT: mtc1 $1, $f12
3118; MIPS32-NEXT: mfc1 $1, $f0
3119; MIPS32-NEXT: fill.w $w0, $1
3120; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
3121; MIPS32-NEXT: copy_u.h $1, $w0[0]
3122; MIPS32-NEXT: sh $1, 0($16)
3123; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
3124; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
3125; MIPS32-NEXT: jr $ra
3126; MIPS32-NEXT: addiu $sp, $sp, 24
3127;
3128; MIPS64-N32-LABEL: fnearbyint:
3129; MIPS64-N32: # %bb.0: # %entry
3130; MIPS64-N32-NEXT: addiu $sp, $sp, -32
3131; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
3132; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
3133; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
3134; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
3135; MIPS64-N32-NEXT: .cfi_offset 31, -8
3136; MIPS64-N32-NEXT: .cfi_offset 28, -16
3137; MIPS64-N32-NEXT: .cfi_offset 16, -24
3138; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fnearbyint)))
3139; MIPS64-N32-NEXT: addu $1, $1, $25
3140; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fnearbyint)))
3141; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
3142; MIPS64-N32-NEXT: lh $1, 0($16)
3143; MIPS64-N32-NEXT: fill.h $w0, $1
3144; MIPS64-N32-NEXT: fexupr.w $w0, $w0
3145; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
3146; MIPS64-N32-NEXT: lw $25, %call16(nearbyintf)($gp)
3147; MIPS64-N32-NEXT: jalr $25
3148; MIPS64-N32-NEXT: mtc1 $1, $f12
3149; MIPS64-N32-NEXT: mfc1 $1, $f0
3150; MIPS64-N32-NEXT: fill.w $w0, $1
3151; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
3152; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
3153; MIPS64-N32-NEXT: sh $1, 0($16)
3154; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
3155; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
3156; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
3157; MIPS64-N32-NEXT: jr $ra
3158; MIPS64-N32-NEXT: addiu $sp, $sp, 32
3159;
3160; MIPS64-N64-LABEL: fnearbyint:
3161; MIPS64-N64: # %bb.0: # %entry
3162; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
3163; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
3164; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
3165; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
3166; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
3167; MIPS64-N64-NEXT: .cfi_offset 31, -8
3168; MIPS64-N64-NEXT: .cfi_offset 28, -16
3169; MIPS64-N64-NEXT: .cfi_offset 16, -24
3170; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fnearbyint)))
3171; MIPS64-N64-NEXT: daddu $1, $1, $25
3172; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fnearbyint)))
3173; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
3174; MIPS64-N64-NEXT: lh $1, 0($16)
3175; MIPS64-N64-NEXT: fill.h $w0, $1
3176; MIPS64-N64-NEXT: fexupr.w $w0, $w0
3177; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
3178; MIPS64-N64-NEXT: ld $25, %call16(nearbyintf)($gp)
3179; MIPS64-N64-NEXT: jalr $25
3180; MIPS64-N64-NEXT: mtc1 $1, $f12
3181; MIPS64-N64-NEXT: mfc1 $1, $f0
3182; MIPS64-N64-NEXT: fill.w $w0, $1
3183; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
3184; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
3185; MIPS64-N64-NEXT: sh $1, 0($16)
3186; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
3187; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
3188; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
3189; MIPS64-N64-NEXT: jr $ra
3190; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00003191entry:
Simon Dardis40a50402016-11-21 20:34:10 +00003192 %0 = load i16, i16* @g, align 2
3193 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
3194
Simon Dardis40a50402016-11-21 20:34:10 +00003195
3196 %nearbyint = call float @llvm.nearbyint.f32(float %1)
3197 %2 = call i16 @llvm.convert.to.fp16.f32(float %nearbyint)
3198
Simon Dardis40a50402016-11-21 20:34:10 +00003199
3200 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00003201
3202 ret void
3203}
3204
3205declare float @llvm.round.f32(float %Val)
3206
3207define void @fround() {
Simon Pilgrim68c0e5a2018-10-27 15:00:38 +00003208; MIPS32-LABEL: fround:
3209; MIPS32: # %bb.0: # %entry
3210; MIPS32-NEXT: lui $2, %hi(_gp_disp)
3211; MIPS32-NEXT: addiu $2, $2, %lo(_gp_disp)
3212; MIPS32-NEXT: addiu $sp, $sp, -24
3213; MIPS32-NEXT: .cfi_def_cfa_offset 24
3214; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
3215; MIPS32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
3216; MIPS32-NEXT: .cfi_offset 31, -4
3217; MIPS32-NEXT: .cfi_offset 16, -8
3218; MIPS32-NEXT: addu $gp, $2, $25
3219; MIPS32-NEXT: lw $16, %got(g)($gp)
3220; MIPS32-NEXT: lh $1, 0($16)
3221; MIPS32-NEXT: fill.h $w0, $1
3222; MIPS32-NEXT: fexupr.w $w0, $w0
3223; MIPS32-NEXT: copy_s.w $1, $w0[0]
3224; MIPS32-NEXT: lw $25, %call16(roundf)($gp)
3225; MIPS32-NEXT: jalr $25
3226; MIPS32-NEXT: mtc1 $1, $f12
3227; MIPS32-NEXT: mfc1 $1, $f0
3228; MIPS32-NEXT: fill.w $w0, $1
3229; MIPS32-NEXT: fexdo.h $w0, $w0, $w0
3230; MIPS32-NEXT: copy_u.h $1, $w0[0]
3231; MIPS32-NEXT: sh $1, 0($16)
3232; MIPS32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
3233; MIPS32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
3234; MIPS32-NEXT: jr $ra
3235; MIPS32-NEXT: addiu $sp, $sp, 24
3236;
3237; MIPS64-N32-LABEL: fround:
3238; MIPS64-N32: # %bb.0: # %entry
3239; MIPS64-N32-NEXT: addiu $sp, $sp, -32
3240; MIPS64-N32-NEXT: .cfi_def_cfa_offset 32
3241; MIPS64-N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
3242; MIPS64-N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
3243; MIPS64-N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
3244; MIPS64-N32-NEXT: .cfi_offset 31, -8
3245; MIPS64-N32-NEXT: .cfi_offset 28, -16
3246; MIPS64-N32-NEXT: .cfi_offset 16, -24
3247; MIPS64-N32-NEXT: lui $1, %hi(%neg(%gp_rel(fround)))
3248; MIPS64-N32-NEXT: addu $1, $1, $25
3249; MIPS64-N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(fround)))
3250; MIPS64-N32-NEXT: lw $16, %got_disp(g)($gp)
3251; MIPS64-N32-NEXT: lh $1, 0($16)
3252; MIPS64-N32-NEXT: fill.h $w0, $1
3253; MIPS64-N32-NEXT: fexupr.w $w0, $w0
3254; MIPS64-N32-NEXT: copy_s.w $1, $w0[0]
3255; MIPS64-N32-NEXT: lw $25, %call16(roundf)($gp)
3256; MIPS64-N32-NEXT: jalr $25
3257; MIPS64-N32-NEXT: mtc1 $1, $f12
3258; MIPS64-N32-NEXT: mfc1 $1, $f0
3259; MIPS64-N32-NEXT: fill.w $w0, $1
3260; MIPS64-N32-NEXT: fexdo.h $w0, $w0, $w0
3261; MIPS64-N32-NEXT: copy_u.h $1, $w0[0]
3262; MIPS64-N32-NEXT: sh $1, 0($16)
3263; MIPS64-N32-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
3264; MIPS64-N32-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
3265; MIPS64-N32-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
3266; MIPS64-N32-NEXT: jr $ra
3267; MIPS64-N32-NEXT: addiu $sp, $sp, 32
3268;
3269; MIPS64-N64-LABEL: fround:
3270; MIPS64-N64: # %bb.0: # %entry
3271; MIPS64-N64-NEXT: daddiu $sp, $sp, -32
3272; MIPS64-N64-NEXT: .cfi_def_cfa_offset 32
3273; MIPS64-N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
3274; MIPS64-N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
3275; MIPS64-N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
3276; MIPS64-N64-NEXT: .cfi_offset 31, -8
3277; MIPS64-N64-NEXT: .cfi_offset 28, -16
3278; MIPS64-N64-NEXT: .cfi_offset 16, -24
3279; MIPS64-N64-NEXT: lui $1, %hi(%neg(%gp_rel(fround)))
3280; MIPS64-N64-NEXT: daddu $1, $1, $25
3281; MIPS64-N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(fround)))
3282; MIPS64-N64-NEXT: ld $16, %got_disp(g)($gp)
3283; MIPS64-N64-NEXT: lh $1, 0($16)
3284; MIPS64-N64-NEXT: fill.h $w0, $1
3285; MIPS64-N64-NEXT: fexupr.w $w0, $w0
3286; MIPS64-N64-NEXT: copy_s.w $1, $w0[0]
3287; MIPS64-N64-NEXT: ld $25, %call16(roundf)($gp)
3288; MIPS64-N64-NEXT: jalr $25
3289; MIPS64-N64-NEXT: mtc1 $1, $f12
3290; MIPS64-N64-NEXT: mfc1 $1, $f0
3291; MIPS64-N64-NEXT: fill.w $w0, $1
3292; MIPS64-N64-NEXT: fexdo.h $w0, $w0, $w0
3293; MIPS64-N64-NEXT: copy_u.h $1, $w0[0]
3294; MIPS64-N64-NEXT: sh $1, 0($16)
3295; MIPS64-N64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
3296; MIPS64-N64-NEXT: ld $gp, 16($sp) # 8-byte Folded Reload
3297; MIPS64-N64-NEXT: ld $ra, 24($sp) # 8-byte Folded Reload
3298; MIPS64-N64-NEXT: jr $ra
3299; MIPS64-N64-NEXT: daddiu $sp, $sp, 32
Simon Dardis40a50402016-11-21 20:34:10 +00003300entry:
Simon Dardis40a50402016-11-21 20:34:10 +00003301 %0 = load i16, i16* @g, align 2
3302 %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
3303
Simon Dardis40a50402016-11-21 20:34:10 +00003304
3305 %round = call float @llvm.round.f32(float %1)
3306 %2 = call i16 @llvm.convert.to.fp16.f32(float %round)
3307
Simon Dardis40a50402016-11-21 20:34:10 +00003308
3309 store i16 %2, i16* @g, align 2
Simon Dardis40a50402016-11-21 20:34:10 +00003310
3311 ret void
3312}