@@ -71,6 +71,41 @@ def SDT_XCoreLdwsp : SDTypeProfile<1, 1, [SDTCisInt<1>]>;
7171def 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.
75110def SDT_XCoreCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32>,
76111 SDTCisVT<1, i32> ]>;
@@ -485,28 +520,35 @@ def OUTPW_l2rus : _FL2RUSBitp<0b100101101, (outs),
485520let Constraints = "$e = $a,$f = $b" in {
486521def 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
490526def 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
495532let Constraints = "$e = $b" in
496533def 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
502541def 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
507547def 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
511553def 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),
517559def 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