[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / Mips / msa / f16-llvm-ir.ll
blob3c1aa8b4792bab9b5cf454f39c643fa6e8758bf7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -relocation-model=pic -mtriple=mipsel-- -mcpu=mips32r5 -mattr=+abs2008 \
3 ; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -mips-jalr-reloc=false < %s | FileCheck %s \
4 ; RUN:     --check-prefixes=ALL,MIPS32,MIPSR5,MIPS32-O32,MIPS32R5-O32
5 ; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r5 -mattr=+abs2008 \
6 ; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -target-abi n32 -mips-jalr-reloc=false < %s | FileCheck %s \
7 ; RUN:     --check-prefixes=ALL,MIPS64,MIPSR5,MIPS64-N32,MIPS64R5-N32
8 ; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r5 -mattr=+abs2008 \
9 ; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -target-abi n64 -mips-jalr-reloc=false < %s | FileCheck %s \
10 ; RUN:     --check-prefixes=ALL,MIPS64,MIPSR5,MIPS64-N64,MIPS64R5-N64
12 ; RUN: llc -relocation-model=pic -mtriple=mipsel-- -mcpu=mips32r6 \
13 ; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -mips-jalr-reloc=false < %s | FileCheck %s \
14 ; RUN:     --check-prefixes=ALL,MIPS32,MIPSR6,MIPSR6-O32
15 ; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r6 \
16 ; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -target-abi n32 -mips-jalr-reloc=false < %s | FileCheck %s \
17 ; RUN:     --check-prefixes=ALL,MIPS64,MIPSR6,MIPS64-N32,MIPSR6-N32
18 ; RUN: llc -relocation-model=pic -mtriple=mips64el-- -mcpu=mips64r6 \
19 ; RUN:     -mattr=+fp64,+msa -verify-machineinstrs -target-abi n64 -mips-jalr-reloc=false < %s | FileCheck %s \
20 ; RUN:     --check-prefixes=ALL,MIPS64,MIPSR6,MIPS64-N64,MIPSR6-N64
23 ; Check the use of frame indexes in the msa pseudo f16 instructions.
25 @k = external global float
27 declare float @k2(half *)
29 define void @f3(i16 %b) {
30 ; 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
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
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
96 entry:
97   %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
105 define void  @f(i16 %b) {
106 ; 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
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
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
159   %1 = bitcast i16 %b to half
160   %2 = fpext half %1 to float
161   store float %2, float * @k
162   ret void
165 @g = external global i16, align 2
166 @h = external global half, align 2
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.
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.
175 define void @fadd_f64() {
176 ; 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)
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)
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)
243 entry:
244   %0 = load half, half * @h, align 2
245   %1 = fpext half %0 to double
246   %2 = load half, half * @h, align 2
247   %3 = fpext half %2 to double
248   %add = fadd double %1, %3
249   %4 = fptrunc double %add to half
250    store half %4, half * @h, align 2
251   ret void
254 ; Entire fp16 (unsigned) range fits into (signed) i32.
255 define i32 @ffptoui() {
256 ; 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
274 ; 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
290 ; 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
305 entry:
306   %0 = load half, half * @h, align 2
307   %1 = fptoui half %0 to i32
308   ret i32 %1
311 define i32 @ffptosi() {
312 ; 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
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
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
361 entry:
362   %0 = load half, half * @h, align 2
363   %1 = fptosi half %0 to i32
364   ret i32 %1
371 define void @uitofp(i32 %a) {
372 ; 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
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
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
448 entry:
458   %0 = uitofp i32 %a to half
459   store half %0, half * @h, align 2
460   ret void
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.
467 define void @fadd() {
468 ; 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)
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)
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)
524 entry:
525   %0 = load i16, i16* @g, align 2
526   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
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
534  %4 = call i16 @llvm.convert.to.fp16.f32(float %add)
536    store i16 %4, i16* @g, align 2
537   ret void
540 ; Function Attrs: nounwind readnone
541 declare float @llvm.convert.from.fp16.f32(i16)
543 ; Function Attrs: nounwind readnone
544 declare i16 @llvm.convert.to.fp16.f32(float)
546 ; Function Attrs: nounwind
547 define void @fsub() {
548 ; 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)
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)
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)
604 entry:
605   %0 = load i16, i16* @g, align 2
606   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
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
614   %4 = call i16 @llvm.convert.to.fp16.f32(float %sub)
617   store i16 %4, i16* @g, align 2
618   ret void
621 define void @fmult() {
622 ; 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)
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)
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)
678 entry:
679   %0 = load i16, i16* @g, align 2
680   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
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
688   %4 = call i16 @llvm.convert.to.fp16.f32(float %mul)
691   store i16 %4, i16* @g, align 2
693   ret void
696 define void @fdiv() {
697 ; 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)
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)
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)
753 entry:
755   %0 = load i16, i16* @g, align 2
756   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
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
764   %4 = call i16 @llvm.convert.to.fp16.f32(float %div)
766   store i16 %4, i16* @g, align 2
767   ret void
770 define void @frem() {
771 ; 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
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
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
866 entry:
867   %0 = load i16, i16* @g, align 2
868   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
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
876   %4 = call i16 @llvm.convert.to.fp16.f32(float %rem)
879   store i16 %4, i16* @g, align 2
881   ret void
884 @i1 = external global i16, align 1
886 define void @fcmp() {
887 ; 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)
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)
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)
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)
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)
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)
997 entry:
998   %0 = load i16, i16* @g, align 2
999   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
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
1006   %4 = zext i1 %fcmp to i16
1007   store i16 %4, i16* @i1, align 2
1009   ret void
1012 declare float @llvm.powi.f32(float, i32)
1014 define void @fpowi() {
1015 ; 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)
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)
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)
1071 entry:
1072   %0 = load i16, i16* @g, align 2
1073   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1076   %powi = call float @llvm.powi.f32(float %1, i32 2)
1079   %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)
1082   store i16 %2, i16* @g, align 2
1083   ret void
1086 define void @fpowi_var(i32 %var) {
1087 ; 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
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
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
1182 entry:
1183   %0 = load i16, i16* @g, align 2
1184   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1187   %powi = call float @llvm.powi.f32(float %1, i32 %var)
1190   %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)
1193   store i16 %2, i16* @g, align 2
1194   ret void
1197 declare float @llvm.pow.f32(float %Val, float %power)
1199 define void @fpow(float %var) {
1200 ; 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
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
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
1295 entry:
1296   %0 = load i16, i16* @g, align 2
1297   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1300   %powi = call float @llvm.pow.f32(float %1, float %var)
1303   %2 = call i16 @llvm.convert.to.fp16.f32(float %powi)
1306   store i16 %2, i16* @g, align 2
1307   ret void
1310 declare float @llvm.log2.f32(float %Val)
1312 define void @flog2() {
1313 ; 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
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
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
1405 entry:
1406   %0 = load i16, i16* @g, align 2
1407   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1410   %log2 = call float @llvm.log2.f32(float %1)
1411   %2 = call i16 @llvm.convert.to.fp16.f32(float %log2)
1414   store i16 %2, i16* @g, align 2
1416   ret void
1419 declare float @llvm.log10.f32(float %Val)
1421 define void @flog10() {
1422 ; 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
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
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
1514 entry:
1515   %0 = load i16, i16* @g, align 2
1516   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1519   %log10 = call float @llvm.log10.f32(float %1)
1520   %2 = call i16 @llvm.convert.to.fp16.f32(float %log10)
1523   store i16 %2, i16* @g, align 2
1525   ret void
1528 declare float @llvm.sqrt.f32(float %Val)
1530 define void @fsqrt() {
1531 ; 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)
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)
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)
1587 entry:
1588   %0 = load i16, i16* @g, align 2
1589   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1592   %sqrt = call float @llvm.sqrt.f32(float %1)
1593   %2 = call i16 @llvm.convert.to.fp16.f32(float %sqrt)
1596   store i16 %2, i16* @g, align 2
1598   ret void
1601 declare float @llvm.sin.f32(float %Val)
1603 define void @fsin() {
1604 ; 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
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
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
1696 entry:
1697   %0 = load i16, i16* @g, align 2
1698   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1701   %sin = call float @llvm.sin.f32(float %1)
1702   %2 = call i16 @llvm.convert.to.fp16.f32(float %sin)
1705   store i16 %2, i16* @g, align 2
1707   ret void
1710 declare float @llvm.cos.f32(float %Val)
1712 define void @fcos() {
1713 ; 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
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
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
1805 entry:
1806   %0 = load i16, i16* @g, align 2
1807   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1810   %cos = call float @llvm.cos.f32(float %1)
1811   %2 = call i16 @llvm.convert.to.fp16.f32(float %cos)
1814   store i16 %2, i16* @g, align 2
1816   ret void
1819 declare float @llvm.exp.f32(float %Val)
1821 define void @fexp() {
1822 ; 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
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
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
1914 entry:
1915   %0 = load i16, i16* @g, align 2
1916   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
1918   %exp = call float @llvm.exp.f32(float %1)
1919   %2 = call i16 @llvm.convert.to.fp16.f32(float %exp)
1922   store i16 %2, i16* @g, align 2
1924   ret void
1927 declare float @llvm.exp2.f32(float %Val)
1929 define void @fexp2() {
1930 ; 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
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
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
2022 entry:
2023   %0 = load i16, i16* @g, align 2
2024   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2027   %exp2 = call float @llvm.exp2.f32(float %1)
2028   %2 = call i16 @llvm.convert.to.fp16.f32(float %exp2)
2031   store i16 %2, i16* @g, align 2
2033   ret void
2036 declare float @llvm.fma.f32(float, float, float)
2038 define void @ffma(float %b, float %c) {
2039 ; 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
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
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
2138 entry:
2139   %0 = load i16, i16* @g, align 2
2140   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2143   %fma = call float @llvm.fma.f32(float %1, float %b, float %c)
2144   %2 = call i16 @llvm.convert.to.fp16.f32(float %fma)
2147   store i16 %2, i16* @g, align 2
2149   ret void
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.
2155 declare float @llvm.fmuladd.f32(float, float, float)
2157 define void @ffmuladd(float %b, float %c) {
2158 ; 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)
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)
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)
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)
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)
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)
2274 entry:
2275   %0 = load i16, i16* @g, align 2
2276   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2278 ; 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
2281   %fmuladd = call float @llvm.fmuladd.f32(float %1, float %b, float %c)
2282   %2 = call i16 @llvm.convert.to.fp16.f32(float %fmuladd)
2285   store i16 %2, i16* @g, align 2
2287   ret void
2290 declare float @llvm.fabs.f32(float %Val)
2292 define void @ffabs() {
2293 ; 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)
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)
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)
2349 entry:
2350   %0 = load i16, i16* @g, align 2
2351   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2354   %fabs = call float @llvm.fabs.f32(float %1)
2355   %2 = call i16 @llvm.convert.to.fp16.f32(float %fabs)
2358   store i16 %2, i16* @g, align 2
2360   ret void
2363 declare float @llvm.minnum.f32(float %Val, float %b)
2365 define void @fminnum(float %b) {
2366 ; 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
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
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
2461 entry:
2462   %0 = load i16, i16* @g, align 2
2463   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2466   %minnum = call float @llvm.minnum.f32(float %1, float %b)
2467   %2 = call i16 @llvm.convert.to.fp16.f32(float %minnum)
2470   store i16 %2, i16* @g, align 2
2472   ret void
2475 declare float @llvm.maxnum.f32(float %Val, float %b)
2477 define void @fmaxnum(float %b) {
2478 ; 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
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
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
2573 entry:
2574   %0 = load i16, i16* @g, align 2
2575   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2578   %maxnum = call float @llvm.maxnum.f32(float %1, float %b)
2579   %2 = call i16 @llvm.convert.to.fp16.f32(float %maxnum)
2582   store i16 %2, i16* @g, align 2
2584   ret void
2587 ; This expansion of fcopysign could be done without converting f16 to float.
2589 declare float @llvm.copysign.f32(float %Val, float %b)
2591 define void @fcopysign(float %b) {
2592 ; 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)
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)
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)
2648 entry:
2649   %0 = load i16, i16* @g, align 2
2650   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2653   %copysign = call float @llvm.copysign.f32(float %1, float %b)
2654   %2 = call i16 @llvm.convert.to.fp16.f32(float %copysign)
2657   store i16 %2, i16* @g, align 2
2659   ret void
2662 declare float @llvm.floor.f32(float %Val)
2664 define void @ffloor() {
2665 ; 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
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
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
2757 entry:
2758   %0 = load i16, i16* @g, align 2
2759   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2762   %floor = call float @llvm.floor.f32(float %1)
2763   %2 = call i16 @llvm.convert.to.fp16.f32(float %floor)
2766   store i16 %2, i16* @g, align 2
2768   ret void
2771 declare float @llvm.ceil.f32(float %Val)
2773 define void @fceil() {
2774 ; 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
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
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
2866 entry:
2867   %0 = load i16, i16* @g, align 2
2868   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2871   %ceil = call float @llvm.ceil.f32(float %1)
2872   %2 = call i16 @llvm.convert.to.fp16.f32(float %ceil)
2875   store i16 %2, i16* @g, align 2
2877   ret void
2880 declare float @llvm.trunc.f32(float %Val)
2882 define void @ftrunc() {
2883 ; 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
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
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
2975 entry:
2976   %0 = load i16, i16* @g, align 2
2977   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
2980   %trunc = call float @llvm.trunc.f32(float %1)
2981   %2 = call i16 @llvm.convert.to.fp16.f32(float %trunc)
2984   store i16 %2, i16* @g, align 2
2986   ret void
2989 declare float @llvm.rint.f32(float %Val)
2991 define void @frint() {
2992 ; 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
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
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
3084 entry:
3085   %0 = load i16, i16* @g, align 2
3086   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
3088   %rint = call float @llvm.rint.f32(float %1)
3089   %2 = call i16 @llvm.convert.to.fp16.f32(float %rint)
3091   store i16 %2, i16* @g, align 2
3093   ret void
3096 declare float @llvm.nearbyint.f32(float %Val)
3098 define void @fnearbyint() {
3099 ; 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
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
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
3191 entry:
3192   %0 = load i16, i16* @g, align 2
3193   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
3196   %nearbyint = call float @llvm.nearbyint.f32(float %1)
3197   %2 = call i16 @llvm.convert.to.fp16.f32(float %nearbyint)
3200   store i16 %2, i16* @g, align 2
3202   ret void
3205 declare float @llvm.round.f32(float %Val)
3207 define void @fround() {
3208 ; 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
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
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
3300 entry:
3301   %0 = load i16, i16* @g, align 2
3302   %1 = call float @llvm.convert.from.fp16.f32(i16 %0)
3305   %round = call float @llvm.round.f32(float %1)
3306   %2 = call i16 @llvm.convert.to.fp16.f32(float %round)
3309   store i16 %2, i16* @g, align 2
3311   ret void