1/* ISA definitions header for compact.
2
3THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5Copyright 1996-2005 Free Software Foundation, Inc.
6
7This file is part of the GNU simulators.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 3 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
22*/
23
24#ifndef DEFS_SH64_COMPACT_H
25#define DEFS_SH64_COMPACT_H
26
27/* Instruction argument buffer.  */
28
29union sem_fields {
30  struct { /* no operands */
31    int empty;
32  } fmt_empty;
33  struct { /*  */
34    IADDR i_disp12;
35  } sfmt_bra_compact;
36  struct { /*  */
37    IADDR i_disp8;
38  } sfmt_bf_compact;
39  struct { /*  */
40    SI f_imm8x2;
41    UINT f_rn;
42  } sfmt_movw10_compact;
43  struct { /*  */
44    SI f_imm4x2;
45    UINT f_rm;
46  } sfmt_movw5_compact;
47  struct { /*  */
48    SI f_imm8x4;
49    UINT f_rn;
50  } sfmt_movl10_compact;
51  struct { /*  */
52    UINT f_imm4;
53    UINT f_rm;
54  } sfmt_movb5_compact;
55  struct { /*  */
56    INT f_imm20;
57    UINT f_rn;
58  } sfmt_movi20_compact;
59  struct { /*  */
60    SI f_vm;
61    SI f_vn;
62  } sfmt_fipr_compact;
63  struct { /*  */
64    UINT f_imm8;
65    UINT f_rn;
66  } sfmt_addi_compact;
67  struct { /*  */
68    SI f_imm12x4;
69    UINT f_rm;
70    UINT f_rn;
71  } sfmt_movl12_compact;
72  struct { /*  */
73    SI f_imm4x4;
74    UINT f_rm;
75    UINT f_rn;
76  } sfmt_movl5_compact;
77  struct { /*  */
78    SI f_dm;
79    SI f_imm12x8;
80    UINT f_rn;
81  } sfmt_fmov9_compact;
82  struct { /*  */
83    SI f_dn;
84    SI f_imm12x8;
85    UINT f_rm;
86  } sfmt_fmov8_compact;
87#if WITH_SCACHE_PBB
88  /* Writeback handler.  */
89  struct {
90    /* Pointer to argbuf entry for insn whose results need writing back.  */
91    const struct argbuf *abuf;
92  } write;
93  /* x-before handler */
94  struct {
95    /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
96    int first_p;
97  } before;
98  /* x-after handler */
99  struct {
100    int empty;
101  } after;
102  /* This entry is used to terminate each pbb.  */
103  struct {
104    /* Number of insns in pbb.  */
105    int insn_count;
106    /* Next pbb to execute.  */
107    SCACHE *next;
108    SCACHE *branch_target;
109  } chain;
110#endif
111};
112
113/* The ARGBUF struct.  */
114struct argbuf {
115  /* These are the baseclass definitions.  */
116  IADDR addr;
117  const IDESC *idesc;
118  char trace_p;
119  char profile_p;
120  /* ??? Temporary hack for skip insns.  */
121  char skip_count;
122  char unused;
123  /* cpu specific data follows */
124  union sem semantic;
125  int written;
126  union sem_fields fields;
127};
128
129/* A cached insn.
130
131   ??? SCACHE used to contain more than just argbuf.  We could delete the
132   type entirely and always just use ARGBUF, but for future concerns and as
133   a level of abstraction it is left in.  */
134
135struct scache {
136  struct argbuf argbuf;
137};
138
139/* Macros to simplify extraction, reading and semantic code.
140   These define and assign the local vars that contain the insn's fields.  */
141
142#define EXTRACT_IFMT_EMPTY_VARS \
143  unsigned int length;
144#define EXTRACT_IFMT_EMPTY_CODE \
145  length = 0; \
146
147#define EXTRACT_IFMT_ADD_COMPACT_VARS \
148  UINT f_op4; \
149  UINT f_rn; \
150  UINT f_rm; \
151  UINT f_sub4; \
152  unsigned int length;
153#define EXTRACT_IFMT_ADD_COMPACT_CODE \
154  length = 2; \
155  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
156  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
157  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
158  f_sub4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
159
160#define EXTRACT_IFMT_ADDI_COMPACT_VARS \
161  UINT f_op4; \
162  UINT f_rn; \
163  UINT f_imm8; \
164  unsigned int length;
165#define EXTRACT_IFMT_ADDI_COMPACT_CODE \
166  length = 2; \
167  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
168  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
169  f_imm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
170
171#define EXTRACT_IFMT_AND_COMPACT_VARS \
172  UINT f_op4; \
173  UINT f_rn; \
174  UINT f_rm; \
175  UINT f_sub4; \
176  unsigned int length;
177#define EXTRACT_IFMT_AND_COMPACT_CODE \
178  length = 2; \
179  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
180  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
181  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
182  f_sub4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
183
184#define EXTRACT_IFMT_ANDI_COMPACT_VARS \
185  UINT f_op8; \
186  UINT f_imm8; \
187  unsigned int length;
188#define EXTRACT_IFMT_ANDI_COMPACT_CODE \
189  length = 2; \
190  f_op8 = EXTRACT_MSB0_UINT (insn, 16, 0, 8); \
191  f_imm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
192
193#define EXTRACT_IFMT_ANDB_COMPACT_VARS \
194  UINT f_op8; \
195  UINT f_imm8; \
196  unsigned int length;
197#define EXTRACT_IFMT_ANDB_COMPACT_CODE \
198  length = 2; \
199  f_op8 = EXTRACT_MSB0_UINT (insn, 16, 0, 8); \
200  f_imm8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
201
202#define EXTRACT_IFMT_BF_COMPACT_VARS \
203  UINT f_op8; \
204  SI f_disp8; \
205  unsigned int length;
206#define EXTRACT_IFMT_BF_COMPACT_CODE \
207  length = 2; \
208  f_op8 = EXTRACT_MSB0_UINT (insn, 16, 0, 8); \
209  f_disp8 = ((((EXTRACT_MSB0_INT (insn, 16, 8, 8)) << (1))) + (((pc) + (4)))); \
210
211#define EXTRACT_IFMT_BRA_COMPACT_VARS \
212  UINT f_op4; \
213  SI f_disp12; \
214  unsigned int length;
215#define EXTRACT_IFMT_BRA_COMPACT_CODE \
216  length = 2; \
217  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
218  f_disp12 = ((((EXTRACT_MSB0_INT (insn, 16, 4, 12)) << (1))) + (((pc) + (4)))); \
219
220#define EXTRACT_IFMT_BRAF_COMPACT_VARS \
221  UINT f_op4; \
222  UINT f_rn; \
223  UINT f_sub8; \
224  unsigned int length;
225#define EXTRACT_IFMT_BRAF_COMPACT_CODE \
226  length = 2; \
227  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
228  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
229  f_sub8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
230
231#define EXTRACT_IFMT_BRK_COMPACT_VARS \
232  UINT f_op16; \
233  unsigned int length;
234#define EXTRACT_IFMT_BRK_COMPACT_CODE \
235  length = 2; \
236  f_op16 = EXTRACT_MSB0_UINT (insn, 16, 0, 16); \
237
238#define EXTRACT_IFMT_FABS_COMPACT_VARS \
239  UINT f_op4; \
240  UINT f_rn; \
241  UINT f_sub8; \
242  unsigned int length;
243#define EXTRACT_IFMT_FABS_COMPACT_CODE \
244  length = 2; \
245  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
246  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
247  f_sub8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
248
249#define EXTRACT_IFMT_FADD_COMPACT_VARS \
250  UINT f_op4; \
251  UINT f_rn; \
252  UINT f_rm; \
253  UINT f_sub4; \
254  unsigned int length;
255#define EXTRACT_IFMT_FADD_COMPACT_CODE \
256  length = 2; \
257  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
258  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
259  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
260  f_sub4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
261
262#define EXTRACT_IFMT_FCNVDS_COMPACT_VARS \
263  UINT f_op4; \
264  SI f_dn; \
265  UINT f_7_1; \
266  UINT f_sub8; \
267  unsigned int length;
268#define EXTRACT_IFMT_FCNVDS_COMPACT_CODE \
269  length = 2; \
270  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
271  f_dn = ((EXTRACT_MSB0_UINT (insn, 16, 4, 3)) << (1)); \
272  f_7_1 = EXTRACT_MSB0_UINT (insn, 16, 7, 1); \
273  f_sub8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
274
275#define EXTRACT_IFMT_FIPR_COMPACT_VARS \
276  UINT f_op4; \
277  SI f_vn; \
278  SI f_vm; \
279  UINT f_sub8; \
280  unsigned int length;
281#define EXTRACT_IFMT_FIPR_COMPACT_CODE \
282  length = 2; \
283  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
284  f_vn = ((EXTRACT_MSB0_UINT (insn, 16, 4, 2)) << (2)); \
285  f_vm = ((EXTRACT_MSB0_UINT (insn, 16, 6, 2)) << (2)); \
286  f_sub8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
287
288#define EXTRACT_IFMT_FLDS_COMPACT_VARS \
289  UINT f_op4; \
290  UINT f_rn; \
291  UINT f_sub8; \
292  unsigned int length;
293#define EXTRACT_IFMT_FLDS_COMPACT_CODE \
294  length = 2; \
295  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
296  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
297  f_sub8 = EXTRACT_MSB0_UINT (insn, 16, 8, 8); \
298
299#define EXTRACT_IFMT_FMAC_COMPACT_VARS \
300  UINT f_op4; \
301  UINT f_rn; \
302  UINT f_rm; \
303  UINT f_sub4; \
304  unsigned int length;
305#define EXTRACT_IFMT_FMAC_COMPACT_CODE \
306  length = 2; \
307  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
308  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
309  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
310  f_sub4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
311
312#define EXTRACT_IFMT_FMOV1_COMPACT_VARS \
313  UINT f_op4; \
314  UINT f_rn; \
315  UINT f_rm; \
316  UINT f_sub4; \
317  unsigned int length;
318#define EXTRACT_IFMT_FMOV1_COMPACT_CODE \
319  length = 2; \
320  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
321  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
322  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
323  f_sub4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
324
325#define EXTRACT_IFMT_FMOV2_COMPACT_VARS \
326  UINT f_op4; \
327  UINT f_rn; \
328  UINT f_rm; \
329  UINT f_sub4; \
330  unsigned int length;
331#define EXTRACT_IFMT_FMOV2_COMPACT_CODE \
332  length = 2; \
333  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
334  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
335  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
336  f_sub4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
337
338#define EXTRACT_IFMT_FMOV5_COMPACT_VARS \
339  UINT f_op4; \
340  UINT f_rn; \
341  UINT f_rm; \
342  UINT f_sub4; \
343  unsigned int length;
344#define EXTRACT_IFMT_FMOV5_COMPACT_CODE \
345  length = 2; \
346  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
347  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
348  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
349  f_sub4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
350
351#define EXTRACT_IFMT_FMOV8_COMPACT_VARS \
352  UINT f_op4; \
353  SI f_dn; \
354  UINT f_7_1; \
355  UINT f_rm; \
356  UINT f_sub4; \
357  UINT f_16_4; \
358  SI f_imm12x8; \
359  unsigned int length;
360#define EXTRACT_IFMT_FMOV8_COMPACT_CODE \
361  length = 4; \
362  f_op4 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
363  f_dn = ((EXTRACT_MSB0_UINT (insn, 32, 4, 3)) << (1)); \
364  f_7_1 = EXTRACT_MSB0_UINT (insn, 32, 7, 1); \
365  f_rm = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
366  f_sub4 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
367  f_16_4 = EXTRACT_MSB0_UINT (insn, 32, 16, 4); \
368  f_imm12x8 = ((EXTRACT_MSB0_INT (insn, 32, 20, 12)) << (3)); \
369
370#define EXTRACT_IFMT_FMOV9_COMPACT_VARS \
371  UINT f_op4; \
372  UINT f_rn; \
373  SI f_dm; \
374  UINT f_11_1; \
375  UINT f_sub4; \
376  UINT f_16_4; \
377  SI f_imm12x8; \
378  unsigned int length;
379#define EXTRACT_IFMT_FMOV9_COMPACT_CODE \
380  length = 4; \
381  f_op4 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
382  f_rn = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
383  f_dm = ((EXTRACT_MSB0_UINT (insn, 32, 8, 3)) << (1)); \
384  f_11_1 = EXTRACT_MSB0_UINT (insn, 32, 11, 1); \
385  f_sub4 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
386  f_16_4 = EXTRACT_MSB0_UINT (insn, 32, 16, 4); \
387  f_imm12x8 = ((EXTRACT_MSB0_INT (insn, 32, 20, 12)) << (3)); \
388
389#define EXTRACT_IFMT_FTRV_COMPACT_VARS \
390  UINT f_op4; \
391  SI f_vn; \
392  UINT f_sub10; \
393  unsigned int length;
394#define EXTRACT_IFMT_FTRV_COMPACT_CODE \
395  length = 2; \
396  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
397  f_vn = ((EXTRACT_MSB0_UINT (insn, 16, 4, 2)) << (2)); \
398  f_sub10 = EXTRACT_MSB0_UINT (insn, 16, 6, 10); \
399
400#define EXTRACT_IFMT_MOVI20_COMPACT_VARS \
401  UINT f_op4; \
402  UINT f_rn; \
403  INT f_imm20_hi; \
404  UINT f_imm20_lo; \
405  INT f_imm20; \
406  UINT f_sub4; \
407  unsigned int length;
408#define EXTRACT_IFMT_MOVI20_COMPACT_CODE \
409  length = 4; \
410  f_op4 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
411  f_rn = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
412  f_imm20_hi = EXTRACT_MSB0_INT (insn, 32, 8, 4); \
413  f_imm20_lo = EXTRACT_MSB0_UINT (insn, 32, 16, 16); \
414  f_imm20 = ((((f_imm20_hi) << (16))) | (f_imm20_lo));\
415  f_sub4 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
416
417#define EXTRACT_IFMT_MOVB5_COMPACT_VARS \
418  UINT f_op8; \
419  UINT f_rm; \
420  UINT f_imm4; \
421  unsigned int length;
422#define EXTRACT_IFMT_MOVB5_COMPACT_CODE \
423  length = 2; \
424  f_op8 = EXTRACT_MSB0_UINT (insn, 16, 0, 8); \
425  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
426  f_imm4 = EXTRACT_MSB0_UINT (insn, 16, 12, 4); \
427
428#define EXTRACT_IFMT_MOVL4_COMPACT_VARS \
429  UINT f_op8; \
430  SI f_imm8x4; \
431  unsigned int length;
432#define EXTRACT_IFMT_MOVL4_COMPACT_CODE \
433  length = 2; \
434  f_op8 = EXTRACT_MSB0_UINT (insn, 16, 0, 8); \
435  f_imm8x4 = ((EXTRACT_MSB0_UINT (insn, 16, 8, 8)) << (2)); \
436
437#define EXTRACT_IFMT_MOVL5_COMPACT_VARS \
438  UINT f_op4; \
439  UINT f_rn; \
440  UINT f_rm; \
441  SI f_imm4x4; \
442  unsigned int length;
443#define EXTRACT_IFMT_MOVL5_COMPACT_CODE \
444  length = 2; \
445  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
446  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
447  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
448  f_imm4x4 = ((EXTRACT_MSB0_UINT (insn, 16, 12, 4)) << (2)); \
449
450#define EXTRACT_IFMT_MOVL10_COMPACT_VARS \
451  UINT f_op4; \
452  UINT f_rn; \
453  SI f_imm8x4; \
454  unsigned int length;
455#define EXTRACT_IFMT_MOVL10_COMPACT_CODE \
456  length = 2; \
457  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
458  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
459  f_imm8x4 = ((EXTRACT_MSB0_UINT (insn, 16, 8, 8)) << (2)); \
460
461#define EXTRACT_IFMT_MOVL12_COMPACT_VARS \
462  UINT f_op4; \
463  UINT f_rn; \
464  UINT f_rm; \
465  UINT f_sub4; \
466  UINT f_16_4; \
467  SI f_imm12x4; \
468  unsigned int length;
469#define EXTRACT_IFMT_MOVL12_COMPACT_CODE \
470  length = 4; \
471  f_op4 = EXTRACT_MSB0_UINT (insn, 32, 0, 4); \
472  f_rn = EXTRACT_MSB0_UINT (insn, 32, 4, 4); \
473  f_rm = EXTRACT_MSB0_UINT (insn, 32, 8, 4); \
474  f_sub4 = EXTRACT_MSB0_UINT (insn, 32, 12, 4); \
475  f_16_4 = EXTRACT_MSB0_UINT (insn, 32, 16, 4); \
476  f_imm12x4 = ((EXTRACT_MSB0_INT (insn, 32, 20, 12)) << (2)); \
477
478#define EXTRACT_IFMT_MOVW4_COMPACT_VARS \
479  UINT f_op8; \
480  SI f_imm8x2; \
481  unsigned int length;
482#define EXTRACT_IFMT_MOVW4_COMPACT_CODE \
483  length = 2; \
484  f_op8 = EXTRACT_MSB0_UINT (insn, 16, 0, 8); \
485  f_imm8x2 = ((EXTRACT_MSB0_UINT (insn, 16, 8, 8)) << (1)); \
486
487#define EXTRACT_IFMT_MOVW5_COMPACT_VARS \
488  UINT f_op8; \
489  UINT f_rm; \
490  SI f_imm4x2; \
491  unsigned int length;
492#define EXTRACT_IFMT_MOVW5_COMPACT_CODE \
493  length = 2; \
494  f_op8 = EXTRACT_MSB0_UINT (insn, 16, 0, 8); \
495  f_rm = EXTRACT_MSB0_UINT (insn, 16, 8, 4); \
496  f_imm4x2 = ((EXTRACT_MSB0_UINT (insn, 16, 12, 4)) << (1)); \
497
498#define EXTRACT_IFMT_MOVW10_COMPACT_VARS \
499  UINT f_op4; \
500  UINT f_rn; \
501  SI f_imm8x2; \
502  unsigned int length;
503#define EXTRACT_IFMT_MOVW10_COMPACT_CODE \
504  length = 2; \
505  f_op4 = EXTRACT_MSB0_UINT (insn, 16, 0, 4); \
506  f_rn = EXTRACT_MSB0_UINT (insn, 16, 4, 4); \
507  f_imm8x2 = ((EXTRACT_MSB0_UINT (insn, 16, 8, 8)) << (1)); \
508
509#endif /* DEFS_SH64_COMPACT_H */
510