ab26112213a781239029370bcbe8ecffbbbb716a
[external/binutils.git] / sim / m32r / sem-switch.c
1 /* Simulator instruction semantics for m32rbf.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
6
7 This file is part of the GNU Simulators.
8
9 This program 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 2, or (at your option)
12 any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public 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 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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     { M32RBF_INSN_X_INVALID, && case_sem_INSN_X_INVALID },
36     { M32RBF_INSN_X_AFTER, && case_sem_INSN_X_AFTER },
37     { M32RBF_INSN_X_BEFORE, && case_sem_INSN_X_BEFORE },
38     { M32RBF_INSN_X_CTI_CHAIN, && case_sem_INSN_X_CTI_CHAIN },
39     { M32RBF_INSN_X_CHAIN, && case_sem_INSN_X_CHAIN },
40     { M32RBF_INSN_X_BEGIN, && case_sem_INSN_X_BEGIN },
41     { M32RBF_INSN_ADD, && case_sem_INSN_ADD },
42     { M32RBF_INSN_ADD3, && case_sem_INSN_ADD3 },
43     { M32RBF_INSN_AND, && case_sem_INSN_AND },
44     { M32RBF_INSN_AND3, && case_sem_INSN_AND3 },
45     { M32RBF_INSN_OR, && case_sem_INSN_OR },
46     { M32RBF_INSN_OR3, && case_sem_INSN_OR3 },
47     { M32RBF_INSN_XOR, && case_sem_INSN_XOR },
48     { M32RBF_INSN_XOR3, && case_sem_INSN_XOR3 },
49     { M32RBF_INSN_ADDI, && case_sem_INSN_ADDI },
50     { M32RBF_INSN_ADDV, && case_sem_INSN_ADDV },
51     { M32RBF_INSN_ADDV3, && case_sem_INSN_ADDV3 },
52     { M32RBF_INSN_ADDX, && case_sem_INSN_ADDX },
53     { M32RBF_INSN_BC8, && case_sem_INSN_BC8 },
54     { M32RBF_INSN_BC24, && case_sem_INSN_BC24 },
55     { M32RBF_INSN_BEQ, && case_sem_INSN_BEQ },
56     { M32RBF_INSN_BEQZ, && case_sem_INSN_BEQZ },
57     { M32RBF_INSN_BGEZ, && case_sem_INSN_BGEZ },
58     { M32RBF_INSN_BGTZ, && case_sem_INSN_BGTZ },
59     { M32RBF_INSN_BLEZ, && case_sem_INSN_BLEZ },
60     { M32RBF_INSN_BLTZ, && case_sem_INSN_BLTZ },
61     { M32RBF_INSN_BNEZ, && case_sem_INSN_BNEZ },
62     { M32RBF_INSN_BL8, && case_sem_INSN_BL8 },
63     { M32RBF_INSN_BL24, && case_sem_INSN_BL24 },
64     { M32RBF_INSN_BNC8, && case_sem_INSN_BNC8 },
65     { M32RBF_INSN_BNC24, && case_sem_INSN_BNC24 },
66     { M32RBF_INSN_BNE, && case_sem_INSN_BNE },
67     { M32RBF_INSN_BRA8, && case_sem_INSN_BRA8 },
68     { M32RBF_INSN_BRA24, && case_sem_INSN_BRA24 },
69     { M32RBF_INSN_CMP, && case_sem_INSN_CMP },
70     { M32RBF_INSN_CMPI, && case_sem_INSN_CMPI },
71     { M32RBF_INSN_CMPU, && case_sem_INSN_CMPU },
72     { M32RBF_INSN_CMPUI, && case_sem_INSN_CMPUI },
73     { M32RBF_INSN_DIV, && case_sem_INSN_DIV },
74     { M32RBF_INSN_DIVU, && case_sem_INSN_DIVU },
75     { M32RBF_INSN_REM, && case_sem_INSN_REM },
76     { M32RBF_INSN_REMU, && case_sem_INSN_REMU },
77     { M32RBF_INSN_JL, && case_sem_INSN_JL },
78     { M32RBF_INSN_JMP, && case_sem_INSN_JMP },
79     { M32RBF_INSN_LD, && case_sem_INSN_LD },
80     { M32RBF_INSN_LD_D, && case_sem_INSN_LD_D },
81     { M32RBF_INSN_LDB, && case_sem_INSN_LDB },
82     { M32RBF_INSN_LDB_D, && case_sem_INSN_LDB_D },
83     { M32RBF_INSN_LDH, && case_sem_INSN_LDH },
84     { M32RBF_INSN_LDH_D, && case_sem_INSN_LDH_D },
85     { M32RBF_INSN_LDUB, && case_sem_INSN_LDUB },
86     { M32RBF_INSN_LDUB_D, && case_sem_INSN_LDUB_D },
87     { M32RBF_INSN_LDUH, && case_sem_INSN_LDUH },
88     { M32RBF_INSN_LDUH_D, && case_sem_INSN_LDUH_D },
89     { M32RBF_INSN_LD_PLUS, && case_sem_INSN_LD_PLUS },
90     { M32RBF_INSN_LD24, && case_sem_INSN_LD24 },
91     { M32RBF_INSN_LDI8, && case_sem_INSN_LDI8 },
92     { M32RBF_INSN_LDI16, && case_sem_INSN_LDI16 },
93     { M32RBF_INSN_LOCK, && case_sem_INSN_LOCK },
94     { M32RBF_INSN_MACHI, && case_sem_INSN_MACHI },
95     { M32RBF_INSN_MACLO, && case_sem_INSN_MACLO },
96     { M32RBF_INSN_MACWHI, && case_sem_INSN_MACWHI },
97     { M32RBF_INSN_MACWLO, && case_sem_INSN_MACWLO },
98     { M32RBF_INSN_MUL, && case_sem_INSN_MUL },
99     { M32RBF_INSN_MULHI, && case_sem_INSN_MULHI },
100     { M32RBF_INSN_MULLO, && case_sem_INSN_MULLO },
101     { M32RBF_INSN_MULWHI, && case_sem_INSN_MULWHI },
102     { M32RBF_INSN_MULWLO, && case_sem_INSN_MULWLO },
103     { M32RBF_INSN_MV, && case_sem_INSN_MV },
104     { M32RBF_INSN_MVFACHI, && case_sem_INSN_MVFACHI },
105     { M32RBF_INSN_MVFACLO, && case_sem_INSN_MVFACLO },
106     { M32RBF_INSN_MVFACMI, && case_sem_INSN_MVFACMI },
107     { M32RBF_INSN_MVFC, && case_sem_INSN_MVFC },
108     { M32RBF_INSN_MVTACHI, && case_sem_INSN_MVTACHI },
109     { M32RBF_INSN_MVTACLO, && case_sem_INSN_MVTACLO },
110     { M32RBF_INSN_MVTC, && case_sem_INSN_MVTC },
111     { M32RBF_INSN_NEG, && case_sem_INSN_NEG },
112     { M32RBF_INSN_NOP, && case_sem_INSN_NOP },
113     { M32RBF_INSN_NOT, && case_sem_INSN_NOT },
114     { M32RBF_INSN_RAC, && case_sem_INSN_RAC },
115     { M32RBF_INSN_RACH, && case_sem_INSN_RACH },
116     { M32RBF_INSN_RTE, && case_sem_INSN_RTE },
117     { M32RBF_INSN_SETH, && case_sem_INSN_SETH },
118     { M32RBF_INSN_SLL, && case_sem_INSN_SLL },
119     { M32RBF_INSN_SLL3, && case_sem_INSN_SLL3 },
120     { M32RBF_INSN_SLLI, && case_sem_INSN_SLLI },
121     { M32RBF_INSN_SRA, && case_sem_INSN_SRA },
122     { M32RBF_INSN_SRA3, && case_sem_INSN_SRA3 },
123     { M32RBF_INSN_SRAI, && case_sem_INSN_SRAI },
124     { M32RBF_INSN_SRL, && case_sem_INSN_SRL },
125     { M32RBF_INSN_SRL3, && case_sem_INSN_SRL3 },
126     { M32RBF_INSN_SRLI, && case_sem_INSN_SRLI },
127     { M32RBF_INSN_ST, && case_sem_INSN_ST },
128     { M32RBF_INSN_ST_D, && case_sem_INSN_ST_D },
129     { M32RBF_INSN_STB, && case_sem_INSN_STB },
130     { M32RBF_INSN_STB_D, && case_sem_INSN_STB_D },
131     { M32RBF_INSN_STH, && case_sem_INSN_STH },
132     { M32RBF_INSN_STH_D, && case_sem_INSN_STH_D },
133     { M32RBF_INSN_ST_PLUS, && case_sem_INSN_ST_PLUS },
134     { M32RBF_INSN_ST_MINUS, && case_sem_INSN_ST_MINUS },
135     { M32RBF_INSN_SUB, && case_sem_INSN_SUB },
136     { M32RBF_INSN_SUBV, && case_sem_INSN_SUBV },
137     { M32RBF_INSN_SUBX, && case_sem_INSN_SUBX },
138     { M32RBF_INSN_TRAP, && case_sem_INSN_TRAP },
139     { M32RBF_INSN_UNLOCK, && case_sem_INSN_UNLOCK },
140     { 0, 0 }
141   };
142   int i;
143
144   for (i = 0; labels[i].label != 0; ++i)
145 #if FAST_P
146     CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
147 #else
148     CPU_IDESC (current_cpu) [labels[i].index].sem_full_lab = labels[i].label;
149 #endif
150
151 #undef DEFINE_LABELS
152 #endif /* DEFINE_LABELS */
153
154 #ifdef DEFINE_SWITCH
155
156 /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
157    off frills like tracing and profiling.  */
158 /* FIXME: A better way would be to have TRACE_RESULT check for something
159    that can cause it to be optimized out.  Another way would be to emit
160    special handlers into the instruction "stream".  */
161
162 #if FAST_P
163 #undef TRACE_RESULT
164 #define TRACE_RESULT(cpu, abuf, name, type, val)
165 #endif
166
167 #undef GET_ATTR
168 #define GET_ATTR(cpu, num, attr) CGEN_INSN_ATTR (abuf->idesc->opcode, CGEN_INSN_##attr)
169
170 {
171
172 #if WITH_SCACHE_PBB
173
174 /* Branch to next handler without going around main loop.  */
175 #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
176 SWITCH (sem, SEM_ARGBUF (vpc) -> semantic.sem_case)
177
178 #else /* ! WITH_SCACHE_PBB */
179
180 #define NEXT(vpc) BREAK (sem)
181 #ifdef __GNUC__
182 #if FAST_P
183   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_fast_lab)
184 #else
185   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->sem_full_lab)
186 #endif
187 #else
188   SWITCH (sem, SEM_ARGBUF (sc) -> idesc->num)
189 #endif
190
191 #endif /* ! WITH_SCACHE_PBB */
192
193     {
194
195   CASE (sem, INSN_X_INVALID) : /* --invalid-- */
196 {
197   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
198   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
199 #define FLD(f) abuf->fields.fmt_empty.f
200   int UNUSED written = 0;
201   PCADDR UNUSED pc = abuf->addr;
202   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
203
204   {
205 #if WITH_SCACHE
206     /* Update the recorded pc in the cpu state struct.  */
207     SET_H_PC (pc);
208 #endif
209     sim_engine_invalid_insn (current_cpu, pc);
210     sim_io_error (CPU_STATE (current_cpu), "invalid insn not handled\n");
211     /* NOTREACHED */
212   }
213
214 #undef FLD
215 }
216   NEXT (vpc);
217
218   CASE (sem, INSN_X_AFTER) : /* --after-- */
219 {
220   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
221   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
222 #define FLD(f) abuf->fields.fmt_empty.f
223   int UNUSED written = 0;
224   PCADDR UNUSED pc = abuf->addr;
225   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
226
227   {
228 #if WITH_SCACHE_PBB
229     m32rbf_pbb_after (current_cpu, sem_arg);
230 #endif
231   }
232
233 #undef FLD
234 }
235   NEXT (vpc);
236
237   CASE (sem, INSN_X_BEFORE) : /* --before-- */
238 {
239   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
240   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
241 #define FLD(f) abuf->fields.fmt_empty.f
242   int UNUSED written = 0;
243   PCADDR UNUSED pc = abuf->addr;
244   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
245
246   {
247 #if WITH_SCACHE_PBB
248     m32rbf_pbb_before (current_cpu, sem_arg);
249 #endif
250   }
251
252 #undef FLD
253 }
254   NEXT (vpc);
255
256   CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
257 {
258   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
259   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
260 #define FLD(f) abuf->fields.fmt_empty.f
261   int UNUSED written = 0;
262   PCADDR UNUSED pc = abuf->addr;
263   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
264
265   {
266 #if WITH_SCACHE_PBB
267 #ifdef DEFINE_SWITCH
268     vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
269                                pbb_br_npc_ptr, pbb_br_npc);
270     BREAK (sem);
271 #else
272     /* FIXME: Allow provision of explicit ifmt spec in insn spec.  */
273     vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
274                                CPU_PBB_BR_NPC_PTR (current_cpu),
275                                CPU_PBB_BR_NPC (current_cpu));
276 #endif
277 #endif
278   }
279
280 #undef FLD
281 }
282   NEXT (vpc);
283
284   CASE (sem, INSN_X_CHAIN) : /* --chain-- */
285 {
286   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
287   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
288 #define FLD(f) abuf->fields.fmt_empty.f
289   int UNUSED written = 0;
290   PCADDR UNUSED pc = abuf->addr;
291   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
292
293   {
294 #if WITH_SCACHE_PBB
295     vpc = m32rbf_pbb_chain (current_cpu, sem_arg);
296 #ifdef DEFINE_SWITCH
297     BREAK (sem);
298 #endif
299 #endif
300   }
301
302 #undef FLD
303 }
304   NEXT (vpc);
305
306   CASE (sem, INSN_X_BEGIN) : /* --begin-- */
307 {
308   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
309   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
310 #define FLD(f) abuf->fields.fmt_empty.f
311   int UNUSED written = 0;
312   PCADDR UNUSED pc = abuf->addr;
313   vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
314
315   {
316 #if WITH_SCACHE_PBB
317 #ifdef DEFINE_SWITCH
318     /* In the switch case FAST_P is a constant, allowing several optimizations
319        in any called inline functions.  */
320     vpc = m32rbf_pbb_begin (current_cpu, FAST_P);
321 #else
322     vpc = m32rbf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
323 #endif
324 #endif
325   }
326
327 #undef FLD
328 }
329   NEXT (vpc);
330
331   CASE (sem, INSN_ADD) : /* add $dr,$sr */
332 {
333   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
334   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
335 #define FLD(f) abuf->fields.fmt_add.f
336   int UNUSED written = 0;
337   PCADDR UNUSED pc = abuf->addr;
338   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
339
340   {
341     SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
342     * FLD (i_dr) = opval;
343     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
344   }
345
346 #undef FLD
347 }
348   NEXT (vpc);
349
350   CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */
351 {
352   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
353   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
354 #define FLD(f) abuf->fields.fmt_add3.f
355   int UNUSED written = 0;
356   PCADDR UNUSED pc = abuf->addr;
357   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
358
359   {
360     SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
361     * FLD (i_dr) = opval;
362     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
363   }
364
365 #undef FLD
366 }
367   NEXT (vpc);
368
369   CASE (sem, INSN_AND) : /* and $dr,$sr */
370 {
371   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
372   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
373 #define FLD(f) abuf->fields.fmt_add.f
374   int UNUSED written = 0;
375   PCADDR UNUSED pc = abuf->addr;
376   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
377
378   {
379     SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
380     * FLD (i_dr) = opval;
381     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
382   }
383
384 #undef FLD
385 }
386   NEXT (vpc);
387
388   CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */
389 {
390   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
391   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
392 #define FLD(f) abuf->fields.fmt_and3.f
393   int UNUSED written = 0;
394   PCADDR UNUSED pc = abuf->addr;
395   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
396
397   {
398     SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
399     * FLD (i_dr) = opval;
400     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
401   }
402
403 #undef FLD
404 }
405   NEXT (vpc);
406
407   CASE (sem, INSN_OR) : /* or $dr,$sr */
408 {
409   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
410   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
411 #define FLD(f) abuf->fields.fmt_add.f
412   int UNUSED written = 0;
413   PCADDR UNUSED pc = abuf->addr;
414   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
415
416   {
417     SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
418     * FLD (i_dr) = opval;
419     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
420   }
421
422 #undef FLD
423 }
424   NEXT (vpc);
425
426   CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */
427 {
428   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
429   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
430 #define FLD(f) abuf->fields.fmt_or3.f
431   int UNUSED written = 0;
432   PCADDR UNUSED pc = abuf->addr;
433   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
434
435   {
436     SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
437     * FLD (i_dr) = opval;
438     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
439   }
440
441 #undef FLD
442 }
443   NEXT (vpc);
444
445   CASE (sem, INSN_XOR) : /* xor $dr,$sr */
446 {
447   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
448   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
449 #define FLD(f) abuf->fields.fmt_add.f
450   int UNUSED written = 0;
451   PCADDR UNUSED pc = abuf->addr;
452   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
453
454   {
455     SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
456     * FLD (i_dr) = opval;
457     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
458   }
459
460 #undef FLD
461 }
462   NEXT (vpc);
463
464   CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */
465 {
466   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
467   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
468 #define FLD(f) abuf->fields.fmt_and3.f
469   int UNUSED written = 0;
470   PCADDR UNUSED pc = abuf->addr;
471   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
472
473   {
474     SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
475     * FLD (i_dr) = opval;
476     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
477   }
478
479 #undef FLD
480 }
481   NEXT (vpc);
482
483   CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */
484 {
485   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
486   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
487 #define FLD(f) abuf->fields.fmt_addi.f
488   int UNUSED written = 0;
489   PCADDR UNUSED pc = abuf->addr;
490   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
491
492   {
493     SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
494     * FLD (i_dr) = opval;
495     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
496   }
497
498 #undef FLD
499 }
500   NEXT (vpc);
501
502   CASE (sem, INSN_ADDV) : /* addv $dr,$sr */
503 {
504   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
505   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
506 #define FLD(f) abuf->fields.fmt_addv.f
507   int UNUSED written = 0;
508   PCADDR UNUSED pc = abuf->addr;
509   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
510
511 do {
512   BI temp1;SI temp0;
513   temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
514   temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
515   {
516     SI opval = temp0;
517     * FLD (i_dr) = opval;
518     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
519   }
520   {
521     BI opval = temp1;
522     CPU (h_cond) = opval;
523     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
524   }
525 } while (0);
526
527 #undef FLD
528 }
529   NEXT (vpc);
530
531   CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */
532 {
533   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
534   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
535 #define FLD(f) abuf->fields.fmt_addv3.f
536   int UNUSED written = 0;
537   PCADDR UNUSED pc = abuf->addr;
538   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
539
540 do {
541   BI temp1;SI temp0;
542   temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16));
543   temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0);
544   {
545     SI opval = temp0;
546     * FLD (i_dr) = opval;
547     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
548   }
549   {
550     BI opval = temp1;
551     CPU (h_cond) = opval;
552     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
553   }
554 } while (0);
555
556 #undef FLD
557 }
558   NEXT (vpc);
559
560   CASE (sem, INSN_ADDX) : /* addx $dr,$sr */
561 {
562   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
563   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
564 #define FLD(f) abuf->fields.fmt_addx.f
565   int UNUSED written = 0;
566   PCADDR UNUSED pc = abuf->addr;
567   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
568
569 do {
570   BI temp1;SI temp0;
571   temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
572   temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
573   {
574     SI opval = temp0;
575     * FLD (i_dr) = opval;
576     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
577   }
578   {
579     BI opval = temp1;
580     CPU (h_cond) = opval;
581     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
582   }
583 } while (0);
584
585 #undef FLD
586 }
587   NEXT (vpc);
588
589   CASE (sem, INSN_BC8) : /* bc.s $disp8 */
590 {
591   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
592   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
593 #define FLD(f) abuf->fields.cti.fields.fmt_bc8.f
594   int UNUSED written = 0;
595   PCADDR UNUSED pc = abuf->addr;
596   SEM_BRANCH_INIT
597   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
598
599 if (CPU (h_cond)) {
600   {
601     USI opval = FLD (i_disp8);
602     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
603     written |= (1 << 2);
604     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
605   }
606 }
607
608   abuf->written = written;
609   SEM_BRANCH_FINI
610 #undef FLD
611 }
612   NEXT (vpc);
613
614   CASE (sem, INSN_BC24) : /* bc.l $disp24 */
615 {
616   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
617   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
618 #define FLD(f) abuf->fields.cti.fields.fmt_bc24.f
619   int UNUSED written = 0;
620   PCADDR UNUSED pc = abuf->addr;
621   SEM_BRANCH_INIT
622   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
623
624 if (CPU (h_cond)) {
625   {
626     USI opval = FLD (i_disp24);
627     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
628     written |= (1 << 2);
629     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
630   }
631 }
632
633   abuf->written = written;
634   SEM_BRANCH_FINI
635 #undef FLD
636 }
637   NEXT (vpc);
638
639   CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */
640 {
641   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
642   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
643 #define FLD(f) abuf->fields.cti.fields.fmt_beq.f
644   int UNUSED written = 0;
645   PCADDR UNUSED pc = abuf->addr;
646   SEM_BRANCH_INIT
647   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
648
649 if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
650   {
651     USI opval = FLD (i_disp16);
652     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
653     written |= (1 << 3);
654     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
655   }
656 }
657
658   abuf->written = written;
659   SEM_BRANCH_FINI
660 #undef FLD
661 }
662   NEXT (vpc);
663
664   CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */
665 {
666   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
667   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
668 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
669   int UNUSED written = 0;
670   PCADDR UNUSED pc = abuf->addr;
671   SEM_BRANCH_INIT
672   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
673
674 if (EQSI (* FLD (i_src2), 0)) {
675   {
676     USI opval = FLD (i_disp16);
677     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
678     written |= (1 << 2);
679     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
680   }
681 }
682
683   abuf->written = written;
684   SEM_BRANCH_FINI
685 #undef FLD
686 }
687   NEXT (vpc);
688
689   CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */
690 {
691   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
692   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
693 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
694   int UNUSED written = 0;
695   PCADDR UNUSED pc = abuf->addr;
696   SEM_BRANCH_INIT
697   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
698
699 if (GESI (* FLD (i_src2), 0)) {
700   {
701     USI opval = FLD (i_disp16);
702     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
703     written |= (1 << 2);
704     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
705   }
706 }
707
708   abuf->written = written;
709   SEM_BRANCH_FINI
710 #undef FLD
711 }
712   NEXT (vpc);
713
714   CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */
715 {
716   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
717   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
718 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
719   int UNUSED written = 0;
720   PCADDR UNUSED pc = abuf->addr;
721   SEM_BRANCH_INIT
722   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
723
724 if (GTSI (* FLD (i_src2), 0)) {
725   {
726     USI opval = FLD (i_disp16);
727     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
728     written |= (1 << 2);
729     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
730   }
731 }
732
733   abuf->written = written;
734   SEM_BRANCH_FINI
735 #undef FLD
736 }
737   NEXT (vpc);
738
739   CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */
740 {
741   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
742   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
743 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
744   int UNUSED written = 0;
745   PCADDR UNUSED pc = abuf->addr;
746   SEM_BRANCH_INIT
747   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
748
749 if (LESI (* FLD (i_src2), 0)) {
750   {
751     USI opval = FLD (i_disp16);
752     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
753     written |= (1 << 2);
754     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
755   }
756 }
757
758   abuf->written = written;
759   SEM_BRANCH_FINI
760 #undef FLD
761 }
762   NEXT (vpc);
763
764   CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */
765 {
766   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
767   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
768 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
769   int UNUSED written = 0;
770   PCADDR UNUSED pc = abuf->addr;
771   SEM_BRANCH_INIT
772   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
773
774 if (LTSI (* FLD (i_src2), 0)) {
775   {
776     USI opval = FLD (i_disp16);
777     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
778     written |= (1 << 2);
779     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
780   }
781 }
782
783   abuf->written = written;
784   SEM_BRANCH_FINI
785 #undef FLD
786 }
787   NEXT (vpc);
788
789   CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */
790 {
791   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
792   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
793 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
794   int UNUSED written = 0;
795   PCADDR UNUSED pc = abuf->addr;
796   SEM_BRANCH_INIT
797   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
798
799 if (NESI (* FLD (i_src2), 0)) {
800   {
801     USI opval = FLD (i_disp16);
802     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
803     written |= (1 << 2);
804     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
805   }
806 }
807
808   abuf->written = written;
809   SEM_BRANCH_FINI
810 #undef FLD
811 }
812   NEXT (vpc);
813
814   CASE (sem, INSN_BL8) : /* bl.s $disp8 */
815 {
816   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
817   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
818 #define FLD(f) abuf->fields.cti.fields.fmt_bl8.f
819   int UNUSED written = 0;
820   PCADDR UNUSED pc = abuf->addr;
821   SEM_BRANCH_INIT
822   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
823
824 do {
825   {
826     SI opval = ADDSI (ANDSI (pc, -4), 4);
827     CPU (h_gr[((UINT) 14)]) = opval;
828     TRACE_RESULT (current_cpu, abuf, "gr-14", 'x', opval);
829   }
830   {
831     USI opval = FLD (i_disp8);
832     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
833     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
834   }
835 } while (0);
836
837   SEM_BRANCH_FINI
838 #undef FLD
839 }
840   NEXT (vpc);
841
842   CASE (sem, INSN_BL24) : /* bl.l $disp24 */
843 {
844   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
845   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
846 #define FLD(f) abuf->fields.cti.fields.fmt_bl24.f
847   int UNUSED written = 0;
848   PCADDR UNUSED pc = abuf->addr;
849   SEM_BRANCH_INIT
850   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
851
852 do {
853   {
854     SI opval = ADDSI (pc, 4);
855     CPU (h_gr[((UINT) 14)]) = opval;
856     TRACE_RESULT (current_cpu, abuf, "gr-14", 'x', opval);
857   }
858   {
859     USI opval = FLD (i_disp24);
860     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
861     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
862   }
863 } while (0);
864
865   SEM_BRANCH_FINI
866 #undef FLD
867 }
868   NEXT (vpc);
869
870   CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */
871 {
872   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
873   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
874 #define FLD(f) abuf->fields.cti.fields.fmt_bc8.f
875   int UNUSED written = 0;
876   PCADDR UNUSED pc = abuf->addr;
877   SEM_BRANCH_INIT
878   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
879
880 if (NOTBI (CPU (h_cond))) {
881   {
882     USI opval = FLD (i_disp8);
883     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
884     written |= (1 << 2);
885     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
886   }
887 }
888
889   abuf->written = written;
890   SEM_BRANCH_FINI
891 #undef FLD
892 }
893   NEXT (vpc);
894
895   CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */
896 {
897   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
898   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
899 #define FLD(f) abuf->fields.cti.fields.fmt_bc24.f
900   int UNUSED written = 0;
901   PCADDR UNUSED pc = abuf->addr;
902   SEM_BRANCH_INIT
903   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
904
905 if (NOTBI (CPU (h_cond))) {
906   {
907     USI opval = FLD (i_disp24);
908     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
909     written |= (1 << 2);
910     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
911   }
912 }
913
914   abuf->written = written;
915   SEM_BRANCH_FINI
916 #undef FLD
917 }
918   NEXT (vpc);
919
920   CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */
921 {
922   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
923   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
924 #define FLD(f) abuf->fields.cti.fields.fmt_beq.f
925   int UNUSED written = 0;
926   PCADDR UNUSED pc = abuf->addr;
927   SEM_BRANCH_INIT
928   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
929
930 if (NESI (* FLD (i_src1), * FLD (i_src2))) {
931   {
932     USI opval = FLD (i_disp16);
933     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
934     written |= (1 << 3);
935     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
936   }
937 }
938
939   abuf->written = written;
940   SEM_BRANCH_FINI
941 #undef FLD
942 }
943   NEXT (vpc);
944
945   CASE (sem, INSN_BRA8) : /* bra.s $disp8 */
946 {
947   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
948   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
949 #define FLD(f) abuf->fields.cti.fields.fmt_bra8.f
950   int UNUSED written = 0;
951   PCADDR UNUSED pc = abuf->addr;
952   SEM_BRANCH_INIT
953   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
954
955   {
956     USI opval = FLD (i_disp8);
957     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
958     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
959   }
960
961   SEM_BRANCH_FINI
962 #undef FLD
963 }
964   NEXT (vpc);
965
966   CASE (sem, INSN_BRA24) : /* bra.l $disp24 */
967 {
968   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
969   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
970 #define FLD(f) abuf->fields.cti.fields.fmt_bra24.f
971   int UNUSED written = 0;
972   PCADDR UNUSED pc = abuf->addr;
973   SEM_BRANCH_INIT
974   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
975
976   {
977     USI opval = FLD (i_disp24);
978     SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc, SEM_BRANCH_ADDR_CACHE (sem_arg));
979     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
980   }
981
982   SEM_BRANCH_FINI
983 #undef FLD
984 }
985   NEXT (vpc);
986
987   CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */
988 {
989   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
990   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
991 #define FLD(f) abuf->fields.fmt_cmp.f
992   int UNUSED written = 0;
993   PCADDR UNUSED pc = abuf->addr;
994   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
995
996   {
997     BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
998     CPU (h_cond) = opval;
999     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
1000   }
1001
1002 #undef FLD
1003 }
1004   NEXT (vpc);
1005
1006   CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */
1007 {
1008   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1009   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1010 #define FLD(f) abuf->fields.fmt_cmpi.f
1011   int UNUSED written = 0;
1012   PCADDR UNUSED pc = abuf->addr;
1013   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1014
1015   {
1016     BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
1017     CPU (h_cond) = opval;
1018     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
1019   }
1020
1021 #undef FLD
1022 }
1023   NEXT (vpc);
1024
1025   CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */
1026 {
1027   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1028   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1029 #define FLD(f) abuf->fields.fmt_cmp.f
1030   int UNUSED written = 0;
1031   PCADDR UNUSED pc = abuf->addr;
1032   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1033
1034   {
1035     BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
1036     CPU (h_cond) = opval;
1037     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
1038   }
1039
1040 #undef FLD
1041 }
1042   NEXT (vpc);
1043
1044   CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */
1045 {
1046   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1047   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1048 #define FLD(f) abuf->fields.fmt_cmpi.f
1049   int UNUSED written = 0;
1050   PCADDR UNUSED pc = abuf->addr;
1051   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1052
1053   {
1054     BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
1055     CPU (h_cond) = opval;
1056     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
1057   }
1058
1059 #undef FLD
1060 }
1061   NEXT (vpc);
1062
1063   CASE (sem, INSN_DIV) : /* div $dr,$sr */
1064 {
1065   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1066   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1067 #define FLD(f) abuf->fields.fmt_div.f
1068   int UNUSED written = 0;
1069   PCADDR UNUSED pc = abuf->addr;
1070   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1071
1072 if (NESI (* FLD (i_sr), 0)) {
1073   {
1074     SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
1075     * FLD (i_dr) = opval;
1076     written |= (1 << 2);
1077     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1078   }
1079 }
1080
1081   abuf->written = written;
1082 #undef FLD
1083 }
1084   NEXT (vpc);
1085
1086   CASE (sem, INSN_DIVU) : /* divu $dr,$sr */
1087 {
1088   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1089   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1090 #define FLD(f) abuf->fields.fmt_div.f
1091   int UNUSED written = 0;
1092   PCADDR UNUSED pc = abuf->addr;
1093   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1094
1095 if (NESI (* FLD (i_sr), 0)) {
1096   {
1097     SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
1098     * FLD (i_dr) = opval;
1099     written |= (1 << 2);
1100     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1101   }
1102 }
1103
1104   abuf->written = written;
1105 #undef FLD
1106 }
1107   NEXT (vpc);
1108
1109   CASE (sem, INSN_REM) : /* rem $dr,$sr */
1110 {
1111   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1112   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1113 #define FLD(f) abuf->fields.fmt_div.f
1114   int UNUSED written = 0;
1115   PCADDR UNUSED pc = abuf->addr;
1116   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1117
1118 if (NESI (* FLD (i_sr), 0)) {
1119   {
1120     SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
1121     * FLD (i_dr) = opval;
1122     written |= (1 << 2);
1123     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1124   }
1125 }
1126
1127   abuf->written = written;
1128 #undef FLD
1129 }
1130   NEXT (vpc);
1131
1132   CASE (sem, INSN_REMU) : /* remu $dr,$sr */
1133 {
1134   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1135   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1136 #define FLD(f) abuf->fields.fmt_div.f
1137   int UNUSED written = 0;
1138   PCADDR UNUSED pc = abuf->addr;
1139   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1140
1141 if (NESI (* FLD (i_sr), 0)) {
1142   {
1143     SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
1144     * FLD (i_dr) = opval;
1145     written |= (1 << 2);
1146     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1147   }
1148 }
1149
1150   abuf->written = written;
1151 #undef FLD
1152 }
1153   NEXT (vpc);
1154
1155   CASE (sem, INSN_JL) : /* jl $sr */
1156 {
1157   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1158   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1159 #define FLD(f) abuf->fields.cti.fields.fmt_jl.f
1160   int UNUSED written = 0;
1161   PCADDR UNUSED pc = abuf->addr;
1162   SEM_BRANCH_INIT
1163   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1164
1165 do {
1166   USI temp1;SI temp0;
1167   temp0 = ADDSI (ANDSI (pc, -4), 4);
1168   temp1 = ANDSI (* FLD (i_sr), -4);
1169   {
1170     SI opval = temp0;
1171     CPU (h_gr[((UINT) 14)]) = opval;
1172     TRACE_RESULT (current_cpu, abuf, "gr-14", 'x', opval);
1173   }
1174   {
1175     USI opval = temp1;
1176     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1177     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1178   }
1179 } while (0);
1180
1181   SEM_BRANCH_FINI
1182 #undef FLD
1183 }
1184   NEXT (vpc);
1185
1186   CASE (sem, INSN_JMP) : /* jmp $sr */
1187 {
1188   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1189   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1190 #define FLD(f) abuf->fields.cti.fields.fmt_jmp.f
1191   int UNUSED written = 0;
1192   PCADDR UNUSED pc = abuf->addr;
1193   SEM_BRANCH_INIT
1194   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1195
1196   {
1197     USI opval = ANDSI (* FLD (i_sr), -4);
1198     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1199     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1200   }
1201
1202   SEM_BRANCH_FINI
1203 #undef FLD
1204 }
1205   NEXT (vpc);
1206
1207   CASE (sem, INSN_LD) : /* ld $dr,@$sr */
1208 {
1209   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1210   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1211 #define FLD(f) abuf->fields.fmt_ld.f
1212   int UNUSED written = 0;
1213   PCADDR UNUSED pc = abuf->addr;
1214   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1215
1216   {
1217     SI opval = GETMEMSI (current_cpu, * FLD (i_sr));
1218     * FLD (i_dr) = opval;
1219     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1220   }
1221
1222 #undef FLD
1223 }
1224   NEXT (vpc);
1225
1226   CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */
1227 {
1228   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1229   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1230 #define FLD(f) abuf->fields.fmt_ld_d.f
1231   int UNUSED written = 0;
1232   PCADDR UNUSED pc = abuf->addr;
1233   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1234
1235   {
1236     SI opval = GETMEMSI (current_cpu, ADDSI (* FLD (i_sr), FLD (f_simm16)));
1237     * FLD (i_dr) = opval;
1238     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1239   }
1240
1241 #undef FLD
1242 }
1243   NEXT (vpc);
1244
1245   CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */
1246 {
1247   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1248   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1249 #define FLD(f) abuf->fields.fmt_ldb.f
1250   int UNUSED written = 0;
1251   PCADDR UNUSED pc = abuf->addr;
1252   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1253
1254   {
1255     SI opval = EXTQISI (GETMEMQI (current_cpu, * FLD (i_sr)));
1256     * FLD (i_dr) = opval;
1257     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1258   }
1259
1260 #undef FLD
1261 }
1262   NEXT (vpc);
1263
1264   CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */
1265 {
1266   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1267   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1268 #define FLD(f) abuf->fields.fmt_ldb_d.f
1269   int UNUSED written = 0;
1270   PCADDR UNUSED pc = abuf->addr;
1271   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1272
1273   {
1274     SI opval = EXTQISI (GETMEMQI (current_cpu, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1275     * FLD (i_dr) = opval;
1276     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1277   }
1278
1279 #undef FLD
1280 }
1281   NEXT (vpc);
1282
1283   CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */
1284 {
1285   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1286   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1287 #define FLD(f) abuf->fields.fmt_ldh.f
1288   int UNUSED written = 0;
1289   PCADDR UNUSED pc = abuf->addr;
1290   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1291
1292   {
1293     SI opval = EXTHISI (GETMEMHI (current_cpu, * FLD (i_sr)));
1294     * FLD (i_dr) = opval;
1295     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1296   }
1297
1298 #undef FLD
1299 }
1300   NEXT (vpc);
1301
1302   CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */
1303 {
1304   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1305   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1306 #define FLD(f) abuf->fields.fmt_ldh_d.f
1307   int UNUSED written = 0;
1308   PCADDR UNUSED pc = abuf->addr;
1309   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1310
1311   {
1312     SI opval = EXTHISI (GETMEMHI (current_cpu, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1313     * FLD (i_dr) = opval;
1314     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1315   }
1316
1317 #undef FLD
1318 }
1319   NEXT (vpc);
1320
1321   CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */
1322 {
1323   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1324   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1325 #define FLD(f) abuf->fields.fmt_ldb.f
1326   int UNUSED written = 0;
1327   PCADDR UNUSED pc = abuf->addr;
1328   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1329
1330   {
1331     SI opval = ZEXTQISI (GETMEMQI (current_cpu, * FLD (i_sr)));
1332     * FLD (i_dr) = opval;
1333     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1334   }
1335
1336 #undef FLD
1337 }
1338   NEXT (vpc);
1339
1340   CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */
1341 {
1342   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1343   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1344 #define FLD(f) abuf->fields.fmt_ldb_d.f
1345   int UNUSED written = 0;
1346   PCADDR UNUSED pc = abuf->addr;
1347   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1348
1349   {
1350     SI opval = ZEXTQISI (GETMEMQI (current_cpu, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1351     * FLD (i_dr) = opval;
1352     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1353   }
1354
1355 #undef FLD
1356 }
1357   NEXT (vpc);
1358
1359   CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */
1360 {
1361   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1362   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1363 #define FLD(f) abuf->fields.fmt_ldh.f
1364   int UNUSED written = 0;
1365   PCADDR UNUSED pc = abuf->addr;
1366   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1367
1368   {
1369     SI opval = ZEXTHISI (GETMEMHI (current_cpu, * FLD (i_sr)));
1370     * FLD (i_dr) = opval;
1371     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1372   }
1373
1374 #undef FLD
1375 }
1376   NEXT (vpc);
1377
1378   CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */
1379 {
1380   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1381   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1382 #define FLD(f) abuf->fields.fmt_ldh_d.f
1383   int UNUSED written = 0;
1384   PCADDR UNUSED pc = abuf->addr;
1385   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1386
1387   {
1388     SI opval = ZEXTHISI (GETMEMHI (current_cpu, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1389     * FLD (i_dr) = opval;
1390     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1391   }
1392
1393 #undef FLD
1394 }
1395   NEXT (vpc);
1396
1397   CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */
1398 {
1399   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1400   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1401 #define FLD(f) abuf->fields.fmt_ld_plus.f
1402   int UNUSED written = 0;
1403   PCADDR UNUSED pc = abuf->addr;
1404   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1405
1406 do {
1407   SI temp1;SI temp0;
1408   temp0 = GETMEMSI (current_cpu, * FLD (i_sr));
1409   temp1 = ADDSI (* FLD (i_sr), 4);
1410   {
1411     SI opval = temp0;
1412     * FLD (i_dr) = opval;
1413     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1414   }
1415   {
1416     SI opval = temp1;
1417     * FLD (i_sr) = opval;
1418     TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
1419   }
1420 } while (0);
1421
1422 #undef FLD
1423 }
1424   NEXT (vpc);
1425
1426   CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */
1427 {
1428   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1429   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1430 #define FLD(f) abuf->fields.fmt_ld24.f
1431   int UNUSED written = 0;
1432   PCADDR UNUSED pc = abuf->addr;
1433   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1434
1435   {
1436     SI opval = FLD (i_uimm24);
1437     * FLD (i_dr) = opval;
1438     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1439   }
1440
1441 #undef FLD
1442 }
1443   NEXT (vpc);
1444
1445   CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */
1446 {
1447   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1448   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1449 #define FLD(f) abuf->fields.fmt_ldi8.f
1450   int UNUSED written = 0;
1451   PCADDR UNUSED pc = abuf->addr;
1452   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1453
1454   {
1455     SI opval = FLD (f_simm8);
1456     * FLD (i_dr) = opval;
1457     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1458   }
1459
1460 #undef FLD
1461 }
1462   NEXT (vpc);
1463
1464   CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */
1465 {
1466   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1467   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1468 #define FLD(f) abuf->fields.fmt_ldi16.f
1469   int UNUSED written = 0;
1470   PCADDR UNUSED pc = abuf->addr;
1471   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1472
1473   {
1474     SI opval = FLD (f_simm16);
1475     * FLD (i_dr) = opval;
1476     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1477   }
1478
1479 #undef FLD
1480 }
1481   NEXT (vpc);
1482
1483   CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */
1484 {
1485   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1486   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1487 #define FLD(f) abuf->fields.fmt_lock.f
1488   int UNUSED written = 0;
1489   PCADDR UNUSED pc = abuf->addr;
1490   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1491
1492 do {
1493   {
1494     BI opval = 1;
1495     CPU (h_lock) = opval;
1496     TRACE_RESULT (current_cpu, abuf, "lock-0", 'x', opval);
1497   }
1498   {
1499     SI opval = GETMEMSI (current_cpu, * FLD (i_sr));
1500     * FLD (i_dr) = opval;
1501     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1502   }
1503 } while (0);
1504
1505 #undef FLD
1506 }
1507   NEXT (vpc);
1508
1509   CASE (sem, INSN_MACHI) : /* machi $src1,$src2 */
1510 {
1511   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1512   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1513 #define FLD(f) abuf->fields.fmt_machi.f
1514   int UNUSED written = 0;
1515   PCADDR UNUSED pc = abuf->addr;
1516   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1517
1518   {
1519     DI opval = SRADI (SLLDI (ADDDI (m32rbf_h_accum_get (current_cpu), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
1520     m32rbf_h_accum_set (current_cpu, opval);
1521     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1522   }
1523
1524 #undef FLD
1525 }
1526   NEXT (vpc);
1527
1528   CASE (sem, INSN_MACLO) : /* maclo $src1,$src2 */
1529 {
1530   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1531   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1532 #define FLD(f) abuf->fields.fmt_machi.f
1533   int UNUSED written = 0;
1534   PCADDR UNUSED pc = abuf->addr;
1535   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1536
1537   {
1538     DI opval = SRADI (SLLDI (ADDDI (m32rbf_h_accum_get (current_cpu), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
1539     m32rbf_h_accum_set (current_cpu, opval);
1540     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1541   }
1542
1543 #undef FLD
1544 }
1545   NEXT (vpc);
1546
1547   CASE (sem, INSN_MACWHI) : /* macwhi $src1,$src2 */
1548 {
1549   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1550   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1551 #define FLD(f) abuf->fields.fmt_machi.f
1552   int UNUSED written = 0;
1553   PCADDR UNUSED pc = abuf->addr;
1554   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1555
1556   {
1557     DI opval = SRADI (SLLDI (ADDDI (m32rbf_h_accum_get (current_cpu), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
1558     m32rbf_h_accum_set (current_cpu, opval);
1559     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1560   }
1561
1562 #undef FLD
1563 }
1564   NEXT (vpc);
1565
1566   CASE (sem, INSN_MACWLO) : /* macwlo $src1,$src2 */
1567 {
1568   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1569   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1570 #define FLD(f) abuf->fields.fmt_machi.f
1571   int UNUSED written = 0;
1572   PCADDR UNUSED pc = abuf->addr;
1573   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1574
1575   {
1576     DI opval = SRADI (SLLDI (ADDDI (m32rbf_h_accum_get (current_cpu), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
1577     m32rbf_h_accum_set (current_cpu, opval);
1578     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1579   }
1580
1581 #undef FLD
1582 }
1583   NEXT (vpc);
1584
1585   CASE (sem, INSN_MUL) : /* mul $dr,$sr */
1586 {
1587   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1588   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1589 #define FLD(f) abuf->fields.fmt_add.f
1590   int UNUSED written = 0;
1591   PCADDR UNUSED pc = abuf->addr;
1592   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1593
1594   {
1595     SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
1596     * FLD (i_dr) = opval;
1597     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1598   }
1599
1600 #undef FLD
1601 }
1602   NEXT (vpc);
1603
1604   CASE (sem, INSN_MULHI) : /* mulhi $src1,$src2 */
1605 {
1606   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1607   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1608 #define FLD(f) abuf->fields.fmt_mulhi.f
1609   int UNUSED written = 0;
1610   PCADDR UNUSED pc = abuf->addr;
1611   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1612
1613   {
1614     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
1615     m32rbf_h_accum_set (current_cpu, opval);
1616     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1617   }
1618
1619 #undef FLD
1620 }
1621   NEXT (vpc);
1622
1623   CASE (sem, INSN_MULLO) : /* mullo $src1,$src2 */
1624 {
1625   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1626   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1627 #define FLD(f) abuf->fields.fmt_mulhi.f
1628   int UNUSED written = 0;
1629   PCADDR UNUSED pc = abuf->addr;
1630   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1631
1632   {
1633     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
1634     m32rbf_h_accum_set (current_cpu, opval);
1635     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1636   }
1637
1638 #undef FLD
1639 }
1640   NEXT (vpc);
1641
1642   CASE (sem, INSN_MULWHI) : /* mulwhi $src1,$src2 */
1643 {
1644   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1645   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1646 #define FLD(f) abuf->fields.fmt_mulhi.f
1647   int UNUSED written = 0;
1648   PCADDR UNUSED pc = abuf->addr;
1649   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1650
1651   {
1652     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 8), 8);
1653     m32rbf_h_accum_set (current_cpu, opval);
1654     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1655   }
1656
1657 #undef FLD
1658 }
1659   NEXT (vpc);
1660
1661   CASE (sem, INSN_MULWLO) : /* mulwlo $src1,$src2 */
1662 {
1663   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1664   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1665 #define FLD(f) abuf->fields.fmt_mulhi.f
1666   int UNUSED written = 0;
1667   PCADDR UNUSED pc = abuf->addr;
1668   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1669
1670   {
1671     DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 8), 8);
1672     m32rbf_h_accum_set (current_cpu, opval);
1673     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1674   }
1675
1676 #undef FLD
1677 }
1678   NEXT (vpc);
1679
1680   CASE (sem, INSN_MV) : /* mv $dr,$sr */
1681 {
1682   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1683   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1684 #define FLD(f) abuf->fields.fmt_mv.f
1685   int UNUSED written = 0;
1686   PCADDR UNUSED pc = abuf->addr;
1687   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1688
1689   {
1690     SI opval = * FLD (i_sr);
1691     * FLD (i_dr) = opval;
1692     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1693   }
1694
1695 #undef FLD
1696 }
1697   NEXT (vpc);
1698
1699   CASE (sem, INSN_MVFACHI) : /* mvfachi $dr */
1700 {
1701   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1702   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1703 #define FLD(f) abuf->fields.fmt_mvfachi.f
1704   int UNUSED written = 0;
1705   PCADDR UNUSED pc = abuf->addr;
1706   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1707
1708   {
1709     SI opval = TRUNCDISI (SRADI (m32rbf_h_accum_get (current_cpu), 32));
1710     * FLD (i_dr) = opval;
1711     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1712   }
1713
1714 #undef FLD
1715 }
1716   NEXT (vpc);
1717
1718   CASE (sem, INSN_MVFACLO) : /* mvfaclo $dr */
1719 {
1720   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1721   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1722 #define FLD(f) abuf->fields.fmt_mvfachi.f
1723   int UNUSED written = 0;
1724   PCADDR UNUSED pc = abuf->addr;
1725   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1726
1727   {
1728     SI opval = TRUNCDISI (m32rbf_h_accum_get (current_cpu));
1729     * FLD (i_dr) = opval;
1730     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1731   }
1732
1733 #undef FLD
1734 }
1735   NEXT (vpc);
1736
1737   CASE (sem, INSN_MVFACMI) : /* mvfacmi $dr */
1738 {
1739   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1740   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1741 #define FLD(f) abuf->fields.fmt_mvfachi.f
1742   int UNUSED written = 0;
1743   PCADDR UNUSED pc = abuf->addr;
1744   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1745
1746   {
1747     SI opval = TRUNCDISI (SRADI (m32rbf_h_accum_get (current_cpu), 16));
1748     * FLD (i_dr) = opval;
1749     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1750   }
1751
1752 #undef FLD
1753 }
1754   NEXT (vpc);
1755
1756   CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */
1757 {
1758   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1759   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1760 #define FLD(f) abuf->fields.fmt_mvfc.f
1761   int UNUSED written = 0;
1762   PCADDR UNUSED pc = abuf->addr;
1763   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1764
1765   {
1766     SI opval = m32rbf_h_cr_get (current_cpu, FLD (f_r2));
1767     * FLD (i_dr) = opval;
1768     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1769   }
1770
1771 #undef FLD
1772 }
1773   NEXT (vpc);
1774
1775   CASE (sem, INSN_MVTACHI) : /* mvtachi $src1 */
1776 {
1777   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1778   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1779 #define FLD(f) abuf->fields.fmt_mvtachi.f
1780   int UNUSED written = 0;
1781   PCADDR UNUSED pc = abuf->addr;
1782   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1783
1784   {
1785     DI opval = ORDI (ANDDI (m32rbf_h_accum_get (current_cpu), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
1786     m32rbf_h_accum_set (current_cpu, opval);
1787     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1788   }
1789
1790 #undef FLD
1791 }
1792   NEXT (vpc);
1793
1794   CASE (sem, INSN_MVTACLO) : /* mvtaclo $src1 */
1795 {
1796   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1797   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1798 #define FLD(f) abuf->fields.fmt_mvtachi.f
1799   int UNUSED written = 0;
1800   PCADDR UNUSED pc = abuf->addr;
1801   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1802
1803   {
1804     DI opval = ORDI (ANDDI (m32rbf_h_accum_get (current_cpu), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
1805     m32rbf_h_accum_set (current_cpu, opval);
1806     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1807   }
1808
1809 #undef FLD
1810 }
1811   NEXT (vpc);
1812
1813   CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */
1814 {
1815   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1816   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1817 #define FLD(f) abuf->fields.fmt_mvtc.f
1818   int UNUSED written = 0;
1819   PCADDR UNUSED pc = abuf->addr;
1820   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1821
1822   {
1823     USI opval = * FLD (i_sr);
1824     m32rbf_h_cr_set (current_cpu, FLD (f_r1), opval);
1825     TRACE_RESULT (current_cpu, abuf, "dcr", 'x', opval);
1826   }
1827
1828 #undef FLD
1829 }
1830   NEXT (vpc);
1831
1832   CASE (sem, INSN_NEG) : /* neg $dr,$sr */
1833 {
1834   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1835   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1836 #define FLD(f) abuf->fields.fmt_mv.f
1837   int UNUSED written = 0;
1838   PCADDR UNUSED pc = abuf->addr;
1839   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1840
1841   {
1842     SI opval = NEGSI (* FLD (i_sr));
1843     * FLD (i_dr) = opval;
1844     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1845   }
1846
1847 #undef FLD
1848 }
1849   NEXT (vpc);
1850
1851   CASE (sem, INSN_NOP) : /* nop */
1852 {
1853   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1854   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1855 #define FLD(f) abuf->fields.fmt_nop.f
1856   int UNUSED written = 0;
1857   PCADDR UNUSED pc = abuf->addr;
1858   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1859
1860 PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
1861
1862 #undef FLD
1863 }
1864   NEXT (vpc);
1865
1866   CASE (sem, INSN_NOT) : /* not $dr,$sr */
1867 {
1868   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1869   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1870 #define FLD(f) abuf->fields.fmt_mv.f
1871   int UNUSED written = 0;
1872   PCADDR UNUSED pc = abuf->addr;
1873   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1874
1875   {
1876     SI opval = INVSI (* FLD (i_sr));
1877     * FLD (i_dr) = opval;
1878     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1879   }
1880
1881 #undef FLD
1882 }
1883   NEXT (vpc);
1884
1885   CASE (sem, INSN_RAC) : /* rac */
1886 {
1887   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1888   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1889 #define FLD(f) abuf->fields.fmt_rac.f
1890   int UNUSED written = 0;
1891   PCADDR UNUSED pc = abuf->addr;
1892   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1893
1894 do {
1895   DI tmp_tmp1;
1896   tmp_tmp1 = SLLDI (m32rbf_h_accum_get (current_cpu), 1);
1897   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
1898   {
1899     DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000)));
1900     m32rbf_h_accum_set (current_cpu, opval);
1901     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1902   }
1903 } while (0);
1904
1905 #undef FLD
1906 }
1907   NEXT (vpc);
1908
1909   CASE (sem, INSN_RACH) : /* rach */
1910 {
1911   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1912   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1913 #define FLD(f) abuf->fields.fmt_rac.f
1914   int UNUSED written = 0;
1915   PCADDR UNUSED pc = abuf->addr;
1916   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1917
1918 do {
1919   DI tmp_tmp1;
1920   tmp_tmp1 = ANDDI (m32rbf_h_accum_get (current_cpu), MAKEDI (16777215, 0xffffffff));
1921 if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
1922   tmp_tmp1 = MAKEDI (16383, 0x80000000);
1923 } else {
1924 if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
1925   tmp_tmp1 = MAKEDI (16760832, 0);
1926 } else {
1927   tmp_tmp1 = ANDDI (ADDDI (m32rbf_h_accum_get (current_cpu), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
1928 }
1929 }
1930   tmp_tmp1 = SLLDI (tmp_tmp1, 1);
1931   {
1932     DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7);
1933     m32rbf_h_accum_set (current_cpu, opval);
1934     TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1935   }
1936 } while (0);
1937
1938 #undef FLD
1939 }
1940   NEXT (vpc);
1941
1942   CASE (sem, INSN_RTE) : /* rte */
1943 {
1944   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1945   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1946 #define FLD(f) abuf->fields.cti.fields.fmt_rte.f
1947   int UNUSED written = 0;
1948   PCADDR UNUSED pc = abuf->addr;
1949   SEM_BRANCH_INIT
1950   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1951
1952 do {
1953   {
1954     USI opval = ANDSI (m32rbf_h_cr_get (current_cpu, ((UINT) 6)), -4);
1955     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1956     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1957   }
1958   {
1959     USI opval = m32rbf_h_cr_get (current_cpu, ((UINT) 14));
1960     m32rbf_h_cr_set (current_cpu, ((UINT) 6), opval);
1961     TRACE_RESULT (current_cpu, abuf, "cr-6", 'x', opval);
1962   }
1963   {
1964     UQI opval = CPU (h_bpsw);
1965     m32rbf_h_psw_set (current_cpu, opval);
1966     TRACE_RESULT (current_cpu, abuf, "psw-0", 'x', opval);
1967   }
1968   {
1969     UQI opval = CPU (h_bbpsw);
1970     CPU (h_bpsw) = opval;
1971     TRACE_RESULT (current_cpu, abuf, "bpsw-0", 'x', opval);
1972   }
1973 } while (0);
1974
1975   SEM_BRANCH_FINI
1976 #undef FLD
1977 }
1978   NEXT (vpc);
1979
1980   CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */
1981 {
1982   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
1983   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1984 #define FLD(f) abuf->fields.fmt_seth.f
1985   int UNUSED written = 0;
1986   PCADDR UNUSED pc = abuf->addr;
1987   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1988
1989   {
1990     SI opval = SLLSI (FLD (f_hi16), 16);
1991     * FLD (i_dr) = opval;
1992     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1993   }
1994
1995 #undef FLD
1996 }
1997   NEXT (vpc);
1998
1999   CASE (sem, INSN_SLL) : /* sll $dr,$sr */
2000 {
2001   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2002   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2003 #define FLD(f) abuf->fields.fmt_add.f
2004   int UNUSED written = 0;
2005   PCADDR UNUSED pc = abuf->addr;
2006   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2007
2008   {
2009     SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2010     * FLD (i_dr) = opval;
2011     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2012   }
2013
2014 #undef FLD
2015 }
2016   NEXT (vpc);
2017
2018   CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */
2019 {
2020   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2021   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2022 #define FLD(f) abuf->fields.fmt_sll3.f
2023   int UNUSED written = 0;
2024   PCADDR UNUSED pc = abuf->addr;
2025   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2026
2027   {
2028     SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2029     * FLD (i_dr) = opval;
2030     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2031   }
2032
2033 #undef FLD
2034 }
2035   NEXT (vpc);
2036
2037   CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */
2038 {
2039   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2040   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2041 #define FLD(f) abuf->fields.fmt_slli.f
2042   int UNUSED written = 0;
2043   PCADDR UNUSED pc = abuf->addr;
2044   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2045
2046   {
2047     SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
2048     * FLD (i_dr) = opval;
2049     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2050   }
2051
2052 #undef FLD
2053 }
2054   NEXT (vpc);
2055
2056   CASE (sem, INSN_SRA) : /* sra $dr,$sr */
2057 {
2058   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2059   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2060 #define FLD(f) abuf->fields.fmt_add.f
2061   int UNUSED written = 0;
2062   PCADDR UNUSED pc = abuf->addr;
2063   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2064
2065   {
2066     SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2067     * FLD (i_dr) = opval;
2068     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2069   }
2070
2071 #undef FLD
2072 }
2073   NEXT (vpc);
2074
2075   CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */
2076 {
2077   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2078   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2079 #define FLD(f) abuf->fields.fmt_sll3.f
2080   int UNUSED written = 0;
2081   PCADDR UNUSED pc = abuf->addr;
2082   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2083
2084   {
2085     SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2086     * FLD (i_dr) = opval;
2087     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2088   }
2089
2090 #undef FLD
2091 }
2092   NEXT (vpc);
2093
2094   CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */
2095 {
2096   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2097   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2098 #define FLD(f) abuf->fields.fmt_slli.f
2099   int UNUSED written = 0;
2100   PCADDR UNUSED pc = abuf->addr;
2101   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2102
2103   {
2104     SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
2105     * FLD (i_dr) = opval;
2106     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2107   }
2108
2109 #undef FLD
2110 }
2111   NEXT (vpc);
2112
2113   CASE (sem, INSN_SRL) : /* srl $dr,$sr */
2114 {
2115   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2116   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2117 #define FLD(f) abuf->fields.fmt_add.f
2118   int UNUSED written = 0;
2119   PCADDR UNUSED pc = abuf->addr;
2120   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2121
2122   {
2123     SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2124     * FLD (i_dr) = opval;
2125     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2126   }
2127
2128 #undef FLD
2129 }
2130   NEXT (vpc);
2131
2132   CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */
2133 {
2134   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2135   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2136 #define FLD(f) abuf->fields.fmt_sll3.f
2137   int UNUSED written = 0;
2138   PCADDR UNUSED pc = abuf->addr;
2139   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2140
2141   {
2142     SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2143     * FLD (i_dr) = opval;
2144     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2145   }
2146
2147 #undef FLD
2148 }
2149   NEXT (vpc);
2150
2151   CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */
2152 {
2153   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2154   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2155 #define FLD(f) abuf->fields.fmt_slli.f
2156   int UNUSED written = 0;
2157   PCADDR UNUSED pc = abuf->addr;
2158   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2159
2160   {
2161     SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
2162     * FLD (i_dr) = opval;
2163     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2164   }
2165
2166 #undef FLD
2167 }
2168   NEXT (vpc);
2169
2170   CASE (sem, INSN_ST) : /* st $src1,@$src2 */
2171 {
2172   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2173   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2174 #define FLD(f) abuf->fields.fmt_st.f
2175   int UNUSED written = 0;
2176   PCADDR UNUSED pc = abuf->addr;
2177   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2178
2179   {
2180     SI opval = * FLD (i_src1);
2181     SETMEMSI (current_cpu, * FLD (i_src2), opval);
2182     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2183   }
2184
2185 #undef FLD
2186 }
2187   NEXT (vpc);
2188
2189   CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */
2190 {
2191   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2192   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2193 #define FLD(f) abuf->fields.fmt_st_d.f
2194   int UNUSED written = 0;
2195   PCADDR UNUSED pc = abuf->addr;
2196   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2197
2198   {
2199     SI opval = * FLD (i_src1);
2200     SETMEMSI (current_cpu, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2201     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2202   }
2203
2204 #undef FLD
2205 }
2206   NEXT (vpc);
2207
2208   CASE (sem, INSN_STB) : /* stb $src1,@$src2 */
2209 {
2210   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2211   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2212 #define FLD(f) abuf->fields.fmt_stb.f
2213   int UNUSED written = 0;
2214   PCADDR UNUSED pc = abuf->addr;
2215   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2216
2217   {
2218     QI opval = * FLD (i_src1);
2219     SETMEMQI (current_cpu, * FLD (i_src2), opval);
2220     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2221   }
2222
2223 #undef FLD
2224 }
2225   NEXT (vpc);
2226
2227   CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */
2228 {
2229   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2230   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2231 #define FLD(f) abuf->fields.fmt_stb_d.f
2232   int UNUSED written = 0;
2233   PCADDR UNUSED pc = abuf->addr;
2234   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2235
2236   {
2237     QI opval = * FLD (i_src1);
2238     SETMEMQI (current_cpu, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2239     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2240   }
2241
2242 #undef FLD
2243 }
2244   NEXT (vpc);
2245
2246   CASE (sem, INSN_STH) : /* sth $src1,@$src2 */
2247 {
2248   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2249   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2250 #define FLD(f) abuf->fields.fmt_sth.f
2251   int UNUSED written = 0;
2252   PCADDR UNUSED pc = abuf->addr;
2253   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2254
2255   {
2256     HI opval = * FLD (i_src1);
2257     SETMEMHI (current_cpu, * FLD (i_src2), opval);
2258     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2259   }
2260
2261 #undef FLD
2262 }
2263   NEXT (vpc);
2264
2265   CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */
2266 {
2267   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2268   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2269 #define FLD(f) abuf->fields.fmt_sth_d.f
2270   int UNUSED written = 0;
2271   PCADDR UNUSED pc = abuf->addr;
2272   vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2273
2274   {
2275     HI opval = * FLD (i_src1);
2276     SETMEMHI (current_cpu, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2277     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2278   }
2279
2280 #undef FLD
2281 }
2282   NEXT (vpc);
2283
2284   CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */
2285 {
2286   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2287   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2288 #define FLD(f) abuf->fields.fmt_st_plus.f
2289   int UNUSED written = 0;
2290   PCADDR UNUSED pc = abuf->addr;
2291   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2292
2293 do {
2294   SI tmp_new_src2;
2295   tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
2296   {
2297     SI opval = * FLD (i_src1);
2298     SETMEMSI (current_cpu, tmp_new_src2, opval);
2299     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2300   }
2301   {
2302     SI opval = tmp_new_src2;
2303     * FLD (i_src2) = opval;
2304     TRACE_RESULT (current_cpu, abuf, "src2", 'x', opval);
2305   }
2306 } while (0);
2307
2308 #undef FLD
2309 }
2310   NEXT (vpc);
2311
2312   CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */
2313 {
2314   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2315   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2316 #define FLD(f) abuf->fields.fmt_st_plus.f
2317   int UNUSED written = 0;
2318   PCADDR UNUSED pc = abuf->addr;
2319   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2320
2321 do {
2322   SI tmp_new_src2;
2323   tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
2324   {
2325     SI opval = * FLD (i_src1);
2326     SETMEMSI (current_cpu, tmp_new_src2, opval);
2327     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2328   }
2329   {
2330     SI opval = tmp_new_src2;
2331     * FLD (i_src2) = opval;
2332     TRACE_RESULT (current_cpu, abuf, "src2", 'x', opval);
2333   }
2334 } while (0);
2335
2336 #undef FLD
2337 }
2338   NEXT (vpc);
2339
2340   CASE (sem, INSN_SUB) : /* sub $dr,$sr */
2341 {
2342   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2343   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2344 #define FLD(f) abuf->fields.fmt_add.f
2345   int UNUSED written = 0;
2346   PCADDR UNUSED pc = abuf->addr;
2347   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2348
2349   {
2350     SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
2351     * FLD (i_dr) = opval;
2352     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2353   }
2354
2355 #undef FLD
2356 }
2357   NEXT (vpc);
2358
2359   CASE (sem, INSN_SUBV) : /* subv $dr,$sr */
2360 {
2361   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2362   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2363 #define FLD(f) abuf->fields.fmt_addv.f
2364   int UNUSED written = 0;
2365   PCADDR UNUSED pc = abuf->addr;
2366   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2367
2368 do {
2369   BI temp1;SI temp0;
2370   temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
2371   temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
2372   {
2373     SI opval = temp0;
2374     * FLD (i_dr) = opval;
2375     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2376   }
2377   {
2378     BI opval = temp1;
2379     CPU (h_cond) = opval;
2380     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
2381   }
2382 } while (0);
2383
2384 #undef FLD
2385 }
2386   NEXT (vpc);
2387
2388   CASE (sem, INSN_SUBX) : /* subx $dr,$sr */
2389 {
2390   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2391   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2392 #define FLD(f) abuf->fields.fmt_addx.f
2393   int UNUSED written = 0;
2394   PCADDR UNUSED pc = abuf->addr;
2395   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2396
2397 do {
2398   BI temp1;SI temp0;
2399   temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
2400   temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
2401   {
2402     SI opval = temp0;
2403     * FLD (i_dr) = opval;
2404     TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2405   }
2406   {
2407     BI opval = temp1;
2408     CPU (h_cond) = opval;
2409     TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
2410   }
2411 } while (0);
2412
2413 #undef FLD
2414 }
2415   NEXT (vpc);
2416
2417   CASE (sem, INSN_TRAP) : /* trap $uimm4 */
2418 {
2419   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2420   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2421 #define FLD(f) abuf->fields.cti.fields.fmt_trap.f
2422   int UNUSED written = 0;
2423   PCADDR UNUSED pc = abuf->addr;
2424   SEM_BRANCH_INIT
2425   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2426
2427 do {
2428   {
2429     USI opval = m32rbf_h_cr_get (current_cpu, ((UINT) 6));
2430     m32rbf_h_cr_set (current_cpu, ((UINT) 14), opval);
2431     TRACE_RESULT (current_cpu, abuf, "cr-14", 'x', opval);
2432   }
2433   {
2434     USI opval = ADDSI (pc, 4);
2435     m32rbf_h_cr_set (current_cpu, ((UINT) 6), opval);
2436     TRACE_RESULT (current_cpu, abuf, "cr-6", 'x', opval);
2437   }
2438   {
2439     UQI opval = CPU (h_bpsw);
2440     CPU (h_bbpsw) = opval;
2441     TRACE_RESULT (current_cpu, abuf, "bbpsw-0", 'x', opval);
2442   }
2443   {
2444     UQI opval = m32rbf_h_psw_get (current_cpu);
2445     CPU (h_bpsw) = opval;
2446     TRACE_RESULT (current_cpu, abuf, "bpsw-0", 'x', opval);
2447   }
2448   {
2449     UQI opval = ANDQI (m32rbf_h_psw_get (current_cpu), 128);
2450     m32rbf_h_psw_set (current_cpu, opval);
2451     TRACE_RESULT (current_cpu, abuf, "psw-0", 'x', opval);
2452   }
2453   {
2454     SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
2455     SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2456     TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
2457   }
2458 } while (0);
2459
2460   SEM_BRANCH_FINI
2461 #undef FLD
2462 }
2463   NEXT (vpc);
2464
2465   CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */
2466 {
2467   SEM_ARG sem_arg = SEM_SEM_ARG (vpc, sc);
2468   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2469 #define FLD(f) abuf->fields.fmt_unlock.f
2470   int UNUSED written = 0;
2471   PCADDR UNUSED pc = abuf->addr;
2472   vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2473
2474 do {
2475 if (CPU (h_lock)) {
2476   {
2477     SI opval = * FLD (i_src1);
2478     SETMEMSI (current_cpu, * FLD (i_src2), opval);
2479     written |= (1 << 3);
2480     TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2481   }
2482 }
2483   {
2484     BI opval = 0;
2485     CPU (h_lock) = opval;
2486     TRACE_RESULT (current_cpu, abuf, "lock-0", 'x', opval);
2487   }
2488 } while (0);
2489
2490   abuf->written = written;
2491 #undef FLD
2492 }
2493   NEXT (vpc);
2494
2495
2496     }
2497   ENDSWITCH (sem) /* End of semantic switch.  */
2498
2499   /* At this point `vpc' contains the next insn to execute.  */
2500 }
2501
2502 #undef DEFINE_SWITCH
2503 #endif /* DEFINE_SWITCH */