xref: /aosp_15_r20/external/llvm/lib/Target/AVR/AVRInstrFormats.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker//===-- AVRInstrInfo.td - AVR Instruction Formats ----------*- tablegen -*-===//
2*9880d681SAndroid Build Coastguard Worker//
3*9880d681SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker//
8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker//
10*9880d681SAndroid Build Coastguard Worker// AVR Instruction Format Definitions.
11*9880d681SAndroid Build Coastguard Worker//
12*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker// A generic AVR instruction.
15*9880d681SAndroid Build Coastguard Workerclass AVRInst<dag outs, dag ins, string asmstr, list<dag> pattern> : Instruction
16*9880d681SAndroid Build Coastguard Worker{
17*9880d681SAndroid Build Coastguard Worker  let Namespace = "AVR";
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker  dag OutOperandList = outs;
20*9880d681SAndroid Build Coastguard Worker  dag InOperandList = ins;
21*9880d681SAndroid Build Coastguard Worker  let AsmString = asmstr;
22*9880d681SAndroid Build Coastguard Worker  let Pattern = pattern;
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker/// A 16-bit AVR instruction.
26*9880d681SAndroid Build Coastguard Workerclass AVRInst16<dag outs, dag ins, string asmstr, list<dag> pattern>
27*9880d681SAndroid Build Coastguard Worker  : AVRInst<outs, ins, asmstr, pattern>
28*9880d681SAndroid Build Coastguard Worker{
29*9880d681SAndroid Build Coastguard Worker  field bits<16> Inst;
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker  let Size = 2;
32*9880d681SAndroid Build Coastguard Worker}
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Worker/// a 32-bit AVR instruction.
35*9880d681SAndroid Build Coastguard Workerclass AVRInst32<dag outs, dag ins, string asmstr, list<dag> pattern>
36*9880d681SAndroid Build Coastguard Worker  : AVRInst<outs, ins, asmstr, pattern>
37*9880d681SAndroid Build Coastguard Worker{
38*9880d681SAndroid Build Coastguard Worker  field bits<32> Inst;
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker  let Size = 4;
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker// A class for pseudo instructions.
44*9880d681SAndroid Build Coastguard Worker// Psuedo instructions are not real AVR instructions. The DAG stores
45*9880d681SAndroid Build Coastguard Worker// psuedo instructions which are replaced by real AVR instructions by
46*9880d681SAndroid Build Coastguard Worker// AVRExpandPseudoInsts.cpp.
47*9880d681SAndroid Build Coastguard Worker//
48*9880d681SAndroid Build Coastguard Worker// For example, the ADDW (add wide, as in add 16 bit values) instruction
49*9880d681SAndroid Build Coastguard Worker// is defined as a pseudo instruction. In AVRExpandPseudoInsts.cpp,
50*9880d681SAndroid Build Coastguard Worker// the instruction is then replaced by two add instructions - one for each byte.
51*9880d681SAndroid Build Coastguard Workerclass Pseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
52*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
53*9880d681SAndroid Build Coastguard Worker{
54*9880d681SAndroid Build Coastguard Worker  let Pattern = pattern;
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker  let isPseudo = 1;
57*9880d681SAndroid Build Coastguard Worker  let isCodeGenOnly = 1;
58*9880d681SAndroid Build Coastguard Worker}
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
61*9880d681SAndroid Build Coastguard Worker// Register / register instruction: <|opcode|ffrd|dddd|rrrr|>
62*9880d681SAndroid Build Coastguard Worker// opcode = 4 bits.
63*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 2 bits
64*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits
65*9880d681SAndroid Build Coastguard Worker// r = source = 5 bits
66*9880d681SAndroid Build Coastguard Worker// (Accepts all registers)
67*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
68*9880d681SAndroid Build Coastguard Workerclass FRdRr<bits<4> opcode, bits<2> f, dag outs, dag ins, string asmstr,
69*9880d681SAndroid Build Coastguard Worker            list<dag> pattern> : AVRInst16<outs, ins, asmstr, pattern>
70*9880d681SAndroid Build Coastguard Worker{
71*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
72*9880d681SAndroid Build Coastguard Worker  bits<5> rr;
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = opcode;
75*9880d681SAndroid Build Coastguard Worker  let Inst{11-10} = f;
76*9880d681SAndroid Build Coastguard Worker  let Inst{9} = rr{4};
77*9880d681SAndroid Build Coastguard Worker  let Inst{8-4} = rd;
78*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = rr{3-0};
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerclass FTST<bits<4> opcode, bits<2> f, dag outs, dag ins, string asmstr,
82*9880d681SAndroid Build Coastguard Worker            list<dag> pattern> : AVRInst16<outs, ins, asmstr, pattern>
83*9880d681SAndroid Build Coastguard Worker{
84*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = opcode;
87*9880d681SAndroid Build Coastguard Worker  let Inst{11-10} = f;
88*9880d681SAndroid Build Coastguard Worker  let Inst{9} = rd{4};
89*9880d681SAndroid Build Coastguard Worker  let Inst{8-4} = rd;
90*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = rd{3-0};
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
94*9880d681SAndroid Build Coastguard Worker// Instruction of the format `<mnemonic> Z, Rd`
95*9880d681SAndroid Build Coastguard Worker// <|1001|001r|rrrr|0ttt>
96*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
97*9880d681SAndroid Build Coastguard Workerclass FZRd<bits<3> t, dag outs, dag ins, string asmstr, list<dag> pattern>
98*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
99*9880d681SAndroid Build Coastguard Worker{
100*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = 0b1001;
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard Worker  let Inst{11-9} = 0b001;
105*9880d681SAndroid Build Coastguard Worker  let Inst{8} = rd{4};
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = rd{3-0};
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker  let Inst{3} = 0;
110*9880d681SAndroid Build Coastguard Worker  let Inst{2-0} = t;
111*9880d681SAndroid Build Coastguard Worker}
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
114*9880d681SAndroid Build Coastguard Worker// Register / immediate8 instruction: <|opcode|KKKK|dddd|KKKK|>
115*9880d681SAndroid Build Coastguard Worker// opcode = 4 bits.
116*9880d681SAndroid Build Coastguard Worker// K = constant data = 8 bits
117*9880d681SAndroid Build Coastguard Worker// d = destination = 4 bits
118*9880d681SAndroid Build Coastguard Worker// (Only accepts r16-r31)
119*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
120*9880d681SAndroid Build Coastguard Workerclass FRdK<bits<4> opcode, dag outs, dag ins, string asmstr, list<dag> pattern>
121*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
122*9880d681SAndroid Build Coastguard Worker{
123*9880d681SAndroid Build Coastguard Worker  bits<4> rd;
124*9880d681SAndroid Build Coastguard Worker  bits<8> k;
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = opcode;
127*9880d681SAndroid Build Coastguard Worker  let Inst{11-8} = k{7-4};
128*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = rd{3-0};
129*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = k{3-0};
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker  let isAsCheapAsAMove = 1;
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
135*9880d681SAndroid Build Coastguard Worker// Register instruction: <|opcode|fffd|dddd|ffff|>
136*9880d681SAndroid Build Coastguard Worker// opcode = 4 bits.
137*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 7 bits
138*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits
139*9880d681SAndroid Build Coastguard Worker// (Accepts all registers)
140*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
141*9880d681SAndroid Build Coastguard Workerclass FRd<bits<4> opcode, bits<7> f, dag outs, dag ins, string asmstr,
142*9880d681SAndroid Build Coastguard Worker          list<dag> pattern> : AVRInst16<outs, ins, asmstr, pattern>
143*9880d681SAndroid Build Coastguard Worker{
144*9880d681SAndroid Build Coastguard Worker  bits<5> d;
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = opcode;
147*9880d681SAndroid Build Coastguard Worker  let Inst{11-9} = f{6-4};
148*9880d681SAndroid Build Coastguard Worker  let Inst{8-4} = d;
149*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = f{3-0};
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
153*9880d681SAndroid Build Coastguard Worker// [STD/LDD] P+q, Rr special encoding: <|10q0|qqtr|rrrr|pqqq>
154*9880d681SAndroid Build Coastguard Worker// t = type (1 for STD, 0 for LDD)
155*9880d681SAndroid Build Coastguard Worker// q = displacement (6 bits)
156*9880d681SAndroid Build Coastguard Worker// r = register (5 bits)
157*9880d681SAndroid Build Coastguard Worker// p = pointer register (1 bit) [1 for Y, 0 for Z]
158*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
159*9880d681SAndroid Build Coastguard Workerclass FSTDLDD<bit type, dag outs, dag ins, string asmstr, list<dag> pattern>
160*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
161*9880d681SAndroid Build Coastguard Worker{
162*9880d681SAndroid Build Coastguard Worker  bits<7> memri;
163*9880d681SAndroid Build Coastguard Worker  bits<5> reg; // the GP register
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker  let Inst{15-14} = 0b10;
166*9880d681SAndroid Build Coastguard Worker  let Inst{13} = memri{5};
167*9880d681SAndroid Build Coastguard Worker  let Inst{12} = 0;
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Worker  let Inst{11-10} = memri{4-3};
170*9880d681SAndroid Build Coastguard Worker  let Inst{9} = type;
171*9880d681SAndroid Build Coastguard Worker  let Inst{8} = reg{4};
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = reg{3-0};
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker  let Inst{3} = memri{6};
176*9880d681SAndroid Build Coastguard Worker  let Inst{2-0} = memri{2-0};
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
180*9880d681SAndroid Build Coastguard Worker// An ST/LD instruction.
181*9880d681SAndroid Build Coastguard Worker// <|100i|00tr|rrrr|ppaa|>
182*9880d681SAndroid Build Coastguard Worker// t = type (1 for store, 0 for load)
183*9880d681SAndroid Build Coastguard Worker// a = regular/postinc/predec (reg = 0b00, postinc = 0b01, predec = 0b10)
184*9880d681SAndroid Build Coastguard Worker// p = pointer register
185*9880d681SAndroid Build Coastguard Worker// r = src/dst register
186*9880d681SAndroid Build Coastguard Worker//
187*9880d681SAndroid Build Coastguard Worker// Note that the bit labelled 'i' above does not follow a simple pattern,
188*9880d681SAndroid Build Coastguard Worker// so there exists a post encoder method to set it manually.
189*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
190*9880d681SAndroid Build Coastguard Workerclass FSTLD<bit type, bits<2> mode, dag outs, dag ins,
191*9880d681SAndroid Build Coastguard Worker            string asmstr, list<dag> pattern>
192*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
193*9880d681SAndroid Build Coastguard Worker{
194*9880d681SAndroid Build Coastguard Worker  bits<2> ptrreg;
195*9880d681SAndroid Build Coastguard Worker  bits<5> reg;
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker  let Inst{15-13} = 0b100;
198*9880d681SAndroid Build Coastguard Worker  // This bit varies depending on the arguments and the mode.
199*9880d681SAndroid Build Coastguard Worker  // We have a post encoder method to set this bit manually.
200*9880d681SAndroid Build Coastguard Worker  let Inst{12} = 0;
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker  let Inst{11-10} = 0b00;
203*9880d681SAndroid Build Coastguard Worker  let Inst{9} = type;
204*9880d681SAndroid Build Coastguard Worker  let Inst{8} = reg{4};
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = reg{3-0};
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker  let Inst{3-2} = ptrreg{1-0};
209*9880d681SAndroid Build Coastguard Worker  let Inst{1-0} = mode{1-0};
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker  let PostEncoderMethod = "loadStorePostEncoder";
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
215*9880d681SAndroid Build Coastguard Worker// Special format for the LPM/ELPM instructions
216*9880d681SAndroid Build Coastguard Worker// [E]LPM Rd, Z[+]
217*9880d681SAndroid Build Coastguard Worker// <|1001|000d|dddd|01ep>
218*9880d681SAndroid Build Coastguard Worker// d = destination register
219*9880d681SAndroid Build Coastguard Worker// e = is elpm
220*9880d681SAndroid Build Coastguard Worker// p = is postincrement
221*9880d681SAndroid Build Coastguard Worker//===---------------------------------------------------------------------===//
222*9880d681SAndroid Build Coastguard Workerclass FLPMX<bit e, bit p, dag outs, dag ins, string asmstr, list<dag> pattern>
223*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
224*9880d681SAndroid Build Coastguard Worker{
225*9880d681SAndroid Build Coastguard Worker   bits<5> reg;
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker   let Inst{15-12} = 0b1001;
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Worker   let Inst{11-9} = 0b000;
230*9880d681SAndroid Build Coastguard Worker   let Inst{8} = reg{4};
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker   let Inst{7-4} = reg{3-0};
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Worker   let Inst{3-2} = 0b01;
235*9880d681SAndroid Build Coastguard Worker   let Inst{1} = e;
236*9880d681SAndroid Build Coastguard Worker   let Inst{0} = p;
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
240*9880d681SAndroid Build Coastguard Worker// MOVWRdRr special encoding: <|0000|0001|dddd|rrrr|>
241*9880d681SAndroid Build Coastguard Worker// d = destination = 4 bits
242*9880d681SAndroid Build Coastguard Worker// r = source = 4 bits
243*9880d681SAndroid Build Coastguard Worker// (Only accepts even registers)
244*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
245*9880d681SAndroid Build Coastguard Workerclass FMOVWRdRr<dag outs, dag ins, string asmstr, list<dag> pattern>
246*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
247*9880d681SAndroid Build Coastguard Worker{
248*9880d681SAndroid Build Coastguard Worker  bits<5> d;
249*9880d681SAndroid Build Coastguard Worker  bits<5> r;
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker  let Inst{15-8} = 0b00000001;
252*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = d{4-1};
253*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = r{4-1};
254*9880d681SAndroid Build Coastguard Worker}
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
257*9880d681SAndroid Build Coastguard Worker// MULSrr special encoding: <|0000|0010|dddd|rrrr|>
258*9880d681SAndroid Build Coastguard Worker// d = multiplicand = 4 bits
259*9880d681SAndroid Build Coastguard Worker// r = multiplier = 4 bits
260*9880d681SAndroid Build Coastguard Worker// (Only accepts r16-r31)
261*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
262*9880d681SAndroid Build Coastguard Workerclass FMUL2RdRr<bit f, dag outs, dag ins, string asmstr, list<dag> pattern>
263*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
264*9880d681SAndroid Build Coastguard Worker{
265*9880d681SAndroid Build Coastguard Worker  bits<5> rd;              // accept 5 bits but only encode the lower 4
266*9880d681SAndroid Build Coastguard Worker  bits<5> rr;              // accept 5 bits but only encode the lower 4
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker  let Inst{15-9} = 0b0000001;
269*9880d681SAndroid Build Coastguard Worker  let Inst{8} = f;
270*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = rd{3-0};
271*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = rr{3-0};
272*9880d681SAndroid Build Coastguard Worker}
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Worker// Special encoding for the FMUL family of instructions.
275*9880d681SAndroid Build Coastguard Worker//
276*9880d681SAndroid Build Coastguard Worker// <0000|0011|fddd|frrr|>
277*9880d681SAndroid Build Coastguard Worker//
278*9880d681SAndroid Build Coastguard Worker// ff = 0b01 for FMUL
279*9880d681SAndroid Build Coastguard Worker//      0b10 for FMULS
280*9880d681SAndroid Build Coastguard Worker//      0b11 for FMULSU
281*9880d681SAndroid Build Coastguard Worker//
282*9880d681SAndroid Build Coastguard Worker// ddd = destination register
283*9880d681SAndroid Build Coastguard Worker// rrr = source register
284*9880d681SAndroid Build Coastguard Workerclass FFMULRdRr<bits<2> f, dag outs, dag ins, string asmstr, list<dag> pattern>
285*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
286*9880d681SAndroid Build Coastguard Worker{
287*9880d681SAndroid Build Coastguard Worker  bits<3> rd;
288*9880d681SAndroid Build Coastguard Worker  bits<3> rr;
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Worker  let Inst{15-8} = 0b00000011;
291*9880d681SAndroid Build Coastguard Worker  let Inst{7} = f{1};
292*9880d681SAndroid Build Coastguard Worker  let Inst{6-4} = rd;
293*9880d681SAndroid Build Coastguard Worker  let Inst{3} = f{0};
294*9880d681SAndroid Build Coastguard Worker  let Inst{2-0} = rr;
295*9880d681SAndroid Build Coastguard Worker}
296*9880d681SAndroid Build Coastguard Worker
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
299*9880d681SAndroid Build Coastguard Worker// Arithmetic word instructions (ADIW / SBIW): <|1001|011f|kkdd|kkkk|>
300*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 1 bit
301*9880d681SAndroid Build Coastguard Worker// k = constant data = 6 bits
302*9880d681SAndroid Build Coastguard Worker// d = destination = 4 bits
303*9880d681SAndroid Build Coastguard Worker// (Only accepts r25:24 r27:26 r29:28 r31:30)
304*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
305*9880d681SAndroid Build Coastguard Workerclass FWRdK<bit f, dag outs, dag ins, string asmstr, list<dag> pattern>
306*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
307*9880d681SAndroid Build Coastguard Worker{
308*9880d681SAndroid Build Coastguard Worker  bits<5> dst;              // accept 5 bits but only encode bits 1 and 2
309*9880d681SAndroid Build Coastguard Worker  bits<6> k;
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker  let Inst{15-9} = 0b1001011;
312*9880d681SAndroid Build Coastguard Worker  let Inst{8} = f;
313*9880d681SAndroid Build Coastguard Worker  let Inst{7-6} = k{5-4};
314*9880d681SAndroid Build Coastguard Worker  let Inst{5-4} = dst{2-1};
315*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = k{3-0};
316*9880d681SAndroid Build Coastguard Worker}
317*9880d681SAndroid Build Coastguard Worker
318*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
319*9880d681SAndroid Build Coastguard Worker// In I/O instruction: <|1011|0AAd|dddd|AAAA|>
320*9880d681SAndroid Build Coastguard Worker// A = I/O location address = 6 bits
321*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits
322*9880d681SAndroid Build Coastguard Worker// (Accepts all registers)
323*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
324*9880d681SAndroid Build Coastguard Workerclass FIORdA<dag outs, dag ins, string asmstr, list<dag> pattern>
325*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
326*9880d681SAndroid Build Coastguard Worker{
327*9880d681SAndroid Build Coastguard Worker  bits<5> d;
328*9880d681SAndroid Build Coastguard Worker  bits<6> A;
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = 0b10110;
331*9880d681SAndroid Build Coastguard Worker  let Inst{10-9} = A{5-4};
332*9880d681SAndroid Build Coastguard Worker  let Inst{8-4} = d;
333*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = A{3-0};
334*9880d681SAndroid Build Coastguard Worker}
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
337*9880d681SAndroid Build Coastguard Worker// Out I/O instruction: <|1011|1AAr|rrrr|AAAA|>
338*9880d681SAndroid Build Coastguard Worker// A = I/O location address = 6 bits
339*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits
340*9880d681SAndroid Build Coastguard Worker// (Accepts all registers)
341*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
342*9880d681SAndroid Build Coastguard Workerclass FIOARr<dag outs, dag ins, string asmstr, list<dag> pattern>
343*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
344*9880d681SAndroid Build Coastguard Worker{
345*9880d681SAndroid Build Coastguard Worker  bits<6> A;
346*9880d681SAndroid Build Coastguard Worker  bits<5> r;
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = 0b10111;
349*9880d681SAndroid Build Coastguard Worker  let Inst{10-9} = A{5-4};
350*9880d681SAndroid Build Coastguard Worker  let Inst{8-4} = r;
351*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = A{3-0};
352*9880d681SAndroid Build Coastguard Worker}
353*9880d681SAndroid Build Coastguard Worker
354*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
355*9880d681SAndroid Build Coastguard Worker// I/O bit instruction.
356*9880d681SAndroid Build Coastguard Worker// <|1001|10tt|AAAA|Abbb>
357*9880d681SAndroid Build Coastguard Worker// t = type (1 for SBI, 0 for CBI)
358*9880d681SAndroid Build Coastguard Worker// A = I/O location address (5 bits)
359*9880d681SAndroid Build Coastguard Worker// b = bit number
360*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
361*9880d681SAndroid Build Coastguard Workerclass FIOBIT<bits<2> t, dag outs, dag ins, string asmstr, list<dag> pattern>
362*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
363*9880d681SAndroid Build Coastguard Worker{
364*9880d681SAndroid Build Coastguard Worker  bits<5> A;
365*9880d681SAndroid Build Coastguard Worker  bits<3> b;
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = 0b1001;
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker  let Inst{11-10} = 0b10;
370*9880d681SAndroid Build Coastguard Worker  let Inst{9-8} = t;
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = A{4-1};
373*9880d681SAndroid Build Coastguard Worker
374*9880d681SAndroid Build Coastguard Worker  let Inst{3} = A{0};
375*9880d681SAndroid Build Coastguard Worker  let Inst{2-0} = b{2-0};
376*9880d681SAndroid Build Coastguard Worker}
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
379*9880d681SAndroid Build Coastguard Worker// BST/BLD instruction.
380*9880d681SAndroid Build Coastguard Worker// <|1111|1ttd|dddd|0bbb>
381*9880d681SAndroid Build Coastguard Worker// t = type (1 for BST, 0 for BLD)
382*9880d681SAndroid Build Coastguard Worker// d = destination register
383*9880d681SAndroid Build Coastguard Worker// b = bit
384*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
385*9880d681SAndroid Build Coastguard Workerclass FRdB<bits<2> t, dag outs, dag ins, string asmstr, list<dag> pattern>
386*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
387*9880d681SAndroid Build Coastguard Worker{
388*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
389*9880d681SAndroid Build Coastguard Worker  bits<3> b;
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = 0b1111;
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Worker  let Inst{11} = 0b1;
394*9880d681SAndroid Build Coastguard Worker  let Inst{10-9} = t;
395*9880d681SAndroid Build Coastguard Worker  let Inst{8} = rd{4};
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = rd{3-0};
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Worker  let Inst{3} = 0;
400*9880d681SAndroid Build Coastguard Worker  let Inst{2-0} = b;
401*9880d681SAndroid Build Coastguard Worker}
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Worker// Special encoding for the `DES K` instruction.
404*9880d681SAndroid Build Coastguard Worker//
405*9880d681SAndroid Build Coastguard Worker// <|1001|0100|KKKK|1011>
406*9880d681SAndroid Build Coastguard Worker//
407*9880d681SAndroid Build Coastguard Worker// KKKK = 4 bit immediate
408*9880d681SAndroid Build Coastguard Workerclass FDES<dag outs, dag ins, string asmstr, list<dag> pattern>
409*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
410*9880d681SAndroid Build Coastguard Worker{
411*9880d681SAndroid Build Coastguard Worker  bits<4> k;
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = 0b1001;
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Worker  let Inst{11-8} = 0b0100;
416*9880d681SAndroid Build Coastguard Worker
417*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = k;
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = 0b1011;
420*9880d681SAndroid Build Coastguard Worker}
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
423*9880d681SAndroid Build Coastguard Worker// Conditional Branching instructions: <|1111|0fkk|kkkk|ksss|>
424*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 1 bit
425*9880d681SAndroid Build Coastguard Worker// k = constant address = 7 bits
426*9880d681SAndroid Build Coastguard Worker// s = bit in status register = 3 bits
427*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
428*9880d681SAndroid Build Coastguard Workerclass FBRsk<bit f, bits<3> s, dag outs, dag ins, string asmstr, list<dag> pattern>
429*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
430*9880d681SAndroid Build Coastguard Worker{
431*9880d681SAndroid Build Coastguard Worker  bits<7> k;
432*9880d681SAndroid Build Coastguard Worker
433*9880d681SAndroid Build Coastguard Worker  let Inst{15-11} = 0b11110;
434*9880d681SAndroid Build Coastguard Worker  let Inst{10} = f;
435*9880d681SAndroid Build Coastguard Worker  let Inst{9-3} = k;
436*9880d681SAndroid Build Coastguard Worker  let Inst{2-0} = s;
437*9880d681SAndroid Build Coastguard Worker}
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
440*9880d681SAndroid Build Coastguard Worker// Special, opcode only instructions: <|opcode|>
441*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
442*9880d681SAndroid Build Coastguard Worker
443*9880d681SAndroid Build Coastguard Workerclass F16<bits<16> opcode, dag outs, dag ins, string asmstr, list<dag> pattern>
444*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
445*9880d681SAndroid Build Coastguard Worker{
446*9880d681SAndroid Build Coastguard Worker  let Inst = opcode;
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Workerclass F32<bits<32> opcode, dag outs, dag ins, string asmstr, list<dag> pattern>
450*9880d681SAndroid Build Coastguard Worker  : AVRInst32<outs, ins, asmstr, pattern>
451*9880d681SAndroid Build Coastguard Worker{
452*9880d681SAndroid Build Coastguard Worker  let Inst = opcode;
453*9880d681SAndroid Build Coastguard Worker}
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
456*9880d681SAndroid Build Coastguard Worker// Branching instructions with immediate12: <|110f|kkkk|kkkk|kkkk|>
457*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 1 bit
458*9880d681SAndroid Build Coastguard Worker// k = constant address = 12 bits
459*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
460*9880d681SAndroid Build Coastguard Workerclass FBRk<bit f, dag outs, dag ins, string asmstr, list<dag> pattern>
461*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
462*9880d681SAndroid Build Coastguard Worker{
463*9880d681SAndroid Build Coastguard Worker  bits<12> k;
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Worker  let Inst{15-13} = 0b110;
466*9880d681SAndroid Build Coastguard Worker  let Inst{12} = f;
467*9880d681SAndroid Build Coastguard Worker  let Inst{11-0} = k;
468*9880d681SAndroid Build Coastguard Worker}
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
471*9880d681SAndroid Build Coastguard Worker// 32 bits branching instructions: <|1001|010k|kkkk|fffk|kkkk|kkkk|kkkk|kkkk|>
472*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 3 bits
473*9880d681SAndroid Build Coastguard Worker// k = constant address = 22 bits
474*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
475*9880d681SAndroid Build Coastguard Workerclass F32BRk<bits<3> f, dag outs, dag ins, string asmstr, list<dag> pattern>
476*9880d681SAndroid Build Coastguard Worker  : AVRInst32<outs, ins, asmstr, pattern>
477*9880d681SAndroid Build Coastguard Worker{
478*9880d681SAndroid Build Coastguard Worker  bits<22> k;
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Worker  let Inst{31-25} = 0b1001010;
481*9880d681SAndroid Build Coastguard Worker  let Inst{24-20} = k{21-17};
482*9880d681SAndroid Build Coastguard Worker  let Inst{19-17} = f;
483*9880d681SAndroid Build Coastguard Worker  let Inst{16-0} = k{16-0};
484*9880d681SAndroid Build Coastguard Worker}
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
487*9880d681SAndroid Build Coastguard Worker// 32 bits direct mem instructions: <|1001|00fd|dddd|0000|kkkk|kkkk|kkkk|kkkk|>
488*9880d681SAndroid Build Coastguard Worker// f = secondary opcode = 1 bit
489*9880d681SAndroid Build Coastguard Worker// d = destination = 5 bits
490*9880d681SAndroid Build Coastguard Worker// k = constant address = 16 bits
491*9880d681SAndroid Build Coastguard Worker// (Accepts all registers)
492*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
493*9880d681SAndroid Build Coastguard Workerclass F32DM<bit f, dag outs, dag ins, string asmstr, list<dag> pattern>
494*9880d681SAndroid Build Coastguard Worker  : AVRInst32<outs, ins, asmstr, pattern>
495*9880d681SAndroid Build Coastguard Worker{
496*9880d681SAndroid Build Coastguard Worker  bits<5> rd;
497*9880d681SAndroid Build Coastguard Worker  bits<16> k;
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Worker  let Inst{31-28} = 0b1001;
500*9880d681SAndroid Build Coastguard Worker
501*9880d681SAndroid Build Coastguard Worker  let Inst{27-26} = 0b00;
502*9880d681SAndroid Build Coastguard Worker  let Inst{25} = f;
503*9880d681SAndroid Build Coastguard Worker  let Inst{24} = rd{4};
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Worker  let Inst{23-20} = rd{3-0};
506*9880d681SAndroid Build Coastguard Worker
507*9880d681SAndroid Build Coastguard Worker  let Inst{19-16} = 0b0000;
508*9880d681SAndroid Build Coastguard Worker
509*9880d681SAndroid Build Coastguard Worker  let Inst{15-0} = k;
510*9880d681SAndroid Build Coastguard Worker}
511*9880d681SAndroid Build Coastguard Worker
512*9880d681SAndroid Build Coastguard Worker// <|1001|0100|bfff|1000>
513*9880d681SAndroid Build Coastguard Workerclass FS<bit b, dag outs, dag ins, string asmstr, list<dag> pattern>
514*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
515*9880d681SAndroid Build Coastguard Worker{
516*9880d681SAndroid Build Coastguard Worker  bits<3> s;
517*9880d681SAndroid Build Coastguard Worker
518*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = 0b1001;
519*9880d681SAndroid Build Coastguard Worker
520*9880d681SAndroid Build Coastguard Worker  let Inst{11-8} = 0b0100;
521*9880d681SAndroid Build Coastguard Worker
522*9880d681SAndroid Build Coastguard Worker  let Inst{7} = b;
523*9880d681SAndroid Build Coastguard Worker  let Inst{6-4} = s;
524*9880d681SAndroid Build Coastguard Worker
525*9880d681SAndroid Build Coastguard Worker  let Inst{3-0} = 0b1000;
526*9880d681SAndroid Build Coastguard Worker}
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Worker// Set/clr bit in status flag instructions/
529*9880d681SAndroid Build Coastguard Worker// <BRBS|BRBC> s, k
530*9880d681SAndroid Build Coastguard Worker// ---------------------
531*9880d681SAndroid Build Coastguard Worker// <|1111|0fkk|kkkk|ksss>
532*9880d681SAndroid Build Coastguard Workerclass FSK<bit f, dag outs, dag ins, string asmstr, list<dag> pattern>
533*9880d681SAndroid Build Coastguard Worker  : AVRInst16<outs, ins, asmstr, pattern>
534*9880d681SAndroid Build Coastguard Worker{
535*9880d681SAndroid Build Coastguard Worker  bits<7> k;
536*9880d681SAndroid Build Coastguard Worker  bits<3> s;
537*9880d681SAndroid Build Coastguard Worker
538*9880d681SAndroid Build Coastguard Worker  let Inst{15-12} = 0b1111;
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Worker  let Inst{11} = 0;
541*9880d681SAndroid Build Coastguard Worker  let Inst{10} = f;
542*9880d681SAndroid Build Coastguard Worker  let Inst{9-8} = k{6-5};
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Worker  let Inst{7-4} = k{4-1};
545*9880d681SAndroid Build Coastguard Worker
546*9880d681SAndroid Build Coastguard Worker  let Inst{3} = k{0};
547*9880d681SAndroid Build Coastguard Worker  let Inst{2-0} = s;
548*9880d681SAndroid Build Coastguard Worker}
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Workerclass ExtensionPseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
551*9880d681SAndroid Build Coastguard Worker  : Pseudo<outs, ins, asmstr, pattern>
552*9880d681SAndroid Build Coastguard Worker{
553*9880d681SAndroid Build Coastguard Worker  let Defs = [SREG];
554*9880d681SAndroid Build Coastguard Worker}
555*9880d681SAndroid Build Coastguard Worker
556*9880d681SAndroid Build Coastguard Workerclass StorePseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
557*9880d681SAndroid Build Coastguard Worker  : Pseudo<outs, ins, asmstr, pattern>
558*9880d681SAndroid Build Coastguard Worker{
559*9880d681SAndroid Build Coastguard Worker  let Defs = [SP];
560*9880d681SAndroid Build Coastguard Worker}
561*9880d681SAndroid Build Coastguard Worker
562*9880d681SAndroid Build Coastguard Workerclass SelectPseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
563*9880d681SAndroid Build Coastguard Worker  : Pseudo<outs, ins, asmstr, pattern>
564*9880d681SAndroid Build Coastguard Worker{
565*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1;
566*9880d681SAndroid Build Coastguard Worker
567*9880d681SAndroid Build Coastguard Worker  let Uses = [SREG];
568*9880d681SAndroid Build Coastguard Worker}
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Workerclass ShiftPseudo<dag outs, dag ins, string asmstr, list<dag> pattern>
571*9880d681SAndroid Build Coastguard Worker  : Pseudo<outs, ins, asmstr, pattern>
572*9880d681SAndroid Build Coastguard Worker{
573*9880d681SAndroid Build Coastguard Worker  let usesCustomInserter = 1;
574*9880d681SAndroid Build Coastguard Worker
575*9880d681SAndroid Build Coastguard Worker  let Defs = [SREG];
576*9880d681SAndroid Build Coastguard Worker}
577*9880d681SAndroid Build Coastguard Worker
578