03b0a6fc6c3e35d5aed1f3d7ba276dea39decdbe
1 /* Simulator instruction semantics for m32rbf.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright (C) 1996, 1997, 1998, 1999 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.
25 #define WANT_CPU m32rbf
26 #define WANT_CPU_M32RBF
33 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
35 /* x-invalid: --invalid-- */
38 SEM_FN_NAME (m32rbf
,x_invalid
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
40 #define FLD(f) abuf->fields.fmt_empty.f
41 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
42 int UNUSED written
= 0;
43 IADDR UNUSED pc
= abuf
->addr
;
44 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
48 /* Update the recorded pc in the cpu state struct. */
51 sim_engine_invalid_insn (current_cpu
, pc
);
52 sim_io_error (CPU_STATE (current_cpu
), "invalid insn not handled\n");
60 /* x-after: --after-- */
63 SEM_FN_NAME (m32rbf
,x_after
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
65 #define FLD(f) abuf->fields.fmt_empty.f
66 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
67 int UNUSED written
= 0;
68 IADDR UNUSED pc
= abuf
->addr
;
69 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
72 #if WITH_SCACHE_PBB_M32RBF
73 m32rbf_pbb_after (current_cpu
, sem_arg
);
81 /* x-before: --before-- */
84 SEM_FN_NAME (m32rbf
,x_before
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
86 #define FLD(f) abuf->fields.fmt_empty.f
87 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
88 int UNUSED written
= 0;
89 IADDR UNUSED pc
= abuf
->addr
;
90 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
93 #if WITH_SCACHE_PBB_M32RBF
94 m32rbf_pbb_before (current_cpu
, sem_arg
);
102 /* x-cti-chain: --cti-chain-- */
105 SEM_FN_NAME (m32rbf
,x_cti_chain
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
107 #define FLD(f) abuf->fields.fmt_empty.f
108 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
109 int UNUSED written
= 0;
110 IADDR UNUSED pc
= abuf
->addr
;
111 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
114 #if WITH_SCACHE_PBB_M32RBF
116 vpc
= m32rbf_pbb_cti_chain (current_cpu
, sem_arg
,
117 pbb_br_npc_ptr
, pbb_br_npc
);
120 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
121 vpc
= m32rbf_pbb_cti_chain (current_cpu
, sem_arg
,
122 CPU_PBB_BR_NPC_PTR (current_cpu
),
123 CPU_PBB_BR_NPC (current_cpu
));
132 /* x-chain: --chain-- */
135 SEM_FN_NAME (m32rbf
,x_chain
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
137 #define FLD(f) abuf->fields.fmt_empty.f
138 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
139 int UNUSED written
= 0;
140 IADDR UNUSED pc
= abuf
->addr
;
141 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
144 #if WITH_SCACHE_PBB_M32RBF
145 vpc
= m32rbf_pbb_chain (current_cpu
, sem_arg
);
156 /* x-begin: --begin-- */
159 SEM_FN_NAME (m32rbf
,x_begin
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
161 #define FLD(f) abuf->fields.fmt_empty.f
162 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
163 int UNUSED written
= 0;
164 IADDR UNUSED pc
= abuf
->addr
;
165 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
168 #if WITH_SCACHE_PBB_M32RBF
170 /* In the switch case FAST_P is a constant, allowing several optimizations
171 in any called inline functions. */
172 vpc
= m32rbf_pbb_begin (current_cpu
, FAST_P
);
174 vpc
= m32rbf_pbb_begin (current_cpu
, STATE_RUN_FAST_P (CPU_STATE (current_cpu
)));
183 /* add: add $dr,$sr */
186 SEM_FN_NAME (m32rbf
,add
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
188 #define FLD(f) abuf->fields.fmt_add.f
189 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
190 int UNUSED written
= 0;
191 IADDR UNUSED pc
= abuf
->addr
;
192 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
195 SI opval
= ADDSI (* FLD (i_dr
), * FLD (i_sr
));
196 * FLD (i_dr
) = opval
;
197 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
204 /* add3: add3 $dr,$sr,$hash$slo16 */
207 SEM_FN_NAME (m32rbf
,add3
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
209 #define FLD(f) abuf->fields.fmt_add3.f
210 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
211 int UNUSED written
= 0;
212 IADDR UNUSED pc
= abuf
->addr
;
213 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
216 SI opval
= ADDSI (* FLD (i_sr
), FLD (f_simm16
));
217 * FLD (i_dr
) = opval
;
218 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
225 /* and: and $dr,$sr */
228 SEM_FN_NAME (m32rbf
,and) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
230 #define FLD(f) abuf->fields.fmt_add.f
231 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
232 int UNUSED written
= 0;
233 IADDR UNUSED pc
= abuf
->addr
;
234 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
237 SI opval
= ANDSI (* FLD (i_dr
), * FLD (i_sr
));
238 * FLD (i_dr
) = opval
;
239 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
246 /* and3: and3 $dr,$sr,$uimm16 */
249 SEM_FN_NAME (m32rbf
,and3
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
251 #define FLD(f) abuf->fields.fmt_and3.f
252 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
253 int UNUSED written
= 0;
254 IADDR UNUSED pc
= abuf
->addr
;
255 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
258 SI opval
= ANDSI (* FLD (i_sr
), FLD (f_uimm16
));
259 * FLD (i_dr
) = opval
;
260 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
270 SEM_FN_NAME (m32rbf
,or) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
272 #define FLD(f) abuf->fields.fmt_add.f
273 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
274 int UNUSED written
= 0;
275 IADDR UNUSED pc
= abuf
->addr
;
276 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
279 SI opval
= ORSI (* FLD (i_dr
), * FLD (i_sr
));
280 * FLD (i_dr
) = opval
;
281 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
288 /* or3: or3 $dr,$sr,$hash$ulo16 */
291 SEM_FN_NAME (m32rbf
,or3
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
293 #define FLD(f) abuf->fields.fmt_or3.f
294 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
295 int UNUSED written
= 0;
296 IADDR UNUSED pc
= abuf
->addr
;
297 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
300 SI opval
= ORSI (* FLD (i_sr
), FLD (f_uimm16
));
301 * FLD (i_dr
) = opval
;
302 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
309 /* xor: xor $dr,$sr */
312 SEM_FN_NAME (m32rbf
,xor) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
314 #define FLD(f) abuf->fields.fmt_add.f
315 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
316 int UNUSED written
= 0;
317 IADDR UNUSED pc
= abuf
->addr
;
318 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
321 SI opval
= XORSI (* FLD (i_dr
), * FLD (i_sr
));
322 * FLD (i_dr
) = opval
;
323 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
330 /* xor3: xor3 $dr,$sr,$uimm16 */
333 SEM_FN_NAME (m32rbf
,xor3
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
335 #define FLD(f) abuf->fields.fmt_and3.f
336 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
337 int UNUSED written
= 0;
338 IADDR UNUSED pc
= abuf
->addr
;
339 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
342 SI opval
= XORSI (* FLD (i_sr
), FLD (f_uimm16
));
343 * FLD (i_dr
) = opval
;
344 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
351 /* addi: addi $dr,$simm8 */
354 SEM_FN_NAME (m32rbf
,addi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
356 #define FLD(f) abuf->fields.fmt_addi.f
357 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
358 int UNUSED written
= 0;
359 IADDR UNUSED pc
= abuf
->addr
;
360 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
363 SI opval
= ADDSI (* FLD (i_dr
), FLD (f_simm8
));
364 * FLD (i_dr
) = opval
;
365 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
372 /* addv: addv $dr,$sr */
375 SEM_FN_NAME (m32rbf
,addv
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
377 #define FLD(f) abuf->fields.fmt_addv.f
378 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
379 int UNUSED written
= 0;
380 IADDR UNUSED pc
= abuf
->addr
;
381 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
385 temp0
= ADDSI (* FLD (i_dr
), * FLD (i_sr
));
386 temp1
= ADDOFSI (* FLD (i_dr
), * FLD (i_sr
), 0);
389 * FLD (i_dr
) = opval
;
390 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
394 CPU (h_cond
) = opval
;
395 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
403 /* addv3: addv3 $dr,$sr,$simm16 */
406 SEM_FN_NAME (m32rbf
,addv3
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
408 #define FLD(f) abuf->fields.fmt_addv3.f
409 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
410 int UNUSED written
= 0;
411 IADDR UNUSED pc
= abuf
->addr
;
412 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
416 temp0
= ADDSI (* FLD (i_sr
), FLD (f_simm16
));
417 temp1
= ADDOFSI (* FLD (i_sr
), FLD (f_simm16
), 0);
420 * FLD (i_dr
) = opval
;
421 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
425 CPU (h_cond
) = opval
;
426 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
434 /* addx: addx $dr,$sr */
437 SEM_FN_NAME (m32rbf
,addx
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
439 #define FLD(f) abuf->fields.fmt_addx.f
440 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
441 int UNUSED written
= 0;
442 IADDR UNUSED pc
= abuf
->addr
;
443 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
447 temp0
= ADDCSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
448 temp1
= ADDCFSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
451 * FLD (i_dr
) = opval
;
452 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
456 CPU (h_cond
) = opval
;
457 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
465 /* bc8: bc.s $disp8 */
468 SEM_FN_NAME (m32rbf
,bc8
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
470 #define FLD(f) abuf->fields.cti.fields.fmt_bc8.f
471 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
472 int UNUSED written
= 0;
473 IADDR UNUSED pc
= abuf
->addr
;
475 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
479 USI opval
= FLD (i_disp8
);
480 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
482 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
486 abuf
->written
= written
;
487 SEM_BRANCH_FINI (vpc
);
492 /* bc24: bc.l $disp24 */
495 SEM_FN_NAME (m32rbf
,bc24
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
497 #define FLD(f) abuf->fields.cti.fields.fmt_bc24.f
498 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
499 int UNUSED written
= 0;
500 IADDR UNUSED pc
= abuf
->addr
;
502 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
506 USI opval
= FLD (i_disp24
);
507 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
509 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
513 abuf
->written
= written
;
514 SEM_BRANCH_FINI (vpc
);
519 /* beq: beq $src1,$src2,$disp16 */
522 SEM_FN_NAME (m32rbf
,beq
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
524 #define FLD(f) abuf->fields.cti.fields.fmt_beq.f
525 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
526 int UNUSED written
= 0;
527 IADDR UNUSED pc
= abuf
->addr
;
529 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
531 if (EQSI (* FLD (i_src1
), * FLD (i_src2
))) {
533 USI opval
= FLD (i_disp16
);
534 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
536 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
540 abuf
->written
= written
;
541 SEM_BRANCH_FINI (vpc
);
546 /* beqz: beqz $src2,$disp16 */
549 SEM_FN_NAME (m32rbf
,beqz
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
551 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
552 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
553 int UNUSED written
= 0;
554 IADDR UNUSED pc
= abuf
->addr
;
556 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
558 if (EQSI (* FLD (i_src2
), 0)) {
560 USI opval
= FLD (i_disp16
);
561 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
563 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
567 abuf
->written
= written
;
568 SEM_BRANCH_FINI (vpc
);
573 /* bgez: bgez $src2,$disp16 */
576 SEM_FN_NAME (m32rbf
,bgez
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
578 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
579 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
580 int UNUSED written
= 0;
581 IADDR UNUSED pc
= abuf
->addr
;
583 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
585 if (GESI (* FLD (i_src2
), 0)) {
587 USI opval
= FLD (i_disp16
);
588 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
590 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
594 abuf
->written
= written
;
595 SEM_BRANCH_FINI (vpc
);
600 /* bgtz: bgtz $src2,$disp16 */
603 SEM_FN_NAME (m32rbf
,bgtz
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
605 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
606 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
607 int UNUSED written
= 0;
608 IADDR UNUSED pc
= abuf
->addr
;
610 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
612 if (GTSI (* FLD (i_src2
), 0)) {
614 USI opval
= FLD (i_disp16
);
615 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
617 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
621 abuf
->written
= written
;
622 SEM_BRANCH_FINI (vpc
);
627 /* blez: blez $src2,$disp16 */
630 SEM_FN_NAME (m32rbf
,blez
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
632 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
633 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
634 int UNUSED written
= 0;
635 IADDR UNUSED pc
= abuf
->addr
;
637 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
639 if (LESI (* FLD (i_src2
), 0)) {
641 USI opval
= FLD (i_disp16
);
642 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
644 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
648 abuf
->written
= written
;
649 SEM_BRANCH_FINI (vpc
);
654 /* bltz: bltz $src2,$disp16 */
657 SEM_FN_NAME (m32rbf
,bltz
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
659 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
660 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
661 int UNUSED written
= 0;
662 IADDR UNUSED pc
= abuf
->addr
;
664 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
666 if (LTSI (* FLD (i_src2
), 0)) {
668 USI opval
= FLD (i_disp16
);
669 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
671 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
675 abuf
->written
= written
;
676 SEM_BRANCH_FINI (vpc
);
681 /* bnez: bnez $src2,$disp16 */
684 SEM_FN_NAME (m32rbf
,bnez
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
686 #define FLD(f) abuf->fields.cti.fields.fmt_beqz.f
687 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
688 int UNUSED written
= 0;
689 IADDR UNUSED pc
= abuf
->addr
;
691 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
693 if (NESI (* FLD (i_src2
), 0)) {
695 USI opval
= FLD (i_disp16
);
696 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
698 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
702 abuf
->written
= written
;
703 SEM_BRANCH_FINI (vpc
);
708 /* bl8: bl.s $disp8 */
711 SEM_FN_NAME (m32rbf
,bl8
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
713 #define FLD(f) abuf->fields.cti.fields.fmt_bl8.f
714 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
715 int UNUSED written
= 0;
716 IADDR UNUSED pc
= abuf
->addr
;
718 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
722 SI opval
= ADDSI (ANDSI (pc
, -4), 4);
723 CPU (h_gr
[((UINT
) 14)]) = opval
;
724 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
727 USI opval
= FLD (i_disp8
);
728 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
729 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
733 SEM_BRANCH_FINI (vpc
);
738 /* bl24: bl.l $disp24 */
741 SEM_FN_NAME (m32rbf
,bl24
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
743 #define FLD(f) abuf->fields.cti.fields.fmt_bl24.f
744 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
745 int UNUSED written
= 0;
746 IADDR UNUSED pc
= abuf
->addr
;
748 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
752 SI opval
= ADDSI (pc
, 4);
753 CPU (h_gr
[((UINT
) 14)]) = opval
;
754 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
757 USI opval
= FLD (i_disp24
);
758 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
759 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
763 SEM_BRANCH_FINI (vpc
);
768 /* bnc8: bnc.s $disp8 */
771 SEM_FN_NAME (m32rbf
,bnc8
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
773 #define FLD(f) abuf->fields.cti.fields.fmt_bc8.f
774 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
775 int UNUSED written
= 0;
776 IADDR UNUSED pc
= abuf
->addr
;
778 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
780 if (NOTBI (CPU (h_cond
))) {
782 USI opval
= FLD (i_disp8
);
783 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
785 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
789 abuf
->written
= written
;
790 SEM_BRANCH_FINI (vpc
);
795 /* bnc24: bnc.l $disp24 */
798 SEM_FN_NAME (m32rbf
,bnc24
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
800 #define FLD(f) abuf->fields.cti.fields.fmt_bc24.f
801 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
802 int UNUSED written
= 0;
803 IADDR UNUSED pc
= abuf
->addr
;
805 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
807 if (NOTBI (CPU (h_cond
))) {
809 USI opval
= FLD (i_disp24
);
810 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
812 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
816 abuf
->written
= written
;
817 SEM_BRANCH_FINI (vpc
);
822 /* bne: bne $src1,$src2,$disp16 */
825 SEM_FN_NAME (m32rbf
,bne
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
827 #define FLD(f) abuf->fields.cti.fields.fmt_beq.f
828 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
829 int UNUSED written
= 0;
830 IADDR UNUSED pc
= abuf
->addr
;
832 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
834 if (NESI (* FLD (i_src1
), * FLD (i_src2
))) {
836 USI opval
= FLD (i_disp16
);
837 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
839 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
843 abuf
->written
= written
;
844 SEM_BRANCH_FINI (vpc
);
849 /* bra8: bra.s $disp8 */
852 SEM_FN_NAME (m32rbf
,bra8
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
854 #define FLD(f) abuf->fields.cti.fields.fmt_bra8.f
855 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
856 int UNUSED written
= 0;
857 IADDR UNUSED pc
= abuf
->addr
;
859 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
862 USI opval
= FLD (i_disp8
);
863 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
864 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
867 SEM_BRANCH_FINI (vpc
);
872 /* bra24: bra.l $disp24 */
875 SEM_FN_NAME (m32rbf
,bra24
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
877 #define FLD(f) abuf->fields.cti.fields.fmt_bra24.f
878 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
879 int UNUSED written
= 0;
880 IADDR UNUSED pc
= abuf
->addr
;
882 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
885 USI opval
= FLD (i_disp24
);
886 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
, SEM_BRANCH_ADDR_CACHE (sem_arg
));
887 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
890 SEM_BRANCH_FINI (vpc
);
895 /* cmp: cmp $src1,$src2 */
898 SEM_FN_NAME (m32rbf
,cmp
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
900 #define FLD(f) abuf->fields.fmt_cmp.f
901 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
902 int UNUSED written
= 0;
903 IADDR UNUSED pc
= abuf
->addr
;
904 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
907 BI opval
= LTSI (* FLD (i_src1
), * FLD (i_src2
));
908 CPU (h_cond
) = opval
;
909 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
916 /* cmpi: cmpi $src2,$simm16 */
919 SEM_FN_NAME (m32rbf
,cmpi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
921 #define FLD(f) abuf->fields.fmt_cmpi.f
922 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
923 int UNUSED written
= 0;
924 IADDR UNUSED pc
= abuf
->addr
;
925 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
928 BI opval
= LTSI (* FLD (i_src2
), FLD (f_simm16
));
929 CPU (h_cond
) = opval
;
930 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
937 /* cmpu: cmpu $src1,$src2 */
940 SEM_FN_NAME (m32rbf
,cmpu
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
942 #define FLD(f) abuf->fields.fmt_cmp.f
943 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
944 int UNUSED written
= 0;
945 IADDR UNUSED pc
= abuf
->addr
;
946 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
949 BI opval
= LTUSI (* FLD (i_src1
), * FLD (i_src2
));
950 CPU (h_cond
) = opval
;
951 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
958 /* cmpui: cmpui $src2,$simm16 */
961 SEM_FN_NAME (m32rbf
,cmpui
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
963 #define FLD(f) abuf->fields.fmt_cmpi.f
964 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
965 int UNUSED written
= 0;
966 IADDR UNUSED pc
= abuf
->addr
;
967 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
970 BI opval
= LTUSI (* FLD (i_src2
), FLD (f_simm16
));
971 CPU (h_cond
) = opval
;
972 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
979 /* div: div $dr,$sr */
982 SEM_FN_NAME (m32rbf
,div
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
984 #define FLD(f) abuf->fields.fmt_div.f
985 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
986 int UNUSED written
= 0;
987 IADDR UNUSED pc
= abuf
->addr
;
988 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
990 if (NESI (* FLD (i_sr
), 0)) {
992 SI opval
= DIVSI (* FLD (i_dr
), * FLD (i_sr
));
993 * FLD (i_dr
) = opval
;
995 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
999 abuf
->written
= written
;
1004 /* divu: divu $dr,$sr */
1007 SEM_FN_NAME (m32rbf
,divu
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1009 #define FLD(f) abuf->fields.fmt_div.f
1010 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1011 int UNUSED written
= 0;
1012 IADDR UNUSED pc
= abuf
->addr
;
1013 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1015 if (NESI (* FLD (i_sr
), 0)) {
1017 SI opval
= UDIVSI (* FLD (i_dr
), * FLD (i_sr
));
1018 * FLD (i_dr
) = opval
;
1019 written
|= (1 << 2);
1020 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1024 abuf
->written
= written
;
1029 /* rem: rem $dr,$sr */
1032 SEM_FN_NAME (m32rbf
,rem
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1034 #define FLD(f) abuf->fields.fmt_div.f
1035 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1036 int UNUSED written
= 0;
1037 IADDR UNUSED pc
= abuf
->addr
;
1038 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1040 if (NESI (* FLD (i_sr
), 0)) {
1042 SI opval
= MODSI (* FLD (i_dr
), * FLD (i_sr
));
1043 * FLD (i_dr
) = opval
;
1044 written
|= (1 << 2);
1045 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1049 abuf
->written
= written
;
1054 /* remu: remu $dr,$sr */
1057 SEM_FN_NAME (m32rbf
,remu
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1059 #define FLD(f) abuf->fields.fmt_div.f
1060 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1061 int UNUSED written
= 0;
1062 IADDR UNUSED pc
= abuf
->addr
;
1063 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1065 if (NESI (* FLD (i_sr
), 0)) {
1067 SI opval
= UMODSI (* FLD (i_dr
), * FLD (i_sr
));
1068 * FLD (i_dr
) = opval
;
1069 written
|= (1 << 2);
1070 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1074 abuf
->written
= written
;
1082 SEM_FN_NAME (m32rbf
,jl
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1084 #define FLD(f) abuf->fields.cti.fields.fmt_jl.f
1085 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1086 int UNUSED written
= 0;
1087 IADDR UNUSED pc
= abuf
->addr
;
1089 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1093 temp0
= ADDSI (ANDSI (pc
, -4), 4);
1094 temp1
= ANDSI (* FLD (i_sr
), -4);
1097 CPU (h_gr
[((UINT
) 14)]) = opval
;
1098 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1102 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1103 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1107 SEM_BRANCH_FINI (vpc
);
1115 SEM_FN_NAME (m32rbf
,jmp
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1117 #define FLD(f) abuf->fields.cti.fields.fmt_jmp.f
1118 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1119 int UNUSED written
= 0;
1120 IADDR UNUSED pc
= abuf
->addr
;
1122 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1125 USI opval
= ANDSI (* FLD (i_sr
), -4);
1126 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1127 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1130 SEM_BRANCH_FINI (vpc
);
1135 /* ld: ld $dr,@$sr */
1138 SEM_FN_NAME (m32rbf
,ld
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1140 #define FLD(f) abuf->fields.fmt_ld.f
1141 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1142 int UNUSED written
= 0;
1143 IADDR UNUSED pc
= abuf
->addr
;
1144 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1147 SI opval
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1148 * FLD (i_dr
) = opval
;
1149 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1156 /* ld-d: ld $dr,@($slo16,$sr) */
1159 SEM_FN_NAME (m32rbf
,ld_d
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1161 #define FLD(f) abuf->fields.fmt_ld_d.f
1162 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1163 int UNUSED written
= 0;
1164 IADDR UNUSED pc
= abuf
->addr
;
1165 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1168 SI opval
= GETMEMSI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
)));
1169 * FLD (i_dr
) = opval
;
1170 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1177 /* ldb: ldb $dr,@$sr */
1180 SEM_FN_NAME (m32rbf
,ldb
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1182 #define FLD(f) abuf->fields.fmt_ldb.f
1183 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1184 int UNUSED written
= 0;
1185 IADDR UNUSED pc
= abuf
->addr
;
1186 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1189 SI opval
= EXTQISI (GETMEMQI (current_cpu
, pc
, * FLD (i_sr
)));
1190 * FLD (i_dr
) = opval
;
1191 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1198 /* ldb-d: ldb $dr,@($slo16,$sr) */
1201 SEM_FN_NAME (m32rbf
,ldb_d
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1203 #define FLD(f) abuf->fields.fmt_ldb_d.f
1204 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1205 int UNUSED written
= 0;
1206 IADDR UNUSED pc
= abuf
->addr
;
1207 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1210 SI opval
= EXTQISI (GETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1211 * FLD (i_dr
) = opval
;
1212 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1219 /* ldh: ldh $dr,@$sr */
1222 SEM_FN_NAME (m32rbf
,ldh
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1224 #define FLD(f) abuf->fields.fmt_ldh.f
1225 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1226 int UNUSED written
= 0;
1227 IADDR UNUSED pc
= abuf
->addr
;
1228 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1231 SI opval
= EXTHISI (GETMEMHI (current_cpu
, pc
, * FLD (i_sr
)));
1232 * FLD (i_dr
) = opval
;
1233 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1240 /* ldh-d: ldh $dr,@($slo16,$sr) */
1243 SEM_FN_NAME (m32rbf
,ldh_d
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1245 #define FLD(f) abuf->fields.fmt_ldh_d.f
1246 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1247 int UNUSED written
= 0;
1248 IADDR UNUSED pc
= abuf
->addr
;
1249 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1252 SI opval
= EXTHISI (GETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1253 * FLD (i_dr
) = opval
;
1254 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1261 /* ldub: ldub $dr,@$sr */
1264 SEM_FN_NAME (m32rbf
,ldub
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1266 #define FLD(f) abuf->fields.fmt_ldb.f
1267 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1268 int UNUSED written
= 0;
1269 IADDR UNUSED pc
= abuf
->addr
;
1270 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1273 SI opval
= ZEXTQISI (GETMEMQI (current_cpu
, pc
, * FLD (i_sr
)));
1274 * FLD (i_dr
) = opval
;
1275 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1282 /* ldub-d: ldub $dr,@($slo16,$sr) */
1285 SEM_FN_NAME (m32rbf
,ldub_d
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1287 #define FLD(f) abuf->fields.fmt_ldb_d.f
1288 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1289 int UNUSED written
= 0;
1290 IADDR UNUSED pc
= abuf
->addr
;
1291 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1294 SI opval
= ZEXTQISI (GETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1295 * FLD (i_dr
) = opval
;
1296 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1303 /* lduh: lduh $dr,@$sr */
1306 SEM_FN_NAME (m32rbf
,lduh
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1308 #define FLD(f) abuf->fields.fmt_ldh.f
1309 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1310 int UNUSED written
= 0;
1311 IADDR UNUSED pc
= abuf
->addr
;
1312 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1315 SI opval
= ZEXTHISI (GETMEMHI (current_cpu
, pc
, * FLD (i_sr
)));
1316 * FLD (i_dr
) = opval
;
1317 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1324 /* lduh-d: lduh $dr,@($slo16,$sr) */
1327 SEM_FN_NAME (m32rbf
,lduh_d
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1329 #define FLD(f) abuf->fields.fmt_ldh_d.f
1330 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1331 int UNUSED written
= 0;
1332 IADDR UNUSED pc
= abuf
->addr
;
1333 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1336 SI opval
= ZEXTHISI (GETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1337 * FLD (i_dr
) = opval
;
1338 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1345 /* ld-plus: ld $dr,@$sr+ */
1348 SEM_FN_NAME (m32rbf
,ld_plus
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1350 #define FLD(f) abuf->fields.fmt_ld_plus.f
1351 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1352 int UNUSED written
= 0;
1353 IADDR UNUSED pc
= abuf
->addr
;
1354 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1358 temp0
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1359 temp1
= ADDSI (* FLD (i_sr
), 4);
1362 * FLD (i_dr
) = opval
;
1363 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1367 * FLD (i_sr
) = opval
;
1368 TRACE_RESULT (current_cpu
, abuf
, "sr", 'x', opval
);
1376 /* ld24: ld24 $dr,$uimm24 */
1379 SEM_FN_NAME (m32rbf
,ld24
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1381 #define FLD(f) abuf->fields.fmt_ld24.f
1382 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1383 int UNUSED written
= 0;
1384 IADDR UNUSED pc
= abuf
->addr
;
1385 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1388 SI opval
= FLD (i_uimm24
);
1389 * FLD (i_dr
) = opval
;
1390 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1397 /* ldi8: ldi8 $dr,$simm8 */
1400 SEM_FN_NAME (m32rbf
,ldi8
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1402 #define FLD(f) abuf->fields.fmt_ldi8.f
1403 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1404 int UNUSED written
= 0;
1405 IADDR UNUSED pc
= abuf
->addr
;
1406 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1409 SI opval
= FLD (f_simm8
);
1410 * FLD (i_dr
) = opval
;
1411 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1418 /* ldi16: ldi16 $dr,$hash$slo16 */
1421 SEM_FN_NAME (m32rbf
,ldi16
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1423 #define FLD(f) abuf->fields.fmt_ldi16.f
1424 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1425 int UNUSED written
= 0;
1426 IADDR UNUSED pc
= abuf
->addr
;
1427 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1430 SI opval
= FLD (f_simm16
);
1431 * FLD (i_dr
) = opval
;
1432 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1439 /* lock: lock $dr,@$sr */
1442 SEM_FN_NAME (m32rbf
,lock
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1444 #define FLD(f) abuf->fields.fmt_lock.f
1445 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1446 int UNUSED written
= 0;
1447 IADDR UNUSED pc
= abuf
->addr
;
1448 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1453 CPU (h_lock
) = opval
;
1454 TRACE_RESULT (current_cpu
, abuf
, "lock", 'x', opval
);
1457 SI opval
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1458 * FLD (i_dr
) = opval
;
1459 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1467 /* machi: machi $src1,$src2 */
1470 SEM_FN_NAME (m32rbf
,machi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1472 #define FLD(f) abuf->fields.fmt_machi.f
1473 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1474 int UNUSED written
= 0;
1475 IADDR UNUSED pc
= abuf
->addr
;
1476 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1479 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (ANDSI (* FLD (i_src1
), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16))))), 8), 8);
1480 SET_H_ACCUM (opval
);
1481 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1488 /* maclo: maclo $src1,$src2 */
1491 SEM_FN_NAME (m32rbf
,maclo
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1493 #define FLD(f) abuf->fields.fmt_machi.f
1494 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1495 int UNUSED written
= 0;
1496 IADDR UNUSED pc
= abuf
->addr
;
1497 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1500 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (SLLSI (* FLD (i_src1
), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
))))), 8), 8);
1501 SET_H_ACCUM (opval
);
1502 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1509 /* macwhi: macwhi $src1,$src2 */
1512 SEM_FN_NAME (m32rbf
,macwhi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1514 #define FLD(f) abuf->fields.fmt_machi.f
1515 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1516 int UNUSED written
= 0;
1517 IADDR UNUSED pc
= abuf
->addr
;
1518 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1521 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16))))), 8), 8);
1522 SET_H_ACCUM (opval
);
1523 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1530 /* macwlo: macwlo $src1,$src2 */
1533 SEM_FN_NAME (m32rbf
,macwlo
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1535 #define FLD(f) abuf->fields.fmt_machi.f
1536 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1537 int UNUSED written
= 0;
1538 IADDR UNUSED pc
= abuf
->addr
;
1539 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1542 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
))))), 8), 8);
1543 SET_H_ACCUM (opval
);
1544 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1551 /* mul: mul $dr,$sr */
1554 SEM_FN_NAME (m32rbf
,mul
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1556 #define FLD(f) abuf->fields.fmt_add.f
1557 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1558 int UNUSED written
= 0;
1559 IADDR UNUSED pc
= abuf
->addr
;
1560 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1563 SI opval
= MULSI (* FLD (i_dr
), * FLD (i_sr
));
1564 * FLD (i_dr
) = opval
;
1565 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1572 /* mulhi: mulhi $src1,$src2 */
1575 SEM_FN_NAME (m32rbf
,mulhi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1577 #define FLD(f) abuf->fields.fmt_mulhi.f
1578 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1579 int UNUSED written
= 0;
1580 IADDR UNUSED pc
= abuf
->addr
;
1581 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1584 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1
), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16)))), 16), 16);
1585 SET_H_ACCUM (opval
);
1586 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1593 /* mullo: mullo $src1,$src2 */
1596 SEM_FN_NAME (m32rbf
,mullo
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1598 #define FLD(f) abuf->fields.fmt_mulhi.f
1599 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1600 int UNUSED written
= 0;
1601 IADDR UNUSED pc
= abuf
->addr
;
1602 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1605 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1
), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
)))), 16), 16);
1606 SET_H_ACCUM (opval
);
1607 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1614 /* mulwhi: mulwhi $src1,$src2 */
1617 SEM_FN_NAME (m32rbf
,mulwhi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1619 #define FLD(f) abuf->fields.fmt_mulhi.f
1620 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1621 int UNUSED written
= 0;
1622 IADDR UNUSED pc
= abuf
->addr
;
1623 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1626 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16)))), 8), 8);
1627 SET_H_ACCUM (opval
);
1628 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1635 /* mulwlo: mulwlo $src1,$src2 */
1638 SEM_FN_NAME (m32rbf
,mulwlo
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1640 #define FLD(f) abuf->fields.fmt_mulhi.f
1641 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1642 int UNUSED written
= 0;
1643 IADDR UNUSED pc
= abuf
->addr
;
1644 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1647 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
)))), 8), 8);
1648 SET_H_ACCUM (opval
);
1649 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1656 /* mv: mv $dr,$sr */
1659 SEM_FN_NAME (m32rbf
,mv
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1661 #define FLD(f) abuf->fields.fmt_mv.f
1662 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1663 int UNUSED written
= 0;
1664 IADDR UNUSED pc
= abuf
->addr
;
1665 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1668 SI opval
= * FLD (i_sr
);
1669 * FLD (i_dr
) = opval
;
1670 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1677 /* mvfachi: mvfachi $dr */
1680 SEM_FN_NAME (m32rbf
,mvfachi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1682 #define FLD(f) abuf->fields.fmt_mvfachi.f
1683 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1684 int UNUSED written
= 0;
1685 IADDR UNUSED pc
= abuf
->addr
;
1686 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1689 SI opval
= TRUNCDISI (SRADI (GET_H_ACCUM (), 32));
1690 * FLD (i_dr
) = opval
;
1691 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1698 /* mvfaclo: mvfaclo $dr */
1701 SEM_FN_NAME (m32rbf
,mvfaclo
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1703 #define FLD(f) abuf->fields.fmt_mvfachi.f
1704 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1705 int UNUSED written
= 0;
1706 IADDR UNUSED pc
= abuf
->addr
;
1707 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1710 SI opval
= TRUNCDISI (GET_H_ACCUM ());
1711 * FLD (i_dr
) = opval
;
1712 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1719 /* mvfacmi: mvfacmi $dr */
1722 SEM_FN_NAME (m32rbf
,mvfacmi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1724 #define FLD(f) abuf->fields.fmt_mvfachi.f
1725 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1726 int UNUSED written
= 0;
1727 IADDR UNUSED pc
= abuf
->addr
;
1728 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1731 SI opval
= TRUNCDISI (SRADI (GET_H_ACCUM (), 16));
1732 * FLD (i_dr
) = opval
;
1733 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1740 /* mvfc: mvfc $dr,$scr */
1743 SEM_FN_NAME (m32rbf
,mvfc
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1745 #define FLD(f) abuf->fields.fmt_mvfc.f
1746 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1747 int UNUSED written
= 0;
1748 IADDR UNUSED pc
= abuf
->addr
;
1749 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1752 SI opval
= GET_H_CR (FLD (f_r2
));
1753 * FLD (i_dr
) = opval
;
1754 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1761 /* mvtachi: mvtachi $src1 */
1764 SEM_FN_NAME (m32rbf
,mvtachi
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1766 #define FLD(f) abuf->fields.fmt_mvtachi.f
1767 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1768 int UNUSED written
= 0;
1769 IADDR UNUSED pc
= abuf
->addr
;
1770 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1773 DI opval
= ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1
)), 32));
1774 SET_H_ACCUM (opval
);
1775 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1782 /* mvtaclo: mvtaclo $src1 */
1785 SEM_FN_NAME (m32rbf
,mvtaclo
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1787 #define FLD(f) abuf->fields.fmt_mvtachi.f
1788 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1789 int UNUSED written
= 0;
1790 IADDR UNUSED pc
= abuf
->addr
;
1791 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1794 DI opval
= ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1
)));
1795 SET_H_ACCUM (opval
);
1796 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1803 /* mvtc: mvtc $sr,$dcr */
1806 SEM_FN_NAME (m32rbf
,mvtc
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1808 #define FLD(f) abuf->fields.fmt_mvtc.f
1809 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1810 int UNUSED written
= 0;
1811 IADDR UNUSED pc
= abuf
->addr
;
1812 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1815 USI opval
= * FLD (i_sr
);
1816 SET_H_CR (FLD (f_r1
), opval
);
1817 TRACE_RESULT (current_cpu
, abuf
, "dcr", 'x', opval
);
1824 /* neg: neg $dr,$sr */
1827 SEM_FN_NAME (m32rbf
,neg
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1829 #define FLD(f) abuf->fields.fmt_mv.f
1830 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1831 int UNUSED written
= 0;
1832 IADDR UNUSED pc
= abuf
->addr
;
1833 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1836 SI opval
= NEGSI (* FLD (i_sr
));
1837 * FLD (i_dr
) = opval
;
1838 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1848 SEM_FN_NAME (m32rbf
,nop
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1850 #define FLD(f) abuf->fields.fmt_nop.f
1851 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1852 int UNUSED written
= 0;
1853 IADDR UNUSED pc
= abuf
->addr
;
1854 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1856 PROFILE_COUNT_FILLNOPS (current_cpu
, abuf
->addr
);
1862 /* not: not $dr,$sr */
1865 SEM_FN_NAME (m32rbf
,not) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1867 #define FLD(f) abuf->fields.fmt_mv.f
1868 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1869 int UNUSED written
= 0;
1870 IADDR UNUSED pc
= abuf
->addr
;
1871 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1874 SI opval
= INVSI (* FLD (i_sr
));
1875 * FLD (i_dr
) = opval
;
1876 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1886 SEM_FN_NAME (m32rbf
,rac
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1888 #define FLD(f) abuf->fields.fmt_rac.f
1889 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1890 int UNUSED written
= 0;
1891 IADDR UNUSED pc
= abuf
->addr
;
1892 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1896 tmp_tmp1
= SLLDI (GET_H_ACCUM (), 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 SET_H_ACCUM (opval
);
1901 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1912 SEM_FN_NAME (m32rbf
,rach
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1914 #define FLD(f) abuf->fields.fmt_rac.f
1915 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1916 int UNUSED written
= 0;
1917 IADDR UNUSED pc
= abuf
->addr
;
1918 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1922 tmp_tmp1
= ANDDI (GET_H_ACCUM (), MAKEDI (16777215, 0xffffffff));
1923 if (ANDIF (GEDI (tmp_tmp1
, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1
, MAKEDI (8388607, 0xffffffff)))) {
1924 tmp_tmp1
= MAKEDI (16383, 0x80000000);
1926 if (ANDIF (GEDI (tmp_tmp1
, MAKEDI (8388608, 0)), LEDI (tmp_tmp1
, MAKEDI (16760832, 0)))) {
1927 tmp_tmp1
= MAKEDI (16760832, 0);
1929 tmp_tmp1
= ANDDI (ADDDI (GET_H_ACCUM (), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
1932 tmp_tmp1
= SLLDI (tmp_tmp1
, 1);
1934 DI opval
= SRADI (SLLDI (tmp_tmp1
, 7), 7);
1935 SET_H_ACCUM (opval
);
1936 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1947 SEM_FN_NAME (m32rbf
,rte
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1949 #define FLD(f) abuf->fields.cti.fields.fmt_rte.f
1950 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1951 int UNUSED written
= 0;
1952 IADDR UNUSED pc
= abuf
->addr
;
1954 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1958 USI opval
= ANDSI (GET_H_CR (((UINT
) 6)), -4);
1959 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1960 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1963 USI opval
= GET_H_CR (((UINT
) 14));
1964 SET_H_CR (((UINT
) 6), opval
);
1965 TRACE_RESULT (current_cpu
, abuf
, "cr-6", 'x', opval
);
1968 UQI opval
= CPU (h_bpsw
);
1970 TRACE_RESULT (current_cpu
, abuf
, "psw", 'x', opval
);
1973 UQI opval
= CPU (h_bbpsw
);
1974 CPU (h_bpsw
) = opval
;
1975 TRACE_RESULT (current_cpu
, abuf
, "bpsw", 'x', opval
);
1979 SEM_BRANCH_FINI (vpc
);
1984 /* seth: seth $dr,$hash$hi16 */
1987 SEM_FN_NAME (m32rbf
,seth
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
1989 #define FLD(f) abuf->fields.fmt_seth.f
1990 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1991 int UNUSED written
= 0;
1992 IADDR UNUSED pc
= abuf
->addr
;
1993 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1996 SI opval
= SLLSI (FLD (f_hi16
), 16);
1997 * FLD (i_dr
) = opval
;
1998 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2005 /* sll: sll $dr,$sr */
2008 SEM_FN_NAME (m32rbf
,sll
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2010 #define FLD(f) abuf->fields.fmt_add.f
2011 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2012 int UNUSED written
= 0;
2013 IADDR UNUSED pc
= abuf
->addr
;
2014 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2017 SI opval
= SLLSI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2018 * FLD (i_dr
) = opval
;
2019 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2026 /* sll3: sll3 $dr,$sr,$simm16 */
2029 SEM_FN_NAME (m32rbf
,sll3
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2031 #define FLD(f) abuf->fields.fmt_sll3.f
2032 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2033 int UNUSED written
= 0;
2034 IADDR UNUSED pc
= abuf
->addr
;
2035 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2038 SI opval
= SLLSI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2039 * FLD (i_dr
) = opval
;
2040 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2047 /* slli: slli $dr,$uimm5 */
2050 SEM_FN_NAME (m32rbf
,slli
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2052 #define FLD(f) abuf->fields.fmt_slli.f
2053 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2054 int UNUSED written
= 0;
2055 IADDR UNUSED pc
= abuf
->addr
;
2056 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2059 SI opval
= SLLSI (* FLD (i_dr
), FLD (f_uimm5
));
2060 * FLD (i_dr
) = opval
;
2061 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2068 /* sra: sra $dr,$sr */
2071 SEM_FN_NAME (m32rbf
,sra
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2073 #define FLD(f) abuf->fields.fmt_add.f
2074 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2075 int UNUSED written
= 0;
2076 IADDR UNUSED pc
= abuf
->addr
;
2077 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2080 SI opval
= SRASI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2081 * FLD (i_dr
) = opval
;
2082 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2089 /* sra3: sra3 $dr,$sr,$simm16 */
2092 SEM_FN_NAME (m32rbf
,sra3
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2094 #define FLD(f) abuf->fields.fmt_sll3.f
2095 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2096 int UNUSED written
= 0;
2097 IADDR UNUSED pc
= abuf
->addr
;
2098 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2101 SI opval
= SRASI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2102 * FLD (i_dr
) = opval
;
2103 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2110 /* srai: srai $dr,$uimm5 */
2113 SEM_FN_NAME (m32rbf
,srai
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2115 #define FLD(f) abuf->fields.fmt_slli.f
2116 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2117 int UNUSED written
= 0;
2118 IADDR UNUSED pc
= abuf
->addr
;
2119 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2122 SI opval
= SRASI (* FLD (i_dr
), FLD (f_uimm5
));
2123 * FLD (i_dr
) = opval
;
2124 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2131 /* srl: srl $dr,$sr */
2134 SEM_FN_NAME (m32rbf
,srl
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2136 #define FLD(f) abuf->fields.fmt_add.f
2137 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2138 int UNUSED written
= 0;
2139 IADDR UNUSED pc
= abuf
->addr
;
2140 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2143 SI opval
= SRLSI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2144 * FLD (i_dr
) = opval
;
2145 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2152 /* srl3: srl3 $dr,$sr,$simm16 */
2155 SEM_FN_NAME (m32rbf
,srl3
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2157 #define FLD(f) abuf->fields.fmt_sll3.f
2158 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2159 int UNUSED written
= 0;
2160 IADDR UNUSED pc
= abuf
->addr
;
2161 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2164 SI opval
= SRLSI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2165 * FLD (i_dr
) = opval
;
2166 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2173 /* srli: srli $dr,$uimm5 */
2176 SEM_FN_NAME (m32rbf
,srli
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2178 #define FLD(f) abuf->fields.fmt_slli.f
2179 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2180 int UNUSED written
= 0;
2181 IADDR UNUSED pc
= abuf
->addr
;
2182 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2185 SI opval
= SRLSI (* FLD (i_dr
), FLD (f_uimm5
));
2186 * FLD (i_dr
) = opval
;
2187 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2194 /* st: st $src1,@$src2 */
2197 SEM_FN_NAME (m32rbf
,st
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2199 #define FLD(f) abuf->fields.fmt_st.f
2200 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2201 int UNUSED written
= 0;
2202 IADDR UNUSED pc
= abuf
->addr
;
2203 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2206 SI opval
= * FLD (i_src1
);
2207 SETMEMSI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2208 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2215 /* st-d: st $src1,@($slo16,$src2) */
2218 SEM_FN_NAME (m32rbf
,st_d
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2220 #define FLD(f) abuf->fields.fmt_st_d.f
2221 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2222 int UNUSED written
= 0;
2223 IADDR UNUSED pc
= abuf
->addr
;
2224 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2227 SI opval
= * FLD (i_src1
);
2228 SETMEMSI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2229 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2236 /* stb: stb $src1,@$src2 */
2239 SEM_FN_NAME (m32rbf
,stb
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2241 #define FLD(f) abuf->fields.fmt_stb.f
2242 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2243 int UNUSED written
= 0;
2244 IADDR UNUSED pc
= abuf
->addr
;
2245 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2248 QI opval
= * FLD (i_src1
);
2249 SETMEMQI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2250 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2257 /* stb-d: stb $src1,@($slo16,$src2) */
2260 SEM_FN_NAME (m32rbf
,stb_d
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2262 #define FLD(f) abuf->fields.fmt_stb_d.f
2263 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2264 int UNUSED written
= 0;
2265 IADDR UNUSED pc
= abuf
->addr
;
2266 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2269 QI opval
= * FLD (i_src1
);
2270 SETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2271 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2278 /* sth: sth $src1,@$src2 */
2281 SEM_FN_NAME (m32rbf
,sth
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2283 #define FLD(f) abuf->fields.fmt_sth.f
2284 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2285 int UNUSED written
= 0;
2286 IADDR UNUSED pc
= abuf
->addr
;
2287 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2290 HI opval
= * FLD (i_src1
);
2291 SETMEMHI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2292 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2299 /* sth-d: sth $src1,@($slo16,$src2) */
2302 SEM_FN_NAME (m32rbf
,sth_d
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2304 #define FLD(f) abuf->fields.fmt_sth_d.f
2305 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2306 int UNUSED written
= 0;
2307 IADDR UNUSED pc
= abuf
->addr
;
2308 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2311 HI opval
= * FLD (i_src1
);
2312 SETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2313 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2320 /* st-plus: st $src1,@+$src2 */
2323 SEM_FN_NAME (m32rbf
,st_plus
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2325 #define FLD(f) abuf->fields.fmt_st_plus.f
2326 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2327 int UNUSED written
= 0;
2328 IADDR UNUSED pc
= abuf
->addr
;
2329 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2333 tmp_new_src2
= ADDSI (* FLD (i_src2
), 4);
2335 SI opval
= * FLD (i_src1
);
2336 SETMEMSI (current_cpu
, pc
, tmp_new_src2
, opval
);
2337 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2340 SI opval
= tmp_new_src2
;
2341 * FLD (i_src2
) = opval
;
2342 TRACE_RESULT (current_cpu
, abuf
, "src2", 'x', opval
);
2350 /* st-minus: st $src1,@-$src2 */
2353 SEM_FN_NAME (m32rbf
,st_minus
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2355 #define FLD(f) abuf->fields.fmt_st_plus.f
2356 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2357 int UNUSED written
= 0;
2358 IADDR UNUSED pc
= abuf
->addr
;
2359 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2363 tmp_new_src2
= SUBSI (* FLD (i_src2
), 4);
2365 SI opval
= * FLD (i_src1
);
2366 SETMEMSI (current_cpu
, pc
, tmp_new_src2
, opval
);
2367 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2370 SI opval
= tmp_new_src2
;
2371 * FLD (i_src2
) = opval
;
2372 TRACE_RESULT (current_cpu
, abuf
, "src2", 'x', opval
);
2380 /* sub: sub $dr,$sr */
2383 SEM_FN_NAME (m32rbf
,sub
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2385 #define FLD(f) abuf->fields.fmt_add.f
2386 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2387 int UNUSED written
= 0;
2388 IADDR UNUSED pc
= abuf
->addr
;
2389 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2392 SI opval
= SUBSI (* FLD (i_dr
), * FLD (i_sr
));
2393 * FLD (i_dr
) = opval
;
2394 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2401 /* subv: subv $dr,$sr */
2404 SEM_FN_NAME (m32rbf
,subv
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2406 #define FLD(f) abuf->fields.fmt_addv.f
2407 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2408 int UNUSED written
= 0;
2409 IADDR UNUSED pc
= abuf
->addr
;
2410 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2414 temp0
= SUBSI (* FLD (i_dr
), * FLD (i_sr
));
2415 temp1
= SUBOFSI (* FLD (i_dr
), * FLD (i_sr
), 0);
2418 * FLD (i_dr
) = opval
;
2419 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2423 CPU (h_cond
) = opval
;
2424 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
2432 /* subx: subx $dr,$sr */
2435 SEM_FN_NAME (m32rbf
,subx
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2437 #define FLD(f) abuf->fields.fmt_addx.f
2438 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2439 int UNUSED written
= 0;
2440 IADDR UNUSED pc
= abuf
->addr
;
2441 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2445 temp0
= SUBCSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
2446 temp1
= SUBCFSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
2449 * FLD (i_dr
) = opval
;
2450 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2454 CPU (h_cond
) = opval
;
2455 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
2463 /* trap: trap $uimm4 */
2466 SEM_FN_NAME (m32rbf
,trap
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2468 #define FLD(f) abuf->fields.cti.fields.fmt_trap.f
2469 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2470 int UNUSED written
= 0;
2471 IADDR UNUSED pc
= abuf
->addr
;
2473 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2477 USI opval
= GET_H_CR (((UINT
) 6));
2478 SET_H_CR (((UINT
) 14), opval
);
2479 TRACE_RESULT (current_cpu
, abuf
, "cr-14", 'x', opval
);
2482 USI opval
= ADDSI (pc
, 4);
2483 SET_H_CR (((UINT
) 6), opval
);
2484 TRACE_RESULT (current_cpu
, abuf
, "cr-6", 'x', opval
);
2487 UQI opval
= CPU (h_bpsw
);
2488 CPU (h_bbpsw
) = opval
;
2489 TRACE_RESULT (current_cpu
, abuf
, "bbpsw", 'x', opval
);
2492 UQI opval
= GET_H_PSW ();
2493 CPU (h_bpsw
) = opval
;
2494 TRACE_RESULT (current_cpu
, abuf
, "bpsw", 'x', opval
);
2497 UQI opval
= ANDQI (GET_H_PSW (), 128);
2499 TRACE_RESULT (current_cpu
, abuf
, "psw", 'x', opval
);
2502 SI opval
= m32r_trap (current_cpu
, pc
, FLD (f_uimm4
));
2503 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
2504 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
2508 SEM_BRANCH_FINI (vpc
);
2513 /* unlock: unlock $src1,@$src2 */
2516 SEM_FN_NAME (m32rbf
,unlock
) (SIM_CPU
*current_cpu
, SEM_ARG sem_arg
)
2518 #define FLD(f) abuf->fields.fmt_unlock.f
2519 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2520 int UNUSED written
= 0;
2521 IADDR UNUSED pc
= abuf
->addr
;
2522 SEM_PC vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2527 SI opval
= * FLD (i_src1
);
2528 SETMEMSI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2529 written
|= (1 << 4);
2530 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2535 CPU (h_lock
) = opval
;
2536 TRACE_RESULT (current_cpu
, abuf
, "lock", 'x', opval
);
2540 abuf
->written
= written
;
This page took 0.083237 seconds and 3 git commands to generate.