]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/iq2000/cpu.h
Update years in copyright notice for the GDB files.
[thirdparty/binutils-gdb.git] / sim / iq2000 / cpu.h
1 /* CPU family header for iq2000bf.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996-2013 Free Software Foundation, Inc.
6
7 This file is part of the GNU simulators.
8
9 This file 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 3, or (at your option)
12 any later version.
13
14 It is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 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, see <http://www.gnu.org/licenses/>.
21
22 */
23
24 #ifndef CPU_IQ2000BF_H
25 #define CPU_IQ2000BF_H
26
27 /* Maximum number of instructions that are fetched at a time.
28 This is for LIW type instructions sets (e.g. m32r). */
29 #define MAX_LIW_INSNS 1
30
31 /* Maximum number of instructions that can be executed in parallel. */
32 #define MAX_PARALLEL_INSNS 1
33
34 /* The size of an "int" needed to hold an instruction word.
35 This is usually 32 bits, but some architectures needs 64 bits. */
36 typedef CGEN_INSN_INT CGEN_INSN_WORD;
37
38 #include "cgen-engine.h"
39
40 /* CPU state information. */
41 typedef struct {
42 /* Hardware elements. */
43 struct {
44 /* program counter */
45 USI h_pc;
46 #define GET_H_PC() get_h_pc (current_cpu)
47 #define SET_H_PC(x) \
48 do { \
49 set_h_pc (current_cpu, (x));\
50 ;} while (0)
51 /* General purpose registers */
52 SI h_gr[32];
53 #define GET_H_GR(index) (((index) == (0))) ? (0) : (CPU (h_gr[index]))
54 #define SET_H_GR(index, x) \
55 do { \
56 if ((((index)) == (0))) {\
57 ((void) 0); /*nop*/\
58 }\
59 else {\
60 CPU (h_gr[(index)]) = (x);\
61 }\
62 ;} while (0)
63 } hardware;
64 #define CPU_CGEN_HW(cpu) (& (cpu)->cpu_data.hardware)
65 } IQ2000BF_CPU_DATA;
66
67 /* Cover fns for register access. */
68 USI iq2000bf_h_pc_get (SIM_CPU *);
69 void iq2000bf_h_pc_set (SIM_CPU *, USI);
70 SI iq2000bf_h_gr_get (SIM_CPU *, UINT);
71 void iq2000bf_h_gr_set (SIM_CPU *, UINT, SI);
72
73 /* These must be hand-written. */
74 extern CPUREG_FETCH_FN iq2000bf_fetch_register;
75 extern CPUREG_STORE_FN iq2000bf_store_register;
76
77 typedef struct {
78 int empty;
79 } MODEL_IQ2000_DATA;
80
81 /* Instruction argument buffer. */
82
83 union sem_fields {
84 struct { /* no operands */
85 int empty;
86 } sfmt_empty;
87 struct { /* */
88 IADDR i_jmptarg;
89 } sfmt_j;
90 struct { /* */
91 IADDR i_offset;
92 UINT f_rs;
93 UINT f_rt;
94 } sfmt_bbi;
95 struct { /* */
96 UINT f_imm;
97 UINT f_rs;
98 UINT f_rt;
99 } sfmt_addi;
100 struct { /* */
101 UINT f_mask;
102 UINT f_rd;
103 UINT f_rs;
104 UINT f_rt;
105 } sfmt_mrgb;
106 struct { /* */
107 UINT f_maskl;
108 UINT f_rd;
109 UINT f_rs;
110 UINT f_rt;
111 UINT f_shamt;
112 } sfmt_ram;
113 #if WITH_SCACHE_PBB
114 /* Writeback handler. */
115 struct {
116 /* Pointer to argbuf entry for insn whose results need writing back. */
117 const struct argbuf *abuf;
118 } write;
119 /* x-before handler */
120 struct {
121 /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
122 int first_p;
123 } before;
124 /* x-after handler */
125 struct {
126 int empty;
127 } after;
128 /* This entry is used to terminate each pbb. */
129 struct {
130 /* Number of insns in pbb. */
131 int insn_count;
132 /* Next pbb to execute. */
133 SCACHE *next;
134 SCACHE *branch_target;
135 } chain;
136 #endif
137 };
138
139 /* The ARGBUF struct. */
140 struct argbuf {
141 /* These are the baseclass definitions. */
142 IADDR addr;
143 const IDESC *idesc;
144 char trace_p;
145 char profile_p;
146 /* ??? Temporary hack for skip insns. */
147 char skip_count;
148 char unused;
149 /* cpu specific data follows */
150 union sem semantic;
151 int written;
152 union sem_fields fields;
153 };
154
155 /* A cached insn.
156
157 ??? SCACHE used to contain more than just argbuf. We could delete the
158 type entirely and always just use ARGBUF, but for future concerns and as
159 a level of abstraction it is left in. */
160
161 struct scache {
162 struct argbuf argbuf;
163 };
164
165 /* Macros to simplify extraction, reading and semantic code.
166 These define and assign the local vars that contain the insn's fields. */
167
168 #define EXTRACT_IFMT_EMPTY_VARS \
169 unsigned int length;
170 #define EXTRACT_IFMT_EMPTY_CODE \
171 length = 0; \
172
173 #define EXTRACT_IFMT_ADD_VARS \
174 UINT f_opcode; \
175 UINT f_rs; \
176 UINT f_rt; \
177 UINT f_rd; \
178 UINT f_shamt; \
179 UINT f_func; \
180 unsigned int length;
181 #define EXTRACT_IFMT_ADD_CODE \
182 length = 4; \
183 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
184 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
185 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
186 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
187 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
188 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
189
190 #define EXTRACT_IFMT_ADDI_VARS \
191 UINT f_opcode; \
192 UINT f_rs; \
193 UINT f_rt; \
194 UINT f_imm; \
195 unsigned int length;
196 #define EXTRACT_IFMT_ADDI_CODE \
197 length = 4; \
198 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
199 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
200 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
201 f_imm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
202
203 #define EXTRACT_IFMT_RAM_VARS \
204 UINT f_opcode; \
205 UINT f_rs; \
206 UINT f_rt; \
207 UINT f_rd; \
208 UINT f_shamt; \
209 UINT f_5; \
210 UINT f_maskl; \
211 unsigned int length;
212 #define EXTRACT_IFMT_RAM_CODE \
213 length = 4; \
214 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
215 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
216 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
217 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
218 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
219 f_5 = EXTRACT_LSB0_UINT (insn, 32, 5, 1); \
220 f_maskl = EXTRACT_LSB0_UINT (insn, 32, 4, 5); \
221
222 #define EXTRACT_IFMT_SLL_VARS \
223 UINT f_opcode; \
224 UINT f_rs; \
225 UINT f_rt; \
226 UINT f_rd; \
227 UINT f_shamt; \
228 UINT f_func; \
229 unsigned int length;
230 #define EXTRACT_IFMT_SLL_CODE \
231 length = 4; \
232 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
233 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
234 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
235 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
236 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
237 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
238
239 #define EXTRACT_IFMT_SLMV_VARS \
240 UINT f_opcode; \
241 UINT f_rs; \
242 UINT f_rt; \
243 UINT f_rd; \
244 UINT f_shamt; \
245 UINT f_func; \
246 unsigned int length;
247 #define EXTRACT_IFMT_SLMV_CODE \
248 length = 4; \
249 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
250 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
251 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
252 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
253 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
254 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
255
256 #define EXTRACT_IFMT_SLTI_VARS \
257 UINT f_opcode; \
258 UINT f_rs; \
259 UINT f_rt; \
260 UINT f_imm; \
261 unsigned int length;
262 #define EXTRACT_IFMT_SLTI_CODE \
263 length = 4; \
264 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
265 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
266 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
267 f_imm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
268
269 #define EXTRACT_IFMT_BBI_VARS \
270 UINT f_opcode; \
271 UINT f_rs; \
272 UINT f_rt; \
273 SI f_offset; \
274 unsigned int length;
275 #define EXTRACT_IFMT_BBI_CODE \
276 length = 4; \
277 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
278 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
279 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
280 f_offset = ((((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) << (2))) + (((pc) + (4)))); \
281
282 #define EXTRACT_IFMT_BBV_VARS \
283 UINT f_opcode; \
284 UINT f_rs; \
285 UINT f_rt; \
286 SI f_offset; \
287 unsigned int length;
288 #define EXTRACT_IFMT_BBV_CODE \
289 length = 4; \
290 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
291 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
292 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
293 f_offset = ((((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) << (2))) + (((pc) + (4)))); \
294
295 #define EXTRACT_IFMT_BGEZ_VARS \
296 UINT f_opcode; \
297 UINT f_rs; \
298 UINT f_rt; \
299 SI f_offset; \
300 unsigned int length;
301 #define EXTRACT_IFMT_BGEZ_CODE \
302 length = 4; \
303 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
304 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
305 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
306 f_offset = ((((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) << (2))) + (((pc) + (4)))); \
307
308 #define EXTRACT_IFMT_JALR_VARS \
309 UINT f_opcode; \
310 UINT f_rs; \
311 UINT f_rt; \
312 UINT f_rd; \
313 UINT f_shamt; \
314 UINT f_func; \
315 unsigned int length;
316 #define EXTRACT_IFMT_JALR_CODE \
317 length = 4; \
318 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
319 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
320 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
321 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
322 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
323 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
324
325 #define EXTRACT_IFMT_JR_VARS \
326 UINT f_opcode; \
327 UINT f_rs; \
328 UINT f_rt; \
329 UINT f_rd; \
330 UINT f_shamt; \
331 UINT f_func; \
332 unsigned int length;
333 #define EXTRACT_IFMT_JR_CODE \
334 length = 4; \
335 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
336 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
337 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
338 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
339 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
340 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
341
342 #define EXTRACT_IFMT_LB_VARS \
343 UINT f_opcode; \
344 UINT f_rs; \
345 UINT f_rt; \
346 UINT f_imm; \
347 unsigned int length;
348 #define EXTRACT_IFMT_LB_CODE \
349 length = 4; \
350 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
351 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
352 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
353 f_imm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
354
355 #define EXTRACT_IFMT_LUI_VARS \
356 UINT f_opcode; \
357 UINT f_rs; \
358 UINT f_rt; \
359 UINT f_imm; \
360 unsigned int length;
361 #define EXTRACT_IFMT_LUI_CODE \
362 length = 4; \
363 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
364 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
365 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
366 f_imm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
367
368 #define EXTRACT_IFMT_BREAK_VARS \
369 UINT f_opcode; \
370 UINT f_rs; \
371 UINT f_rt; \
372 UINT f_rd; \
373 UINT f_shamt; \
374 UINT f_func; \
375 unsigned int length;
376 #define EXTRACT_IFMT_BREAK_CODE \
377 length = 4; \
378 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
379 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
380 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
381 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
382 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
383 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
384
385 #define EXTRACT_IFMT_SYSCALL_VARS \
386 UINT f_opcode; \
387 UINT f_excode; \
388 UINT f_func; \
389 unsigned int length;
390 #define EXTRACT_IFMT_SYSCALL_CODE \
391 length = 4; \
392 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
393 f_excode = EXTRACT_LSB0_UINT (insn, 32, 25, 20); \
394 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
395
396 #define EXTRACT_IFMT_ANDOUI_VARS \
397 UINT f_opcode; \
398 UINT f_rs; \
399 UINT f_rt; \
400 UINT f_imm; \
401 unsigned int length;
402 #define EXTRACT_IFMT_ANDOUI_CODE \
403 length = 4; \
404 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
405 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
406 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
407 f_imm = EXTRACT_LSB0_UINT (insn, 32, 15, 16); \
408
409 #define EXTRACT_IFMT_MRGB_VARS \
410 UINT f_opcode; \
411 UINT f_rs; \
412 UINT f_rt; \
413 UINT f_rd; \
414 UINT f_10; \
415 UINT f_mask; \
416 UINT f_func; \
417 unsigned int length;
418 #define EXTRACT_IFMT_MRGB_CODE \
419 length = 4; \
420 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
421 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
422 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
423 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
424 f_10 = EXTRACT_LSB0_UINT (insn, 32, 10, 1); \
425 f_mask = EXTRACT_LSB0_UINT (insn, 32, 9, 4); \
426 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
427
428 #define EXTRACT_IFMT_BC0F_VARS \
429 UINT f_opcode; \
430 UINT f_rs; \
431 UINT f_rt; \
432 SI f_offset; \
433 unsigned int length;
434 #define EXTRACT_IFMT_BC0F_CODE \
435 length = 4; \
436 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
437 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
438 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
439 f_offset = ((((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) << (2))) + (((pc) + (4)))); \
440
441 #define EXTRACT_IFMT_CFC0_VARS \
442 UINT f_opcode; \
443 UINT f_rs; \
444 UINT f_rt; \
445 UINT f_rd; \
446 UINT f_10_11; \
447 unsigned int length;
448 #define EXTRACT_IFMT_CFC0_CODE \
449 length = 4; \
450 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
451 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
452 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
453 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
454 f_10_11 = EXTRACT_LSB0_UINT (insn, 32, 10, 11); \
455
456 #define EXTRACT_IFMT_CHKHDR_VARS \
457 UINT f_opcode; \
458 UINT f_rs; \
459 UINT f_rt; \
460 UINT f_rd; \
461 UINT f_shamt; \
462 UINT f_func; \
463 unsigned int length;
464 #define EXTRACT_IFMT_CHKHDR_CODE \
465 length = 4; \
466 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
467 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
468 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
469 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
470 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
471 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
472
473 #define EXTRACT_IFMT_LULCK_VARS \
474 UINT f_opcode; \
475 UINT f_rs; \
476 UINT f_rt; \
477 UINT f_rd; \
478 UINT f_shamt; \
479 UINT f_func; \
480 unsigned int length;
481 #define EXTRACT_IFMT_LULCK_CODE \
482 length = 4; \
483 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
484 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
485 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
486 f_rd = EXTRACT_LSB0_UINT (insn, 32, 15, 5); \
487 f_shamt = EXTRACT_LSB0_UINT (insn, 32, 10, 5); \
488 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
489
490 #define EXTRACT_IFMT_PKRLR1_VARS \
491 UINT f_opcode; \
492 UINT f_rs; \
493 UINT f_rt; \
494 UINT f_count; \
495 UINT f_index; \
496 unsigned int length;
497 #define EXTRACT_IFMT_PKRLR1_CODE \
498 length = 4; \
499 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
500 f_rs = EXTRACT_LSB0_UINT (insn, 32, 25, 5); \
501 f_rt = EXTRACT_LSB0_UINT (insn, 32, 20, 5); \
502 f_count = EXTRACT_LSB0_UINT (insn, 32, 15, 7); \
503 f_index = EXTRACT_LSB0_UINT (insn, 32, 8, 9); \
504
505 #define EXTRACT_IFMT_RFE_VARS \
506 UINT f_opcode; \
507 UINT f_25; \
508 UINT f_24_19; \
509 UINT f_func; \
510 unsigned int length;
511 #define EXTRACT_IFMT_RFE_CODE \
512 length = 4; \
513 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
514 f_25 = EXTRACT_LSB0_UINT (insn, 32, 25, 1); \
515 f_24_19 = EXTRACT_LSB0_UINT (insn, 32, 24, 19); \
516 f_func = EXTRACT_LSB0_UINT (insn, 32, 5, 6); \
517
518 #define EXTRACT_IFMT_J_VARS \
519 UINT f_opcode; \
520 UINT f_rsrvd; \
521 USI f_jtarg; \
522 unsigned int length;
523 #define EXTRACT_IFMT_J_CODE \
524 length = 4; \
525 f_opcode = EXTRACT_LSB0_UINT (insn, 32, 31, 6); \
526 f_rsrvd = EXTRACT_LSB0_UINT (insn, 32, 25, 10); \
527 f_jtarg = ((((pc) & (0xf0000000))) | (((EXTRACT_LSB0_UINT (insn, 32, 15, 16)) << (2)))); \
528
529 /* Collection of various things for the trace handler to use. */
530
531 typedef struct trace_record {
532 IADDR pc;
533 /* FIXME:wip */
534 } TRACE_RECORD;
535
536 #endif /* CPU_IQ2000BF_H */