* m32r-sim.h (m32r_trap): Update prototype.
[deliverable/binutils-gdb.git] / sim / m32r / sem-switch.c
CommitLineData
190659a2 1/* Simulator instruction semantics for m32rb.
2ddc0492 2
190659a2 3THIS FILE IS MACHINE GENERATED WITH CGEN.
e0bd6e18 4
2ddc0492
DE
5Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
6
7This file is part of the GNU Simulators.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2, or (at your option)
12any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License along
20with this program; if not, write to the Free Software Foundation, Inc.,
2159 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22
23*/
24
25#ifdef DEFINE_LABELS
26#undef DEFINE_LABELS
27
2ddc0492
DE
28 /* The labels have the case they have because the enum of insn types
29 is all uppercase and in the non-stdc case the insn symbol is built
a8981d67
DE
30 into the enum name. */
31
32 static struct {
33 int index;
34 void *label;
35 } labels[] = {
190659a2
DE
36 { M32RB_XINSN_ILLEGAL, && case_sem_INSN_ILLEGAL },
37 { M32RB_XINSN_ADD, && case_sem_INSN_ADD },
38 { M32RB_XINSN_ADD3, && case_sem_INSN_ADD3 },
39 { M32RB_XINSN_AND, && case_sem_INSN_AND },
40 { M32RB_XINSN_AND3, && case_sem_INSN_AND3 },
41 { M32RB_XINSN_OR, && case_sem_INSN_OR },
42 { M32RB_XINSN_OR3, && case_sem_INSN_OR3 },
43 { M32RB_XINSN_XOR, && case_sem_INSN_XOR },
44 { M32RB_XINSN_XOR3, && case_sem_INSN_XOR3 },
45 { M32RB_XINSN_ADDI, && case_sem_INSN_ADDI },
46 { M32RB_XINSN_ADDV, && case_sem_INSN_ADDV },
47 { M32RB_XINSN_ADDV3, && case_sem_INSN_ADDV3 },
48 { M32RB_XINSN_ADDX, && case_sem_INSN_ADDX },
49 { M32RB_XINSN_BC8, && case_sem_INSN_BC8 },
50 { M32RB_XINSN_BC24, && case_sem_INSN_BC24 },
51 { M32RB_XINSN_BEQ, && case_sem_INSN_BEQ },
52 { M32RB_XINSN_BEQZ, && case_sem_INSN_BEQZ },
53 { M32RB_XINSN_BGEZ, && case_sem_INSN_BGEZ },
54 { M32RB_XINSN_BGTZ, && case_sem_INSN_BGTZ },
55 { M32RB_XINSN_BLEZ, && case_sem_INSN_BLEZ },
56 { M32RB_XINSN_BLTZ, && case_sem_INSN_BLTZ },
57 { M32RB_XINSN_BNEZ, && case_sem_INSN_BNEZ },
58 { M32RB_XINSN_BL8, && case_sem_INSN_BL8 },
59 { M32RB_XINSN_BL24, && case_sem_INSN_BL24 },
60 { M32RB_XINSN_BNC8, && case_sem_INSN_BNC8 },
61 { M32RB_XINSN_BNC24, && case_sem_INSN_BNC24 },
62 { M32RB_XINSN_BNE, && case_sem_INSN_BNE },
63 { M32RB_XINSN_BRA8, && case_sem_INSN_BRA8 },
64 { M32RB_XINSN_BRA24, && case_sem_INSN_BRA24 },
65 { M32RB_XINSN_CMP, && case_sem_INSN_CMP },
66 { M32RB_XINSN_CMPI, && case_sem_INSN_CMPI },
67 { M32RB_XINSN_CMPU, && case_sem_INSN_CMPU },
68 { M32RB_XINSN_CMPUI, && case_sem_INSN_CMPUI },
69 { M32RB_XINSN_DIV, && case_sem_INSN_DIV },
70 { M32RB_XINSN_DIVU, && case_sem_INSN_DIVU },
71 { M32RB_XINSN_REM, && case_sem_INSN_REM },
72 { M32RB_XINSN_REMU, && case_sem_INSN_REMU },
73 { M32RB_XINSN_JL, && case_sem_INSN_JL },
74 { M32RB_XINSN_JMP, && case_sem_INSN_JMP },
75 { M32RB_XINSN_LD, && case_sem_INSN_LD },
76 { M32RB_XINSN_LD_D, && case_sem_INSN_LD_D },
77 { M32RB_XINSN_LDB, && case_sem_INSN_LDB },
78 { M32RB_XINSN_LDB_D, && case_sem_INSN_LDB_D },
79 { M32RB_XINSN_LDH, && case_sem_INSN_LDH },
80 { M32RB_XINSN_LDH_D, && case_sem_INSN_LDH_D },
81 { M32RB_XINSN_LDUB, && case_sem_INSN_LDUB },
82 { M32RB_XINSN_LDUB_D, && case_sem_INSN_LDUB_D },
83 { M32RB_XINSN_LDUH, && case_sem_INSN_LDUH },
84 { M32RB_XINSN_LDUH_D, && case_sem_INSN_LDUH_D },
85 { M32RB_XINSN_LD_PLUS, && case_sem_INSN_LD_PLUS },
86 { M32RB_XINSN_LD24, && case_sem_INSN_LD24 },
87 { M32RB_XINSN_LDI8, && case_sem_INSN_LDI8 },
88 { M32RB_XINSN_LDI16, && case_sem_INSN_LDI16 },
89 { M32RB_XINSN_LOCK, && case_sem_INSN_LOCK },
90 { M32RB_XINSN_MACHI, && case_sem_INSN_MACHI },
91 { M32RB_XINSN_MACLO, && case_sem_INSN_MACLO },
92 { M32RB_XINSN_MACWHI, && case_sem_INSN_MACWHI },
93 { M32RB_XINSN_MACWLO, && case_sem_INSN_MACWLO },
94 { M32RB_XINSN_MUL, && case_sem_INSN_MUL },
95 { M32RB_XINSN_MULHI, && case_sem_INSN_MULHI },
96 { M32RB_XINSN_MULLO, && case_sem_INSN_MULLO },
97 { M32RB_XINSN_MULWHI, && case_sem_INSN_MULWHI },
98 { M32RB_XINSN_MULWLO, && case_sem_INSN_MULWLO },
99 { M32RB_XINSN_MV, && case_sem_INSN_MV },
100 { M32RB_XINSN_MVFACHI, && case_sem_INSN_MVFACHI },
101 { M32RB_XINSN_MVFACLO, && case_sem_INSN_MVFACLO },
102 { M32RB_XINSN_MVFACMI, && case_sem_INSN_MVFACMI },
103 { M32RB_XINSN_MVFC, && case_sem_INSN_MVFC },
104 { M32RB_XINSN_MVTACHI, && case_sem_INSN_MVTACHI },
105 { M32RB_XINSN_MVTACLO, && case_sem_INSN_MVTACLO },
106 { M32RB_XINSN_MVTC, && case_sem_INSN_MVTC },
107 { M32RB_XINSN_NEG, && case_sem_INSN_NEG },
108 { M32RB_XINSN_NOP, && case_sem_INSN_NOP },
109 { M32RB_XINSN_NOT, && case_sem_INSN_NOT },
110 { M32RB_XINSN_RAC, && case_sem_INSN_RAC },
111 { M32RB_XINSN_RACH, && case_sem_INSN_RACH },
112 { M32RB_XINSN_RTE, && case_sem_INSN_RTE },
113 { M32RB_XINSN_SETH, && case_sem_INSN_SETH },
114 { M32RB_XINSN_SLL, && case_sem_INSN_SLL },
115 { M32RB_XINSN_SLL3, && case_sem_INSN_SLL3 },
116 { M32RB_XINSN_SLLI, && case_sem_INSN_SLLI },
117 { M32RB_XINSN_SRA, && case_sem_INSN_SRA },
118 { M32RB_XINSN_SRA3, && case_sem_INSN_SRA3 },
119 { M32RB_XINSN_SRAI, && case_sem_INSN_SRAI },
120 { M32RB_XINSN_SRL, && case_sem_INSN_SRL },
121 { M32RB_XINSN_SRL3, && case_sem_INSN_SRL3 },
122 { M32RB_XINSN_SRLI, && case_sem_INSN_SRLI },
123 { M32RB_XINSN_ST, && case_sem_INSN_ST },
124 { M32RB_XINSN_ST_D, && case_sem_INSN_ST_D },
125 { M32RB_XINSN_STB, && case_sem_INSN_STB },
126 { M32RB_XINSN_STB_D, && case_sem_INSN_STB_D },
127 { M32RB_XINSN_STH, && case_sem_INSN_STH },
128 { M32RB_XINSN_STH_D, && case_sem_INSN_STH_D },
129 { M32RB_XINSN_ST_PLUS, && case_sem_INSN_ST_PLUS },
130 { M32RB_XINSN_ST_MINUS, && case_sem_INSN_ST_MINUS },
131 { M32RB_XINSN_SUB, && case_sem_INSN_SUB },
132 { M32RB_XINSN_SUBV, && case_sem_INSN_SUBV },
133 { M32RB_XINSN_SUBX, && case_sem_INSN_SUBX },
134 { M32RB_XINSN_TRAP, && case_sem_INSN_TRAP },
135 { M32RB_XINSN_UNLOCK, && case_sem_INSN_UNLOCK },
a8981d67 136 { 0, 0 }
2ddc0492 137 };
2ddc0492
DE
138 int i;
139
a8981d67
DE
140 for (i = 0; labels[i].label != 0; ++i)
141 CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label;
2ddc0492
DE
142
143#endif /* DEFINE_LABELS */
144
145#ifdef DEFINE_SWITCH
146#undef DEFINE_SWITCH
147
148/* If hyper-fast [well not unnecessarily slow] execution is selected, turn
149 off frills like tracing and profiling. */
150/* FIXME: A better way would be to have TRACE_RESULT check for something
151 that can cause it to be optimized out. */
152
153#if FAST_P
154#undef TRACE_RESULT
155#define TRACE_RESULT(cpu, name, type, val)
156#endif
157
158#undef GET_ATTR
a8981d67 159#define GET_ATTR(cpu, num, attr) CGEN_INSN_ATTR (abuf->idesc->opcode, CGEN_INSN_##attr)
2ddc0492
DE
160
161{
162 SEM_ARG sem_arg = sc;
163 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
e0bd6e18 164 CIA new_pc;
2ddc0492
DE
165
166 SWITCH (sem, sem_arg->semantic.sem_case)
167 {
168
169 CASE (sem, INSN_ILLEGAL) :
170{
171 sim_engine_halt (CPU_STATE (current_cpu), current_cpu, NULL, NULL_CIA/*FIXME*/,
172 sim_stopped, SIM_SIGILL);
173 BREAK (sem);
174}
175
176 CASE (sem, INSN_ADD) : /* add $dr,$sr */
177{
970a8fd6 178#define FLD(f) abuf->fields.fmt_add.f
02310b01 179 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 180
190659a2
DE
181 {
182 SI opval = ADDSI (* FLD (f_r1), * FLD (f_r2));
183 * FLD (f_r1) = opval;
184 TRACE_RESULT (current_cpu, "dr", 'x', opval);
185 }
e0bd6e18 186
2ddc0492
DE
187#undef FLD
188}
189 BREAK (sem);
190
970a8fd6 191 CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */
2ddc0492 192{
970a8fd6 193#define FLD(f) abuf->fields.fmt_add3.f
02310b01 194 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 195
190659a2
DE
196 {
197 SI opval = ADDSI (* FLD (f_r2), FLD (f_simm16));
198 * FLD (f_r1) = opval;
199 TRACE_RESULT (current_cpu, "dr", 'x', opval);
200 }
e0bd6e18 201
2ddc0492
DE
202#undef FLD
203}
204 BREAK (sem);
205
206 CASE (sem, INSN_AND) : /* and $dr,$sr */
207{
970a8fd6 208#define FLD(f) abuf->fields.fmt_add.f
02310b01 209 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 210
190659a2
DE
211 {
212 SI opval = ANDSI (* FLD (f_r1), * FLD (f_r2));
213 * FLD (f_r1) = opval;
214 TRACE_RESULT (current_cpu, "dr", 'x', opval);
215 }
e0bd6e18 216
2ddc0492
DE
217#undef FLD
218}
219 BREAK (sem);
220
970a8fd6 221 CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */
2ddc0492 222{
970a8fd6 223#define FLD(f) abuf->fields.fmt_and3.f
02310b01 224 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 225
190659a2
DE
226 {
227 SI opval = ANDSI (* FLD (f_r2), FLD (f_uimm16));
228 * FLD (f_r1) = opval;
229 TRACE_RESULT (current_cpu, "dr", 'x', opval);
230 }
e0bd6e18 231
2ddc0492
DE
232#undef FLD
233}
234 BREAK (sem);
235
236 CASE (sem, INSN_OR) : /* or $dr,$sr */
237{
970a8fd6 238#define FLD(f) abuf->fields.fmt_add.f
02310b01 239 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 240
190659a2
DE
241 {
242 SI opval = ORSI (* FLD (f_r1), * FLD (f_r2));
243 * FLD (f_r1) = opval;
244 TRACE_RESULT (current_cpu, "dr", 'x', opval);
245 }
e0bd6e18 246
2ddc0492
DE
247#undef FLD
248}
249 BREAK (sem);
250
970a8fd6 251 CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */
2ddc0492 252{
970a8fd6 253#define FLD(f) abuf->fields.fmt_or3.f
02310b01 254 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 255
190659a2
DE
256 {
257 SI opval = ORSI (* FLD (f_r2), FLD (f_uimm16));
258 * FLD (f_r1) = opval;
259 TRACE_RESULT (current_cpu, "dr", 'x', opval);
260 }
e0bd6e18 261
2ddc0492
DE
262#undef FLD
263}
264 BREAK (sem);
265
266 CASE (sem, INSN_XOR) : /* xor $dr,$sr */
267{
970a8fd6 268#define FLD(f) abuf->fields.fmt_add.f
02310b01 269 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 270
190659a2
DE
271 {
272 SI opval = XORSI (* FLD (f_r1), * FLD (f_r2));
273 * FLD (f_r1) = opval;
274 TRACE_RESULT (current_cpu, "dr", 'x', opval);
275 }
e0bd6e18 276
2ddc0492
DE
277#undef FLD
278}
279 BREAK (sem);
280
970a8fd6 281 CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */
2ddc0492 282{
970a8fd6 283#define FLD(f) abuf->fields.fmt_and3.f
02310b01 284 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 285
190659a2
DE
286 {
287 SI opval = XORSI (* FLD (f_r2), FLD (f_uimm16));
288 * FLD (f_r1) = opval;
289 TRACE_RESULT (current_cpu, "dr", 'x', opval);
290 }
e0bd6e18 291
2ddc0492
DE
292#undef FLD
293}
294 BREAK (sem);
295
970a8fd6 296 CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */
2ddc0492 297{
970a8fd6 298#define FLD(f) abuf->fields.fmt_addi.f
02310b01 299 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 300
190659a2
DE
301 {
302 SI opval = ADDSI (* FLD (f_r1), FLD (f_simm8));
303 * FLD (f_r1) = opval;
304 TRACE_RESULT (current_cpu, "dr", 'x', opval);
305 }
e0bd6e18 306
2ddc0492
DE
307#undef FLD
308}
309 BREAK (sem);
310
311 CASE (sem, INSN_ADDV) : /* addv $dr,$sr */
312{
970a8fd6 313#define FLD(f) abuf->fields.fmt_addv.f
02310b01 314 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 315
2ddc0492 316do {
a040908c 317 UBI temp1;SI temp0;
2ddc0492
DE
318 temp0 = ADDSI (* FLD (f_r1), * FLD (f_r2));
319 temp1 = ADDOFSI (* FLD (f_r1), * FLD (f_r2), 0);
190659a2
DE
320 {
321 SI opval = temp0;
322 * FLD (f_r1) = opval;
323 TRACE_RESULT (current_cpu, "dr", 'x', opval);
324 }
325 {
326 UBI opval = temp1;
327 CPU (h_cond) = opval;
328 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
329 }
2ddc0492 330} while (0);
e0bd6e18 331
2ddc0492
DE
332#undef FLD
333}
334 BREAK (sem);
335
970a8fd6 336 CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */
2ddc0492 337{
970a8fd6 338#define FLD(f) abuf->fields.fmt_addv3.f
02310b01 339 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 340
2ddc0492 341do {
a040908c 342 UBI temp1;SI temp0;
2ddc0492
DE
343 temp0 = ADDSI (* FLD (f_r2), FLD (f_simm16));
344 temp1 = ADDOFSI (* FLD (f_r2), FLD (f_simm16), 0);
190659a2
DE
345 {
346 SI opval = temp0;
347 * FLD (f_r1) = opval;
348 TRACE_RESULT (current_cpu, "dr", 'x', opval);
349 }
350 {
351 UBI opval = temp1;
352 CPU (h_cond) = opval;
353 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
354 }
2ddc0492 355} while (0);
e0bd6e18 356
2ddc0492
DE
357#undef FLD
358}
359 BREAK (sem);
360
361 CASE (sem, INSN_ADDX) : /* addx $dr,$sr */
362{
970a8fd6 363#define FLD(f) abuf->fields.fmt_addx.f
02310b01 364 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 365
2ddc0492 366do {
a040908c 367 UBI temp1;SI temp0;
2ddc0492
DE
368 temp0 = ADDCSI (* FLD (f_r1), * FLD (f_r2), CPU (h_cond));
369 temp1 = ADDCFSI (* FLD (f_r1), * FLD (f_r2), CPU (h_cond));
190659a2
DE
370 {
371 SI opval = temp0;
372 * FLD (f_r1) = opval;
373 TRACE_RESULT (current_cpu, "dr", 'x', opval);
374 }
375 {
376 UBI opval = temp1;
377 CPU (h_cond) = opval;
378 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
379 }
2ddc0492 380} while (0);
e0bd6e18 381
2ddc0492
DE
382#undef FLD
383}
384 BREAK (sem);
385
a8981d67 386 CASE (sem, INSN_BC8) : /* bc.s $disp8 */
2ddc0492 387{
970a8fd6 388#define FLD(f) abuf->fields.fmt_bc8.f
02310b01 389 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 390
2ddc0492 391if (CPU (h_cond)) {
190659a2
DE
392 {
393 USI opval = FLD (f_disp8);
394 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
395 TRACE_RESULT (current_cpu, "pc", 'x', opval);
396 }
2ddc0492 397}
e0bd6e18 398
2ddc0492
DE
399#undef FLD
400}
401 BREAK (sem);
402
a8981d67 403 CASE (sem, INSN_BC24) : /* bc.l $disp24 */
2ddc0492 404{
970a8fd6 405#define FLD(f) abuf->fields.fmt_bc24.f
02310b01 406 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 407
2ddc0492 408if (CPU (h_cond)) {
190659a2
DE
409 {
410 USI opval = FLD (f_disp24);
411 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
412 TRACE_RESULT (current_cpu, "pc", 'x', opval);
413 }
2ddc0492 414}
e0bd6e18 415
2ddc0492
DE
416#undef FLD
417}
418 BREAK (sem);
419
420 CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */
421{
970a8fd6 422#define FLD(f) abuf->fields.fmt_beq.f
02310b01 423 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 424
2ddc0492 425if (EQSI (* FLD (f_r1), * FLD (f_r2))) {
190659a2
DE
426 {
427 USI opval = FLD (f_disp16);
428 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
429 TRACE_RESULT (current_cpu, "pc", 'x', opval);
430 }
2ddc0492 431}
e0bd6e18 432
2ddc0492
DE
433#undef FLD
434}
435 BREAK (sem);
436
437 CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */
438{
970a8fd6 439#define FLD(f) abuf->fields.fmt_beqz.f
02310b01 440 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 441
2ddc0492 442if (EQSI (* FLD (f_r2), 0)) {
190659a2
DE
443 {
444 USI opval = FLD (f_disp16);
445 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
446 TRACE_RESULT (current_cpu, "pc", 'x', opval);
447 }
2ddc0492 448}
e0bd6e18 449
2ddc0492
DE
450#undef FLD
451}
452 BREAK (sem);
453
454 CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */
455{
970a8fd6 456#define FLD(f) abuf->fields.fmt_beqz.f
02310b01 457 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 458
2ddc0492 459if (GESI (* FLD (f_r2), 0)) {
190659a2
DE
460 {
461 USI opval = FLD (f_disp16);
462 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
463 TRACE_RESULT (current_cpu, "pc", 'x', opval);
464 }
2ddc0492 465}
e0bd6e18 466
2ddc0492
DE
467#undef FLD
468}
469 BREAK (sem);
470
471 CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */
472{
970a8fd6 473#define FLD(f) abuf->fields.fmt_beqz.f
02310b01 474 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 475
2ddc0492 476if (GTSI (* FLD (f_r2), 0)) {
190659a2
DE
477 {
478 USI opval = FLD (f_disp16);
479 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
480 TRACE_RESULT (current_cpu, "pc", 'x', opval);
481 }
2ddc0492 482}
e0bd6e18 483
2ddc0492
DE
484#undef FLD
485}
486 BREAK (sem);
487
488 CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */
489{
970a8fd6 490#define FLD(f) abuf->fields.fmt_beqz.f
02310b01 491 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 492
2ddc0492 493if (LESI (* FLD (f_r2), 0)) {
190659a2
DE
494 {
495 USI opval = FLD (f_disp16);
496 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
497 TRACE_RESULT (current_cpu, "pc", 'x', opval);
498 }
2ddc0492 499}
e0bd6e18 500
2ddc0492
DE
501#undef FLD
502}
503 BREAK (sem);
504
505 CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */
506{
970a8fd6 507#define FLD(f) abuf->fields.fmt_beqz.f
02310b01 508 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 509
2ddc0492 510if (LTSI (* FLD (f_r2), 0)) {
190659a2
DE
511 {
512 USI opval = FLD (f_disp16);
513 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
514 TRACE_RESULT (current_cpu, "pc", 'x', opval);
515 }
2ddc0492 516}
e0bd6e18 517
2ddc0492
DE
518#undef FLD
519}
520 BREAK (sem);
521
522 CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */
523{
970a8fd6 524#define FLD(f) abuf->fields.fmt_beqz.f
02310b01 525 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 526
2ddc0492 527if (NESI (* FLD (f_r2), 0)) {
190659a2
DE
528 {
529 USI opval = FLD (f_disp16);
530 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
531 TRACE_RESULT (current_cpu, "pc", 'x', opval);
532 }
2ddc0492 533}
e0bd6e18 534
2ddc0492
DE
535#undef FLD
536}
537 BREAK (sem);
538
a8981d67 539 CASE (sem, INSN_BL8) : /* bl.s $disp8 */
2ddc0492 540{
970a8fd6 541#define FLD(f) abuf->fields.fmt_bl8.f
02310b01 542 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 543
2ddc0492 544do {
190659a2
DE
545 {
546 SI opval = ADDSI (ANDSI (CPU (h_pc), -4), 4);
547 CPU (h_gr[((HOSTUINT) 14)]) = opval;
548 TRACE_RESULT (current_cpu, "gr-14", 'x', opval);
549 }
550 {
551 USI opval = FLD (f_disp8);
552 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
553 TRACE_RESULT (current_cpu, "pc", 'x', opval);
554 }
2ddc0492 555} while (0);
e0bd6e18 556
2ddc0492
DE
557#undef FLD
558}
559 BREAK (sem);
560
a8981d67 561 CASE (sem, INSN_BL24) : /* bl.l $disp24 */
2ddc0492 562{
970a8fd6 563#define FLD(f) abuf->fields.fmt_bl24.f
02310b01 564 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 565
2ddc0492 566do {
190659a2
DE
567 {
568 SI opval = ADDSI (CPU (h_pc), 4);
569 CPU (h_gr[((HOSTUINT) 14)]) = opval;
570 TRACE_RESULT (current_cpu, "gr-14", 'x', opval);
571 }
572 {
573 USI opval = FLD (f_disp24);
574 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
575 TRACE_RESULT (current_cpu, "pc", 'x', opval);
576 }
2ddc0492 577} while (0);
e0bd6e18 578
2ddc0492
DE
579#undef FLD
580}
581 BREAK (sem);
582
a8981d67 583 CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */
2ddc0492 584{
970a8fd6 585#define FLD(f) abuf->fields.fmt_bc8.f
02310b01 586 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 587
2ddc0492 588if (NOTBI (CPU (h_cond))) {
190659a2
DE
589 {
590 USI opval = FLD (f_disp8);
591 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
592 TRACE_RESULT (current_cpu, "pc", 'x', opval);
593 }
2ddc0492 594}
e0bd6e18 595
2ddc0492
DE
596#undef FLD
597}
598 BREAK (sem);
599
a8981d67 600 CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */
2ddc0492 601{
970a8fd6 602#define FLD(f) abuf->fields.fmt_bc24.f
02310b01 603 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 604
2ddc0492 605if (NOTBI (CPU (h_cond))) {
190659a2
DE
606 {
607 USI opval = FLD (f_disp24);
608 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
609 TRACE_RESULT (current_cpu, "pc", 'x', opval);
610 }
2ddc0492 611}
e0bd6e18 612
2ddc0492
DE
613#undef FLD
614}
615 BREAK (sem);
616
617 CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */
618{
970a8fd6 619#define FLD(f) abuf->fields.fmt_beq.f
02310b01 620 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 621
2ddc0492 622if (NESI (* FLD (f_r1), * FLD (f_r2))) {
190659a2
DE
623 {
624 USI opval = FLD (f_disp16);
625 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
626 TRACE_RESULT (current_cpu, "pc", 'x', opval);
627 }
2ddc0492 628}
e0bd6e18 629
2ddc0492
DE
630#undef FLD
631}
632 BREAK (sem);
633
a8981d67 634 CASE (sem, INSN_BRA8) : /* bra.s $disp8 */
2ddc0492 635{
970a8fd6 636#define FLD(f) abuf->fields.fmt_bra8.f
02310b01 637 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 638
190659a2
DE
639 {
640 USI opval = FLD (f_disp8);
641 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
642 TRACE_RESULT (current_cpu, "pc", 'x', opval);
643 }
e0bd6e18 644
2ddc0492
DE
645#undef FLD
646}
647 BREAK (sem);
648
a8981d67 649 CASE (sem, INSN_BRA24) : /* bra.l $disp24 */
2ddc0492 650{
970a8fd6 651#define FLD(f) abuf->fields.fmt_bra24.f
02310b01 652 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 653
190659a2
DE
654 {
655 USI opval = FLD (f_disp24);
656 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval));
657 TRACE_RESULT (current_cpu, "pc", 'x', opval);
658 }
e0bd6e18 659
2ddc0492
DE
660#undef FLD
661}
662 BREAK (sem);
663
664 CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */
665{
970a8fd6 666#define FLD(f) abuf->fields.fmt_cmp.f
02310b01 667 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 668
190659a2
DE
669 {
670 UBI opval = LTSI (* FLD (f_r1), * FLD (f_r2));
671 CPU (h_cond) = opval;
672 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
673 }
e0bd6e18 674
2ddc0492
DE
675#undef FLD
676}
677 BREAK (sem);
678
970a8fd6 679 CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */
2ddc0492 680{
970a8fd6 681#define FLD(f) abuf->fields.fmt_cmpi.f
02310b01 682 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 683
190659a2
DE
684 {
685 UBI opval = LTSI (* FLD (f_r2), FLD (f_simm16));
686 CPU (h_cond) = opval;
687 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
688 }
e0bd6e18 689
2ddc0492
DE
690#undef FLD
691}
692 BREAK (sem);
693
694 CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */
695{
970a8fd6 696#define FLD(f) abuf->fields.fmt_cmp.f
02310b01 697 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 698
190659a2
DE
699 {
700 UBI opval = LTUSI (* FLD (f_r1), * FLD (f_r2));
701 CPU (h_cond) = opval;
702 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
703 }
e0bd6e18 704
2ddc0492
DE
705#undef FLD
706}
707 BREAK (sem);
708
970a8fd6 709 CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */
2ddc0492 710{
970a8fd6 711#define FLD(f) abuf->fields.fmt_cmpi.f
02310b01 712 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 713
190659a2
DE
714 {
715 UBI opval = LTUSI (* FLD (f_r2), FLD (f_simm16));
716 CPU (h_cond) = opval;
717 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
718 }
e0bd6e18 719
2ddc0492
DE
720#undef FLD
721}
722 BREAK (sem);
723
724 CASE (sem, INSN_DIV) : /* div $dr,$sr */
725{
970a8fd6 726#define FLD(f) abuf->fields.fmt_div.f
02310b01 727 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 728
2ddc0492 729if (NESI (* FLD (f_r2), 0)) {
190659a2
DE
730 {
731 SI opval = DIVSI (* FLD (f_r1), * FLD (f_r2));
732 * FLD (f_r1) = opval;
733 TRACE_RESULT (current_cpu, "dr", 'x', opval);
734 }
2ddc0492 735}
e0bd6e18 736
2ddc0492
DE
737#undef FLD
738}
739 BREAK (sem);
740
741 CASE (sem, INSN_DIVU) : /* divu $dr,$sr */
742{
970a8fd6 743#define FLD(f) abuf->fields.fmt_div.f
02310b01 744 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 745
2ddc0492 746if (NESI (* FLD (f_r2), 0)) {
190659a2
DE
747 {
748 SI opval = UDIVSI (* FLD (f_r1), * FLD (f_r2));
749 * FLD (f_r1) = opval;
750 TRACE_RESULT (current_cpu, "dr", 'x', opval);
751 }
2ddc0492 752}
e0bd6e18 753
2ddc0492
DE
754#undef FLD
755}
756 BREAK (sem);
757
758 CASE (sem, INSN_REM) : /* rem $dr,$sr */
759{
970a8fd6 760#define FLD(f) abuf->fields.fmt_div.f
02310b01 761 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 762
2ddc0492 763if (NESI (* FLD (f_r2), 0)) {
190659a2
DE
764 {
765 SI opval = MODSI (* FLD (f_r1), * FLD (f_r2));
766 * FLD (f_r1) = opval;
767 TRACE_RESULT (current_cpu, "dr", 'x', opval);
768 }
2ddc0492 769}
e0bd6e18 770
2ddc0492
DE
771#undef FLD
772}
773 BREAK (sem);
774
775 CASE (sem, INSN_REMU) : /* remu $dr,$sr */
776{
970a8fd6 777#define FLD(f) abuf->fields.fmt_div.f
02310b01 778 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 779
2ddc0492 780if (NESI (* FLD (f_r2), 0)) {
190659a2
DE
781 {
782 SI opval = UMODSI (* FLD (f_r1), * FLD (f_r2));
783 * FLD (f_r1) = opval;
784 TRACE_RESULT (current_cpu, "dr", 'x', opval);
785 }
2ddc0492 786}
e0bd6e18 787
2ddc0492
DE
788#undef FLD
789}
790 BREAK (sem);
791
792 CASE (sem, INSN_JL) : /* jl $sr */
793{
970a8fd6 794#define FLD(f) abuf->fields.fmt_jl.f
02310b01 795 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 796
2ddc0492 797do {
a040908c 798 USI temp1;SI temp0;
2ddc0492 799 temp0 = ADDSI (ANDSI (CPU (h_pc), -4), 4);
a040908c 800 temp1 = ANDSI (* FLD (f_r2), -4);
190659a2
DE
801 {
802 SI opval = temp0;
803 CPU (h_gr[((HOSTUINT) 14)]) = opval;
804 TRACE_RESULT (current_cpu, "gr-14", 'x', opval);
805 }
806 {
807 USI opval = temp1;
808 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, opval));
809 TRACE_RESULT (current_cpu, "pc", 'x', opval);
810 }
2ddc0492 811} while (0);
e0bd6e18 812
2ddc0492
DE
813#undef FLD
814}
815 BREAK (sem);
816
817 CASE (sem, INSN_JMP) : /* jmp $sr */
818{
970a8fd6 819#define FLD(f) abuf->fields.fmt_jmp.f
02310b01 820 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 821
190659a2
DE
822 {
823 USI opval = ANDSI (* FLD (f_r2), -4);
824 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, opval));
825 TRACE_RESULT (current_cpu, "pc", 'x', opval);
826 }
e0bd6e18 827
2ddc0492
DE
828#undef FLD
829}
830 BREAK (sem);
831
832 CASE (sem, INSN_LD) : /* ld $dr,@$sr */
833{
970a8fd6 834#define FLD(f) abuf->fields.fmt_ld.f
02310b01 835 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 836
190659a2
DE
837 {
838 SI opval = GETMEMSI (current_cpu, * FLD (f_r2));
839 * FLD (f_r1) = opval;
840 TRACE_RESULT (current_cpu, "dr", 'x', opval);
841 }
e0bd6e18 842
2ddc0492
DE
843#undef FLD
844}
845 BREAK (sem);
846
847 CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */
848{
970a8fd6 849#define FLD(f) abuf->fields.fmt_ld_d.f
02310b01 850 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 851
190659a2
DE
852 {
853 SI opval = GETMEMSI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)));
854 * FLD (f_r1) = opval;
855 TRACE_RESULT (current_cpu, "dr", 'x', opval);
856 }
e0bd6e18 857
2ddc0492
DE
858#undef FLD
859}
860 BREAK (sem);
861
862 CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */
863{
970a8fd6 864#define FLD(f) abuf->fields.fmt_ldb.f
02310b01 865 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 866
190659a2
DE
867 {
868 SI opval = EXTQISI (GETMEMQI (current_cpu, * FLD (f_r2)));
869 * FLD (f_r1) = opval;
870 TRACE_RESULT (current_cpu, "dr", 'x', opval);
871 }
e0bd6e18 872
2ddc0492
DE
873#undef FLD
874}
875 BREAK (sem);
876
877 CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */
878{
970a8fd6 879#define FLD(f) abuf->fields.fmt_ldb_d.f
02310b01 880 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 881
190659a2
DE
882 {
883 SI opval = EXTQISI (GETMEMQI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16))));
884 * FLD (f_r1) = opval;
885 TRACE_RESULT (current_cpu, "dr", 'x', opval);
886 }
e0bd6e18 887
2ddc0492
DE
888#undef FLD
889}
890 BREAK (sem);
891
892 CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */
893{
970a8fd6 894#define FLD(f) abuf->fields.fmt_ldh.f
02310b01 895 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 896
190659a2
DE
897 {
898 SI opval = EXTHISI (GETMEMHI (current_cpu, * FLD (f_r2)));
899 * FLD (f_r1) = opval;
900 TRACE_RESULT (current_cpu, "dr", 'x', opval);
901 }
e0bd6e18 902
2ddc0492
DE
903#undef FLD
904}
905 BREAK (sem);
906
907 CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */
908{
970a8fd6 909#define FLD(f) abuf->fields.fmt_ldh_d.f
02310b01 910 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 911
190659a2
DE
912 {
913 SI opval = EXTHISI (GETMEMHI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16))));
914 * FLD (f_r1) = opval;
915 TRACE_RESULT (current_cpu, "dr", 'x', opval);
916 }
e0bd6e18 917
2ddc0492
DE
918#undef FLD
919}
920 BREAK (sem);
921
922 CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */
923{
970a8fd6 924#define FLD(f) abuf->fields.fmt_ldb.f
02310b01 925 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 926
190659a2
DE
927 {
928 SI opval = ZEXTQISI (GETMEMQI (current_cpu, * FLD (f_r2)));
929 * FLD (f_r1) = opval;
930 TRACE_RESULT (current_cpu, "dr", 'x', opval);
931 }
e0bd6e18 932
2ddc0492
DE
933#undef FLD
934}
935 BREAK (sem);
936
937 CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */
938{
970a8fd6 939#define FLD(f) abuf->fields.fmt_ldb_d.f
02310b01 940 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 941
190659a2
DE
942 {
943 SI opval = ZEXTQISI (GETMEMQI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16))));
944 * FLD (f_r1) = opval;
945 TRACE_RESULT (current_cpu, "dr", 'x', opval);
946 }
e0bd6e18 947
2ddc0492
DE
948#undef FLD
949}
950 BREAK (sem);
951
952 CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */
953{
970a8fd6 954#define FLD(f) abuf->fields.fmt_ldh.f
02310b01 955 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 956
190659a2
DE
957 {
958 SI opval = ZEXTHISI (GETMEMHI (current_cpu, * FLD (f_r2)));
959 * FLD (f_r1) = opval;
960 TRACE_RESULT (current_cpu, "dr", 'x', opval);
961 }
e0bd6e18 962
2ddc0492
DE
963#undef FLD
964}
965 BREAK (sem);
966
967 CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */
968{
970a8fd6 969#define FLD(f) abuf->fields.fmt_ldh_d.f
02310b01 970 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 971
190659a2
DE
972 {
973 SI opval = ZEXTHISI (GETMEMHI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16))));
974 * FLD (f_r1) = opval;
975 TRACE_RESULT (current_cpu, "dr", 'x', opval);
976 }
e0bd6e18 977
2ddc0492
DE
978#undef FLD
979}
980 BREAK (sem);
981
982 CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */
983{
970a8fd6 984#define FLD(f) abuf->fields.fmt_ld_plus.f
02310b01 985 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 986
2ddc0492
DE
987do {
988 SI temp1;SI temp0;
989 temp0 = GETMEMSI (current_cpu, * FLD (f_r2));
990 temp1 = ADDSI (* FLD (f_r2), 4);
190659a2
DE
991 {
992 SI opval = temp0;
993 * FLD (f_r1) = opval;
994 TRACE_RESULT (current_cpu, "dr", 'x', opval);
995 }
996 {
997 SI opval = temp1;
998 * FLD (f_r2) = opval;
999 TRACE_RESULT (current_cpu, "sr", 'x', opval);
1000 }
2ddc0492 1001} while (0);
e0bd6e18 1002
2ddc0492
DE
1003#undef FLD
1004}
1005 BREAK (sem);
1006
970a8fd6 1007 CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */
2ddc0492 1008{
970a8fd6 1009#define FLD(f) abuf->fields.fmt_ld24.f
02310b01 1010 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1011
190659a2
DE
1012 {
1013 SI opval = FLD (f_uimm24);
1014 * FLD (f_r1) = opval;
1015 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1016 }
e0bd6e18 1017
2ddc0492
DE
1018#undef FLD
1019}
1020 BREAK (sem);
1021
a8981d67 1022 CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */
2ddc0492 1023{
970a8fd6 1024#define FLD(f) abuf->fields.fmt_ldi8.f
02310b01 1025 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1026
190659a2
DE
1027 {
1028 SI opval = FLD (f_simm8);
1029 * FLD (f_r1) = opval;
1030 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1031 }
e0bd6e18 1032
2ddc0492
DE
1033#undef FLD
1034}
1035 BREAK (sem);
1036
a8981d67 1037 CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */
2ddc0492 1038{
970a8fd6 1039#define FLD(f) abuf->fields.fmt_ldi16.f
02310b01 1040 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1041
190659a2
DE
1042 {
1043 SI opval = FLD (f_simm16);
1044 * FLD (f_r1) = opval;
1045 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1046 }
e0bd6e18 1047
2ddc0492
DE
1048#undef FLD
1049}
1050 BREAK (sem);
1051
1052 CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */
1053{
970a8fd6 1054#define FLD(f) abuf->fields.fmt_lock.f
02310b01 1055 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1056
cab58155 1057do {
190659a2
DE
1058 {
1059 UBI opval = 1;
1060 CPU (h_lock) = opval;
1061 TRACE_RESULT (current_cpu, "lock-0", 'x', opval);
1062 }
1063 {
1064 SI opval = GETMEMSI (current_cpu, * FLD (f_r2));
1065 * FLD (f_r1) = opval;
1066 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1067 }
cab58155 1068} while (0);
e0bd6e18 1069
2ddc0492
DE
1070#undef FLD
1071}
1072 BREAK (sem);
1073
1074 CASE (sem, INSN_MACHI) : /* machi $src1,$src2 */
1075{
970a8fd6 1076#define FLD(f) abuf->fields.fmt_machi.f
02310b01 1077 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1078
190659a2
DE
1079 {
1080 DI opval = SRADI (SLLDI (ADDDI (m32rb_h_accum_get (current_cpu), MULDI (EXTSIDI (ANDSI (* FLD (f_r1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2), 16))))), 8), 8);
1081 m32rb_h_accum_set (current_cpu, opval);
1082 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1083 }
e0bd6e18 1084
2ddc0492
DE
1085#undef FLD
1086}
1087 BREAK (sem);
1088
1089 CASE (sem, INSN_MACLO) : /* maclo $src1,$src2 */
1090{
970a8fd6 1091#define FLD(f) abuf->fields.fmt_machi.f
02310b01 1092 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1093
190659a2
DE
1094 {
1095 DI opval = SRADI (SLLDI (ADDDI (m32rb_h_accum_get (current_cpu), MULDI (EXTSIDI (SLLSI (* FLD (f_r1), 16)), EXTHIDI (TRUNCSIHI (* FLD (f_r2))))), 8), 8);
1096 m32rb_h_accum_set (current_cpu, opval);
1097 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1098 }
e0bd6e18 1099
2ddc0492
DE
1100#undef FLD
1101}
1102 BREAK (sem);
1103
1104 CASE (sem, INSN_MACWHI) : /* macwhi $src1,$src2 */
1105{
970a8fd6 1106#define FLD(f) abuf->fields.fmt_machi.f
02310b01 1107 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1108
190659a2
DE
1109 {
1110 DI opval = SRADI (SLLDI (ADDDI (m32rb_h_accum_get (current_cpu), MULDI (EXTSIDI (* FLD (f_r1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2), 16))))), 8), 8);
1111 m32rb_h_accum_set (current_cpu, opval);
1112 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1113 }
e0bd6e18 1114
2ddc0492
DE
1115#undef FLD
1116}
1117 BREAK (sem);
1118
1119 CASE (sem, INSN_MACWLO) : /* macwlo $src1,$src2 */
1120{
970a8fd6 1121#define FLD(f) abuf->fields.fmt_machi.f
02310b01 1122 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1123
190659a2
DE
1124 {
1125 DI opval = SRADI (SLLDI (ADDDI (m32rb_h_accum_get (current_cpu), MULDI (EXTSIDI (* FLD (f_r1)), EXTHIDI (TRUNCSIHI (* FLD (f_r2))))), 8), 8);
1126 m32rb_h_accum_set (current_cpu, opval);
1127 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1128 }
e0bd6e18 1129
2ddc0492
DE
1130#undef FLD
1131}
1132 BREAK (sem);
1133
1134 CASE (sem, INSN_MUL) : /* mul $dr,$sr */
1135{
970a8fd6 1136#define FLD(f) abuf->fields.fmt_add.f
02310b01 1137 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1138
190659a2
DE
1139 {
1140 SI opval = MULSI (* FLD (f_r1), * FLD (f_r2));
1141 * FLD (f_r1) = opval;
1142 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1143 }
e0bd6e18 1144
2ddc0492
DE
1145#undef FLD
1146}
1147 BREAK (sem);
1148
1149 CASE (sem, INSN_MULHI) : /* mulhi $src1,$src2 */
1150{
970a8fd6 1151#define FLD(f) abuf->fields.fmt_mulhi.f
02310b01 1152 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1153
190659a2
DE
1154 {
1155 DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (f_r1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2), 16)))), 16), 16);
1156 m32rb_h_accum_set (current_cpu, opval);
1157 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1158 }
e0bd6e18 1159
2ddc0492
DE
1160#undef FLD
1161}
1162 BREAK (sem);
1163
1164 CASE (sem, INSN_MULLO) : /* mullo $src1,$src2 */
1165{
970a8fd6 1166#define FLD(f) abuf->fields.fmt_mulhi.f
02310b01 1167 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1168
190659a2
DE
1169 {
1170 DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (f_r1), 16)), EXTHIDI (TRUNCSIHI (* FLD (f_r2)))), 16), 16);
1171 m32rb_h_accum_set (current_cpu, opval);
1172 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1173 }
e0bd6e18 1174
2ddc0492
DE
1175#undef FLD
1176}
1177 BREAK (sem);
1178
1179 CASE (sem, INSN_MULWHI) : /* mulwhi $src1,$src2 */
1180{
970a8fd6 1181#define FLD(f) abuf->fields.fmt_mulhi.f
02310b01 1182 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1183
190659a2
DE
1184 {
1185 DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (f_r1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2), 16)))), 8), 8);
1186 m32rb_h_accum_set (current_cpu, opval);
1187 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1188 }
e0bd6e18 1189
2ddc0492
DE
1190#undef FLD
1191}
1192 BREAK (sem);
1193
1194 CASE (sem, INSN_MULWLO) : /* mulwlo $src1,$src2 */
1195{
970a8fd6 1196#define FLD(f) abuf->fields.fmt_mulhi.f
02310b01 1197 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1198
190659a2
DE
1199 {
1200 DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (f_r1)), EXTHIDI (TRUNCSIHI (* FLD (f_r2)))), 8), 8);
1201 m32rb_h_accum_set (current_cpu, opval);
1202 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1203 }
e0bd6e18 1204
2ddc0492
DE
1205#undef FLD
1206}
1207 BREAK (sem);
1208
1209 CASE (sem, INSN_MV) : /* mv $dr,$sr */
1210{
970a8fd6 1211#define FLD(f) abuf->fields.fmt_mv.f
02310b01 1212 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1213
190659a2
DE
1214 {
1215 SI opval = * FLD (f_r2);
1216 * FLD (f_r1) = opval;
1217 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1218 }
e0bd6e18 1219
2ddc0492
DE
1220#undef FLD
1221}
1222 BREAK (sem);
1223
1224 CASE (sem, INSN_MVFACHI) : /* mvfachi $dr */
1225{
970a8fd6 1226#define FLD(f) abuf->fields.fmt_mvfachi.f
02310b01 1227 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1228
190659a2
DE
1229 {
1230 SI opval = TRUNCDISI (SRADI (m32rb_h_accum_get (current_cpu), 32));
1231 * FLD (f_r1) = opval;
1232 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1233 }
e0bd6e18 1234
2ddc0492
DE
1235#undef FLD
1236}
1237 BREAK (sem);
1238
1239 CASE (sem, INSN_MVFACLO) : /* mvfaclo $dr */
1240{
970a8fd6 1241#define FLD(f) abuf->fields.fmt_mvfachi.f
02310b01 1242 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1243
190659a2
DE
1244 {
1245 SI opval = TRUNCDISI (m32rb_h_accum_get (current_cpu));
1246 * FLD (f_r1) = opval;
1247 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1248 }
e0bd6e18 1249
2ddc0492
DE
1250#undef FLD
1251}
1252 BREAK (sem);
1253
1254 CASE (sem, INSN_MVFACMI) : /* mvfacmi $dr */
1255{
970a8fd6 1256#define FLD(f) abuf->fields.fmt_mvfachi.f
02310b01 1257 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1258
190659a2
DE
1259 {
1260 SI opval = TRUNCDISI (SRADI (m32rb_h_accum_get (current_cpu), 16));
1261 * FLD (f_r1) = opval;
1262 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1263 }
e0bd6e18 1264
2ddc0492
DE
1265#undef FLD
1266}
1267 BREAK (sem);
1268
1269 CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */
1270{
970a8fd6 1271#define FLD(f) abuf->fields.fmt_mvfc.f
02310b01 1272 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1273
190659a2
DE
1274 {
1275 SI opval = m32rb_h_cr_get (current_cpu, FLD (f_r2));
1276 * FLD (f_r1) = opval;
1277 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1278 }
e0bd6e18 1279
2ddc0492
DE
1280#undef FLD
1281}
1282 BREAK (sem);
1283
1284 CASE (sem, INSN_MVTACHI) : /* mvtachi $src1 */
1285{
970a8fd6 1286#define FLD(f) abuf->fields.fmt_mvtachi.f
02310b01 1287 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1288
190659a2
DE
1289 {
1290 DI opval = ORDI (ANDDI (m32rb_h_accum_get (current_cpu), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (f_r1)), 32));
1291 m32rb_h_accum_set (current_cpu, opval);
1292 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1293 }
e0bd6e18 1294
2ddc0492
DE
1295#undef FLD
1296}
1297 BREAK (sem);
1298
1299 CASE (sem, INSN_MVTACLO) : /* mvtaclo $src1 */
1300{
970a8fd6 1301#define FLD(f) abuf->fields.fmt_mvtachi.f
02310b01 1302 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1303
190659a2
DE
1304 {
1305 DI opval = ORDI (ANDDI (m32rb_h_accum_get (current_cpu), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (f_r1)));
1306 m32rb_h_accum_set (current_cpu, opval);
1307 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1308 }
e0bd6e18 1309
2ddc0492
DE
1310#undef FLD
1311}
1312 BREAK (sem);
1313
1314 CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */
1315{
970a8fd6 1316#define FLD(f) abuf->fields.fmt_mvtc.f
02310b01 1317 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1318
190659a2
DE
1319 {
1320 USI opval = * FLD (f_r2);
1321 m32rb_h_cr_set (current_cpu, FLD (f_r1), opval);
1322 TRACE_RESULT (current_cpu, "dcr", 'x', opval);
1323 }
e0bd6e18 1324
2ddc0492
DE
1325#undef FLD
1326}
1327 BREAK (sem);
1328
1329 CASE (sem, INSN_NEG) : /* neg $dr,$sr */
1330{
970a8fd6 1331#define FLD(f) abuf->fields.fmt_mv.f
02310b01 1332 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1333
190659a2
DE
1334 {
1335 SI opval = NEGSI (* FLD (f_r2));
1336 * FLD (f_r1) = opval;
1337 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1338 }
e0bd6e18 1339
2ddc0492
DE
1340#undef FLD
1341}
1342 BREAK (sem);
1343
1344 CASE (sem, INSN_NOP) : /* nop */
1345{
970a8fd6 1346#define FLD(f) abuf->fields.fmt_nop.f
02310b01 1347 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1348
2ddc0492 1349PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
e0bd6e18 1350
2ddc0492
DE
1351#undef FLD
1352}
1353 BREAK (sem);
1354
1355 CASE (sem, INSN_NOT) : /* not $dr,$sr */
1356{
970a8fd6 1357#define FLD(f) abuf->fields.fmt_mv.f
02310b01 1358 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1359
190659a2
DE
1360 {
1361 SI opval = INVSI (* FLD (f_r2));
1362 * FLD (f_r1) = opval;
1363 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1364 }
e0bd6e18 1365
2ddc0492
DE
1366#undef FLD
1367}
1368 BREAK (sem);
1369
1370 CASE (sem, INSN_RAC) : /* rac */
1371{
970a8fd6 1372#define FLD(f) abuf->fields.fmt_rac.f
02310b01 1373 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1374
2ddc0492
DE
1375do {
1376 DI tmp_tmp1;
190659a2 1377 tmp_tmp1 = SLLDI (m32rb_h_accum_get (current_cpu), 1);
e0bd6e18 1378 tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
190659a2
DE
1379 {
1380 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)));
1381 m32rb_h_accum_set (current_cpu, opval);
1382 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1383 }
2ddc0492 1384} while (0);
e0bd6e18 1385
2ddc0492
DE
1386#undef FLD
1387}
1388 BREAK (sem);
1389
1390 CASE (sem, INSN_RACH) : /* rach */
1391{
970a8fd6 1392#define FLD(f) abuf->fields.fmt_rac.f
02310b01 1393 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1394
2ddc0492
DE
1395do {
1396 DI tmp_tmp1;
190659a2 1397 tmp_tmp1 = ANDDI (m32rb_h_accum_get (current_cpu), MAKEDI (16777215, 0xffffffff));
a040908c 1398if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
2ddc0492
DE
1399 tmp_tmp1 = MAKEDI (16383, 0x80000000);
1400} else {
a040908c 1401if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
2ddc0492
DE
1402 tmp_tmp1 = MAKEDI (16760832, 0);
1403} else {
190659a2 1404 tmp_tmp1 = ANDDI (ADDDI (m32rb_h_accum_get (current_cpu), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
2ddc0492
DE
1405}
1406}
1407 tmp_tmp1 = SLLDI (tmp_tmp1, 1);
190659a2
DE
1408 {
1409 DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7);
1410 m32rb_h_accum_set (current_cpu, opval);
1411 TRACE_RESULT (current_cpu, "accum", 'D', opval);
1412 }
2ddc0492 1413} while (0);
e0bd6e18 1414
2ddc0492
DE
1415#undef FLD
1416}
1417 BREAK (sem);
1418
1419 CASE (sem, INSN_RTE) : /* rte */
1420{
970a8fd6 1421#define FLD(f) abuf->fields.fmt_rte.f
02310b01 1422 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1423
2ddc0492 1424do {
190659a2
DE
1425 {
1426 UBI opval = CPU (h_bsm);
1427 CPU (h_sm) = opval;
1428 TRACE_RESULT (current_cpu, "sm-0", 'x', opval);
1429 }
1430 {
1431 UBI opval = CPU (h_bie);
1432 CPU (h_ie) = opval;
1433 TRACE_RESULT (current_cpu, "ie-0", 'x', opval);
1434 }
1435 {
1436 UBI opval = CPU (h_bcond);
1437 CPU (h_cond) = opval;
1438 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
1439 }
1440 {
1441 USI opval = ANDSI (CPU (h_bpc), -4);
1442 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, opval));
1443 TRACE_RESULT (current_cpu, "pc", 'x', opval);
1444 }
2ddc0492 1445} while (0);
e0bd6e18 1446
2ddc0492
DE
1447#undef FLD
1448}
1449 BREAK (sem);
1450
970a8fd6 1451 CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */
2ddc0492 1452{
970a8fd6 1453#define FLD(f) abuf->fields.fmt_seth.f
02310b01 1454 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1455
190659a2
DE
1456 {
1457 SI opval = SLLSI (FLD (f_hi16), 16);
1458 * FLD (f_r1) = opval;
1459 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1460 }
e0bd6e18 1461
2ddc0492
DE
1462#undef FLD
1463}
1464 BREAK (sem);
1465
1466 CASE (sem, INSN_SLL) : /* sll $dr,$sr */
1467{
970a8fd6 1468#define FLD(f) abuf->fields.fmt_add.f
02310b01 1469 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1470
190659a2
DE
1471 {
1472 SI opval = SLLSI (* FLD (f_r1), ANDSI (* FLD (f_r2), 31));
1473 * FLD (f_r1) = opval;
1474 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1475 }
e0bd6e18 1476
2ddc0492
DE
1477#undef FLD
1478}
1479 BREAK (sem);
1480
970a8fd6 1481 CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */
2ddc0492 1482{
970a8fd6 1483#define FLD(f) abuf->fields.fmt_sll3.f
02310b01 1484 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1485
190659a2
DE
1486 {
1487 SI opval = SLLSI (* FLD (f_r2), ANDSI (FLD (f_simm16), 31));
1488 * FLD (f_r1) = opval;
1489 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1490 }
e0bd6e18 1491
2ddc0492
DE
1492#undef FLD
1493}
1494 BREAK (sem);
1495
970a8fd6 1496 CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */
2ddc0492 1497{
970a8fd6 1498#define FLD(f) abuf->fields.fmt_slli.f
02310b01 1499 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1500
190659a2
DE
1501 {
1502 SI opval = SLLSI (* FLD (f_r1), FLD (f_uimm5));
1503 * FLD (f_r1) = opval;
1504 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1505 }
e0bd6e18 1506
2ddc0492
DE
1507#undef FLD
1508}
1509 BREAK (sem);
1510
1511 CASE (sem, INSN_SRA) : /* sra $dr,$sr */
1512{
970a8fd6 1513#define FLD(f) abuf->fields.fmt_add.f
02310b01 1514 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1515
190659a2
DE
1516 {
1517 SI opval = SRASI (* FLD (f_r1), ANDSI (* FLD (f_r2), 31));
1518 * FLD (f_r1) = opval;
1519 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1520 }
e0bd6e18 1521
2ddc0492
DE
1522#undef FLD
1523}
1524 BREAK (sem);
1525
970a8fd6 1526 CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */
2ddc0492 1527{
970a8fd6 1528#define FLD(f) abuf->fields.fmt_sll3.f
02310b01 1529 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1530
190659a2
DE
1531 {
1532 SI opval = SRASI (* FLD (f_r2), ANDSI (FLD (f_simm16), 31));
1533 * FLD (f_r1) = opval;
1534 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1535 }
e0bd6e18 1536
2ddc0492
DE
1537#undef FLD
1538}
1539 BREAK (sem);
1540
970a8fd6 1541 CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */
2ddc0492 1542{
970a8fd6 1543#define FLD(f) abuf->fields.fmt_slli.f
02310b01 1544 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1545
190659a2
DE
1546 {
1547 SI opval = SRASI (* FLD (f_r1), FLD (f_uimm5));
1548 * FLD (f_r1) = opval;
1549 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1550 }
e0bd6e18 1551
2ddc0492
DE
1552#undef FLD
1553}
1554 BREAK (sem);
1555
1556 CASE (sem, INSN_SRL) : /* srl $dr,$sr */
1557{
970a8fd6 1558#define FLD(f) abuf->fields.fmt_add.f
02310b01 1559 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1560
190659a2
DE
1561 {
1562 SI opval = SRLSI (* FLD (f_r1), ANDSI (* FLD (f_r2), 31));
1563 * FLD (f_r1) = opval;
1564 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1565 }
e0bd6e18 1566
2ddc0492
DE
1567#undef FLD
1568}
1569 BREAK (sem);
1570
970a8fd6 1571 CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */
2ddc0492 1572{
970a8fd6 1573#define FLD(f) abuf->fields.fmt_sll3.f
02310b01 1574 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1575
190659a2
DE
1576 {
1577 SI opval = SRLSI (* FLD (f_r2), ANDSI (FLD (f_simm16), 31));
1578 * FLD (f_r1) = opval;
1579 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1580 }
e0bd6e18 1581
2ddc0492
DE
1582#undef FLD
1583}
1584 BREAK (sem);
1585
970a8fd6 1586 CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */
2ddc0492 1587{
970a8fd6 1588#define FLD(f) abuf->fields.fmt_slli.f
02310b01 1589 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1590
190659a2
DE
1591 {
1592 SI opval = SRLSI (* FLD (f_r1), FLD (f_uimm5));
1593 * FLD (f_r1) = opval;
1594 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1595 }
e0bd6e18 1596
2ddc0492
DE
1597#undef FLD
1598}
1599 BREAK (sem);
1600
1601 CASE (sem, INSN_ST) : /* st $src1,@$src2 */
1602{
970a8fd6 1603#define FLD(f) abuf->fields.fmt_st.f
02310b01 1604 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1605
190659a2
DE
1606 {
1607 SI opval = * FLD (f_r1);
1608 SETMEMSI (current_cpu, * FLD (f_r2), opval);
1609 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1610 }
e0bd6e18 1611
2ddc0492
DE
1612#undef FLD
1613}
1614 BREAK (sem);
1615
1616 CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */
1617{
970a8fd6 1618#define FLD(f) abuf->fields.fmt_st_d.f
02310b01 1619 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1620
190659a2
DE
1621 {
1622 SI opval = * FLD (f_r1);
1623 SETMEMSI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)), opval);
1624 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1625 }
e0bd6e18 1626
2ddc0492
DE
1627#undef FLD
1628}
1629 BREAK (sem);
1630
1631 CASE (sem, INSN_STB) : /* stb $src1,@$src2 */
1632{
970a8fd6 1633#define FLD(f) abuf->fields.fmt_stb.f
02310b01 1634 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1635
190659a2
DE
1636 {
1637 QI opval = * FLD (f_r1);
1638 SETMEMQI (current_cpu, * FLD (f_r2), opval);
1639 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1640 }
e0bd6e18 1641
2ddc0492
DE
1642#undef FLD
1643}
1644 BREAK (sem);
1645
1646 CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */
1647{
970a8fd6 1648#define FLD(f) abuf->fields.fmt_stb_d.f
02310b01 1649 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1650
190659a2
DE
1651 {
1652 QI opval = * FLD (f_r1);
1653 SETMEMQI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)), opval);
1654 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1655 }
e0bd6e18 1656
2ddc0492
DE
1657#undef FLD
1658}
1659 BREAK (sem);
1660
1661 CASE (sem, INSN_STH) : /* sth $src1,@$src2 */
1662{
970a8fd6 1663#define FLD(f) abuf->fields.fmt_sth.f
02310b01 1664 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1665
190659a2
DE
1666 {
1667 HI opval = * FLD (f_r1);
1668 SETMEMHI (current_cpu, * FLD (f_r2), opval);
1669 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1670 }
e0bd6e18 1671
2ddc0492
DE
1672#undef FLD
1673}
1674 BREAK (sem);
1675
1676 CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */
1677{
970a8fd6 1678#define FLD(f) abuf->fields.fmt_sth_d.f
02310b01 1679 new_pc = SEM_NEXT_PC (sem_arg, 4);
e0bd6e18 1680
190659a2
DE
1681 {
1682 HI opval = * FLD (f_r1);
1683 SETMEMHI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)), opval);
1684 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1685 }
e0bd6e18 1686
2ddc0492
DE
1687#undef FLD
1688}
1689 BREAK (sem);
1690
1691 CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */
1692{
970a8fd6 1693#define FLD(f) abuf->fields.fmt_st_plus.f
02310b01 1694 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1695
2ddc0492 1696do {
02310b01
DE
1697 SI tmp_new_src2;
1698 tmp_new_src2 = ADDSI (* FLD (f_r2), 4);
190659a2
DE
1699 {
1700 SI opval = * FLD (f_r1);
1701 SETMEMSI (current_cpu, tmp_new_src2, opval);
1702 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1703 }
1704 {
1705 SI opval = tmp_new_src2;
1706 * FLD (f_r2) = opval;
1707 TRACE_RESULT (current_cpu, "src2", 'x', opval);
1708 }
2ddc0492 1709} while (0);
e0bd6e18 1710
2ddc0492
DE
1711#undef FLD
1712}
1713 BREAK (sem);
1714
1715 CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */
1716{
970a8fd6 1717#define FLD(f) abuf->fields.fmt_st_plus.f
02310b01 1718 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1719
2ddc0492 1720do {
02310b01
DE
1721 SI tmp_new_src2;
1722 tmp_new_src2 = SUBSI (* FLD (f_r2), 4);
190659a2
DE
1723 {
1724 SI opval = * FLD (f_r1);
1725 SETMEMSI (current_cpu, tmp_new_src2, opval);
1726 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1727 }
1728 {
1729 SI opval = tmp_new_src2;
1730 * FLD (f_r2) = opval;
1731 TRACE_RESULT (current_cpu, "src2", 'x', opval);
1732 }
2ddc0492 1733} while (0);
e0bd6e18 1734
2ddc0492
DE
1735#undef FLD
1736}
1737 BREAK (sem);
1738
1739 CASE (sem, INSN_SUB) : /* sub $dr,$sr */
1740{
970a8fd6 1741#define FLD(f) abuf->fields.fmt_add.f
02310b01 1742 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1743
190659a2
DE
1744 {
1745 SI opval = SUBSI (* FLD (f_r1), * FLD (f_r2));
1746 * FLD (f_r1) = opval;
1747 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1748 }
e0bd6e18 1749
2ddc0492
DE
1750#undef FLD
1751}
1752 BREAK (sem);
1753
1754 CASE (sem, INSN_SUBV) : /* subv $dr,$sr */
1755{
970a8fd6 1756#define FLD(f) abuf->fields.fmt_addv.f
02310b01 1757 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1758
2ddc0492 1759do {
a040908c 1760 UBI temp1;SI temp0;
2ddc0492
DE
1761 temp0 = SUBSI (* FLD (f_r1), * FLD (f_r2));
1762 temp1 = SUBOFSI (* FLD (f_r1), * FLD (f_r2), 0);
190659a2
DE
1763 {
1764 SI opval = temp0;
1765 * FLD (f_r1) = opval;
1766 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1767 }
1768 {
1769 UBI opval = temp1;
1770 CPU (h_cond) = opval;
1771 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
1772 }
2ddc0492 1773} while (0);
e0bd6e18 1774
2ddc0492
DE
1775#undef FLD
1776}
1777 BREAK (sem);
1778
1779 CASE (sem, INSN_SUBX) : /* subx $dr,$sr */
1780{
970a8fd6 1781#define FLD(f) abuf->fields.fmt_addx.f
02310b01 1782 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1783
2ddc0492 1784do {
a040908c 1785 UBI temp1;SI temp0;
2ddc0492
DE
1786 temp0 = SUBCSI (* FLD (f_r1), * FLD (f_r2), CPU (h_cond));
1787 temp1 = SUBCFSI (* FLD (f_r1), * FLD (f_r2), CPU (h_cond));
190659a2
DE
1788 {
1789 SI opval = temp0;
1790 * FLD (f_r1) = opval;
1791 TRACE_RESULT (current_cpu, "dr", 'x', opval);
1792 }
1793 {
1794 UBI opval = temp1;
1795 CPU (h_cond) = opval;
1796 TRACE_RESULT (current_cpu, "condbit", 'x', opval);
1797 }
2ddc0492 1798} while (0);
e0bd6e18 1799
2ddc0492
DE
1800#undef FLD
1801}
1802 BREAK (sem);
1803
970a8fd6 1804 CASE (sem, INSN_TRAP) : /* trap $uimm4 */
2ddc0492 1805{
970a8fd6 1806#define FLD(f) abuf->fields.fmt_trap.f
02310b01 1807 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1808
cab58155 1809do {
190659a2
DE
1810 {
1811 USI opval = ADDSI (CPU (h_pc), 4);
1812 m32rb_h_cr_set (current_cpu, ((HOSTUINT) 6), opval);
1813 TRACE_RESULT (current_cpu, "cr-6", 'x', opval);
1814 }
1815 {
1816 USI opval = ANDSI (SLLSI (m32rb_h_cr_get (current_cpu, ((HOSTUINT) 0)), 8), 65408);
1817 m32rb_h_cr_set (current_cpu, ((HOSTUINT) 0), opval);
1818 TRACE_RESULT (current_cpu, "cr-0", 'x', opval);
1819 }
1820 {
1821 SI opval = m32r_trap (current_cpu, CPU (h_pc), FLD (f_uimm4));
1822 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, opval));
1823 TRACE_RESULT (current_cpu, "pc", 'x', opval);
1824 }
cab58155 1825} while (0);
e0bd6e18 1826
2ddc0492
DE
1827#undef FLD
1828}
1829 BREAK (sem);
1830
1831 CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */
1832{
970a8fd6 1833#define FLD(f) abuf->fields.fmt_unlock.f
02310b01 1834 new_pc = SEM_NEXT_PC (sem_arg, 2);
e0bd6e18 1835
cab58155
DE
1836do {
1837if (CPU (h_lock)) {
190659a2
DE
1838 {
1839 SI opval = * FLD (f_r1);
1840 SETMEMSI (current_cpu, * FLD (f_r2), opval);
1841 TRACE_RESULT (current_cpu, "memory", 'x', opval);
1842 }
1843}
1844 {
1845 UBI opval = 0;
1846 CPU (h_lock) = opval;
1847 TRACE_RESULT (current_cpu, "lock-0", 'x', opval);
1848 }
cab58155 1849} while (0);
e0bd6e18 1850
2ddc0492
DE
1851#undef FLD
1852}
1853 BREAK (sem);
1854
1855
1856 }
1857 ENDSWITCH (sem) /* End of semantic switch. */
1858
1859 PC = new_pc;
1860}
1861
1862#endif /* DEFINE_SWITCH */
This page took 0.145943 seconds and 4 git commands to generate.