Skip to content

Commit cfcac26

Browse files
committed
[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
1 parent 7d8a06e commit cfcac26

File tree

2 files changed

+56
-0
lines changed

2 files changed

+56
-0
lines changed

llvm/lib/Target/CSKY/CSKYISelDAGToDAG.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class CSKYDAGToDAGISel : public SelectionDAGISel {
4343
void Select(SDNode *N) override;
4444
bool selectAddCarry(SDNode *N);
4545
bool selectSubCarry(SDNode *N);
46+
bool selectBITCAST_TO_LOHI(SDNode *N);
4647
bool selectInlineAsm(SDNode *N);
4748

4849
SDNode *createGPRPairNode(EVT VT, SDValue V0, SDValue V1);
@@ -93,6 +94,9 @@ void CSKYDAGToDAGISel::Select(SDNode *N) {
9394
IsSelected = true;
9495
break;
9596
}
97+
case CSKYISD::BITCAST_TO_LOHI:
98+
IsSelected = selectBITCAST_TO_LOHI(N);
99+
break;
96100
case ISD::INLINEASM:
97101
case ISD::INLINEASM_BR:
98102
IsSelected = selectInlineAsm(N);
@@ -267,6 +271,24 @@ bool CSKYDAGToDAGISel::selectInlineAsm(SDNode *N) {
267271
return true;
268272
}
269273

274+
bool CSKYDAGToDAGISel::selectBITCAST_TO_LOHI(SDNode *N) {
275+
SDLoc Dl(N);
276+
auto VT = N->getValueType(0);
277+
auto V = N->getOperand(0);
278+
279+
if (!Subtarget->hasFPUv2DoubleFloat())
280+
return false;
281+
282+
SDValue V1 = SDValue(CurDAG->getMachineNode(CSKY::FMFVRL_D, Dl, VT, V), 0);
283+
SDValue V2 = SDValue(CurDAG->getMachineNode(CSKY::FMFVRH_D, Dl, VT, V), 0);
284+
285+
ReplaceUses(SDValue(N, 0), V1);
286+
ReplaceUses(SDValue(N, 1), V2);
287+
CurDAG->RemoveDeadNode(N);
288+
289+
return true;
290+
}
291+
270292
bool CSKYDAGToDAGISel::selectAddCarry(SDNode *N) {
271293
MachineSDNode *NewNode = nullptr;
272294
auto Type0 = N->getValueType(0);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
3+
; RUN: llc -verify-machineinstrs -csky-no-aliases < %s -mtriple=csky -mattr=+2e3 -mattr=+fpuv2_sf -mattr=+fpuv2_df -mattr=+hard-float | FileCheck %s
4+
5+
define float @FADD_FLOAT(float %x, float %y) {
6+
; CHECK-LABEL: FADD_FLOAT:
7+
; CHECK: # %bb.0: # %entry
8+
; CHECK-NEXT: fmtvrl vr0, a1
9+
; CHECK-NEXT: fmtvrl vr1, a0
10+
; CHECK-NEXT: fadds vr0, vr0, vr1
11+
; CHECK-NEXT: fmfvrl a0, vr0
12+
; CHECK-NEXT: rts16
13+
entry:
14+
%fadd = fadd float %y, %x
15+
ret float %fadd
16+
}
17+
18+
define double @FADD_DOUBLE(double %x, double %y) {
19+
; CHECK-LABEL: FADD_DOUBLE:
20+
; CHECK: # %bb.0: # %entry
21+
; CHECK-NEXT: fmtvrl vr0, a0
22+
; CHECK-NEXT: fmtvrh vr0, a1
23+
; CHECK-NEXT: fmtvrl vr1, a2
24+
; CHECK-NEXT: fmtvrh vr1, a3
25+
; CHECK-NEXT: faddd vr0, vr1, vr0
26+
; CHECK-NEXT: fmfvrl a0, vr0
27+
; CHECK-NEXT: fmfvrh a1, vr0
28+
; CHECK-NEXT: rts16
29+
entry:
30+
%fadd = fadd double %y, %x
31+
ret double %fadd
32+
}
33+
34+

0 commit comments

Comments
 (0)