@@ -26,6 +26,7 @@ class RISCVABIInfo : public DefaultABIInfo {
26
26
// ISA might have a wider FLen than the selected ABI (e.g. an RV32IF target
27
27
// with soft float ABI has FLen==0).
28
28
unsigned FLen;
29
+ unsigned ABIVLen;
29
30
const int NumArgGPRs;
30
31
const int NumArgFPRs;
31
32
const bool EABI;
@@ -37,17 +38,17 @@ class RISCVABIInfo : public DefaultABIInfo {
37
38
38
39
public:
39
40
RISCVABIInfo (CodeGen::CodeGenTypes &CGT, unsigned XLen, unsigned FLen,
40
- bool EABI)
41
- : DefaultABIInfo(CGT), XLen(XLen), FLen(FLen), NumArgGPRs(EABI ? 6 : 8 ),
42
- NumArgFPRs (FLen != 0 ? 8 : 0 ), EABI(EABI) {}
41
+ unsigned ABIVLen, bool EABI)
42
+ : DefaultABIInfo(CGT), XLen(XLen), FLen(FLen), ABIVLen(ABIVLen ),
43
+ NumArgGPRs (EABI ? 6 : 8 ), NumArgFPRs(FLen != 0 ? 8 : 0 ), EABI(EABI) {}
43
44
44
45
// DefaultABIInfo's classifyReturnType and classifyArgumentType are
45
46
// non-virtual, but computeInfo is virtual, so we overload it.
46
47
void computeInfo (CGFunctionInfo &FI) const override ;
47
48
48
49
ABIArgInfo classifyArgumentType (QualType Ty, bool IsFixed, int &ArgGPRsLeft,
49
- int &ArgFPRsLeft, unsigned ABIVLen ) const ;
50
- ABIArgInfo classifyReturnType (QualType RetTy, unsigned ABIVLen ) const ;
50
+ int &ArgFPRsLeft, unsigned ArgABIVLen ) const ;
51
+ ABIArgInfo classifyReturnType (QualType RetTy, unsigned ArgABIVLen ) const ;
51
52
52
53
RValue EmitVAArg (CodeGenFunction &CGF, Address VAListAddr, QualType Ty,
53
54
AggValueSlot Slot) const override ;
@@ -63,23 +64,18 @@ class RISCVABIInfo : public DefaultABIInfo {
63
64
llvm::Type *Field2Ty,
64
65
CharUnits Field2Off) const ;
65
66
66
- ABIArgInfo coerceVLSVector (QualType Ty, unsigned ABIVLen = 0 ) const ;
67
+ ABIArgInfo coerceVLSVector (QualType Ty, unsigned ArgABIVLen = 0 ) const ;
67
68
};
68
69
} // end anonymous namespace
69
70
70
71
void RISCVABIInfo::computeInfo (CGFunctionInfo &FI) const {
71
- unsigned ABIVLen = 1 << FI.getExtInfo ().getLog2RISCVABIVLen ();
72
- if (ABIVLen == 1 )
73
- // No riscv_vls_cc in the function, check if there's one passed from
74
- // compiler options.
75
- for (unsigned i = 5 ; i <= 16 ; ++i)
76
- if (getContext ().getTargetInfo ().getTargetOpts ().FeatureMap .contains (
77
- " abi-vlen-" + llvm::utostr (1 << i) + " b" ))
78
- ABIVLen = 1 << i;
72
+ unsigned ArgABIVLen = 1 << FI.getExtInfo ().getLog2RISCVABIVLen ();
73
+ if (ArgABIVLen == 1 )
74
+ ArgABIVLen = ABIVLen;
79
75
80
76
QualType RetTy = FI.getReturnType ();
81
77
if (!getCXXABI ().classifyReturnType (FI))
82
- FI.getReturnInfo () = classifyReturnType (RetTy, ABIVLen );
78
+ FI.getReturnInfo () = classifyReturnType (RetTy, ArgABIVLen );
83
79
84
80
// IsRetIndirect is true if classifyArgumentType indicated the value should
85
81
// be passed indirect, or if the type size is a scalar greater than 2*XLen
@@ -106,7 +102,7 @@ void RISCVABIInfo::computeInfo(CGFunctionInfo &FI) const {
106
102
for (auto &ArgInfo : FI.arguments ()) {
107
103
bool IsFixed = ArgNum < NumFixedArgs;
108
104
ArgInfo.info = classifyArgumentType (ArgInfo.type , IsFixed, ArgGPRsLeft,
109
- ArgFPRsLeft, ABIVLen );
105
+ ArgFPRsLeft, ArgABIVLen );
110
106
ArgNum++;
111
107
}
112
108
}
@@ -327,7 +323,8 @@ ABIArgInfo RISCVABIInfo::coerceAndExpandFPCCEligibleStruct(
327
323
328
324
// Fixed-length RVV vectors are represented as scalable vectors in function
329
325
// args/return and must be coerced from fixed vectors.
330
- ABIArgInfo RISCVABIInfo::coerceVLSVector (QualType Ty, unsigned ABIVLen) const {
326
+ ABIArgInfo RISCVABIInfo::coerceVLSVector (QualType Ty,
327
+ unsigned ArgABIVLen) const {
331
328
assert (Ty->isVectorType () && " expected vector type!" );
332
329
333
330
const auto *VT = Ty->castAs <VectorType>();
@@ -337,7 +334,7 @@ ABIArgInfo RISCVABIInfo::coerceVLSVector(QualType Ty, unsigned ABIVLen) const {
337
334
llvm::ScalableVectorType *ResType ;
338
335
llvm::Type *EltType = CGT.ConvertType (VT->getElementType ());
339
336
340
- if (ABIVLen == 0 ) {
337
+ if (ArgABIVLen == 0 ) {
341
338
// RVV fixed-length vector
342
339
auto VScale =
343
340
getContext ().getTargetInfo ().getVScaleRange (getContext ().getLangOpts ());
@@ -355,7 +352,7 @@ ABIArgInfo RISCVABIInfo::coerceVLSVector(QualType Ty, unsigned ABIVLen) const {
355
352
} else {
356
353
// Generic vector
357
354
ResType = llvm::ScalableVectorType::get (
358
- EltType, NumElts * llvm::RISCV::RVVBitsPerBlock / ABIVLen );
355
+ EltType, NumElts * llvm::RISCV::RVVBitsPerBlock / ArgABIVLen );
359
356
}
360
357
361
358
return ABIArgInfo::getDirect (ResType );
@@ -364,7 +361,7 @@ ABIArgInfo RISCVABIInfo::coerceVLSVector(QualType Ty, unsigned ABIVLen) const {
364
361
ABIArgInfo RISCVABIInfo::classifyArgumentType (QualType Ty, bool IsFixed,
365
362
int &ArgGPRsLeft,
366
363
int &ArgFPRsLeft,
367
- unsigned ABIVLen ) const {
364
+ unsigned ArgABIVLen ) const {
368
365
assert (ArgGPRsLeft <= NumArgGPRs && " Arg GPR tracking underflow" );
369
366
Ty = useFirstFieldIfTransparentUnion (Ty);
370
367
@@ -471,10 +468,10 @@ ABIArgInfo RISCVABIInfo::classifyArgumentType(QualType Ty, bool IsFixed,
471
468
if (VT->getVectorKind () == VectorKind::RVVFixedLengthData ||
472
469
VT->getVectorKind () == VectorKind::RVVFixedLengthMask)
473
470
return coerceVLSVector (Ty);
474
- if (VT->getVectorKind () == VectorKind::Generic && ABIVLen != 1 )
471
+ if (VT->getVectorKind () == VectorKind::Generic && ArgABIVLen != 0 )
475
472
// Generic vector without riscv_vls_cc should fall through and pass by
476
473
// reference.
477
- return coerceVLSVector (Ty, ABIVLen );
474
+ return coerceVLSVector (Ty, ArgABIVLen );
478
475
}
479
476
480
477
// Aggregates which are <= 2*XLen will be passed in registers if possible,
@@ -499,7 +496,7 @@ ABIArgInfo RISCVABIInfo::classifyArgumentType(QualType Ty, bool IsFixed,
499
496
}
500
497
501
498
ABIArgInfo RISCVABIInfo::classifyReturnType (QualType RetTy,
502
- unsigned ABIVLen ) const {
499
+ unsigned ArgABIVLen ) const {
503
500
if (RetTy->isVoidType ())
504
501
return ABIArgInfo::getIgnore ();
505
502
@@ -509,7 +506,7 @@ ABIArgInfo RISCVABIInfo::classifyReturnType(QualType RetTy,
509
506
// The rules for return and argument types are the same, so defer to
510
507
// classifyArgumentType.
511
508
return classifyArgumentType (RetTy, /* IsFixed=*/ true , ArgGPRsLeft, ArgFPRsLeft,
512
- ABIVLen );
509
+ ArgABIVLen );
513
510
}
514
511
515
512
RValue RISCVABIInfo::EmitVAArg (CodeGenFunction &CGF, Address VAListAddr,
@@ -548,9 +545,9 @@ namespace {
548
545
class RISCVTargetCodeGenInfo : public TargetCodeGenInfo {
549
546
public:
550
547
RISCVTargetCodeGenInfo (CodeGen::CodeGenTypes &CGT, unsigned XLen,
551
- unsigned FLen, bool EABI)
548
+ unsigned FLen, unsigned ABIVLen, bool EABI)
552
549
: TargetCodeGenInfo(
553
- std::make_unique<RISCVABIInfo>(CGT, XLen, FLen, EABI)) {
550
+ std::make_unique<RISCVABIInfo>(CGT, XLen, FLen, ABIVLen, EABI)) {
554
551
SwiftInfo =
555
552
std::make_unique<SwiftABIInfo>(CGT, /* SwiftErrorInRegister=*/ false );
556
553
}
@@ -579,7 +576,8 @@ class RISCVTargetCodeGenInfo : public TargetCodeGenInfo {
579
576
580
577
std::unique_ptr<TargetCodeGenInfo>
581
578
CodeGen::createRISCVTargetCodeGenInfo (CodeGenModule &CGM, unsigned XLen,
582
- unsigned FLen, bool EABI) {
579
+ unsigned FLen, unsigned ABIVLen,
580
+ bool EABI) {
583
581
return std::make_unique<RISCVTargetCodeGenInfo>(CGM.getTypes (), XLen, FLen,
584
- EABI);
582
+ ABIVLen, EABI);
585
583
}
0 commit comments