Skip to content

Commit 588b775

Browse files
authored
[LoongArch64] add new ABI classifier. (#101224)
* add new ABI classifier. * share `CodeGen::genHomeRegisterParams` with XARCH-ARMARCH.
1 parent b0118be commit 588b775

File tree

5 files changed

+234
-544
lines changed

5 files changed

+234
-544
lines changed

src/coreclr/jit/abi.h

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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)
206224
typedef X86Classifier PlatformClassifier;
207225
#elif defined(WINDOWS_AMD64_ABI)
@@ -214,6 +232,8 @@ typedef Arm64Classifier PlatformClassifier;
214232
typedef Arm32Classifier PlatformClassifier;
215233
#elif defined(TARGET_RISCV64)
216234
typedef RiscV64Classifier PlatformClassifier;
235+
#elif defined(TARGET_LOONGARCH64)
236+
typedef LoongArch64Classifier PlatformClassifier;
217237
#endif
218238

219239
#ifdef SWIFT_SUPPORT

src/coreclr/jit/codegencommon.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2802,7 +2802,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
28022802
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
28032803
*/
28042804

2805-
#if !defined(TARGET_LOONGARCH64) && !defined(TARGET_RISCV64)
2805+
#if !defined(TARGET_RISCV64)
28062806
struct RegNode;
28072807

28082808
struct RegNodeEdge

0 commit comments

Comments
 (0)