@@ -71,6 +71,41 @@ def SDT_XCoreLdwsp : SDTypeProfile<1, 1, [SDTCisInt<1>]>;
71
71
def XCoreLdwsp : SDNode<"XCoreISD::LDWSP", SDT_XCoreLdwsp,
72
72
[SDNPHasChain, SDNPMayLoad]>;
73
73
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
+
74
109
// These are target-independent nodes, but have target-specific formats.
75
110
def SDT_XCoreCallSeqStart : SDCallSeqStart<[ SDTCisVT<0, i32>,
76
111
SDTCisVT<1, i32> ]>;
@@ -485,28 +520,35 @@ def OUTPW_l2rus : _FL2RUSBitp<0b100101101, (outs),
485
520
let Constraints = "$e = $a,$f = $b" in {
486
521
def MACCU_l4r : _FL4RSrcDstSrcDst<
487
522
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))]>;
489
525
490
526
def MACCS_l4r : _FL4RSrcDstSrcDst<
491
527
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))]>;
493
530
}
494
531
495
532
let Constraints = "$e = $b" in
496
533
def CRC8_l4r : _FL4RSrcDst<0b000000, (outs GRRegs:$a, GRRegs:$b),
497
534
(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))]>;
499
538
500
539
// Five operand long
501
540
502
541
def LADD_l5r : _FL5R<0b000001, (outs GRRegs:$dst1, GRRegs:$dst2),
503
542
(ins GRRegs:$src1, GRRegs:$src2, GRRegs:$src3),
504
543
"ladd $dst2, $dst1, $src1, $src2, $src3",
505
- []>;
544
+ [(set i32:$dst1, i32:$dst2,
545
+ (XCoreLAdd i32:$src1, i32:$src2, i32:$src3))]>;
506
546
507
547
def LSUB_l5r : _FL5R<0b000010, (outs GRRegs:$dst1, GRRegs:$dst2),
508
548
(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))]>;
510
552
511
553
def LDIVU_l5r : _FL5R<0b000000, (outs GRRegs:$dst1, GRRegs:$dst2),
512
554
(ins GRRegs:$src1, GRRegs:$src2, GRRegs:$src3),
@@ -517,7 +559,9 @@ def LDIVU_l5r : _FL5R<0b000000, (outs GRRegs:$dst1, GRRegs:$dst2),
517
559
def LMUL_l6r : _FL6R<
518
560
0b00000, (outs GRRegs:$dst1, GRRegs:$dst2),
519
561
(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))]>;
521
565
522
566
// Register - U6
523
567
0 commit comments