1 /* Simulator instruction semantics for m32r.
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)
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.
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
32 The order here must match the order in m32r_decode_vars in decode.c. */
34 static void *labels
[] = {
35 && case_sem_INSN_ILLEGAL
,
37 && case_sem_INSN_ADD3
,
39 && case_sem_INSN_AND3
,
43 && case_sem_INSN_XOR3
,
44 && case_sem_INSN_ADDI
,
45 && case_sem_INSN_ADDV
,
46 && case_sem_INSN_ADDV3
,
47 && case_sem_INSN_ADDX
,
49 && case_sem_INSN_BC24
,
51 && case_sem_INSN_BEQZ
,
52 && case_sem_INSN_BGEZ
,
53 && case_sem_INSN_BGTZ
,
54 && case_sem_INSN_BLEZ
,
55 && case_sem_INSN_BLTZ
,
56 && case_sem_INSN_BNEZ
,
58 && case_sem_INSN_BL24
,
59 && case_sem_INSN_BNC8
,
60 && case_sem_INSN_BNC24
,
62 && case_sem_INSN_BRA8
,
63 && case_sem_INSN_BRA24
,
65 && case_sem_INSN_CMPI
,
66 && case_sem_INSN_CMPU
,
67 && case_sem_INSN_CMPUI
,
69 && case_sem_INSN_DIVU
,
71 && case_sem_INSN_REMU
,
75 && case_sem_INSN_LD_D
,
77 && case_sem_INSN_LDB_D
,
79 && case_sem_INSN_LDH_D
,
80 && case_sem_INSN_LDUB
,
81 && case_sem_INSN_LDUB_D
,
82 && case_sem_INSN_LDUH
,
83 && case_sem_INSN_LDUH_D
,
84 && case_sem_INSN_LD_PLUS
,
85 && case_sem_INSN_LD24
,
86 && case_sem_INSN_LDI8
,
87 && case_sem_INSN_LDI16
,
88 && case_sem_INSN_LOCK
,
89 && case_sem_INSN_MACHI
,
90 && case_sem_INSN_MACLO
,
91 && case_sem_INSN_MACWHI
,
92 && case_sem_INSN_MACWLO
,
94 && case_sem_INSN_MULHI
,
95 && case_sem_INSN_MULLO
,
96 && case_sem_INSN_MULWHI
,
97 && case_sem_INSN_MULWLO
,
99 && case_sem_INSN_MVFACHI
,
100 && case_sem_INSN_MVFACLO
,
101 && case_sem_INSN_MVFACMI
,
102 && case_sem_INSN_MVFC
,
103 && case_sem_INSN_MVTACHI
,
104 && case_sem_INSN_MVTACLO
,
105 && case_sem_INSN_MVTC
,
106 && case_sem_INSN_NEG
,
107 && case_sem_INSN_NOP
,
108 && case_sem_INSN_NOT
,
109 && case_sem_INSN_RAC
,
110 && case_sem_INSN_RACH
,
111 && case_sem_INSN_RTE
,
112 && case_sem_INSN_SETH
,
113 && case_sem_INSN_SLL
,
114 && case_sem_INSN_SLL3
,
115 && case_sem_INSN_SLLI
,
116 && case_sem_INSN_SRA
,
117 && case_sem_INSN_SRA3
,
118 && case_sem_INSN_SRAI
,
119 && case_sem_INSN_SRL
,
120 && case_sem_INSN_SRL3
,
121 && case_sem_INSN_SRLI
,
123 && case_sem_INSN_ST_D
,
124 && case_sem_INSN_STB
,
125 && case_sem_INSN_STB_D
,
126 && case_sem_INSN_STH
,
127 && case_sem_INSN_STH_D
,
128 && case_sem_INSN_ST_PLUS
,
129 && case_sem_INSN_ST_MINUS
,
130 && case_sem_INSN_SUB
,
131 && case_sem_INSN_SUBV
,
132 && case_sem_INSN_SUBX
,
133 && case_sem_INSN_TRAP
,
134 && case_sem_INSN_UNLOCK
,
137 extern DECODE
*m32r_decode_vars
[];
140 for (i
= 0; m32r_decode_vars
[i
] != 0; ++i
)
141 m32r_decode_vars
[i
]->semantic_lab
= labels
[i
];
143 #endif /* DEFINE_LABELS */
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. */
155 #define TRACE_RESULT(cpu, name, type, val)
159 #define GET_ATTR(cpu, num, attr) CGEN_INSN_ATTR (abuf->opcode, CGEN_INSN_##attr)
162 SEM_ARG sem_arg
= sc
;
163 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
166 SWITCH (sem
, sem_arg
->semantic
.sem_case
)
169 CASE (sem
, INSN_ILLEGAL
) :
171 sim_engine_halt (CPU_STATE (current_cpu
), current_cpu
, NULL
, NULL_CIA
/*FIXME*/,
172 sim_stopped
, SIM_SIGILL
);
176 CASE (sem
, INSN_ADD
) : /* add $dr,$sr */
178 #define FLD(f) abuf->fields.fmt_0_add.f
179 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
181 * FLD (f_r1
) = ADDSI (* FLD (f_r1
), * FLD (f_r2
));
182 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
188 CASE (sem
, INSN_ADD3
) : /* add3 $dr,$sr,#$slo16 */
190 #define FLD(f) abuf->fields.fmt_1_add3.f
191 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
193 * FLD (f_r1
) = ADDSI (* FLD (f_r2
), FLD (f_simm16
));
194 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
200 CASE (sem
, INSN_AND
) : /* and $dr,$sr */
202 #define FLD(f) abuf->fields.fmt_0_add.f
203 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
205 * FLD (f_r1
) = ANDSI (* FLD (f_r1
), * FLD (f_r2
));
206 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
212 CASE (sem
, INSN_AND3
) : /* and3 $dr,$sr,#$uimm16 */
214 #define FLD(f) abuf->fields.fmt_2_and3.f
215 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
217 * FLD (f_r1
) = ANDSI (* FLD (f_r2
), FLD (f_uimm16
));
218 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
224 CASE (sem
, INSN_OR
) : /* or $dr,$sr */
226 #define FLD(f) abuf->fields.fmt_0_add.f
227 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
229 * FLD (f_r1
) = ORSI (* FLD (f_r1
), * FLD (f_r2
));
230 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
236 CASE (sem
, INSN_OR3
) : /* or3 $dr,$sr,#$ulo16 */
238 #define FLD(f) abuf->fields.fmt_3_or3.f
239 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
241 * FLD (f_r1
) = ORSI (* FLD (f_r2
), FLD (f_uimm16
));
242 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
248 CASE (sem
, INSN_XOR
) : /* xor $dr,$sr */
250 #define FLD(f) abuf->fields.fmt_0_add.f
251 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
253 * FLD (f_r1
) = XORSI (* FLD (f_r1
), * FLD (f_r2
));
254 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
260 CASE (sem
, INSN_XOR3
) : /* xor3 $dr,$sr,#$uimm16 */
262 #define FLD(f) abuf->fields.fmt_2_and3.f
263 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
265 * FLD (f_r1
) = XORSI (* FLD (f_r2
), FLD (f_uimm16
));
266 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
272 CASE (sem
, INSN_ADDI
) : /* addi $dr,#$simm8 */
274 #define FLD(f) abuf->fields.fmt_4_addi.f
275 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
277 * FLD (f_r1
) = ADDSI (* FLD (f_r1
), FLD (f_simm8
));
278 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
284 CASE (sem
, INSN_ADDV
) : /* addv $dr,$sr */
286 #define FLD(f) abuf->fields.fmt_5_addv.f
287 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
291 temp0
= ADDSI (* FLD (f_r1
), * FLD (f_r2
));
292 temp1
= ADDOFSI (* FLD (f_r1
), * FLD (f_r2
), 0);
293 * FLD (f_r1
) = temp0
;
294 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
295 CPU (h_cond
) = temp1
;
296 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
303 CASE (sem
, INSN_ADDV3
) : /* addv3 $dr,$sr,#$simm16 */
305 #define FLD(f) abuf->fields.fmt_6_addv3.f
306 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
310 temp0
= ADDSI (* FLD (f_r2
), FLD (f_simm16
));
311 temp1
= ADDOFSI (* FLD (f_r2
), FLD (f_simm16
), 0);
312 * FLD (f_r1
) = temp0
;
313 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
314 CPU (h_cond
) = temp1
;
315 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
322 CASE (sem
, INSN_ADDX
) : /* addx $dr,$sr */
324 #define FLD(f) abuf->fields.fmt_7_addx.f
325 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
329 temp0
= ADDCSI (* FLD (f_r1
), * FLD (f_r2
), CPU (h_cond
));
330 temp1
= ADDCFSI (* FLD (f_r1
), * FLD (f_r2
), CPU (h_cond
));
331 * FLD (f_r1
) = temp0
;
332 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
333 CPU (h_cond
) = temp1
;
334 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
341 CASE (sem
, INSN_BC8
) : /* bc $disp8 */
343 #define FLD(f) abuf->fields.fmt_8_bc8.f
344 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
347 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp8
)));
348 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
355 CASE (sem
, INSN_BC24
) : /* bc $disp24 */
357 #define FLD(f) abuf->fields.fmt_9_bc24.f
358 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
361 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp24
)));
362 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
369 CASE (sem
, INSN_BEQ
) : /* beq $src1,$src2,$disp16 */
371 #define FLD(f) abuf->fields.fmt_10_beq.f
372 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
374 if (EQSI (* FLD (f_r1
), * FLD (f_r2
))) {
375 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp16
)));
376 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
383 CASE (sem
, INSN_BEQZ
) : /* beqz $src2,$disp16 */
385 #define FLD(f) abuf->fields.fmt_11_beqz.f
386 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
388 if (EQSI (* FLD (f_r2
), 0)) {
389 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp16
)));
390 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
397 CASE (sem
, INSN_BGEZ
) : /* bgez $src2,$disp16 */
399 #define FLD(f) abuf->fields.fmt_11_beqz.f
400 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
402 if (GESI (* FLD (f_r2
), 0)) {
403 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp16
)));
404 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
411 CASE (sem
, INSN_BGTZ
) : /* bgtz $src2,$disp16 */
413 #define FLD(f) abuf->fields.fmt_11_beqz.f
414 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
416 if (GTSI (* FLD (f_r2
), 0)) {
417 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp16
)));
418 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
425 CASE (sem
, INSN_BLEZ
) : /* blez $src2,$disp16 */
427 #define FLD(f) abuf->fields.fmt_11_beqz.f
428 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
430 if (LESI (* FLD (f_r2
), 0)) {
431 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp16
)));
432 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
439 CASE (sem
, INSN_BLTZ
) : /* bltz $src2,$disp16 */
441 #define FLD(f) abuf->fields.fmt_11_beqz.f
442 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
444 if (LTSI (* FLD (f_r2
), 0)) {
445 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp16
)));
446 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
453 CASE (sem
, INSN_BNEZ
) : /* bnez $src2,$disp16 */
455 #define FLD(f) abuf->fields.fmt_11_beqz.f
456 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
458 if (NESI (* FLD (f_r2
), 0)) {
459 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp16
)));
460 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
467 CASE (sem
, INSN_BL8
) : /* bl $disp8 */
469 #define FLD(f) abuf->fields.fmt_12_bl8.f
470 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
473 CPU (h_gr
[14]) = ADDSI (ANDSI (CPU (h_pc
), -4), 4);
474 TRACE_RESULT (current_cpu
, "h-gr-14", 'x', CPU (h_gr
[14]));
475 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp8
)));
476 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
483 CASE (sem
, INSN_BL24
) : /* bl $disp24 */
485 #define FLD(f) abuf->fields.fmt_13_bl24.f
486 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
489 CPU (h_gr
[14]) = ADDSI (CPU (h_pc
), 4);
490 TRACE_RESULT (current_cpu
, "h-gr-14", 'x', CPU (h_gr
[14]));
491 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp24
)));
492 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
499 CASE (sem
, INSN_BNC8
) : /* bnc $disp8 */
501 #define FLD(f) abuf->fields.fmt_8_bc8.f
502 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
504 if (NOTBI (CPU (h_cond
))) {
505 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp8
)));
506 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
513 CASE (sem
, INSN_BNC24
) : /* bnc $disp24 */
515 #define FLD(f) abuf->fields.fmt_9_bc24.f
516 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
518 if (NOTBI (CPU (h_cond
))) {
519 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp24
)));
520 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
527 CASE (sem
, INSN_BNE
) : /* bne $src1,$src2,$disp16 */
529 #define FLD(f) abuf->fields.fmt_10_beq.f
530 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
532 if (NESI (* FLD (f_r1
), * FLD (f_r2
))) {
533 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp16
)));
534 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
541 CASE (sem
, INSN_BRA8
) : /* bra $disp8 */
543 #define FLD(f) abuf->fields.fmt_14_bra8.f
544 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
546 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp8
)));
547 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
553 CASE (sem
, INSN_BRA24
) : /* bra $disp24 */
555 #define FLD(f) abuf->fields.fmt_15_bra24.f
556 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
558 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_CACHE (sem_arg
, FLD (f_disp24
)));
559 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
565 CASE (sem
, INSN_CMP
) : /* cmp $src1,$src2 */
567 #define FLD(f) abuf->fields.fmt_16_cmp.f
568 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
570 CPU (h_cond
) = LTSI (* FLD (f_r1
), * FLD (f_r2
));
571 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
577 CASE (sem
, INSN_CMPI
) : /* cmpi $src2,#$simm16 */
579 #define FLD(f) abuf->fields.fmt_17_cmpi.f
580 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
582 CPU (h_cond
) = LTSI (* FLD (f_r2
), FLD (f_simm16
));
583 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
589 CASE (sem
, INSN_CMPU
) : /* cmpu $src1,$src2 */
591 #define FLD(f) abuf->fields.fmt_16_cmp.f
592 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
594 CPU (h_cond
) = LTUSI (* FLD (f_r1
), * FLD (f_r2
));
595 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
601 CASE (sem
, INSN_CMPUI
) : /* cmpui $src2,#$uimm16 */
603 #define FLD(f) abuf->fields.fmt_18_cmpui.f
604 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
606 CPU (h_cond
) = LTUSI (* FLD (f_r2
), FLD (f_uimm16
));
607 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
613 CASE (sem
, INSN_DIV
) : /* div $dr,$sr */
615 #define FLD(f) abuf->fields.fmt_19_div.f
616 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
618 if (NESI (* FLD (f_r2
), 0)) {
619 * FLD (f_r1
) = DIVSI (* FLD (f_r1
), * FLD (f_r2
));
620 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
627 CASE (sem
, INSN_DIVU
) : /* divu $dr,$sr */
629 #define FLD(f) abuf->fields.fmt_19_div.f
630 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
632 if (NESI (* FLD (f_r2
), 0)) {
633 * FLD (f_r1
) = UDIVSI (* FLD (f_r1
), * FLD (f_r2
));
634 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
641 CASE (sem
, INSN_REM
) : /* rem $dr,$sr */
643 #define FLD(f) abuf->fields.fmt_19_div.f
644 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
646 if (NESI (* FLD (f_r2
), 0)) {
647 * FLD (f_r1
) = MODSI (* FLD (f_r1
), * FLD (f_r2
));
648 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
655 CASE (sem
, INSN_REMU
) : /* remu $dr,$sr */
657 #define FLD(f) abuf->fields.fmt_19_div.f
658 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
660 if (NESI (* FLD (f_r2
), 0)) {
661 * FLD (f_r1
) = UMODSI (* FLD (f_r1
), * FLD (f_r2
));
662 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
669 CASE (sem
, INSN_JL
) : /* jl $sr */
671 #define FLD(f) abuf->fields.fmt_20_jl.f
672 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
676 temp0
= ADDSI (ANDSI (CPU (h_pc
), -4), 4);
677 temp1
= * FLD (f_r2
);
678 CPU (h_gr
[14]) = temp0
;
679 TRACE_RESULT (current_cpu
, "h-gr-14", 'x', CPU (h_gr
[14]));
680 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_ADDR (sem_arg
, temp1
));
681 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
688 CASE (sem
, INSN_JMP
) : /* jmp $sr */
690 #define FLD(f) abuf->fields.fmt_21_jmp.f
691 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
693 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_ADDR (sem_arg
, * FLD (f_r2
)));
694 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
700 CASE (sem
, INSN_LD
) : /* ld $dr,@$sr */
702 #define FLD(f) abuf->fields.fmt_22_ld.f
703 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
705 * FLD (f_r1
) = GETMEMSI (current_cpu
, * FLD (f_r2
));
706 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
712 CASE (sem
, INSN_LD_D
) : /* ld $dr,@($slo16,$sr) */
714 #define FLD(f) abuf->fields.fmt_23_ld_d.f
715 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
717 * FLD (f_r1
) = GETMEMSI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
)));
718 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
724 CASE (sem
, INSN_LDB
) : /* ldb $dr,@$sr */
726 #define FLD(f) abuf->fields.fmt_24_ldb.f
727 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
729 * FLD (f_r1
) = EXTQISI (GETMEMQI (current_cpu
, * FLD (f_r2
)));
730 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
736 CASE (sem
, INSN_LDB_D
) : /* ldb $dr,@($slo16,$sr) */
738 #define FLD(f) abuf->fields.fmt_25_ldb_d.f
739 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
741 * FLD (f_r1
) = EXTQISI (GETMEMQI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
))));
742 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
748 CASE (sem
, INSN_LDH
) : /* ldh $dr,@$sr */
750 #define FLD(f) abuf->fields.fmt_26_ldh.f
751 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
753 * FLD (f_r1
) = EXTHISI (GETMEMHI (current_cpu
, * FLD (f_r2
)));
754 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
760 CASE (sem
, INSN_LDH_D
) : /* ldh $dr,@($slo16,$sr) */
762 #define FLD(f) abuf->fields.fmt_27_ldh_d.f
763 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
765 * FLD (f_r1
) = EXTHISI (GETMEMHI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
))));
766 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
772 CASE (sem
, INSN_LDUB
) : /* ldub $dr,@$sr */
774 #define FLD(f) abuf->fields.fmt_24_ldb.f
775 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
777 * FLD (f_r1
) = ZEXTQISI (GETMEMQI (current_cpu
, * FLD (f_r2
)));
778 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
784 CASE (sem
, INSN_LDUB_D
) : /* ldub $dr,@($slo16,$sr) */
786 #define FLD(f) abuf->fields.fmt_25_ldb_d.f
787 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
789 * FLD (f_r1
) = ZEXTQISI (GETMEMQI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
))));
790 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
796 CASE (sem
, INSN_LDUH
) : /* lduh $dr,@$sr */
798 #define FLD(f) abuf->fields.fmt_26_ldh.f
799 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
801 * FLD (f_r1
) = ZEXTHISI (GETMEMHI (current_cpu
, * FLD (f_r2
)));
802 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
808 CASE (sem
, INSN_LDUH_D
) : /* lduh $dr,@($slo16,$sr) */
810 #define FLD(f) abuf->fields.fmt_27_ldh_d.f
811 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
813 * FLD (f_r1
) = ZEXTHISI (GETMEMHI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
))));
814 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
820 CASE (sem
, INSN_LD_PLUS
) : /* ld $dr,@$sr+ */
822 #define FLD(f) abuf->fields.fmt_28_ld_plus.f
823 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
827 temp0
= GETMEMSI (current_cpu
, * FLD (f_r2
));
828 temp1
= ADDSI (* FLD (f_r2
), 4);
829 * FLD (f_r1
) = temp0
;
830 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
831 * FLD (f_r2
) = temp1
;
832 TRACE_RESULT (current_cpu
, "sr", 'x', * FLD (f_r2
));
839 CASE (sem
, INSN_LD24
) : /* ld24 $dr,#$uimm24 */
841 #define FLD(f) abuf->fields.fmt_29_ld24.f
842 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
844 * FLD (f_r1
) = FLD (f_uimm24
);
845 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
851 CASE (sem
, INSN_LDI8
) : /* ldi $dr,#$simm8 */
853 #define FLD(f) abuf->fields.fmt_30_ldi8.f
854 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
856 * FLD (f_r1
) = FLD (f_simm8
);
857 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
863 CASE (sem
, INSN_LDI16
) : /* ldi $dr,$slo16 */
865 #define FLD(f) abuf->fields.fmt_31_ldi16.f
866 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
868 * FLD (f_r1
) = FLD (f_simm16
);
869 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
875 CASE (sem
, INSN_LOCK
) : /* lock $dr,@$sr */
877 #define FLD(f) abuf->fields.fmt_32_lock.f
878 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
882 TRACE_RESULT (current_cpu
, "h-lock-0", 'x', CPU (h_lock
));
883 * FLD (f_r1
) = GETMEMSI (current_cpu
, * FLD (f_r2
));
884 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
891 CASE (sem
, INSN_MACHI
) : /* machi $src1,$src2 */
893 #define FLD(f) abuf->fields.fmt_33_machi.f
894 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
896 CPU (h_accum
) = SRADI (SLLDI (ADDDI (CPU (h_accum
), MULDI (EXTSIDI (ANDSI (* FLD (f_r1
), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2
), 16))))), 8), 8);
897 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
903 CASE (sem
, INSN_MACLO
) : /* maclo $src1,$src2 */
905 #define FLD(f) abuf->fields.fmt_33_machi.f
906 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
908 CPU (h_accum
) = SRADI (SLLDI (ADDDI (CPU (h_accum
), MULDI (EXTSIDI (SLLSI (* FLD (f_r1
), 16)), EXTHIDI (TRUNCSIHI (* FLD (f_r2
))))), 8), 8);
909 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
915 CASE (sem
, INSN_MACWHI
) : /* macwhi $src1,$src2 */
917 #define FLD(f) abuf->fields.fmt_33_machi.f
918 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
920 CPU (h_accum
) = SRADI (SLLDI (ADDDI (CPU (h_accum
), MULDI (EXTSIDI (* FLD (f_r1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2
), 16))))), 8), 8);
921 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
927 CASE (sem
, INSN_MACWLO
) : /* macwlo $src1,$src2 */
929 #define FLD(f) abuf->fields.fmt_33_machi.f
930 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
932 CPU (h_accum
) = SRADI (SLLDI (ADDDI (CPU (h_accum
), MULDI (EXTSIDI (* FLD (f_r1
)), EXTHIDI (TRUNCSIHI (* FLD (f_r2
))))), 8), 8);
933 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
939 CASE (sem
, INSN_MUL
) : /* mul $dr,$sr */
941 #define FLD(f) abuf->fields.fmt_0_add.f
942 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
944 * FLD (f_r1
) = MULSI (* FLD (f_r1
), * FLD (f_r2
));
945 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
951 CASE (sem
, INSN_MULHI
) : /* mulhi $src1,$src2 */
953 #define FLD(f) abuf->fields.fmt_34_mulhi.f
954 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
956 CPU (h_accum
) = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (f_r1
), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2
), 16)))), 16), 16);
957 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
963 CASE (sem
, INSN_MULLO
) : /* mullo $src1,$src2 */
965 #define FLD(f) abuf->fields.fmt_34_mulhi.f
966 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
968 CPU (h_accum
) = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (f_r1
), 16)), EXTHIDI (TRUNCSIHI (* FLD (f_r2
)))), 16), 16);
969 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
975 CASE (sem
, INSN_MULWHI
) : /* mulwhi $src1,$src2 */
977 #define FLD(f) abuf->fields.fmt_34_mulhi.f
978 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
980 CPU (h_accum
) = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (f_r1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2
), 16)))), 8), 8);
981 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
987 CASE (sem
, INSN_MULWLO
) : /* mulwlo $src1,$src2 */
989 #define FLD(f) abuf->fields.fmt_34_mulhi.f
990 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
992 CPU (h_accum
) = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (f_r1
)), EXTHIDI (TRUNCSIHI (* FLD (f_r2
)))), 8), 8);
993 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
999 CASE (sem
, INSN_MV
) : /* mv $dr,$sr */
1001 #define FLD(f) abuf->fields.fmt_35_mv.f
1002 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1004 * FLD (f_r1
) = * FLD (f_r2
);
1005 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1011 CASE (sem
, INSN_MVFACHI
) : /* mvfachi $dr */
1013 #define FLD(f) abuf->fields.fmt_36_mvfachi.f
1014 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1016 * FLD (f_r1
) = TRUNCDISI (SRADI (CPU (h_accum
), 32));
1017 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1023 CASE (sem
, INSN_MVFACLO
) : /* mvfaclo $dr */
1025 #define FLD(f) abuf->fields.fmt_36_mvfachi.f
1026 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1028 * FLD (f_r1
) = TRUNCDISI (CPU (h_accum
));
1029 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1035 CASE (sem
, INSN_MVFACMI
) : /* mvfacmi $dr */
1037 #define FLD(f) abuf->fields.fmt_36_mvfachi.f
1038 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1040 * FLD (f_r1
) = TRUNCDISI (SRADI (CPU (h_accum
), 16));
1041 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1047 CASE (sem
, INSN_MVFC
) : /* mvfc $dr,$scr */
1049 #define FLD(f) abuf->fields.fmt_37_mvfc.f
1050 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1052 * FLD (f_r1
) = m32r_h_cr_get (current_cpu
, FLD (f_r2
));
1053 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1059 CASE (sem
, INSN_MVTACHI
) : /* mvtachi $src1 */
1061 #define FLD(f) abuf->fields.fmt_38_mvtachi.f
1062 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1064 CPU (h_accum
) = ORDI (ANDDI (CPU (h_accum
), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (f_r1
)), 32));
1065 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
1071 CASE (sem
, INSN_MVTACLO
) : /* mvtaclo $src1 */
1073 #define FLD(f) abuf->fields.fmt_38_mvtachi.f
1074 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1076 CPU (h_accum
) = ORDI (ANDDI (CPU (h_accum
), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (f_r1
)));
1077 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
1083 CASE (sem
, INSN_MVTC
) : /* mvtc $sr,$dcr */
1085 #define FLD(f) abuf->fields.fmt_39_mvtc.f
1086 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1088 m32r_h_cr_set (current_cpu
, FLD (f_r1
), * FLD (f_r2
));
1089 TRACE_RESULT (current_cpu
, "dcr", 'x', m32r_h_cr_get (current_cpu
, FLD (f_r1
)));
1095 CASE (sem
, INSN_NEG
) : /* neg $dr,$sr */
1097 #define FLD(f) abuf->fields.fmt_35_mv.f
1098 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1100 * FLD (f_r1
) = NEGSI (* FLD (f_r2
));
1101 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1107 CASE (sem
, INSN_NOP
) : /* nop */
1109 #define FLD(f) abuf->fields.fmt_40_nop.f
1110 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1112 PROFILE_COUNT_FILLNOPS (current_cpu
, abuf
->addr
);
1118 CASE (sem
, INSN_NOT
) : /* not $dr,$sr */
1120 #define FLD(f) abuf->fields.fmt_35_mv.f
1121 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1123 * FLD (f_r1
) = INVSI (* FLD (f_r2
));
1124 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1130 CASE (sem
, INSN_RAC
) : /* rac */
1132 #define FLD(f) abuf->fields.fmt_41_rac.f
1133 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1137 tmp_tmp1
= SLLDI (CPU (h_accum
), 1);
1138 tmp_tmp1
= ADDDI (tmp_tmp1
, MAKEDI (0, 32768));
1139 CPU (h_accum
) = (GTDI (tmp_tmp1
, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1
, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1
, MAKEDI (0xffffffff, 0xffff0000)));
1140 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
1147 CASE (sem
, INSN_RACH
) : /* rach */
1149 #define FLD(f) abuf->fields.fmt_41_rac.f
1150 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1154 tmp_tmp1
= ANDDI (CPU (h_accum
), MAKEDI (16777215, 0xffffffff));
1155 if (ANDIFSI (GEDI (tmp_tmp1
, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1
, MAKEDI (8388607, 0xffffffff)))) {
1156 tmp_tmp1
= MAKEDI (16383, 0x80000000);
1158 if (ANDIFSI (GEDI (tmp_tmp1
, MAKEDI (8388608, 0)), LEDI (tmp_tmp1
, MAKEDI (16760832, 0)))) {
1159 tmp_tmp1
= MAKEDI (16760832, 0);
1161 tmp_tmp1
= ANDDI (ADDDI (CPU (h_accum
), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
1164 tmp_tmp1
= SLLDI (tmp_tmp1
, 1);
1165 CPU (h_accum
) = SRADI (SLLDI (tmp_tmp1
, 7), 7);
1166 TRACE_RESULT (current_cpu
, "accum", 'D', CPU (h_accum
));
1173 CASE (sem
, INSN_RTE
) : /* rte */
1175 #define FLD(f) abuf->fields.fmt_42_rte.f
1176 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1179 CPU (h_sm
) = CPU (h_bsm
);
1180 TRACE_RESULT (current_cpu
, "h-sm-0", 'x', CPU (h_sm
));
1181 CPU (h_ie
) = CPU (h_bie
);
1182 TRACE_RESULT (current_cpu
, "h-ie-0", 'x', CPU (h_ie
));
1183 CPU (h_cond
) = CPU (h_bcond
);
1184 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
1185 BRANCH_NEW_PC (new_pc
, SEM_BRANCH_VIA_ADDR (sem_arg
, CPU (h_bpc
)));
1186 TRACE_RESULT (current_cpu
, "pc", 'x', CPU (h_pc
));
1193 CASE (sem
, INSN_SETH
) : /* seth $dr,#$hi16 */
1195 #define FLD(f) abuf->fields.fmt_43_seth.f
1196 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
1198 * FLD (f_r1
) = SLLSI (FLD (f_hi16
), 16);
1199 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1205 CASE (sem
, INSN_SLL
) : /* sll $dr,$sr */
1207 #define FLD(f) abuf->fields.fmt_0_add.f
1208 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1210 * FLD (f_r1
) = SLLSI (* FLD (f_r1
), ANDSI (* FLD (f_r2
), 31));
1211 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1217 CASE (sem
, INSN_SLL3
) : /* sll3 $dr,$sr,#$simm16 */
1219 #define FLD(f) abuf->fields.fmt_44_sll3.f
1220 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
1222 * FLD (f_r1
) = SLLSI (* FLD (f_r2
), ANDSI (FLD (f_simm16
), 31));
1223 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1229 CASE (sem
, INSN_SLLI
) : /* slli $dr,#$uimm5 */
1231 #define FLD(f) abuf->fields.fmt_45_slli.f
1232 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1234 * FLD (f_r1
) = SLLSI (* FLD (f_r1
), FLD (f_uimm5
));
1235 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1241 CASE (sem
, INSN_SRA
) : /* sra $dr,$sr */
1243 #define FLD(f) abuf->fields.fmt_0_add.f
1244 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1246 * FLD (f_r1
) = SRASI (* FLD (f_r1
), ANDSI (* FLD (f_r2
), 31));
1247 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1253 CASE (sem
, INSN_SRA3
) : /* sra3 $dr,$sr,#$simm16 */
1255 #define FLD(f) abuf->fields.fmt_44_sll3.f
1256 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
1258 * FLD (f_r1
) = SRASI (* FLD (f_r2
), ANDSI (FLD (f_simm16
), 31));
1259 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1265 CASE (sem
, INSN_SRAI
) : /* srai $dr,#$uimm5 */
1267 #define FLD(f) abuf->fields.fmt_45_slli.f
1268 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1270 * FLD (f_r1
) = SRASI (* FLD (f_r1
), FLD (f_uimm5
));
1271 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1277 CASE (sem
, INSN_SRL
) : /* srl $dr,$sr */
1279 #define FLD(f) abuf->fields.fmt_0_add.f
1280 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1282 * FLD (f_r1
) = SRLSI (* FLD (f_r1
), ANDSI (* FLD (f_r2
), 31));
1283 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1289 CASE (sem
, INSN_SRL3
) : /* srl3 $dr,$sr,#$simm16 */
1291 #define FLD(f) abuf->fields.fmt_44_sll3.f
1292 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
1294 * FLD (f_r1
) = SRLSI (* FLD (f_r2
), ANDSI (FLD (f_simm16
), 31));
1295 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1301 CASE (sem
, INSN_SRLI
) : /* srli $dr,#$uimm5 */
1303 #define FLD(f) abuf->fields.fmt_45_slli.f
1304 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1306 * FLD (f_r1
) = SRLSI (* FLD (f_r1
), FLD (f_uimm5
));
1307 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1313 CASE (sem
, INSN_ST
) : /* st $src1,@$src2 */
1315 #define FLD(f) abuf->fields.fmt_46_st.f
1316 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1318 SETMEMSI (current_cpu
, * FLD (f_r2
), * FLD (f_r1
));
1319 TRACE_RESULT (current_cpu
, "h-memory-src2", 'x', GETMEMSI (current_cpu
, * FLD (f_r2
)));
1325 CASE (sem
, INSN_ST_D
) : /* st $src1,@($slo16,$src2) */
1327 #define FLD(f) abuf->fields.fmt_47_st_d.f
1328 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
1330 SETMEMSI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
)), * FLD (f_r1
));
1331 TRACE_RESULT (current_cpu
, "h-memory-add-WI-src2-slo16", 'x', GETMEMSI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
))));
1337 CASE (sem
, INSN_STB
) : /* stb $src1,@$src2 */
1339 #define FLD(f) abuf->fields.fmt_48_stb.f
1340 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1342 SETMEMQI (current_cpu
, * FLD (f_r2
), * FLD (f_r1
));
1343 TRACE_RESULT (current_cpu
, "h-memory-src2", 'x', GETMEMQI (current_cpu
, * FLD (f_r2
)));
1349 CASE (sem
, INSN_STB_D
) : /* stb $src1,@($slo16,$src2) */
1351 #define FLD(f) abuf->fields.fmt_49_stb_d.f
1352 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
1354 SETMEMQI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
)), * FLD (f_r1
));
1355 TRACE_RESULT (current_cpu
, "h-memory-add-WI-src2-slo16", 'x', GETMEMQI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
))));
1361 CASE (sem
, INSN_STH
) : /* sth $src1,@$src2 */
1363 #define FLD(f) abuf->fields.fmt_50_sth.f
1364 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1366 SETMEMHI (current_cpu
, * FLD (f_r2
), * FLD (f_r1
));
1367 TRACE_RESULT (current_cpu
, "h-memory-src2", 'x', GETMEMHI (current_cpu
, * FLD (f_r2
)));
1373 CASE (sem
, INSN_STH_D
) : /* sth $src1,@($slo16,$src2) */
1375 #define FLD(f) abuf->fields.fmt_51_sth_d.f
1376 new_pc
= SEM_NEXT_PC (sem_arg
, 4);
1378 SETMEMHI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
)), * FLD (f_r1
));
1379 TRACE_RESULT (current_cpu
, "h-memory-add-WI-src2-slo16", 'x', GETMEMHI (current_cpu
, ADDSI (* FLD (f_r2
), FLD (f_simm16
))));
1385 CASE (sem
, INSN_ST_PLUS
) : /* st $src1,@+$src2 */
1387 #define FLD(f) abuf->fields.fmt_52_st_plus.f
1388 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1392 tmp_new_src2
= ADDSI (* FLD (f_r2
), 4);
1393 SETMEMSI (current_cpu
, tmp_new_src2
, * FLD (f_r1
));
1394 TRACE_RESULT (current_cpu
, "h-memory-new-src2", 'x', GETMEMSI (current_cpu
, tmp_new_src2
));
1395 * FLD (f_r2
) = tmp_new_src2
;
1396 TRACE_RESULT (current_cpu
, "src2", 'x', * FLD (f_r2
));
1403 CASE (sem
, INSN_ST_MINUS
) : /* st $src1,@-$src2 */
1405 #define FLD(f) abuf->fields.fmt_52_st_plus.f
1406 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1410 tmp_new_src2
= SUBSI (* FLD (f_r2
), 4);
1411 SETMEMSI (current_cpu
, tmp_new_src2
, * FLD (f_r1
));
1412 TRACE_RESULT (current_cpu
, "h-memory-new-src2", 'x', GETMEMSI (current_cpu
, tmp_new_src2
));
1413 * FLD (f_r2
) = tmp_new_src2
;
1414 TRACE_RESULT (current_cpu
, "src2", 'x', * FLD (f_r2
));
1421 CASE (sem
, INSN_SUB
) : /* sub $dr,$sr */
1423 #define FLD(f) abuf->fields.fmt_0_add.f
1424 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1426 * FLD (f_r1
) = SUBSI (* FLD (f_r1
), * FLD (f_r2
));
1427 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1433 CASE (sem
, INSN_SUBV
) : /* subv $dr,$sr */
1435 #define FLD(f) abuf->fields.fmt_5_addv.f
1436 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1440 temp0
= SUBSI (* FLD (f_r1
), * FLD (f_r2
));
1441 temp1
= SUBOFSI (* FLD (f_r1
), * FLD (f_r2
), 0);
1442 * FLD (f_r1
) = temp0
;
1443 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1444 CPU (h_cond
) = temp1
;
1445 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
1452 CASE (sem
, INSN_SUBX
) : /* subx $dr,$sr */
1454 #define FLD(f) abuf->fields.fmt_7_addx.f
1455 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1459 temp0
= SUBCSI (* FLD (f_r1
), * FLD (f_r2
), CPU (h_cond
));
1460 temp1
= SUBCFSI (* FLD (f_r1
), * FLD (f_r2
), CPU (h_cond
));
1461 * FLD (f_r1
) = temp0
;
1462 TRACE_RESULT (current_cpu
, "dr", 'x', * FLD (f_r1
));
1463 CPU (h_cond
) = temp1
;
1464 TRACE_RESULT (current_cpu
, "condbit", 'x', CPU (h_cond
));
1471 CASE (sem
, INSN_TRAP
) : /* trap #$uimm4 */
1473 #define FLD(f) abuf->fields.fmt_53_trap.f
1474 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1477 m32r_h_cr_set (current_cpu
, 6, ADDSI (CPU (h_pc
), 4));
1478 TRACE_RESULT (current_cpu
, "h-cr-6", 'x', m32r_h_cr_get (current_cpu
, 6));
1479 m32r_h_cr_set (current_cpu
, 0, ANDSI (SRLSI (m32r_h_cr_get (current_cpu
, 0), 8), 33488896));
1480 TRACE_RESULT (current_cpu
, "h-cr-0", 'x', m32r_h_cr_get (current_cpu
, 0));
1481 do_trap (current_cpu
, FLD (f_uimm4
));
1489 CASE (sem
, INSN_UNLOCK
) : /* unlock $src1,@$src2 */
1491 #define FLD(f) abuf->fields.fmt_54_unlock.f
1492 new_pc
= SEM_NEXT_PC (sem_arg
, 2);
1496 SETMEMSI (current_cpu
, * FLD (f_r2
), * FLD (f_r1
));
1497 TRACE_RESULT (current_cpu
, "h-memory-src2", 'x', GETMEMSI (current_cpu
, * FLD (f_r2
)));
1500 TRACE_RESULT (current_cpu
, "h-lock-0", 'x', CPU (h_lock
));
1509 ENDSWITCH (sem
) /* End of semantic switch. */
1514 #endif /* DEFINE_SWITCH */