xref: /netbsd-src/external/gpl3/gdb.old/dist/sim/bpf/defs-be.h (revision 22ebeae4b2252475e0ebe332f69734639cb946ea)
1 /* ISA definitions header for ebpfbe.
2 
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4 
5 Copyright (C) 1996-2023 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, write to the Free Software Foundation, Inc.,
21    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
22 
23 */
24 
25 #ifndef DEFS_BPFBF_EBPFBE_H
26 #define DEFS_BPFBF_EBPFBE_H
27 
28 /* Instruction argument buffer.  */
29 
30 union sem_fields {
31   struct { /* no operands */
32     int empty;
33   } sfmt_empty;
34   struct { /*  */
35     INT f_imm32;
36     UINT f_srcbe;
37   } sfmt_ldindwbe;
38   struct { /*  */
39     DI f_imm64;
40     UINT f_dstbe;
41   } sfmt_lddwbe;
42   struct { /*  */
43     INT f_imm32;
44     UINT f_dstbe;
45     HI f_offset16;
46   } sfmt_stbbe;
47   struct { /*  */
48     UINT f_dstbe;
49     UINT f_srcbe;
50     HI f_offset16;
51   } sfmt_ldxwbe;
52 #if WITH_SCACHE_PBB
53   /* Writeback handler.  */
54   struct {
55     /* Pointer to argbuf entry for insn whose results need writing back.  */
56     const struct argbuf *abuf;
57   } write;
58   /* x-before handler */
59   struct {
60     /*const SCACHE *insns[MAX_PARALLEL_INSNS];*/
61     int first_p;
62   } before;
63   /* x-after handler */
64   struct {
65     int empty;
66   } after;
67   /* This entry is used to terminate each pbb.  */
68   struct {
69     /* Number of insns in pbb.  */
70     int insn_count;
71     /* Next pbb to execute.  */
72     SCACHE *next;
73     SCACHE *branch_target;
74   } chain;
75 #endif
76 };
77 
78 /* The ARGBUF struct.  */
79 struct argbuf {
80   /* These are the baseclass definitions.  */
81   IADDR addr;
82   const IDESC *idesc;
83   char trace_p;
84   char profile_p;
85   /* ??? Temporary hack for skip insns.  */
86   char skip_count;
87   char unused;
88   /* cpu specific data follows */
89   union sem semantic;
90   int written;
91   union sem_fields fields;
92 };
93 
94 /* A cached insn.
95 
96    ??? SCACHE used to contain more than just argbuf.  We could delete the
97    type entirely and always just use ARGBUF, but for future concerns and as
98    a level of abstraction it is left in.  */
99 
100 struct scache {
101   struct argbuf argbuf;
102 };
103 
104 /* Macros to simplify extraction, reading and semantic code.
105    These define and assign the local vars that contain the insn's fields.  */
106 
107 #define EXTRACT_IFMT_EMPTY_VARS \
108   unsigned int length;
109 #define EXTRACT_IFMT_EMPTY_CODE \
110   length = 0; \
111 
112 #define EXTRACT_IFMT_ADDIBE_VARS \
113   INT f_imm32; \
114   HI f_offset16; \
115   UINT f_dstbe; \
116   UINT f_op_code; \
117   UINT f_srcbe; \
118   UINT f_op_src; \
119   UINT f_op_class; \
120   unsigned int length;
121 #define EXTRACT_IFMT_ADDIBE_CODE \
122   length = 8; \
123   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
124   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
125   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
126   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
127   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
128   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
129   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
130 
131 #define EXTRACT_IFMT_ADDRBE_VARS \
132   INT f_imm32; \
133   HI f_offset16; \
134   UINT f_dstbe; \
135   UINT f_op_code; \
136   UINT f_srcbe; \
137   UINT f_op_src; \
138   UINT f_op_class; \
139   unsigned int length;
140 #define EXTRACT_IFMT_ADDRBE_CODE \
141   length = 8; \
142   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
143   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
144   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
145   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
146   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
147   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
148   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
149 
150 #define EXTRACT_IFMT_NEGBE_VARS \
151   INT f_imm32; \
152   HI f_offset16; \
153   UINT f_dstbe; \
154   UINT f_op_code; \
155   UINT f_srcbe; \
156   UINT f_op_src; \
157   UINT f_op_class; \
158   unsigned int length;
159 #define EXTRACT_IFMT_NEGBE_CODE \
160   length = 8; \
161   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
162   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
163   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
164   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
165   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
166   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
167   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
168 
169 #define EXTRACT_IFMT_ENDLEBE_VARS \
170   INT f_imm32; \
171   HI f_offset16; \
172   UINT f_dstbe; \
173   UINT f_op_code; \
174   UINT f_srcbe; \
175   UINT f_op_src; \
176   UINT f_op_class; \
177   unsigned int length;
178 #define EXTRACT_IFMT_ENDLEBE_CODE \
179   length = 8; \
180   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
181   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
182   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
183   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
184   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
185   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
186   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
187 
188 #define EXTRACT_IFMT_LDDWBE_VARS \
189   UINT f_imm64_a; \
190   UINT f_imm64_b; \
191   UINT f_imm64_c; \
192   DI f_imm64; \
193   HI f_offset16; \
194   UINT f_dstbe; \
195   UINT f_op_mode; \
196   UINT f_op_size; \
197   UINT f_srcbe; \
198   UINT f_op_class; \
199   /* Contents of trailing part of insn.  */ \
200   UINT word_1; \
201   UINT word_2; \
202   unsigned int length;
203 #define EXTRACT_IFMT_LDDWBE_CODE \
204   length = 16; \
205   word_1 = GETIMEMUSI (current_cpu, pc + 8); \
206   word_2 = GETIMEMUSI (current_cpu, pc + 12); \
207   f_imm64_a = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
208   f_imm64_b = (0|(EXTRACT_LSB0_UINT (word_1, 32, 31, 32) << 0)); \
209   f_imm64_c = (0|(EXTRACT_LSB0_UINT (word_2, 32, 31, 32) << 0)); \
210 {\
211   f_imm64 = ((((((UDI) (UINT) (f_imm64_c))) << (32))) | (((UDI) (UINT) (f_imm64_a))));\
212 }\
213   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
214   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
215   f_op_mode = EXTRACT_LSB0_LGUINT (insn, 64, 7, 3); \
216   f_op_size = EXTRACT_LSB0_LGUINT (insn, 64, 4, 2); \
217   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
218   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
219 
220 #define EXTRACT_IFMT_LDABSW_VARS \
221   INT f_imm32; \
222   HI f_offset16; \
223   UINT f_regs; \
224   UINT f_op_mode; \
225   UINT f_op_size; \
226   UINT f_op_class; \
227   unsigned int length;
228 #define EXTRACT_IFMT_LDABSW_CODE \
229   length = 8; \
230   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
231   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
232   f_regs = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 8) << 0)); \
233   f_op_mode = EXTRACT_LSB0_LGUINT (insn, 64, 7, 3); \
234   f_op_size = EXTRACT_LSB0_LGUINT (insn, 64, 4, 2); \
235   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
236 
237 #define EXTRACT_IFMT_LDINDWBE_VARS \
238   INT f_imm32; \
239   HI f_offset16; \
240   UINT f_dstbe; \
241   UINT f_op_mode; \
242   UINT f_op_size; \
243   UINT f_srcbe; \
244   UINT f_op_class; \
245   unsigned int length;
246 #define EXTRACT_IFMT_LDINDWBE_CODE \
247   length = 8; \
248   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
249   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
250   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
251   f_op_mode = EXTRACT_LSB0_LGUINT (insn, 64, 7, 3); \
252   f_op_size = EXTRACT_LSB0_LGUINT (insn, 64, 4, 2); \
253   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
254   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
255 
256 #define EXTRACT_IFMT_LDXWBE_VARS \
257   INT f_imm32; \
258   HI f_offset16; \
259   UINT f_dstbe; \
260   UINT f_op_mode; \
261   UINT f_op_size; \
262   UINT f_srcbe; \
263   UINT f_op_class; \
264   unsigned int length;
265 #define EXTRACT_IFMT_LDXWBE_CODE \
266   length = 8; \
267   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
268   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
269   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
270   f_op_mode = EXTRACT_LSB0_LGUINT (insn, 64, 7, 3); \
271   f_op_size = EXTRACT_LSB0_LGUINT (insn, 64, 4, 2); \
272   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
273   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
274 
275 #define EXTRACT_IFMT_STBBE_VARS \
276   INT f_imm32; \
277   HI f_offset16; \
278   UINT f_dstbe; \
279   UINT f_op_mode; \
280   UINT f_op_size; \
281   UINT f_srcbe; \
282   UINT f_op_class; \
283   unsigned int length;
284 #define EXTRACT_IFMT_STBBE_CODE \
285   length = 8; \
286   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
287   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
288   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
289   f_op_mode = EXTRACT_LSB0_LGUINT (insn, 64, 7, 3); \
290   f_op_size = EXTRACT_LSB0_LGUINT (insn, 64, 4, 2); \
291   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
292   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
293 
294 #define EXTRACT_IFMT_JEQIBE_VARS \
295   INT f_imm32; \
296   HI f_offset16; \
297   UINT f_dstbe; \
298   UINT f_op_code; \
299   UINT f_srcbe; \
300   UINT f_op_src; \
301   UINT f_op_class; \
302   unsigned int length;
303 #define EXTRACT_IFMT_JEQIBE_CODE \
304   length = 8; \
305   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
306   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
307   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
308   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
309   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
310   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
311   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
312 
313 #define EXTRACT_IFMT_JEQRBE_VARS \
314   INT f_imm32; \
315   HI f_offset16; \
316   UINT f_dstbe; \
317   UINT f_op_code; \
318   UINT f_srcbe; \
319   UINT f_op_src; \
320   UINT f_op_class; \
321   unsigned int length;
322 #define EXTRACT_IFMT_JEQRBE_CODE \
323   length = 8; \
324   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
325   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
326   f_dstbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 4) << 0)); \
327   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
328   f_srcbe = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 11, 4) << 0)); \
329   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
330   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
331 
332 #define EXTRACT_IFMT_CALLBE_VARS \
333   INT f_imm32; \
334   HI f_offset16; \
335   UINT f_regs; \
336   UINT f_op_code; \
337   UINT f_op_src; \
338   UINT f_op_class; \
339   unsigned int length;
340 #define EXTRACT_IFMT_CALLBE_CODE \
341   length = 8; \
342   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
343   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
344   f_regs = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 8) << 0)); \
345   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
346   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
347   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
348 
349 #define EXTRACT_IFMT_JA_VARS \
350   INT f_imm32; \
351   HI f_offset16; \
352   UINT f_regs; \
353   UINT f_op_code; \
354   UINT f_op_src; \
355   UINT f_op_class; \
356   unsigned int length;
357 #define EXTRACT_IFMT_JA_CODE \
358   length = 8; \
359   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
360   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
361   f_regs = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 8) << 0)); \
362   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
363   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
364   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
365 
366 #define EXTRACT_IFMT_EXIT_VARS \
367   INT f_imm32; \
368   HI f_offset16; \
369   UINT f_regs; \
370   UINT f_op_code; \
371   UINT f_op_src; \
372   UINT f_op_class; \
373   unsigned int length;
374 #define EXTRACT_IFMT_EXIT_CODE \
375   length = 8; \
376   f_imm32 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 63, 32) << 0)); \
377   f_offset16 = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 31, 16) << 0)); \
378   f_regs = (0|(EXTRACT_LSB0_LGUINT (insn, 64, 15, 8) << 0)); \
379   f_op_code = EXTRACT_LSB0_LGUINT (insn, 64, 7, 4); \
380   f_op_src = EXTRACT_LSB0_LGUINT (insn, 64, 3, 1); \
381   f_op_class = EXTRACT_LSB0_LGUINT (insn, 64, 2, 3); \
382 
383 #endif /* DEFS_BPFBF_EBPFBE_H */
384