Skip to content

Commit f69646e

Browse files
authored
[XCore] Pattern match LADD/LSUB/LMUL/MACCU/MACCS/CRC8 (#116245)
1 parent edf56f1 commit f69646e

File tree

2 files changed

+50
-47
lines changed

2 files changed

+50
-47
lines changed

llvm/lib/Target/XCore/XCoreISelDAGToDAG.cpp

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -168,47 +168,6 @@ void XCoreDAGToDAGISel::Select(SDNode *N) {
168168
}
169169
break;
170170
}
171-
case XCoreISD::LADD: {
172-
SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
173-
N->getOperand(2) };
174-
ReplaceNode(N, CurDAG->getMachineNode(XCore::LADD_l5r, dl, MVT::i32,
175-
MVT::i32, Ops));
176-
return;
177-
}
178-
case XCoreISD::LSUB: {
179-
SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
180-
N->getOperand(2) };
181-
ReplaceNode(N, CurDAG->getMachineNode(XCore::LSUB_l5r, dl, MVT::i32,
182-
MVT::i32, Ops));
183-
return;
184-
}
185-
case XCoreISD::MACCU: {
186-
SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
187-
N->getOperand(2), N->getOperand(3) };
188-
ReplaceNode(N, CurDAG->getMachineNode(XCore::MACCU_l4r, dl, MVT::i32,
189-
MVT::i32, Ops));
190-
return;
191-
}
192-
case XCoreISD::MACCS: {
193-
SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
194-
N->getOperand(2), N->getOperand(3) };
195-
ReplaceNode(N, CurDAG->getMachineNode(XCore::MACCS_l4r, dl, MVT::i32,
196-
MVT::i32, Ops));
197-
return;
198-
}
199-
case XCoreISD::LMUL: {
200-
SDValue Ops[] = { N->getOperand(0), N->getOperand(1),
201-
N->getOperand(2), N->getOperand(3) };
202-
ReplaceNode(N, CurDAG->getMachineNode(XCore::LMUL_l6r, dl, MVT::i32,
203-
MVT::i32, Ops));
204-
return;
205-
}
206-
case XCoreISD::CRC8: {
207-
SDValue Ops[] = { N->getOperand(0), N->getOperand(1), N->getOperand(2) };
208-
ReplaceNode(N, CurDAG->getMachineNode(XCore::CRC8_l4r, dl, MVT::i32,
209-
MVT::i32, Ops));
210-
return;
211-
}
212171
case ISD::BRIND:
213172
if (tryBRIND(N))
214173
return;

llvm/lib/Target/XCore/XCoreInstrInfo.td

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,41 @@ def SDT_XCoreLdwsp : SDTypeProfile<1, 1, [SDTCisInt<1>]>;
7171
def XCoreLdwsp : SDNode<"XCoreISD::LDWSP", SDT_XCoreLdwsp,
7272
[SDNPHasChain, SDNPMayLoad]>;
7373

74+
def SDT_XCoreLAddSub : SDTypeProfile<2, 3, [
75+
SDTCisVT<0, i32>, // result
76+
SDTCisVT<1, i32>, // carry out
77+
SDTCisVT<2, i32>, // lhs
78+
SDTCisVT<3, i32>, // rhs
79+
SDTCisVT<4, i32> // carry in
80+
]>;
81+
82+
def XCoreLAdd : SDNode<"XCoreISD::LADD", SDT_XCoreLAddSub>;
83+
def XCoreLSub : SDNode<"XCoreISD::LSUB", SDT_XCoreLAddSub>;
84+
85+
// Used for both long multiplication and multiply-accumulate.
86+
def SDT_XCoreMul : SDTypeProfile<2, 4, [
87+
SDTCisVT<0, i32>, // result (high part)
88+
SDTCisVT<1, i32>, // result (low part)
89+
SDTCisVT<2, i32>, // lhs
90+
SDTCisVT<3, i32>, // rhs
91+
SDTCisVT<4, i32>, // addend 1
92+
SDTCisVT<5, i32>, // addend 2
93+
]>;
94+
95+
def XCoreLMul : SDNode<"XCoreISD::LMUL", SDT_XCoreMul>;
96+
def XCoreMAccU : SDNode<"XCoreISD::MACCU", SDT_XCoreMul>;
97+
def XCoreMAccS : SDNode<"XCoreISD::MACCS", SDT_XCoreMul>;
98+
99+
def XCoreCRC8 : SDNode<"XCoreISD::CRC8",
100+
SDTypeProfile<2, 3, [
101+
SDTCisVT<0, i32>, // shifted data
102+
SDTCisVT<1, i32>, // result crc
103+
SDTCisVT<2, i32>, // initial crc
104+
SDTCisVT<3, i32>, // data
105+
SDTCisVT<4, i32>, // polynomial
106+
]>
107+
>;
108+
74109
// These are target-independent nodes, but have target-specific formats.
75110
def SDT_XCoreCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32>,
76111
SDTCisVT<1, i32> ]>;
@@ -485,28 +520,35 @@ def OUTPW_l2rus : _FL2RUSBitp<0b100101101, (outs),
485520
let Constraints = "$e = $a,$f = $b" in {
486521
def MACCU_l4r : _FL4RSrcDstSrcDst<
487522
0b000001, (outs GRRegs:$a, GRRegs:$b),
488-
(ins GRRegs:$e, GRRegs:$f, GRRegs:$c, GRRegs:$d), "maccu $a, $b, $c, $d", []>;
523+
(ins GRRegs:$e, GRRegs:$f, GRRegs:$c, GRRegs:$d), "maccu $a, $b, $c, $d",
524+
[(set i32:$a, i32:$b, (XCoreMAccU i32:$e, i32:$f, i32:$c, i32:$d))]>;
489525

490526
def MACCS_l4r : _FL4RSrcDstSrcDst<
491527
0b000010, (outs GRRegs:$a, GRRegs:$b),
492-
(ins GRRegs:$e, GRRegs:$f, GRRegs:$c, GRRegs:$d), "maccs $a, $b, $c, $d", []>;
528+
(ins GRRegs:$e, GRRegs:$f, GRRegs:$c, GRRegs:$d), "maccs $a, $b, $c, $d",
529+
[(set i32:$a, i32:$b, (XCoreMAccS i32:$e, i32:$f, i32:$c, i32:$d))]>;
493530
}
494531

495532
let Constraints = "$e = $b" in
496533
def CRC8_l4r : _FL4RSrcDst<0b000000, (outs GRRegs:$a, GRRegs:$b),
497534
(ins GRRegs:$e, GRRegs:$c, GRRegs:$d),
498-
"crc8 $b, $a, $c, $d", []>;
535+
"crc8 $b, $a, $c, $d",
536+
[(set i32:$a, i32:$b,
537+
(XCoreCRC8 i32:$e, i32:$c, i32:$d))]>;
499538

500539
// Five operand long
501540

502541
def LADD_l5r : _FL5R<0b000001, (outs GRRegs:$dst1, GRRegs:$dst2),
503542
(ins GRRegs:$src1, GRRegs:$src2, GRRegs:$src3),
504543
"ladd $dst2, $dst1, $src1, $src2, $src3",
505-
[]>;
544+
[(set i32:$dst1, i32:$dst2,
545+
(XCoreLAdd i32:$src1, i32:$src2, i32:$src3))]>;
506546

507547
def LSUB_l5r : _FL5R<0b000010, (outs GRRegs:$dst1, GRRegs:$dst2),
508548
(ins GRRegs:$src1, GRRegs:$src2, GRRegs:$src3),
509-
"lsub $dst2, $dst1, $src1, $src2, $src3", []>;
549+
"lsub $dst2, $dst1, $src1, $src2, $src3",
550+
[(set i32:$dst1, i32:$dst2,
551+
(XCoreLSub i32:$src1, i32:$src2, i32:$src3))]>;
510552

511553
def LDIVU_l5r : _FL5R<0b000000, (outs GRRegs:$dst1, GRRegs:$dst2),
512554
(ins GRRegs:$src1, GRRegs:$src2, GRRegs:$src3),
@@ -517,7 +559,9 @@ def LDIVU_l5r : _FL5R<0b000000, (outs GRRegs:$dst1, GRRegs:$dst2),
517559
def LMUL_l6r : _FL6R<
518560
0b00000, (outs GRRegs:$dst1, GRRegs:$dst2),
519561
(ins GRRegs:$src1, GRRegs:$src2, GRRegs:$src3, GRRegs:$src4),
520-
"lmul $dst1, $dst2, $src1, $src2, $src3, $src4", []>;
562+
"lmul $dst1, $dst2, $src1, $src2, $src3, $src4",
563+
[(set i32:$dst1, i32:$dst2,
564+
(XCoreLMul i32:$src1, i32:$src2, i32:$src3, i32:$src4))]>;
521565

522566
// Register - U6
523567

0 commit comments

Comments
 (0)