annotate lib/Target/AVR/AVRInstrFormats.td @ 134:3a76565eade5 LLVM5.0.1

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