@@ -48,7 +48,9 @@ struct ABIPassingInformation
4848 // multiple register segments and a struct segment.
4949 // - On Windows x64, all parameters always fit into one stack slot or
5050 // register, and thus always have NumSegments == 1
51- // - On RISC-V, structs can be split out over 2 segments, each can be an integer/float register or a stack slot
51+ // - On loongarch64/riscv64, structs can be passed in two registers or
52+ // can be split out over register and stack, giving
53+ // multiple register segments and a struct segment.
5254 unsigned NumSegments = 0 ;
5355 ABIPassingSegment* Segments = nullptr ;
5456
@@ -202,6 +204,22 @@ class RiscV64Classifier
202204 WellKnownArg wellKnownParam);
203205};
204206
207+ class LoongArch64Classifier
208+ {
209+ const ClassifierInfo& m_info;
210+ RegisterQueue m_intRegs;
211+ RegisterQueue m_floatRegs;
212+ unsigned m_stackArgSize = 0 ;
213+
214+ public:
215+ LoongArch64Classifier (const ClassifierInfo& info);
216+
217+ ABIPassingInformation Classify (Compiler* comp,
218+ var_types type,
219+ ClassLayout* structLayout,
220+ WellKnownArg wellKnownParam);
221+ };
222+
205223#if defined(TARGET_X86)
206224typedef X86Classifier PlatformClassifier;
207225#elif defined(WINDOWS_AMD64_ABI)
@@ -214,6 +232,8 @@ typedef Arm64Classifier PlatformClassifier;
214232typedef Arm32Classifier PlatformClassifier;
215233#elif defined(TARGET_RISCV64)
216234typedef RiscV64Classifier PlatformClassifier;
235+ #elif defined(TARGET_LOONGARCH64)
236+ typedef LoongArch64Classifier PlatformClassifier;
217237#endif
218238
219239#ifdef SWIFT_SUPPORT
0 commit comments