binutils/
[external/binutils.git] / sim / iq2000 / sem-switch.c
1 /* Simulator instruction semantics for iq2000bf.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996-2010 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 #ifdef DEFINE_LABELS
26
27   /* The labels have the case they have because the enum of insn types
28      is all uppercase and in the non-stdc case the insn symbol is built
29      into the enum name.  */
30
31   static struct {
32     int index;
33     void *label;
34   } labels[] = {
35     { IQ2000BF_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
36     { IQ2000BF_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
37     { IQ2000BF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
38     { IQ2000BF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
39     { IQ2000BF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
40     { IQ2000BF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
41     { IQ2000BF_INSN_ADD, && case_sem_INSN_ADD },
42     { IQ2000BF_INSN_ADDI, && case_sem_INSN_ADDI },
43     { IQ2000BF_INSN_ADDIU, && case_sem_INSN_ADDIU },
44     { IQ2000BF_INSN_ADDU, && case_sem_INSN_ADDU },
45     { IQ2000BF_INSN_ADO16, && case_sem_INSN_ADO16 },
46     { IQ2000BF_INSN_AND, && case_sem_INSN_AND },
47     { IQ2000BF_INSN_ANDI, && case_sem_INSN_ANDI },
48     { IQ2000BF_INSN_ANDOI, && case_sem_INSN_ANDOI },
49     { IQ2000BF_INSN_NOR, && case_sem_INSN_NOR },
50     { IQ2000BF_INSN_OR, && case_sem_INSN_OR },
51     { IQ2000BF_INSN_ORI, && case_sem_INSN_ORI },
52     { IQ2000BF_INSN_RAM, && case_sem_INSN_RAM },
53     { IQ2000BF_INSN_SLL, && case_sem_INSN_SLL },
54     { IQ2000BF_INSN_SLLV, && case_sem_INSN_SLLV },
55     { IQ2000BF_INSN_SLMV, && case_sem_INSN_SLMV },
56     { IQ2000BF_INSN_SLT, && case_sem_INSN_SLT },
57     { IQ2000BF_INSN_SLTI, && case_sem_INSN_SLTI },
58     { IQ2000BF_INSN_SLTIU, && case_sem_INSN_SLTIU },
59     { IQ2000BF_INSN_SLTU, && case_sem_INSN_SLTU },
60     { IQ2000BF_INSN_SRA, && case_sem_INSN_SRA },
61     { IQ2000BF_INSN_SRAV, && case_sem_INSN_SRAV },
62     { IQ2000BF_INSN_SRL, && case_sem_INSN_SRL },
63     { IQ2000BF_INSN_SRLV, && case_sem_INSN_SRLV },
64     { IQ2000BF_INSN_SRMV, && case_sem_INSN_SRMV },
65     { IQ2000BF_INSN_SUB, && case_sem_INSN_SUB },
66     { IQ2000BF_INSN_SUBU, && case_sem_INSN_SUBU },
67     { IQ2000BF_INSN_XOR, && case_sem_INSN_XOR },
68     { IQ2000BF_INSN_XORI, && case_sem_INSN_XORI },
69     { IQ2000BF_INSN_BBI, && case_sem_INSN_BBI },
70     { IQ2000BF_INSN_BBIN, && case_sem_INSN_BBIN },
71     { IQ2000BF_INSN_BBV, && case_sem_INSN_BBV },
72     { IQ2000BF_INSN_BBVN, && case_sem_INSN_BBVN },
73     { IQ2000BF_INSN_BEQ, && case_sem_INSN_BEQ },
74     { IQ2000BF_INSN_BEQL, && case_sem_INSN_BEQL },
75     { IQ2000BF_INSN_BGEZ, && case_sem_INSN_BGEZ },
76     { IQ2000BF_INSN_BGEZAL, && case_sem_INSN_BGEZAL },
77     { IQ2000BF_INSN_BGEZALL, && case_sem_INSN_BGEZALL },
78     { IQ2000BF_INSN_BGEZL, && case_sem_INSN_BGEZL },
79     { IQ2000BF_INSN_BLTZ, && case_sem_INSN_BLTZ },
80     { IQ2000BF_INSN_BLTZL, && case_sem_INSN_BLTZL },
81     { IQ2000BF_INSN_BLTZAL, && case_sem_INSN_BLTZAL },
82     { IQ2000BF_INSN_BLTZALL, && case_sem_INSN_BLTZALL },
83     { IQ2000BF_INSN_BMB0, && case_sem_INSN_BMB0 },
84     { IQ2000BF_INSN_BMB1, && case_sem_INSN_BMB1 },
85     { IQ2000BF_INSN_BMB2, && case_sem_INSN_BMB2 },
86     { IQ2000BF_INSN_BMB3, && case_sem_INSN_BMB3 },
87     { IQ2000BF_INSN_BNE, && case_sem_INSN_BNE },
88     { IQ2000BF_INSN_BNEL, && case_sem_INSN_BNEL },
89     { IQ2000BF_INSN_JALR, && case_sem_INSN_JALR },
90     { IQ2000BF_INSN_JR, && case_sem_INSN_JR },
91     { IQ2000BF_INSN_LB, && case_sem_INSN_LB },
92     { IQ2000BF_INSN_LBU, && case_sem_INSN_LBU },
93     { IQ2000BF_INSN_LH, && case_sem_INSN_LH },
94     { IQ2000BF_INSN_LHU, && case_sem_INSN_LHU },
95     { IQ2000BF_INSN_LUI, && case_sem_INSN_LUI },
96     { IQ2000BF_INSN_LW, && case_sem_INSN_LW },
97     { IQ2000BF_INSN_SB, && case_sem_INSN_SB },
98     { IQ2000BF_INSN_SH, && case_sem_INSN_SH },
99     { IQ2000BF_INSN_SW, && case_sem_INSN_SW },
100     { IQ2000BF_INSN_BREAK, && case_sem_INSN_BREAK },
101     { IQ2000BF_INSN_SYSCALL, && case_sem_INSN_SYSCALL },
102     { IQ2000BF_INSN_ANDOUI, && case_sem_INSN_ANDOUI },
103     { IQ2000BF_INSN_ORUI, && case_sem_INSN_ORUI },
104     { IQ2000BF_INSN_BGTZ, && case_sem_INSN_BGTZ },
105     { IQ2000BF_INSN_BGTZL, && case_sem_INSN_BGTZL },
106     { IQ2000BF_INSN_BLEZ, && case_sem_INSN_BLEZ },
107     { IQ2000BF_INSN_BLEZL, && case_sem_INSN_BLEZL },
108     { IQ2000BF_INSN_MRGB, && case_sem_INSN_MRGB },
109     { IQ2000BF_INSN_BCTXT, && case_sem_INSN_BCTXT },
110     { IQ2000BF_INSN_BC0F, && case_sem_INSN_BC0F },
111     { IQ2000BF_INSN_BC0FL, && case_sem_INSN_BC0FL },
112     { IQ2000BF_INSN_BC3F, && case_sem_INSN_BC3F },
113     { IQ2000BF_INSN_BC3FL, && case_sem_INSN_BC3FL },
114     { IQ2000BF_INSN_BC0T, && case_sem_INSN_BC0T },
115     { IQ2000BF_INSN_BC0TL, && case_sem_INSN_BC0TL },
116     { IQ2000BF_INSN_BC3T, && case_sem_INSN_BC3T },
117     { IQ2000BF_INSN_BC3TL, && case_sem_INSN_BC3TL },
118     { IQ2000BF_INSN_CFC0, && case_sem_INSN_CFC0 },
119     { IQ2000BF_INSN_CFC1, && case_sem_INSN_CFC1 },
120     { IQ2000BF_INSN_CFC2, && case_sem_INSN_CFC2 },
121     { IQ2000BF_INSN_CFC3, && case_sem_INSN_CFC3 },
122     { IQ2000BF_INSN_CHKHDR, && case_sem_INSN_CHKHDR },
123     { IQ2000BF_INSN_CTC0, && case_sem_INSN_CTC0 },
124     { IQ2000BF_INSN_CTC1, && case_sem_INSN_CTC1 },
125     { IQ2000BF_INSN_CTC2, && case_sem_INSN_CTC2 },
126     { IQ2000BF_INSN_CTC3, && case_sem_INSN_CTC3 },
127     { IQ2000BF_INSN_JCR, && case_sem_INSN_JCR },
128     { IQ2000BF_INSN_LUC32, && case_sem_INSN_LUC32 },
129     { IQ2000BF_INSN_LUC32L, && case_sem_INSN_LUC32L },
130     { IQ2000BF_INSN_LUC64, && case_sem_INSN_LUC64 },
131     { IQ2000BF_INSN_LUC64L, && case_sem_INSN_LUC64L },
132     { IQ2000BF_INSN_LUK, && case_sem_INSN_LUK },
133     { IQ2000BF_INSN_LULCK, && case_sem_INSN_LULCK },
134     { IQ2000BF_INSN_LUM32, && case_sem_INSN_LUM32 },
135     { IQ2000BF_INSN_LUM32L, && case_sem_INSN_LUM32L },
136     { IQ2000BF_INSN_LUM64, && case_sem_INSN_LUM64 },
137     { IQ2000BF_INSN_LUM64L, && case_sem_INSN_LUM64L },
138     { IQ2000BF_INSN_LUR, && case_sem_INSN_LUR },
139     { IQ2000BF_INSN_LURL, && case_sem_INSN_LURL },
140     { IQ2000BF_INSN_LUULCK, && case_sem_INSN_LUULCK },
141     { IQ2000BF_INSN_MFC0, && case_sem_INSN_MFC0 },
142     { IQ2000BF_INSN_MFC1, && case_sem_INSN_MFC1 },
143     { IQ2000BF_INSN_MFC2, && case_sem_INSN_MFC2 },
144     { IQ2000BF_INSN_MFC3, && case_sem_INSN_MFC3 },
145     { IQ2000BF_INSN_MTC0, && case_sem_INSN_MTC0 },
146     { IQ2000BF_INSN_MTC1, && case_sem_INSN_MTC1 },
147     { IQ2000BF_INSN_MTC2, && case_sem_INSN_MTC2 },
148     { IQ2000BF_INSN_MTC3, && case_sem_INSN_MTC3 },
149     { IQ2000BF_INSN_PKRL, && case_sem_INSN_PKRL },
150     { IQ2000BF_INSN_PKRLR1, && case_sem_INSN_PKRLR1 },
151     { IQ2000BF_INSN_PKRLR30, && case_sem_INSN_PKRLR30 },
152     { IQ2000BF_INSN_RB, && case_sem_INSN_RB },
153     { IQ2000BF_INSN_RBR1, && case_sem_INSN_RBR1 },
154     { IQ2000BF_INSN_RBR30, && case_sem_INSN_RBR30 },
155     { IQ2000BF_INSN_RFE, && case_sem_INSN_RFE },
156     { IQ2000BF_INSN_RX, && case_sem_INSN_RX },
157     { IQ2000BF_INSN_RXR1, && case_sem_INSN_RXR1 },
158     { IQ2000BF_INSN_RXR30, && case_sem_INSN_RXR30 },
159     { IQ2000BF_INSN_SLEEP, && case_sem_INSN_SLEEP },
160     { IQ2000BF_INSN_SRRD, && case_sem_INSN_SRRD },
161     { IQ2000BF_INSN_SRRDL, && case_sem_INSN_SRRDL },
162     { IQ2000BF_INSN_SRULCK, && case_sem_INSN_SRULCK },
163     { IQ2000BF_INSN_SRWR, && case_sem_INSN_SRWR },
164     { IQ2000BF_INSN_SRWRU, && case_sem_INSN_SRWRU },
165     { IQ2000BF_INSN_TRAPQFL, && case_sem_INSN_TRAPQFL },
166     { IQ2000BF_INSN_TRAPQNE, && case_sem_INSN_TRAPQNE },
167     { IQ2000BF_INSN_TRAPREL, && case_sem_INSN_TRAPREL },
168     { IQ2000BF_INSN_WB, && case_sem_INSN_WB },
169     { IQ2000BF_INSN_WBU, && case_sem_INSN_WBU },
170     { IQ2000BF_INSN_WBR1, && case_sem_INSN_WBR1 },
171     { IQ2000BF_INSN_WBR1U, && case_sem_INSN_WBR1U },
172     { IQ2000BF_INSN_WBR30, && case_sem_INSN_WBR30 },
173     { IQ2000BF_INSN_WBR30U, && case_sem_INSN_WBR30U },
174     { IQ2000BF_INSN_WX, && case_sem_INSN_WX },
175     { IQ2000BF_INSN_WXU, && case_sem_INSN_WXU },
176     { IQ2000BF_INSN_WXR1, && case_sem_INSN_WXR1 },
177     { IQ2000BF_INSN_WXR1U, && case_sem_INSN_WXR1U },
178     { IQ2000BF_INSN_WXR30, && case_sem_INSN_WXR30 },
179     { IQ2000BF_INSN_WXR30U, && case_sem_INSN_WXR30U },
180     { IQ2000BF_INSN_LDW, && case_sem_INSN_LDW },
181     { IQ2000BF_INSN_SDW, && case_sem_INSN_SDW },
182     { IQ2000BF_INSN_J, && case_sem_INSN_J },
183     { IQ2000BF_INSN_JAL, && case_sem_INSN_JAL },
184     { IQ2000BF_INSN_BMB, && case_sem_INSN_BMB },
185     { 0, 0 }
186   };
187   int i;
188
189   for (i = 0; labels[i].label != 0; ++i)
190     {
191 #if FAST_P
192       CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
193 #else
194       CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
195 #endif
196     }
197
198 #undef DEFINE_LABELS
199 #endif /* DEFINE_LABELS */
200
201 #ifdef DEFINE_SWITCH
202
203 /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
204    off frills like tracing and profiling.  */
205 /* FIXME: A better way would be to have TRACE_RESULT check for something
206    that can cause it to be optimized out.  Another way would be to emit
207    special handlers into the instruction "stream".  */
208
209 #if FAST_P
210 #undef TRACE_RESULT
211 #define TRACE_RESULT(cpu, abuf, name, type, val)
212 #endif
213
214 #undef GET_ATTR
215 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
216
217 {
218
219 #if WITH_SCACHE_PBB
220
221 /* Branch to next handler without going around main loop.  */
222 #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
223 SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
224
225 #else /* ! WITH_SCACHE_PBB */
226
227 #define NEXT(vpc) BREAK (sem)
228 #ifdef __GNUC__
229 #if FAST_P
230   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
231 #else
232   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
233 #endif
234 #else
235   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
236 #endif
237
238 #endif /* ! WITH_SCACHE_PBB */
239
240     {
241
242   CASE (sem, INSN_X_INVALID) : /* --invalid-- */
243 {
244   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
245   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
246 #define FLD(f) abuf->fields.sfmt_empty.f
247   int UNUSED written = 0;
248   IADDR UNUSED pc = abuf->addr;
249   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
250
251   {
252     /* Update the recorded pc in the cpu state struct.
253        Only necessary for WITH_SCACHE case, but to avoid the
254        conditional compilation ....  */
255     SET_H_PC (pc);
256     /* Virtual insns have zero size.  Overwrite vpc with address of next insn
257        using the default-insn-bitsize spec.  When executing insns in parallel
258        we may want to queue the fault and continue execution.  */
259     vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
260     vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
261   }
262
263 #undef FLD
264 }
265   NEXT (vpc);
266
267   CASE (sem, INSN_X_AFTER) : /* --after-- */
268 {
269   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
270   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
271 #define FLD(f) abuf->fields.sfmt_empty.f
272   int UNUSED written = 0;
273   IADDR UNUSED pc = abuf->addr;
274   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
275
276   {
277 #if WITH_SCACHE_PBB_IQ2000BF
278     iq2000bf_pbb_after (current_cpu, sem_arg);
279 #endif
280   }
281
282 #undef FLD
283 }
284   NEXT (vpc);
285
286   CASE (sem, INSN_X_BEFORE) : /* --before-- */
287 {
288   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
289   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
290 #define FLD(f) abuf->fields.sfmt_empty.f
291   int UNUSED written = 0;
292   IADDR UNUSED pc = abuf->addr;
293   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
294
295   {
296 #if WITH_SCACHE_PBB_IQ2000BF
297     iq2000bf_pbb_before (current_cpu, sem_arg);
298 #endif
299   }
300
301 #undef FLD
302 }
303   NEXT (vpc);
304
305   CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
306 {
307   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
308   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
309 #define FLD(f) abuf->fields.sfmt_empty.f
310   int UNUSED written = 0;
311   IADDR UNUSED pc = abuf->addr;
312   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
313
314   {
315 #if WITH_SCACHE_PBB_IQ2000BF
316 #ifdef DEFINE_SWITCH
317     vpc = iq2000bf_pbb_cti_chain (current_cpu, sem_arg,
318                                pbb_br_type, pbb_br_npc);
319     BREAK (sem);
320 #else
321     /* FIXME: Allow provision of explicit ifmt spec in insn spec.  */
322     vpc = iq2000bf_pbb_cti_chain (current_cpu, sem_arg,
323                                CPU_PBB_BR_TYPE (current_cpu),
324                                CPU_PBB_BR_NPC (current_cpu));
325 #endif
326 #endif
327   }
328
329 #undef FLD
330 }
331   NEXT (vpc);
332
333   CASE (sem, INSN_X_CHAIN) : /* --chain-- */
334 {
335   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
336   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
337 #define FLD(f) abuf->fields.sfmt_empty.f
338   int UNUSED written = 0;
339   IADDR UNUSED pc = abuf->addr;
340   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
341
342   {
343 #if WITH_SCACHE_PBB_IQ2000BF
344     vpc = iq2000bf_pbb_chain (current_cpu, sem_arg);
345 #ifdef DEFINE_SWITCH
346     BREAK (sem);
347 #endif
348 #endif
349   }
350
351 #undef FLD
352 }
353   NEXT (vpc);
354
355   CASE (sem, INSN_X_BEGIN) : /* --begin-- */
356 {
357   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
358   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
359 #define FLD(f) abuf->fields.sfmt_empty.f
360   int UNUSED written = 0;
361   IADDR UNUSED pc = abuf->addr;
362   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
363
364   {
365 #if WITH_SCACHE_PBB_IQ2000BF
366 #if defined DEFINE_SWITCH || defined FAST_P
367     /* In the switch case FAST_P is a constant, allowing several optimizations
368        in any called inline functions.  */
369     vpc = iq2000bf_pbb_begin (current_cpu, FAST_P);
370 #else
371 #if 0 /* cgen engine can't handle dynamic fast/full switching yet.  */
372     vpc = iq2000bf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
373 #else
374     vpc = iq2000bf_pbb_begin (current_cpu, 0);
375 #endif
376 #endif
377 #endif
378   }
379
380 #undef FLD
381 }
382   NEXT (vpc);
383
384   CASE (sem, INSN_ADD) : /* add $rd,$rs,$rt */
385 {
386   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
387   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
388 #define FLD(f) abuf->fields.sfmt_mrgb.f
389   int UNUSED written = 0;
390   IADDR UNUSED pc = abuf->addr;
391   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
392
393   {
394     SI opval = ADDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
395     SET_H_GR (FLD (f_rd), opval);
396     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
397   }
398
399 #undef FLD
400 }
401   NEXT (vpc);
402
403   CASE (sem, INSN_ADDI) : /* addi $rt,$rs,$lo16 */
404 {
405   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
406   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
407 #define FLD(f) abuf->fields.sfmt_addi.f
408   int UNUSED written = 0;
409   IADDR UNUSED pc = abuf->addr;
410   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
411
412   {
413     SI opval = ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))));
414     SET_H_GR (FLD (f_rt), opval);
415     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
416   }
417
418 #undef FLD
419 }
420   NEXT (vpc);
421
422   CASE (sem, INSN_ADDIU) : /* addiu $rt,$rs,$lo16 */
423 {
424   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
425   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
426 #define FLD(f) abuf->fields.sfmt_addi.f
427   int UNUSED written = 0;
428   IADDR UNUSED pc = abuf->addr;
429   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
430
431   {
432     SI opval = ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))));
433     SET_H_GR (FLD (f_rt), opval);
434     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
435   }
436
437 #undef FLD
438 }
439   NEXT (vpc);
440
441   CASE (sem, INSN_ADDU) : /* addu $rd,$rs,$rt */
442 {
443   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
444   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
445 #define FLD(f) abuf->fields.sfmt_mrgb.f
446   int UNUSED written = 0;
447   IADDR UNUSED pc = abuf->addr;
448   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
449
450   {
451     SI opval = ADDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
452     SET_H_GR (FLD (f_rd), opval);
453     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
454   }
455
456 #undef FLD
457 }
458   NEXT (vpc);
459
460   CASE (sem, INSN_ADO16) : /* ado16 $rd,$rs,$rt */
461 {
462   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
463   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
464 #define FLD(f) abuf->fields.sfmt_mrgb.f
465   int UNUSED written = 0;
466   IADDR UNUSED pc = abuf->addr;
467   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
468
469 {
470   HI tmp_high;
471   HI tmp_low;
472   tmp_low = ADDHI (ANDHI (GET_H_GR (FLD (f_rs)), 65535), ANDHI (GET_H_GR (FLD (f_rt)), 65535));
473   tmp_high = ADDHI (SRLSI (GET_H_GR (FLD (f_rs)), 16), SRLSI (GET_H_GR (FLD (f_rt)), 16));
474   {
475     SI opval = ORSI (SLLSI (tmp_high, 16), tmp_low);
476     SET_H_GR (FLD (f_rd), opval);
477     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
478   }
479 }
480
481 #undef FLD
482 }
483   NEXT (vpc);
484
485   CASE (sem, INSN_AND) : /* and $rd,$rs,$rt */
486 {
487   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
488   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
489 #define FLD(f) abuf->fields.sfmt_mrgb.f
490   int UNUSED written = 0;
491   IADDR UNUSED pc = abuf->addr;
492   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
493
494   {
495     SI opval = ANDSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
496     SET_H_GR (FLD (f_rd), opval);
497     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
498   }
499
500 #undef FLD
501 }
502   NEXT (vpc);
503
504   CASE (sem, INSN_ANDI) : /* andi $rt,$rs,$lo16 */
505 {
506   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
507   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
508 #define FLD(f) abuf->fields.sfmt_addi.f
509   int UNUSED written = 0;
510   IADDR UNUSED pc = abuf->addr;
511   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
512
513   {
514     SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm)));
515     SET_H_GR (FLD (f_rt), opval);
516     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
517   }
518
519 #undef FLD
520 }
521   NEXT (vpc);
522
523   CASE (sem, INSN_ANDOI) : /* andoi $rt,$rs,$lo16 */
524 {
525   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
526   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
527 #define FLD(f) abuf->fields.sfmt_addi.f
528   int UNUSED written = 0;
529   IADDR UNUSED pc = abuf->addr;
530   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
531
532   {
533     SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ORSI (0xffff0000, EXTHISI (TRUNCSIHI (FLD (f_imm)))));
534     SET_H_GR (FLD (f_rt), opval);
535     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
536   }
537
538 #undef FLD
539 }
540   NEXT (vpc);
541
542   CASE (sem, INSN_NOR) : /* nor $rd,$rs,$rt */
543 {
544   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
545   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
546 #define FLD(f) abuf->fields.sfmt_mrgb.f
547   int UNUSED written = 0;
548   IADDR UNUSED pc = abuf->addr;
549   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
550
551   {
552     SI opval = INVSI (ORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt))));
553     SET_H_GR (FLD (f_rd), opval);
554     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
555   }
556
557 #undef FLD
558 }
559   NEXT (vpc);
560
561   CASE (sem, INSN_OR) : /* or $rd,$rs,$rt */
562 {
563   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
564   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
565 #define FLD(f) abuf->fields.sfmt_mrgb.f
566   int UNUSED written = 0;
567   IADDR UNUSED pc = abuf->addr;
568   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
569
570   {
571     SI opval = ORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
572     SET_H_GR (FLD (f_rd), opval);
573     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
574   }
575
576 #undef FLD
577 }
578   NEXT (vpc);
579
580   CASE (sem, INSN_ORI) : /* ori $rt,$rs,$lo16 */
581 {
582   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
583   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
584 #define FLD(f) abuf->fields.sfmt_addi.f
585   int UNUSED written = 0;
586   IADDR UNUSED pc = abuf->addr;
587   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
588
589   {
590     SI opval = ORSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm)));
591     SET_H_GR (FLD (f_rt), opval);
592     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
593   }
594
595 #undef FLD
596 }
597   NEXT (vpc);
598
599   CASE (sem, INSN_RAM) : /* ram $rd,$rt,$shamt,$maskl,$maskr */
600 {
601   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
602   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
603 #define FLD(f) abuf->fields.sfmt_ram.f
604   int UNUSED written = 0;
605   IADDR UNUSED pc = abuf->addr;
606   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
607
608 {
609   {
610     SI opval = RORSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt));
611     SET_H_GR (FLD (f_rd), opval);
612     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
613   }
614   {
615     SI opval = ANDSI (GET_H_GR (FLD (f_rd)), SRLSI (0xffffffff, FLD (f_maskl)));
616     SET_H_GR (FLD (f_rd), opval);
617     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
618   }
619   {
620     SI opval = ANDSI (GET_H_GR (FLD (f_rd)), SLLSI (0xffffffff, FLD (f_rs)));
621     SET_H_GR (FLD (f_rd), opval);
622     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
623   }
624 }
625
626 #undef FLD
627 }
628   NEXT (vpc);
629
630   CASE (sem, INSN_SLL) : /* sll $rd,$rt,$shamt */
631 {
632   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
633   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
634 #define FLD(f) abuf->fields.sfmt_ram.f
635   int UNUSED written = 0;
636   IADDR UNUSED pc = abuf->addr;
637   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
638
639   {
640     SI opval = SLLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt));
641     SET_H_GR (FLD (f_rd), opval);
642     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
643   }
644
645 #undef FLD
646 }
647   NEXT (vpc);
648
649   CASE (sem, INSN_SLLV) : /* sllv $rd,$rt,$rs */
650 {
651   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
652   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
653 #define FLD(f) abuf->fields.sfmt_mrgb.f
654   int UNUSED written = 0;
655   IADDR UNUSED pc = abuf->addr;
656   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
657
658   {
659     SI opval = SLLSI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31));
660     SET_H_GR (FLD (f_rd), opval);
661     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
662   }
663
664 #undef FLD
665 }
666   NEXT (vpc);
667
668   CASE (sem, INSN_SLMV) : /* slmv $rd,$rt,$rs,$shamt */
669 {
670   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
671   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
672 #define FLD(f) abuf->fields.sfmt_ram.f
673   int UNUSED written = 0;
674   IADDR UNUSED pc = abuf->addr;
675   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
676
677   {
678     SI opval = ANDSI (SLLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)), SRLSI (0xffffffff, GET_H_GR (FLD (f_rs))));
679     SET_H_GR (FLD (f_rd), opval);
680     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
681   }
682
683 #undef FLD
684 }
685   NEXT (vpc);
686
687   CASE (sem, INSN_SLT) : /* slt $rd,$rs,$rt */
688 {
689   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
690   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
691 #define FLD(f) abuf->fields.sfmt_mrgb.f
692   int UNUSED written = 0;
693   IADDR UNUSED pc = abuf->addr;
694   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
695
696 if (LTSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
697   {
698     SI opval = 1;
699     SET_H_GR (FLD (f_rd), opval);
700     written |= (1 << 2);
701     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
702   }
703 } else {
704   {
705     SI opval = 0;
706     SET_H_GR (FLD (f_rd), opval);
707     written |= (1 << 2);
708     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
709   }
710 }
711
712   abuf->written = written;
713 #undef FLD
714 }
715   NEXT (vpc);
716
717   CASE (sem, INSN_SLTI) : /* slti $rt,$rs,$imm */
718 {
719   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
720   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
721 #define FLD(f) abuf->fields.sfmt_addi.f
722   int UNUSED written = 0;
723   IADDR UNUSED pc = abuf->addr;
724   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
725
726 if (LTSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))) {
727   {
728     SI opval = 1;
729     SET_H_GR (FLD (f_rt), opval);
730     written |= (1 << 2);
731     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
732   }
733 } else {
734   {
735     SI opval = 0;
736     SET_H_GR (FLD (f_rt), opval);
737     written |= (1 << 2);
738     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
739   }
740 }
741
742   abuf->written = written;
743 #undef FLD
744 }
745   NEXT (vpc);
746
747   CASE (sem, INSN_SLTIU) : /* sltiu $rt,$rs,$imm */
748 {
749   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
750   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
751 #define FLD(f) abuf->fields.sfmt_addi.f
752   int UNUSED written = 0;
753   IADDR UNUSED pc = abuf->addr;
754   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
755
756 if (LTUSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))) {
757   {
758     SI opval = 1;
759     SET_H_GR (FLD (f_rt), opval);
760     written |= (1 << 2);
761     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
762   }
763 } else {
764   {
765     SI opval = 0;
766     SET_H_GR (FLD (f_rt), opval);
767     written |= (1 << 2);
768     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
769   }
770 }
771
772   abuf->written = written;
773 #undef FLD
774 }
775   NEXT (vpc);
776
777   CASE (sem, INSN_SLTU) : /* sltu $rd,$rs,$rt */
778 {
779   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
780   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
781 #define FLD(f) abuf->fields.sfmt_mrgb.f
782   int UNUSED written = 0;
783   IADDR UNUSED pc = abuf->addr;
784   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
785
786 if (LTUSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
787   {
788     SI opval = 1;
789     SET_H_GR (FLD (f_rd), opval);
790     written |= (1 << 2);
791     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
792   }
793 } else {
794   {
795     SI opval = 0;
796     SET_H_GR (FLD (f_rd), opval);
797     written |= (1 << 2);
798     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
799   }
800 }
801
802   abuf->written = written;
803 #undef FLD
804 }
805   NEXT (vpc);
806
807   CASE (sem, INSN_SRA) : /* sra $rd,$rt,$shamt */
808 {
809   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
810   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
811 #define FLD(f) abuf->fields.sfmt_ram.f
812   int UNUSED written = 0;
813   IADDR UNUSED pc = abuf->addr;
814   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
815
816   {
817     SI opval = SRASI (GET_H_GR (FLD (f_rt)), FLD (f_shamt));
818     SET_H_GR (FLD (f_rd), opval);
819     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
820   }
821
822 #undef FLD
823 }
824   NEXT (vpc);
825
826   CASE (sem, INSN_SRAV) : /* srav $rd,$rt,$rs */
827 {
828   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
829   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
830 #define FLD(f) abuf->fields.sfmt_mrgb.f
831   int UNUSED written = 0;
832   IADDR UNUSED pc = abuf->addr;
833   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
834
835   {
836     SI opval = SRASI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31));
837     SET_H_GR (FLD (f_rd), opval);
838     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
839   }
840
841 #undef FLD
842 }
843   NEXT (vpc);
844
845   CASE (sem, INSN_SRL) : /* srl $rd,$rt,$shamt */
846 {
847   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
848   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
849 #define FLD(f) abuf->fields.sfmt_ram.f
850   int UNUSED written = 0;
851   IADDR UNUSED pc = abuf->addr;
852   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
853
854   {
855     SI opval = SRLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt));
856     SET_H_GR (FLD (f_rd), opval);
857     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
858   }
859
860 #undef FLD
861 }
862   NEXT (vpc);
863
864   CASE (sem, INSN_SRLV) : /* srlv $rd,$rt,$rs */
865 {
866   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
867   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
868 #define FLD(f) abuf->fields.sfmt_mrgb.f
869   int UNUSED written = 0;
870   IADDR UNUSED pc = abuf->addr;
871   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
872
873   {
874     SI opval = SRLSI (GET_H_GR (FLD (f_rt)), ANDSI (GET_H_GR (FLD (f_rs)), 31));
875     SET_H_GR (FLD (f_rd), opval);
876     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
877   }
878
879 #undef FLD
880 }
881   NEXT (vpc);
882
883   CASE (sem, INSN_SRMV) : /* srmv $rd,$rt,$rs,$shamt */
884 {
885   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
886   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
887 #define FLD(f) abuf->fields.sfmt_ram.f
888   int UNUSED written = 0;
889   IADDR UNUSED pc = abuf->addr;
890   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
891
892   {
893     SI opval = ANDSI (SRLSI (GET_H_GR (FLD (f_rt)), FLD (f_shamt)), SLLSI (0xffffffff, GET_H_GR (FLD (f_rs))));
894     SET_H_GR (FLD (f_rd), opval);
895     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
896   }
897
898 #undef FLD
899 }
900   NEXT (vpc);
901
902   CASE (sem, INSN_SUB) : /* sub $rd,$rs,$rt */
903 {
904   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
905   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
906 #define FLD(f) abuf->fields.sfmt_mrgb.f
907   int UNUSED written = 0;
908   IADDR UNUSED pc = abuf->addr;
909   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
910
911   {
912     SI opval = SUBSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
913     SET_H_GR (FLD (f_rd), opval);
914     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
915   }
916
917 #undef FLD
918 }
919   NEXT (vpc);
920
921   CASE (sem, INSN_SUBU) : /* subu $rd,$rs,$rt */
922 {
923   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
924   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
925 #define FLD(f) abuf->fields.sfmt_mrgb.f
926   int UNUSED written = 0;
927   IADDR UNUSED pc = abuf->addr;
928   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
929
930   {
931     SI opval = SUBSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
932     SET_H_GR (FLD (f_rd), opval);
933     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
934   }
935
936 #undef FLD
937 }
938   NEXT (vpc);
939
940   CASE (sem, INSN_XOR) : /* xor $rd,$rs,$rt */
941 {
942   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
943   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
944 #define FLD(f) abuf->fields.sfmt_mrgb.f
945   int UNUSED written = 0;
946   IADDR UNUSED pc = abuf->addr;
947   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
948
949   {
950     SI opval = XORSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)));
951     SET_H_GR (FLD (f_rd), opval);
952     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
953   }
954
955 #undef FLD
956 }
957   NEXT (vpc);
958
959   CASE (sem, INSN_XORI) : /* xori $rt,$rs,$lo16 */
960 {
961   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
962   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
963 #define FLD(f) abuf->fields.sfmt_addi.f
964   int UNUSED written = 0;
965   IADDR UNUSED pc = abuf->addr;
966   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
967
968   {
969     SI opval = XORSI (GET_H_GR (FLD (f_rs)), ZEXTSISI (FLD (f_imm)));
970     SET_H_GR (FLD (f_rt), opval);
971     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
972   }
973
974 #undef FLD
975 }
976   NEXT (vpc);
977
978   CASE (sem, INSN_BBI) : /* bbi $rs($bitnum),$offset */
979 {
980   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
981   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
982 #define FLD(f) abuf->fields.sfmt_bbi.f
983   int UNUSED written = 0;
984   IADDR UNUSED pc = abuf->addr;
985   SEM_BRANCH_INIT
986   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
987
988 if (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, FLD (f_rt)))) {
989 {
990   {
991     USI opval = FLD (i_offset);
992     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
993     written |= (1 << 3);
994     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
995   }
996 }
997 }
998
999   abuf->written = written;
1000   SEM_BRANCH_FINI (vpc);
1001 #undef FLD
1002 }
1003   NEXT (vpc);
1004
1005   CASE (sem, INSN_BBIN) : /* bbin $rs($bitnum),$offset */
1006 {
1007   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1008   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1009 #define FLD(f) abuf->fields.sfmt_bbi.f
1010   int UNUSED written = 0;
1011   IADDR UNUSED pc = abuf->addr;
1012   SEM_BRANCH_INIT
1013   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1014
1015 if (NOTSI (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, FLD (f_rt))))) {
1016 {
1017   {
1018     USI opval = FLD (i_offset);
1019     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1020     written |= (1 << 3);
1021     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1022   }
1023 }
1024 }
1025
1026   abuf->written = written;
1027   SEM_BRANCH_FINI (vpc);
1028 #undef FLD
1029 }
1030   NEXT (vpc);
1031
1032   CASE (sem, INSN_BBV) : /* bbv $rs,$rt,$offset */
1033 {
1034   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1035   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1036 #define FLD(f) abuf->fields.sfmt_bbi.f
1037   int UNUSED written = 0;
1038   IADDR UNUSED pc = abuf->addr;
1039   SEM_BRANCH_INIT
1040   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1041
1042 if (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, ANDSI (GET_H_GR (FLD (f_rt)), 31)))) {
1043 {
1044   {
1045     USI opval = FLD (i_offset);
1046     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1047     written |= (1 << 3);
1048     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1049   }
1050 }
1051 }
1052
1053   abuf->written = written;
1054   SEM_BRANCH_FINI (vpc);
1055 #undef FLD
1056 }
1057   NEXT (vpc);
1058
1059   CASE (sem, INSN_BBVN) : /* bbvn $rs,$rt,$offset */
1060 {
1061   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1062   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1063 #define FLD(f) abuf->fields.sfmt_bbi.f
1064   int UNUSED written = 0;
1065   IADDR UNUSED pc = abuf->addr;
1066   SEM_BRANCH_INIT
1067   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1068
1069 if (NOTSI (ANDSI (GET_H_GR (FLD (f_rs)), SLLSI (1, ANDSI (GET_H_GR (FLD (f_rt)), 31))))) {
1070 {
1071   {
1072     USI opval = FLD (i_offset);
1073     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1074     written |= (1 << 3);
1075     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1076   }
1077 }
1078 }
1079
1080   abuf->written = written;
1081   SEM_BRANCH_FINI (vpc);
1082 #undef FLD
1083 }
1084   NEXT (vpc);
1085
1086   CASE (sem, INSN_BEQ) : /* beq $rs,$rt,$offset */
1087 {
1088   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1089   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1090 #define FLD(f) abuf->fields.sfmt_bbi.f
1091   int UNUSED written = 0;
1092   IADDR UNUSED pc = abuf->addr;
1093   SEM_BRANCH_INIT
1094   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1095
1096 if (EQSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
1097 {
1098   {
1099     USI opval = FLD (i_offset);
1100     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1101     written |= (1 << 3);
1102     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1103   }
1104 }
1105 }
1106
1107   abuf->written = written;
1108   SEM_BRANCH_FINI (vpc);
1109 #undef FLD
1110 }
1111   NEXT (vpc);
1112
1113   CASE (sem, INSN_BEQL) : /* beql $rs,$rt,$offset */
1114 {
1115   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1116   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1117 #define FLD(f) abuf->fields.sfmt_bbi.f
1118   int UNUSED written = 0;
1119   IADDR UNUSED pc = abuf->addr;
1120   SEM_BRANCH_INIT
1121   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1122
1123 if (EQSI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
1124 {
1125   {
1126     USI opval = FLD (i_offset);
1127     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1128     written |= (1 << 3);
1129     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1130   }
1131 }
1132 } else {
1133 if (1)
1134   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1135 }
1136
1137   abuf->written = written;
1138   SEM_BRANCH_FINI (vpc);
1139 #undef FLD
1140 }
1141   NEXT (vpc);
1142
1143   CASE (sem, INSN_BGEZ) : /* bgez $rs,$offset */
1144 {
1145   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1146   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1147 #define FLD(f) abuf->fields.sfmt_bbi.f
1148   int UNUSED written = 0;
1149   IADDR UNUSED pc = abuf->addr;
1150   SEM_BRANCH_INIT
1151   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1152
1153 if (GESI (GET_H_GR (FLD (f_rs)), 0)) {
1154 {
1155   {
1156     USI opval = FLD (i_offset);
1157     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1158     written |= (1 << 2);
1159     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1160   }
1161 }
1162 }
1163
1164   abuf->written = written;
1165   SEM_BRANCH_FINI (vpc);
1166 #undef FLD
1167 }
1168   NEXT (vpc);
1169
1170   CASE (sem, INSN_BGEZAL) : /* bgezal $rs,$offset */
1171 {
1172   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1173   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1174 #define FLD(f) abuf->fields.sfmt_bbi.f
1175   int UNUSED written = 0;
1176   IADDR UNUSED pc = abuf->addr;
1177   SEM_BRANCH_INIT
1178   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1179
1180 if (GESI (GET_H_GR (FLD (f_rs)), 0)) {
1181 {
1182   {
1183     SI opval = ADDSI (pc, 8);
1184     SET_H_GR (((UINT) 31), opval);
1185     written |= (1 << 3);
1186     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1187   }
1188 {
1189   {
1190     USI opval = FLD (i_offset);
1191     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1192     written |= (1 << 4);
1193     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1194   }
1195 }
1196 }
1197 }
1198
1199   abuf->written = written;
1200   SEM_BRANCH_FINI (vpc);
1201 #undef FLD
1202 }
1203   NEXT (vpc);
1204
1205   CASE (sem, INSN_BGEZALL) : /* bgezall $rs,$offset */
1206 {
1207   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1208   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1209 #define FLD(f) abuf->fields.sfmt_bbi.f
1210   int UNUSED written = 0;
1211   IADDR UNUSED pc = abuf->addr;
1212   SEM_BRANCH_INIT
1213   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1214
1215 if (GESI (GET_H_GR (FLD (f_rs)), 0)) {
1216 {
1217   {
1218     SI opval = ADDSI (pc, 8);
1219     SET_H_GR (((UINT) 31), opval);
1220     written |= (1 << 3);
1221     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1222   }
1223 {
1224   {
1225     USI opval = FLD (i_offset);
1226     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1227     written |= (1 << 4);
1228     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1229   }
1230 }
1231 }
1232 } else {
1233 if (1)
1234   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1235 }
1236
1237   abuf->written = written;
1238   SEM_BRANCH_FINI (vpc);
1239 #undef FLD
1240 }
1241   NEXT (vpc);
1242
1243   CASE (sem, INSN_BGEZL) : /* bgezl $rs,$offset */
1244 {
1245   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1246   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1247 #define FLD(f) abuf->fields.sfmt_bbi.f
1248   int UNUSED written = 0;
1249   IADDR UNUSED pc = abuf->addr;
1250   SEM_BRANCH_INIT
1251   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1252
1253 if (GESI (GET_H_GR (FLD (f_rs)), 0)) {
1254 {
1255   {
1256     USI opval = FLD (i_offset);
1257     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1258     written |= (1 << 2);
1259     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1260   }
1261 }
1262 } else {
1263 if (1)
1264   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1265 }
1266
1267   abuf->written = written;
1268   SEM_BRANCH_FINI (vpc);
1269 #undef FLD
1270 }
1271   NEXT (vpc);
1272
1273   CASE (sem, INSN_BLTZ) : /* bltz $rs,$offset */
1274 {
1275   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1276   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1277 #define FLD(f) abuf->fields.sfmt_bbi.f
1278   int UNUSED written = 0;
1279   IADDR UNUSED pc = abuf->addr;
1280   SEM_BRANCH_INIT
1281   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1282
1283 if (LTSI (GET_H_GR (FLD (f_rs)), 0)) {
1284 {
1285   {
1286     USI opval = FLD (i_offset);
1287     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1288     written |= (1 << 2);
1289     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1290   }
1291 }
1292 }
1293
1294   abuf->written = written;
1295   SEM_BRANCH_FINI (vpc);
1296 #undef FLD
1297 }
1298   NEXT (vpc);
1299
1300   CASE (sem, INSN_BLTZL) : /* bltzl $rs,$offset */
1301 {
1302   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1303   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1304 #define FLD(f) abuf->fields.sfmt_bbi.f
1305   int UNUSED written = 0;
1306   IADDR UNUSED pc = abuf->addr;
1307   SEM_BRANCH_INIT
1308   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1309
1310 if (LTSI (GET_H_GR (FLD (f_rs)), 0)) {
1311 {
1312   {
1313     USI opval = FLD (i_offset);
1314     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1315     written |= (1 << 2);
1316     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1317   }
1318 }
1319 } else {
1320 if (1)
1321   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1322 }
1323
1324   abuf->written = written;
1325   SEM_BRANCH_FINI (vpc);
1326 #undef FLD
1327 }
1328   NEXT (vpc);
1329
1330   CASE (sem, INSN_BLTZAL) : /* bltzal $rs,$offset */
1331 {
1332   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1333   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1334 #define FLD(f) abuf->fields.sfmt_bbi.f
1335   int UNUSED written = 0;
1336   IADDR UNUSED pc = abuf->addr;
1337   SEM_BRANCH_INIT
1338   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1339
1340 if (LTSI (GET_H_GR (FLD (f_rs)), 0)) {
1341 {
1342   {
1343     SI opval = ADDSI (pc, 8);
1344     SET_H_GR (((UINT) 31), opval);
1345     written |= (1 << 3);
1346     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1347   }
1348 {
1349   {
1350     USI opval = FLD (i_offset);
1351     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1352     written |= (1 << 4);
1353     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1354   }
1355 }
1356 }
1357 }
1358
1359   abuf->written = written;
1360   SEM_BRANCH_FINI (vpc);
1361 #undef FLD
1362 }
1363   NEXT (vpc);
1364
1365   CASE (sem, INSN_BLTZALL) : /* bltzall $rs,$offset */
1366 {
1367   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1368   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1369 #define FLD(f) abuf->fields.sfmt_bbi.f
1370   int UNUSED written = 0;
1371   IADDR UNUSED pc = abuf->addr;
1372   SEM_BRANCH_INIT
1373   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1374
1375 if (LTSI (GET_H_GR (FLD (f_rs)), 0)) {
1376 {
1377   {
1378     SI opval = ADDSI (pc, 8);
1379     SET_H_GR (((UINT) 31), opval);
1380     written |= (1 << 3);
1381     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1382   }
1383 {
1384   {
1385     USI opval = FLD (i_offset);
1386     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1387     written |= (1 << 4);
1388     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1389   }
1390 }
1391 }
1392 } else {
1393 if (1)
1394   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1395 }
1396
1397   abuf->written = written;
1398   SEM_BRANCH_FINI (vpc);
1399 #undef FLD
1400 }
1401   NEXT (vpc);
1402
1403   CASE (sem, INSN_BMB0) : /* bmb0 $rs,$rt,$offset */
1404 {
1405   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1406   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1407 #define FLD(f) abuf->fields.sfmt_bbi.f
1408   int UNUSED written = 0;
1409   IADDR UNUSED pc = abuf->addr;
1410   SEM_BRANCH_INIT
1411   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1412
1413 if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 255), ANDSI (GET_H_GR (FLD (f_rt)), 255))) {
1414 {
1415   {
1416     USI opval = FLD (i_offset);
1417     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1418     written |= (1 << 3);
1419     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1420   }
1421 }
1422 }
1423
1424   abuf->written = written;
1425   SEM_BRANCH_FINI (vpc);
1426 #undef FLD
1427 }
1428   NEXT (vpc);
1429
1430   CASE (sem, INSN_BMB1) : /* bmb1 $rs,$rt,$offset */
1431 {
1432   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1433   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1434 #define FLD(f) abuf->fields.sfmt_bbi.f
1435   int UNUSED written = 0;
1436   IADDR UNUSED pc = abuf->addr;
1437   SEM_BRANCH_INIT
1438   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1439
1440 if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 65280), ANDSI (GET_H_GR (FLD (f_rt)), 65280))) {
1441 {
1442   {
1443     USI opval = FLD (i_offset);
1444     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1445     written |= (1 << 3);
1446     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1447   }
1448 }
1449 }
1450
1451   abuf->written = written;
1452   SEM_BRANCH_FINI (vpc);
1453 #undef FLD
1454 }
1455   NEXT (vpc);
1456
1457   CASE (sem, INSN_BMB2) : /* bmb2 $rs,$rt,$offset */
1458 {
1459   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1460   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1461 #define FLD(f) abuf->fields.sfmt_bbi.f
1462   int UNUSED written = 0;
1463   IADDR UNUSED pc = abuf->addr;
1464   SEM_BRANCH_INIT
1465   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1466
1467 if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 16711680), ANDSI (GET_H_GR (FLD (f_rt)), 16711680))) {
1468 {
1469   {
1470     USI opval = FLD (i_offset);
1471     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1472     written |= (1 << 3);
1473     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1474   }
1475 }
1476 }
1477
1478   abuf->written = written;
1479   SEM_BRANCH_FINI (vpc);
1480 #undef FLD
1481 }
1482   NEXT (vpc);
1483
1484   CASE (sem, INSN_BMB3) : /* bmb3 $rs,$rt,$offset */
1485 {
1486   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1487   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1488 #define FLD(f) abuf->fields.sfmt_bbi.f
1489   int UNUSED written = 0;
1490   IADDR UNUSED pc = abuf->addr;
1491   SEM_BRANCH_INIT
1492   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1493
1494 if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000), ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000))) {
1495 {
1496   {
1497     USI opval = FLD (i_offset);
1498     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1499     written |= (1 << 3);
1500     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1501   }
1502 }
1503 }
1504
1505   abuf->written = written;
1506   SEM_BRANCH_FINI (vpc);
1507 #undef FLD
1508 }
1509   NEXT (vpc);
1510
1511   CASE (sem, INSN_BNE) : /* bne $rs,$rt,$offset */
1512 {
1513   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1514   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1515 #define FLD(f) abuf->fields.sfmt_bbi.f
1516   int UNUSED written = 0;
1517   IADDR UNUSED pc = abuf->addr;
1518   SEM_BRANCH_INIT
1519   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1520
1521 if (NESI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
1522 {
1523   {
1524     USI opval = FLD (i_offset);
1525     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1526     written |= (1 << 3);
1527     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1528   }
1529 }
1530 }
1531
1532   abuf->written = written;
1533   SEM_BRANCH_FINI (vpc);
1534 #undef FLD
1535 }
1536   NEXT (vpc);
1537
1538   CASE (sem, INSN_BNEL) : /* bnel $rs,$rt,$offset */
1539 {
1540   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1541   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1542 #define FLD(f) abuf->fields.sfmt_bbi.f
1543   int UNUSED written = 0;
1544   IADDR UNUSED pc = abuf->addr;
1545   SEM_BRANCH_INIT
1546   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1547
1548 if (NESI (GET_H_GR (FLD (f_rs)), GET_H_GR (FLD (f_rt)))) {
1549 {
1550   {
1551     USI opval = FLD (i_offset);
1552     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1553     written |= (1 << 3);
1554     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1555   }
1556 }
1557 } else {
1558 if (1)
1559   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1560 }
1561
1562   abuf->written = written;
1563   SEM_BRANCH_FINI (vpc);
1564 #undef FLD
1565 }
1566   NEXT (vpc);
1567
1568   CASE (sem, INSN_JALR) : /* jalr $rd,$rs */
1569 {
1570   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1571   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1572 #define FLD(f) abuf->fields.sfmt_mrgb.f
1573   int UNUSED written = 0;
1574   IADDR UNUSED pc = abuf->addr;
1575   SEM_BRANCH_INIT
1576   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1577
1578 {
1579 {
1580   {
1581     SI opval = ADDSI (pc, 8);
1582     SET_H_GR (FLD (f_rd), opval);
1583     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1584   }
1585   {
1586     USI opval = GET_H_GR (FLD (f_rs));
1587     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1588     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1589   }
1590 }
1591 }
1592
1593   SEM_BRANCH_FINI (vpc);
1594 #undef FLD
1595 }
1596   NEXT (vpc);
1597
1598   CASE (sem, INSN_JR) : /* jr $rs */
1599 {
1600   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1601   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1602 #define FLD(f) abuf->fields.sfmt_bbi.f
1603   int UNUSED written = 0;
1604   IADDR UNUSED pc = abuf->addr;
1605   SEM_BRANCH_INIT
1606   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1607
1608 {
1609   {
1610     USI opval = GET_H_GR (FLD (f_rs));
1611     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1612     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1613   }
1614 }
1615
1616   SEM_BRANCH_FINI (vpc);
1617 #undef FLD
1618 }
1619   NEXT (vpc);
1620
1621   CASE (sem, INSN_LB) : /* lb $rt,$lo16($base) */
1622 {
1623   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1624   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1625 #define FLD(f) abuf->fields.sfmt_addi.f
1626   int UNUSED written = 0;
1627   IADDR UNUSED pc = abuf->addr;
1628   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1629
1630   {
1631     SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
1632     SET_H_GR (FLD (f_rt), opval);
1633     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1634   }
1635
1636 #undef FLD
1637 }
1638   NEXT (vpc);
1639
1640   CASE (sem, INSN_LBU) : /* lbu $rt,$lo16($base) */
1641 {
1642   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1643   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1644 #define FLD(f) abuf->fields.sfmt_addi.f
1645   int UNUSED written = 0;
1646   IADDR UNUSED pc = abuf->addr;
1647   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1648
1649   {
1650     SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
1651     SET_H_GR (FLD (f_rt), opval);
1652     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1653   }
1654
1655 #undef FLD
1656 }
1657   NEXT (vpc);
1658
1659   CASE (sem, INSN_LH) : /* lh $rt,$lo16($base) */
1660 {
1661   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1662   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1663 #define FLD(f) abuf->fields.sfmt_addi.f
1664   int UNUSED written = 0;
1665   IADDR UNUSED pc = abuf->addr;
1666   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1667
1668   {
1669     SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
1670     SET_H_GR (FLD (f_rt), opval);
1671     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1672   }
1673
1674 #undef FLD
1675 }
1676   NEXT (vpc);
1677
1678   CASE (sem, INSN_LHU) : /* lhu $rt,$lo16($base) */
1679 {
1680   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1681   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1682 #define FLD(f) abuf->fields.sfmt_addi.f
1683   int UNUSED written = 0;
1684   IADDR UNUSED pc = abuf->addr;
1685   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1686
1687   {
1688     SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
1689     SET_H_GR (FLD (f_rt), opval);
1690     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1691   }
1692
1693 #undef FLD
1694 }
1695   NEXT (vpc);
1696
1697   CASE (sem, INSN_LUI) : /* lui $rt,$hi16 */
1698 {
1699   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1700   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1701 #define FLD(f) abuf->fields.sfmt_addi.f
1702   int UNUSED written = 0;
1703   IADDR UNUSED pc = abuf->addr;
1704   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1705
1706   {
1707     SI opval = SLLSI (FLD (f_imm), 16);
1708     SET_H_GR (FLD (f_rt), opval);
1709     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1710   }
1711
1712 #undef FLD
1713 }
1714   NEXT (vpc);
1715
1716   CASE (sem, INSN_LW) : /* lw $rt,$lo16($base) */
1717 {
1718   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1719   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1720 #define FLD(f) abuf->fields.sfmt_addi.f
1721   int UNUSED written = 0;
1722   IADDR UNUSED pc = abuf->addr;
1723   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1724
1725   {
1726     SI opval = GETMEMSI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))));
1727     SET_H_GR (FLD (f_rt), opval);
1728     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1729   }
1730
1731 #undef FLD
1732 }
1733   NEXT (vpc);
1734
1735   CASE (sem, INSN_SB) : /* sb $rt,$lo16($base) */
1736 {
1737   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1738   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1739 #define FLD(f) abuf->fields.sfmt_addi.f
1740   int UNUSED written = 0;
1741   IADDR UNUSED pc = abuf->addr;
1742   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1743
1744   {
1745     QI opval = ANDQI (GET_H_GR (FLD (f_rt)), 255);
1746     SETMEMQI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1747     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1748   }
1749
1750 #undef FLD
1751 }
1752   NEXT (vpc);
1753
1754   CASE (sem, INSN_SH) : /* sh $rt,$lo16($base) */
1755 {
1756   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1757   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1758 #define FLD(f) abuf->fields.sfmt_addi.f
1759   int UNUSED written = 0;
1760   IADDR UNUSED pc = abuf->addr;
1761   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1762
1763   {
1764     HI opval = ANDHI (GET_H_GR (FLD (f_rt)), 65535);
1765     SETMEMHI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1766     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1767   }
1768
1769 #undef FLD
1770 }
1771   NEXT (vpc);
1772
1773   CASE (sem, INSN_SW) : /* sw $rt,$lo16($base) */
1774 {
1775   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1776   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1777 #define FLD(f) abuf->fields.sfmt_addi.f
1778   int UNUSED written = 0;
1779   IADDR UNUSED pc = abuf->addr;
1780   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1781
1782   {
1783     SI opval = GET_H_GR (FLD (f_rt));
1784     SETMEMSI (current_cpu, pc, ADDSI (GET_H_GR (FLD (f_rs)), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1785     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1786   }
1787
1788 #undef FLD
1789 }
1790   NEXT (vpc);
1791
1792   CASE (sem, INSN_BREAK) : /* break */
1793 {
1794   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1795   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1796 #define FLD(f) abuf->fields.sfmt_empty.f
1797   int UNUSED written = 0;
1798   IADDR UNUSED pc = abuf->addr;
1799   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1800
1801 do_break (current_cpu, pc);
1802
1803 #undef FLD
1804 }
1805   NEXT (vpc);
1806
1807   CASE (sem, INSN_SYSCALL) : /* syscall */
1808 {
1809   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1810   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1811 #define FLD(f) abuf->fields.sfmt_empty.f
1812   int UNUSED written = 0;
1813   IADDR UNUSED pc = abuf->addr;
1814   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1815
1816 do_syscall (current_cpu);
1817
1818 #undef FLD
1819 }
1820   NEXT (vpc);
1821
1822   CASE (sem, INSN_ANDOUI) : /* andoui $rt,$rs,$hi16 */
1823 {
1824   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1825   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1826 #define FLD(f) abuf->fields.sfmt_addi.f
1827   int UNUSED written = 0;
1828   IADDR UNUSED pc = abuf->addr;
1829   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1830
1831   {
1832     SI opval = ANDSI (GET_H_GR (FLD (f_rs)), ORSI (SLLSI (FLD (f_imm), 16), 65535));
1833     SET_H_GR (FLD (f_rt), opval);
1834     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1835   }
1836
1837 #undef FLD
1838 }
1839   NEXT (vpc);
1840
1841   CASE (sem, INSN_ORUI) : /* orui $rt,$rs,$hi16 */
1842 {
1843   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1844   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1845 #define FLD(f) abuf->fields.sfmt_addi.f
1846   int UNUSED written = 0;
1847   IADDR UNUSED pc = abuf->addr;
1848   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1849
1850   {
1851     SI opval = ORSI (GET_H_GR (FLD (f_rs)), SLLSI (FLD (f_imm), 16));
1852     SET_H_GR (FLD (f_rt), opval);
1853     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1854   }
1855
1856 #undef FLD
1857 }
1858   NEXT (vpc);
1859
1860   CASE (sem, INSN_BGTZ) : /* bgtz $rs,$offset */
1861 {
1862   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1863   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1864 #define FLD(f) abuf->fields.sfmt_bbi.f
1865   int UNUSED written = 0;
1866   IADDR UNUSED pc = abuf->addr;
1867   SEM_BRANCH_INIT
1868   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1869
1870 if (GTSI (GET_H_GR (FLD (f_rs)), 0)) {
1871 {
1872   {
1873     USI opval = FLD (i_offset);
1874     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1875     written |= (1 << 2);
1876     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1877   }
1878 }
1879 }
1880
1881   abuf->written = written;
1882   SEM_BRANCH_FINI (vpc);
1883 #undef FLD
1884 }
1885   NEXT (vpc);
1886
1887   CASE (sem, INSN_BGTZL) : /* bgtzl $rs,$offset */
1888 {
1889   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1890   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1891 #define FLD(f) abuf->fields.sfmt_bbi.f
1892   int UNUSED written = 0;
1893   IADDR UNUSED pc = abuf->addr;
1894   SEM_BRANCH_INIT
1895   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1896
1897 if (GTSI (GET_H_GR (FLD (f_rs)), 0)) {
1898 {
1899   {
1900     USI opval = FLD (i_offset);
1901     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1902     written |= (1 << 2);
1903     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1904   }
1905 }
1906 } else {
1907 if (1)
1908   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1909 }
1910
1911   abuf->written = written;
1912   SEM_BRANCH_FINI (vpc);
1913 #undef FLD
1914 }
1915   NEXT (vpc);
1916
1917   CASE (sem, INSN_BLEZ) : /* blez $rs,$offset */
1918 {
1919   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1920   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1921 #define FLD(f) abuf->fields.sfmt_bbi.f
1922   int UNUSED written = 0;
1923   IADDR UNUSED pc = abuf->addr;
1924   SEM_BRANCH_INIT
1925   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1926
1927 if (LESI (GET_H_GR (FLD (f_rs)), 0)) {
1928 {
1929   {
1930     USI opval = FLD (i_offset);
1931     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1932     written |= (1 << 2);
1933     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1934   }
1935 }
1936 }
1937
1938   abuf->written = written;
1939   SEM_BRANCH_FINI (vpc);
1940 #undef FLD
1941 }
1942   NEXT (vpc);
1943
1944   CASE (sem, INSN_BLEZL) : /* blezl $rs,$offset */
1945 {
1946   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1947   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1948 #define FLD(f) abuf->fields.sfmt_bbi.f
1949   int UNUSED written = 0;
1950   IADDR UNUSED pc = abuf->addr;
1951   SEM_BRANCH_INIT
1952   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1953
1954 if (LESI (GET_H_GR (FLD (f_rs)), 0)) {
1955 {
1956   {
1957     USI opval = FLD (i_offset);
1958     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
1959     written |= (1 << 2);
1960     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1961   }
1962 }
1963 } else {
1964 if (1)
1965   SEM_SKIP_INSN (current_cpu, sem_arg, vpc);
1966 }
1967
1968   abuf->written = written;
1969   SEM_BRANCH_FINI (vpc);
1970 #undef FLD
1971 }
1972   NEXT (vpc);
1973
1974   CASE (sem, INSN_MRGB) : /* mrgb $rd,$rs,$rt,$mask */
1975 {
1976   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1977   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1978 #define FLD(f) abuf->fields.sfmt_mrgb.f
1979   int UNUSED written = 0;
1980   IADDR UNUSED pc = abuf->addr;
1981   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1982
1983 {
1984   SI tmp_temp;
1985 if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 0)))) {
1986   tmp_temp = ANDSI (GET_H_GR (FLD (f_rs)), 255);
1987 } else {
1988   tmp_temp = ANDSI (GET_H_GR (FLD (f_rt)), 255);
1989 }
1990 if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 1)))) {
1991   tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 65280));
1992 } else {
1993   tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 65280));
1994 }
1995 if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 2)))) {
1996   tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 16711680));
1997 } else {
1998   tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 16711680));
1999 }
2000 if (NOTSI (ANDSI (FLD (f_mask), SLLSI (1, 3)))) {
2001   tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000));
2002 } else {
2003   tmp_temp = ORSI (tmp_temp, ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000));
2004 }
2005   {
2006     SI opval = tmp_temp;
2007     SET_H_GR (FLD (f_rd), opval);
2008     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2009   }
2010 }
2011
2012 #undef FLD
2013 }
2014   NEXT (vpc);
2015
2016   CASE (sem, INSN_BCTXT) : /* bctxt $rs,$offset */
2017 {
2018   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2019   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2020 #define FLD(f) abuf->fields.sfmt_empty.f
2021   int UNUSED written = 0;
2022   IADDR UNUSED pc = abuf->addr;
2023   SEM_BRANCH_INIT
2024   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2025
2026 ((void) 0); /*nop*/
2027
2028   SEM_BRANCH_FINI (vpc);
2029 #undef FLD
2030 }
2031   NEXT (vpc);
2032
2033   CASE (sem, INSN_BC0F) : /* bc0f $offset */
2034 {
2035   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2036   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2037 #define FLD(f) abuf->fields.sfmt_empty.f
2038   int UNUSED written = 0;
2039   IADDR UNUSED pc = abuf->addr;
2040   SEM_BRANCH_INIT
2041   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2042
2043 ((void) 0); /*nop*/
2044
2045   SEM_BRANCH_FINI (vpc);
2046 #undef FLD
2047 }
2048   NEXT (vpc);
2049
2050   CASE (sem, INSN_BC0FL) : /* bc0fl $offset */
2051 {
2052   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2053   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2054 #define FLD(f) abuf->fields.sfmt_empty.f
2055   int UNUSED written = 0;
2056   IADDR UNUSED pc = abuf->addr;
2057   SEM_BRANCH_INIT
2058   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2059
2060 ((void) 0); /*nop*/
2061
2062   SEM_BRANCH_FINI (vpc);
2063 #undef FLD
2064 }
2065   NEXT (vpc);
2066
2067   CASE (sem, INSN_BC3F) : /* bc3f $offset */
2068 {
2069   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2070   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2071 #define FLD(f) abuf->fields.sfmt_empty.f
2072   int UNUSED written = 0;
2073   IADDR UNUSED pc = abuf->addr;
2074   SEM_BRANCH_INIT
2075   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2076
2077 ((void) 0); /*nop*/
2078
2079   SEM_BRANCH_FINI (vpc);
2080 #undef FLD
2081 }
2082   NEXT (vpc);
2083
2084   CASE (sem, INSN_BC3FL) : /* bc3fl $offset */
2085 {
2086   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2087   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2088 #define FLD(f) abuf->fields.sfmt_empty.f
2089   int UNUSED written = 0;
2090   IADDR UNUSED pc = abuf->addr;
2091   SEM_BRANCH_INIT
2092   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2093
2094 ((void) 0); /*nop*/
2095
2096   SEM_BRANCH_FINI (vpc);
2097 #undef FLD
2098 }
2099   NEXT (vpc);
2100
2101   CASE (sem, INSN_BC0T) : /* bc0t $offset */
2102 {
2103   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2104   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2105 #define FLD(f) abuf->fields.sfmt_empty.f
2106   int UNUSED written = 0;
2107   IADDR UNUSED pc = abuf->addr;
2108   SEM_BRANCH_INIT
2109   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2110
2111 ((void) 0); /*nop*/
2112
2113   SEM_BRANCH_FINI (vpc);
2114 #undef FLD
2115 }
2116   NEXT (vpc);
2117
2118   CASE (sem, INSN_BC0TL) : /* bc0tl $offset */
2119 {
2120   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2121   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2122 #define FLD(f) abuf->fields.sfmt_empty.f
2123   int UNUSED written = 0;
2124   IADDR UNUSED pc = abuf->addr;
2125   SEM_BRANCH_INIT
2126   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2127
2128 ((void) 0); /*nop*/
2129
2130   SEM_BRANCH_FINI (vpc);
2131 #undef FLD
2132 }
2133   NEXT (vpc);
2134
2135   CASE (sem, INSN_BC3T) : /* bc3t $offset */
2136 {
2137   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2138   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2139 #define FLD(f) abuf->fields.sfmt_empty.f
2140   int UNUSED written = 0;
2141   IADDR UNUSED pc = abuf->addr;
2142   SEM_BRANCH_INIT
2143   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2144
2145 ((void) 0); /*nop*/
2146
2147   SEM_BRANCH_FINI (vpc);
2148 #undef FLD
2149 }
2150   NEXT (vpc);
2151
2152   CASE (sem, INSN_BC3TL) : /* bc3tl $offset */
2153 {
2154   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2155   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2156 #define FLD(f) abuf->fields.sfmt_empty.f
2157   int UNUSED written = 0;
2158   IADDR UNUSED pc = abuf->addr;
2159   SEM_BRANCH_INIT
2160   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2161
2162 ((void) 0); /*nop*/
2163
2164   SEM_BRANCH_FINI (vpc);
2165 #undef FLD
2166 }
2167   NEXT (vpc);
2168
2169   CASE (sem, INSN_CFC0) : /* cfc0 $rt,$rd */
2170 {
2171   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2172   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2173 #define FLD(f) abuf->fields.sfmt_empty.f
2174   int UNUSED written = 0;
2175   IADDR UNUSED pc = abuf->addr;
2176   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2177
2178 ((void) 0); /*nop*/
2179
2180 #undef FLD
2181 }
2182   NEXT (vpc);
2183
2184   CASE (sem, INSN_CFC1) : /* cfc1 $rt,$rd */
2185 {
2186   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2187   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2188 #define FLD(f) abuf->fields.sfmt_empty.f
2189   int UNUSED written = 0;
2190   IADDR UNUSED pc = abuf->addr;
2191   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2192
2193 ((void) 0); /*nop*/
2194
2195 #undef FLD
2196 }
2197   NEXT (vpc);
2198
2199   CASE (sem, INSN_CFC2) : /* cfc2 $rt,$rd */
2200 {
2201   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2202   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2203 #define FLD(f) abuf->fields.sfmt_empty.f
2204   int UNUSED written = 0;
2205   IADDR UNUSED pc = abuf->addr;
2206   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2207
2208 ((void) 0); /*nop*/
2209
2210 #undef FLD
2211 }
2212   NEXT (vpc);
2213
2214   CASE (sem, INSN_CFC3) : /* cfc3 $rt,$rd */
2215 {
2216   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2217   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2218 #define FLD(f) abuf->fields.sfmt_empty.f
2219   int UNUSED written = 0;
2220   IADDR UNUSED pc = abuf->addr;
2221   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2222
2223 ((void) 0); /*nop*/
2224
2225 #undef FLD
2226 }
2227   NEXT (vpc);
2228
2229   CASE (sem, INSN_CHKHDR) : /* chkhdr $rd,$rt */
2230 {
2231   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2232   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2233 #define FLD(f) abuf->fields.sfmt_empty.f
2234   int UNUSED written = 0;
2235   IADDR UNUSED pc = abuf->addr;
2236   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2237
2238 ((void) 0); /*nop*/
2239
2240 #undef FLD
2241 }
2242   NEXT (vpc);
2243
2244   CASE (sem, INSN_CTC0) : /* ctc0 $rt,$rd */
2245 {
2246   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2247   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2248 #define FLD(f) abuf->fields.sfmt_empty.f
2249   int UNUSED written = 0;
2250   IADDR UNUSED pc = abuf->addr;
2251   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2252
2253 ((void) 0); /*nop*/
2254
2255 #undef FLD
2256 }
2257   NEXT (vpc);
2258
2259   CASE (sem, INSN_CTC1) : /* ctc1 $rt,$rd */
2260 {
2261   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2262   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2263 #define FLD(f) abuf->fields.sfmt_empty.f
2264   int UNUSED written = 0;
2265   IADDR UNUSED pc = abuf->addr;
2266   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2267
2268 ((void) 0); /*nop*/
2269
2270 #undef FLD
2271 }
2272   NEXT (vpc);
2273
2274   CASE (sem, INSN_CTC2) : /* ctc2 $rt,$rd */
2275 {
2276   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2277   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2278 #define FLD(f) abuf->fields.sfmt_empty.f
2279   int UNUSED written = 0;
2280   IADDR UNUSED pc = abuf->addr;
2281   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2282
2283 ((void) 0); /*nop*/
2284
2285 #undef FLD
2286 }
2287   NEXT (vpc);
2288
2289   CASE (sem, INSN_CTC3) : /* ctc3 $rt,$rd */
2290 {
2291   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2292   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2293 #define FLD(f) abuf->fields.sfmt_empty.f
2294   int UNUSED written = 0;
2295   IADDR UNUSED pc = abuf->addr;
2296   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2297
2298 ((void) 0); /*nop*/
2299
2300 #undef FLD
2301 }
2302   NEXT (vpc);
2303
2304   CASE (sem, INSN_JCR) : /* jcr $rs */
2305 {
2306   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2307   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2308 #define FLD(f) abuf->fields.sfmt_empty.f
2309   int UNUSED written = 0;
2310   IADDR UNUSED pc = abuf->addr;
2311   SEM_BRANCH_INIT
2312   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2313
2314 ((void) 0); /*nop*/
2315
2316   SEM_BRANCH_FINI (vpc);
2317 #undef FLD
2318 }
2319   NEXT (vpc);
2320
2321   CASE (sem, INSN_LUC32) : /* luc32 $rt,$rd */
2322 {
2323   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2324   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2325 #define FLD(f) abuf->fields.sfmt_empty.f
2326   int UNUSED written = 0;
2327   IADDR UNUSED pc = abuf->addr;
2328   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2329
2330 ((void) 0); /*nop*/
2331
2332 #undef FLD
2333 }
2334   NEXT (vpc);
2335
2336   CASE (sem, INSN_LUC32L) : /* luc32l $rt,$rd */
2337 {
2338   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2339   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2340 #define FLD(f) abuf->fields.sfmt_empty.f
2341   int UNUSED written = 0;
2342   IADDR UNUSED pc = abuf->addr;
2343   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2344
2345 ((void) 0); /*nop*/
2346
2347 #undef FLD
2348 }
2349   NEXT (vpc);
2350
2351   CASE (sem, INSN_LUC64) : /* luc64 $rt,$rd */
2352 {
2353   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2354   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2355 #define FLD(f) abuf->fields.sfmt_empty.f
2356   int UNUSED written = 0;
2357   IADDR UNUSED pc = abuf->addr;
2358   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2359
2360 ((void) 0); /*nop*/
2361
2362 #undef FLD
2363 }
2364   NEXT (vpc);
2365
2366   CASE (sem, INSN_LUC64L) : /* luc64l $rt,$rd */
2367 {
2368   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2369   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2370 #define FLD(f) abuf->fields.sfmt_empty.f
2371   int UNUSED written = 0;
2372   IADDR UNUSED pc = abuf->addr;
2373   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2374
2375 ((void) 0); /*nop*/
2376
2377 #undef FLD
2378 }
2379   NEXT (vpc);
2380
2381   CASE (sem, INSN_LUK) : /* luk $rt,$rd */
2382 {
2383   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2384   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2385 #define FLD(f) abuf->fields.sfmt_empty.f
2386   int UNUSED written = 0;
2387   IADDR UNUSED pc = abuf->addr;
2388   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2389
2390 ((void) 0); /*nop*/
2391
2392 #undef FLD
2393 }
2394   NEXT (vpc);
2395
2396   CASE (sem, INSN_LULCK) : /* lulck $rt */
2397 {
2398   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2399   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2400 #define FLD(f) abuf->fields.sfmt_empty.f
2401   int UNUSED written = 0;
2402   IADDR UNUSED pc = abuf->addr;
2403   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2404
2405 ((void) 0); /*nop*/
2406
2407 #undef FLD
2408 }
2409   NEXT (vpc);
2410
2411   CASE (sem, INSN_LUM32) : /* lum32 $rt,$rd */
2412 {
2413   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2414   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2415 #define FLD(f) abuf->fields.sfmt_empty.f
2416   int UNUSED written = 0;
2417   IADDR UNUSED pc = abuf->addr;
2418   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2419
2420 ((void) 0); /*nop*/
2421
2422 #undef FLD
2423 }
2424   NEXT (vpc);
2425
2426   CASE (sem, INSN_LUM32L) : /* lum32l $rt,$rd */
2427 {
2428   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2429   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2430 #define FLD(f) abuf->fields.sfmt_empty.f
2431   int UNUSED written = 0;
2432   IADDR UNUSED pc = abuf->addr;
2433   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2434
2435 ((void) 0); /*nop*/
2436
2437 #undef FLD
2438 }
2439   NEXT (vpc);
2440
2441   CASE (sem, INSN_LUM64) : /* lum64 $rt,$rd */
2442 {
2443   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2444   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2445 #define FLD(f) abuf->fields.sfmt_empty.f
2446   int UNUSED written = 0;
2447   IADDR UNUSED pc = abuf->addr;
2448   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2449
2450 ((void) 0); /*nop*/
2451
2452 #undef FLD
2453 }
2454   NEXT (vpc);
2455
2456   CASE (sem, INSN_LUM64L) : /* lum64l $rt,$rd */
2457 {
2458   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2459   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2460 #define FLD(f) abuf->fields.sfmt_empty.f
2461   int UNUSED written = 0;
2462   IADDR UNUSED pc = abuf->addr;
2463   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2464
2465 ((void) 0); /*nop*/
2466
2467 #undef FLD
2468 }
2469   NEXT (vpc);
2470
2471   CASE (sem, INSN_LUR) : /* lur $rt,$rd */
2472 {
2473   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2474   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2475 #define FLD(f) abuf->fields.sfmt_empty.f
2476   int UNUSED written = 0;
2477   IADDR UNUSED pc = abuf->addr;
2478   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2479
2480 ((void) 0); /*nop*/
2481
2482 #undef FLD
2483 }
2484   NEXT (vpc);
2485
2486   CASE (sem, INSN_LURL) : /* lurl $rt,$rd */
2487 {
2488   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2489   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2490 #define FLD(f) abuf->fields.sfmt_empty.f
2491   int UNUSED written = 0;
2492   IADDR UNUSED pc = abuf->addr;
2493   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2494
2495 ((void) 0); /*nop*/
2496
2497 #undef FLD
2498 }
2499   NEXT (vpc);
2500
2501   CASE (sem, INSN_LUULCK) : /* luulck $rt */
2502 {
2503   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2504   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2505 #define FLD(f) abuf->fields.sfmt_empty.f
2506   int UNUSED written = 0;
2507   IADDR UNUSED pc = abuf->addr;
2508   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2509
2510 ((void) 0); /*nop*/
2511
2512 #undef FLD
2513 }
2514   NEXT (vpc);
2515
2516   CASE (sem, INSN_MFC0) : /* mfc0 $rt,$rd */
2517 {
2518   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2519   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2520 #define FLD(f) abuf->fields.sfmt_empty.f
2521   int UNUSED written = 0;
2522   IADDR UNUSED pc = abuf->addr;
2523   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2524
2525 ((void) 0); /*nop*/
2526
2527 #undef FLD
2528 }
2529   NEXT (vpc);
2530
2531   CASE (sem, INSN_MFC1) : /* mfc1 $rt,$rd */
2532 {
2533   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2534   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2535 #define FLD(f) abuf->fields.sfmt_empty.f
2536   int UNUSED written = 0;
2537   IADDR UNUSED pc = abuf->addr;
2538   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2539
2540 ((void) 0); /*nop*/
2541
2542 #undef FLD
2543 }
2544   NEXT (vpc);
2545
2546   CASE (sem, INSN_MFC2) : /* mfc2 $rt,$rd */
2547 {
2548   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2549   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2550 #define FLD(f) abuf->fields.sfmt_empty.f
2551   int UNUSED written = 0;
2552   IADDR UNUSED pc = abuf->addr;
2553   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2554
2555 ((void) 0); /*nop*/
2556
2557 #undef FLD
2558 }
2559   NEXT (vpc);
2560
2561   CASE (sem, INSN_MFC3) : /* mfc3 $rt,$rd */
2562 {
2563   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2564   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2565 #define FLD(f) abuf->fields.sfmt_empty.f
2566   int UNUSED written = 0;
2567   IADDR UNUSED pc = abuf->addr;
2568   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2569
2570 ((void) 0); /*nop*/
2571
2572 #undef FLD
2573 }
2574   NEXT (vpc);
2575
2576   CASE (sem, INSN_MTC0) : /* mtc0 $rt,$rd */
2577 {
2578   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2579   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2580 #define FLD(f) abuf->fields.sfmt_empty.f
2581   int UNUSED written = 0;
2582   IADDR UNUSED pc = abuf->addr;
2583   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2584
2585 ((void) 0); /*nop*/
2586
2587 #undef FLD
2588 }
2589   NEXT (vpc);
2590
2591   CASE (sem, INSN_MTC1) : /* mtc1 $rt,$rd */
2592 {
2593   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2594   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2595 #define FLD(f) abuf->fields.sfmt_empty.f
2596   int UNUSED written = 0;
2597   IADDR UNUSED pc = abuf->addr;
2598   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2599
2600 ((void) 0); /*nop*/
2601
2602 #undef FLD
2603 }
2604   NEXT (vpc);
2605
2606   CASE (sem, INSN_MTC2) : /* mtc2 $rt,$rd */
2607 {
2608   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2609   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2610 #define FLD(f) abuf->fields.sfmt_empty.f
2611   int UNUSED written = 0;
2612   IADDR UNUSED pc = abuf->addr;
2613   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2614
2615 ((void) 0); /*nop*/
2616
2617 #undef FLD
2618 }
2619   NEXT (vpc);
2620
2621   CASE (sem, INSN_MTC3) : /* mtc3 $rt,$rd */
2622 {
2623   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2624   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2625 #define FLD(f) abuf->fields.sfmt_empty.f
2626   int UNUSED written = 0;
2627   IADDR UNUSED pc = abuf->addr;
2628   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2629
2630 ((void) 0); /*nop*/
2631
2632 #undef FLD
2633 }
2634   NEXT (vpc);
2635
2636   CASE (sem, INSN_PKRL) : /* pkrl $rd,$rt */
2637 {
2638   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2639   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2640 #define FLD(f) abuf->fields.sfmt_empty.f
2641   int UNUSED written = 0;
2642   IADDR UNUSED pc = abuf->addr;
2643   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2644
2645 ((void) 0); /*nop*/
2646
2647 #undef FLD
2648 }
2649   NEXT (vpc);
2650
2651   CASE (sem, INSN_PKRLR1) : /* pkrlr1 $rt,$_index,$count */
2652 {
2653   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2654   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2655 #define FLD(f) abuf->fields.sfmt_empty.f
2656   int UNUSED written = 0;
2657   IADDR UNUSED pc = abuf->addr;
2658   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2659
2660 ((void) 0); /*nop*/
2661
2662 #undef FLD
2663 }
2664   NEXT (vpc);
2665
2666   CASE (sem, INSN_PKRLR30) : /* pkrlr30 $rt,$_index,$count */
2667 {
2668   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2669   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2670 #define FLD(f) abuf->fields.sfmt_empty.f
2671   int UNUSED written = 0;
2672   IADDR UNUSED pc = abuf->addr;
2673   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2674
2675 ((void) 0); /*nop*/
2676
2677 #undef FLD
2678 }
2679   NEXT (vpc);
2680
2681   CASE (sem, INSN_RB) : /* rb $rd,$rt */
2682 {
2683   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2684   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2685 #define FLD(f) abuf->fields.sfmt_empty.f
2686   int UNUSED written = 0;
2687   IADDR UNUSED pc = abuf->addr;
2688   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2689
2690 ((void) 0); /*nop*/
2691
2692 #undef FLD
2693 }
2694   NEXT (vpc);
2695
2696   CASE (sem, INSN_RBR1) : /* rbr1 $rt,$_index,$count */
2697 {
2698   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2699   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2700 #define FLD(f) abuf->fields.sfmt_empty.f
2701   int UNUSED written = 0;
2702   IADDR UNUSED pc = abuf->addr;
2703   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2704
2705 ((void) 0); /*nop*/
2706
2707 #undef FLD
2708 }
2709   NEXT (vpc);
2710
2711   CASE (sem, INSN_RBR30) : /* rbr30 $rt,$_index,$count */
2712 {
2713   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2714   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2715 #define FLD(f) abuf->fields.sfmt_empty.f
2716   int UNUSED written = 0;
2717   IADDR UNUSED pc = abuf->addr;
2718   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2719
2720 ((void) 0); /*nop*/
2721
2722 #undef FLD
2723 }
2724   NEXT (vpc);
2725
2726   CASE (sem, INSN_RFE) : /* rfe */
2727 {
2728   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2729   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2730 #define FLD(f) abuf->fields.sfmt_empty.f
2731   int UNUSED written = 0;
2732   IADDR UNUSED pc = abuf->addr;
2733   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2734
2735 ((void) 0); /*nop*/
2736
2737 #undef FLD
2738 }
2739   NEXT (vpc);
2740
2741   CASE (sem, INSN_RX) : /* rx $rd,$rt */
2742 {
2743   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2744   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2745 #define FLD(f) abuf->fields.sfmt_empty.f
2746   int UNUSED written = 0;
2747   IADDR UNUSED pc = abuf->addr;
2748   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2749
2750 ((void) 0); /*nop*/
2751
2752 #undef FLD
2753 }
2754   NEXT (vpc);
2755
2756   CASE (sem, INSN_RXR1) : /* rxr1 $rt,$_index,$count */
2757 {
2758   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2759   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2760 #define FLD(f) abuf->fields.sfmt_empty.f
2761   int UNUSED written = 0;
2762   IADDR UNUSED pc = abuf->addr;
2763   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2764
2765 ((void) 0); /*nop*/
2766
2767 #undef FLD
2768 }
2769   NEXT (vpc);
2770
2771   CASE (sem, INSN_RXR30) : /* rxr30 $rt,$_index,$count */
2772 {
2773   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2774   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2775 #define FLD(f) abuf->fields.sfmt_empty.f
2776   int UNUSED written = 0;
2777   IADDR UNUSED pc = abuf->addr;
2778   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2779
2780 ((void) 0); /*nop*/
2781
2782 #undef FLD
2783 }
2784   NEXT (vpc);
2785
2786   CASE (sem, INSN_SLEEP) : /* sleep */
2787 {
2788   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2789   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2790 #define FLD(f) abuf->fields.sfmt_empty.f
2791   int UNUSED written = 0;
2792   IADDR UNUSED pc = abuf->addr;
2793   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2794
2795 ((void) 0); /*nop*/
2796
2797 #undef FLD
2798 }
2799   NEXT (vpc);
2800
2801   CASE (sem, INSN_SRRD) : /* srrd $rt */
2802 {
2803   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2804   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2805 #define FLD(f) abuf->fields.sfmt_empty.f
2806   int UNUSED written = 0;
2807   IADDR UNUSED pc = abuf->addr;
2808   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2809
2810 ((void) 0); /*nop*/
2811
2812 #undef FLD
2813 }
2814   NEXT (vpc);
2815
2816   CASE (sem, INSN_SRRDL) : /* srrdl $rt */
2817 {
2818   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2819   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2820 #define FLD(f) abuf->fields.sfmt_empty.f
2821   int UNUSED written = 0;
2822   IADDR UNUSED pc = abuf->addr;
2823   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2824
2825 ((void) 0); /*nop*/
2826
2827 #undef FLD
2828 }
2829   NEXT (vpc);
2830
2831   CASE (sem, INSN_SRULCK) : /* srulck $rt */
2832 {
2833   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2834   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2835 #define FLD(f) abuf->fields.sfmt_empty.f
2836   int UNUSED written = 0;
2837   IADDR UNUSED pc = abuf->addr;
2838   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2839
2840 ((void) 0); /*nop*/
2841
2842 #undef FLD
2843 }
2844   NEXT (vpc);
2845
2846   CASE (sem, INSN_SRWR) : /* srwr $rt,$rd */
2847 {
2848   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2849   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2850 #define FLD(f) abuf->fields.sfmt_empty.f
2851   int UNUSED written = 0;
2852   IADDR UNUSED pc = abuf->addr;
2853   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2854
2855 ((void) 0); /*nop*/
2856
2857 #undef FLD
2858 }
2859   NEXT (vpc);
2860
2861   CASE (sem, INSN_SRWRU) : /* srwru $rt,$rd */
2862 {
2863   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2864   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2865 #define FLD(f) abuf->fields.sfmt_empty.f
2866   int UNUSED written = 0;
2867   IADDR UNUSED pc = abuf->addr;
2868   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2869
2870 ((void) 0); /*nop*/
2871
2872 #undef FLD
2873 }
2874   NEXT (vpc);
2875
2876   CASE (sem, INSN_TRAPQFL) : /* trapqfl */
2877 {
2878   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2879   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2880 #define FLD(f) abuf->fields.sfmt_empty.f
2881   int UNUSED written = 0;
2882   IADDR UNUSED pc = abuf->addr;
2883   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2884
2885 ((void) 0); /*nop*/
2886
2887 #undef FLD
2888 }
2889   NEXT (vpc);
2890
2891   CASE (sem, INSN_TRAPQNE) : /* trapqne */
2892 {
2893   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2894   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2895 #define FLD(f) abuf->fields.sfmt_empty.f
2896   int UNUSED written = 0;
2897   IADDR UNUSED pc = abuf->addr;
2898   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2899
2900 ((void) 0); /*nop*/
2901
2902 #undef FLD
2903 }
2904   NEXT (vpc);
2905
2906   CASE (sem, INSN_TRAPREL) : /* traprel $rt */
2907 {
2908   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2909   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2910 #define FLD(f) abuf->fields.sfmt_empty.f
2911   int UNUSED written = 0;
2912   IADDR UNUSED pc = abuf->addr;
2913   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2914
2915 ((void) 0); /*nop*/
2916
2917 #undef FLD
2918 }
2919   NEXT (vpc);
2920
2921   CASE (sem, INSN_WB) : /* wb $rd,$rt */
2922 {
2923   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2924   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2925 #define FLD(f) abuf->fields.sfmt_empty.f
2926   int UNUSED written = 0;
2927   IADDR UNUSED pc = abuf->addr;
2928   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2929
2930 ((void) 0); /*nop*/
2931
2932 #undef FLD
2933 }
2934   NEXT (vpc);
2935
2936   CASE (sem, INSN_WBU) : /* wbu $rd,$rt */
2937 {
2938   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2939   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2940 #define FLD(f) abuf->fields.sfmt_empty.f
2941   int UNUSED written = 0;
2942   IADDR UNUSED pc = abuf->addr;
2943   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2944
2945 ((void) 0); /*nop*/
2946
2947 #undef FLD
2948 }
2949   NEXT (vpc);
2950
2951   CASE (sem, INSN_WBR1) : /* wbr1 $rt,$_index,$count */
2952 {
2953   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2954   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2955 #define FLD(f) abuf->fields.sfmt_empty.f
2956   int UNUSED written = 0;
2957   IADDR UNUSED pc = abuf->addr;
2958   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2959
2960 ((void) 0); /*nop*/
2961
2962 #undef FLD
2963 }
2964   NEXT (vpc);
2965
2966   CASE (sem, INSN_WBR1U) : /* wbr1u $rt,$_index,$count */
2967 {
2968   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2969   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2970 #define FLD(f) abuf->fields.sfmt_empty.f
2971   int UNUSED written = 0;
2972   IADDR UNUSED pc = abuf->addr;
2973   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2974
2975 ((void) 0); /*nop*/
2976
2977 #undef FLD
2978 }
2979   NEXT (vpc);
2980
2981   CASE (sem, INSN_WBR30) : /* wbr30 $rt,$_index,$count */
2982 {
2983   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2984   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2985 #define FLD(f) abuf->fields.sfmt_empty.f
2986   int UNUSED written = 0;
2987   IADDR UNUSED pc = abuf->addr;
2988   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2989
2990 ((void) 0); /*nop*/
2991
2992 #undef FLD
2993 }
2994   NEXT (vpc);
2995
2996   CASE (sem, INSN_WBR30U) : /* wbr30u $rt,$_index,$count */
2997 {
2998   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2999   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3000 #define FLD(f) abuf->fields.sfmt_empty.f
3001   int UNUSED written = 0;
3002   IADDR UNUSED pc = abuf->addr;
3003   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3004
3005 ((void) 0); /*nop*/
3006
3007 #undef FLD
3008 }
3009   NEXT (vpc);
3010
3011   CASE (sem, INSN_WX) : /* wx $rd,$rt */
3012 {
3013   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3014   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3015 #define FLD(f) abuf->fields.sfmt_empty.f
3016   int UNUSED written = 0;
3017   IADDR UNUSED pc = abuf->addr;
3018   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3019
3020 ((void) 0); /*nop*/
3021
3022 #undef FLD
3023 }
3024   NEXT (vpc);
3025
3026   CASE (sem, INSN_WXU) : /* wxu $rd,$rt */
3027 {
3028   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3029   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3030 #define FLD(f) abuf->fields.sfmt_empty.f
3031   int UNUSED written = 0;
3032   IADDR UNUSED pc = abuf->addr;
3033   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3034
3035 ((void) 0); /*nop*/
3036
3037 #undef FLD
3038 }
3039   NEXT (vpc);
3040
3041   CASE (sem, INSN_WXR1) : /* wxr1 $rt,$_index,$count */
3042 {
3043   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3044   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3045 #define FLD(f) abuf->fields.sfmt_empty.f
3046   int UNUSED written = 0;
3047   IADDR UNUSED pc = abuf->addr;
3048   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3049
3050 ((void) 0); /*nop*/
3051
3052 #undef FLD
3053 }
3054   NEXT (vpc);
3055
3056   CASE (sem, INSN_WXR1U) : /* wxr1u $rt,$_index,$count */
3057 {
3058   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3059   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3060 #define FLD(f) abuf->fields.sfmt_empty.f
3061   int UNUSED written = 0;
3062   IADDR UNUSED pc = abuf->addr;
3063   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3064
3065 ((void) 0); /*nop*/
3066
3067 #undef FLD
3068 }
3069   NEXT (vpc);
3070
3071   CASE (sem, INSN_WXR30) : /* wxr30 $rt,$_index,$count */
3072 {
3073   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3074   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3075 #define FLD(f) abuf->fields.sfmt_empty.f
3076   int UNUSED written = 0;
3077   IADDR UNUSED pc = abuf->addr;
3078   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3079
3080 ((void) 0); /*nop*/
3081
3082 #undef FLD
3083 }
3084   NEXT (vpc);
3085
3086   CASE (sem, INSN_WXR30U) : /* wxr30u $rt,$_index,$count */
3087 {
3088   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3089   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3090 #define FLD(f) abuf->fields.sfmt_empty.f
3091   int UNUSED written = 0;
3092   IADDR UNUSED pc = abuf->addr;
3093   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3094
3095 ((void) 0); /*nop*/
3096
3097 #undef FLD
3098 }
3099   NEXT (vpc);
3100
3101   CASE (sem, INSN_LDW) : /* ldw $rt,$lo16($base) */
3102 {
3103   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3104   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3105 #define FLD(f) abuf->fields.sfmt_addi.f
3106   int UNUSED written = 0;
3107   IADDR UNUSED pc = abuf->addr;
3108   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3109
3110 {
3111   SI tmp_addr;
3112   tmp_addr = ANDSI (ADDSI (GET_H_GR (FLD (f_rs)), FLD (f_imm)), INVSI (3));
3113   {
3114     SI opval = GETMEMSI (current_cpu, pc, tmp_addr);
3115     SET_H_GR (ADDSI (FLD (f_rt), 1), opval);
3116     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3117   }
3118   {
3119     SI opval = GETMEMSI (current_cpu, pc, ADDSI (tmp_addr, 4));
3120     SET_H_GR (FLD (f_rt), opval);
3121     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3122   }
3123 }
3124
3125 #undef FLD
3126 }
3127   NEXT (vpc);
3128
3129   CASE (sem, INSN_SDW) : /* sdw $rt,$lo16($base) */
3130 {
3131   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3132   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3133 #define FLD(f) abuf->fields.sfmt_addi.f
3134   int UNUSED written = 0;
3135   IADDR UNUSED pc = abuf->addr;
3136   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3137
3138 {
3139   SI tmp_addr;
3140   tmp_addr = ANDSI (ADDSI (GET_H_GR (FLD (f_rs)), FLD (f_imm)), INVSI (3));
3141   {
3142     SI opval = GET_H_GR (FLD (f_rt));
3143     SETMEMSI (current_cpu, pc, ADDSI (tmp_addr, 4), opval);
3144     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3145   }
3146   {
3147     SI opval = GET_H_GR (ADDSI (FLD (f_rt), 1));
3148     SETMEMSI (current_cpu, pc, tmp_addr, opval);
3149     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3150   }
3151 }
3152
3153 #undef FLD
3154 }
3155   NEXT (vpc);
3156
3157   CASE (sem, INSN_J) : /* j $jmptarg */
3158 {
3159   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3160   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3161 #define FLD(f) abuf->fields.sfmt_j.f
3162   int UNUSED written = 0;
3163   IADDR UNUSED pc = abuf->addr;
3164   SEM_BRANCH_INIT
3165   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3166
3167 {
3168   {
3169     USI opval = FLD (i_jmptarg);
3170     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
3171     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3172   }
3173 }
3174
3175   SEM_BRANCH_FINI (vpc);
3176 #undef FLD
3177 }
3178   NEXT (vpc);
3179
3180   CASE (sem, INSN_JAL) : /* jal $jmptarg */
3181 {
3182   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3183   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3184 #define FLD(f) abuf->fields.sfmt_j.f
3185   int UNUSED written = 0;
3186   IADDR UNUSED pc = abuf->addr;
3187   SEM_BRANCH_INIT
3188   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3189
3190 {
3191 {
3192   {
3193     SI opval = ADDSI (pc, 8);
3194     SET_H_GR (((UINT) 31), opval);
3195     TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
3196   }
3197   {
3198     USI opval = FLD (i_jmptarg);
3199     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
3200     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3201   }
3202 }
3203 }
3204
3205   SEM_BRANCH_FINI (vpc);
3206 #undef FLD
3207 }
3208   NEXT (vpc);
3209
3210   CASE (sem, INSN_BMB) : /* bmb $rs,$rt,$offset */
3211 {
3212   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
3213   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3214 #define FLD(f) abuf->fields.sfmt_bbi.f
3215   int UNUSED written = 0;
3216   IADDR UNUSED pc = abuf->addr;
3217   SEM_BRANCH_INIT
3218   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3219
3220 {
3221   BI tmp_branch_;
3222   tmp_branch_ = 0;
3223 if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 255), ANDSI (GET_H_GR (FLD (f_rt)), 255))) {
3224   tmp_branch_ = 1;
3225 }
3226 if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 65280), ANDSI (GET_H_GR (FLD (f_rt)), 65280))) {
3227   tmp_branch_ = 1;
3228 }
3229 if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 16711680), ANDSI (GET_H_GR (FLD (f_rt)), 16711680))) {
3230   tmp_branch_ = 1;
3231 }
3232 if (EQSI (ANDSI (GET_H_GR (FLD (f_rs)), 0xff000000), ANDSI (GET_H_GR (FLD (f_rt)), 0xff000000))) {
3233   tmp_branch_ = 1;
3234 }
3235 if (tmp_branch_) {
3236 {
3237   {
3238     USI opval = FLD (i_offset);
3239     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
3240     written |= (1 << 3);
3241     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
3242   }
3243 }
3244 }
3245 }
3246
3247   abuf->written = written;
3248   SEM_BRANCH_FINI (vpc);
3249 #undef FLD
3250 }
3251   NEXT (vpc);
3252
3253
3254     }
3255   ENDSWITCH (sem) /* End of semantic switch.  */
3256
3257   /* At this point `vpc' contains the next insn to execute.  */
3258 }
3259
3260 #undef DEFINE_SWITCH
3261 #endif /* DEFINE_SWITCH */