blob: d8c06267a73b9ea75e7cfffb89aaf0cc8ec2f2b5 [file] [log] [blame]
Anton Korobeynikov37171572009-05-03 12:57:15 +00001//===- MSP430InstrInfo.td - MSP430 Instruction defs -----------*- tblgen-*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file describes the MSP430 instructions in TableGen format.
11//
12//===----------------------------------------------------------------------===//
13
14include "MSP430InstrFormats.td"
15
16//===----------------------------------------------------------------------===//
17// Type Constraints.
18//===----------------------------------------------------------------------===//
19class SDTCisI8<int OpNum> : SDTCisVT<OpNum, i8>;
20class SDTCisI16<int OpNum> : SDTCisVT<OpNum, i16>;
21
22//===----------------------------------------------------------------------===//
23// Type Profiles.
24//===----------------------------------------------------------------------===//
25
26//===----------------------------------------------------------------------===//
27// MSP430 Specific Node Definitions.
28//===----------------------------------------------------------------------===//
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000029def MSP430retflag : SDNode<"MSP430ISD::RET_FLAG", SDTNone,
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000030 [SDNPHasChain, SDNPOptInFlag]>;
Anton Korobeynikov37171572009-05-03 12:57:15 +000031
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000032def MSP430rra : SDNode<"MSP430ISD::RRA", SDTIntUnaryOp, []>;
33
Anton Korobeynikov37171572009-05-03 12:57:15 +000034//===----------------------------------------------------------------------===//
35// Pseudo Instructions
36//===----------------------------------------------------------------------===//
37
Anton Korobeynikov57322972009-05-03 13:04:23 +000038let neverHasSideEffects = 1 in
Anton Korobeynikov37171572009-05-03 12:57:15 +000039def NOP : Pseudo<(outs), (ins), "nop", []>;
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000040
41//===----------------------------------------------------------------------===//
42// Real Instructions
43//===----------------------------------------------------------------------===//
44
45// FIXME: Provide proper encoding!
46let isReturn = 1, isTerminator = 1 in {
Anton Korobeynikov184a31c2009-05-03 13:03:33 +000047 def RETI : Pseudo<(outs), (ins), "ret", [(MSP430retflag)]>;
Anton Korobeynikovf1fb8c72009-05-03 13:02:04 +000048}
49
50//===----------------------------------------------------------------------===//
51// Move Instructions
52
53// FIXME: Provide proper encoding!
54let neverHasSideEffects = 1 in {
55def MOV16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src),
56 "mov.w\t{$src, $dst|$dst, $src}",
57 []>;
58}
59
60// FIXME: Provide proper encoding!
61let isReMaterializable = 1, isAsCheapAsAMove = 1 in {
62def MOV16ri : Pseudo<(outs GR16:$dst), (ins i16imm:$src),
63 "mov.w\t{$src, $dst|$dst, $src}",
64 [(set GR16:$dst, imm:$src)]>;
Anton Korobeynikov725e2d02009-05-03 12:59:50 +000065}
Anton Korobeynikov75b685d2009-05-03 13:02:39 +000066
67//===----------------------------------------------------------------------===//
68// Arithmetic Instructions
69
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +000070let isTwoAddress = 1 in {
Anton Korobeynikov75b685d2009-05-03 13:02:39 +000071
Anton Korobeynikovc9391402009-05-03 13:05:22 +000072let Defs = [SRW] in {
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +000073
74let isCommutable = 1 in { // X = ADD Y, Z == X = ADD Z, Y
Anton Korobeynikov75b685d2009-05-03 13:02:39 +000075// FIXME: Provide proper encoding!
76def ADD16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
77 "add.w\t{$src2, $dst|$dst, $src2}",
78 [(set GR16:$dst, (add GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +000079 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +000080}
81
82def ADD16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
83 "add.w\t{$src2, $dst|$dst, $src2}",
84 [(set GR16:$dst, (add GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +000085 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +000086
Anton Korobeynikovc9391402009-05-03 13:05:22 +000087let Uses = [SRW] in {
Anton Korobeynikov51561ed2009-05-03 13:04:41 +000088
89let isCommutable = 1 in { // X = ADDC Y, Z == X = ADDC Z, Y
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +000090def ADC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
91 "addc.w\t{$src2, $dst|$dst, $src2}",
92 [(set GR16:$dst, (adde GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +000093 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +000094} // isCommutable
95
96def ADC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
97 "addc.w\t{$src2, $dst|$dst, $src2}",
98 [(set GR16:$dst, (adde GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +000099 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000100}
101
102let isCommutable = 1 in { // X = AND Y, Z == X = AND Z, Y
103def AND16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
104 "and.w\t{$src2, $dst|$dst, $src2}",
105 [(set GR16:$dst, (and GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000106 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000107}
108
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000109def AND16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
110 "and.w\t{$src2, $dst|$dst, $src2}",
111 [(set GR16:$dst, (and GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000112 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000113
114let isCommutable = 1 in { // X = XOR Y, Z == X = XOR Z, Y
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000115def XOR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
116 "xor.w\t{$src2, $dst|$dst, $src2}",
117 [(set GR16:$dst, (xor GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000118 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000119}
120
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000121def XOR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
122 "xor.w\t{$src2, $dst|$dst, $src2}",
123 [(set GR16:$dst, (xor GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000124 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000125
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000126
127def SUB16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
128 "sub.w\t{$src2, $dst|$dst, $src2}",
129 [(set GR16:$dst, (sub GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000130 (implicit SRW)]>;
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000131
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000132def SUB16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
133 "sub.w\t{$src2, $dst|$dst, $src2}",
134 [(set GR16:$dst, (sub GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000135 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000136
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000137let Uses = [SRW] in {
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000138def SBC16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
139 "subc.w\t{$src2, $dst|$dst, $src2}",
140 [(set GR16:$dst, (sube GR16:$src1, GR16:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000141 (implicit SRW)]>;
Anton Korobeynikov51561ed2009-05-03 13:04:41 +0000142
143def SBC16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
144 "subc.w\t{$src2, $dst|$dst, $src2}",
145 [(set GR16:$dst, (sube GR16:$src1, imm:$src2)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000146 (implicit SRW)]>;
Anton Korobeynikov75b685d2009-05-03 13:02:39 +0000147}
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000148
149// FIXME: Provide proper encoding!
Anton Korobeynikov184a31c2009-05-03 13:03:33 +0000150def SAR16r1 : Pseudo<(outs GR16:$dst), (ins GR16:$src),
151 "rra.w\t$dst",
152 [(set GR16:$dst, (MSP430rra GR16:$src)),
Anton Korobeynikovc9391402009-05-03 13:05:22 +0000153 (implicit SRW)]>;
154
155def SEXT16r : Pseudo<(outs GR16:$dst), (ins GR16:$src),
156 "sxt\t$dst",
157 [(set GR16:$dst, (sext_inreg GR16:$src, i8)),
158 (implicit SRW)]>;
159
160} // Defs = [SRW]
Anton Korobeynikovf6ea9e92009-05-03 13:05:00 +0000161
162let isCommutable = 1 in { // X = OR Y, Z == X = OR Z, Y
163def OR16rr : Pseudo<(outs GR16:$dst), (ins GR16:$src1, GR16:$src2),
164 "bis.w\t{$src2, $dst|$dst, $src2}",
165 [(set GR16:$dst, (or GR16:$src1, GR16:$src2))]>;
166}
167
168def OR16ri : Pseudo<(outs GR16:$dst), (ins GR16:$src1, i16imm:$src2),
169 "bis.w\t{$src2, $dst|$dst, $src2}",
170 [(set GR16:$dst, (or GR16:$src1, imm:$src2))]>;
171
Anton Korobeynikov70ecfb72009-05-03 13:04:06 +0000172} // isTwoAddress = 1