Add support for the m32r2 processor
[deliverable/binutils-gdb.git] / sim / m32r / cpu.h
1 /* CPU family header for m32rbf.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
6
7 This file is part of the GNU simulators.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
23 */
24
25 #ifndef CPU_M32RBF_H
26 #define CPU_M32RBF_H
27
28 /* Maximum number of instructions that are fetched at a time.
29 This is for LIW type instructions sets (e.g. m32r). */
30 #define MAX_LIW_INSNS 2
31
32 /* Maximum number of instructions that can be executed in parallel. */
33 #define MAX_PARALLEL_INSNS 1
34
35 /* CPU state information. */
36 typedef struct {
37 /* Hardware elements. */
38 struct {
39 /* program counter */
40 USI h_pc;
41 #define GET_H_PC() CPU (h_pc)
42 #define SET_H_PC(x) (CPU (h_pc) = (x))
43 /* general registers */
44 SI h_gr[16];
45 #define GET_H_GR(a1) CPU (h_gr)[a1]
46 #define SET_H_GR(a1, x) (CPU (h_gr)[a1] = (x))
47 /* control registers */
48 USI h_cr[16];
49 #define GET_H_CR(index) m32rbf_h_cr_get_handler (current_cpu, index)
50 #define SET_H_CR(index, x) \
51 do { \
52 m32rbf_h_cr_set_handler (current_cpu, (index), (x));\
53 ;} while (0)
54 /* accumulator */
55 DI h_accum;
56 #define GET_H_ACCUM() m32rbf_h_accum_get_handler (current_cpu)
57 #define SET_H_ACCUM(x) \
58 do { \
59 m32rbf_h_accum_set_handler (current_cpu, (x));\
60 ;} while (0)
61 /* condition bit */
62 BI h_cond;
63 #define GET_H_COND() CPU (h_cond)
64 #define SET_H_COND(x) (CPU (h_cond) = (x))
65 /* psw part of psw */
66 UQI h_psw;
67 #define GET_H_PSW() m32rbf_h_psw_get_handler (current_cpu)
68 #define SET_H_PSW(x) \
69 do { \
70 m32rbf_h_psw_set_handler (current_cpu, (x));\
71 ;} while (0)
72 /* backup psw */
73 UQI h_bpsw;
74 #define GET_H_BPSW() CPU (h_bpsw)
75 #define SET_H_BPSW(x) (CPU (h_bpsw) = (x))
76 /* backup bpsw */
77 UQI h_bbpsw;
78 #define GET_H_BBPSW() CPU (h_bbpsw)
79 #define SET_H_BBPSW(x) (CPU (h_bbpsw) = (x))
80 /* lock */
81 BI h_lock;
82 #define GET_H_LOCK() CPU (h_lock)
83 #define SET_H_LOCK(x) (CPU (h_lock) = (x))
84 } hardware;
85 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
86 } M32RBF_CPU_DATA;
87
88 /* Cover fns for register access. */
89 USI m32rbf_h_pc_get (SIM_CPU *);
90 void m32rbf_h_pc_set (SIM_CPU *, USI);
91 SI m32rbf_h_gr_get (SIM_CPU *, UINT);
92 void m32rbf_h_gr_set (SIM_CPU *, UINT, SI);
93 USI m32rbf_h_cr_get (SIM_CPU *, UINT);
94 void m32rbf_h_cr_set (SIM_CPU *, UINT, USI);
95 DI m32rbf_h_accum_get (SIM_CPU *);
96 void m32rbf_h_accum_set (SIM_CPU *, DI);
97 BI m32rbf_h_cond_get (SIM_CPU *);
98 void m32rbf_h_cond_set (SIM_CPU *, BI);
99 UQI m32rbf_h_psw_get (SIM_CPU *);
100 void m32rbf_h_psw_set (SIM_CPU *, UQI);
101 UQI m32rbf_h_bpsw_get (SIM_CPU *);
102 void m32rbf_h_bpsw_set (SIM_CPU *, UQI);
103 UQI m32rbf_h_bbpsw_get (SIM_CPU *);
104 void m32rbf_h_bbpsw_set (SIM_CPU *, UQI);
105 BI m32rbf_h_lock_get (SIM_CPU *);
106 void m32rbf_h_lock_set (SIM_CPU *, BI);
107
108 /* These must be hand-written. */
109 extern CPUREG_FETCH_FN m32rbf_fetch_register;
110 extern CPUREG_STORE_FN m32rbf_store_register;
111
112 typedef struct {
113 UINT h_gr;
114 } MODEL_M32R_D_DATA;
115
116 typedef struct {
117 int empty;
118 } MODEL_TEST_DATA;
119
120 /* Instruction argument buffer. */
121
122 union sem_fields {
123 struct { /* no operands */
124 int empty;
125 } fmt_empty;
126 struct { /* */
127 UINT f_uimm8;
128 } sfmt_clrpsw;
129 struct { /* */
130 UINT f_uimm4;
131 } sfmt_trap;
132 struct { /* */
133 IADDR i_disp24;
134 unsigned char out_h_gr_SI_14;
135 } sfmt_bl24;
136 struct { /* */
137 IADDR i_disp8;
138 unsigned char out_h_gr_SI_14;
139 } sfmt_bl8;
140 struct { /* */
141 SI* i_dr;
142 UINT f_hi16;
143 UINT f_r1;
144 unsigned char out_dr;
145 } sfmt_seth;
146 struct { /* */
147 ADDR i_uimm24;
148 SI* i_dr;
149 UINT f_r1;
150 unsigned char out_dr;
151 } sfmt_ld24;
152 struct { /* */
153 SI* i_sr;
154 UINT f_r2;
155 unsigned char in_sr;
156 unsigned char out_h_gr_SI_14;
157 } sfmt_jl;
158 struct { /* */
159 SI* i_sr;
160 INT f_simm16;
161 UINT f_r2;
162 UINT f_uimm3;
163 unsigned char in_sr;
164 } sfmt_bset;
165 struct { /* */
166 SI* i_dr;
167 UINT f_r1;
168 UINT f_uimm5;
169 unsigned char in_dr;
170 unsigned char out_dr;
171 } sfmt_slli;
172 struct { /* */
173 SI* i_dr;
174 INT f_simm8;
175 UINT f_r1;
176 unsigned char in_dr;
177 unsigned char out_dr;
178 } sfmt_addi;
179 struct { /* */
180 SI* i_src1;
181 SI* i_src2;
182 UINT f_r1;
183 UINT f_r2;
184 unsigned char in_src1;
185 unsigned char in_src2;
186 unsigned char out_src2;
187 } sfmt_st_plus;
188 struct { /* */
189 SI* i_src1;
190 SI* i_src2;
191 INT f_simm16;
192 UINT f_r1;
193 UINT f_r2;
194 unsigned char in_src1;
195 unsigned char in_src2;
196 } sfmt_st_d;
197 struct { /* */
198 SI* i_dr;
199 SI* i_sr;
200 UINT f_r1;
201 UINT f_r2;
202 unsigned char in_sr;
203 unsigned char out_dr;
204 unsigned char out_sr;
205 } sfmt_ld_plus;
206 struct { /* */
207 IADDR i_disp16;
208 SI* i_src1;
209 SI* i_src2;
210 UINT f_r1;
211 UINT f_r2;
212 unsigned char in_src1;
213 unsigned char in_src2;
214 } sfmt_beq;
215 struct { /* */
216 SI* i_dr;
217 SI* i_sr;
218 UINT f_r1;
219 UINT f_r2;
220 UINT f_uimm16;
221 unsigned char in_sr;
222 unsigned char out_dr;
223 } sfmt_and3;
224 struct { /* */
225 SI* i_dr;
226 SI* i_sr;
227 INT f_simm16;
228 UINT f_r1;
229 UINT f_r2;
230 unsigned char in_sr;
231 unsigned char out_dr;
232 } sfmt_add3;
233 struct { /* */
234 SI* i_dr;
235 SI* i_sr;
236 UINT f_r1;
237 UINT f_r2;
238 unsigned char in_dr;
239 unsigned char in_sr;
240 unsigned char out_dr;
241 } sfmt_add;
242 #if WITH_SCACHE_PBB
243 /* Writeback handler. */
244 struct {
245 /* Pointer to argbuf entry for insn whose results need writing back. */
246 const struct argbuf *abuf;
247 } write;
248 /* x-before handler */
249 struct {
250 /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
251 int first_p;
252 } before;
253 /* x-after handler */
254 struct {
255 int empty;
256 } after;
257 /* This entry is used to terminate each pbb. */
258 struct {
259 /* Number of insns in pbb. */
260 int insn_count;
261 /* Next pbb to execute. */
262 SCACHE *next;
263 SCACHE *branch_target;
264 } chain;
265 #endif
266 };
267
268 /* The ARGBUF struct. */
269 struct argbuf {
270 /* These are the baseclass definitions. */
271 IADDR addr;
272 const IDESC *idesc;
273 char trace_p;
274 char profile_p;
275 /* ??? Temporary hack for skip insns. */
276 char skip_count;
277 char unused;
278 /* cpu specific data follows */
279 union sem semantic;
280 int written;
281 union sem_fields fields;
282 };
283
284 /* A cached insn.
285
286 ??? SCACHE used to contain more than just argbuf. We could delete the
287 type entirely and always just use ARGBUF, but for future concerns and as
288 a level of abstraction it is left in. */
289
290 struct scache {
291 struct argbuf argbuf;
292 };
293
294 /* Macros to simplify extraction, reading and semantic code.
295 These define and assign the local vars that contain the insn's fields. */
296
297 #define EXTRACT_IFMT_EMPTY_VARS \
298 unsigned int length;
299 #define EXTRACT_IFMT_EMPTY_CODE \
300 length = 0; \
301
302 #define EXTRACT_IFMT_ADD_VARS \
303 UINT f_op1; \
304 UINT f_r1; \
305 UINT f_op2; \
306 UINT f_r2; \
307 unsigned int length;
308 #define EXTRACT_IFMT_ADD_CODE \
309 length = 2; \
310 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
311 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
312 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
313 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
314
315 #define EXTRACT_IFMT_ADD3_VARS \
316 UINT f_op1; \
317 UINT f_r1; \
318 UINT f_op2; \
319 UINT f_r2; \
320 INT f_simm16; \
321 unsigned int length;
322 #define EXTRACT_IFMT_ADD3_CODE \
323 length = 4; \
324 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
325 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
326 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
327 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
328 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
329
330 #define EXTRACT_IFMT_AND3_VARS \
331 UINT f_op1; \
332 UINT f_r1; \
333 UINT f_op2; \
334 UINT f_r2; \
335 UINT f_uimm16; \
336 unsigned int length;
337 #define EXTRACT_IFMT_AND3_CODE \
338 length = 4; \
339 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
340 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
341 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
342 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
343 f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
344
345 #define EXTRACT_IFMT_OR3_VARS \
346 UINT f_op1; \
347 UINT f_r1; \
348 UINT f_op2; \
349 UINT f_r2; \
350 UINT f_uimm16; \
351 unsigned int length;
352 #define EXTRACT_IFMT_OR3_CODE \
353 length = 4; \
354 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
355 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
356 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
357 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
358 f_uimm16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
359
360 #define EXTRACT_IFMT_ADDI_VARS \
361 UINT f_op1; \
362 UINT f_r1; \
363 INT f_simm8; \
364 unsigned int length;
365 #define EXTRACT_IFMT_ADDI_CODE \
366 length = 2; \
367 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
368 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
369 f_simm8 = EXTRACT_MSB0_INT (insn, 16, 8, 8); \
370
371 #define EXTRACT_IFMT_ADDV3_VARS \
372 UINT f_op1; \
373 UINT f_r1; \
374 UINT f_op2; \
375 UINT f_r2; \
376 INT f_simm16; \
377 unsigned int length;
378 #define EXTRACT_IFMT_ADDV3_CODE \
379 length = 4; \
380 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
381 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
382 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
383 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
384 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
385
386 #define EXTRACT_IFMT_BC8_VARS \
387 UINT f_op1; \
388 UINT f_r1; \
389 SI f_disp8; \
390 unsigned int length;
391 #define EXTRACT_IFMT_BC8_CODE \
392 length = 2; \
393 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
394 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
395 f_disp8 = ((((EXTRACT_MSB0_INT (insn, 16, 8, 8)) << (2))) + (((pc) & (-4)))); \
396
397 #define EXTRACT_IFMT_BC24_VARS \
398 UINT f_op1; \
399 UINT f_r1; \
400 SI f_disp24; \
401 unsigned int length;
402 #define EXTRACT_IFMT_BC24_CODE \
403 length = 4; \
404 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
405 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
406 f_disp24 = ((((EXTRACT_MSB0_INT (insn, 32, 8, 24)) << (2))) + (pc)); \
407
408 #define EXTRACT_IFMT_BEQ_VARS \
409 UINT f_op1; \
410 UINT f_r1; \
411 UINT f_op2; \
412 UINT f_r2; \
413 SI f_disp16; \
414 unsigned int length;
415 #define EXTRACT_IFMT_BEQ_CODE \
416 length = 4; \
417 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
418 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
419 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
420 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
421 f_disp16 = ((((EXTRACT_MSB0_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
422
423 #define EXTRACT_IFMT_BEQZ_VARS \
424 UINT f_op1; \
425 UINT f_r1; \
426 UINT f_op2; \
427 UINT f_r2; \
428 SI f_disp16; \
429 unsigned int length;
430 #define EXTRACT_IFMT_BEQZ_CODE \
431 length = 4; \
432 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
433 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
434 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
435 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
436 f_disp16 = ((((EXTRACT_MSB0_INT (insn, 32, 16, 16)) << (2))) + (pc)); \
437
438 #define EXTRACT_IFMT_CMP_VARS \
439 UINT f_op1; \
440 UINT f_r1; \
441 UINT f_op2; \
442 UINT f_r2; \
443 unsigned int length;
444 #define EXTRACT_IFMT_CMP_CODE \
445 length = 2; \
446 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
447 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
448 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
449 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
450
451 #define EXTRACT_IFMT_CMPI_VARS \
452 UINT f_op1; \
453 UINT f_r1; \
454 UINT f_op2; \
455 UINT f_r2; \
456 INT f_simm16; \
457 unsigned int length;
458 #define EXTRACT_IFMT_CMPI_CODE \
459 length = 4; \
460 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
461 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
462 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
463 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
464 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
465
466 #define EXTRACT_IFMT_DIV_VARS \
467 UINT f_op1; \
468 UINT f_r1; \
469 UINT f_op2; \
470 UINT f_r2; \
471 INT f_simm16; \
472 unsigned int length;
473 #define EXTRACT_IFMT_DIV_CODE \
474 length = 4; \
475 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
476 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
477 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
478 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
479 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
480
481 #define EXTRACT_IFMT_JL_VARS \
482 UINT f_op1; \
483 UINT f_r1; \
484 UINT f_op2; \
485 UINT f_r2; \
486 unsigned int length;
487 #define EXTRACT_IFMT_JL_CODE \
488 length = 2; \
489 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
490 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
491 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
492 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
493
494 #define EXTRACT_IFMT_LD24_VARS \
495 UINT f_op1; \
496 UINT f_r1; \
497 UINT f_uimm24; \
498 unsigned int length;
499 #define EXTRACT_IFMT_LD24_CODE \
500 length = 4; \
501 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
502 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
503 f_uimm24 = EXTRACT_MSB0_UINT (insn, 32, 8, 24); \
504
505 #define EXTRACT_IFMT_LDI16_VARS \
506 UINT f_op1; \
507 UINT f_r1; \
508 UINT f_op2; \
509 UINT f_r2; \
510 INT f_simm16; \
511 unsigned int length;
512 #define EXTRACT_IFMT_LDI16_CODE \
513 length = 4; \
514 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
515 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
516 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
517 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
518 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
519
520 #define EXTRACT_IFMT_MVFACHI_VARS \
521 UINT f_op1; \
522 UINT f_r1; \
523 UINT f_op2; \
524 UINT f_r2; \
525 unsigned int length;
526 #define EXTRACT_IFMT_MVFACHI_CODE \
527 length = 2; \
528 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
529 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
530 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
531 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
532
533 #define EXTRACT_IFMT_MVFC_VARS \
534 UINT f_op1; \
535 UINT f_r1; \
536 UINT f_op2; \
537 UINT f_r2; \
538 unsigned int length;
539 #define EXTRACT_IFMT_MVFC_CODE \
540 length = 2; \
541 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
542 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
543 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
544 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
545
546 #define EXTRACT_IFMT_MVTACHI_VARS \
547 UINT f_op1; \
548 UINT f_r1; \
549 UINT f_op2; \
550 UINT f_r2; \
551 unsigned int length;
552 #define EXTRACT_IFMT_MVTACHI_CODE \
553 length = 2; \
554 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
555 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
556 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
557 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
558
559 #define EXTRACT_IFMT_MVTC_VARS \
560 UINT f_op1; \
561 UINT f_r1; \
562 UINT f_op2; \
563 UINT f_r2; \
564 unsigned int length;
565 #define EXTRACT_IFMT_MVTC_CODE \
566 length = 2; \
567 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
568 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
569 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
570 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
571
572 #define EXTRACT_IFMT_NOP_VARS \
573 UINT f_op1; \
574 UINT f_r1; \
575 UINT f_op2; \
576 UINT f_r2; \
577 unsigned int length;
578 #define EXTRACT_IFMT_NOP_CODE \
579 length = 2; \
580 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
581 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
582 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
583 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
584
585 #define EXTRACT_IFMT_SETH_VARS \
586 UINT f_op1; \
587 UINT f_r1; \
588 UINT f_op2; \
589 UINT f_r2; \
590 UINT f_hi16; \
591 unsigned int length;
592 #define EXTRACT_IFMT_SETH_CODE \
593 length = 4; \
594 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
595 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
596 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
597 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
598 f_hi16 = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
599
600 #define EXTRACT_IFMT_SLLI_VARS \
601 UINT f_op1; \
602 UINT f_r1; \
603 UINT f_shift_op2; \
604 UINT f_uimm5; \
605 unsigned int length;
606 #define EXTRACT_IFMT_SLLI_CODE \
607 length = 2; \
608 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
609 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
610 f_shift_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 3); \
611 f_uimm5 = EXTRACT_MSB0_UINT (insn, 16, 11, 5); \
612
613 #define EXTRACT_IFMT_ST_D_VARS \
614 UINT f_op1; \
615 UINT f_r1; \
616 UINT f_op2; \
617 UINT f_r2; \
618 INT f_simm16; \
619 unsigned int length;
620 #define EXTRACT_IFMT_ST_D_CODE \
621 length = 4; \
622 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
623 f_r1 = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
624 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
625 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
626 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
627
628 #define EXTRACT_IFMT_TRAP_VARS \
629 UINT f_op1; \
630 UINT f_r1; \
631 UINT f_op2; \
632 UINT f_uimm4; \
633 unsigned int length;
634 #define EXTRACT_IFMT_TRAP_CODE \
635 length = 2; \
636 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
637 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
638 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
639 f_uimm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
640
641 #define EXTRACT_IFMT_CLRPSW_VARS \
642 UINT f_op1; \
643 UINT f_r1; \
644 UINT f_uimm8; \
645 unsigned int length;
646 #define EXTRACT_IFMT_CLRPSW_CODE \
647 length = 2; \
648 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
649 f_r1 = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
650 f_uimm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
651
652 #define EXTRACT_IFMT_BSET_VARS \
653 UINT f_op1; \
654 UINT f_bit4; \
655 UINT f_uimm3; \
656 UINT f_op2; \
657 UINT f_r2; \
658 INT f_simm16; \
659 unsigned int length;
660 #define EXTRACT_IFMT_BSET_CODE \
661 length = 4; \
662 f_op1 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
663 f_bit4 = EXTRACT_MSB0_UINT (insn, 32, 4, 1); \
664 f_uimm3 = EXTRACT_MSB0_UINT (insn, 32, 5, 3); \
665 f_op2 = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
666 f_r2 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
667 f_simm16 = EXTRACT_MSB0_INT (insn, 32, 16, 16); \
668
669 #define EXTRACT_IFMT_BTST_VARS \
670 UINT f_op1; \
671 UINT f_bit4; \
672 UINT f_uimm3; \
673 UINT f_op2; \
674 UINT f_r2; \
675 unsigned int length;
676 #define EXTRACT_IFMT_BTST_CODE \
677 length = 2; \
678 f_op1 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
679 f_bit4 = EXTRACT_MSB0_UINT (insn, 16, 4, 1); \
680 f_uimm3 = EXTRACT_MSB0_UINT (insn, 16, 5, 3); \
681 f_op2 = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
682 f_r2 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
683
684 /* Collection of various things for the trace handler to use. */
685
686 typedef struct trace_record {
687 IADDR pc;
688 /* FIXME:wip */
689 } TRACE_RECORD;
690
691 #endif /* CPU_M32RBF_H */
This page took 0.069507 seconds and 4 git commands to generate.