diff options
author | Reid Kleckner <rnk@google.com> | 2021-01-07 10:21:44 -0800 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2021-01-07 11:14:18 -0800 |
commit | ad55d5c3f32f6598f8ac30b68f4961d82cdb1fed (patch) | |
tree | 443513652ce33c8da9b4d9b31715623a1820803a /clang/lib/CodeGen/TargetInfo.cpp | |
parent | 4c7148d75cd7e75f169251cdab3e013819344cfd (diff) | |
download | llvm-ad55d5c3f32f6598f8ac30b68f4961d82cdb1fed.zip llvm-ad55d5c3f32f6598f8ac30b68f4961d82cdb1fed.tar.gz llvm-ad55d5c3f32f6598f8ac30b68f4961d82cdb1fed.tar.bz2 |
Simplify vectorcall argument classification of HVAs, NFC
This reduces the number of `WinX86_64ABIInfo::classify` call sites from
3 to 1. The call sites were similar, but passed different values for
FreeSSERegs. Use variables instead of `if`s to manage that argument.
Diffstat (limited to 'clang/lib/CodeGen/TargetInfo.cpp')
-rw-r--r-- | clang/lib/CodeGen/TargetInfo.cpp | 62 |
1 files changed, 20 insertions, 42 deletions
diff --git a/clang/lib/CodeGen/TargetInfo.cpp b/clang/lib/CodeGen/TargetInfo.cpp index c6d8942..d36c734 100644 --- a/clang/lib/CodeGen/TargetInfo.cpp +++ b/clang/lib/CodeGen/TargetInfo.cpp @@ -1089,11 +1089,6 @@ struct CCState { unsigned FreeSSERegs = 0; }; -enum { - // Vectorcall only allows the first 6 parameters to be passed in registers. - VectorcallMaxParamNumAsReg = 6 -}; - /// X86_32ABIInfo - The X86-32 ABI information. class X86_32ABIInfo : public SwiftABIInfo { enum Class { @@ -2405,10 +2400,8 @@ public: private: ABIArgInfo classify(QualType Ty, unsigned &FreeSSERegs, bool IsReturnType, bool IsVectorCall, bool IsRegCall) const; - ABIArgInfo reclassifyHvaArgType(QualType Ty, unsigned &FreeSSERegs, - const ABIArgInfo ¤t) const; - void computeVectorCallArgs(CGFunctionInfo &FI, unsigned FreeSSERegs, - bool IsVectorCall, bool IsRegCall) const; + ABIArgInfo reclassifyHvaArgForVectorCall(QualType Ty, unsigned &FreeSSERegs, + const ABIArgInfo ¤t) const; X86AVXABILevel AVXLevel; @@ -4163,10 +4156,8 @@ Address X86_64ABIInfo::EmitMSVAArg(CodeGenFunction &CGF, Address VAListAddr, /*allowHigherAlign*/ false); } -ABIArgInfo -WinX86_64ABIInfo::reclassifyHvaArgType(QualType Ty, unsigned &FreeSSERegs, - const ABIArgInfo ¤t) const { - // Assumes vectorCall calling convention. +ABIArgInfo WinX86_64ABIInfo::reclassifyHvaArgForVectorCall( + QualType Ty, unsigned &FreeSSERegs, const ABIArgInfo ¤t) const { const Type *Base = nullptr; uint64_t NumElts = 0; @@ -4299,31 +4290,6 @@ ABIArgInfo WinX86_64ABIInfo::classify(QualType Ty, unsigned &FreeSSERegs, return ABIArgInfo::getDirect(); } -void WinX86_64ABIInfo::computeVectorCallArgs(CGFunctionInfo &FI, - unsigned FreeSSERegs, - bool IsVectorCall, - bool IsRegCall) const { - unsigned Count = 0; - for (auto &I : FI.arguments()) { - // Vectorcall in x64 only permits the first 6 arguments to be passed - // as XMM/YMM registers. - if (Count < VectorcallMaxParamNumAsReg) - I.info = classify(I.type, FreeSSERegs, false, IsVectorCall, IsRegCall); - else { - // Since these cannot be passed in registers, pretend no registers - // are left. - unsigned ZeroSSERegsAvail = 0; - I.info = classify(I.type, /*FreeSSERegs=*/ZeroSSERegsAvail, false, - IsVectorCall, IsRegCall); - } - ++Count; - } - - for (auto &I : FI.arguments()) { - I.info = reclassifyHvaArgType(I.type, FreeSSERegs, I.info); - } -} - void WinX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const { const unsigned CC = FI.getCallingConvention(); bool IsVectorCall = CC == llvm::CallingConv::X86_VectorCall; @@ -4358,13 +4324,25 @@ void WinX86_64ABIInfo::computeInfo(CGFunctionInfo &FI) const { FreeSSERegs = 16; } + unsigned ArgNum = 0; + unsigned ZeroSSERegs = 0; + for (auto &I : FI.arguments()) { + // Vectorcall in x64 only permits the first 6 arguments to be passed as + // XMM/YMM registers. After the sixth argument, pretend no vector + // registers are left. + unsigned *MaybeFreeSSERegs = + (IsVectorCall && ArgNum >= 6) ? &ZeroSSERegs : &FreeSSERegs; + I.info = + classify(I.type, *MaybeFreeSSERegs, false, IsVectorCall, IsRegCall); + ++ArgNum; + } + if (IsVectorCall) { - computeVectorCallArgs(FI, FreeSSERegs, IsVectorCall, IsRegCall); - } else { + // For vectorcall, assign aggregate HVAs to any free vector registers in a + // second pass. for (auto &I : FI.arguments()) - I.info = classify(I.type, FreeSSERegs, false, IsVectorCall, IsRegCall); + I.info = reclassifyHvaArgForVectorCall(I.type, FreeSSERegs, I.info); } - } Address WinX86_64ABIInfo::EmitVAArg(CodeGenFunction &CGF, Address VAListAddr, |