Update years in copyright notice for the GDB files.
[external/binutils.git] / sim / sh64 / defs-compact.h
1 /* ISA definitions header for compact.
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 DEFS_SH64_COMPACT_H
25 #define DEFS_SH64_COMPACT_H
26
27 /* Instruction argument buffer.  */
28
29 union sem_fields {
30   struct { /* no operands */
31     int empty;
32   } sfmt_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.  */
114 struct 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
135 struct 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_SINT (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_SINT (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_SINT (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_SINT (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_SINT (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_SINT (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 */