Skip to content

Commit b57c78d

Browse files
committed
LoongArch (ROTL_W, CACOP_D, CACOP_W removed)
1 parent dc91961 commit b57c78d

8 files changed

+100
-249
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 & 98 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"
@@ -3231,7 +3232,7 @@ SDValue LoongArchTargetLowering::lowerShiftRightParts(SDValue Op,
32313232

32323233
// Returns the opcode of the target-specific SDNode that implements the 32-bit
32333234
// form of the given Opcode.
3234-
static LoongArchISD::NodeType getLoongArchWOpcode(unsigned Opcode) {
3235+
static unsigned getLoongArchWOpcode(unsigned Opcode) {
32353236
switch (Opcode) {
32363237
default:
32373238
llvm_unreachable("Unexpected opcode");
@@ -3267,7 +3268,7 @@ static LoongArchISD::NodeType getLoongArchWOpcode(unsigned Opcode) {
32673268
static SDValue customLegalizeToWOp(SDNode *N, SelectionDAG &DAG, int NumOp,
32683269
unsigned ExtOpc = ISD::ANY_EXTEND) {
32693270
SDLoc DL(N);
3270-
LoongArchISD::NodeType WOpcode = getLoongArchWOpcode(N->getOpcode());
3271+
unsigned WOpcode = getLoongArchWOpcode(N->getOpcode());
32713272
SDValue NewOp0, NewRes;
32723273

32733274
switch (NumOp) {
@@ -5332,102 +5333,6 @@ bool LoongArchTargetLowering::allowsMisalignedMemoryAccesses(
53325333
return true;
53335334
}
53345335

5335-
const char *LoongArchTargetLowering::getTargetNodeName(unsigned Opcode) const {
5336-
switch ((LoongArchISD::NodeType)Opcode) {
5337-
case LoongArchISD::FIRST_NUMBER:
5338-
break;
5339-
5340-
#define NODE_NAME_CASE(node) \
5341-
case LoongArchISD::node: \
5342-
return "LoongArchISD::" #node;
5343-
5344-
// TODO: Add more target-dependent nodes later.
5345-
NODE_NAME_CASE(CALL)
5346-
NODE_NAME_CASE(CALL_MEDIUM)
5347-
NODE_NAME_CASE(CALL_LARGE)
5348-
NODE_NAME_CASE(RET)
5349-
NODE_NAME_CASE(TAIL)
5350-
NODE_NAME_CASE(TAIL_MEDIUM)
5351-
NODE_NAME_CASE(TAIL_LARGE)
5352-
NODE_NAME_CASE(SLL_W)
5353-
NODE_NAME_CASE(SRA_W)
5354-
NODE_NAME_CASE(SRL_W)
5355-
NODE_NAME_CASE(BSTRINS)
5356-
NODE_NAME_CASE(BSTRPICK)
5357-
NODE_NAME_CASE(MOVGR2FR_W_LA64)
5358-
NODE_NAME_CASE(MOVFR2GR_S_LA64)
5359-
NODE_NAME_CASE(FTINT)
5360-
NODE_NAME_CASE(REVB_2H)
5361-
NODE_NAME_CASE(REVB_2W)
5362-
NODE_NAME_CASE(BITREV_4B)
5363-
NODE_NAME_CASE(BITREV_8B)
5364-
NODE_NAME_CASE(BITREV_W)
5365-
NODE_NAME_CASE(ROTR_W)
5366-
NODE_NAME_CASE(ROTL_W)
5367-
NODE_NAME_CASE(DIV_W)
5368-
NODE_NAME_CASE(DIV_WU)
5369-
NODE_NAME_CASE(MOD_W)
5370-
NODE_NAME_CASE(MOD_WU)
5371-
NODE_NAME_CASE(CLZ_W)
5372-
NODE_NAME_CASE(CTZ_W)
5373-
NODE_NAME_CASE(DBAR)
5374-
NODE_NAME_CASE(IBAR)
5375-
NODE_NAME_CASE(BREAK)
5376-
NODE_NAME_CASE(SYSCALL)
5377-
NODE_NAME_CASE(CRC_W_B_W)
5378-
NODE_NAME_CASE(CRC_W_H_W)
5379-
NODE_NAME_CASE(CRC_W_W_W)
5380-
NODE_NAME_CASE(CRC_W_D_W)
5381-
NODE_NAME_CASE(CRCC_W_B_W)
5382-
NODE_NAME_CASE(CRCC_W_H_W)
5383-
NODE_NAME_CASE(CRCC_W_W_W)
5384-
NODE_NAME_CASE(CRCC_W_D_W)
5385-
NODE_NAME_CASE(CSRRD)
5386-
NODE_NAME_CASE(CSRWR)
5387-
NODE_NAME_CASE(CSRXCHG)
5388-
NODE_NAME_CASE(IOCSRRD_B)
5389-
NODE_NAME_CASE(IOCSRRD_H)
5390-
NODE_NAME_CASE(IOCSRRD_W)
5391-
NODE_NAME_CASE(IOCSRRD_D)
5392-
NODE_NAME_CASE(IOCSRWR_B)
5393-
NODE_NAME_CASE(IOCSRWR_H)
5394-
NODE_NAME_CASE(IOCSRWR_W)
5395-
NODE_NAME_CASE(IOCSRWR_D)
5396-
NODE_NAME_CASE(CPUCFG)
5397-
NODE_NAME_CASE(MOVGR2FCSR)
5398-
NODE_NAME_CASE(MOVFCSR2GR)
5399-
NODE_NAME_CASE(CACOP_D)
5400-
NODE_NAME_CASE(CACOP_W)
5401-
NODE_NAME_CASE(VSHUF)
5402-
NODE_NAME_CASE(VPICKEV)
5403-
NODE_NAME_CASE(VPICKOD)
5404-
NODE_NAME_CASE(VPACKEV)
5405-
NODE_NAME_CASE(VPACKOD)
5406-
NODE_NAME_CASE(VILVL)
5407-
NODE_NAME_CASE(VILVH)
5408-
NODE_NAME_CASE(VSHUF4I)
5409-
NODE_NAME_CASE(VREPLVEI)
5410-
NODE_NAME_CASE(VREPLGR2VR)
5411-
NODE_NAME_CASE(XVPERMI)
5412-
NODE_NAME_CASE(VPICK_SEXT_ELT)
5413-
NODE_NAME_CASE(VPICK_ZEXT_ELT)
5414-
NODE_NAME_CASE(VREPLVE)
5415-
NODE_NAME_CASE(VALL_ZERO)
5416-
NODE_NAME_CASE(VANY_ZERO)
5417-
NODE_NAME_CASE(VALL_NONZERO)
5418-
NODE_NAME_CASE(VANY_NONZERO)
5419-
NODE_NAME_CASE(FRECIPE)
5420-
NODE_NAME_CASE(FRSQRTE)
5421-
NODE_NAME_CASE(VSLLI)
5422-
NODE_NAME_CASE(VSRLI)
5423-
NODE_NAME_CASE(VBSLL)
5424-
NODE_NAME_CASE(VBSRL)
5425-
NODE_NAME_CASE(VLDREPL)
5426-
}
5427-
#undef NODE_NAME_CASE
5428-
return nullptr;
5429-
}
5430-
54315336
//===----------------------------------------------------------------------===//
54325337
// Calling Convention Implementation
54335338
//===----------------------------------------------------------------------===//

llvm/lib/Target/LoongArch/LoongArchISelLowering.h

Lines changed: 0 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -21,148 +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-
// 32-bit shifts, directly matching the semantics of the named LoongArch
38-
// instructions.
39-
SLL_W,
40-
SRA_W,
41-
SRL_W,
42-
43-
ROTL_W,
44-
ROTR_W,
45-
46-
// unsigned 32-bit integer division
47-
DIV_W,
48-
MOD_W,
49-
DIV_WU,
50-
MOD_WU,
51-
52-
// FPR<->GPR transfer operations
53-
MOVGR2FR_W_LA64,
54-
MOVFR2GR_S_LA64,
55-
MOVFCSR2GR,
56-
MOVGR2FCSR,
57-
58-
FTINT,
59-
60-
// Bit counting operations
61-
CLZ_W,
62-
CTZ_W,
63-
64-
BSTRINS,
65-
BSTRPICK,
66-
67-
// Byte-swapping and bit-reversal
68-
REVB_2H,
69-
REVB_2W,
70-
BITREV_4B,
71-
BITREV_8B,
72-
BITREV_W,
73-
74-
// Intrinsic operations start ============================================
75-
BREAK,
76-
CACOP_D,
77-
CACOP_W,
78-
DBAR,
79-
IBAR,
80-
SYSCALL,
81-
82-
// CRC check operations
83-
CRC_W_B_W,
84-
CRC_W_H_W,
85-
CRC_W_W_W,
86-
CRC_W_D_W,
87-
CRCC_W_B_W,
88-
CRCC_W_H_W,
89-
CRCC_W_W_W,
90-
CRCC_W_D_W,
91-
92-
CSRRD,
93-
94-
// Write new value to CSR and return old value.
95-
// Operand 0: A chain pointer.
96-
// Operand 1: The new value to write.
97-
// Operand 2: The address of the required CSR.
98-
// Result 0: The old value of the CSR.
99-
// Result 1: The new chain pointer.
100-
CSRWR,
101-
102-
// Similar to CSRWR but with a write mask.
103-
// Operand 0: A chain pointer.
104-
// Operand 1: The new value to write.
105-
// Operand 2: The write mask.
106-
// Operand 3: The address of the required CSR.
107-
// Result 0: The old value of the CSR.
108-
// Result 1: The new chain pointer.
109-
CSRXCHG,
110-
111-
// IOCSR access operations
112-
IOCSRRD_B,
113-
IOCSRRD_W,
114-
IOCSRRD_H,
115-
IOCSRRD_D,
116-
IOCSRWR_B,
117-
IOCSRWR_H,
118-
IOCSRWR_W,
119-
IOCSRWR_D,
120-
121-
// Read CPU configuration information operation
122-
CPUCFG,
123-
124-
// Vector Shuffle
125-
VREPLVE,
126-
VSHUF,
127-
VPICKEV,
128-
VPICKOD,
129-
VPACKEV,
130-
VPACKOD,
131-
VILVL,
132-
VILVH,
133-
VSHUF4I,
134-
VREPLVEI,
135-
VREPLGR2VR,
136-
XVPERMI,
137-
138-
// Extended vector element extraction
139-
VPICK_SEXT_ELT,
140-
VPICK_ZEXT_ELT,
141-
142-
// Vector comparisons
143-
VALL_ZERO,
144-
VANY_ZERO,
145-
VALL_NONZERO,
146-
VANY_NONZERO,
147-
148-
// Floating point approximate reciprocal operation
149-
FRECIPE,
150-
FRSQRTE,
151-
152-
// Vector logicial left / right shift by immediate
153-
VSLLI,
154-
VSRLI,
155-
156-
// Vector byte logicial left / right shift
157-
VBSLL,
158-
VBSRL,
159-
160-
// Scalar load broadcast to vector
161-
VLDREPL
162-
163-
// Intrinsic operations end =============================================
164-
};
165-
} // end namespace LoongArchISD
16624

16725
class LoongArchTargetLowering : public TargetLowering {
16826
const LoongArchSubtarget &Subtarget;
@@ -182,9 +40,6 @@ class LoongArchTargetLowering : public TargetLowering {
18240

18341
SDValue PerformDAGCombine(SDNode *N, DAGCombinerInfo &DCI) const override;
18442

185-
// This method returns the name of a target specific DAG node.
186-
const char *getTargetNodeName(unsigned Opcode) const override;
187-
18843
// Lower incoming arguments, copy physregs into vregs.
18944
SDValue LowerFormalArguments(SDValue Chain, CallingConv::ID CallConv,
19045
bool IsVarArg,
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//===- LoongArchSelectionDAGInfo.cpp --------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#include "LoongArchSelectionDAGInfo.h"
10+
11+
#define GET_SDNODE_DESC
12+
#include "LoongArchGenSDNodeInfo.inc"
13+
14+
using namespace llvm;
15+
16+
LoongArchSelectionDAGInfo::LoongArchSelectionDAGInfo()
17+
: SelectionDAGGenTargetInfo(LoongArchGenSDNodeInfo) {}
18+
19+
LoongArchSelectionDAGInfo::~LoongArchSelectionDAGInfo() = default;
20+
21+
const char *
22+
LoongArchSelectionDAGInfo::getTargetNodeName(unsigned Opcode) const {
23+
switch (static_cast<LoongArchISD::NodeType>(Opcode)) {
24+
case LoongArchISD::VSHUF4I:
25+
return "LoongArchISD::VSHUF4I";
26+
}
27+
28+
return SelectionDAGGenTargetInfo::getTargetNodeName(Opcode);
29+
}
30+
31+
void LoongArchSelectionDAGInfo::verifyTargetNode(const SelectionDAG &DAG,
32+
const SDNode *N) const {
33+
if (N->getOpcode() == LoongArchISD::VLDREPL) {
34+
// invalid number of operands; expected 2, got 3
35+
return;
36+
}
37+
SelectionDAGGenTargetInfo::verifyTargetNode(DAG, N);
38+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
//===- LoongArchSelectionDAGInfo.h ------------------------------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef LLVM_LIB_TARGET_LOONGARCH_LOONGARCHSELECTIONDAGINFO_H
10+
#define LLVM_LIB_TARGET_LOONGARCH_LOONGARCHSELECTIONDAGINFO_H
11+
12+
#include "llvm/CodeGen/SelectionDAGTargetInfo.h"
13+
14+
#define GET_SDNODE_ENUM
15+
#include "LoongArchGenSDNodeInfo.inc"
16+
17+
namespace llvm {
18+
namespace LoongArchISD {
19+
20+
enum NodeType {
21+
// This is skipped by TableGen because it has conflicting SDTypeProfiles.
22+
VSHUF4I = GENERATED_OPCODE_END,
23+
};
24+
25+
} // namespace LoongArchISD
26+
27+
class LoongArchSelectionDAGInfo : public SelectionDAGGenTargetInfo {
28+
public:
29+
LoongArchSelectionDAGInfo();
30+
31+
~LoongArchSelectionDAGInfo() override;
32+
33+
const char *getTargetNodeName(unsigned Opcode) const override;
34+
35+
void verifyTargetNode(const SelectionDAG &DAG,
36+
const SDNode *N) const override;
37+
};
38+
39+
} // namespace llvm
40+
41+
#endif // LLVM_LIB_TARGET_LOONGARCH_LOONGARCHSELECTIONDAGINFO_H

0 commit comments

Comments
 (0)