Skip to content

Commit 166f241

Browse files
committed
[LoongArch] Supports FP_TO_SINT operation for fp16
Fixes #118301
1 parent 9448844 commit 166f241

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1669,16 +1669,19 @@ SDValue LoongArchTargetLowering::lowerFP_TO_SINT(SDValue Op,
16691669
SelectionDAG &DAG) const {
16701670

16711671
SDLoc DL(Op);
1672+
SDValue Op0 = Op.getOperand(0);
1673+
1674+
if (Op0.getValueType() == MVT::f16)
1675+
Op0 = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, Op0);
16721676

16731677
if (Op.getValueSizeInBits() > 32 && Subtarget.hasBasicF() &&
16741678
!Subtarget.hasBasicD()) {
1675-
SDValue Dst =
1676-
DAG.getNode(LoongArchISD::FTINT, DL, MVT::f32, Op.getOperand(0));
1679+
SDValue Dst = DAG.getNode(LoongArchISD::FTINT, DL, MVT::f32, Op0);
16771680
return DAG.getNode(LoongArchISD::MOVFR2GR_S_LA64, DL, MVT::i64, Dst);
16781681
}
16791682

16801683
EVT FPTy = EVT::getFloatingPointVT(Op.getValueSizeInBits());
1681-
SDValue Trunc = DAG.getNode(LoongArchISD::FTINT, DL, FPTy, Op.getOperand(0));
1684+
SDValue Trunc = DAG.getNode(LoongArchISD::FTINT, DL, FPTy, Op0);
16821685
return DAG.getNode(ISD::BITCAST, DL, Op.getValueType(), Trunc);
16831686
}
16841687

@@ -2872,6 +2875,10 @@ void LoongArchTargetLowering::ReplaceNodeResults(
28722875
EVT FVT = EVT::getFloatingPointVT(N->getValueSizeInBits(0));
28732876
if (getTypeAction(*DAG.getContext(), Src.getValueType()) !=
28742877
TargetLowering::TypeSoftenFloat) {
2878+
if (!isTypeLegal(Src.getValueType()))
2879+
return;
2880+
if (Src.getValueType() == MVT::f16)
2881+
Src = DAG.getNode(ISD::FP_EXTEND, DL, MVT::f32, Src);
28752882
SDValue Dst = DAG.getNode(LoongArchISD::FTINT, DL, FVT, Src);
28762883
Results.push_back(DAG.getNode(ISD::BITCAST, DL, VT, Dst));
28772884
return;

llvm/test/CodeGen/LoongArch/fp16-promote.ll

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -378,3 +378,30 @@ 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_i32(half %a) nounwind {
383+
; LA32-LABEL: test_half_to_i32:
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_i32:
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.l.s $fa0, $fa0
400+
; LA64-NEXT: movfr2gr.d $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+
}

0 commit comments

Comments
 (0)