@@ -767,3 +767,73 @@ define i64 @llround_f16(half %a) nounwind strictfp {
767767 %1 = call i64 @llvm.experimental.constrained.llround.i64.f16 (half %a , metadata !"fpexcept.strict" ) strictfp
768768 ret i64 %1
769769}
770+
771+ define half @ldexp_f16 (half %x , i32 signext %y ) nounwind {
772+ ; RV32IZFHMIN-LABEL: ldexp_f16:
773+ ; RV32IZFHMIN: # %bb.0:
774+ ; RV32IZFHMIN-NEXT: addi sp, sp, -16
775+ ; RV32IZFHMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
776+ ; RV32IZFHMIN-NEXT: fcvt.s.h fa0, fa0
777+ ; RV32IZFHMIN-NEXT: call ldexpf
778+ ; RV32IZFHMIN-NEXT: fcvt.h.s fa0, fa0
779+ ; RV32IZFHMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
780+ ; RV32IZFHMIN-NEXT: addi sp, sp, 16
781+ ; RV32IZFHMIN-NEXT: ret
782+ ;
783+ ; RV64IZFHMIN-LABEL: ldexp_f16:
784+ ; RV64IZFHMIN: # %bb.0:
785+ ; RV64IZFHMIN-NEXT: addi sp, sp, -16
786+ ; RV64IZFHMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
787+ ; RV64IZFHMIN-NEXT: fcvt.s.h fa0, fa0
788+ ; RV64IZFHMIN-NEXT: call ldexpf
789+ ; RV64IZFHMIN-NEXT: fcvt.h.s fa0, fa0
790+ ; RV64IZFHMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
791+ ; RV64IZFHMIN-NEXT: addi sp, sp, 16
792+ ; RV64IZFHMIN-NEXT: ret
793+ ;
794+ ; RV32IZHINXMIN-STRICT-LABEL: ldexp_f16:
795+ ; RV32IZHINXMIN-STRICT: # %bb.0:
796+ ; RV32IZHINXMIN-STRICT-NEXT: addi sp, sp, -16
797+ ; RV32IZHINXMIN-STRICT-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
798+ ; RV32IZHINXMIN-STRICT-NEXT: fcvt.s.h a0, a0
799+ ; RV32IZHINXMIN-STRICT-NEXT: call ldexpf
800+ ; RV32IZHINXMIN-STRICT-NEXT: fcvt.h.s a0, a0
801+ ; RV32IZHINXMIN-STRICT-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
802+ ; RV32IZHINXMIN-STRICT-NEXT: addi sp, sp, 16
803+ ; RV32IZHINXMIN-STRICT-NEXT: ret
804+ ;
805+ ; RV64IZHINXMIN-STRICT-LABEL: ldexp_f16:
806+ ; RV64IZHINXMIN-STRICT: # %bb.0:
807+ ; RV64IZHINXMIN-STRICT-NEXT: addi sp, sp, -16
808+ ; RV64IZHINXMIN-STRICT-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
809+ ; RV64IZHINXMIN-STRICT-NEXT: fcvt.s.h a0, a0
810+ ; RV64IZHINXMIN-STRICT-NEXT: call ldexpf
811+ ; RV64IZHINXMIN-STRICT-NEXT: fcvt.h.s a0, a0
812+ ; RV64IZHINXMIN-STRICT-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
813+ ; RV64IZHINXMIN-STRICT-NEXT: addi sp, sp, 16
814+ ; RV64IZHINXMIN-STRICT-NEXT: ret
815+ ;
816+ ; RV32IZDINXZHINXMIN-LABEL: ldexp_f16:
817+ ; RV32IZDINXZHINXMIN: # %bb.0:
818+ ; RV32IZDINXZHINXMIN-NEXT: addi sp, sp, -16
819+ ; RV32IZDINXZHINXMIN-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
820+ ; RV32IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0
821+ ; RV32IZDINXZHINXMIN-NEXT: call ldexpf
822+ ; RV32IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0
823+ ; RV32IZDINXZHINXMIN-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
824+ ; RV32IZDINXZHINXMIN-NEXT: addi sp, sp, 16
825+ ; RV32IZDINXZHINXMIN-NEXT: ret
826+ ;
827+ ; RV64IZDINXZHINXMIN-LABEL: ldexp_f16:
828+ ; RV64IZDINXZHINXMIN: # %bb.0:
829+ ; RV64IZDINXZHINXMIN-NEXT: addi sp, sp, -16
830+ ; RV64IZDINXZHINXMIN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
831+ ; RV64IZDINXZHINXMIN-NEXT: fcvt.s.h a0, a0
832+ ; RV64IZDINXZHINXMIN-NEXT: call ldexpf
833+ ; RV64IZDINXZHINXMIN-NEXT: fcvt.h.s a0, a0
834+ ; RV64IZDINXZHINXMIN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
835+ ; RV64IZDINXZHINXMIN-NEXT: addi sp, sp, 16
836+ ; RV64IZDINXZHINXMIN-NEXT: ret
837+ %z = call half @llvm.experimental.constrained.ldexp.f16.i32 (half %x , i32 %y , metadata !"round.dynamic" , metadata !"fpexcept.strict" ) strictfp
838+ ret half %z
839+ }
0 commit comments