@@ -19226,6 +19226,19 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
19226
19226
// similar local variables rather than directly checking against the target
19227
19227
// ABI.
19228
19228
19229
+ ArrayRef<MCPhysReg> ArgGPRs = RISCV::getArgGPRs(ABI);
19230
+
19231
+ if (UseGPRForF16_F32 && (ValVT == MVT::f16 || ValVT == MVT::bf16 ||
19232
+ (ValVT == MVT::f32 && XLen == 64))) {
19233
+ Register Reg = State.AllocateReg(ArgGPRs);
19234
+ if (Reg) {
19235
+ LocVT = XLenVT;
19236
+ State.addLoc(
19237
+ CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
19238
+ return false;
19239
+ }
19240
+ }
19241
+
19229
19242
if (UseGPRForF16_F32 &&
19230
19243
(ValVT == MVT::f16 || ValVT == MVT::bf16 || ValVT == MVT::f32)) {
19231
19244
LocVT = XLenVT;
@@ -19235,8 +19248,6 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
19235
19248
LocInfo = CCValAssign::BCvt;
19236
19249
}
19237
19250
19238
- ArrayRef<MCPhysReg> ArgGPRs = RISCV::getArgGPRs(ABI);
19239
-
19240
19251
// If this is a variadic argument, the RISC-V calling convention requires
19241
19252
// that it is assigned an 'even' or 'aligned' register if it has 8-byte
19242
19253
// alignment (RV32) or 16-byte alignment (RV64). An aligned register should
@@ -19483,6 +19494,17 @@ void RISCVTargetLowering::analyzeOutputArgs(
19483
19494
static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val,
19484
19495
const CCValAssign &VA, const SDLoc &DL,
19485
19496
const RISCVSubtarget &Subtarget) {
19497
+ if (VA.needsCustom()) {
19498
+ if (VA.getLocVT().isInteger() &&
19499
+ (VA.getValVT() == MVT::f16 || VA.getValVT() == MVT::bf16))
19500
+ Val = DAG.getNode(RISCVISD::FMV_H_X, DL, VA.getValVT(), Val);
19501
+ else if (VA.getLocVT() == MVT::i64 && VA.getValVT() == MVT::f32)
19502
+ Val = DAG.getNode(RISCVISD::FMV_W_X_RV64, DL, MVT::f32, Val);
19503
+ else
19504
+ llvm_unreachable("Unexpected Custom handling.");
19505
+ return Val;
19506
+ }
19507
+
19486
19508
switch (VA.getLocInfo()) {
19487
19509
default:
19488
19510
llvm_unreachable("Unexpected CCValAssign::LocInfo");
@@ -19491,14 +19513,7 @@ static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val,
19491
19513
Val = convertFromScalableVector(VA.getValVT(), Val, DAG, Subtarget);
19492
19514
break;
19493
19515
case CCValAssign::BCvt:
19494
- if (VA.getLocVT().isInteger() &&
19495
- (VA.getValVT() == MVT::f16 || VA.getValVT() == MVT::bf16)) {
19496
- Val = DAG.getNode(RISCVISD::FMV_H_X, DL, VA.getValVT(), Val);
19497
- } else if (VA.getLocVT() == MVT::i64 && VA.getValVT() == MVT::f32) {
19498
- Val = DAG.getNode(RISCVISD::FMV_W_X_RV64, DL, MVT::f32, Val);
19499
- } else {
19500
- Val = DAG.getNode(ISD::BITCAST, DL, VA.getValVT(), Val);
19501
- }
19516
+ Val = DAG.getNode(ISD::BITCAST, DL, VA.getValVT(), Val);
19502
19517
break;
19503
19518
}
19504
19519
return Val;
@@ -19544,6 +19559,17 @@ static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
19544
19559
const RISCVSubtarget &Subtarget) {
19545
19560
EVT LocVT = VA.getLocVT();
19546
19561
19562
+ if (VA.needsCustom()) {
19563
+ if (LocVT.isInteger() &&
19564
+ (VA.getValVT() == MVT::f16 || VA.getValVT() == MVT::bf16))
19565
+ Val = DAG.getNode(RISCVISD::FMV_X_ANYEXTH, DL, LocVT, Val);
19566
+ else if (LocVT == MVT::i64 && VA.getValVT() == MVT::f32)
19567
+ Val = DAG.getNode(RISCVISD::FMV_X_ANYEXTW_RV64, DL, MVT::i64, Val);
19568
+ else
19569
+ llvm_unreachable("Unexpected Custom handling.");
19570
+ return Val;
19571
+ }
19572
+
19547
19573
switch (VA.getLocInfo()) {
19548
19574
default:
19549
19575
llvm_unreachable("Unexpected CCValAssign::LocInfo");
@@ -19552,14 +19578,7 @@ static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
19552
19578
Val = convertToScalableVector(LocVT, Val, DAG, Subtarget);
19553
19579
break;
19554
19580
case CCValAssign::BCvt:
19555
- if (LocVT.isInteger() &&
19556
- (VA.getValVT() == MVT::f16 || VA.getValVT() == MVT::bf16)) {
19557
- Val = DAG.getNode(RISCVISD::FMV_X_ANYEXTH, DL, LocVT, Val);
19558
- } else if (LocVT == MVT::i64 && VA.getValVT() == MVT::f32) {
19559
- Val = DAG.getNode(RISCVISD::FMV_X_ANYEXTW_RV64, DL, MVT::i64, Val);
19560
- } else {
19561
- Val = DAG.getNode(ISD::BITCAST, DL, LocVT, Val);
19562
- }
19581
+ Val = DAG.getNode(ISD::BITCAST, DL, LocVT, Val);
19563
19582
break;
19564
19583
}
19565
19584
return Val;
@@ -19693,8 +19712,14 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
19693
19712
(LocVT == MVT::f64 && Subtarget.is64Bit() &&
19694
19713
Subtarget.hasStdExtZdinx())) {
19695
19714
if (MCRegister Reg = State.AllocateReg(getFastCCArgGPRs(ABI))) {
19696
- LocInfo = CCValAssign::BCvt;
19715
+ if (LocVT.getSizeInBits() != Subtarget.getXLen()) {
19716
+ LocVT = Subtarget.getXLenVT();
19717
+ State.addLoc(
19718
+ CCValAssign::getCustomReg(ValNo, ValVT, Reg, LocVT, LocInfo));
19719
+ return false;
19720
+ }
19697
19721
LocVT = Subtarget.getXLenVT();
19722
+ LocInfo = CCValAssign::BCvt;
19698
19723
State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
19699
19724
return false;
19700
19725
}
@@ -20337,9 +20362,8 @@ SDValue RISCVTargetLowering::LowerCall(CallLoweringInfo &CLI,
20337
20362
Glue = RetValue2.getValue(2);
20338
20363
RetValue = DAG.getNode(RISCVISD::BuildPairF64, DL, MVT::f64, RetValue,
20339
20364
RetValue2);
20340
- }
20341
-
20342
- RetValue = convertLocVTToValVT(DAG, RetValue, VA, DL, Subtarget);
20365
+ } else
20366
+ RetValue = convertLocVTToValVT(DAG, RetValue, VA, DL, Subtarget);
20343
20367
20344
20368
InVals.push_back(RetValue);
20345
20369
}
0 commit comments