@@ -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