xref: /netbsd-src/external/gpl3/gdb.old/dist/sim/lm32/decode.c (revision 8b657b0747480f8989760d71343d6dd33f8d4cf9)
1a5a4af3bSchristos /* Simulator instruction decoder for lm32bf.
2a5a4af3bSchristos 
3a5a4af3bSchristos THIS FILE IS MACHINE GENERATED WITH CGEN.
4a5a4af3bSchristos 
5*8b657b07Schristos Copyright 1996-2023 Free Software Foundation, Inc.
6a5a4af3bSchristos 
7a5a4af3bSchristos This file is part of the GNU simulators.
8a5a4af3bSchristos 
9a5a4af3bSchristos    This file is free software; you can redistribute it and/or modify
10a5a4af3bSchristos    it under the terms of the GNU General Public License as published by
11a5a4af3bSchristos    the Free Software Foundation; either version 3, or (at your option)
12a5a4af3bSchristos    any later version.
13a5a4af3bSchristos 
14a5a4af3bSchristos    It is distributed in the hope that it will be useful, but WITHOUT
15a5a4af3bSchristos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16a5a4af3bSchristos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17a5a4af3bSchristos    License for more details.
18a5a4af3bSchristos 
19a5a4af3bSchristos    You should have received a copy of the GNU General Public License along
20a5a4af3bSchristos    with this program; if not, see <http://www.gnu.org/licenses/>.
21a5a4af3bSchristos 
22a5a4af3bSchristos */
23a5a4af3bSchristos 
24a5a4af3bSchristos #define WANT_CPU lm32bf
25a5a4af3bSchristos #define WANT_CPU_LM32BF
26a5a4af3bSchristos 
27a5a4af3bSchristos #include "sim-main.h"
28a5a4af3bSchristos #include "sim-assert.h"
29a5a4af3bSchristos 
30a5a4af3bSchristos /* The instruction descriptor array.
31a5a4af3bSchristos    This is computed at runtime.  Space for it is not malloc'd to save a
32a5a4af3bSchristos    teensy bit of cpu in the decoder.  Moving it to malloc space is trivial
33a5a4af3bSchristos    but won't be done until necessary (we don't currently support the runtime
34a5a4af3bSchristos    addition of instructions nor an SMP machine with different cpus).  */
35a5a4af3bSchristos static IDESC lm32bf_insn_data[LM32BF_INSN__MAX];
36a5a4af3bSchristos 
37a5a4af3bSchristos /* Commas between elements are contained in the macros.
38a5a4af3bSchristos    Some of these are conditionally compiled out.  */
39a5a4af3bSchristos 
40a5a4af3bSchristos static const struct insn_sem lm32bf_insn_sem[] =
41a5a4af3bSchristos {
42a5a4af3bSchristos   { VIRTUAL_INSN_X_INVALID, LM32BF_INSN_X_INVALID, LM32BF_SFMT_EMPTY },
43a5a4af3bSchristos   { VIRTUAL_INSN_X_AFTER, LM32BF_INSN_X_AFTER, LM32BF_SFMT_EMPTY },
44a5a4af3bSchristos   { VIRTUAL_INSN_X_BEFORE, LM32BF_INSN_X_BEFORE, LM32BF_SFMT_EMPTY },
45a5a4af3bSchristos   { VIRTUAL_INSN_X_CTI_CHAIN, LM32BF_INSN_X_CTI_CHAIN, LM32BF_SFMT_EMPTY },
46a5a4af3bSchristos   { VIRTUAL_INSN_X_CHAIN, LM32BF_INSN_X_CHAIN, LM32BF_SFMT_EMPTY },
47a5a4af3bSchristos   { VIRTUAL_INSN_X_BEGIN, LM32BF_INSN_X_BEGIN, LM32BF_SFMT_EMPTY },
48a5a4af3bSchristos   { LM32_INSN_ADD, LM32BF_INSN_ADD, LM32BF_SFMT_ADD },
49a5a4af3bSchristos   { LM32_INSN_ADDI, LM32BF_INSN_ADDI, LM32BF_SFMT_ADDI },
50a5a4af3bSchristos   { LM32_INSN_AND, LM32BF_INSN_AND, LM32BF_SFMT_ADD },
51a5a4af3bSchristos   { LM32_INSN_ANDI, LM32BF_INSN_ANDI, LM32BF_SFMT_ANDI },
52a5a4af3bSchristos   { LM32_INSN_ANDHII, LM32BF_INSN_ANDHII, LM32BF_SFMT_ANDHII },
53a5a4af3bSchristos   { LM32_INSN_B, LM32BF_INSN_B, LM32BF_SFMT_B },
54a5a4af3bSchristos   { LM32_INSN_BI, LM32BF_INSN_BI, LM32BF_SFMT_BI },
55a5a4af3bSchristos   { LM32_INSN_BE, LM32BF_INSN_BE, LM32BF_SFMT_BE },
56a5a4af3bSchristos   { LM32_INSN_BG, LM32BF_INSN_BG, LM32BF_SFMT_BE },
57a5a4af3bSchristos   { LM32_INSN_BGE, LM32BF_INSN_BGE, LM32BF_SFMT_BE },
58a5a4af3bSchristos   { LM32_INSN_BGEU, LM32BF_INSN_BGEU, LM32BF_SFMT_BE },
59a5a4af3bSchristos   { LM32_INSN_BGU, LM32BF_INSN_BGU, LM32BF_SFMT_BE },
60a5a4af3bSchristos   { LM32_INSN_BNE, LM32BF_INSN_BNE, LM32BF_SFMT_BE },
61a5a4af3bSchristos   { LM32_INSN_CALL, LM32BF_INSN_CALL, LM32BF_SFMT_CALL },
62a5a4af3bSchristos   { LM32_INSN_CALLI, LM32BF_INSN_CALLI, LM32BF_SFMT_CALLI },
63a5a4af3bSchristos   { LM32_INSN_CMPE, LM32BF_INSN_CMPE, LM32BF_SFMT_ADD },
64a5a4af3bSchristos   { LM32_INSN_CMPEI, LM32BF_INSN_CMPEI, LM32BF_SFMT_ADDI },
65a5a4af3bSchristos   { LM32_INSN_CMPG, LM32BF_INSN_CMPG, LM32BF_SFMT_ADD },
66a5a4af3bSchristos   { LM32_INSN_CMPGI, LM32BF_INSN_CMPGI, LM32BF_SFMT_ADDI },
67a5a4af3bSchristos   { LM32_INSN_CMPGE, LM32BF_INSN_CMPGE, LM32BF_SFMT_ADD },
68a5a4af3bSchristos   { LM32_INSN_CMPGEI, LM32BF_INSN_CMPGEI, LM32BF_SFMT_ADDI },
69a5a4af3bSchristos   { LM32_INSN_CMPGEU, LM32BF_INSN_CMPGEU, LM32BF_SFMT_ADD },
70a5a4af3bSchristos   { LM32_INSN_CMPGEUI, LM32BF_INSN_CMPGEUI, LM32BF_SFMT_ANDI },
71a5a4af3bSchristos   { LM32_INSN_CMPGU, LM32BF_INSN_CMPGU, LM32BF_SFMT_ADD },
72a5a4af3bSchristos   { LM32_INSN_CMPGUI, LM32BF_INSN_CMPGUI, LM32BF_SFMT_ANDI },
73a5a4af3bSchristos   { LM32_INSN_CMPNE, LM32BF_INSN_CMPNE, LM32BF_SFMT_ADD },
74a5a4af3bSchristos   { LM32_INSN_CMPNEI, LM32BF_INSN_CMPNEI, LM32BF_SFMT_ADDI },
75a5a4af3bSchristos   { LM32_INSN_DIVU, LM32BF_INSN_DIVU, LM32BF_SFMT_DIVU },
76a5a4af3bSchristos   { LM32_INSN_LB, LM32BF_INSN_LB, LM32BF_SFMT_LB },
77a5a4af3bSchristos   { LM32_INSN_LBU, LM32BF_INSN_LBU, LM32BF_SFMT_LB },
78a5a4af3bSchristos   { LM32_INSN_LH, LM32BF_INSN_LH, LM32BF_SFMT_LH },
79a5a4af3bSchristos   { LM32_INSN_LHU, LM32BF_INSN_LHU, LM32BF_SFMT_LH },
80a5a4af3bSchristos   { LM32_INSN_LW, LM32BF_INSN_LW, LM32BF_SFMT_LW },
81a5a4af3bSchristos   { LM32_INSN_MODU, LM32BF_INSN_MODU, LM32BF_SFMT_DIVU },
82a5a4af3bSchristos   { LM32_INSN_MUL, LM32BF_INSN_MUL, LM32BF_SFMT_ADD },
83a5a4af3bSchristos   { LM32_INSN_MULI, LM32BF_INSN_MULI, LM32BF_SFMT_ADDI },
84a5a4af3bSchristos   { LM32_INSN_NOR, LM32BF_INSN_NOR, LM32BF_SFMT_ADD },
85a5a4af3bSchristos   { LM32_INSN_NORI, LM32BF_INSN_NORI, LM32BF_SFMT_ANDI },
86a5a4af3bSchristos   { LM32_INSN_OR, LM32BF_INSN_OR, LM32BF_SFMT_ADD },
87a5a4af3bSchristos   { LM32_INSN_ORI, LM32BF_INSN_ORI, LM32BF_SFMT_ORI },
88a5a4af3bSchristos   { LM32_INSN_ORHII, LM32BF_INSN_ORHII, LM32BF_SFMT_ANDHII },
89a5a4af3bSchristos   { LM32_INSN_RCSR, LM32BF_INSN_RCSR, LM32BF_SFMT_RCSR },
90a5a4af3bSchristos   { LM32_INSN_SB, LM32BF_INSN_SB, LM32BF_SFMT_SB },
91a5a4af3bSchristos   { LM32_INSN_SEXTB, LM32BF_INSN_SEXTB, LM32BF_SFMT_SEXTB },
92a5a4af3bSchristos   { LM32_INSN_SEXTH, LM32BF_INSN_SEXTH, LM32BF_SFMT_SEXTB },
93a5a4af3bSchristos   { LM32_INSN_SH, LM32BF_INSN_SH, LM32BF_SFMT_SH },
94a5a4af3bSchristos   { LM32_INSN_SL, LM32BF_INSN_SL, LM32BF_SFMT_ADD },
95a5a4af3bSchristos   { LM32_INSN_SLI, LM32BF_INSN_SLI, LM32BF_SFMT_ADDI },
96a5a4af3bSchristos   { LM32_INSN_SR, LM32BF_INSN_SR, LM32BF_SFMT_ADD },
97a5a4af3bSchristos   { LM32_INSN_SRI, LM32BF_INSN_SRI, LM32BF_SFMT_ADDI },
98a5a4af3bSchristos   { LM32_INSN_SRU, LM32BF_INSN_SRU, LM32BF_SFMT_ADD },
99a5a4af3bSchristos   { LM32_INSN_SRUI, LM32BF_INSN_SRUI, LM32BF_SFMT_ADDI },
100a5a4af3bSchristos   { LM32_INSN_SUB, LM32BF_INSN_SUB, LM32BF_SFMT_ADD },
101a5a4af3bSchristos   { LM32_INSN_SW, LM32BF_INSN_SW, LM32BF_SFMT_SW },
102a5a4af3bSchristos   { LM32_INSN_USER, LM32BF_INSN_USER, LM32BF_SFMT_USER },
103a5a4af3bSchristos   { LM32_INSN_WCSR, LM32BF_INSN_WCSR, LM32BF_SFMT_WCSR },
104a5a4af3bSchristos   { LM32_INSN_XOR, LM32BF_INSN_XOR, LM32BF_SFMT_ADD },
105a5a4af3bSchristos   { LM32_INSN_XORI, LM32BF_INSN_XORI, LM32BF_SFMT_ANDI },
106a5a4af3bSchristos   { LM32_INSN_XNOR, LM32BF_INSN_XNOR, LM32BF_SFMT_ADD },
107a5a4af3bSchristos   { LM32_INSN_XNORI, LM32BF_INSN_XNORI, LM32BF_SFMT_ANDI },
108a5a4af3bSchristos   { LM32_INSN_BREAK, LM32BF_INSN_BREAK, LM32BF_SFMT_BREAK },
109a5a4af3bSchristos   { LM32_INSN_SCALL, LM32BF_INSN_SCALL, LM32BF_SFMT_BREAK },
110a5a4af3bSchristos };
111a5a4af3bSchristos 
112a5a4af3bSchristos static const struct insn_sem lm32bf_insn_sem_invalid =
113a5a4af3bSchristos {
114a5a4af3bSchristos   VIRTUAL_INSN_X_INVALID, LM32BF_INSN_X_INVALID, LM32BF_SFMT_EMPTY
115a5a4af3bSchristos };
116a5a4af3bSchristos 
117a5a4af3bSchristos /* Initialize an IDESC from the compile-time computable parts.  */
118a5a4af3bSchristos 
119a5a4af3bSchristos static INLINE void
120a5a4af3bSchristos init_idesc (SIM_CPU *cpu, IDESC *id, const struct insn_sem *t)
121a5a4af3bSchristos {
122a5a4af3bSchristos   const CGEN_INSN *insn_table = CGEN_CPU_INSN_TABLE (CPU_CPU_DESC (cpu))->init_entries;
123a5a4af3bSchristos 
124a5a4af3bSchristos   id->num = t->index;
125a5a4af3bSchristos   id->sfmt = t->sfmt;
126a5a4af3bSchristos   if ((int) t->type <= 0)
127a5a4af3bSchristos     id->idata = & cgen_virtual_insn_table[- (int) t->type];
128a5a4af3bSchristos   else
129a5a4af3bSchristos     id->idata = & insn_table[t->type];
130a5a4af3bSchristos   id->attrs = CGEN_INSN_ATTRS (id->idata);
131a5a4af3bSchristos   /* Oh my god, a magic number.  */
132a5a4af3bSchristos   id->length = CGEN_INSN_BITSIZE (id->idata) / 8;
133a5a4af3bSchristos 
134a5a4af3bSchristos #if WITH_PROFILE_MODEL_P
135a5a4af3bSchristos   id->timing = & MODEL_TIMING (CPU_MODEL (cpu)) [t->index];
136a5a4af3bSchristos   {
137a5a4af3bSchristos     SIM_DESC sd = CPU_STATE (cpu);
138a5a4af3bSchristos     SIM_ASSERT (t->index == id->timing->num);
139a5a4af3bSchristos   }
140a5a4af3bSchristos #endif
141a5a4af3bSchristos 
142a5a4af3bSchristos   /* Semantic pointers are initialized elsewhere.  */
143a5a4af3bSchristos }
144a5a4af3bSchristos 
145a5a4af3bSchristos /* Initialize the instruction descriptor table.  */
146a5a4af3bSchristos 
147a5a4af3bSchristos void
148a5a4af3bSchristos lm32bf_init_idesc_table (SIM_CPU *cpu)
149a5a4af3bSchristos {
150a5a4af3bSchristos   IDESC *id,*tabend;
151a5a4af3bSchristos   const struct insn_sem *t,*tend;
152a5a4af3bSchristos   int tabsize = LM32BF_INSN__MAX;
153a5a4af3bSchristos   IDESC *table = lm32bf_insn_data;
154a5a4af3bSchristos 
155a5a4af3bSchristos   memset (table, 0, tabsize * sizeof (IDESC));
156a5a4af3bSchristos 
157a5a4af3bSchristos   /* First set all entries to the `invalid insn'.  */
158a5a4af3bSchristos   t = & lm32bf_insn_sem_invalid;
159a5a4af3bSchristos   for (id = table, tabend = table + tabsize; id < tabend; ++id)
160a5a4af3bSchristos     init_idesc (cpu, id, t);
161a5a4af3bSchristos 
162a5a4af3bSchristos   /* Now fill in the values for the chosen cpu.  */
16399e23f81Schristos   for (t = lm32bf_insn_sem, tend = t + ARRAY_SIZE (lm32bf_insn_sem);
164a5a4af3bSchristos        t != tend; ++t)
165a5a4af3bSchristos     {
166a5a4af3bSchristos       init_idesc (cpu, & table[t->index], t);
167a5a4af3bSchristos     }
168a5a4af3bSchristos 
169a5a4af3bSchristos   /* Link the IDESC table into the cpu.  */
170a5a4af3bSchristos   CPU_IDESC (cpu) = table;
171a5a4af3bSchristos }
172a5a4af3bSchristos 
173a5a4af3bSchristos /* Given an instruction, return a pointer to its IDESC entry.  */
174a5a4af3bSchristos 
175a5a4af3bSchristos const IDESC *
176a5a4af3bSchristos lm32bf_decode (SIM_CPU *current_cpu, IADDR pc,
177a5a4af3bSchristos               CGEN_INSN_WORD base_insn, CGEN_INSN_WORD entire_insn,
178a5a4af3bSchristos               ARGBUF *abuf)
179a5a4af3bSchristos {
180a5a4af3bSchristos   /* Result of decoder.  */
181a5a4af3bSchristos   LM32BF_INSN_TYPE itype;
182a5a4af3bSchristos 
183a5a4af3bSchristos   {
184a5a4af3bSchristos     CGEN_INSN_WORD insn = base_insn;
185a5a4af3bSchristos 
186a5a4af3bSchristos     {
187a5a4af3bSchristos       unsigned int val = (((insn >> 26) & (63 << 0)));
188a5a4af3bSchristos       switch (val)
189a5a4af3bSchristos       {
190a5a4af3bSchristos       case 0 : itype = LM32BF_INSN_SRUI; goto extract_sfmt_addi;
191a5a4af3bSchristos       case 1 : itype = LM32BF_INSN_NORI; goto extract_sfmt_andi;
192a5a4af3bSchristos       case 2 : itype = LM32BF_INSN_MULI; goto extract_sfmt_addi;
193a5a4af3bSchristos       case 3 : itype = LM32BF_INSN_SH; goto extract_sfmt_sh;
194a5a4af3bSchristos       case 4 : itype = LM32BF_INSN_LB; goto extract_sfmt_lb;
195a5a4af3bSchristos       case 5 : itype = LM32BF_INSN_SRI; goto extract_sfmt_addi;
196a5a4af3bSchristos       case 6 : itype = LM32BF_INSN_XORI; goto extract_sfmt_andi;
197a5a4af3bSchristos       case 7 : itype = LM32BF_INSN_LH; goto extract_sfmt_lh;
198a5a4af3bSchristos       case 8 : itype = LM32BF_INSN_ANDI; goto extract_sfmt_andi;
199a5a4af3bSchristos       case 9 : itype = LM32BF_INSN_XNORI; goto extract_sfmt_andi;
200a5a4af3bSchristos       case 10 : itype = LM32BF_INSN_LW; goto extract_sfmt_lw;
201a5a4af3bSchristos       case 11 : itype = LM32BF_INSN_LHU; goto extract_sfmt_lh;
202a5a4af3bSchristos       case 12 : itype = LM32BF_INSN_SB; goto extract_sfmt_sb;
203a5a4af3bSchristos       case 13 : itype = LM32BF_INSN_ADDI; goto extract_sfmt_addi;
204a5a4af3bSchristos       case 14 : itype = LM32BF_INSN_ORI; goto extract_sfmt_ori;
205a5a4af3bSchristos       case 15 : itype = LM32BF_INSN_SLI; goto extract_sfmt_addi;
206a5a4af3bSchristos       case 16 : itype = LM32BF_INSN_LBU; goto extract_sfmt_lb;
207a5a4af3bSchristos       case 17 : itype = LM32BF_INSN_BE; goto extract_sfmt_be;
208a5a4af3bSchristos       case 18 : itype = LM32BF_INSN_BG; goto extract_sfmt_be;
209a5a4af3bSchristos       case 19 : itype = LM32BF_INSN_BGE; goto extract_sfmt_be;
210a5a4af3bSchristos       case 20 : itype = LM32BF_INSN_BGEU; goto extract_sfmt_be;
211a5a4af3bSchristos       case 21 : itype = LM32BF_INSN_BGU; goto extract_sfmt_be;
212a5a4af3bSchristos       case 22 : itype = LM32BF_INSN_SW; goto extract_sfmt_sw;
213a5a4af3bSchristos       case 23 : itype = LM32BF_INSN_BNE; goto extract_sfmt_be;
214a5a4af3bSchristos       case 24 : itype = LM32BF_INSN_ANDHII; goto extract_sfmt_andhii;
215a5a4af3bSchristos       case 25 : itype = LM32BF_INSN_CMPEI; goto extract_sfmt_addi;
216a5a4af3bSchristos       case 26 : itype = LM32BF_INSN_CMPGI; goto extract_sfmt_addi;
217a5a4af3bSchristos       case 27 : itype = LM32BF_INSN_CMPGEI; goto extract_sfmt_addi;
218a5a4af3bSchristos       case 28 : itype = LM32BF_INSN_CMPGEUI; goto extract_sfmt_andi;
219a5a4af3bSchristos       case 29 : itype = LM32BF_INSN_CMPGUI; goto extract_sfmt_andi;
220a5a4af3bSchristos       case 30 : itype = LM32BF_INSN_ORHII; goto extract_sfmt_andhii;
221a5a4af3bSchristos       case 31 : itype = LM32BF_INSN_CMPNEI; goto extract_sfmt_addi;
222a5a4af3bSchristos       case 32 :
223a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0x80000000)
224a5a4af3bSchristos           { itype = LM32BF_INSN_SRU; goto extract_sfmt_add; }
225a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
226a5a4af3bSchristos       case 33 :
227a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0x84000000)
228a5a4af3bSchristos           { itype = LM32BF_INSN_NOR; goto extract_sfmt_add; }
229a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
230a5a4af3bSchristos       case 34 :
231a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0x88000000)
232a5a4af3bSchristos           { itype = LM32BF_INSN_MUL; goto extract_sfmt_add; }
233a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
234a5a4af3bSchristos       case 35 :
235a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0x8c000000)
236a5a4af3bSchristos           { itype = LM32BF_INSN_DIVU; goto extract_sfmt_divu; }
237a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
238a5a4af3bSchristos       case 36 :
239a5a4af3bSchristos         if ((entire_insn & 0xfc1f07ff) == 0x90000000)
240a5a4af3bSchristos           { itype = LM32BF_INSN_RCSR; goto extract_sfmt_rcsr; }
241a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
242a5a4af3bSchristos       case 37 :
243a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0x94000000)
244a5a4af3bSchristos           { itype = LM32BF_INSN_SR; goto extract_sfmt_add; }
245a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
246a5a4af3bSchristos       case 38 :
247a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0x98000000)
248a5a4af3bSchristos           { itype = LM32BF_INSN_XOR; goto extract_sfmt_add; }
249a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
250a5a4af3bSchristos       case 40 :
251a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xa0000000)
252a5a4af3bSchristos           { itype = LM32BF_INSN_AND; goto extract_sfmt_add; }
253a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
254a5a4af3bSchristos       case 41 :
255a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xa4000000)
256a5a4af3bSchristos           { itype = LM32BF_INSN_XNOR; goto extract_sfmt_add; }
257a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
258a5a4af3bSchristos       case 43 :
259a5a4af3bSchristos         {
260a5a4af3bSchristos           unsigned int val = (((insn >> 1) & (1 << 1)) | ((insn >> 0) & (1 << 0)));
261a5a4af3bSchristos           switch (val)
262a5a4af3bSchristos           {
263a5a4af3bSchristos           case 0 :
264a5a4af3bSchristos             if ((entire_insn & 0xffffffff) == 0xac000002)
265a5a4af3bSchristos               { itype = LM32BF_INSN_BREAK; goto extract_sfmt_break; }
266a5a4af3bSchristos             itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
267a5a4af3bSchristos           case 3 :
268a5a4af3bSchristos             if ((entire_insn & 0xffffffff) == 0xac000007)
269a5a4af3bSchristos               { itype = LM32BF_INSN_SCALL; goto extract_sfmt_break; }
270a5a4af3bSchristos             itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
271a5a4af3bSchristos           default : itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
272a5a4af3bSchristos           }
273a5a4af3bSchristos         }
274a5a4af3bSchristos       case 44 :
275a5a4af3bSchristos         if ((entire_insn & 0xfc1f07ff) == 0xb0000000)
276a5a4af3bSchristos           { itype = LM32BF_INSN_SEXTB; goto extract_sfmt_sextb; }
277a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
278a5a4af3bSchristos       case 45 :
279a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xb4000000)
280a5a4af3bSchristos           { itype = LM32BF_INSN_ADD; goto extract_sfmt_add; }
281a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
282a5a4af3bSchristos       case 46 :
283a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xb8000000)
284a5a4af3bSchristos           { itype = LM32BF_INSN_OR; goto extract_sfmt_add; }
285a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
286a5a4af3bSchristos       case 47 :
287a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xbc000000)
288a5a4af3bSchristos           { itype = LM32BF_INSN_SL; goto extract_sfmt_add; }
289a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
290a5a4af3bSchristos       case 48 :
291a5a4af3bSchristos         if ((entire_insn & 0xfc1fffff) == 0xc0000000)
292a5a4af3bSchristos           { itype = LM32BF_INSN_B; goto extract_sfmt_b; }
293a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
294a5a4af3bSchristos       case 49 :
295a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xc4000000)
296a5a4af3bSchristos           { itype = LM32BF_INSN_MODU; goto extract_sfmt_divu; }
297a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
298a5a4af3bSchristos       case 50 :
299a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xc8000000)
300a5a4af3bSchristos           { itype = LM32BF_INSN_SUB; goto extract_sfmt_add; }
301a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
302a5a4af3bSchristos       case 51 : itype = LM32BF_INSN_USER; goto extract_sfmt_user;
303a5a4af3bSchristos       case 52 :
304a5a4af3bSchristos         if ((entire_insn & 0xfc00ffff) == 0xd0000000)
305a5a4af3bSchristos           { itype = LM32BF_INSN_WCSR; goto extract_sfmt_wcsr; }
306a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
307a5a4af3bSchristos       case 54 :
308a5a4af3bSchristos         if ((entire_insn & 0xfc1fffff) == 0xd8000000)
309a5a4af3bSchristos           { itype = LM32BF_INSN_CALL; goto extract_sfmt_call; }
310a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
311a5a4af3bSchristos       case 55 :
312a5a4af3bSchristos         if ((entire_insn & 0xfc1f07ff) == 0xdc000000)
313a5a4af3bSchristos           { itype = LM32BF_INSN_SEXTH; goto extract_sfmt_sextb; }
314a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
315a5a4af3bSchristos       case 56 : itype = LM32BF_INSN_BI; goto extract_sfmt_bi;
316a5a4af3bSchristos       case 57 :
317a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xe4000000)
318a5a4af3bSchristos           { itype = LM32BF_INSN_CMPE; goto extract_sfmt_add; }
319a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
320a5a4af3bSchristos       case 58 :
321a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xe8000000)
322a5a4af3bSchristos           { itype = LM32BF_INSN_CMPG; goto extract_sfmt_add; }
323a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
324a5a4af3bSchristos       case 59 :
325a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xec000000)
326a5a4af3bSchristos           { itype = LM32BF_INSN_CMPGE; goto extract_sfmt_add; }
327a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
328a5a4af3bSchristos       case 60 :
329a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xf0000000)
330a5a4af3bSchristos           { itype = LM32BF_INSN_CMPGEU; goto extract_sfmt_add; }
331a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
332a5a4af3bSchristos       case 61 :
333a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xf4000000)
334a5a4af3bSchristos           { itype = LM32BF_INSN_CMPGU; goto extract_sfmt_add; }
335a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
336a5a4af3bSchristos       case 62 : itype = LM32BF_INSN_CALLI; goto extract_sfmt_calli;
337a5a4af3bSchristos       case 63 :
338a5a4af3bSchristos         if ((entire_insn & 0xfc0007ff) == 0xfc000000)
339a5a4af3bSchristos           { itype = LM32BF_INSN_CMPNE; goto extract_sfmt_add; }
340a5a4af3bSchristos         itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
341a5a4af3bSchristos       default : itype = LM32BF_INSN_X_INVALID; goto extract_sfmt_empty;
342a5a4af3bSchristos       }
343a5a4af3bSchristos     }
344a5a4af3bSchristos   }
345a5a4af3bSchristos 
346a5a4af3bSchristos   /* The instruction has been decoded, now extract the fields.  */
347a5a4af3bSchristos 
348a5a4af3bSchristos  extract_sfmt_empty:
349a5a4af3bSchristos   {
350a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
351a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_empty.f
352a5a4af3bSchristos 
353a5a4af3bSchristos 
354a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
355a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_empty", (char *) 0));
356a5a4af3bSchristos 
357a5a4af3bSchristos #undef FLD
358a5a4af3bSchristos     return idesc;
359a5a4af3bSchristos   }
360a5a4af3bSchristos 
361a5a4af3bSchristos  extract_sfmt_add:
362a5a4af3bSchristos   {
363a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
364a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
365a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_user.f
366a5a4af3bSchristos     UINT f_r0;
367a5a4af3bSchristos     UINT f_r1;
368a5a4af3bSchristos     UINT f_r2;
369a5a4af3bSchristos 
370a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
371a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
372a5a4af3bSchristos     f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5);
373a5a4af3bSchristos 
374a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
375a5a4af3bSchristos   FLD (f_r0) = f_r0;
376a5a4af3bSchristos   FLD (f_r1) = f_r1;
377a5a4af3bSchristos   FLD (f_r2) = f_r2;
378a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_add", "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, "f_r2 0x%x", 'x', f_r2, (char *) 0));
379a5a4af3bSchristos 
380a5a4af3bSchristos #undef FLD
381a5a4af3bSchristos     return idesc;
382a5a4af3bSchristos   }
383a5a4af3bSchristos 
384a5a4af3bSchristos  extract_sfmt_addi:
385a5a4af3bSchristos   {
386a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
387a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
388a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f
389a5a4af3bSchristos     UINT f_r0;
390a5a4af3bSchristos     UINT f_r1;
391a5a4af3bSchristos     INT f_imm;
392a5a4af3bSchristos 
393a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
394a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
395a5a4af3bSchristos     f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16);
396a5a4af3bSchristos 
397a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
398a5a4af3bSchristos   FLD (f_imm) = f_imm;
399a5a4af3bSchristos   FLD (f_r0) = f_r0;
400a5a4af3bSchristos   FLD (f_r1) = f_r1;
401a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_addi", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
402a5a4af3bSchristos 
403a5a4af3bSchristos #undef FLD
404a5a4af3bSchristos     return idesc;
405a5a4af3bSchristos   }
406a5a4af3bSchristos 
407a5a4af3bSchristos  extract_sfmt_andi:
408a5a4af3bSchristos   {
409a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
410a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
411a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_andi.f
412a5a4af3bSchristos     UINT f_r0;
413a5a4af3bSchristos     UINT f_r1;
414a5a4af3bSchristos     UINT f_uimm;
415a5a4af3bSchristos 
416a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
417a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
418a5a4af3bSchristos     f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16);
419a5a4af3bSchristos 
420a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
421a5a4af3bSchristos   FLD (f_r0) = f_r0;
422a5a4af3bSchristos   FLD (f_uimm) = f_uimm;
423a5a4af3bSchristos   FLD (f_r1) = f_r1;
424a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_andi", "f_r0 0x%x", 'x', f_r0, "f_uimm 0x%x", 'x', f_uimm, "f_r1 0x%x", 'x', f_r1, (char *) 0));
425a5a4af3bSchristos 
426a5a4af3bSchristos #undef FLD
427a5a4af3bSchristos     return idesc;
428a5a4af3bSchristos   }
429a5a4af3bSchristos 
430a5a4af3bSchristos  extract_sfmt_andhii:
431a5a4af3bSchristos   {
432a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
433a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
434a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_andi.f
435a5a4af3bSchristos     UINT f_r0;
436a5a4af3bSchristos     UINT f_r1;
437a5a4af3bSchristos     UINT f_uimm;
438a5a4af3bSchristos 
439a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
440a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
441a5a4af3bSchristos     f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16);
442a5a4af3bSchristos 
443a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
444a5a4af3bSchristos   FLD (f_uimm) = f_uimm;
445a5a4af3bSchristos   FLD (f_r0) = f_r0;
446a5a4af3bSchristos   FLD (f_r1) = f_r1;
447a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_andhii", "f_uimm 0x%x", 'x', f_uimm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
448a5a4af3bSchristos 
449a5a4af3bSchristos #undef FLD
450a5a4af3bSchristos     return idesc;
451a5a4af3bSchristos   }
452a5a4af3bSchristos 
453a5a4af3bSchristos  extract_sfmt_b:
454a5a4af3bSchristos   {
455a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
456a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
457a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_be.f
458a5a4af3bSchristos     UINT f_r0;
459a5a4af3bSchristos 
460a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
461a5a4af3bSchristos 
462a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
463a5a4af3bSchristos   FLD (f_r0) = f_r0;
464a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_b", "f_r0 0x%x", 'x', f_r0, (char *) 0));
465a5a4af3bSchristos 
466a5a4af3bSchristos #undef FLD
467a5a4af3bSchristos     return idesc;
468a5a4af3bSchristos   }
469a5a4af3bSchristos 
470a5a4af3bSchristos  extract_sfmt_bi:
471a5a4af3bSchristos   {
472a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
473a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
474a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_bi.f
475a5a4af3bSchristos     SI f_call;
476a5a4af3bSchristos 
477a5a4af3bSchristos     f_call = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 25, 26)) << (6))) >> (4))));
478a5a4af3bSchristos 
479a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
480a5a4af3bSchristos   FLD (i_call) = f_call;
481a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_bi", "call 0x%x", 'x', f_call, (char *) 0));
482a5a4af3bSchristos 
483a5a4af3bSchristos #undef FLD
484a5a4af3bSchristos     return idesc;
485a5a4af3bSchristos   }
486a5a4af3bSchristos 
487a5a4af3bSchristos  extract_sfmt_be:
488a5a4af3bSchristos   {
489a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
490a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
491a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_be.f
492a5a4af3bSchristos     UINT f_r0;
493a5a4af3bSchristos     UINT f_r1;
494a5a4af3bSchristos     SI f_branch;
495a5a4af3bSchristos 
496a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
497a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
498a5a4af3bSchristos     f_branch = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 15, 16)) << (16))) >> (14))));
499a5a4af3bSchristos 
500a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
501a5a4af3bSchristos   FLD (f_r0) = f_r0;
502a5a4af3bSchristos   FLD (f_r1) = f_r1;
503a5a4af3bSchristos   FLD (i_branch) = f_branch;
504a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_be", "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, "branch 0x%x", 'x', f_branch, (char *) 0));
505a5a4af3bSchristos 
506a5a4af3bSchristos #undef FLD
507a5a4af3bSchristos     return idesc;
508a5a4af3bSchristos   }
509a5a4af3bSchristos 
510a5a4af3bSchristos  extract_sfmt_call:
511a5a4af3bSchristos   {
512a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
513a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
514a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_be.f
515a5a4af3bSchristos     UINT f_r0;
516a5a4af3bSchristos 
517a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
518a5a4af3bSchristos 
519a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
520a5a4af3bSchristos   FLD (f_r0) = f_r0;
521a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_call", "f_r0 0x%x", 'x', f_r0, (char *) 0));
522a5a4af3bSchristos 
523a5a4af3bSchristos #undef FLD
524a5a4af3bSchristos     return idesc;
525a5a4af3bSchristos   }
526a5a4af3bSchristos 
527a5a4af3bSchristos  extract_sfmt_calli:
528a5a4af3bSchristos   {
529a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
530a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
531a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_bi.f
532a5a4af3bSchristos     SI f_call;
533a5a4af3bSchristos 
534a5a4af3bSchristos     f_call = ((pc) + (((SI) (((EXTRACT_LSB0_SINT (insn, 32, 25, 26)) << (6))) >> (4))));
535a5a4af3bSchristos 
536a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
537a5a4af3bSchristos   FLD (i_call) = f_call;
538a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_calli", "call 0x%x", 'x', f_call, (char *) 0));
539a5a4af3bSchristos 
540a5a4af3bSchristos #undef FLD
541a5a4af3bSchristos     return idesc;
542a5a4af3bSchristos   }
543a5a4af3bSchristos 
544a5a4af3bSchristos  extract_sfmt_divu:
545a5a4af3bSchristos   {
546a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
547a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
548a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_user.f
549a5a4af3bSchristos     UINT f_r0;
550a5a4af3bSchristos     UINT f_r1;
551a5a4af3bSchristos     UINT f_r2;
552a5a4af3bSchristos 
553a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
554a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
555a5a4af3bSchristos     f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5);
556a5a4af3bSchristos 
557a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
558a5a4af3bSchristos   FLD (f_r0) = f_r0;
559a5a4af3bSchristos   FLD (f_r1) = f_r1;
560a5a4af3bSchristos   FLD (f_r2) = f_r2;
561a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_divu", "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, "f_r2 0x%x", 'x', f_r2, (char *) 0));
562a5a4af3bSchristos 
563a5a4af3bSchristos #undef FLD
564a5a4af3bSchristos     return idesc;
565a5a4af3bSchristos   }
566a5a4af3bSchristos 
567a5a4af3bSchristos  extract_sfmt_lb:
568a5a4af3bSchristos   {
569a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
570a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
571a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f
572a5a4af3bSchristos     UINT f_r0;
573a5a4af3bSchristos     UINT f_r1;
574a5a4af3bSchristos     INT f_imm;
575a5a4af3bSchristos 
576a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
577a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
578a5a4af3bSchristos     f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16);
579a5a4af3bSchristos 
580a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
581a5a4af3bSchristos   FLD (f_imm) = f_imm;
582a5a4af3bSchristos   FLD (f_r0) = f_r0;
583a5a4af3bSchristos   FLD (f_r1) = f_r1;
584a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_lb", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
585a5a4af3bSchristos 
586a5a4af3bSchristos #undef FLD
587a5a4af3bSchristos     return idesc;
588a5a4af3bSchristos   }
589a5a4af3bSchristos 
590a5a4af3bSchristos  extract_sfmt_lh:
591a5a4af3bSchristos   {
592a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
593a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
594a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f
595a5a4af3bSchristos     UINT f_r0;
596a5a4af3bSchristos     UINT f_r1;
597a5a4af3bSchristos     INT f_imm;
598a5a4af3bSchristos 
599a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
600a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
601a5a4af3bSchristos     f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16);
602a5a4af3bSchristos 
603a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
604a5a4af3bSchristos   FLD (f_imm) = f_imm;
605a5a4af3bSchristos   FLD (f_r0) = f_r0;
606a5a4af3bSchristos   FLD (f_r1) = f_r1;
607a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_lh", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
608a5a4af3bSchristos 
609a5a4af3bSchristos #undef FLD
610a5a4af3bSchristos     return idesc;
611a5a4af3bSchristos   }
612a5a4af3bSchristos 
613a5a4af3bSchristos  extract_sfmt_lw:
614a5a4af3bSchristos   {
615a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
616a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
617a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f
618a5a4af3bSchristos     UINT f_r0;
619a5a4af3bSchristos     UINT f_r1;
620a5a4af3bSchristos     INT f_imm;
621a5a4af3bSchristos 
622a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
623a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
624a5a4af3bSchristos     f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16);
625a5a4af3bSchristos 
626a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
627a5a4af3bSchristos   FLD (f_imm) = f_imm;
628a5a4af3bSchristos   FLD (f_r0) = f_r0;
629a5a4af3bSchristos   FLD (f_r1) = f_r1;
630a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_lw", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
631a5a4af3bSchristos 
632a5a4af3bSchristos #undef FLD
633a5a4af3bSchristos     return idesc;
634a5a4af3bSchristos   }
635a5a4af3bSchristos 
636a5a4af3bSchristos  extract_sfmt_ori:
637a5a4af3bSchristos   {
638a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
639a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
640a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_andi.f
641a5a4af3bSchristos     UINT f_r0;
642a5a4af3bSchristos     UINT f_r1;
643a5a4af3bSchristos     UINT f_uimm;
644a5a4af3bSchristos 
645a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
646a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
647a5a4af3bSchristos     f_uimm = EXTRACT_LSB0_UINT (insn, 32, 15, 16);
648a5a4af3bSchristos 
649a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
650a5a4af3bSchristos   FLD (f_uimm) = f_uimm;
651a5a4af3bSchristos   FLD (f_r0) = f_r0;
652a5a4af3bSchristos   FLD (f_r1) = f_r1;
653a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_ori", "f_uimm 0x%x", 'x', f_uimm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
654a5a4af3bSchristos 
655a5a4af3bSchristos #undef FLD
656a5a4af3bSchristos     return idesc;
657a5a4af3bSchristos   }
658a5a4af3bSchristos 
659a5a4af3bSchristos  extract_sfmt_rcsr:
660a5a4af3bSchristos   {
661a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
662a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
663a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_rcsr.f
664a5a4af3bSchristos     UINT f_csr;
665a5a4af3bSchristos     UINT f_r2;
666a5a4af3bSchristos 
667a5a4af3bSchristos     f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
668a5a4af3bSchristos     f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5);
669a5a4af3bSchristos 
670a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
671a5a4af3bSchristos   FLD (f_csr) = f_csr;
672a5a4af3bSchristos   FLD (f_r2) = f_r2;
673a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_rcsr", "f_csr 0x%x", 'x', f_csr, "f_r2 0x%x", 'x', f_r2, (char *) 0));
674a5a4af3bSchristos 
675a5a4af3bSchristos #undef FLD
676a5a4af3bSchristos     return idesc;
677a5a4af3bSchristos   }
678a5a4af3bSchristos 
679a5a4af3bSchristos  extract_sfmt_sb:
680a5a4af3bSchristos   {
681a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
682a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
683a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f
684a5a4af3bSchristos     UINT f_r0;
685a5a4af3bSchristos     UINT f_r1;
686a5a4af3bSchristos     INT f_imm;
687a5a4af3bSchristos 
688a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
689a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
690a5a4af3bSchristos     f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16);
691a5a4af3bSchristos 
692a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
693a5a4af3bSchristos   FLD (f_imm) = f_imm;
694a5a4af3bSchristos   FLD (f_r0) = f_r0;
695a5a4af3bSchristos   FLD (f_r1) = f_r1;
696a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_sb", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
697a5a4af3bSchristos 
698a5a4af3bSchristos #undef FLD
699a5a4af3bSchristos     return idesc;
700a5a4af3bSchristos   }
701a5a4af3bSchristos 
702a5a4af3bSchristos  extract_sfmt_sextb:
703a5a4af3bSchristos   {
704a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
705a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
706a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_user.f
707a5a4af3bSchristos     UINT f_r0;
708a5a4af3bSchristos     UINT f_r2;
709a5a4af3bSchristos 
710a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
711a5a4af3bSchristos     f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5);
712a5a4af3bSchristos 
713a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
714a5a4af3bSchristos   FLD (f_r0) = f_r0;
715a5a4af3bSchristos   FLD (f_r2) = f_r2;
716a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_sextb", "f_r0 0x%x", 'x', f_r0, "f_r2 0x%x", 'x', f_r2, (char *) 0));
717a5a4af3bSchristos 
718a5a4af3bSchristos #undef FLD
719a5a4af3bSchristos     return idesc;
720a5a4af3bSchristos   }
721a5a4af3bSchristos 
722a5a4af3bSchristos  extract_sfmt_sh:
723a5a4af3bSchristos   {
724a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
725a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
726a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f
727a5a4af3bSchristos     UINT f_r0;
728a5a4af3bSchristos     UINT f_r1;
729a5a4af3bSchristos     INT f_imm;
730a5a4af3bSchristos 
731a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
732a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
733a5a4af3bSchristos     f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16);
734a5a4af3bSchristos 
735a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
736a5a4af3bSchristos   FLD (f_imm) = f_imm;
737a5a4af3bSchristos   FLD (f_r0) = f_r0;
738a5a4af3bSchristos   FLD (f_r1) = f_r1;
739a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_sh", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
740a5a4af3bSchristos 
741a5a4af3bSchristos #undef FLD
742a5a4af3bSchristos     return idesc;
743a5a4af3bSchristos   }
744a5a4af3bSchristos 
745a5a4af3bSchristos  extract_sfmt_sw:
746a5a4af3bSchristos   {
747a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
748a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
749a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_addi.f
750a5a4af3bSchristos     UINT f_r0;
751a5a4af3bSchristos     UINT f_r1;
752a5a4af3bSchristos     INT f_imm;
753a5a4af3bSchristos 
754a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
755a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
756a5a4af3bSchristos     f_imm = EXTRACT_LSB0_SINT (insn, 32, 15, 16);
757a5a4af3bSchristos 
758a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
759a5a4af3bSchristos   FLD (f_imm) = f_imm;
760a5a4af3bSchristos   FLD (f_r0) = f_r0;
761a5a4af3bSchristos   FLD (f_r1) = f_r1;
762a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_sw", "f_imm 0x%x", 'x', f_imm, "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, (char *) 0));
763a5a4af3bSchristos 
764a5a4af3bSchristos #undef FLD
765a5a4af3bSchristos     return idesc;
766a5a4af3bSchristos   }
767a5a4af3bSchristos 
768a5a4af3bSchristos  extract_sfmt_user:
769a5a4af3bSchristos   {
770a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
771a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
772a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_user.f
773a5a4af3bSchristos     UINT f_r0;
774a5a4af3bSchristos     UINT f_r1;
775a5a4af3bSchristos     UINT f_r2;
776a5a4af3bSchristos     UINT f_user;
777a5a4af3bSchristos 
778a5a4af3bSchristos     f_r0 = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
779a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
780a5a4af3bSchristos     f_r2 = EXTRACT_LSB0_UINT (insn, 32, 15, 5);
781a5a4af3bSchristos     f_user = EXTRACT_LSB0_UINT (insn, 32, 10, 11);
782a5a4af3bSchristos 
783a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
784a5a4af3bSchristos   FLD (f_r0) = f_r0;
785a5a4af3bSchristos   FLD (f_r1) = f_r1;
786a5a4af3bSchristos   FLD (f_user) = f_user;
787a5a4af3bSchristos   FLD (f_r2) = f_r2;
788a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_user", "f_r0 0x%x", 'x', f_r0, "f_r1 0x%x", 'x', f_r1, "f_user 0x%x", 'x', f_user, "f_r2 0x%x", 'x', f_r2, (char *) 0));
789a5a4af3bSchristos 
790a5a4af3bSchristos #undef FLD
791a5a4af3bSchristos     return idesc;
792a5a4af3bSchristos   }
793a5a4af3bSchristos 
794a5a4af3bSchristos  extract_sfmt_wcsr:
795a5a4af3bSchristos   {
796a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
797a5a4af3bSchristos     CGEN_INSN_WORD insn = entire_insn;
798a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_wcsr.f
799a5a4af3bSchristos     UINT f_csr;
800a5a4af3bSchristos     UINT f_r1;
801a5a4af3bSchristos 
802a5a4af3bSchristos     f_csr = EXTRACT_LSB0_UINT (insn, 32, 25, 5);
803a5a4af3bSchristos     f_r1 = EXTRACT_LSB0_UINT (insn, 32, 20, 5);
804a5a4af3bSchristos 
805a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
806a5a4af3bSchristos   FLD (f_csr) = f_csr;
807a5a4af3bSchristos   FLD (f_r1) = f_r1;
808a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_wcsr", "f_csr 0x%x", 'x', f_csr, "f_r1 0x%x", 'x', f_r1, (char *) 0));
809a5a4af3bSchristos 
810a5a4af3bSchristos #undef FLD
811a5a4af3bSchristos     return idesc;
812a5a4af3bSchristos   }
813a5a4af3bSchristos 
814a5a4af3bSchristos  extract_sfmt_break:
815a5a4af3bSchristos   {
816a5a4af3bSchristos     const IDESC *idesc = &lm32bf_insn_data[itype];
817a5a4af3bSchristos #define FLD(f) abuf->fields.sfmt_empty.f
818a5a4af3bSchristos 
819a5a4af3bSchristos 
820a5a4af3bSchristos   /* Record the fields for the semantic handler.  */
821a5a4af3bSchristos   CGEN_TRACE_EXTRACT (current_cpu, abuf, (current_cpu, pc, "sfmt_break", (char *) 0));
822a5a4af3bSchristos 
823a5a4af3bSchristos #undef FLD
824a5a4af3bSchristos     return idesc;
825a5a4af3bSchristos   }
826a5a4af3bSchristos 
827a5a4af3bSchristos }
828