@@ -19226,6 +19226,19 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
1922619226 // similar local variables rather than directly checking against the target
1922719227 // ABI.
1922819228
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+
1922919242 if (UseGPRForF16_F32 &&
1923019243 (ValVT == MVT::f16 || ValVT == MVT::bf16 || ValVT == MVT::f32)) {
1923119244 LocVT = XLenVT;
@@ -19235,8 +19248,6 @@ bool RISCV::CC_RISCV(const DataLayout &DL, RISCVABI::ABI ABI, unsigned ValNo,
1923519248 LocInfo = CCValAssign::BCvt;
1923619249 }
1923719250
19238- ArrayRef<MCPhysReg> ArgGPRs = RISCV::getArgGPRs(ABI);
19239-
1924019251 // If this is a variadic argument, the RISC-V calling convention requires
1924119252 // that it is assigned an 'even' or 'aligned' register if it has 8-byte
1924219253 // alignment (RV32) or 16-byte alignment (RV64). An aligned register should
@@ -19483,6 +19494,17 @@ void RISCVTargetLowering::analyzeOutputArgs(
1948319494static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val,
1948419495 const CCValAssign &VA, const SDLoc &DL,
1948519496 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+
1948619508 switch (VA.getLocInfo()) {
1948719509 default:
1948819510 llvm_unreachable("Unexpected CCValAssign::LocInfo");
@@ -19491,14 +19513,7 @@ static SDValue convertLocVTToValVT(SelectionDAG &DAG, SDValue Val,
1949119513 Val = convertFromScalableVector(VA.getValVT(), Val, DAG, Subtarget);
1949219514 break;
1949319515 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);
1950219517 break;
1950319518 }
1950419519 return Val;
@@ -19544,6 +19559,17 @@ static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
1954419559 const RISCVSubtarget &Subtarget) {
1954519560 EVT LocVT = VA.getLocVT();
1954619561
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+
1954719573 switch (VA.getLocInfo()) {
1954819574 default:
1954919575 llvm_unreachable("Unexpected CCValAssign::LocInfo");
@@ -19552,14 +19578,7 @@ static SDValue convertValVTToLocVT(SelectionDAG &DAG, SDValue Val,
1955219578 Val = convertToScalableVector(LocVT, Val, DAG, Subtarget);
1955319579 break;
1955419580 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);
1956319582 break;
1956419583 }
1956519584 return Val;
@@ -19693,8 +19712,14 @@ bool RISCV::CC_RISCV_FastCC(const DataLayout &DL, RISCVABI::ABI ABI,
1969319712 (LocVT == MVT::f64 && Subtarget.is64Bit() &&
1969419713 Subtarget.hasStdExtZdinx())) {
1969519714 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+ }
1969719721 LocVT = Subtarget.getXLenVT();
19722+ LocInfo = CCValAssign::BCvt;
1969819723 State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
1969919724 return false;
1970019725 }
@@ -20337,9 +20362,8 @@ SDValue RISCVTargetLowering::LowerCall(CallLoweringInfo &CLI,
2033720362 Glue = RetValue2.getValue(2);
2033820363 RetValue = DAG.getNode(RISCVISD::BuildPairF64, DL, MVT::f64, RetValue,
2033920364 RetValue2);
20340- }
20341-
20342- RetValue = convertLocVTToValVT(DAG, RetValue, VA, DL, Subtarget);
20365+ } else
20366+ RetValue = convertLocVTToValVT(DAG, RetValue, VA, DL, Subtarget);
2034320367
2034420368 InVals.push_back(RetValue);
2034520369 }
0 commit comments