@@ -78,45 +78,51 @@ ABIPassingInformation LoongArch64Classifier::Classify(Compiler* comp,
78
78
{
79
79
assert (!structLayout->IsBlockLayout ());
80
80
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 );
83
83
84
- fpInfo = comp->GetPassFpStructInRegistersInfo (typeHnd);
85
-
86
- if (fpInfo.flags != FpStruct::UseIntCallConv)
84
+ if (!lowering->byIntegerCallConv )
87
85
{
88
- if ((fpInfo.flags & FpStruct::OnlyOne) != 0 )
86
+ slots = lowering->numLoweredElements ;
87
+ if (lowering->numLoweredElements == 1 )
89
88
{
90
89
assert (passedSize <= TARGET_POINTER_SIZE);
90
+ assert (varTypeIsFloating (JITtype2varType (lowering->loweredElements [0 ])));
91
91
92
- slots = 1 ;
93
92
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;
104
94
}
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
114
96
{
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
+ }
120
126
}
121
127
122
128
assert ((slots == 1 ) || (slots == 2 ));
0 commit comments