tic4x.h revision 1.1.1.2 1 1.1 skrll /* Table of opcodes for the Texas Instruments TMS320C[34]X family.
2 1.1 skrll
3 1.1.1.2 christos Copyright (C) 2002, 2003, 2010 Free Software Foundation.
4 1.1 skrll
5 1.1 skrll Contributed by Michael P. Hayes (m.hayes (at) elec.canterbury.ac.nz)
6 1.1 skrll
7 1.1 skrll This program is free software; you can redistribute it and/or modify
8 1.1 skrll it under the terms of the GNU General Public License as published by
9 1.1.1.2 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 skrll (at your option) any later version.
11 1.1 skrll
12 1.1 skrll This program is distributed in the hope that it will be useful,
13 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 skrll GNU General Public License for more details.
16 1.1 skrll
17 1.1 skrll You should have received a copy of the GNU General Public License
18 1.1 skrll along with this program; if not, write to the Free Software
19 1.1.1.2 christos Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
20 1.1.1.2 christos MA 02110-1301, USA. */
21 1.1 skrll
22 1.1 skrll #define IS_CPU_TIC3X(v) ((v) == 30 || (v) == 31 || (v) == 32 || (v) == 33)
23 1.1 skrll #define IS_CPU_TIC4X(v) ((v) == 0 || (v) == 40 || (v) == 44)
24 1.1 skrll
25 1.1 skrll /* Define some bitfield extraction/insertion macros. */
26 1.1 skrll #define EXTR(inst, m, l) ((inst) << (31 - (m)) >> (31 - ((m) - (l))))
27 1.1 skrll #define EXTRU(inst, m, l) EXTR ((unsigned long)(inst), (m), (l))
28 1.1 skrll #define EXTRS(inst, m, l) EXTR ((long)(inst), (m), (l))
29 1.1 skrll #define INSERTU(inst, val, m, l) (inst |= ((val) << (l)))
30 1.1 skrll #define INSERTS(inst, val, m, l) INSERTU (inst, ((val) & ((1 << ((m) - (l) + 1)) - 1)), m, l)
31 1.1 skrll
32 1.1 skrll /* Define register numbers. */
33 1.1 skrll typedef enum
34 1.1 skrll {
35 1.1 skrll REG_R0, REG_R1, REG_R2, REG_R3,
36 1.1 skrll REG_R4, REG_R5, REG_R6, REG_R7,
37 1.1 skrll REG_AR0, REG_AR1, REG_AR2, REG_AR3,
38 1.1 skrll REG_AR4, REG_AR5, REG_AR6, REG_AR7,
39 1.1 skrll REG_DP, REG_IR0, REG_IR1, REG_BK,
40 1.1 skrll REG_SP, REG_ST, REG_DIE, REG_IIE,
41 1.1 skrll REG_IIF, REG_RS, REG_RE, REG_RC,
42 1.1 skrll REG_R8, REG_R9, REG_R10, REG_R11,
43 1.1 skrll REG_IVTP, REG_TVTP
44 1.1 skrll }
45 1.1 skrll c4x_reg_t;
46 1.1 skrll
47 1.1 skrll /* Note that the actual register numbers for IVTP is 0 and TVTP is 1. */
48 1.1 skrll
49 1.1 skrll #define REG_IE REG_DIE /* C3x only */
50 1.1 skrll #define REG_IF REG_IIE /* C3x only */
51 1.1 skrll #define REG_IOF REG_IIF /* C3x only */
52 1.1 skrll
53 1.1 skrll #define TIC3X_REG_MAX REG_RC
54 1.1 skrll #define TIC4X_REG_MAX REG_TVTP
55 1.1 skrll
56 1.1 skrll /* Register table size including C4x expansion regs. */
57 1.1 skrll #define REG_TABLE_SIZE (TIC4X_REG_MAX + 1)
58 1.1 skrll
59 1.1 skrll struct tic4x_register
60 1.1 skrll {
61 1.1 skrll char * name;
62 1.1 skrll unsigned long regno;
63 1.1 skrll };
64 1.1 skrll
65 1.1 skrll typedef struct tic4x_register tic4x_register_t;
66 1.1 skrll
67 1.1 skrll /* We could store register synonyms here. */
68 1.1 skrll static const tic4x_register_t tic3x_registers[] =
69 1.1 skrll {
70 1.1 skrll {"f0", REG_R0},
71 1.1 skrll {"r0", REG_R0},
72 1.1 skrll {"f1", REG_R1},
73 1.1 skrll {"r1", REG_R1},
74 1.1 skrll {"f2", REG_R2},
75 1.1 skrll {"r2", REG_R2},
76 1.1 skrll {"f3", REG_R3},
77 1.1 skrll {"r3", REG_R3},
78 1.1 skrll {"f4", REG_R4},
79 1.1 skrll {"r4", REG_R4},
80 1.1 skrll {"f5", REG_R5},
81 1.1 skrll {"r5", REG_R5},
82 1.1 skrll {"f6", REG_R6},
83 1.1 skrll {"r6", REG_R6},
84 1.1 skrll {"f7", REG_R7},
85 1.1 skrll {"r7", REG_R7},
86 1.1 skrll {"ar0", REG_AR0},
87 1.1 skrll {"ar1", REG_AR1},
88 1.1 skrll {"ar2", REG_AR2},
89 1.1 skrll {"ar3", REG_AR3},
90 1.1 skrll {"ar4", REG_AR4},
91 1.1 skrll {"ar5", REG_AR5},
92 1.1 skrll {"ar6", REG_AR6},
93 1.1 skrll {"ar7", REG_AR7},
94 1.1 skrll {"dp", REG_DP},
95 1.1 skrll {"ir0", REG_IR0},
96 1.1 skrll {"ir1", REG_IR1},
97 1.1 skrll {"bk", REG_BK},
98 1.1 skrll {"sp", REG_SP},
99 1.1 skrll {"st", REG_ST},
100 1.1 skrll {"ie", REG_IE},
101 1.1 skrll {"if", REG_IF},
102 1.1 skrll {"iof", REG_IOF},
103 1.1 skrll {"rs", REG_RS},
104 1.1 skrll {"re", REG_RE},
105 1.1 skrll {"rc", REG_RC},
106 1.1 skrll {"", 0}
107 1.1 skrll };
108 1.1 skrll
109 1.1 skrll const unsigned int tic3x_num_registers = (((sizeof tic3x_registers) / (sizeof tic3x_registers[0])) - 1);
110 1.1 skrll
111 1.1 skrll /* Define C4x registers in addition to C3x registers. */
112 1.1 skrll static const tic4x_register_t tic4x_registers[] =
113 1.1 skrll {
114 1.1 skrll {"die", REG_DIE}, /* Clobbers C3x REG_IE */
115 1.1 skrll {"iie", REG_IIE}, /* Clobbers C3x REG_IF */
116 1.1 skrll {"iif", REG_IIF}, /* Clobbers C3x REG_IOF */
117 1.1 skrll {"f8", REG_R8},
118 1.1 skrll {"r8", REG_R8},
119 1.1 skrll {"f9", REG_R9},
120 1.1 skrll {"r9", REG_R9},
121 1.1 skrll {"f10", REG_R10},
122 1.1 skrll {"r10", REG_R10},
123 1.1 skrll {"f11", REG_R11},
124 1.1 skrll {"r11", REG_R11},
125 1.1 skrll {"ivtp", REG_IVTP},
126 1.1 skrll {"tvtp", REG_TVTP},
127 1.1 skrll {"", 0}
128 1.1 skrll };
129 1.1 skrll
130 1.1 skrll const unsigned int tic4x_num_registers = (((sizeof tic4x_registers) / (sizeof tic4x_registers[0])) - 1);
131 1.1 skrll
132 1.1 skrll struct tic4x_cond
133 1.1 skrll {
134 1.1 skrll char * name;
135 1.1 skrll unsigned long cond;
136 1.1 skrll };
137 1.1 skrll
138 1.1 skrll typedef struct tic4x_cond tic4x_cond_t;
139 1.1 skrll
140 1.1 skrll /* Define conditional branch/load suffixes. Put desired form for
141 1.1 skrll disassembler last. */
142 1.1 skrll static const tic4x_cond_t tic4x_conds[] =
143 1.1 skrll {
144 1.1 skrll { "u", 0x00 },
145 1.1 skrll { "c", 0x01 }, { "lo", 0x01 },
146 1.1 skrll { "ls", 0x02 },
147 1.1 skrll { "hi", 0x03 },
148 1.1 skrll { "nc", 0x04 }, { "hs", 0x04 },
149 1.1 skrll { "z", 0x05 }, { "eq", 0x05 },
150 1.1 skrll { "nz", 0x06 }, { "ne", 0x06 },
151 1.1 skrll { "n", 0x07 }, { "l", 0x07 }, { "lt", 0x07 },
152 1.1 skrll { "le", 0x08 },
153 1.1 skrll { "p", 0x09 }, { "gt", 0x09 },
154 1.1 skrll { "nn", 0x0a }, { "ge", 0x0a },
155 1.1 skrll { "nv", 0x0c },
156 1.1 skrll { "v", 0x0d },
157 1.1 skrll { "nuf", 0x0e },
158 1.1 skrll { "uf", 0x0f },
159 1.1 skrll { "nlv", 0x10 },
160 1.1 skrll { "lv", 0x11 },
161 1.1 skrll { "nluf", 0x12 },
162 1.1 skrll { "luf", 0x13 },
163 1.1 skrll { "zuf", 0x14 },
164 1.1 skrll /* Dummy entry, not included in num_conds. This
165 1.1 skrll lets code examine entry i+1 without checking
166 1.1 skrll if we've run off the end of the table. */
167 1.1 skrll { "", 0x0}
168 1.1 skrll };
169 1.1 skrll
170 1.1 skrll const unsigned int tic4x_num_conds = (((sizeof tic4x_conds) / (sizeof tic4x_conds[0])) - 1);
171 1.1 skrll
172 1.1 skrll struct tic4x_indirect
173 1.1 skrll {
174 1.1 skrll char * name;
175 1.1 skrll unsigned long modn;
176 1.1 skrll };
177 1.1 skrll
178 1.1 skrll typedef struct tic4x_indirect tic4x_indirect_t;
179 1.1 skrll
180 1.1 skrll /* Define indirect addressing modes where:
181 1.1 skrll d displacement (signed)
182 1.1 skrll y ir0
183 1.1 skrll z ir1 */
184 1.1 skrll
185 1.1 skrll static const tic4x_indirect_t tic4x_indirects[] =
186 1.1 skrll {
187 1.1 skrll { "*+a(d)", 0x00 },
188 1.1 skrll { "*-a(d)", 0x01 },
189 1.1 skrll { "*++a(d)", 0x02 },
190 1.1 skrll { "*--a(d)", 0x03 },
191 1.1 skrll { "*a++(d)", 0x04 },
192 1.1 skrll { "*a--(d)", 0x05 },
193 1.1 skrll { "*a++(d)%", 0x06 },
194 1.1 skrll { "*a--(d)%", 0x07 },
195 1.1 skrll { "*+a(y)", 0x08 },
196 1.1 skrll { "*-a(y)", 0x09 },
197 1.1 skrll { "*++a(y)", 0x0a },
198 1.1 skrll { "*--a(y)", 0x0b },
199 1.1 skrll { "*a++(y)", 0x0c },
200 1.1 skrll { "*a--(y)", 0x0d },
201 1.1 skrll { "*a++(y)%", 0x0e },
202 1.1 skrll { "*a--(y)%", 0x0f },
203 1.1 skrll { "*+a(z)", 0x10 },
204 1.1 skrll { "*-a(z)", 0x11 },
205 1.1 skrll { "*++a(z)", 0x12 },
206 1.1 skrll { "*--a(z)", 0x13 },
207 1.1 skrll { "*a++(z)", 0x14 },
208 1.1 skrll { "*a--(z)", 0x15 },
209 1.1 skrll { "*a++(z)%", 0x16 },
210 1.1 skrll { "*a--(z)%", 0x17 },
211 1.1 skrll { "*a", 0x18 },
212 1.1 skrll { "*a++(y)b", 0x19 },
213 1.1 skrll /* Dummy entry, not included in num_indirects. This
214 1.1 skrll lets code examine entry i+1 without checking
215 1.1 skrll if we've run off the end of the table. */
216 1.1 skrll { "", 0x0}
217 1.1 skrll };
218 1.1 skrll
219 1.1 skrll #define TIC3X_MODN_MAX 0x19
220 1.1 skrll
221 1.1 skrll const unsigned int tic4x_num_indirects = (((sizeof tic4x_indirects) / (sizeof tic4x_indirects[0])) - 1);
222 1.1 skrll
223 1.1 skrll /* Instruction template. */
224 1.1 skrll struct tic4x_inst
225 1.1 skrll {
226 1.1 skrll char * name;
227 1.1 skrll unsigned long opcode;
228 1.1 skrll unsigned long opmask;
229 1.1 skrll char * args;
230 1.1 skrll unsigned long oplevel;
231 1.1 skrll };
232 1.1 skrll
233 1.1 skrll typedef struct tic4x_inst tic4x_inst_t;
234 1.1 skrll
235 1.1 skrll /* Opcode infix
236 1.1 skrll B condition 16--20 U,C,Z,LO,HI, etc.
237 1.1 skrll C condition 23--27 U,C,Z,LO,HI, etc.
238 1.1 skrll
239 1.1 skrll Arguments
240 1.1 skrll , required arg follows
241 1.1 skrll ; optional arg follows
242 1.1 skrll
243 1.1 skrll Argument types bits [classes] - example
244 1.1 skrll -----------------------------------------------------------
245 1.1 skrll * indirect (all) 0--15 [A,AB,AU,AF,A2,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - *+AR0(5), *++AR0(IR0)
246 1.1 skrll # direct (for LDP) 0--15 [Z] - @start, start
247 1.1 skrll @ direct 0--15 [A,AB,AU,AF,A3,A6,A7,AY,B,BA,BB,BI,B6,B7] - @start, start
248 1.1 skrll A address register 22--24 [D] - AR0, AR7
249 1.1 skrll B unsigned integer 0--23 [I,I2] - @start, start (absolute on C3x, relative on C4x)
250 1.1 skrll C indirect (disp - C4x) 0--7 [S,SC,S2,T,TC,T2,T2C] - *+AR0(5)
251 1.1 skrll E register (all) 0--7 [T,TC,T2,T2C] - R0, R7, R11, AR0, DP
252 1.1 skrll e register (0-11) 0--7 [S,SC,S2] - R0, R7, R11
253 1.1 skrll F short float immediate 0--15 [AF,B,BA,BB] - 3.5, 0e-3.5e-1
254 1.1 skrll G register (all) 8--15 [T,TC,T2,T2C] - R0, R7, R11, AR0, DP
255 1.1 skrll g register (0-11) 0--7 [S,SC,S2] - R0, R7, R11
256 1.1 skrll H register (0-7) 18--16 [LS,M,P,Q] - R0, R7
257 1.1 skrll I indirect (no disp) 0--7 [S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0)
258 1.1 skrll i indirect (enhanced) 0--7 [LL,LS,M,P,Q,QC] - *+AR0(1), R5
259 1.1 skrll J indirect (no disp) 8--15 [LL,LS,P,Q,QC,S,SC,S2,T,TC,T2,T2C] - *+AR0(1), *+AR0(IR0)
260 1.1 skrll j indirect (enhanced) 8--15 [M] - *+AR0(1), R5
261 1.1 skrll K register 19--21 [LL,M,Q,QC] - R0, R7
262 1.1 skrll L register 22--24 [LL,LS,P,Q,QC] - R0, R7
263 1.1 skrll M register (R2,R3) 22--22 [M] R2, R3
264 1.1 skrll N register (R0,R1) 23--23 [M] R0, R1
265 1.1 skrll O indirect(disp - C4x) 8--15 [S,SC,S2,T,TC,T2] - *+AR0(5)
266 1.1 skrll P displacement (PC Rel) 0--15 [D,J,JS] - @start, start
267 1.1 skrll Q register (all) 0--15 [A,AB,AU,A2,A3,AY,BA,BI,D,I2,J,JS] - R0, AR0, DP, SP
268 1.1 skrll q register (0-11) 0--15 [AF,B,BB] - R0, R7, R11
269 1.1 skrll R register (all) 16--20 [A,AB,AU,AF,A6,A7,R,T,TC] - R0, AR0, DP, SP
270 1.1 skrll r register (0-11) 16--20 [B,BA,BB,BI,B6,B7,RF,S,SC] - R0, R1, R11
271 1.1 skrll S short int immediate 0--15 [A,AB,AY,BI] - -5, 5
272 1.1 skrll T integer (C4x) 16--20 [Z] - -5, 12
273 1.1 skrll U unsigned integer 0--15 [AU,A3] - 0, 65535
274 1.1 skrll V vector (C4x: 0--8) 0--4 [Z] - 25, 7
275 1.1 skrll W short int (C4x) 0--7 [T,TC,T2,T2C] - -3, 5
276 1.1 skrll X expansion reg (C4x) 0--4 [Z] - IVTP, TVTP
277 1.1 skrll Y address reg (C4x) 16--20 [Z] - AR0, DP, SP, IR0
278 1.1 skrll Z expansion reg (C4x) 16--20 [Z] - IVTP, TVTP
279 1.1 skrll */
280 1.1 skrll
281 1.1 skrll #define TIC4X_OPERANDS_MAX 7 /* Max number of operands for an inst. */
282 1.1 skrll #define TIC4X_NAME_MAX 16 /* Max number of chars in parallel name. */
283 1.1 skrll
284 1.1 skrll /* Define the instruction level */
285 1.1 skrll #define OP_C3X 0x1 /* C30 support - supported by all */
286 1.1 skrll #define OP_C4X 0x2 /* C40 support - C40, C44 */
287 1.1 skrll #define OP_ENH 0x4 /* Class LL,LS,M,P,Q,QC enhancements. Argument type
288 1.1 skrll I and J is enhanced in these classes - C31>=6.0,
289 1.1 skrll C32>=2.0, C33 */
290 1.1 skrll #define OP_LPWR 0x8 /* Low power support (LOPOWER, MAXSPEED) - C30>=7.0,
291 1.1 skrll LC31, C31>=5.0, C32 */
292 1.1 skrll #define OP_IDLE2 0x10 /* Idle2 support (IDLE2) - C30>=7.0, LC31, C31>=5.0,
293 1.1 skrll C32, C33, C40>=5.0, C44 */
294 1.1 skrll
295 1.1 skrll /* The following class definition is a classification scheme for
296 1.1 skrll putting instructions with similar type of arguments together. It
297 1.1 skrll simplifies the op-code definitions significantly, as we then only
298 1.1 skrll need to use the class macroes for 95% of the DSP's opcodes.
299 1.1 skrll */
300 1.1 skrll
301 1.1 skrll /* A: General 2-operand integer operations
302 1.1 skrll Syntax: <i> src, dst
303 1.1 skrll src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
304 1.1 skrll dst = Register (R)
305 1.1 skrll Instr: 15/8 - ABSI, ADDC, ADDI, ASH, CMPI, LDI, LSH, MPYI, NEGB, NEGI,
306 1.1 skrll SUBB, SUBC, SUBI, SUBRB, SUBRI, C4x: LBn, LHn, LWLn, LWRn,
307 1.1 skrll MBn, MHn, MPYSHI, MPYUHI
308 1.1 skrll */
309 1.1 skrll #define A_CLASS_INSN(name, opcode, level) \
310 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "Q;R", level }, \
311 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \
312 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \
313 1.1 skrll { name, opcode|0x00600000, 0xffe00000, "S,R", level }
314 1.1 skrll
315 1.1 skrll /* AB: General 2-operand integer operation with condition
316 1.1 skrll Syntax: <i>c src, dst
317 1.1 skrll c = Condition
318 1.1 skrll src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
319 1.1 skrll dst = Register (R)
320 1.1 skrll Instr: 1/0 - LDIc
321 1.1 skrll */
322 1.1 skrll #define AB_CLASS_INSN(name, opcode, level) \
323 1.1 skrll { name, opcode|0x40000000, 0xf0600000, "Q;R", level }, \
324 1.1 skrll { name, opcode|0x40200000, 0xf0600000, "@,R", level }, \
325 1.1 skrll { name, opcode|0x40400000, 0xf0600000, "*,R", level }, \
326 1.1 skrll { name, opcode|0x40600000, 0xf0600000, "S,R", level }
327 1.1 skrll
328 1.1 skrll /* AU: General 2-operand unsigned integer operation
329 1.1 skrll Syntax: <i> src, dst
330 1.1 skrll src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U)
331 1.1 skrll dst = Register (R)
332 1.1 skrll Instr: 6/2 - AND, ANDN, NOT, OR, TSTB, XOR, C4x: LBUn, LHUn
333 1.1 skrll */
334 1.1 skrll #define AU_CLASS_INSN(name, opcode, level) \
335 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "Q;R", level }, \
336 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \
337 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \
338 1.1 skrll { name, opcode|0x00600000, 0xffe00000, "U,R", level }
339 1.1 skrll
340 1.1 skrll /* AF: General 2-operand float to integer operation
341 1.1 skrll Syntax: <i> src, dst
342 1.1 skrll src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
343 1.1 skrll dst = Register (R)
344 1.1 skrll Instr: 1/0 - FIX
345 1.1 skrll */
346 1.1 skrll #define AF_CLASS_INSN(name, opcode, level) \
347 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "q;R", level }, \
348 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \
349 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,R", level }, \
350 1.1 skrll { name, opcode|0x00600000, 0xffe00000, "F,R", level }
351 1.1 skrll
352 1.1 skrll /* A2: Limited 1-operand (integer) operation
353 1.1 skrll Syntax: <i> src
354 1.1 skrll src = Register (Q), Indirect (*), None
355 1.1 skrll Instr: 1/0 - NOP
356 1.1 skrll */
357 1.1 skrll #define A2_CLASS_INSN(name, opcode, level) \
358 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "Q", level }, \
359 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*", level }, \
360 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "" , level }
361 1.1 skrll
362 1.1 skrll /* A3: General 1-operand unsigned integer operation
363 1.1 skrll Syntax: <i> src
364 1.1 skrll src = Register (Q), Direct (@), Indirect (*), Unsigned immediate (U)
365 1.1 skrll Instr: 1/0 - RPTS
366 1.1 skrll */
367 1.1 skrll #define A3_CLASS_INSN(name, opcode, level) \
368 1.1 skrll { name, opcode|0x00000000, 0xffff0000, "Q", level }, \
369 1.1 skrll { name, opcode|0x00200000, 0xffff0000, "@", level }, \
370 1.1 skrll { name, opcode|0x00400000, 0xffff0000, "*", level }, \
371 1.1 skrll { name, opcode|0x00600000, 0xffff0000, "U", level }
372 1.1 skrll
373 1.1 skrll /* A6: Limited 2-operand integer operation
374 1.1 skrll Syntax: <i> src, dst
375 1.1 skrll src = Direct (@), Indirect (*)
376 1.1 skrll dst = Register (R)
377 1.1 skrll Instr: 1/1 - LDII, C4x: SIGI
378 1.1 skrll */
379 1.1 skrll #define A6_CLASS_INSN(name, opcode, level) \
380 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,R", level }, \
381 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,R", level }
382 1.1 skrll
383 1.1 skrll /* A7: Limited 2-operand integer store operation
384 1.1 skrll Syntax: <i> src, dst
385 1.1 skrll src = Register (R)
386 1.1 skrll dst = Direct (@), Indirect (*)
387 1.1 skrll Instr: 2/0 - STI, STII
388 1.1 skrll */
389 1.1 skrll #define A7_CLASS_INSN(name, opcode, level) \
390 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "R,@", level }, \
391 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "R,*", level }
392 1.1 skrll
393 1.1 skrll /* AY: General 2-operand signed address load operation
394 1.1 skrll Syntax: <i> src, dst
395 1.1 skrll src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
396 1.1 skrll dst = Address register - ARx, IRx, DP, BK, SP (Y)
397 1.1 skrll Instr: 0/1 - C4x: LDA
398 1.1 skrll Note: Q and Y should *never* be the same register
399 1.1 skrll */
400 1.1 skrll #define AY_CLASS_INSN(name, opcode, level) \
401 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "Q,Y", level }, \
402 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,Y", level }, \
403 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,Y", level }, \
404 1.1 skrll { name, opcode|0x00600000, 0xffe00000, "S,Y", level }
405 1.1 skrll
406 1.1 skrll /* B: General 2-operand float operation
407 1.1 skrll Syntax: <i> src, dst
408 1.1 skrll src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
409 1.1 skrll dst = Register 0-11 (r)
410 1.1 skrll Instr: 12/2 - ABSF, ADDF, CMPF, LDE, LDF, LDM, MPYF, NEGF, NORM, RND,
411 1.1 skrll SUBF, SUBRF, C4x: RSQRF, TOIEEE
412 1.1 skrll */
413 1.1 skrll #define B_CLASS_INSN(name, opcode, level) \
414 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "q;r", level }, \
415 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \
416 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \
417 1.1 skrll { name, opcode|0x00600000, 0xffe00000, "F,r", level }
418 1.1 skrll
419 1.1 skrll /* BA: General 2-operand integer to float operation
420 1.1 skrll Syntax: <i> src, dst
421 1.1 skrll src = Register (Q), Direct (@), Indirect (*), Float immediate (F)
422 1.1 skrll dst = Register 0-11 (r)
423 1.1 skrll Instr: 0/1 - C4x: CRCPF
424 1.1 skrll */
425 1.1 skrll #define BA_CLASS_INSN(name, opcode, level) \
426 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "Q;r", level }, \
427 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \
428 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \
429 1.1 skrll { name, opcode|0x00600000, 0xffe00000, "F,r", level }
430 1.1 skrll
431 1.1 skrll /* BB: General 2-operand conditional float operation
432 1.1 skrll Syntax: <i>c src, dst
433 1.1 skrll c = Condition
434 1.1 skrll src = Register 0-11 (q), Direct (@), Indirect (*), Float immediate (F)
435 1.1 skrll dst = Register 0-11 (r)
436 1.1 skrll Instr: 1/0 - LDFc
437 1.1 skrll */
438 1.1 skrll #define BB_CLASS_INSN(name, opcode, level) \
439 1.1 skrll { name, opcode|0x40000000, 0xf0600000, "q;r", level }, \
440 1.1 skrll { name, opcode|0x40200000, 0xf0600000, "@,r", level }, \
441 1.1 skrll { name, opcode|0x40400000, 0xf0600000, "*,r", level }, \
442 1.1 skrll { name, opcode|0x40600000, 0xf0600000, "F,r", level }
443 1.1 skrll
444 1.1 skrll /* BI: General 2-operand integer to float operation (yet different to BA)
445 1.1 skrll Syntax: <i> src, dst
446 1.1 skrll src = Register (Q), Direct (@), Indirect (*), Signed immediate (S)
447 1.1 skrll dst = Register 0-11 (r)
448 1.1 skrll Instr: 1/0 - FLOAT
449 1.1 skrll */
450 1.1 skrll #define BI_CLASS_INSN(name, opcode, level) \
451 1.1 skrll { name, opcode|0x00000000, 0xffe00000, "Q;r", level }, \
452 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \
453 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,r", level }, \
454 1.1 skrll { name, opcode|0x00600000, 0xffe00000, "S,r", level }
455 1.1 skrll
456 1.1 skrll /* B6: Limited 2-operand float operation
457 1.1 skrll Syntax: <i> src, dst
458 1.1 skrll src = Direct (@), Indirect (*)
459 1.1 skrll dst = Register 0-11 (r)
460 1.1 skrll Instr: 1/1 - LDFI, C4x: FRIEEE
461 1.1 skrll */
462 1.1 skrll #define B6_CLASS_INSN(name, opcode, level) \
463 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "@,r", level }, \
464 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "*,r", level }
465 1.1 skrll
466 1.1 skrll /* B7: Limited 2-operand float store operation
467 1.1 skrll Syntax: <i> src, dst
468 1.1 skrll src = Register 0-11 (r)
469 1.1 skrll dst = Direct (@), Indirect (*)
470 1.1 skrll Instr: 2/0 - STF, STFI
471 1.1 skrll */
472 1.1 skrll #define B7_CLASS_INSN(name, opcode, level) \
473 1.1 skrll { name, opcode|0x00200000, 0xffe00000, "r,@", level }, \
474 1.1 skrll { name, opcode|0x00400000, 0xffe00000, "r,*", level }
475 1.1 skrll
476 1.1 skrll /* D: Decrement and brach operations
477 1.1 skrll Syntax: <i>c ARn, dst
478 1.1 skrll c = condition
479 1.1 skrll ARn = AR register 0-7 (A)
480 1.1 skrll dst = Register (Q), PC-relative (P)
481 1.1 skrll Instr: 2/0 - DBc, DBcD
482 1.1 skrll Alias: <name1> <name2>
483 1.1 skrll */
484 1.1 skrll #define D_CLASS_INSN(name1, name2, opcode, level) \
485 1.1 skrll { name1, opcode|0x00000000, 0xfe200000, "A,Q", level }, \
486 1.1 skrll { name1, opcode|0x02000000, 0xfe200000, "A,P", level }, \
487 1.1 skrll { name2, opcode|0x00000000, 0xfe200000, "A,Q", level }, \
488 1.1 skrll { name2, opcode|0x02000000, 0xfe200000, "A,P", level }
489 1.1 skrll
490 1.1 skrll /* I: General branch operations
491 1.1 skrll Syntax: <i> dst
492 1.1 skrll dst = Address (B)
493 1.1 skrll Instr: 3/1 - BR, BRD, CALL, C4x: LAJ
494 1.1 skrll */
495 1.1 skrll
496 1.1 skrll /* I2: General branch operations (C4x addition)
497 1.1 skrll Syntax: <i> dst
498 1.1 skrll dst = Address (B), C4x: Register (Q)
499 1.1 skrll Instr: 2/0 - RPTB, RPTBD
500 1.1 skrll */
501 1.1 skrll
502 1.1 skrll /* J: General conditional branch operations
503 1.1 skrll Syntax: <i>c dst
504 1.1 skrll c = Condition
505 1.1 skrll dst = Register (Q), PC-relative (P)
506 1.1 skrll Instr: 2/3 - Bc, BcD, C4x: BcAF, BcAT, LAJc
507 1.1 skrll Alias: <name1> <name2>
508 1.1 skrll */
509 1.1 skrll #define J_CLASS_INSN(name1, name2, opcode, level) \
510 1.1 skrll { name1, opcode|0x00000000, 0xffe00000, "Q", level }, \
511 1.1 skrll { name1, opcode|0x02000000, 0xffe00000, "P", level }, \
512 1.1 skrll { name2, opcode|0x00000000, 0xffe00000, "Q", level }, \
513 1.1 skrll { name2, opcode|0x02000000, 0xffe00000, "P", level }
514 1.1 skrll
515 1.1 skrll /* JS: General conditional branch operations
516 1.1 skrll Syntax: <i>c dst
517 1.1 skrll c = Condition
518 1.1 skrll dst = Register (Q), PC-relative (P)
519 1.1 skrll Instr: 1/1 - CALLc, C4X: LAJc
520 1.1 skrll */
521 1.1 skrll
522 1.1 skrll /* LL: Load-load parallell operation
523 1.1 skrll Syntax: <i> src2, dst2 || <i> src1, dst1
524 1.1 skrll src1 = Indirect 0,1,IR0,IR1 (J)
525 1.1 skrll dst1 = Register 0-7 (K)
526 1.1 skrll src2 = Indirect 0,1,IR0,IR1, ENH: Register (i)
527 1.1 skrll dst2 = Register 0-7 (L)
528 1.1 skrll Instr: 2/0 - LDF||LDF, LDI||LDI
529 1.1 skrll Alias: i||i, i1||i2, i2||i1
530 1.1 skrll */
531 1.1 skrll #define LL_CLASS_INSN(name, opcode, level) \
532 1.1 skrll { name "_" name , opcode, 0xfe000000, "i;L|J,K", level }, \
533 1.1 skrll { name "2_" name "1", opcode, 0xfe000000, "i;L|J,K", level }, \
534 1.1 skrll { name "1_" name "2", opcode, 0xfe000000, "J,K|i;L", level }
535 1.1 skrll
536 1.1 skrll /* LS: Store-store parallell operation
537 1.1 skrll Syntax: <i> src2, dst2 || <i> src1, dst1
538 1.1 skrll src1 = Register 0-7 (H)
539 1.1 skrll dst1 = Indirect 0,1,IR0,IR1 (J)
540 1.1 skrll src2 = Register 0-7 (L)
541 1.1 skrll dst2 = Indirect 0,1,IR0,IR1, ENH: register (i)
542 1.1 skrll Instr: 2/0 - STF||STF, STI||STI
543 1.1 skrll Alias: i||i, i1||i2, i2||i1.
544 1.1 skrll */
545 1.1 skrll #define LS_CLASS_INSN(name, opcode, level) \
546 1.1 skrll { name "_" name , opcode, 0xfe000000, "L;i|H,J", level }, \
547 1.1 skrll { name "2_" name "1", opcode, 0xfe000000, "L;i|H,J", level }, \
548 1.1 skrll { name "1_" name "2", opcode, 0xfe000000, "H,J|L;i", level }
549 1.1 skrll
550 1.1 skrll /* M: General multiply and add/sub operations
551 1.1 skrll Syntax: <ia> src3,src4,dst1 || <ib> src2,src1,dst2 [00] - Manual
552 1.1 skrll <ia> src3,src1,dst1 || <ib> src2,src4,dst2 [01] - Manual
553 1.1 skrll <ia> src1,src3,dst1 || <ib> src2,src4,dst2 [01]
554 1.1 skrll <ia> src1,src2,dst1 || <ib> src4,src3,dst2 [02] - Manual
555 1.1 skrll <ia> src3,src1,dst1 || <ib> src4,src2,dst2 [03] - Manual
556 1.1 skrll <ia> src1,src3,dst1 || <ib> src4,src2,dst2 [03]
557 1.1 skrll src1 = Register 0-7 (K)
558 1.1 skrll src2 = Register 0-7 (H)
559 1.1 skrll src3 = Indirect 0,1,IR0,IR1, ENH: register (j)
560 1.1 skrll src4 = Indirect 0,1,IR0,IR1, ENH: register (i)
561 1.1 skrll dst1 = Register 0-1 (N)
562 1.1 skrll dst2 = Register 2-3 (M)
563 1.1 skrll Instr: 4/0 - MPYF3||ADDF3, MPYF3||SUBF3, MPYI3||ADDI3, MPYI3||SUBI3
564 1.1 skrll Alias: a||b, a3||n, a||b3, a3||b3, b||a, b3||a, b||a3, b3||a3
565 1.1 skrll */
566 1.1 skrll #define M_CLASS_INSN(namea, nameb, opcode, level) \
567 1.1 skrll { namea "_" nameb, opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \
568 1.1 skrll { namea "_" nameb, opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \
569 1.1 skrll { namea "_" nameb, opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \
570 1.1 skrll { namea "_" nameb, opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \
571 1.1 skrll { namea "_" nameb, opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \
572 1.1 skrll { namea "_" nameb, opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \
573 1.1 skrll { namea "3_" nameb, opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \
574 1.1 skrll { namea "3_" nameb, opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \
575 1.1 skrll { namea "3_" nameb, opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \
576 1.1 skrll { namea "3_" nameb, opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \
577 1.1 skrll { namea "3_" nameb, opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \
578 1.1 skrll { namea "3_" nameb, opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \
579 1.1 skrll { namea "_" nameb "3", opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \
580 1.1 skrll { namea "_" nameb "3", opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \
581 1.1 skrll { namea "_" nameb "3", opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \
582 1.1 skrll { namea "_" nameb "3", opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \
583 1.1 skrll { namea "_" nameb "3", opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \
584 1.1 skrll { namea "_" nameb "3", opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \
585 1.1 skrll { namea "3_" nameb "3", opcode|0x00000000, 0xff000000, "i;j;N|H;K;M", level }, \
586 1.1 skrll { namea "3_" nameb "3", opcode|0x01000000, 0xff000000, "j;K;N|H;i;M", level }, \
587 1.1 skrll { namea "3_" nameb "3", opcode|0x01000000, 0xff000000, "K;j;N|H;i;M", level }, \
588 1.1 skrll { namea "3_" nameb "3", opcode|0x02000000, 0xff000000, "H;K;N|i;j;M", level }, \
589 1.1 skrll { namea "3_" nameb "3", opcode|0x03000000, 0xff000000, "j;K;N|i;H;M", level }, \
590 1.1 skrll { namea "3_" nameb "3", opcode|0x03000000, 0xff000000, "K;j;N|i;H;M", level }, \
591 1.1 skrll { nameb "_" namea, opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \
592 1.1 skrll { nameb "_" namea, opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \
593 1.1 skrll { nameb "_" namea, opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \
594 1.1 skrll { nameb "_" namea, opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \
595 1.1 skrll { nameb "_" namea, opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \
596 1.1 skrll { nameb "_" namea, opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \
597 1.1 skrll { nameb "3_" namea, opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \
598 1.1 skrll { nameb "3_" namea, opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \
599 1.1 skrll { nameb "3_" namea, opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \
600 1.1 skrll { nameb "3_" namea, opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \
601 1.1 skrll { nameb "3_" namea, opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \
602 1.1 skrll { nameb "3_" namea, opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \
603 1.1 skrll { nameb "_" namea "3", opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \
604 1.1 skrll { nameb "_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \
605 1.1 skrll { nameb "_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \
606 1.1 skrll { nameb "_" namea "3", opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \
607 1.1 skrll { nameb "_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \
608 1.1 skrll { nameb "_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }, \
609 1.1 skrll { nameb "3_" namea "3", opcode|0x00000000, 0xff000000, "H;K;M|i;j;N", level }, \
610 1.1 skrll { nameb "3_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|j;K;N", level }, \
611 1.1 skrll { nameb "3_" namea "3", opcode|0x01000000, 0xff000000, "H;i;M|K;j;N", level }, \
612 1.1 skrll { nameb "3_" namea "3", opcode|0x02000000, 0xff000000, "i;j;M|H;K;N", level }, \
613 1.1 skrll { nameb "3_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|j;K;N", level }, \
614 1.1 skrll { nameb "3_" namea "3", opcode|0x03000000, 0xff000000, "i;H;M|K;j;N", level }
615 1.1 skrll
616 1.1 skrll /* P: General 2-operand operation with parallell store
617 1.1 skrll Syntax: <ia> src2, dst1 || <ib> src3, dst2
618 1.1 skrll src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
619 1.1 skrll dst1 = Register 0-7 (L)
620 1.1 skrll src3 = Register 0-7 (H)
621 1.1 skrll dst2 = Indirect 0,1,IR0,IR1 (J)
622 1.1 skrll Instr: 9/2 - ABSF||STF, ABSI||STI, FIX||STI, FLOAT||STF, LDF||STF,
623 1.1 skrll LDI||STI, NEGF||STF, NEGI||STI, NOT||STI, C4x: FRIEEE||STF,
624 1.1 skrll TOIEEE||STF
625 1.1 skrll Alias: a||b, b||a
626 1.1 skrll */
627 1.1 skrll #define P_CLASS_INSN(namea, nameb, opcode, level) \
628 1.1 skrll { namea "_" nameb, opcode, 0xfe000000, "i;L|H,J", level }, \
629 1.1 skrll { nameb "_" namea, opcode, 0xfe000000, "H,J|i;L", level }
630 1.1 skrll
631 1.1 skrll /* Q: General 3-operand operation with parallell store
632 1.1 skrll Syntax: <ia> src1, src2, dst1 || <ib> src3, dst2
633 1.1 skrll src1 = Register 0-7 (K)
634 1.1 skrll src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
635 1.1 skrll dst1 = Register 0-7 (L)
636 1.1 skrll src3 = Register 0-7 (H)
637 1.1 skrll dst2 = Indirect 0,1,IR0,IR1 (J)
638 1.1 skrll Instr: 4/0 - ASH3||STI, LSH3||STI, SUBF3||STF, SUBI3||STI
639 1.1 skrll Alias: a||b, b||a, a3||b, b||a3
640 1.1 skrll */
641 1.1 skrll #define Q_CLASS_INSN(namea, nameb, opcode, level) \
642 1.1 skrll { namea "_" nameb , opcode, 0xfe000000, "K,i;L|H,J", level }, \
643 1.1 skrll { nameb "_" namea , opcode, 0xfe000000, "H,J|K,i;L", level }, \
644 1.1 skrll { namea "3_" nameb , opcode, 0xfe000000, "K,i;L|H,J", level }, \
645 1.1 skrll { nameb "_" namea "3", opcode, 0xfe000000, "H,J|K,i;L", level }
646 1.1 skrll
647 1.1 skrll /* QC: General commutative 3-operand operation with parallell store
648 1.1 skrll Syntax: <ia> src2, src1, dst1 || <ib> src3, dst2
649 1.1 skrll <ia> src1, src2, dst1 || <ib> src3, dst2 - Manual
650 1.1 skrll src1 = Register 0-7 (K)
651 1.1 skrll src2 = Indirect 0,1,IR0,IR1, ENH: register (i)
652 1.1 skrll dst1 = Register 0-7 (L)
653 1.1 skrll src3 = Register 0-7 (H)
654 1.1 skrll dst2 = Indirect 0,1,IR0,IR1 (J)
655 1.1 skrll Instr: 7/0 - ADDF3||STF, ADDI3||STI, AND3||STI, MPYF3||STF, MPYI3||STI,
656 1.1 skrll OR3||STI, XOR3||STI
657 1.1 skrll Alias: a||b, b||a, a3||b, b||a3
658 1.1 skrll */
659 1.1 skrll #define QC_CLASS_INSN(namea, nameb, opcode, level) \
660 1.1 skrll { namea "_" nameb , opcode, 0xfe000000, "i;K;L|H,J", level }, \
661 1.1 skrll { namea "_" nameb , opcode, 0xfe000000, "K;i;L|H,J", level }, \
662 1.1 skrll { nameb "_" namea , opcode, 0xfe000000, "H,J|i;K;L", level }, \
663 1.1 skrll { nameb "_" namea , opcode, 0xfe000000, "H,J|K;i;L", level }, \
664 1.1 skrll { namea "3_" nameb , opcode, 0xfe000000, "i;K;L|H,J", level }, \
665 1.1 skrll { namea "3_" nameb , opcode, 0xfe000000, "K;i;L|H,J", level }, \
666 1.1 skrll { nameb "_" namea "3", opcode, 0xfe000000, "H,J|i;K;L", level }, \
667 1.1 skrll { nameb "_" namea "3", opcode, 0xfe000000, "H,J|K;i;L", level }
668 1.1 skrll
669 1.1 skrll /* R: General register integer operation
670 1.1 skrll Syntax: <i> dst
671 1.1 skrll dst = Register (R)
672 1.1 skrll Instr: 6/0 - POP, PUSH, ROL, ROLC, ROR, RORC
673 1.1 skrll */
674 1.1 skrll #define R_CLASS_INSN(name, opcode, level) \
675 1.1 skrll { name, opcode, 0xffe0ffff, "R", level }
676 1.1 skrll
677 1.1 skrll /* RF: General register float operation
678 1.1 skrll Syntax: <i> dst
679 1.1 skrll dst = Register 0-11 (r)
680 1.1 skrll Instr: 2/0 - POPF, PUSHF
681 1.1 skrll */
682 1.1 skrll #define RF_CLASS_INSN(name, opcode, level) \
683 1.1 skrll { name, opcode, 0xffe0ffff, "r", level }
684 1.1 skrll
685 1.1 skrll /* S: General 3-operand float operation
686 1.1 skrll Syntax: <i> src2, src1, dst
687 1.1 skrll src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
688 1.1 skrll src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
689 1.1 skrll dst = Register 0-11 (r)
690 1.1 skrll Instr: 1/0 - SUBF3
691 1.1 skrll Alias: i, i3
692 1.1 skrll */
693 1.1 skrll #define S_CLASS_INSN(name, opcode, level) \
694 1.1 skrll { name, opcode|0x20000000, 0xffe00000, "e,g;r", level }, \
695 1.1 skrll { name, opcode|0x20200000, 0xffe00000, "e,J,r", level }, \
696 1.1 skrll { name, opcode|0x20400000, 0xffe00000, "I,g;r", level }, \
697 1.1 skrll { name, opcode|0x20600000, 0xffe00000, "I,J,r", level }, \
698 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \
699 1.1 skrll { name, opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }, \
700 1.1 skrll { name "3", opcode|0x20000000, 0xffe00000, "e,g;r", level }, \
701 1.1 skrll { name "3", opcode|0x20200000, 0xffe00000, "e,J,r", level }, \
702 1.1 skrll { name "3", opcode|0x20400000, 0xffe00000, "I,g;r", level }, \
703 1.1 skrll { name "3", opcode|0x20600000, 0xffe00000, "I,J,r", level }, \
704 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \
705 1.1 skrll { name "3", opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }
706 1.1 skrll
707 1.1 skrll /* SC: General commutative 3-operand float operation
708 1.1 skrll Syntax: <i> src2, src1, dst - Manual
709 1.1 skrll <i> src1, src2, dst
710 1.1 skrll src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
711 1.1 skrll src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
712 1.1 skrll dst = Register 0-11 (r)
713 1.1 skrll Instr: 2/0 - ADDF3, MPYF3
714 1.1 skrll Alias: i, i3
715 1.1 skrll */
716 1.1 skrll #define SC_CLASS_INSN(name, opcode, level) \
717 1.1 skrll { name, opcode|0x20000000, 0xffe00000, "e,g;r", level }, \
718 1.1 skrll { name, opcode|0x20200000, 0xffe00000, "e,J,r", level }, \
719 1.1 skrll { name, opcode|0x20400000, 0xffe00000, "I,g;r", level }, \
720 1.1 skrll { name, opcode|0x20600000, 0xffe00000, "I,J,r", level }, \
721 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \
722 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "g,C,r", OP_C4X }, \
723 1.1 skrll { name, opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }, \
724 1.1 skrll { name "3", opcode|0x20000000, 0xffe00000, "e,g;r", level }, \
725 1.1 skrll { name "3", opcode|0x20200000, 0xffe00000, "e,J,r", level }, \
726 1.1 skrll { name "3", opcode|0x20400000, 0xffe00000, "I,g;r", level }, \
727 1.1 skrll { name "3", opcode|0x20600000, 0xffe00000, "I,J,r", level }, \
728 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "g,C,r", OP_C4X }, \
729 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "C,g;r", OP_C4X }, \
730 1.1 skrll { name "3", opcode|0x30600000, 0xffe00000, "C,O,r", OP_C4X }
731 1.1 skrll
732 1.1 skrll /* S2: General 3-operand float operation with 2 args
733 1.1 skrll Syntax: <i> src2, src1
734 1.1 skrll src2 = Register 0-11 (e), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C)
735 1.1 skrll src1 = Register 0-11 (g), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
736 1.1 skrll Instr: 1/0 - CMPF3
737 1.1 skrll Alias: i, i3
738 1.1 skrll */
739 1.1 skrll #define S2_CLASS_INSN(name, opcode, level) \
740 1.1 skrll { name, opcode|0x20000000, 0xffe00000, "e,g", level }, \
741 1.1 skrll { name, opcode|0x20200000, 0xffe00000, "e,J", level }, \
742 1.1 skrll { name, opcode|0x20400000, 0xffe00000, "I,g", level }, \
743 1.1 skrll { name, opcode|0x20600000, 0xffe00000, "I,J", level }, \
744 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "C,g", OP_C4X }, \
745 1.1 skrll { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \
746 1.1 skrll { name "3", opcode|0x20000000, 0xffe00000, "e,g", level }, \
747 1.1 skrll { name "3", opcode|0x20200000, 0xffe00000, "e,J", level }, \
748 1.1 skrll { name "3", opcode|0x20400000, 0xffe00000, "I,g", level }, \
749 1.1 skrll { name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \
750 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "C,g", OP_C4X }, \
751 1.1 skrll { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }
752 1.1 skrll
753 1.1 skrll /* T: General 3-operand integer operand
754 1.1 skrll Syntax: <i> src2, src1, dst
755 1.1 skrll src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
756 1.1 skrll src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
757 1.1 skrll dst = Register (R)
758 1.1 skrll Instr: 5/0 - ANDN3, ASH3, LSH3, SUBB3, SUBI3
759 1.1 skrll Alias: i, i3
760 1.1 skrll */
761 1.1 skrll #define T_CLASS_INSN(name, opcode, level) \
762 1.1 skrll { name, opcode|0x20000000, 0xffe00000, "E,G;R", level }, \
763 1.1 skrll { name, opcode|0x20200000, 0xffe00000, "E,J,R", level }, \
764 1.1 skrll { name, opcode|0x20400000, 0xffe00000, "I,G;R", level }, \
765 1.1 skrll { name, opcode|0x20600000, 0xffe00000, "I,J,R", level }, \
766 1.1 skrll { name, opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \
767 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \
768 1.1 skrll { name, opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \
769 1.1 skrll { name, opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }, \
770 1.1 skrll { name "3", opcode|0x20000000, 0xffe00000, "E,G;R", level }, \
771 1.1 skrll { name "3", opcode|0x20200000, 0xffe00000, "E,J,R", level }, \
772 1.1 skrll { name "3", opcode|0x20400000, 0xffe00000, "I,G;R", level }, \
773 1.1 skrll { name "3", opcode|0x20600000, 0xffe00000, "I,J,R", level }, \
774 1.1 skrll { name "3", opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \
775 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \
776 1.1 skrll { name "3", opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \
777 1.1 skrll { name "3", opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }
778 1.1 skrll
779 1.1 skrll /* TC: General commutative 3-operand integer operation
780 1.1 skrll Syntax: <i> src2, src1, dst
781 1.1 skrll <i> src1, src2, dst
782 1.1 skrll src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
783 1.1 skrll src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
784 1.1 skrll dst = Register (R)
785 1.1 skrll Instr: 6/2 - ADDC3, ADDI3, AND3, MPYI3, OR3, XOR3, C4x: MPYSHI, MPYUHI
786 1.1 skrll Alias: i, i3
787 1.1 skrll */
788 1.1 skrll #define TC_CLASS_INSN(name, opcode, level) \
789 1.1 skrll { name, opcode|0x20000000, 0xffe00000, "E,G;R", level }, \
790 1.1 skrll { name, opcode|0x20200000, 0xffe00000, "E,J,R", level }, \
791 1.1 skrll { name, opcode|0x20400000, 0xffe00000, "I,G;R", level }, \
792 1.1 skrll { name, opcode|0x20600000, 0xffe00000, "I,J,R", level }, \
793 1.1 skrll { name, opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \
794 1.1 skrll { name, opcode|0x30000000, 0xffe00000, "G,W,R", OP_C4X }, \
795 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \
796 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "G,C,R", OP_C4X }, \
797 1.1 skrll { name, opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \
798 1.1 skrll { name, opcode|0x30400000, 0xffe00000, "O,W,R", OP_C4X }, \
799 1.1 skrll { name, opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }, \
800 1.1 skrll { name "3", opcode|0x20000000, 0xffe00000, "E,G;R", level }, \
801 1.1 skrll { name "3", opcode|0x20200000, 0xffe00000, "E,J,R", level }, \
802 1.1 skrll { name "3", opcode|0x20400000, 0xffe00000, "I,G;R", level }, \
803 1.1 skrll { name "3", opcode|0x20600000, 0xffe00000, "I,J,R", level }, \
804 1.1 skrll { name "3", opcode|0x30000000, 0xffe00000, "W,G;R", OP_C4X }, \
805 1.1 skrll { name "3", opcode|0x30000000, 0xffe00000, "G,W,R", OP_C4X }, \
806 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "C,G;R", OP_C4X }, \
807 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "G,C,R", OP_C4X }, \
808 1.1 skrll { name "3", opcode|0x30400000, 0xffe00000, "W,O,R", OP_C4X }, \
809 1.1 skrll { name "3", opcode|0x30400000, 0xffe00000, "O,W,R", OP_C4X }, \
810 1.1 skrll { name "3", opcode|0x30600000, 0xffe00000, "C,O,R", OP_C4X }
811 1.1 skrll
812 1.1 skrll /* T2: General 3-operand integer operation with 2 args
813 1.1 skrll Syntax: <i> src2, src1
814 1.1 skrll src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
815 1.1 skrll src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (O)
816 1.1 skrll Instr: 1/0 - CMPI3
817 1.1 skrll Alias: i, i3
818 1.1 skrll */
819 1.1 skrll #define T2_CLASS_INSN(name, opcode, level) \
820 1.1 skrll { name, opcode|0x20000000, 0xffe00000, "E,G", level }, \
821 1.1 skrll { name, opcode|0x20200000, 0xffe00000, "E,J", level }, \
822 1.1 skrll { name, opcode|0x20400000, 0xffe00000, "I,G", level }, \
823 1.1 skrll { name, opcode|0x20600000, 0xffe00000, "I,J", level }, \
824 1.1 skrll { name, opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \
825 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \
826 1.1 skrll { name, opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \
827 1.1 skrll { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \
828 1.1 skrll { name "3", opcode|0x20000000, 0xffe00000, "E,G", level }, \
829 1.1 skrll { name "3", opcode|0x20200000, 0xffe00000, "E,J", level }, \
830 1.1 skrll { name "3", opcode|0x20400000, 0xffe00000, "I,G", level }, \
831 1.1 skrll { name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \
832 1.1 skrll { name "3", opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \
833 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \
834 1.1 skrll { name "3", opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \
835 1.1 skrll { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }
836 1.1 skrll
837 1.1 skrll /* T2C: General commutative 3-operand integer operation with 2 args
838 1.1 skrll Syntax: <i> src2, src1 - Manual
839 1.1 skrll <i> src1, src2
840 1.1 skrll src2 = Register (E), Indirect 0,1,IR0,IR1 (I), C4x T2: Indirect (C), Immediate (W)
841 1.1 skrll src1 = Register (G), Indirect 0,1,IR0,IR1 (J), C4x T2: Indirect (0)
842 1.1 skrll Instr: 1/0 - TSTB3
843 1.1 skrll Alias: i, i3
844 1.1 skrll */
845 1.1 skrll #define T2C_CLASS_INSN(name, opcode, level) \
846 1.1 skrll { name, opcode|0x20000000, 0xffe00000, "E,G", level }, \
847 1.1 skrll { name, opcode|0x20200000, 0xffe00000, "E,J", level }, \
848 1.1 skrll { name, opcode|0x20400000, 0xffe00000, "I,G", level }, \
849 1.1 skrll { name, opcode|0x20600000, 0xffe00000, "I,J", level }, \
850 1.1 skrll { name, opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \
851 1.1 skrll { name, opcode|0x30000000, 0xffe00000, "G,W", OP_C4X }, \
852 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \
853 1.1 skrll { name, opcode|0x30200000, 0xffe00000, "G,C", OP_C4X }, \
854 1.1 skrll { name, opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \
855 1.1 skrll { name, opcode|0x30400000, 0xffe00000, "O,W", OP_C4X }, \
856 1.1 skrll { name, opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }, \
857 1.1 skrll { name "3", opcode|0x20000000, 0xffe00000, "E,G", level }, \
858 1.1 skrll { name "3", opcode|0x20200000, 0xffe00000, "E,J", level }, \
859 1.1 skrll { name "3", opcode|0x20400000, 0xffe00000, "I,G", level }, \
860 1.1 skrll { name "3", opcode|0x20600000, 0xffe00000, "I,J", level }, \
861 1.1 skrll { name "3", opcode|0x30000000, 0xffe00000, "W,G", OP_C4X }, \
862 1.1 skrll { name "3", opcode|0x30000000, 0xffe00000, "G,W", OP_C4X }, \
863 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "C,G", OP_C4X }, \
864 1.1 skrll { name "3", opcode|0x30200000, 0xffe00000, "G,C", OP_C4X }, \
865 1.1 skrll { name "3", opcode|0x30400000, 0xffe00000, "W,O", OP_C4X }, \
866 1.1 skrll { name "3", opcode|0x30400000, 0xffe00000, "O,W", OP_C4X }, \
867 1.1 skrll { name "3", opcode|0x30600000, 0xffe00000, "C,O", OP_C4X }
868 1.1 skrll
869 1.1 skrll /* Z: Misc operations with or without arguments
870 1.1 skrll Syntax: <i> <arg1>,...
871 1.1 skrll Instr: 16 - RETIc, RETSc, SIGI(c3X), SWI, IDLE, IDLE2, RETIcD,
872 1.1 skrll TRAPc, LATc, LDEP, LDEHI, LDEPE, LDPK, STIK, LDP, IACK
873 1.1 skrll */
874 1.1 skrll
875 1.1 skrll
876 1.1 skrll /* Define tic4x opcodes for assembler and disassembler. */
877 1.1 skrll static const tic4x_inst_t tic4x_insts[] =
878 1.1 skrll {
879 1.1 skrll /* Put synonyms after the desired forms in table so that they get
880 1.1 skrll overwritten in the lookup table. The disassembler will thus
881 1.1 skrll print the `proper' mnemonics. Note that the disassembler
882 1.1 skrll only decodes the 11 MSBs, so instructions like ldp @0x500 will
883 1.1 skrll be printed as ldiu 5, dp. Note that with parallel instructions,
884 1.1 skrll the second part is executed before the first part, unless
885 1.1 skrll the sti1||sti2 form is used. We also allow sti2||sti1
886 1.1 skrll which is equivalent to the default sti||sti form.
887 1.1 skrll */
888 1.1 skrll B_CLASS_INSN( "absf", 0x00000000, OP_C3X ),
889 1.1 skrll P_CLASS_INSN( "absf", "stf", 0xc8000000, OP_C3X ),
890 1.1 skrll A_CLASS_INSN( "absi", 0x00800000, OP_C3X ),
891 1.1 skrll P_CLASS_INSN( "absi", "sti", 0xca000000, OP_C3X ),
892 1.1 skrll A_CLASS_INSN( "addc", 0x01000000, OP_C3X ),
893 1.1 skrll TC_CLASS_INSN( "addc", 0x00000000, OP_C3X ),
894 1.1 skrll B_CLASS_INSN( "addf", 0x01800000, OP_C3X ),
895 1.1 skrll SC_CLASS_INSN( "addf", 0x00800000, OP_C3X ),
896 1.1 skrll QC_CLASS_INSN( "addf", "stf", 0xcc000000, OP_C3X ),
897 1.1 skrll A_CLASS_INSN( "addi", 0x02000000, OP_C3X ),
898 1.1 skrll TC_CLASS_INSN( "addi", 0x01000000, OP_C3X ),
899 1.1 skrll QC_CLASS_INSN( "addi", "sti", 0xce000000, OP_C3X ),
900 1.1 skrll AU_CLASS_INSN( "and", 0x02800000, OP_C3X ),
901 1.1 skrll TC_CLASS_INSN( "and", 0x01800000, OP_C3X ),
902 1.1 skrll QC_CLASS_INSN( "and", "sti", 0xd0000000, OP_C3X ),
903 1.1 skrll AU_CLASS_INSN( "andn", 0x03000000, OP_C3X ),
904 1.1 skrll T_CLASS_INSN( "andn", 0x02000000, OP_C3X ),
905 1.1 skrll A_CLASS_INSN( "ash", 0x03800000, OP_C3X ),
906 1.1 skrll T_CLASS_INSN( "ash", 0x02800000, OP_C3X ),
907 1.1 skrll Q_CLASS_INSN( "ash", "sti", 0xd2000000, OP_C3X ),
908 1.1 skrll J_CLASS_INSN( "bB", "b", 0x68000000, OP_C3X ),
909 1.1 skrll J_CLASS_INSN( "bBd", "bd", 0x68200000, OP_C3X ),
910 1.1 skrll J_CLASS_INSN( "bBaf", "baf", 0x68a00000, OP_C4X ),
911 1.1 skrll J_CLASS_INSN( "bBat", "bat", 0x68600000, OP_C4X ),
912 1.1 skrll { "br", 0x60000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */
913 1.1 skrll { "brd", 0x61000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */
914 1.1 skrll { "call", 0x62000000, 0xff000000, "B" , OP_C3X }, /* I_CLASS */
915 1.1 skrll { "callB", 0x70000000, 0xffe00000, "Q" , OP_C3X }, /* JS_CLASS */
916 1.1 skrll { "callB", 0x72000000, 0xffe00000, "P" , OP_C3X }, /* JS_CLASS */
917 1.1 skrll B_CLASS_INSN( "cmpf", 0x04000000, OP_C3X ),
918 1.1 skrll S2_CLASS_INSN( "cmpf", 0x03000000, OP_C3X ),
919 1.1 skrll A_CLASS_INSN( "cmpi", 0x04800000, OP_C3X ),
920 1.1 skrll T2_CLASS_INSN( "cmpi", 0x03800000, OP_C3X ),
921 1.1 skrll D_CLASS_INSN( "dbB", "db", 0x6c000000, OP_C3X ),
922 1.1 skrll D_CLASS_INSN( "dbBd", "dbd", 0x6c200000, OP_C3X ),
923 1.1 skrll AF_CLASS_INSN( "fix", 0x05000000, OP_C3X ),
924 1.1 skrll P_CLASS_INSN( "fix", "sti", 0xd4000000, OP_C3X ),
925 1.1 skrll BI_CLASS_INSN( "float", 0x05800000, OP_C3X ),
926 1.1 skrll P_CLASS_INSN( "float", "stf", 0xd6000000, OP_C3X ),
927 1.1 skrll B6_CLASS_INSN( "frieee", 0x1c000000, OP_C4X ),
928 1.1 skrll P_CLASS_INSN( "frieee","stf", 0xf2000000, OP_C4X ),
929 1.1 skrll { "iack", 0x1b200000, 0xffe00000, "@" , OP_C3X }, /* Z_CLASS */
930 1.1 skrll { "iack", 0x1b400000, 0xffe00000, "*" , OP_C3X }, /* Z_CLASS */
931 1.1 skrll { "idle", 0x06000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */
932 1.1 skrll { "idlez", 0x06000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */
933 1.1 skrll { "idle2", 0x06000001, 0xffffffff, "" , OP_IDLE2 }, /* Z_CLASS */
934 1.1 skrll { "laj", 0x63000000, 0xff000000, "B" , OP_C4X }, /* I_CLASS */
935 1.1 skrll { "lajB", 0x70200000, 0xffe00000, "Q" , OP_C4X }, /* JS_CLASS */
936 1.1 skrll { "lajB", 0x72200000, 0xffe00000, "P" , OP_C4X }, /* JS_CLASS */
937 1.1 skrll { "latB", 0x74800000, 0xffe00000, "V" , OP_C4X }, /* Z_CLASS */
938 1.1 skrll A_CLASS_INSN( "lb0", 0xb0000000, OP_C4X ),
939 1.1 skrll A_CLASS_INSN( "lb1", 0xb0800000, OP_C4X ),
940 1.1 skrll A_CLASS_INSN( "lb2", 0xb1000000, OP_C4X ),
941 1.1 skrll A_CLASS_INSN( "lb3", 0xb1800000, OP_C4X ),
942 1.1 skrll AU_CLASS_INSN( "lbu0", 0xb2000000, OP_C4X ),
943 1.1 skrll AU_CLASS_INSN( "lbu1", 0xb2800000, OP_C4X ),
944 1.1 skrll AU_CLASS_INSN( "lbu2", 0xb3000000, OP_C4X ),
945 1.1 skrll AU_CLASS_INSN( "lbu3", 0xb3800000, OP_C4X ),
946 1.1 skrll AY_CLASS_INSN( "lda", 0x1e800000, OP_C4X ),
947 1.1 skrll B_CLASS_INSN( "lde", 0x06800000, OP_C3X ),
948 1.1 skrll { "ldep", 0x76000000, 0xffe00000, "X,R" , OP_C4X }, /* Z_CLASS */
949 1.1 skrll B_CLASS_INSN( "ldf", 0x07000000, OP_C3X ),
950 1.1 skrll LL_CLASS_INSN( "ldf", 0xc4000000, OP_C3X ),
951 1.1 skrll P_CLASS_INSN( "ldf", "stf", 0xd8000000, OP_C3X ),
952 1.1 skrll BB_CLASS_INSN( "ldfC", 0x00000000, OP_C3X ),
953 1.1 skrll B6_CLASS_INSN( "ldfi", 0x07800000, OP_C3X ),
954 1.1 skrll { "ldhi", 0x1fe00000, 0xffe00000, "U,R" , OP_C4X }, /* Z_CLASS */
955 1.1 skrll { "ldhi", 0x1fe00000, 0xffe00000, "#,R" , OP_C4X }, /* Z_CLASS */
956 1.1 skrll A_CLASS_INSN( "ldi", 0x08000000, OP_C3X ),
957 1.1 skrll LL_CLASS_INSN( "ldi", 0xc6000000, OP_C3X ),
958 1.1 skrll P_CLASS_INSN( "ldi", "sti", 0xda000000, OP_C3X ),
959 1.1 skrll AB_CLASS_INSN( "ldiC", 0x10000000, OP_C3X ),
960 1.1 skrll A6_CLASS_INSN( "ldii", 0x08800000, OP_C3X ),
961 1.1 skrll { "ldp", 0x50700000, 0xffff0000, "#" , OP_C3X }, /* Z_CLASS - synonym for ldiu #,dp */
962 1.1 skrll B_CLASS_INSN( "ldm", 0x09000000, OP_C3X ),
963 1.1 skrll { "ldpe", 0x76800000, 0xffe00000, "Q,Z" , OP_C4X }, /* Z_CLASS */
964 1.1 skrll { "ldpk", 0x1F700000, 0xffff0000, "#" , OP_C4X }, /* Z_CLASS */
965 1.1 skrll A_CLASS_INSN( "lh0", 0xba000000, OP_C4X ),
966 1.1 skrll A_CLASS_INSN( "lh1", 0xba800000, OP_C4X ),
967 1.1 skrll AU_CLASS_INSN( "lhu0", 0xbb000000, OP_C4X ),
968 1.1 skrll AU_CLASS_INSN( "lhu1", 0xbb800000, OP_C4X ),
969 1.1 skrll { "lopower", 0x10800001,0xffffffff, "" , OP_LPWR }, /* Z_CLASS */
970 1.1 skrll A_CLASS_INSN( "lsh", 0x09800000, OP_C3X ),
971 1.1 skrll T_CLASS_INSN( "lsh", 0x04000000, OP_C3X ),
972 1.1 skrll Q_CLASS_INSN( "lsh", "sti", 0xdc000000, OP_C3X ),
973 1.1 skrll A_CLASS_INSN( "lwl0", 0xb4000000, OP_C4X ),
974 1.1 skrll A_CLASS_INSN( "lwl1", 0xb4800000, OP_C4X ),
975 1.1 skrll A_CLASS_INSN( "lwl2", 0xb5000000, OP_C4X ),
976 1.1 skrll A_CLASS_INSN( "lwl3", 0xb5800000, OP_C4X ),
977 1.1 skrll A_CLASS_INSN( "lwr0", 0xb6000000, OP_C4X ),
978 1.1 skrll A_CLASS_INSN( "lwr1", 0xb6800000, OP_C4X ),
979 1.1 skrll A_CLASS_INSN( "lwr2", 0xb7000000, OP_C4X ),
980 1.1 skrll A_CLASS_INSN( "lwr3", 0xb7800000, OP_C4X ),
981 1.1 skrll { "maxspeed",0x10800000,0xffffffff, "" , OP_LPWR }, /* Z_CLASS */
982 1.1 skrll A_CLASS_INSN( "mb0", 0xb8000000, OP_C4X ),
983 1.1 skrll A_CLASS_INSN( "mb1", 0xb8800000, OP_C4X ),
984 1.1 skrll A_CLASS_INSN( "mb2", 0xb9000000, OP_C4X ),
985 1.1 skrll A_CLASS_INSN( "mb3", 0xb9800000, OP_C4X ),
986 1.1 skrll A_CLASS_INSN( "mh0", 0xbc000000, OP_C4X ),
987 1.1 skrll A_CLASS_INSN( "mh1", 0xbc800000, OP_C4X ),
988 1.1 skrll A_CLASS_INSN( "mh2", 0xbd000000, OP_C4X ),
989 1.1 skrll A_CLASS_INSN( "mh3", 0xbd800000, OP_C4X ),
990 1.1 skrll B_CLASS_INSN( "mpyf", 0x0a000000, OP_C3X ),
991 1.1 skrll SC_CLASS_INSN( "mpyf", 0x04800000, OP_C3X ),
992 1.1 skrll M_CLASS_INSN( "mpyf", "addf", 0x80000000, OP_C3X ),
993 1.1 skrll QC_CLASS_INSN( "mpyf", "stf", 0xde000000, OP_C3X ),
994 1.1 skrll M_CLASS_INSN( "mpyf", "subf", 0x84000000, OP_C3X ),
995 1.1 skrll A_CLASS_INSN( "mpyi", 0x0a800000, OP_C3X ),
996 1.1 skrll TC_CLASS_INSN( "mpyi", 0x05000000, OP_C3X ),
997 1.1 skrll M_CLASS_INSN( "mpyi", "addi", 0x88000000, OP_C3X ),
998 1.1 skrll QC_CLASS_INSN( "mpyi", "sti", 0xe0000000, OP_C3X ),
999 1.1 skrll M_CLASS_INSN( "mpyi", "subi", 0x8c000000, OP_C3X ),
1000 1.1 skrll A_CLASS_INSN( "mpyshi", 0x1d800000, OP_C4X ),
1001 1.1 skrll TC_CLASS_INSN( "mpyshi", 0x28800000, OP_C4X ),
1002 1.1 skrll A_CLASS_INSN( "mpyuhi", 0x1e000000, OP_C4X ),
1003 1.1 skrll TC_CLASS_INSN( "mpyuhi", 0x29000000, OP_C4X ),
1004 1.1 skrll A_CLASS_INSN( "negb", 0x0b000000, OP_C3X ),
1005 1.1 skrll B_CLASS_INSN( "negf", 0x0b800000, OP_C3X ),
1006 1.1 skrll P_CLASS_INSN( "negf", "stf", 0xe2000000, OP_C3X ),
1007 1.1 skrll A_CLASS_INSN( "negi", 0x0c000000, OP_C3X ),
1008 1.1 skrll P_CLASS_INSN( "negi", "sti", 0xe4000000, OP_C3X ),
1009 1.1 skrll A2_CLASS_INSN( "nop", 0x0c800000, OP_C3X ),
1010 1.1 skrll B_CLASS_INSN( "norm", 0x0d000000, OP_C3X ),
1011 1.1 skrll AU_CLASS_INSN( "not", 0x0d800000, OP_C3X ),
1012 1.1 skrll P_CLASS_INSN( "not", "sti", 0xe6000000, OP_C3X ),
1013 1.1 skrll AU_CLASS_INSN( "or", 0x10000000, OP_C3X ),
1014 1.1 skrll TC_CLASS_INSN( "or", 0x05800000, OP_C3X ),
1015 1.1 skrll QC_CLASS_INSN( "or", "sti", 0xe8000000, OP_C3X ),
1016 1.1 skrll R_CLASS_INSN( "pop", 0x0e200000, OP_C3X ),
1017 1.1 skrll RF_CLASS_INSN( "popf", 0x0ea00000, OP_C3X ),
1018 1.1 skrll R_CLASS_INSN( "push", 0x0f200000, OP_C3X ),
1019 1.1 skrll RF_CLASS_INSN( "pushf", 0x0fa00000, OP_C3X ),
1020 1.1 skrll BA_CLASS_INSN( "rcpf", 0x1d000000, OP_C4X ),
1021 1.1 skrll { "retiB", 0x78000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */
1022 1.1 skrll { "reti", 0x78000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS - Alias for retiu */
1023 1.1 skrll { "retiBd", 0x78200000, 0xffe00000, "" , OP_C4X }, /* Z_CLASS */
1024 1.1 skrll { "retid", 0x78200000, 0xffe00000, "" , OP_C4X }, /* Z_CLASS - Alias for retiud */
1025 1.1 skrll { "retsB", 0x78800000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */
1026 1.1 skrll { "rets", 0x78800000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS - Alias for retsu */
1027 1.1 skrll B_CLASS_INSN( "rnd", 0x11000000, OP_C3X ),
1028 1.1 skrll R_CLASS_INSN( "rol", 0x11e00001, OP_C3X ),
1029 1.1 skrll R_CLASS_INSN( "rolc", 0x12600001, OP_C3X ),
1030 1.1 skrll R_CLASS_INSN( "ror", 0x12e0ffff, OP_C3X ),
1031 1.1 skrll R_CLASS_INSN( "rorc", 0x1360ffff, OP_C3X ),
1032 1.1 skrll { "rptb", 0x64000000, 0xff000000, "B" , OP_C3X }, /* I2_CLASS */
1033 1.1 skrll { "rptb", 0x79000000, 0xff000000, "Q" , OP_C4X }, /* I2_CLASS */
1034 1.1 skrll { "rptbd", 0x65000000, 0xff000000, "B" , OP_C4X }, /* I2_CLASS */
1035 1.1 skrll { "rptbd", 0x79800000, 0xff000000, "Q" , OP_C4X }, /* I2_CLASS */
1036 1.1 skrll A3_CLASS_INSN( "rpts", 0x139b0000, OP_C3X ),
1037 1.1 skrll B_CLASS_INSN( "rsqrf", 0x1c800000, OP_C4X ),
1038 1.1 skrll { "sigi", 0x16000000, 0xffe00000, "" , OP_C3X }, /* Z_CLASS */
1039 1.1 skrll A6_CLASS_INSN( "sigi", 0x16000000, OP_C4X ),
1040 1.1 skrll B7_CLASS_INSN( "stf", 0x14000000, OP_C3X ),
1041 1.1 skrll LS_CLASS_INSN( "stf", 0xc0000000, OP_C3X ),
1042 1.1 skrll B7_CLASS_INSN( "stfi", 0x14800000, OP_C3X ),
1043 1.1 skrll A7_CLASS_INSN( "sti", 0x15000000, OP_C3X ),
1044 1.1 skrll { "sti", 0x15000000, 0xffe00000, "T,@" , OP_C4X }, /* Class A7 - Alias for stik */
1045 1.1 skrll { "sti", 0x15600000, 0xffe00000, "T,*" , OP_C4X }, /* Class A7 */
1046 1.1 skrll LS_CLASS_INSN( "sti", 0xc2000000, OP_C3X ),
1047 1.1 skrll A7_CLASS_INSN( "stii", 0x15800000, OP_C3X ),
1048 1.1 skrll { "stik", 0x15000000, 0xffe00000, "T,@" , OP_C4X }, /* Z_CLASS */
1049 1.1 skrll { "stik", 0x15600000, 0xffe00000, "T,*" , OP_C4X }, /* Z_CLASS */
1050 1.1 skrll A_CLASS_INSN( "subb", 0x16800000, OP_C3X ),
1051 1.1 skrll T_CLASS_INSN( "subb", 0x06000000, OP_C3X ),
1052 1.1 skrll A_CLASS_INSN( "subc", 0x17000000, OP_C3X ),
1053 1.1 skrll B_CLASS_INSN( "subf", 0x17800000, OP_C3X ),
1054 1.1 skrll S_CLASS_INSN( "subf", 0x06800000, OP_C3X ),
1055 1.1 skrll Q_CLASS_INSN( "subf", "stf", 0xea000000, OP_C3X ),
1056 1.1 skrll A_CLASS_INSN( "subi", 0x18000000, OP_C3X ),
1057 1.1 skrll T_CLASS_INSN( "subi", 0x07000000, OP_C3X ),
1058 1.1 skrll Q_CLASS_INSN( "subi", "sti", 0xec000000, OP_C3X ),
1059 1.1 skrll A_CLASS_INSN( "subrb", 0x18800000, OP_C3X ),
1060 1.1 skrll B_CLASS_INSN( "subrf", 0x19000000, OP_C3X ),
1061 1.1 skrll A_CLASS_INSN( "subri", 0x19800000, OP_C3X ),
1062 1.1 skrll { "swi", 0x66000000, 0xffffffff, "" , OP_C3X }, /* Z_CLASS */
1063 1.1 skrll B_CLASS_INSN( "toieee", 0x1b800000, OP_C4X ),
1064 1.1 skrll P_CLASS_INSN( "toieee","stf", 0xf0000000, OP_C4X ),
1065 1.1 skrll { "trapB", 0x74000000, 0xffe00000, "V" , OP_C3X }, /* Z_CLASS */
1066 1.1 skrll { "trap", 0x74000000, 0xffe00000, "V" , OP_C3X }, /* Z_CLASS - Alias for trapu */
1067 1.1 skrll AU_CLASS_INSN( "tstb", 0x1a000000, OP_C3X ),
1068 1.1 skrll T2C_CLASS_INSN("tstb", 0x07800000, OP_C3X ),
1069 1.1 skrll AU_CLASS_INSN( "xor", 0x1a800000, OP_C3X ),
1070 1.1 skrll TC_CLASS_INSN( "xor", 0x08000000, OP_C3X ),
1071 1.1 skrll QC_CLASS_INSN( "xor", "sti", 0xee000000, OP_C3X ),
1072 1.1 skrll
1073 1.1 skrll /* Dummy entry, not included in tic4x_num_insts. This
1074 1.1 skrll lets code examine entry i + 1 without checking
1075 1.1 skrll if we've run off the end of the table. */
1076 1.1 skrll { "", 0x0, 0x00, "", 0 }
1077 1.1 skrll };
1078 1.1 skrll
1079 1.1 skrll const unsigned int tic4x_num_insts = (((sizeof tic4x_insts) / (sizeof tic4x_insts[0])) - 1);
1080