Skip to content

Commit 64e1283

Browse files
committed
LoongArch
1 parent 77613aa commit 64e1283

File tree

8 files changed

+100
-301
lines changed

8 files changed

+100
-301
lines changed

llvm/lib/Target/LoongArch/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ tablegen(LLVM LoongArchGenInstrInfo.inc -gen-instr-info)
1010
tablegen(LLVM LoongArchGenMCPseudoLowering.inc -gen-pseudo-lowering)
1111
tablegen(LLVM LoongArchGenMCCodeEmitter.inc -gen-emitter)
1212
tablegen(LLVM LoongArchGenRegisterInfo.inc -gen-register-info)
13+
tablegen(LLVM LoongArchGenSDNodeInfo.inc -gen-sd-node-info)
1314
tablegen(LLVM LoongArchGenSubtargetInfo.inc -gen-subtarget)
1415

1516
add_public_tablegen_target(LoongArchCommonTableGen)
@@ -27,6 +28,7 @@ add_llvm_target(LoongArchCodeGen
2728
LoongArchMergeBaseOffset.cpp
2829
LoongArchOptWInstrs.cpp
2930
LoongArchRegisterInfo.cpp
31+
LoongArchSelectionDAGInfo.cpp
3032
LoongArchSubtarget.cpp
3133
LoongArchTargetMachine.cpp
3234
LoongArchTargetTransformInfo.cpp

llvm/lib/Target/LoongArch/LoongArchISelDAGToDAG.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#define LLVM_LIB_TARGET_LOONGARCH_LOONGARCHISELDAGTODAG_H
1515

1616
#include "LoongArch.h"
17+
#include "LoongArchSelectionDAGInfo.h"
1718
#include "LoongArchTargetMachine.h"
1819
#include "llvm/CodeGen/SelectionDAGISel.h"
1920

llvm/lib/Target/LoongArch/LoongArchISelLowering.cpp

Lines changed: 3 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "LoongArch.h"
1616
#include "LoongArchMachineFunctionInfo.h"
1717
#include "LoongArchRegisterInfo.h"
18+
#include "LoongArchSelectionDAGInfo.h"
1819
#include "LoongArchSubtarget.h"
1920
#include "MCTargetDesc/LoongArchBaseInfo.h"
2021
#include "MCTargetDesc/LoongArchMCTargetDesc.h"
@@ -4459,7 +4460,7 @@ SDValue LoongArchTargetLowering::lowerShiftRightParts(SDValue Op,
44594460

44604461
// Returns the opcode of the target-specific SDNode that implements the 32-bit
44614462
// form of the given Opcode.
4462-
static LoongArchISD::NodeType getLoongArchWOpcode(unsigned Opcode) {
4463+
static unsigned getLoongArchWOpcode(unsigned Opcode) {
44634464
switch (Opcode) {
44644465
default:
44654466
llvm_unreachable("Unexpected opcode");
@@ -4495,7 +4496,7 @@ static LoongArchISD::NodeType getLoongArchWOpcode(unsigned Opcode) {
44954496
static SDValue customLegalizeToWOp(SDNode *N, SelectionDAG &DAG, int NumOp,
44964497
unsigned ExtOpc = ISD::ANY_EXTEND) {
44974498
SDLoc DL(N);
4498-
LoongArchISD::NodeType WOpcode = getLoongArchWOpcode(N->getOpcode());
4499+
unsigned WOpcode = getLoongArchWOpcode(N->getOpcode());
44994500
SDValue NewOp0, NewRes;
45004501

45014502
switch (NumOp) {
@@ -7483,123 +7484,6 @@ bool LoongArchTargetLowering::allowsMisalignedMemoryAccesses(
74837484
return true;
74847485
}
74857486

7486-
const char *LoongArchTargetLowering::getTargetNodeName(unsigned Opcode) const {
7487-
switch ((LoongArchISD::NodeType)Opcode) {
7488-
case LoongArchISD::FIRST_NUMBER:
7489-
break;
7490-
7491-
#define NODE_NAME_CASE(node) \
7492-
case LoongArchISD::node: \
7493-
return "LoongArchISD::" #node;
7494-
7495-
// TODO: Add more target-dependent nodes later.
7496-
NODE_NAME_CASE(CALL)
7497-
NODE_NAME_CASE(CALL_MEDIUM)
7498-
NODE_NAME_CASE(CALL_LARGE)
7499-
NODE_NAME_CASE(RET)
7500-
NODE_NAME_CASE(TAIL)
7501-
NODE_NAME_CASE(TAIL_MEDIUM)
7502-
NODE_NAME_CASE(TAIL_LARGE)
7503-
NODE_NAME_CASE(SELECT_CC)
7504-
NODE_NAME_CASE(BR_CC)
7505-
NODE_NAME_CASE(BRCOND)
7506-
NODE_NAME_CASE(SLL_W)
7507-
NODE_NAME_CASE(SRA_W)
7508-
NODE_NAME_CASE(SRL_W)
7509-
NODE_NAME_CASE(BSTRINS)
7510-
NODE_NAME_CASE(BSTRPICK)
7511-
NODE_NAME_CASE(MOVGR2FR_W)
7512-
NODE_NAME_CASE(MOVGR2FR_W_LA64)
7513-
NODE_NAME_CASE(MOVGR2FR_D)
7514-
NODE_NAME_CASE(MOVGR2FR_D_LO_HI)
7515-
NODE_NAME_CASE(MOVFR2GR_S_LA64)
7516-
NODE_NAME_CASE(FTINT)
7517-
NODE_NAME_CASE(BUILD_PAIR_F64)
7518-
NODE_NAME_CASE(SPLIT_PAIR_F64)
7519-
NODE_NAME_CASE(REVB_2H)
7520-
NODE_NAME_CASE(REVB_2W)
7521-
NODE_NAME_CASE(BITREV_4B)
7522-
NODE_NAME_CASE(BITREV_8B)
7523-
NODE_NAME_CASE(BITREV_W)
7524-
NODE_NAME_CASE(ROTR_W)
7525-
NODE_NAME_CASE(ROTL_W)
7526-
NODE_NAME_CASE(DIV_W)
7527-
NODE_NAME_CASE(DIV_WU)
7528-
NODE_NAME_CASE(MOD_W)
7529-
NODE_NAME_CASE(MOD_WU)
7530-
NODE_NAME_CASE(CLZ_W)
7531-
NODE_NAME_CASE(CTZ_W)
7532-
NODE_NAME_CASE(DBAR)
7533-
NODE_NAME_CASE(IBAR)
7534-
NODE_NAME_CASE(BREAK)
7535-
NODE_NAME_CASE(SYSCALL)
7536-
NODE_NAME_CASE(CRC_W_B_W)
7537-
NODE_NAME_CASE(CRC_W_H_W)
7538-
NODE_NAME_CASE(CRC_W_W_W)
7539-
NODE_NAME_CASE(CRC_W_D_W)
7540-
NODE_NAME_CASE(CRCC_W_B_W)
7541-
NODE_NAME_CASE(CRCC_W_H_W)
7542-
NODE_NAME_CASE(CRCC_W_W_W)
7543-
NODE_NAME_CASE(CRCC_W_D_W)
7544-
NODE_NAME_CASE(CSRRD)
7545-
NODE_NAME_CASE(CSRWR)
7546-
NODE_NAME_CASE(CSRXCHG)
7547-
NODE_NAME_CASE(IOCSRRD_B)
7548-
NODE_NAME_CASE(IOCSRRD_H)
7549-
NODE_NAME_CASE(IOCSRRD_W)
7550-
NODE_NAME_CASE(IOCSRRD_D)
7551-
NODE_NAME_CASE(IOCSRWR_B)
7552-
NODE_NAME_CASE(IOCSRWR_H)
7553-
NODE_NAME_CASE(IOCSRWR_W)
7554-
NODE_NAME_CASE(IOCSRWR_D)
7555-
NODE_NAME_CASE(CPUCFG)
7556-
NODE_NAME_CASE(MOVGR2FCSR)
7557-
NODE_NAME_CASE(MOVFCSR2GR)
7558-
NODE_NAME_CASE(CACOP_D)
7559-
NODE_NAME_CASE(CACOP_W)
7560-
NODE_NAME_CASE(VSHUF)
7561-
NODE_NAME_CASE(VPICKEV)
7562-
NODE_NAME_CASE(VPICKOD)
7563-
NODE_NAME_CASE(VPACKEV)
7564-
NODE_NAME_CASE(VPACKOD)
7565-
NODE_NAME_CASE(VILVL)
7566-
NODE_NAME_CASE(VILVH)
7567-
NODE_NAME_CASE(VSHUF4I)
7568-
NODE_NAME_CASE(VREPLVEI)
7569-
NODE_NAME_CASE(VREPLGR2VR)
7570-
NODE_NAME_CASE(XVPERMI)
7571-
NODE_NAME_CASE(XVPERM)
7572-
NODE_NAME_CASE(XVREPLVE0)
7573-
NODE_NAME_CASE(XVREPLVE0Q)
7574-
NODE_NAME_CASE(XVINSVE0)
7575-
NODE_NAME_CASE(VPICK_SEXT_ELT)
7576-
NODE_NAME_CASE(VPICK_ZEXT_ELT)
7577-
NODE_NAME_CASE(VREPLVE)
7578-
NODE_NAME_CASE(VALL_ZERO)
7579-
NODE_NAME_CASE(VANY_ZERO)
7580-
NODE_NAME_CASE(VALL_NONZERO)
7581-
NODE_NAME_CASE(VANY_NONZERO)
7582-
NODE_NAME_CASE(FRECIPE)
7583-
NODE_NAME_CASE(FRSQRTE)
7584-
NODE_NAME_CASE(VSLLI)
7585-
NODE_NAME_CASE(VSRLI)
7586-
NODE_NAME_CASE(VBSLL)
7587-
NODE_NAME_CASE(VBSRL)
7588-
NODE_NAME_CASE(VLDREPL)
7589-
NODE_NAME_CASE(VMSKLTZ)
7590-
NODE_NAME_CASE(VMSKGEZ)
7591-
NODE_NAME_CASE(VMSKEQZ)
7592-
NODE_NAME_CASE(VMSKNEZ)
7593-
NODE_NAME_CASE(XVMSKLTZ)
7594-
NODE_NAME_CASE(XVMSKGEZ)
7595-
NODE_NAME_CASE(XVMSKEQZ)
7596-
NODE_NAME_CASE(XVMSKNEZ)
7597-
NODE_NAME_CASE(VHADDW)
7598-
}
7599-
#undef NODE_NAME_CASE
7600-
return nullptr;
7601-
}
7602-
76037487
//===----------------------------------------------------------------------===//
76047488
// Calling Convention Implementation
76057489
//===----------------------------------------------------------------------===//

llvm/lib/Target/LoongArch/LoongArchISelLowering.h

Lines changed: 0 additions & 176 deletions
Original file line numberDiff line numberDiff line change
@@ -21,179 +21,6 @@
2121

2222
namespace llvm {
2323
class LoongArchSubtarget;
24-
namespace LoongArchISD {
25-
enum NodeType : unsigned {
26-
FIRST_NUMBER = ISD::BUILTIN_OP_END,
27-
28-
// TODO: add more LoongArchISDs
29-
CALL,
30-
CALL_MEDIUM,
31-
CALL_LARGE,
32-
RET,
33-
TAIL,
34-
TAIL_MEDIUM,
35-
TAIL_LARGE,
36-
37-
// Select
38-
SELECT_CC,
39-
40-
// Branch
41-
BR_CC,
42-
BRCOND,
43-
44-
// 32-bit shifts, directly matching the semantics of the named LoongArch
45-
// instructions.
46-
SLL_W,
47-
SRA_W,
48-
SRL_W,
49-
50-
ROTL_W,
51-
ROTR_W,
52-
53-
// unsigned 32-bit integer division
54-
DIV_W,
55-
MOD_W,
56-
DIV_WU,
57-
MOD_WU,
58-
59-
// FPR<->GPR transfer operations
60-
MOVGR2FR_W,
61-
MOVGR2FR_W_LA64,
62-
MOVGR2FR_D,
63-
MOVGR2FR_D_LO_HI,
64-
MOVFR2GR_S_LA64,
65-
MOVFCSR2GR,
66-
MOVGR2FCSR,
67-
68-
FTINT,
69-
70-
// Build and split F64 pair
71-
BUILD_PAIR_F64,
72-
SPLIT_PAIR_F64,
73-
74-
// Bit counting operations
75-
CLZ_W,
76-
CTZ_W,
77-
78-
BSTRINS,
79-
BSTRPICK,
80-
81-
// Byte-swapping and bit-reversal
82-
REVB_2H,
83-
REVB_2W,
84-
BITREV_4B,
85-
BITREV_8B,
86-
BITREV_W,
87-
88-
// Intrinsic operations start ============================================
89-
BREAK,
90-
CACOP_D,
91-
CACOP_W,
92-
DBAR,
93-
IBAR,
94-
SYSCALL,
95-
96-
// CRC check operations
97-
CRC_W_B_W,
98-
CRC_W_H_W,
99-
CRC_W_W_W,
100-
CRC_W_D_W,
101-
CRCC_W_B_W,
102-
CRCC_W_H_W,
103-
CRCC_W_W_W,
104-
CRCC_W_D_W,
105-
106-
CSRRD,
107-
108-
// Write new value to CSR and return old value.
109-
// Operand 0: A chain pointer.
110-
// Operand 1: The new value to write.
111-
// Operand 2: The address of the required CSR.
112-
// Result 0: The old value of the CSR.
113-
// Result 1: The new chain pointer.
114-
CSRWR,
115-
116-
// Similar to CSRWR but with a write mask.
117-
// Operand 0: A chain pointer.
118-
// Operand 1: The new value to write.
119-
// Operand 2: The write mask.
120-
// Operand 3: The address of the required CSR.
121-
// Result 0: The old value of the CSR.
122-
// Result 1: The new chain pointer.
123-
CSRXCHG,
124-
125-
// IOCSR access operations
126-
IOCSRRD_B,
127-
IOCSRRD_W,
128-
IOCSRRD_H,
129-
IOCSRRD_D,
130-
IOCSRWR_B,
131-
IOCSRWR_H,
132-
IOCSRWR_W,
133-
IOCSRWR_D,
134-
135-
// Read CPU configuration information operation
136-
CPUCFG,
137-
138-
// Vector Shuffle
139-
VREPLVE,
140-
VSHUF,
141-
VPICKEV,
142-
VPICKOD,
143-
VPACKEV,
144-
VPACKOD,
145-
VILVL,
146-
VILVH,
147-
VSHUF4I,
148-
VREPLVEI,
149-
VREPLGR2VR,
150-
XVPERMI,
151-
XVPERM,
152-
XVREPLVE0,
153-
XVREPLVE0Q,
154-
XVINSVE0,
155-
156-
// Extended vector element extraction
157-
VPICK_SEXT_ELT,
158-
VPICK_ZEXT_ELT,
159-
160-
// Vector comparisons
161-
VALL_ZERO,
162-
VANY_ZERO,
163-
VALL_NONZERO,
164-
VANY_NONZERO,
165-
166-
// Floating point approximate reciprocal operation
167-
FRECIPE,
168-
FRSQRTE,
169-
170-
// Vector logicial left / right shift by immediate
171-
VSLLI,
172-
VSRLI,
173-
174-
// Vector byte logicial left / right shift
175-
VBSLL,
176-
VBSRL,
177-
178-
// Scalar load broadcast to vector
179-
VLDREPL,
180-
181-
// Vector mask set by condition
182-
VMSKLTZ,
183-
VMSKGEZ,
184-
VMSKEQZ,
185-
VMSKNEZ,
186-
XVMSKLTZ,
187-
XVMSKGEZ,
188-
XVMSKEQZ,
189-
XVMSKNEZ,
190-
191-
// Vector Horizontal Addition with Widening‌
192-
VHADDW
193-
194-
// Intrinsic operations end =============================================
195-
};
196-
} // end namespace LoongArchISD
19724

19825
class LoongArchTargetLowering : public TargetLowering {
19926
const LoongArchSubtarget &Subtarget;
@@ -213,9 +40,6 @@ class LoongArchTargetLowering : public TargetLowering {
21340

21441
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
21542

216-
// This method returns the name of a target specific DAG node.
217-
const char *getTargetNodeName(unsigned Opcode) const override;
218-
21943
// Lower incoming arguments, copy physregs into vregs.
22044
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
22145
bool IsVarArg,

0 commit comments

Comments
 (0)