Skip to content

Commit 5c478d7

Browse files
committed
Update LoongArch classifier to use CORINFO_FPSTRUCT_LOWERING
1 parent c7c88e0 commit 5c478d7

File tree

1 file changed

+37
-31
lines changed

1 file changed

+37
-31
lines changed

src/coreclr/jit/targetloongarch64.cpp

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -78,45 +78,51 @@ ABIPassingInformation LoongArch64Classifier::Classify(Compiler* comp,
7878
{
7979
assert(!structLayout->IsBlockLayout());
8080

81-
FpStructInRegistersInfo fpInfo;
82-
CORINFO_CLASS_HANDLE typeHnd = structLayout->GetClassHandle();
81+
CORINFO_CLASS_HANDLE typeHnd = structLayout->GetClassHandle();
82+
const CORINFO_FPSTRUCT_LOWERING* lowering = comp->GetFpStructLowering(typeHnd);
8383

84-
fpInfo = comp->GetPassFpStructInRegistersInfo(typeHnd);
85-
86-
if (fpInfo.flags != FpStruct::UseIntCallConv)
84+
if (!lowering->byIntegerCallConv)
8785
{
88-
if ((fpInfo.flags & FpStruct::OnlyOne) != 0)
86+
slots = lowering->numLoweredElements;
87+
if (lowering->numLoweredElements == 1)
8988
{
9089
assert(passedSize <= TARGET_POINTER_SIZE);
90+
assert(varTypeIsFloating(JITtype2varType(lowering->loweredElements[0])));
9191

92-
slots = 1;
9392
canPassArgInRegisters = m_floatRegs.Count() > 0;
94-
95-
argRegTypeInStruct1 = (passedSize == 8) ? TYP_DOUBLE : TYP_FLOAT;
96-
}
97-
else if ((fpInfo.flags & FpStruct::BothFloat) != 0)
98-
{
99-
slots = 2;
100-
canPassArgInRegisters = m_floatRegs.Count() >= 2;
101-
102-
argRegTypeInStruct1 = (fpInfo.SizeShift1st() == 3) ? TYP_DOUBLE : TYP_FLOAT;
103-
argRegTypeInStruct2 = (fpInfo.SizeShift2nd() == 3) ? TYP_DOUBLE : TYP_FLOAT;
93+
argRegTypeInStruct1 = (passedSize == 8) ? TYP_DOUBLE : TYP_FLOAT;
10494
}
105-
else if ((fpInfo.flags & FpStruct::FloatInt) != 0)
106-
{
107-
slots = 2;
108-
canPassArgInRegisters = (m_floatRegs.Count() > 0) && (m_intRegs.Count() > 0);
109-
110-
argRegTypeInStruct1 = (fpInfo.SizeShift1st() == 3) ? TYP_DOUBLE : TYP_FLOAT;
111-
argRegTypeInStruct2 = (fpInfo.SizeShift2nd() == 3) ? TYP_LONG : TYP_INT;
112-
}
113-
else if ((fpInfo.flags & FpStruct::IntFloat) != 0)
95+
else
11496
{
115-
slots = 2;
116-
canPassArgInRegisters = (m_floatRegs.Count() > 0) && (m_intRegs.Count() > 0);
117-
118-
argRegTypeInStruct1 = (fpInfo.SizeShift1st() == 3) ? TYP_LONG : TYP_INT;
119-
argRegTypeInStruct2 = (fpInfo.SizeShift2nd() == 3) ? TYP_DOUBLE : TYP_FLOAT;
97+
assert(lowering->numLoweredElements == 2);
98+
var_types types[] = {
99+
JITtype2varType(lowering->loweredElements[0]),
100+
JITtype2varType(lowering->loweredElements[1]),
101+
};
102+
if (varTypeIsFloating(types[0]) && varTypeIsFloating(types[1]))
103+
{
104+
canPassArgInRegisters = m_floatRegs.Count() >= 2;
105+
106+
argRegTypeInStruct1 = types[0];
107+
argRegTypeInStruct2 = types[1];
108+
}
109+
else if (!varTypeIsFloating(types[1]))
110+
{
111+
assert(varTypeIsFloating(types[0]));
112+
canPassArgInRegisters = (m_floatRegs.Count() > 0) && (m_intRegs.Count() > 0);
113+
114+
argRegTypeInStruct1 = types[0];
115+
argRegTypeInStruct2 = (genTypeSize(types[1]) == 8) ? TYP_LONG : TYP_INT;
116+
}
117+
else
118+
{
119+
assert(!varTypeIsFloating(types[0]));
120+
assert(varTypeIsFloating(types[1]));
121+
canPassArgInRegisters = (m_floatRegs.Count() > 0) && (m_intRegs.Count() > 0);
122+
123+
argRegTypeInStruct1 = (genTypeSize(types[0]) == 8) ? TYP_LONG : TYP_INT;
124+
argRegTypeInStruct2 = types[1];
125+
}
120126
}
121127

122128
assert((slots == 1) || (slots == 2));

0 commit comments

Comments
 (0)