Skip to content
Snippets Groups Projects
Commit cfcac264 authored by Zi Xuan Wu's avatar Zi Xuan Wu
Browse files

[CSKY] Support bitcast operation from/to double to/from two GPRs

In soft ABI, floating num is passing in GPRs. So we need support
bitcovert from double to Hi and Lo GPRs and vice versa
parent 7d8a06ee
No related branches found
No related tags found
No related merge requests found
......@@ -43,6 +43,7 @@ public:
void Select(SDNode *N) override;
bool selectAddCarry(SDNode *N);
bool selectSubCarry(SDNode *N);
bool selectBITCAST_TO_LOHI(SDNode *N);
bool selectInlineAsm(SDNode *N);
SDNode *createGPRPairNode(EVT VT, SDValue V0, SDValue V1);
......@@ -93,6 +94,9 @@ void CSKYDAGToDAGISel::Select(SDNode *N) {
IsSelected = true;
break;
}
case CSKYISD::BITCAST_TO_LOHI:
IsSelected = selectBITCAST_TO_LOHI(N);
break;
case ISD::INLINEASM:
case ISD::INLINEASM_BR:
IsSelected = selectInlineAsm(N);
......@@ -267,6 +271,24 @@ bool CSKYDAGToDAGISel::selectInlineAsm(SDNode *N) {
return true;
}
bool CSKYDAGToDAGISel::selectBITCAST_TO_LOHI(SDNode *N) {
SDLoc Dl(N);
auto VT = N->getValueType(0);
auto V = N->getOperand(0);
if (!Subtarget->hasFPUv2DoubleFloat())
return false;
SDValue V1 = SDValue(CurDAG->getMachineNode(CSKY::FMFVRL_D, Dl, VT, V), 0);
SDValue V2 = SDValue(CurDAG->getMachineNode(CSKY::FMFVRH_D, Dl, VT, V), 0);
ReplaceUses(SDValue(N, 0), V1);
ReplaceUses(SDValue(N, 1), V2);
CurDAG->RemoveDeadNode(N);
return true;
}
bool CSKYDAGToDAGISel::selectAddCarry(SDNode *N) {
MachineSDNode *NewNode = nullptr;
auto Type0 = N->getValueType(0);
......
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -mattr=+2e3 -mattr=+fpuv2_sf -mattr=+fpuv2_df -mattr=+hard-float | FileCheck %s
define float @FADD_FLOAT(float %x, float %y) {
; CHECK-LABEL: FADD_FLOAT:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: fmtvrl vr0, a1
; CHECK-NEXT: fmtvrl vr1, a0
; CHECK-NEXT: fadds vr0, vr0, vr1
; CHECK-NEXT: fmfvrl a0, vr0
; CHECK-NEXT: rts16
entry:
%fadd = fadd float %y, %x
ret float %fadd
}
define double @FADD_DOUBLE(double %x, double %y) {
; CHECK-LABEL: FADD_DOUBLE:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: fmtvrl vr0, a0
; CHECK-NEXT: fmtvrh vr0, a1
; CHECK-NEXT: fmtvrl vr1, a2
; CHECK-NEXT: fmtvrh vr1, a3
; CHECK-NEXT: faddd vr0, vr1, vr0
; CHECK-NEXT: fmfvrl a0, vr0
; CHECK-NEXT: fmfvrh a1, vr0
; CHECK-NEXT: rts16
entry:
%fadd = fadd double %y, %x
ret double %fadd
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment