@@ -3312,3 +3312,141 @@ define half @ldexp_half(half %x, i32 signext %y) nounwind {
33123312 %z = call half @llvm.ldexp.f16.i32 (half %x , i32 %y )
33133313 ret half %z
33143314}
3315+
3316+ define {half , i32 } @frexp_half (half %x ) nounwind {
3317+ ; RV32IZFH-LABEL: frexp_half:
3318+ ; RV32IZFH: # %bb.0:
3319+ ; RV32IZFH-NEXT: addi sp, sp, -16
3320+ ; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3321+ ; RV32IZFH-NEXT: fcvt.s.h fa0, fa0
3322+ ; RV32IZFH-NEXT: addi a0, sp, 8
3323+ ; RV32IZFH-NEXT: call frexpf
3324+ ; RV32IZFH-NEXT: lw a0, 8(sp)
3325+ ; RV32IZFH-NEXT: fcvt.h.s fa0, fa0
3326+ ; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3327+ ; RV32IZFH-NEXT: addi sp, sp, 16
3328+ ; RV32IZFH-NEXT: ret
3329+ ;
3330+ ; RV64IZFH-LABEL: frexp_half:
3331+ ; RV64IZFH: # %bb.0:
3332+ ; RV64IZFH-NEXT: addi sp, sp, -16
3333+ ; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3334+ ; RV64IZFH-NEXT: fcvt.s.h fa0, fa0
3335+ ; RV64IZFH-NEXT: mv a0, sp
3336+ ; RV64IZFH-NEXT: call frexpf
3337+ ; RV64IZFH-NEXT: ld a0, 0(sp)
3338+ ; RV64IZFH-NEXT: fcvt.h.s fa0, fa0
3339+ ; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3340+ ; RV64IZFH-NEXT: addi sp, sp, 16
3341+ ; RV64IZFH-NEXT: ret
3342+ ;
3343+ ; RV32IZHINX-LABEL: frexp_half:
3344+ ; RV32IZHINX: # %bb.0:
3345+ ; RV32IZHINX-NEXT: addi sp, sp, -16
3346+ ; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3347+ ; RV32IZHINX-NEXT: fcvt.s.h a0, a0
3348+ ; RV32IZHINX-NEXT: addi a1, sp, 8
3349+ ; RV32IZHINX-NEXT: call frexpf
3350+ ; RV32IZHINX-NEXT: lw a1, 8(sp)
3351+ ; RV32IZHINX-NEXT: fcvt.h.s a0, a0
3352+ ; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3353+ ; RV32IZHINX-NEXT: addi sp, sp, 16
3354+ ; RV32IZHINX-NEXT: ret
3355+ ;
3356+ ; RV64IZHINX-LABEL: frexp_half:
3357+ ; RV64IZHINX: # %bb.0:
3358+ ; RV64IZHINX-NEXT: addi sp, sp, -16
3359+ ; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3360+ ; RV64IZHINX-NEXT: fcvt.s.h a0, a0
3361+ ; RV64IZHINX-NEXT: mv a1, sp
3362+ ; RV64IZHINX-NEXT: call frexpf
3363+ ; RV64IZHINX-NEXT: ld a1, 0(sp)
3364+ ; RV64IZHINX-NEXT: fcvt.h.s a0, a0
3365+ ; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3366+ ; RV64IZHINX-NEXT: addi sp, sp, 16
3367+ ; RV64IZHINX-NEXT: ret
3368+ ;
3369+ ; RV32I-LABEL: frexp_half:
3370+ ; RV32I: # %bb.0:
3371+ ; RV32I-NEXT: addi sp, sp, -16
3372+ ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3373+ ; RV32I-NEXT: slli a0, a0, 16
3374+ ; RV32I-NEXT: srli a0, a0, 16
3375+ ; RV32I-NEXT: call __extendhfsf2
3376+ ; RV32I-NEXT: addi a1, sp, 8
3377+ ; RV32I-NEXT: call frexpf
3378+ ; RV32I-NEXT: call __truncsfhf2
3379+ ; RV32I-NEXT: lw a1, 8(sp)
3380+ ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3381+ ; RV32I-NEXT: addi sp, sp, 16
3382+ ; RV32I-NEXT: ret
3383+ ;
3384+ ; RV64I-LABEL: frexp_half:
3385+ ; RV64I: # %bb.0:
3386+ ; RV64I-NEXT: addi sp, sp, -16
3387+ ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3388+ ; RV64I-NEXT: slli a0, a0, 48
3389+ ; RV64I-NEXT: srli a0, a0, 48
3390+ ; RV64I-NEXT: call __extendhfsf2
3391+ ; RV64I-NEXT: addi a1, sp, 4
3392+ ; RV64I-NEXT: call frexpf
3393+ ; RV64I-NEXT: call __truncsfhf2
3394+ ; RV64I-NEXT: lw a1, 4(sp)
3395+ ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3396+ ; RV64I-NEXT: addi sp, sp, 16
3397+ ; RV64I-NEXT: ret
3398+ ;
3399+ ; RV32IZFHMIN-LABEL: frexp_half:
3400+ ; RV32IZFHMIN: # %bb.0:
3401+ ; RV32IZFHMIN-NEXT: addi sp, sp, -16
3402+ ; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3403+ ; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0
3404+ ; RV32IZFHMIN-NEXT: addi a0, sp, 8
3405+ ; RV32IZFHMIN-NEXT: call frexpf
3406+ ; RV32IZFHMIN-NEXT: lw a0, 8(sp)
3407+ ; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0
3408+ ; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3409+ ; RV32IZFHMIN-NEXT: addi sp, sp, 16
3410+ ; RV32IZFHMIN-NEXT: ret
3411+ ;
3412+ ; RV64IZFHMIN-LABEL: frexp_half:
3413+ ; RV64IZFHMIN: # %bb.0:
3414+ ; RV64IZFHMIN-NEXT: addi sp, sp, -16
3415+ ; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3416+ ; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0
3417+ ; RV64IZFHMIN-NEXT: mv a0, sp
3418+ ; RV64IZFHMIN-NEXT: call frexpf
3419+ ; RV64IZFHMIN-NEXT: ld a0, 0(sp)
3420+ ; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0
3421+ ; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3422+ ; RV64IZFHMIN-NEXT: addi sp, sp, 16
3423+ ; RV64IZFHMIN-NEXT: ret
3424+ ;
3425+ ; RV32IZHINXMIN-LABEL: frexp_half:
3426+ ; RV32IZHINXMIN: # %bb.0:
3427+ ; RV32IZHINXMIN-NEXT: addi sp, sp, -16
3428+ ; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3429+ ; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0
3430+ ; RV32IZHINXMIN-NEXT: addi a1, sp, 8
3431+ ; RV32IZHINXMIN-NEXT: call frexpf
3432+ ; RV32IZHINXMIN-NEXT: lw a1, 8(sp)
3433+ ; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0
3434+ ; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3435+ ; RV32IZHINXMIN-NEXT: addi sp, sp, 16
3436+ ; RV32IZHINXMIN-NEXT: ret
3437+ ;
3438+ ; RV64IZHINXMIN-LABEL: frexp_half:
3439+ ; RV64IZHINXMIN: # %bb.0:
3440+ ; RV64IZHINXMIN-NEXT: addi sp, sp, -16
3441+ ; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3442+ ; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0
3443+ ; RV64IZHINXMIN-NEXT: mv a1, sp
3444+ ; RV64IZHINXMIN-NEXT: call frexpf
3445+ ; RV64IZHINXMIN-NEXT: ld a1, 0(sp)
3446+ ; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0
3447+ ; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3448+ ; RV64IZHINXMIN-NEXT: addi sp, sp, 16
3449+ ; RV64IZHINXMIN-NEXT: ret
3450+ %a = call {half , i32 } @llvm.frexp.f16.i32 (half %x )
3451+ ret {half , i32 } %a
3452+ }
0 commit comments