* "objcopy -O binary" warning tweak, suggested by dmoseley
[binutils-gdb.git] / sim / m32r / sem-switch.c
blob1ee0b60c3c9ae7d9bc5370f91673ebe9da4d9a38
1 /* Simulator instruction semantics for m32rbf.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
7 This file is part of the GNU Simulators.
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.
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.
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.
25 #ifdef DEFINE_LABELS
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. */
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 }
142 int i;
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
151 #undef DEFINE_LABELS
152 #endif /* DEFINE_LABELS */
154 #ifdef DEFINE_SWITCH
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". */
162 #if FAST_P
163 #undef TRACE_RESULT
164 #define TRACE_RESULT(cpu, abuf, name, type, val)
165 #endif
167 #undef GET_ATTR
168 #define GET_ATTR(cpu, num, attr) CGEN_INSN_ATTR (abuf->idesc->opcode, CGEN_INSN_##attr)
172 #if WITH_SCACHE_PBB
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)
178 #else /* ! WITH_SCACHE_PBB */
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
191 #endif /* ! WITH_SCACHE_PBB */
195 CASE (sem, INSN_X_INVALID) : /* --invalid-- */
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);
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 */
214 #undef FLD
216 NEXT (vpc);
218 CASE (sem, INSN_X_AFTER) : /* --after-- */
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);
228 #if WITH_SCACHE_PBB_M32RBF
229 m32rbf_pbb_after (current_cpu, sem_arg);
230 #endif
233 #undef FLD
235 NEXT (vpc);
237 CASE (sem, INSN_X_BEFORE) : /* --before-- */
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);
247 #if WITH_SCACHE_PBB_M32RBF
248 m32rbf_pbb_before (current_cpu, sem_arg);
249 #endif
252 #undef FLD
254 NEXT (vpc);
256 CASE (sem, INSN_X_CTI_CHAIN) : /* --cti-chain-- */
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);
266 #if WITH_SCACHE_PBB_M32RBF
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
280 #undef FLD
282 NEXT (vpc);
284 CASE (sem, INSN_X_CHAIN) : /* --chain-- */
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);
294 #if WITH_SCACHE_PBB_M32RBF
295 vpc = m32rbf_pbb_chain (current_cpu, sem_arg);
296 #ifdef DEFINE_SWITCH
297 BREAK (sem);
298 #endif
299 #endif
302 #undef FLD
304 NEXT (vpc);
306 CASE (sem, INSN_X_BEGIN) : /* --begin-- */
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);
316 #if WITH_SCACHE_PBB_M32RBF
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
327 #undef FLD
329 NEXT (vpc);
331 CASE (sem, INSN_ADD) : /* add $dr,$sr */
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);
341 SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
342 * FLD (i_dr) = opval;
343 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
346 #undef FLD
348 NEXT (vpc);
350 CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */
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);
360 SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
361 * FLD (i_dr) = opval;
362 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
365 #undef FLD
367 NEXT (vpc);
369 CASE (sem, INSN_AND) : /* and $dr,$sr */
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);
379 SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
380 * FLD (i_dr) = opval;
381 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
384 #undef FLD
386 NEXT (vpc);
388 CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */
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);
398 SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
399 * FLD (i_dr) = opval;
400 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
403 #undef FLD
405 NEXT (vpc);
407 CASE (sem, INSN_OR) : /* or $dr,$sr */
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);
417 SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
418 * FLD (i_dr) = opval;
419 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
422 #undef FLD
424 NEXT (vpc);
426 CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */
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);
436 SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
437 * FLD (i_dr) = opval;
438 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
441 #undef FLD
443 NEXT (vpc);
445 CASE (sem, INSN_XOR) : /* xor $dr,$sr */
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);
455 SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
456 * FLD (i_dr) = opval;
457 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
460 #undef FLD
462 NEXT (vpc);
464 CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */
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);
474 SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
475 * FLD (i_dr) = opval;
476 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
479 #undef FLD
481 NEXT (vpc);
483 CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */
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);
493 SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
494 * FLD (i_dr) = opval;
495 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
498 #undef FLD
500 NEXT (vpc);
502 CASE (sem, INSN_ADDV) : /* addv $dr,$sr */
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);
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);
516 SI opval = temp0;
517 * FLD (i_dr) = opval;
518 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
521 BI opval = temp1;
522 CPU (h_cond) = opval;
523 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
525 } while (0);
527 #undef FLD
529 NEXT (vpc);
531 CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */
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);
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);
545 SI opval = temp0;
546 * FLD (i_dr) = opval;
547 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
550 BI opval = temp1;
551 CPU (h_cond) = opval;
552 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
554 } while (0);
556 #undef FLD
558 NEXT (vpc);
560 CASE (sem, INSN_ADDX) : /* addx $dr,$sr */
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);
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));
574 SI opval = temp0;
575 * FLD (i_dr) = opval;
576 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
579 BI opval = temp1;
580 CPU (h_cond) = opval;
581 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
583 } while (0);
585 #undef FLD
587 NEXT (vpc);
589 CASE (sem, INSN_BC8) : /* bc.s $disp8 */
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);
599 if (CPU (h_cond)) {
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);
608 abuf->written = written;
609 SEM_BRANCH_FINI (vpc);
610 #undef FLD
612 NEXT (vpc);
614 CASE (sem, INSN_BC24) : /* bc.l $disp24 */
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);
624 if (CPU (h_cond)) {
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);
633 abuf->written = written;
634 SEM_BRANCH_FINI (vpc);
635 #undef FLD
637 NEXT (vpc);
639 CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */
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);
649 if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
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);
658 abuf->written = written;
659 SEM_BRANCH_FINI (vpc);
660 #undef FLD
662 NEXT (vpc);
664 CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */
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);
674 if (EQSI (* FLD (i_src2), 0)) {
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);
683 abuf->written = written;
684 SEM_BRANCH_FINI (vpc);
685 #undef FLD
687 NEXT (vpc);
689 CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */
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);
699 if (GESI (* FLD (i_src2), 0)) {
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);
708 abuf->written = written;
709 SEM_BRANCH_FINI (vpc);
710 #undef FLD
712 NEXT (vpc);
714 CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */
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);
724 if (GTSI (* FLD (i_src2), 0)) {
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);
733 abuf->written = written;
734 SEM_BRANCH_FINI (vpc);
735 #undef FLD
737 NEXT (vpc);
739 CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */
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);
749 if (LESI (* FLD (i_src2), 0)) {
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);
758 abuf->written = written;
759 SEM_BRANCH_FINI (vpc);
760 #undef FLD
762 NEXT (vpc);
764 CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */
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);
774 if (LTSI (* FLD (i_src2), 0)) {
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);
783 abuf->written = written;
784 SEM_BRANCH_FINI (vpc);
785 #undef FLD
787 NEXT (vpc);
789 CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */
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);
799 if (NESI (* FLD (i_src2), 0)) {
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);
808 abuf->written = written;
809 SEM_BRANCH_FINI (vpc);
810 #undef FLD
812 NEXT (vpc);
814 CASE (sem, INSN_BL8) : /* bl.s $disp8 */
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);
824 do {
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);
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);
835 } while (0);
837 SEM_BRANCH_FINI (vpc);
838 #undef FLD
840 NEXT (vpc);
842 CASE (sem, INSN_BL24) : /* bl.l $disp24 */
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);
852 do {
854 SI opval = ADDSI (pc, 4);
855 CPU (h_gr[((UINT) 14)]) = opval;
856 TRACE_RESULT (current_cpu, abuf, "gr-14", 'x', opval);
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);
863 } while (0);
865 SEM_BRANCH_FINI (vpc);
866 #undef FLD
868 NEXT (vpc);
870 CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */
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);
880 if (NOTBI (CPU (h_cond))) {
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);
889 abuf->written = written;
890 SEM_BRANCH_FINI (vpc);
891 #undef FLD
893 NEXT (vpc);
895 CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */
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);
905 if (NOTBI (CPU (h_cond))) {
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);
914 abuf->written = written;
915 SEM_BRANCH_FINI (vpc);
916 #undef FLD
918 NEXT (vpc);
920 CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */
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);
930 if (NESI (* FLD (i_src1), * FLD (i_src2))) {
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);
939 abuf->written = written;
940 SEM_BRANCH_FINI (vpc);
941 #undef FLD
943 NEXT (vpc);
945 CASE (sem, INSN_BRA8) : /* bra.s $disp8 */
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);
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);
961 SEM_BRANCH_FINI (vpc);
962 #undef FLD
964 NEXT (vpc);
966 CASE (sem, INSN_BRA24) : /* bra.l $disp24 */
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);
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);
982 SEM_BRANCH_FINI (vpc);
983 #undef FLD
985 NEXT (vpc);
987 CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */
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);
997 BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
998 CPU (h_cond) = opval;
999 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
1002 #undef FLD
1004 NEXT (vpc);
1006 CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */
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);
1016 BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
1017 CPU (h_cond) = opval;
1018 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
1021 #undef FLD
1023 NEXT (vpc);
1025 CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */
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);
1035 BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
1036 CPU (h_cond) = opval;
1037 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
1040 #undef FLD
1042 NEXT (vpc);
1044 CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */
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);
1054 BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
1055 CPU (h_cond) = opval;
1056 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
1059 #undef FLD
1061 NEXT (vpc);
1063 CASE (sem, INSN_DIV) : /* div $dr,$sr */
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);
1072 if (NESI (* FLD (i_sr), 0)) {
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);
1081 abuf->written = written;
1082 #undef FLD
1084 NEXT (vpc);
1086 CASE (sem, INSN_DIVU) : /* divu $dr,$sr */
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);
1095 if (NESI (* FLD (i_sr), 0)) {
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);
1104 abuf->written = written;
1105 #undef FLD
1107 NEXT (vpc);
1109 CASE (sem, INSN_REM) : /* rem $dr,$sr */
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);
1118 if (NESI (* FLD (i_sr), 0)) {
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);
1127 abuf->written = written;
1128 #undef FLD
1130 NEXT (vpc);
1132 CASE (sem, INSN_REMU) : /* remu $dr,$sr */
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);
1141 if (NESI (* FLD (i_sr), 0)) {
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);
1150 abuf->written = written;
1151 #undef FLD
1153 NEXT (vpc);
1155 CASE (sem, INSN_JL) : /* jl $sr */
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);
1165 do {
1166 USI temp1;SI temp0;
1167 temp0 = ADDSI (ANDSI (pc, -4), 4);
1168 temp1 = ANDSI (* FLD (i_sr), -4);
1170 SI opval = temp0;
1171 CPU (h_gr[((UINT) 14)]) = opval;
1172 TRACE_RESULT (current_cpu, abuf, "gr-14", 'x', opval);
1175 USI opval = temp1;
1176 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1177 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1179 } while (0);
1181 SEM_BRANCH_FINI (vpc);
1182 #undef FLD
1184 NEXT (vpc);
1186 CASE (sem, INSN_JMP) : /* jmp $sr */
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);
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);
1202 SEM_BRANCH_FINI (vpc);
1203 #undef FLD
1205 NEXT (vpc);
1207 CASE (sem, INSN_LD) : /* ld $dr,@$sr */
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);
1217 SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1218 * FLD (i_dr) = opval;
1219 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1222 #undef FLD
1224 NEXT (vpc);
1226 CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */
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);
1236 SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)));
1237 * FLD (i_dr) = opval;
1238 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1241 #undef FLD
1243 NEXT (vpc);
1245 CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */
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);
1255 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
1256 * FLD (i_dr) = opval;
1257 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1260 #undef FLD
1262 NEXT (vpc);
1264 CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */
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);
1274 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1275 * FLD (i_dr) = opval;
1276 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1279 #undef FLD
1281 NEXT (vpc);
1283 CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */
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);
1293 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
1294 * FLD (i_dr) = opval;
1295 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1298 #undef FLD
1300 NEXT (vpc);
1302 CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */
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);
1312 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1313 * FLD (i_dr) = opval;
1314 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1317 #undef FLD
1319 NEXT (vpc);
1321 CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */
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);
1331 SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
1332 * FLD (i_dr) = opval;
1333 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1336 #undef FLD
1338 NEXT (vpc);
1340 CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */
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);
1350 SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1351 * FLD (i_dr) = opval;
1352 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1355 #undef FLD
1357 NEXT (vpc);
1359 CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */
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);
1369 SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
1370 * FLD (i_dr) = opval;
1371 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1374 #undef FLD
1376 NEXT (vpc);
1378 CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */
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);
1388 SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1389 * FLD (i_dr) = opval;
1390 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1393 #undef FLD
1395 NEXT (vpc);
1397 CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */
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);
1406 do {
1407 SI temp1;SI temp0;
1408 temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1409 temp1 = ADDSI (* FLD (i_sr), 4);
1411 SI opval = temp0;
1412 * FLD (i_dr) = opval;
1413 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1416 SI opval = temp1;
1417 * FLD (i_sr) = opval;
1418 TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
1420 } while (0);
1422 #undef FLD
1424 NEXT (vpc);
1426 CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */
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);
1436 SI opval = FLD (i_uimm24);
1437 * FLD (i_dr) = opval;
1438 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1441 #undef FLD
1443 NEXT (vpc);
1445 CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */
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);
1455 SI opval = FLD (f_simm8);
1456 * FLD (i_dr) = opval;
1457 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1460 #undef FLD
1462 NEXT (vpc);
1464 CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */
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);
1474 SI opval = FLD (f_simm16);
1475 * FLD (i_dr) = opval;
1476 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1479 #undef FLD
1481 NEXT (vpc);
1483 CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */
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);
1492 do {
1494 BI opval = 1;
1495 CPU (h_lock) = opval;
1496 TRACE_RESULT (current_cpu, abuf, "lock-0", 'x', opval);
1499 SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1500 * FLD (i_dr) = opval;
1501 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1503 } while (0);
1505 #undef FLD
1507 NEXT (vpc);
1509 CASE (sem, INSN_MACHI) : /* machi $src1,$src2 */
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);
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);
1524 #undef FLD
1526 NEXT (vpc);
1528 CASE (sem, INSN_MACLO) : /* maclo $src1,$src2 */
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);
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);
1543 #undef FLD
1545 NEXT (vpc);
1547 CASE (sem, INSN_MACWHI) : /* macwhi $src1,$src2 */
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);
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);
1562 #undef FLD
1564 NEXT (vpc);
1566 CASE (sem, INSN_MACWLO) : /* macwlo $src1,$src2 */
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);
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);
1581 #undef FLD
1583 NEXT (vpc);
1585 CASE (sem, INSN_MUL) : /* mul $dr,$sr */
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);
1595 SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
1596 * FLD (i_dr) = opval;
1597 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1600 #undef FLD
1602 NEXT (vpc);
1604 CASE (sem, INSN_MULHI) : /* mulhi $src1,$src2 */
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);
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);
1619 #undef FLD
1621 NEXT (vpc);
1623 CASE (sem, INSN_MULLO) : /* mullo $src1,$src2 */
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);
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);
1638 #undef FLD
1640 NEXT (vpc);
1642 CASE (sem, INSN_MULWHI) : /* mulwhi $src1,$src2 */
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);
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);
1657 #undef FLD
1659 NEXT (vpc);
1661 CASE (sem, INSN_MULWLO) : /* mulwlo $src1,$src2 */
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);
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);
1676 #undef FLD
1678 NEXT (vpc);
1680 CASE (sem, INSN_MV) : /* mv $dr,$sr */
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);
1690 SI opval = * FLD (i_sr);
1691 * FLD (i_dr) = opval;
1692 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1695 #undef FLD
1697 NEXT (vpc);
1699 CASE (sem, INSN_MVFACHI) : /* mvfachi $dr */
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);
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);
1714 #undef FLD
1716 NEXT (vpc);
1718 CASE (sem, INSN_MVFACLO) : /* mvfaclo $dr */
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);
1728 SI opval = TRUNCDISI (m32rbf_h_accum_get (current_cpu));
1729 * FLD (i_dr) = opval;
1730 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1733 #undef FLD
1735 NEXT (vpc);
1737 CASE (sem, INSN_MVFACMI) : /* mvfacmi $dr */
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);
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);
1752 #undef FLD
1754 NEXT (vpc);
1756 CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */
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);
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);
1771 #undef FLD
1773 NEXT (vpc);
1775 CASE (sem, INSN_MVTACHI) : /* mvtachi $src1 */
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);
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);
1790 #undef FLD
1792 NEXT (vpc);
1794 CASE (sem, INSN_MVTACLO) : /* mvtaclo $src1 */
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);
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);
1809 #undef FLD
1811 NEXT (vpc);
1813 CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */
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);
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);
1828 #undef FLD
1830 NEXT (vpc);
1832 CASE (sem, INSN_NEG) : /* neg $dr,$sr */
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);
1842 SI opval = NEGSI (* FLD (i_sr));
1843 * FLD (i_dr) = opval;
1844 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1847 #undef FLD
1849 NEXT (vpc);
1851 CASE (sem, INSN_NOP) : /* nop */
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);
1860 PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
1862 #undef FLD
1864 NEXT (vpc);
1866 CASE (sem, INSN_NOT) : /* not $dr,$sr */
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);
1876 SI opval = INVSI (* FLD (i_sr));
1877 * FLD (i_dr) = opval;
1878 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1881 #undef FLD
1883 NEXT (vpc);
1885 CASE (sem, INSN_RAC) : /* rac */
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);
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));
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);
1903 } while (0);
1905 #undef FLD
1907 NEXT (vpc);
1909 CASE (sem, INSN_RACH) : /* rach */
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);
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));
1930 tmp_tmp1 = SLLDI (tmp_tmp1, 1);
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);
1936 } while (0);
1938 #undef FLD
1940 NEXT (vpc);
1942 CASE (sem, INSN_RTE) : /* rte */
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);
1952 do {
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);
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);
1964 UQI opval = CPU (h_bpsw);
1965 m32rbf_h_psw_set (current_cpu, opval);
1966 TRACE_RESULT (current_cpu, abuf, "psw-0", 'x', opval);
1969 UQI opval = CPU (h_bbpsw);
1970 CPU (h_bpsw) = opval;
1971 TRACE_RESULT (current_cpu, abuf, "bpsw-0", 'x', opval);
1973 } while (0);
1975 SEM_BRANCH_FINI (vpc);
1976 #undef FLD
1978 NEXT (vpc);
1980 CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */
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);
1990 SI opval = SLLSI (FLD (f_hi16), 16);
1991 * FLD (i_dr) = opval;
1992 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
1995 #undef FLD
1997 NEXT (vpc);
1999 CASE (sem, INSN_SLL) : /* sll $dr,$sr */
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);
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);
2014 #undef FLD
2016 NEXT (vpc);
2018 CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */
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);
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);
2033 #undef FLD
2035 NEXT (vpc);
2037 CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */
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);
2047 SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
2048 * FLD (i_dr) = opval;
2049 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2052 #undef FLD
2054 NEXT (vpc);
2056 CASE (sem, INSN_SRA) : /* sra $dr,$sr */
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);
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);
2071 #undef FLD
2073 NEXT (vpc);
2075 CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */
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);
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);
2090 #undef FLD
2092 NEXT (vpc);
2094 CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */
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);
2104 SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
2105 * FLD (i_dr) = opval;
2106 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2109 #undef FLD
2111 NEXT (vpc);
2113 CASE (sem, INSN_SRL) : /* srl $dr,$sr */
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);
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);
2128 #undef FLD
2130 NEXT (vpc);
2132 CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */
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);
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);
2147 #undef FLD
2149 NEXT (vpc);
2151 CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */
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);
2161 SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
2162 * FLD (i_dr) = opval;
2163 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2166 #undef FLD
2168 NEXT (vpc);
2170 CASE (sem, INSN_ST) : /* st $src1,@$src2 */
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);
2180 SI opval = * FLD (i_src1);
2181 SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2182 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2185 #undef FLD
2187 NEXT (vpc);
2189 CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */
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);
2199 SI opval = * FLD (i_src1);
2200 SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2201 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2204 #undef FLD
2206 NEXT (vpc);
2208 CASE (sem, INSN_STB) : /* stb $src1,@$src2 */
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);
2218 QI opval = * FLD (i_src1);
2219 SETMEMQI (current_cpu, pc, * FLD (i_src2), opval);
2220 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2223 #undef FLD
2225 NEXT (vpc);
2227 CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */
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);
2237 QI opval = * FLD (i_src1);
2238 SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2239 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2242 #undef FLD
2244 NEXT (vpc);
2246 CASE (sem, INSN_STH) : /* sth $src1,@$src2 */
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);
2256 HI opval = * FLD (i_src1);
2257 SETMEMHI (current_cpu, pc, * FLD (i_src2), opval);
2258 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2261 #undef FLD
2263 NEXT (vpc);
2265 CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */
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);
2275 HI opval = * FLD (i_src1);
2276 SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2277 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2280 #undef FLD
2282 NEXT (vpc);
2284 CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */
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);
2293 do {
2294 SI tmp_new_src2;
2295 tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
2297 SI opval = * FLD (i_src1);
2298 SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2299 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2302 SI opval = tmp_new_src2;
2303 * FLD (i_src2) = opval;
2304 TRACE_RESULT (current_cpu, abuf, "src2", 'x', opval);
2306 } while (0);
2308 #undef FLD
2310 NEXT (vpc);
2312 CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */
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);
2321 do {
2322 SI tmp_new_src2;
2323 tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
2325 SI opval = * FLD (i_src1);
2326 SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2327 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2330 SI opval = tmp_new_src2;
2331 * FLD (i_src2) = opval;
2332 TRACE_RESULT (current_cpu, abuf, "src2", 'x', opval);
2334 } while (0);
2336 #undef FLD
2338 NEXT (vpc);
2340 CASE (sem, INSN_SUB) : /* sub $dr,$sr */
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);
2350 SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
2351 * FLD (i_dr) = opval;
2352 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2355 #undef FLD
2357 NEXT (vpc);
2359 CASE (sem, INSN_SUBV) : /* subv $dr,$sr */
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);
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);
2373 SI opval = temp0;
2374 * FLD (i_dr) = opval;
2375 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2378 BI opval = temp1;
2379 CPU (h_cond) = opval;
2380 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
2382 } while (0);
2384 #undef FLD
2386 NEXT (vpc);
2388 CASE (sem, INSN_SUBX) : /* subx $dr,$sr */
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);
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));
2402 SI opval = temp0;
2403 * FLD (i_dr) = opval;
2404 TRACE_RESULT (current_cpu, abuf, "dr", 'x', opval);
2407 BI opval = temp1;
2408 CPU (h_cond) = opval;
2409 TRACE_RESULT (current_cpu, abuf, "condbit", 'x', opval);
2411 } while (0);
2413 #undef FLD
2415 NEXT (vpc);
2417 CASE (sem, INSN_TRAP) : /* trap $uimm4 */
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);
2427 do {
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);
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);
2439 UQI opval = CPU (h_bpsw);
2440 CPU (h_bbpsw) = opval;
2441 TRACE_RESULT (current_cpu, abuf, "bbpsw-0", 'x', opval);
2444 UQI opval = m32rbf_h_psw_get (current_cpu);
2445 CPU (h_bpsw) = opval;
2446 TRACE_RESULT (current_cpu, abuf, "bpsw-0", 'x', opval);
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);
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);
2458 } while (0);
2460 SEM_BRANCH_FINI (vpc);
2461 #undef FLD
2463 NEXT (vpc);
2465 CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */
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);
2474 do {
2475 if (CPU (h_lock)) {
2477 SI opval = * FLD (i_src1);
2478 SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2479 written |= (1 << 3);
2480 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2484 BI opval = 0;
2485 CPU (h_lock) = opval;
2486 TRACE_RESULT (current_cpu, abuf, "lock-0", 'x', opval);
2488 } while (0);
2490 abuf->written = written;
2491 #undef FLD
2493 NEXT (vpc);
2497 ENDSWITCH (sem) /* End of semantic switch. */
2499 /* At this point `vpc' contains the next insn to execute. */
2502 #undef DEFINE_SWITCH
2503 #endif /* DEFINE_SWITCH */