@@ -260,3 +260,65 @@ define void @test_vec_fptrunc_double(<4 x double> %a, ptr %p) nounwind {
260260 ret void
261261}
262262
263+ define half @test_fadd_fadd (half %a , half %b , half %c ) nounwind {
264+ ; CHECK-LIBCALL-LABEL: test_fadd_fadd:
265+ ; CHECK-LIBCALL: # %bb.0:
266+ ; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -32
267+ ; CHECK-LIBCALL-NEXT: sdc1 $f20, 24($sp) # 8-byte Folded Spill
268+ ; CHECK-LIBCALL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
269+ ; CHECK-LIBCALL-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
270+ ; CHECK-LIBCALL-NEXT: move $16, $6
271+ ; CHECK-LIBCALL-NEXT: mov.s $f20, $f12
272+ ; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
273+ ; CHECK-LIBCALL-NEXT: mov.s $f12, $f14
274+ ; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
275+ ; CHECK-LIBCALL-NEXT: move $4, $2
276+ ; CHECK-LIBCALL-NEXT: mov.s $f21, $f0
277+ ; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
278+ ; CHECK-LIBCALL-NEXT: mov.s $f12, $f20
279+ ; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
280+ ; CHECK-LIBCALL-NEXT: move $4, $2
281+ ; CHECK-LIBCALL-NEXT: add.s $f20, $f0, $f21
282+ ; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
283+ ; CHECK-LIBCALL-NEXT: mtc1 $16, $f12
284+ ; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
285+ ; CHECK-LIBCALL-NEXT: move $4, $2
286+ ; CHECK-LIBCALL-NEXT: add.s $f0, $f20, $f0
287+ ; CHECK-LIBCALL-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
288+ ; CHECK-LIBCALL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
289+ ; CHECK-LIBCALL-NEXT: ldc1 $f20, 24($sp) # 8-byte Folded Reload
290+ ; CHECK-LIBCALL-NEXT: jr $ra
291+ ; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 32
292+ %d = fadd half %a , %b
293+ %e = fadd half %d , %c
294+ ret half %e
295+ }
296+
297+ define half @to_half (i16 %bits ) nounwind {
298+ ; CHECK-LIBCALL-LABEL: to_half:
299+ ; CHECK-LIBCALL: # %bb.0:
300+ ; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -24
301+ ; CHECK-LIBCALL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
302+ ; CHECK-LIBCALL-NEXT: jal __gnu_h2f_ieee
303+ ; CHECK-LIBCALL-NEXT: nop
304+ ; CHECK-LIBCALL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
305+ ; CHECK-LIBCALL-NEXT: jr $ra
306+ ; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 24
307+ %f = bitcast i16 %bits to half
308+ ret half %f
309+ }
310+
311+ define i16 @from_half (half %f ) nounwind {
312+ ; CHECK-LIBCALL-LABEL: from_half:
313+ ; CHECK-LIBCALL: # %bb.0:
314+ ; CHECK-LIBCALL-NEXT: addiu $sp, $sp, -24
315+ ; CHECK-LIBCALL-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
316+ ; CHECK-LIBCALL-NEXT: jal __gnu_f2h_ieee
317+ ; CHECK-LIBCALL-NEXT: nop
318+ ; CHECK-LIBCALL-NEXT: andi $2, $2, 65535
319+ ; CHECK-LIBCALL-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
320+ ; CHECK-LIBCALL-NEXT: jr $ra
321+ ; CHECK-LIBCALL-NEXT: addiu $sp, $sp, 24
322+ %bits = bitcast half %f to i16
323+ ret i16 %bits
324+ }
0 commit comments