@@ -3186,3 +3186,129 @@ define half @minimumnum_half(half %x, half %y) {
31863186 %z = call half @llvm.minimumnum.f16 (half %x , half %y )
31873187 ret half %z
31883188}
3189+
3190+ define half @ldexp_half (half %x , i32 signext %y ) nounwind {
3191+ ; RV32IZFH-LABEL: ldexp_half:
3192+ ; RV32IZFH: # %bb.0:
3193+ ; RV32IZFH-NEXT: addi sp, sp, -16
3194+ ; RV32IZFH-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3195+ ; RV32IZFH-NEXT: fcvt.s.h fa0, fa0
3196+ ; RV32IZFH-NEXT: call ldexpf
3197+ ; RV32IZFH-NEXT: fcvt.h.s fa0, fa0
3198+ ; RV32IZFH-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3199+ ; RV32IZFH-NEXT: addi sp, sp, 16
3200+ ; RV32IZFH-NEXT: ret
3201+ ;
3202+ ; RV64IZFH-LABEL: ldexp_half:
3203+ ; RV64IZFH: # %bb.0:
3204+ ; RV64IZFH-NEXT: addi sp, sp, -16
3205+ ; RV64IZFH-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3206+ ; RV64IZFH-NEXT: fcvt.s.h fa0, fa0
3207+ ; RV64IZFH-NEXT: call ldexpf
3208+ ; RV64IZFH-NEXT: fcvt.h.s fa0, fa0
3209+ ; RV64IZFH-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3210+ ; RV64IZFH-NEXT: addi sp, sp, 16
3211+ ; RV64IZFH-NEXT: ret
3212+ ;
3213+ ; RV32IZHINX-LABEL: ldexp_half:
3214+ ; RV32IZHINX: # %bb.0:
3215+ ; RV32IZHINX-NEXT: addi sp, sp, -16
3216+ ; RV32IZHINX-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3217+ ; RV32IZHINX-NEXT: fcvt.s.h a0, a0
3218+ ; RV32IZHINX-NEXT: call ldexpf
3219+ ; RV32IZHINX-NEXT: fcvt.h.s a0, a0
3220+ ; RV32IZHINX-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3221+ ; RV32IZHINX-NEXT: addi sp, sp, 16
3222+ ; RV32IZHINX-NEXT: ret
3223+ ;
3224+ ; RV64IZHINX-LABEL: ldexp_half:
3225+ ; RV64IZHINX: # %bb.0:
3226+ ; RV64IZHINX-NEXT: addi sp, sp, -16
3227+ ; RV64IZHINX-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3228+ ; RV64IZHINX-NEXT: fcvt.s.h a0, a0
3229+ ; RV64IZHINX-NEXT: call ldexpf
3230+ ; RV64IZHINX-NEXT: fcvt.h.s a0, a0
3231+ ; RV64IZHINX-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3232+ ; RV64IZHINX-NEXT: addi sp, sp, 16
3233+ ; RV64IZHINX-NEXT: ret
3234+ ;
3235+ ; RV32I-LABEL: ldexp_half:
3236+ ; RV32I: # %bb.0:
3237+ ; RV32I-NEXT: addi sp, sp, -16
3238+ ; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3239+ ; RV32I-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
3240+ ; RV32I-NEXT: mv s0, a1
3241+ ; RV32I-NEXT: slli a0, a0, 16
3242+ ; RV32I-NEXT: srli a0, a0, 16
3243+ ; RV32I-NEXT: call __extendhfsf2
3244+ ; RV32I-NEXT: mv a1, s0
3245+ ; RV32I-NEXT: call ldexpf
3246+ ; RV32I-NEXT: call __truncsfhf2
3247+ ; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3248+ ; RV32I-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
3249+ ; RV32I-NEXT: addi sp, sp, 16
3250+ ; RV32I-NEXT: ret
3251+ ;
3252+ ; RV64I-LABEL: ldexp_half:
3253+ ; RV64I: # %bb.0:
3254+ ; RV64I-NEXT: addi sp, sp, -16
3255+ ; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3256+ ; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill
3257+ ; RV64I-NEXT: mv s0, a1
3258+ ; RV64I-NEXT: slli a0, a0, 48
3259+ ; RV64I-NEXT: srli a0, a0, 48
3260+ ; RV64I-NEXT: call __extendhfsf2
3261+ ; RV64I-NEXT: mv a1, s0
3262+ ; RV64I-NEXT: call ldexpf
3263+ ; RV64I-NEXT: call __truncsfhf2
3264+ ; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3265+ ; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload
3266+ ; RV64I-NEXT: addi sp, sp, 16
3267+ ; RV64I-NEXT: ret
3268+ ;
3269+ ; RV32IZFHMIN-LABEL: ldexp_half:
3270+ ; RV32IZFHMIN: # %bb.0:
3271+ ; RV32IZFHMIN-NEXT: addi sp, sp, -16
3272+ ; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3273+ ; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0
3274+ ; RV32IZFHMIN-NEXT: call ldexpf
3275+ ; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0
3276+ ; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3277+ ; RV32IZFHMIN-NEXT: addi sp, sp, 16
3278+ ; RV32IZFHMIN-NEXT: ret
3279+ ;
3280+ ; RV64IZFHMIN-LABEL: ldexp_half:
3281+ ; RV64IZFHMIN: # %bb.0:
3282+ ; RV64IZFHMIN-NEXT: addi sp, sp, -16
3283+ ; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3284+ ; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0
3285+ ; RV64IZFHMIN-NEXT: call ldexpf
3286+ ; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0
3287+ ; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3288+ ; RV64IZFHMIN-NEXT: addi sp, sp, 16
3289+ ; RV64IZFHMIN-NEXT: ret
3290+ ;
3291+ ; RV32IZHINXMIN-LABEL: ldexp_half:
3292+ ; RV32IZHINXMIN: # %bb.0:
3293+ ; RV32IZHINXMIN-NEXT: addi sp, sp, -16
3294+ ; RV32IZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
3295+ ; RV32IZHINXMIN-NEXT: fcvt.s.h a0, a0
3296+ ; RV32IZHINXMIN-NEXT: call ldexpf
3297+ ; RV32IZHINXMIN-NEXT: fcvt.h.s a0, a0
3298+ ; RV32IZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
3299+ ; RV32IZHINXMIN-NEXT: addi sp, sp, 16
3300+ ; RV32IZHINXMIN-NEXT: ret
3301+ ;
3302+ ; RV64IZHINXMIN-LABEL: ldexp_half:
3303+ ; RV64IZHINXMIN: # %bb.0:
3304+ ; RV64IZHINXMIN-NEXT: addi sp, sp, -16
3305+ ; RV64IZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
3306+ ; RV64IZHINXMIN-NEXT: fcvt.s.h a0, a0
3307+ ; RV64IZHINXMIN-NEXT: call ldexpf
3308+ ; RV64IZHINXMIN-NEXT: fcvt.h.s a0, a0
3309+ ; RV64IZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
3310+ ; RV64IZHINXMIN-NEXT: addi sp, sp, 16
3311+ ; RV64IZHINXMIN-NEXT: ret
3312+ %z = call half @llvm.ldexp.f16.i32 (half %x , i32 %y )
3313+ ret half %z
3314+ }
0 commit comments