@@ -378,3 +378,84 @@ define half @freeze_half_poison(half %maybe.poison) nounwind {
378378 %t1 = fadd half %y1 , %y1
379379 ret half %t1
380380}
381+
382+ define signext i32 @test_half_to_s32 (half %a ) nounwind {
383+ ; LA32-LABEL: test_half_to_s32:
384+ ; LA32: # %bb.0: # %entry
385+ ; LA32-NEXT: addi.w $sp, $sp, -16
386+ ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
387+ ; LA32-NEXT: bl %plt(__gnu_h2f_ieee)
388+ ; LA32-NEXT: ftintrz.w.s $fa0, $fa0
389+ ; LA32-NEXT: movfr2gr.s $a0, $fa0
390+ ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
391+ ; LA32-NEXT: addi.w $sp, $sp, 16
392+ ; LA32-NEXT: ret
393+ ;
394+ ; LA64-LABEL: test_half_to_s32:
395+ ; LA64: # %bb.0: # %entry
396+ ; LA64-NEXT: addi.d $sp, $sp, -16
397+ ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
398+ ; LA64-NEXT: bl %plt(__gnu_h2f_ieee)
399+ ; LA64-NEXT: ftintrz.w.s $fa0, $fa0
400+ ; LA64-NEXT: movfr2gr.s $a0, $fa0
401+ ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
402+ ; LA64-NEXT: addi.d $sp, $sp, 16
403+ ; LA64-NEXT: ret
404+ entry:
405+ %conv = fptosi half %a to i32
406+ ret i32 %conv
407+ }
408+
409+ define zeroext i32 @test_half_to_s32_u32 (half %a ) nounwind {
410+ ; LA32-LABEL: test_half_to_s32_u32:
411+ ; LA32: # %bb.0: # %entry
412+ ; LA32-NEXT: addi.w $sp, $sp, -16
413+ ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
414+ ; LA32-NEXT: bl %plt(__gnu_h2f_ieee)
415+ ; LA32-NEXT: ftintrz.w.s $fa0, $fa0
416+ ; LA32-NEXT: movfr2gr.s $a0, $fa0
417+ ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
418+ ; LA32-NEXT: addi.w $sp, $sp, 16
419+ ; LA32-NEXT: ret
420+ ;
421+ ; LA64-LABEL: test_half_to_s32_u32:
422+ ; LA64: # %bb.0: # %entry
423+ ; LA64-NEXT: addi.d $sp, $sp, -16
424+ ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
425+ ; LA64-NEXT: bl %plt(__gnu_h2f_ieee)
426+ ; LA64-NEXT: ftintrz.w.s $fa0, $fa0
427+ ; LA64-NEXT: movfr2gr.s $a0, $fa0
428+ ; LA64-NEXT: bstrpick.d $a0, $a0, 31, 0
429+ ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
430+ ; LA64-NEXT: addi.d $sp, $sp, 16
431+ ; LA64-NEXT: ret
432+ entry:
433+ %conv = fptosi half %a to i32
434+ ret i32 %conv
435+ }
436+
437+ define i64 @test_half_to_i64 (half %a ) nounwind {
438+ ; LA32-LABEL: test_half_to_i64:
439+ ; LA32: # %bb.0: # %entry
440+ ; LA32-NEXT: addi.w $sp, $sp, -16
441+ ; LA32-NEXT: st.w $ra, $sp, 12 # 4-byte Folded Spill
442+ ; LA32-NEXT: bl %plt(__gnu_h2f_ieee)
443+ ; LA32-NEXT: bl %plt(__fixsfdi)
444+ ; LA32-NEXT: ld.w $ra, $sp, 12 # 4-byte Folded Reload
445+ ; LA32-NEXT: addi.w $sp, $sp, 16
446+ ; LA32-NEXT: ret
447+ ;
448+ ; LA64-LABEL: test_half_to_i64:
449+ ; LA64: # %bb.0: # %entry
450+ ; LA64-NEXT: addi.d $sp, $sp, -16
451+ ; LA64-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill
452+ ; LA64-NEXT: bl %plt(__gnu_h2f_ieee)
453+ ; LA64-NEXT: ftintrz.l.s $fa0, $fa0
454+ ; LA64-NEXT: movfr2gr.d $a0, $fa0
455+ ; LA64-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload
456+ ; LA64-NEXT: addi.d $sp, $sp, 16
457+ ; LA64-NEXT: ret
458+ entry:
459+ %conv = fptosi half %a to i64
460+ ret i64 %conv
461+ }
0 commit comments