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.
27 /* The labels have the case they have because the enum of insn types
28 is all uppercase and in the non-stdc case the insn symbol is built
29 into the enum name. */
35 { M32RBF_INSN_X_INVALID
, && case_sem_INSN_X_INVALID
},
36 { M32RBF_INSN_X_AFTER
, && case_sem_INSN_X_AFTER
},
37 { M32RBF_INSN_X_BEFORE
, && case_sem_INSN_X_BEFORE
},
38 { M32RBF_INSN_X_CTI_CHAIN
, && case_sem_INSN_X_CTI_CHAIN
},
39 { M32RBF_INSN_X_CHAIN
, && case_sem_INSN_X_CHAIN
},
40 { M32RBF_INSN_X_BEGIN
, && case_sem_INSN_X_BEGIN
},
41 { M32RBF_INSN_ADD
, && case_sem_INSN_ADD
},
42 { M32RBF_INSN_ADD3
, && case_sem_INSN_ADD3
},
43 { M32RBF_INSN_AND
, && case_sem_INSN_AND
},
44 { M32RBF_INSN_AND3
, && case_sem_INSN_AND3
},
45 { M32RBF_INSN_OR
, && case_sem_INSN_OR
},
46 { M32RBF_INSN_OR3
, && case_sem_INSN_OR3
},
47 { M32RBF_INSN_XOR
, && case_sem_INSN_XOR
},
48 { M32RBF_INSN_XOR3
, && case_sem_INSN_XOR3
},
49 { M32RBF_INSN_ADDI
, && case_sem_INSN_ADDI
},
50 { M32RBF_INSN_ADDV
, && case_sem_INSN_ADDV
},
51 { M32RBF_INSN_ADDV3
, && case_sem_INSN_ADDV3
},
52 { M32RBF_INSN_ADDX
, && case_sem_INSN_ADDX
},
53 { M32RBF_INSN_BC8
, && case_sem_INSN_BC8
},
54 { M32RBF_INSN_BC24
, && case_sem_INSN_BC24
},
55 { M32RBF_INSN_BEQ
, && case_sem_INSN_BEQ
},
56 { M32RBF_INSN_BEQZ
, && case_sem_INSN_BEQZ
},
57 { M32RBF_INSN_BGEZ
, && case_sem_INSN_BGEZ
},
58 { M32RBF_INSN_BGTZ
, && case_sem_INSN_BGTZ
},
59 { M32RBF_INSN_BLEZ
, && case_sem_INSN_BLEZ
},
60 { M32RBF_INSN_BLTZ
, && case_sem_INSN_BLTZ
},
61 { M32RBF_INSN_BNEZ
, && case_sem_INSN_BNEZ
},
62 { M32RBF_INSN_BL8
, && case_sem_INSN_BL8
},
63 { M32RBF_INSN_BL24
, && case_sem_INSN_BL24
},
64 { M32RBF_INSN_BNC8
, && case_sem_INSN_BNC8
},
65 { M32RBF_INSN_BNC24
, && case_sem_INSN_BNC24
},
66 { M32RBF_INSN_BNE
, && case_sem_INSN_BNE
},
67 { M32RBF_INSN_BRA8
, && case_sem_INSN_BRA8
},
68 { M32RBF_INSN_BRA24
, && case_sem_INSN_BRA24
},
69 { M32RBF_INSN_CMP
, && case_sem_INSN_CMP
},
70 { M32RBF_INSN_CMPI
, && case_sem_INSN_CMPI
},
71 { M32RBF_INSN_CMPU
, && case_sem_INSN_CMPU
},
72 { M32RBF_INSN_CMPUI
, && case_sem_INSN_CMPUI
},
73 { M32RBF_INSN_DIV
, && case_sem_INSN_DIV
},
74 { M32RBF_INSN_DIVU
, && case_sem_INSN_DIVU
},
75 { M32RBF_INSN_REM
, && case_sem_INSN_REM
},
76 { M32RBF_INSN_REMU
, && case_sem_INSN_REMU
},
77 { M32RBF_INSN_JL
, && case_sem_INSN_JL
},
78 { M32RBF_INSN_JMP
, && case_sem_INSN_JMP
},
79 { M32RBF_INSN_LD
, && case_sem_INSN_LD
},
80 { M32RBF_INSN_LD_D
, && case_sem_INSN_LD_D
},
81 { M32RBF_INSN_LDB
, && case_sem_INSN_LDB
},
82 { M32RBF_INSN_LDB_D
, && case_sem_INSN_LDB_D
},
83 { M32RBF_INSN_LDH
, && case_sem_INSN_LDH
},
84 { M32RBF_INSN_LDH_D
, && case_sem_INSN_LDH_D
},
85 { M32RBF_INSN_LDUB
, && case_sem_INSN_LDUB
},
86 { M32RBF_INSN_LDUB_D
, && case_sem_INSN_LDUB_D
},
87 { M32RBF_INSN_LDUH
, && case_sem_INSN_LDUH
},
88 { M32RBF_INSN_LDUH_D
, && case_sem_INSN_LDUH_D
},
89 { M32RBF_INSN_LD_PLUS
, && case_sem_INSN_LD_PLUS
},
90 { M32RBF_INSN_LD24
, && case_sem_INSN_LD24
},
91 { M32RBF_INSN_LDI8
, && case_sem_INSN_LDI8
},
92 { M32RBF_INSN_LDI16
, && case_sem_INSN_LDI16
},
93 { M32RBF_INSN_LOCK
, && case_sem_INSN_LOCK
},
94 { M32RBF_INSN_MACHI
, && case_sem_INSN_MACHI
},
95 { M32RBF_INSN_MACLO
, && case_sem_INSN_MACLO
},
96 { M32RBF_INSN_MACWHI
, && case_sem_INSN_MACWHI
},
97 { M32RBF_INSN_MACWLO
, && case_sem_INSN_MACWLO
},
98 { M32RBF_INSN_MUL
, && case_sem_INSN_MUL
},
99 { M32RBF_INSN_MULHI
, && case_sem_INSN_MULHI
},
100 { M32RBF_INSN_MULLO
, && case_sem_INSN_MULLO
},
101 { M32RBF_INSN_MULWHI
, && case_sem_INSN_MULWHI
},
102 { M32RBF_INSN_MULWLO
, && case_sem_INSN_MULWLO
},
103 { M32RBF_INSN_MV
, && case_sem_INSN_MV
},
104 { M32RBF_INSN_MVFACHI
, && case_sem_INSN_MVFACHI
},
105 { M32RBF_INSN_MVFACLO
, && case_sem_INSN_MVFACLO
},
106 { M32RBF_INSN_MVFACMI
, && case_sem_INSN_MVFACMI
},
107 { M32RBF_INSN_MVFC
, && case_sem_INSN_MVFC
},
108 { M32RBF_INSN_MVTACHI
, && case_sem_INSN_MVTACHI
},
109 { M32RBF_INSN_MVTACLO
, && case_sem_INSN_MVTACLO
},
110 { M32RBF_INSN_MVTC
, && case_sem_INSN_MVTC
},
111 { M32RBF_INSN_NEG
, && case_sem_INSN_NEG
},
112 { M32RBF_INSN_NOP
, && case_sem_INSN_NOP
},
113 { M32RBF_INSN_NOT
, && case_sem_INSN_NOT
},
114 { M32RBF_INSN_RAC
, && case_sem_INSN_RAC
},
115 { M32RBF_INSN_RACH
, && case_sem_INSN_RACH
},
116 { M32RBF_INSN_RTE
, && case_sem_INSN_RTE
},
117 { M32RBF_INSN_SETH
, && case_sem_INSN_SETH
},
118 { M32RBF_INSN_SLL
, && case_sem_INSN_SLL
},
119 { M32RBF_INSN_SLL3
, && case_sem_INSN_SLL3
},
120 { M32RBF_INSN_SLLI
, && case_sem_INSN_SLLI
},
121 { M32RBF_INSN_SRA
, && case_sem_INSN_SRA
},
122 { M32RBF_INSN_SRA3
, && case_sem_INSN_SRA3
},
123 { M32RBF_INSN_SRAI
, && case_sem_INSN_SRAI
},
124 { M32RBF_INSN_SRL
, && case_sem_INSN_SRL
},
125 { M32RBF_INSN_SRL3
, && case_sem_INSN_SRL3
},
126 { M32RBF_INSN_SRLI
, && case_sem_INSN_SRLI
},
127 { M32RBF_INSN_ST
, && case_sem_INSN_ST
},
128 { M32RBF_INSN_ST_D
, && case_sem_INSN_ST_D
},
129 { M32RBF_INSN_STB
, && case_sem_INSN_STB
},
130 { M32RBF_INSN_STB_D
, && case_sem_INSN_STB_D
},
131 { M32RBF_INSN_STH
, && case_sem_INSN_STH
},
132 { M32RBF_INSN_STH_D
, && case_sem_INSN_STH_D
},
133 { M32RBF_INSN_ST_PLUS
, && case_sem_INSN_ST_PLUS
},
134 { M32RBF_INSN_ST_MINUS
, && case_sem_INSN_ST_MINUS
},
135 { M32RBF_INSN_SUB
, && case_sem_INSN_SUB
},
136 { M32RBF_INSN_SUBV
, && case_sem_INSN_SUBV
},
137 { M32RBF_INSN_SUBX
, && case_sem_INSN_SUBX
},
138 { M32RBF_INSN_TRAP
, && case_sem_INSN_TRAP
},
139 { M32RBF_INSN_UNLOCK
, && case_sem_INSN_UNLOCK
},
144 for (i
= 0; labels
[i
].label
!= 0; ++i
)
147 CPU_IDESC (current_cpu
) [labels
[i
].index
].sem_fast_lab
= labels
[i
].label
;
149 CPU_IDESC (current_cpu
) [labels
[i
].index
].sem_full_lab
= labels
[i
].label
;
154 #endif /* DEFINE_LABELS */
158 /* If hyper-fast [well not unnecessarily slow] execution is selected, turn
159 off frills like tracing and profiling. */
160 /* FIXME: A better way would be to have TRACE_RESULT check for something
161 that can cause it to be optimized out. Another way would be to emit
162 special handlers into the instruction "stream". */
166 #define TRACE_RESULT(cpu, abuf, name, type, val)
170 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
176 /* Branch to next handler without going around main loop. */
177 #define NEXT(vpc) goto * SEM_ARGBUF (vpc) -> semantic.sem_case
178 SWITCH (sem
, SEM_ARGBUF (vpc
) -> semantic
.sem_case
)
180 #else /* ! WITH_SCACHE_PBB */
182 #define NEXT(vpc) BREAK (sem)
185 SWITCH (sem
, SEM_ARGBUF (sc
) -> idesc
->sem_fast_lab
)
187 SWITCH (sem
, SEM_ARGBUF (sc
) -> idesc
->sem_full_lab
)
190 SWITCH (sem
, SEM_ARGBUF (sc
) -> idesc
->num
)
193 #endif /* ! WITH_SCACHE_PBB */
197 CASE (sem
, INSN_X_INVALID
) : /* --invalid-- */
199 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
200 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
201 #define FLD(f) abuf->fields.fmt_empty.f
202 int UNUSED written
= 0;
203 IADDR UNUSED pc
= abuf
->addr
;
204 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
208 /* Update the recorded pc in the cpu state struct. */
211 sim_engine_invalid_insn (current_cpu
, pc
);
212 sim_io_error (CPU_STATE (current_cpu
), "invalid insn not handled\n");
220 CASE (sem
, INSN_X_AFTER
) : /* --after-- */
222 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
223 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
224 #define FLD(f) abuf->fields.fmt_empty.f
225 int UNUSED written
= 0;
226 IADDR UNUSED pc
= abuf
->addr
;
227 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
230 #if WITH_SCACHE_PBB_M32RBF
231 m32rbf_pbb_after (current_cpu
, sem_arg
);
239 CASE (sem
, INSN_X_BEFORE
) : /* --before-- */
241 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
242 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
243 #define FLD(f) abuf->fields.fmt_empty.f
244 int UNUSED written
= 0;
245 IADDR UNUSED pc
= abuf
->addr
;
246 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
249 #if WITH_SCACHE_PBB_M32RBF
250 m32rbf_pbb_before (current_cpu
, sem_arg
);
258 CASE (sem
, INSN_X_CTI_CHAIN
) : /* --cti-chain-- */
260 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
261 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
262 #define FLD(f) abuf->fields.fmt_empty.f
263 int UNUSED written
= 0;
264 IADDR UNUSED pc
= abuf
->addr
;
265 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
268 #if WITH_SCACHE_PBB_M32RBF
270 vpc
= m32rbf_pbb_cti_chain (current_cpu
, sem_arg
,
271 pbb_br_type
, pbb_br_npc
);
274 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
275 vpc
= m32rbf_pbb_cti_chain (current_cpu
, sem_arg
,
276 CPU_PBB_BR_TYPE (current_cpu
),
277 CPU_PBB_BR_NPC (current_cpu
));
286 CASE (sem
, INSN_X_CHAIN
) : /* --chain-- */
288 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
289 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
290 #define FLD(f) abuf->fields.fmt_empty.f
291 int UNUSED written
= 0;
292 IADDR UNUSED pc
= abuf
->addr
;
293 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
296 #if WITH_SCACHE_PBB_M32RBF
297 vpc
= m32rbf_pbb_chain (current_cpu
, sem_arg
);
308 CASE (sem
, INSN_X_BEGIN
) : /* --begin-- */
310 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
311 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
312 #define FLD(f) abuf->fields.fmt_empty.f
313 int UNUSED written
= 0;
314 IADDR UNUSED pc
= abuf
->addr
;
315 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 0);
318 #if WITH_SCACHE_PBB_M32RBF
320 /* In the switch case FAST_P is a constant, allowing several optimizations
321 in any called inline functions. */
322 vpc
= m32rbf_pbb_begin (current_cpu
, FAST_P
);
324 vpc
= m32rbf_pbb_begin (current_cpu
, STATE_RUN_FAST_P (CPU_STATE (current_cpu
)));
333 CASE (sem
, INSN_ADD
) : /* add $dr,$sr */
335 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
336 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
337 #define FLD(f) abuf->fields.sfmt_add.f
338 int UNUSED written
= 0;
339 IADDR UNUSED pc
= abuf
->addr
;
340 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
343 SI opval
= ADDSI (* FLD (i_dr
), * FLD (i_sr
));
344 * FLD (i_dr
) = opval
;
345 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
352 CASE (sem
, INSN_ADD3
) : /* add3 $dr,$sr,$hash$slo16 */
354 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
355 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
356 #define FLD(f) abuf->fields.sfmt_add3.f
357 int UNUSED written
= 0;
358 IADDR UNUSED pc
= abuf
->addr
;
359 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
362 SI opval
= ADDSI (* FLD (i_sr
), FLD (f_simm16
));
363 * FLD (i_dr
) = opval
;
364 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
371 CASE (sem
, INSN_AND
) : /* and $dr,$sr */
373 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
374 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
375 #define FLD(f) abuf->fields.sfmt_add.f
376 int UNUSED written
= 0;
377 IADDR UNUSED pc
= abuf
->addr
;
378 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
381 SI opval
= ANDSI (* FLD (i_dr
), * FLD (i_sr
));
382 * FLD (i_dr
) = opval
;
383 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
390 CASE (sem
, INSN_AND3
) : /* and3 $dr,$sr,$uimm16 */
392 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
393 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
394 #define FLD(f) abuf->fields.sfmt_and3.f
395 int UNUSED written
= 0;
396 IADDR UNUSED pc
= abuf
->addr
;
397 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
400 SI opval
= ANDSI (* FLD (i_sr
), FLD (f_uimm16
));
401 * FLD (i_dr
) = opval
;
402 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
409 CASE (sem
, INSN_OR
) : /* or $dr,$sr */
411 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
412 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
413 #define FLD(f) abuf->fields.sfmt_add.f
414 int UNUSED written
= 0;
415 IADDR UNUSED pc
= abuf
->addr
;
416 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
419 SI opval
= ORSI (* FLD (i_dr
), * FLD (i_sr
));
420 * FLD (i_dr
) = opval
;
421 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
428 CASE (sem
, INSN_OR3
) : /* or3 $dr,$sr,$hash$ulo16 */
430 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
431 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
432 #define FLD(f) abuf->fields.sfmt_and3.f
433 int UNUSED written
= 0;
434 IADDR UNUSED pc
= abuf
->addr
;
435 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
438 SI opval
= ORSI (* FLD (i_sr
), FLD (f_uimm16
));
439 * FLD (i_dr
) = opval
;
440 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
447 CASE (sem
, INSN_XOR
) : /* xor $dr,$sr */
449 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
450 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
451 #define FLD(f) abuf->fields.sfmt_add.f
452 int UNUSED written
= 0;
453 IADDR UNUSED pc
= abuf
->addr
;
454 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
457 SI opval
= XORSI (* FLD (i_dr
), * FLD (i_sr
));
458 * FLD (i_dr
) = opval
;
459 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
466 CASE (sem
, INSN_XOR3
) : /* xor3 $dr,$sr,$uimm16 */
468 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
469 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
470 #define FLD(f) abuf->fields.sfmt_and3.f
471 int UNUSED written
= 0;
472 IADDR UNUSED pc
= abuf
->addr
;
473 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
476 SI opval
= XORSI (* FLD (i_sr
), FLD (f_uimm16
));
477 * FLD (i_dr
) = opval
;
478 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
485 CASE (sem
, INSN_ADDI
) : /* addi $dr,$simm8 */
487 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
488 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
489 #define FLD(f) abuf->fields.sfmt_addi.f
490 int UNUSED written
= 0;
491 IADDR UNUSED pc
= abuf
->addr
;
492 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
495 SI opval
= ADDSI (* FLD (i_dr
), FLD (f_simm8
));
496 * FLD (i_dr
) = opval
;
497 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
504 CASE (sem
, INSN_ADDV
) : /* addv $dr,$sr */
506 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
507 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
508 #define FLD(f) abuf->fields.sfmt_add.f
509 int UNUSED written
= 0;
510 IADDR UNUSED pc
= abuf
->addr
;
511 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
515 temp0
= ADDSI (* FLD (i_dr
), * FLD (i_sr
));
516 temp1
= ADDOFSI (* FLD (i_dr
), * FLD (i_sr
), 0);
519 * FLD (i_dr
) = opval
;
520 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
524 CPU (h_cond
) = opval
;
525 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
533 CASE (sem
, INSN_ADDV3
) : /* addv3 $dr,$sr,$simm16 */
535 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
536 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
537 #define FLD(f) abuf->fields.sfmt_add3.f
538 int UNUSED written
= 0;
539 IADDR UNUSED pc
= abuf
->addr
;
540 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
544 temp0
= ADDSI (* FLD (i_sr
), FLD (f_simm16
));
545 temp1
= ADDOFSI (* FLD (i_sr
), FLD (f_simm16
), 0);
548 * FLD (i_dr
) = opval
;
549 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
553 CPU (h_cond
) = opval
;
554 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
562 CASE (sem
, INSN_ADDX
) : /* addx $dr,$sr */
564 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
565 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
566 #define FLD(f) abuf->fields.sfmt_add.f
567 int UNUSED written
= 0;
568 IADDR UNUSED pc
= abuf
->addr
;
569 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
573 temp0
= ADDCSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
574 temp1
= ADDCFSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
577 * FLD (i_dr
) = opval
;
578 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
582 CPU (h_cond
) = opval
;
583 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
591 CASE (sem
, INSN_BC8
) : /* bc.s $disp8 */
593 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
594 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
595 #define FLD(f) abuf->fields.sfmt_bl8.f
596 int UNUSED written
= 0;
597 IADDR UNUSED pc
= abuf
->addr
;
599 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
603 USI opval
= FLD (i_disp8
);
604 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
606 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
610 abuf
->written
= written
;
611 SEM_BRANCH_FINI (vpc
);
616 CASE (sem
, INSN_BC24
) : /* bc.l $disp24 */
618 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
619 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
620 #define FLD(f) abuf->fields.sfmt_bl24.f
621 int UNUSED written
= 0;
622 IADDR UNUSED pc
= abuf
->addr
;
624 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
628 USI opval
= FLD (i_disp24
);
629 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
631 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
635 abuf
->written
= written
;
636 SEM_BRANCH_FINI (vpc
);
641 CASE (sem
, INSN_BEQ
) : /* beq $src1,$src2,$disp16 */
643 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
644 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
645 #define FLD(f) abuf->fields.sfmt_beq.f
646 int UNUSED written
= 0;
647 IADDR UNUSED pc
= abuf
->addr
;
649 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
651 if (EQSI (* FLD (i_src1
), * FLD (i_src2
))) {
653 USI opval
= FLD (i_disp16
);
654 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
656 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
660 abuf
->written
= written
;
661 SEM_BRANCH_FINI (vpc
);
666 CASE (sem
, INSN_BEQZ
) : /* beqz $src2,$disp16 */
668 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
669 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
670 #define FLD(f) abuf->fields.sfmt_beq.f
671 int UNUSED written
= 0;
672 IADDR UNUSED pc
= abuf
->addr
;
674 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
676 if (EQSI (* FLD (i_src2
), 0)) {
678 USI opval
= FLD (i_disp16
);
679 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
681 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
685 abuf
->written
= written
;
686 SEM_BRANCH_FINI (vpc
);
691 CASE (sem
, INSN_BGEZ
) : /* bgez $src2,$disp16 */
693 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
694 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
695 #define FLD(f) abuf->fields.sfmt_beq.f
696 int UNUSED written
= 0;
697 IADDR UNUSED pc
= abuf
->addr
;
699 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
701 if (GESI (* FLD (i_src2
), 0)) {
703 USI opval
= FLD (i_disp16
);
704 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
706 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
710 abuf
->written
= written
;
711 SEM_BRANCH_FINI (vpc
);
716 CASE (sem
, INSN_BGTZ
) : /* bgtz $src2,$disp16 */
718 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
719 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
720 #define FLD(f) abuf->fields.sfmt_beq.f
721 int UNUSED written
= 0;
722 IADDR UNUSED pc
= abuf
->addr
;
724 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
726 if (GTSI (* FLD (i_src2
), 0)) {
728 USI opval
= FLD (i_disp16
);
729 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
731 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
735 abuf
->written
= written
;
736 SEM_BRANCH_FINI (vpc
);
741 CASE (sem
, INSN_BLEZ
) : /* blez $src2,$disp16 */
743 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
744 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
745 #define FLD(f) abuf->fields.sfmt_beq.f
746 int UNUSED written
= 0;
747 IADDR UNUSED pc
= abuf
->addr
;
749 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
751 if (LESI (* FLD (i_src2
), 0)) {
753 USI opval
= FLD (i_disp16
);
754 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
756 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
760 abuf
->written
= written
;
761 SEM_BRANCH_FINI (vpc
);
766 CASE (sem
, INSN_BLTZ
) : /* bltz $src2,$disp16 */
768 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
769 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
770 #define FLD(f) abuf->fields.sfmt_beq.f
771 int UNUSED written
= 0;
772 IADDR UNUSED pc
= abuf
->addr
;
774 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
776 if (LTSI (* FLD (i_src2
), 0)) {
778 USI opval
= FLD (i_disp16
);
779 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
781 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
785 abuf
->written
= written
;
786 SEM_BRANCH_FINI (vpc
);
791 CASE (sem
, INSN_BNEZ
) : /* bnez $src2,$disp16 */
793 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
794 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
795 #define FLD(f) abuf->fields.sfmt_beq.f
796 int UNUSED written
= 0;
797 IADDR UNUSED pc
= abuf
->addr
;
799 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
801 if (NESI (* FLD (i_src2
), 0)) {
803 USI opval
= FLD (i_disp16
);
804 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
806 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
810 abuf
->written
= written
;
811 SEM_BRANCH_FINI (vpc
);
816 CASE (sem
, INSN_BL8
) : /* bl.s $disp8 */
818 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
819 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
820 #define FLD(f) abuf->fields.sfmt_bl8.f
821 int UNUSED written
= 0;
822 IADDR UNUSED pc
= abuf
->addr
;
824 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
828 SI opval
= ADDSI (ANDSI (pc
, -4), 4);
829 CPU (h_gr
[((UINT
) 14)]) = opval
;
830 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
833 USI opval
= FLD (i_disp8
);
834 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
835 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
839 SEM_BRANCH_FINI (vpc
);
844 CASE (sem
, INSN_BL24
) : /* bl.l $disp24 */
846 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
847 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
848 #define FLD(f) abuf->fields.sfmt_bl24.f
849 int UNUSED written
= 0;
850 IADDR UNUSED pc
= abuf
->addr
;
852 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
856 SI opval
= ADDSI (pc
, 4);
857 CPU (h_gr
[((UINT
) 14)]) = opval
;
858 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
861 USI opval
= FLD (i_disp24
);
862 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
863 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
867 SEM_BRANCH_FINI (vpc
);
872 CASE (sem
, INSN_BNC8
) : /* bnc.s $disp8 */
874 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
875 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
876 #define FLD(f) abuf->fields.sfmt_bl8.f
877 int UNUSED written
= 0;
878 IADDR UNUSED pc
= abuf
->addr
;
880 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
882 if (NOTBI (CPU (h_cond
))) {
884 USI opval
= FLD (i_disp8
);
885 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
887 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
891 abuf
->written
= written
;
892 SEM_BRANCH_FINI (vpc
);
897 CASE (sem
, INSN_BNC24
) : /* bnc.l $disp24 */
899 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
900 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
901 #define FLD(f) abuf->fields.sfmt_bl24.f
902 int UNUSED written
= 0;
903 IADDR UNUSED pc
= abuf
->addr
;
905 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
907 if (NOTBI (CPU (h_cond
))) {
909 USI opval
= FLD (i_disp24
);
910 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
912 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
916 abuf
->written
= written
;
917 SEM_BRANCH_FINI (vpc
);
922 CASE (sem
, INSN_BNE
) : /* bne $src1,$src2,$disp16 */
924 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
925 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
926 #define FLD(f) abuf->fields.sfmt_beq.f
927 int UNUSED written
= 0;
928 IADDR UNUSED pc
= abuf
->addr
;
930 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
932 if (NESI (* FLD (i_src1
), * FLD (i_src2
))) {
934 USI opval
= FLD (i_disp16
);
935 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
937 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
941 abuf
->written
= written
;
942 SEM_BRANCH_FINI (vpc
);
947 CASE (sem
, INSN_BRA8
) : /* bra.s $disp8 */
949 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
950 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
951 #define FLD(f) abuf->fields.sfmt_bl8.f
952 int UNUSED written
= 0;
953 IADDR UNUSED pc
= abuf
->addr
;
955 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
958 USI opval
= FLD (i_disp8
);
959 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
960 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
963 SEM_BRANCH_FINI (vpc
);
968 CASE (sem
, INSN_BRA24
) : /* bra.l $disp24 */
970 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
971 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
972 #define FLD(f) abuf->fields.sfmt_bl24.f
973 int UNUSED written
= 0;
974 IADDR UNUSED pc
= abuf
->addr
;
976 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
979 USI opval
= FLD (i_disp24
);
980 SEM_BRANCH_VIA_CACHE (current_cpu
, sem_arg
, opval
, vpc
);
981 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
984 SEM_BRANCH_FINI (vpc
);
989 CASE (sem
, INSN_CMP
) : /* cmp $src1,$src2 */
991 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
992 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
993 #define FLD(f) abuf->fields.sfmt_st_plus.f
994 int UNUSED written
= 0;
995 IADDR UNUSED pc
= abuf
->addr
;
996 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
999 BI opval
= LTSI (* FLD (i_src1
), * FLD (i_src2
));
1000 CPU (h_cond
) = opval
;
1001 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1008 CASE (sem
, INSN_CMPI
) : /* cmpi $src2,$simm16 */
1010 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1011 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1012 #define FLD(f) abuf->fields.sfmt_st_d.f
1013 int UNUSED written
= 0;
1014 IADDR UNUSED pc
= abuf
->addr
;
1015 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1018 BI opval
= LTSI (* FLD (i_src2
), FLD (f_simm16
));
1019 CPU (h_cond
) = opval
;
1020 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1027 CASE (sem
, INSN_CMPU
) : /* cmpu $src1,$src2 */
1029 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1030 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1031 #define FLD(f) abuf->fields.sfmt_st_plus.f
1032 int UNUSED written
= 0;
1033 IADDR UNUSED pc
= abuf
->addr
;
1034 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1037 BI opval
= LTUSI (* FLD (i_src1
), * FLD (i_src2
));
1038 CPU (h_cond
) = opval
;
1039 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1046 CASE (sem
, INSN_CMPUI
) : /* cmpui $src2,$simm16 */
1048 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1049 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1050 #define FLD(f) abuf->fields.sfmt_st_d.f
1051 int UNUSED written
= 0;
1052 IADDR UNUSED pc
= abuf
->addr
;
1053 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1056 BI opval
= LTUSI (* FLD (i_src2
), FLD (f_simm16
));
1057 CPU (h_cond
) = opval
;
1058 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
1065 CASE (sem
, INSN_DIV
) : /* div $dr,$sr */
1067 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1068 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1069 #define FLD(f) abuf->fields.sfmt_add.f
1070 int UNUSED written
= 0;
1071 IADDR UNUSED pc
= abuf
->addr
;
1072 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1074 if (NESI (* FLD (i_sr
), 0)) {
1076 SI opval
= DIVSI (* FLD (i_dr
), * FLD (i_sr
));
1077 * FLD (i_dr
) = opval
;
1078 written
|= (1 << 2);
1079 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1083 abuf
->written
= written
;
1088 CASE (sem
, INSN_DIVU
) : /* divu $dr,$sr */
1090 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1091 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1092 #define FLD(f) abuf->fields.sfmt_add.f
1093 int UNUSED written
= 0;
1094 IADDR UNUSED pc
= abuf
->addr
;
1095 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1097 if (NESI (* FLD (i_sr
), 0)) {
1099 SI opval
= UDIVSI (* FLD (i_dr
), * FLD (i_sr
));
1100 * FLD (i_dr
) = opval
;
1101 written
|= (1 << 2);
1102 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1106 abuf
->written
= written
;
1111 CASE (sem
, INSN_REM
) : /* rem $dr,$sr */
1113 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1114 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1115 #define FLD(f) abuf->fields.sfmt_add.f
1116 int UNUSED written
= 0;
1117 IADDR UNUSED pc
= abuf
->addr
;
1118 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1120 if (NESI (* FLD (i_sr
), 0)) {
1122 SI opval
= MODSI (* FLD (i_dr
), * FLD (i_sr
));
1123 * FLD (i_dr
) = opval
;
1124 written
|= (1 << 2);
1125 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1129 abuf
->written
= written
;
1134 CASE (sem
, INSN_REMU
) : /* remu $dr,$sr */
1136 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1137 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1138 #define FLD(f) abuf->fields.sfmt_add.f
1139 int UNUSED written
= 0;
1140 IADDR UNUSED pc
= abuf
->addr
;
1141 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1143 if (NESI (* FLD (i_sr
), 0)) {
1145 SI opval
= UMODSI (* FLD (i_dr
), * FLD (i_sr
));
1146 * FLD (i_dr
) = opval
;
1147 written
|= (1 << 2);
1148 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1152 abuf
->written
= written
;
1157 CASE (sem
, INSN_JL
) : /* jl $sr */
1159 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1160 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1161 #define FLD(f) abuf->fields.sfmt_jl.f
1162 int UNUSED written
= 0;
1163 IADDR UNUSED pc
= abuf
->addr
;
1165 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1169 temp0
= ADDSI (ANDSI (pc
, -4), 4);
1170 temp1
= ANDSI (* FLD (i_sr
), -4);
1173 CPU (h_gr
[((UINT
) 14)]) = opval
;
1174 TRACE_RESULT (current_cpu
, abuf
, "gr-14", 'x', opval
);
1178 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1179 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1183 SEM_BRANCH_FINI (vpc
);
1188 CASE (sem
, INSN_JMP
) : /* jmp $sr */
1190 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1191 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1192 #define FLD(f) abuf->fields.sfmt_mvtc.f
1193 int UNUSED written
= 0;
1194 IADDR UNUSED pc
= abuf
->addr
;
1196 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1199 USI opval
= ANDSI (* FLD (i_sr
), -4);
1200 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1201 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1204 SEM_BRANCH_FINI (vpc
);
1209 CASE (sem
, INSN_LD
) : /* ld $dr,@$sr */
1211 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1212 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1213 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1214 int UNUSED written
= 0;
1215 IADDR UNUSED pc
= abuf
->addr
;
1216 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1219 SI opval
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1220 * FLD (i_dr
) = opval
;
1221 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1228 CASE (sem
, INSN_LD_D
) : /* ld $dr,@($slo16,$sr) */
1230 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1231 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1232 #define FLD(f) abuf->fields.sfmt_add3.f
1233 int UNUSED written
= 0;
1234 IADDR UNUSED pc
= abuf
->addr
;
1235 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1238 SI opval
= GETMEMSI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
)));
1239 * FLD (i_dr
) = opval
;
1240 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1247 CASE (sem
, INSN_LDB
) : /* ldb $dr,@$sr */
1249 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1250 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1251 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1252 int UNUSED written
= 0;
1253 IADDR UNUSED pc
= abuf
->addr
;
1254 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1257 SI opval
= EXTQISI (GETMEMQI (current_cpu
, pc
, * FLD (i_sr
)));
1258 * FLD (i_dr
) = opval
;
1259 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1266 CASE (sem
, INSN_LDB_D
) : /* ldb $dr,@($slo16,$sr) */
1268 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1269 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1270 #define FLD(f) abuf->fields.sfmt_add3.f
1271 int UNUSED written
= 0;
1272 IADDR UNUSED pc
= abuf
->addr
;
1273 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1276 SI opval
= EXTQISI (GETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1277 * FLD (i_dr
) = opval
;
1278 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1285 CASE (sem
, INSN_LDH
) : /* ldh $dr,@$sr */
1287 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1288 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1289 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1290 int UNUSED written
= 0;
1291 IADDR UNUSED pc
= abuf
->addr
;
1292 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1295 SI opval
= EXTHISI (GETMEMHI (current_cpu
, pc
, * FLD (i_sr
)));
1296 * FLD (i_dr
) = opval
;
1297 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1304 CASE (sem
, INSN_LDH_D
) : /* ldh $dr,@($slo16,$sr) */
1306 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1307 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1308 #define FLD(f) abuf->fields.sfmt_add3.f
1309 int UNUSED written
= 0;
1310 IADDR UNUSED pc
= abuf
->addr
;
1311 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1314 SI opval
= EXTHISI (GETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1315 * FLD (i_dr
) = opval
;
1316 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1323 CASE (sem
, INSN_LDUB
) : /* ldub $dr,@$sr */
1325 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1326 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1327 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1328 int UNUSED written
= 0;
1329 IADDR UNUSED pc
= abuf
->addr
;
1330 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1333 SI opval
= ZEXTQISI (GETMEMQI (current_cpu
, pc
, * FLD (i_sr
)));
1334 * FLD (i_dr
) = opval
;
1335 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1342 CASE (sem
, INSN_LDUB_D
) : /* ldub $dr,@($slo16,$sr) */
1344 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1345 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1346 #define FLD(f) abuf->fields.sfmt_add3.f
1347 int UNUSED written
= 0;
1348 IADDR UNUSED pc
= abuf
->addr
;
1349 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1352 SI opval
= ZEXTQISI (GETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1353 * FLD (i_dr
) = opval
;
1354 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1361 CASE (sem
, INSN_LDUH
) : /* lduh $dr,@$sr */
1363 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1364 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1365 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1366 int UNUSED written
= 0;
1367 IADDR UNUSED pc
= abuf
->addr
;
1368 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1371 SI opval
= ZEXTHISI (GETMEMHI (current_cpu
, pc
, * FLD (i_sr
)));
1372 * FLD (i_dr
) = opval
;
1373 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1380 CASE (sem
, INSN_LDUH_D
) : /* lduh $dr,@($slo16,$sr) */
1382 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1383 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1384 #define FLD(f) abuf->fields.sfmt_add3.f
1385 int UNUSED written
= 0;
1386 IADDR UNUSED pc
= abuf
->addr
;
1387 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1390 SI opval
= ZEXTHISI (GETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_sr
), FLD (f_simm16
))));
1391 * FLD (i_dr
) = opval
;
1392 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1399 CASE (sem
, INSN_LD_PLUS
) : /* ld $dr,@$sr+ */
1401 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1402 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1403 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1404 int UNUSED written
= 0;
1405 IADDR UNUSED pc
= abuf
->addr
;
1406 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1410 temp0
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1411 temp1
= ADDSI (* FLD (i_sr
), 4);
1414 * FLD (i_dr
) = opval
;
1415 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1419 * FLD (i_sr
) = opval
;
1420 TRACE_RESULT (current_cpu
, abuf
, "sr", 'x', opval
);
1428 CASE (sem
, INSN_LD24
) : /* ld24 $dr,$uimm24 */
1430 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1431 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1432 #define FLD(f) abuf->fields.sfmt_ld24.f
1433 int UNUSED written
= 0;
1434 IADDR UNUSED pc
= abuf
->addr
;
1435 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1438 SI opval
= FLD (i_uimm24
);
1439 * FLD (i_dr
) = opval
;
1440 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1447 CASE (sem
, INSN_LDI8
) : /* ldi8 $dr,$simm8 */
1449 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1450 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1451 #define FLD(f) abuf->fields.sfmt_addi.f
1452 int UNUSED written
= 0;
1453 IADDR UNUSED pc
= abuf
->addr
;
1454 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1457 SI opval
= FLD (f_simm8
);
1458 * FLD (i_dr
) = opval
;
1459 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1466 CASE (sem
, INSN_LDI16
) : /* ldi16 $dr,$hash$slo16 */
1468 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1469 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1470 #define FLD(f) abuf->fields.sfmt_add3.f
1471 int UNUSED written
= 0;
1472 IADDR UNUSED pc
= abuf
->addr
;
1473 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1476 SI opval
= FLD (f_simm16
);
1477 * FLD (i_dr
) = opval
;
1478 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1485 CASE (sem
, INSN_LOCK
) : /* lock $dr,@$sr */
1487 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1488 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1489 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1490 int UNUSED written
= 0;
1491 IADDR UNUSED pc
= abuf
->addr
;
1492 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1497 CPU (h_lock
) = opval
;
1498 TRACE_RESULT (current_cpu
, abuf
, "lock", 'x', opval
);
1501 SI opval
= GETMEMSI (current_cpu
, pc
, * FLD (i_sr
));
1502 * FLD (i_dr
) = opval
;
1503 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1511 CASE (sem
, INSN_MACHI
) : /* machi $src1,$src2 */
1513 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1514 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1515 #define FLD(f) abuf->fields.sfmt_st_plus.f
1516 int UNUSED written
= 0;
1517 IADDR UNUSED pc
= abuf
->addr
;
1518 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1521 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (ANDSI (* FLD (i_src1
), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16))))), 8), 8);
1522 SET_H_ACCUM (opval
);
1523 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1530 CASE (sem
, INSN_MACLO
) : /* maclo $src1,$src2 */
1532 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1533 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1534 #define FLD(f) abuf->fields.sfmt_st_plus.f
1535 int UNUSED written
= 0;
1536 IADDR UNUSED pc
= abuf
->addr
;
1537 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1540 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (SLLSI (* FLD (i_src1
), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
))))), 8), 8);
1541 SET_H_ACCUM (opval
);
1542 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1549 CASE (sem
, INSN_MACWHI
) : /* macwhi $src1,$src2 */
1551 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1552 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1553 #define FLD(f) abuf->fields.sfmt_st_plus.f
1554 int UNUSED written
= 0;
1555 IADDR UNUSED pc
= abuf
->addr
;
1556 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1559 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16))))), 8), 8);
1560 SET_H_ACCUM (opval
);
1561 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1568 CASE (sem
, INSN_MACWLO
) : /* macwlo $src1,$src2 */
1570 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1571 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1572 #define FLD(f) abuf->fields.sfmt_st_plus.f
1573 int UNUSED written
= 0;
1574 IADDR UNUSED pc
= abuf
->addr
;
1575 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1578 DI opval
= SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
))))), 8), 8);
1579 SET_H_ACCUM (opval
);
1580 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1587 CASE (sem
, INSN_MUL
) : /* mul $dr,$sr */
1589 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1590 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1591 #define FLD(f) abuf->fields.sfmt_add.f
1592 int UNUSED written
= 0;
1593 IADDR UNUSED pc
= abuf
->addr
;
1594 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1597 SI opval
= MULSI (* FLD (i_dr
), * FLD (i_sr
));
1598 * FLD (i_dr
) = opval
;
1599 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1606 CASE (sem
, INSN_MULHI
) : /* mulhi $src1,$src2 */
1608 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1609 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1610 #define FLD(f) abuf->fields.sfmt_st_plus.f
1611 int UNUSED written
= 0;
1612 IADDR UNUSED pc
= abuf
->addr
;
1613 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1616 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1
), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16)))), 16), 16);
1617 SET_H_ACCUM (opval
);
1618 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1625 CASE (sem
, INSN_MULLO
) : /* mullo $src1,$src2 */
1627 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1628 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1629 #define FLD(f) abuf->fields.sfmt_st_plus.f
1630 int UNUSED written
= 0;
1631 IADDR UNUSED pc
= abuf
->addr
;
1632 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1635 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1
), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
)))), 16), 16);
1636 SET_H_ACCUM (opval
);
1637 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1644 CASE (sem
, INSN_MULWHI
) : /* mulwhi $src1,$src2 */
1646 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1647 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1648 #define FLD(f) abuf->fields.sfmt_st_plus.f
1649 int UNUSED written
= 0;
1650 IADDR UNUSED pc
= abuf
->addr
;
1651 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1654 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2
), 16)))), 8), 8);
1655 SET_H_ACCUM (opval
);
1656 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1663 CASE (sem
, INSN_MULWLO
) : /* mulwlo $src1,$src2 */
1665 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1666 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1667 #define FLD(f) abuf->fields.sfmt_st_plus.f
1668 int UNUSED written
= 0;
1669 IADDR UNUSED pc
= abuf
->addr
;
1670 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1673 DI opval
= SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1
)), EXTHIDI (TRUNCSIHI (* FLD (i_src2
)))), 8), 8);
1674 SET_H_ACCUM (opval
);
1675 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1682 CASE (sem
, INSN_MV
) : /* mv $dr,$sr */
1684 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1685 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1686 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1687 int UNUSED written
= 0;
1688 IADDR UNUSED pc
= abuf
->addr
;
1689 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1692 SI opval
= * FLD (i_sr
);
1693 * FLD (i_dr
) = opval
;
1694 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1701 CASE (sem
, INSN_MVFACHI
) : /* mvfachi $dr */
1703 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1704 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1705 #define FLD(f) abuf->fields.sfmt_seth.f
1706 int UNUSED written
= 0;
1707 IADDR UNUSED pc
= abuf
->addr
;
1708 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1711 SI opval
= TRUNCDISI (SRADI (GET_H_ACCUM (), 32));
1712 * FLD (i_dr
) = opval
;
1713 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1720 CASE (sem
, INSN_MVFACLO
) : /* mvfaclo $dr */
1722 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1723 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1724 #define FLD(f) abuf->fields.sfmt_seth.f
1725 int UNUSED written
= 0;
1726 IADDR UNUSED pc
= abuf
->addr
;
1727 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1730 SI opval
= TRUNCDISI (GET_H_ACCUM ());
1731 * FLD (i_dr
) = opval
;
1732 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1739 CASE (sem
, INSN_MVFACMI
) : /* mvfacmi $dr */
1741 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1742 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1743 #define FLD(f) abuf->fields.sfmt_seth.f
1744 int UNUSED written
= 0;
1745 IADDR UNUSED pc
= abuf
->addr
;
1746 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1749 SI opval
= TRUNCDISI (SRADI (GET_H_ACCUM (), 16));
1750 * FLD (i_dr
) = opval
;
1751 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1758 CASE (sem
, INSN_MVFC
) : /* mvfc $dr,$scr */
1760 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1761 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1762 #define FLD(f) abuf->fields.sfmt_mvfc.f
1763 int UNUSED written
= 0;
1764 IADDR UNUSED pc
= abuf
->addr
;
1765 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1768 SI opval
= GET_H_CR (FLD (f_r2
));
1769 * FLD (i_dr
) = opval
;
1770 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1777 CASE (sem
, INSN_MVTACHI
) : /* mvtachi $src1 */
1779 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1780 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1781 #define FLD(f) abuf->fields.sfmt_st_plus.f
1782 int UNUSED written
= 0;
1783 IADDR UNUSED pc
= abuf
->addr
;
1784 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1787 DI opval
= ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1
)), 32));
1788 SET_H_ACCUM (opval
);
1789 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1796 CASE (sem
, INSN_MVTACLO
) : /* mvtaclo $src1 */
1798 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1799 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1800 #define FLD(f) abuf->fields.sfmt_st_plus.f
1801 int UNUSED written
= 0;
1802 IADDR UNUSED pc
= abuf
->addr
;
1803 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1806 DI opval
= ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1
)));
1807 SET_H_ACCUM (opval
);
1808 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1815 CASE (sem
, INSN_MVTC
) : /* mvtc $sr,$dcr */
1817 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1818 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1819 #define FLD(f) abuf->fields.sfmt_mvtc.f
1820 int UNUSED written
= 0;
1821 IADDR UNUSED pc
= abuf
->addr
;
1822 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1825 USI opval
= * FLD (i_sr
);
1826 SET_H_CR (FLD (f_r1
), opval
);
1827 TRACE_RESULT (current_cpu
, abuf
, "dcr", 'x', opval
);
1834 CASE (sem
, INSN_NEG
) : /* neg $dr,$sr */
1836 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1837 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1838 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1839 int UNUSED written
= 0;
1840 IADDR UNUSED pc
= abuf
->addr
;
1841 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1844 SI opval
= NEGSI (* FLD (i_sr
));
1845 * FLD (i_dr
) = opval
;
1846 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1853 CASE (sem
, INSN_NOP
) : /* nop */
1855 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1856 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1857 #define FLD(f) abuf->fields.fmt_empty.f
1858 int UNUSED written
= 0;
1859 IADDR UNUSED pc
= abuf
->addr
;
1860 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1862 PROFILE_COUNT_FILLNOPS (current_cpu
, abuf
->addr
);
1868 CASE (sem
, INSN_NOT
) : /* not $dr,$sr */
1870 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1871 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1872 #define FLD(f) abuf->fields.sfmt_ld_plus.f
1873 int UNUSED written
= 0;
1874 IADDR UNUSED pc
= abuf
->addr
;
1875 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1878 SI opval
= INVSI (* FLD (i_sr
));
1879 * FLD (i_dr
) = opval
;
1880 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
1887 CASE (sem
, INSN_RAC
) : /* rac */
1889 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1890 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1891 #define FLD(f) abuf->fields.fmt_empty.f
1892 int UNUSED written
= 0;
1893 IADDR UNUSED pc
= abuf
->addr
;
1894 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1898 tmp_tmp1
= SLLDI (GET_H_ACCUM (), 1);
1899 tmp_tmp1
= ADDDI (tmp_tmp1
, MAKEDI (0, 32768));
1901 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)));
1902 SET_H_ACCUM (opval
);
1903 TRACE_RESULT (current_cpu
, abuf
, "accum", 'D', opval
);
1911 CASE (sem
, INSN_RACH
) : /* rach */
1913 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1914 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1915 #define FLD(f) abuf->fields.fmt_empty.f
1916 int UNUSED written
= 0;
1917 IADDR UNUSED pc
= abuf
->addr
;
1918 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
);
1944 CASE (sem
, INSN_RTE
) : /* rte */
1946 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1947 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1948 #define FLD(f) abuf->fields.fmt_empty.f
1949 int UNUSED written
= 0;
1950 IADDR UNUSED pc
= abuf
->addr
;
1952 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
1956 USI opval
= ANDSI (GET_H_CR (((UINT
) 6)), -4);
1957 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
1958 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
1961 USI opval
= GET_H_CR (((UINT
) 14));
1962 SET_H_CR (((UINT
) 6), opval
);
1963 TRACE_RESULT (current_cpu
, abuf
, "cr-6", 'x', opval
);
1966 UQI opval
= CPU (h_bpsw
);
1968 TRACE_RESULT (current_cpu
, abuf
, "psw", 'x', opval
);
1971 UQI opval
= CPU (h_bbpsw
);
1972 CPU (h_bpsw
) = opval
;
1973 TRACE_RESULT (current_cpu
, abuf
, "bpsw", 'x', opval
);
1977 SEM_BRANCH_FINI (vpc
);
1982 CASE (sem
, INSN_SETH
) : /* seth $dr,$hash$hi16 */
1984 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
1985 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
1986 #define FLD(f) abuf->fields.sfmt_seth.f
1987 int UNUSED written
= 0;
1988 IADDR UNUSED pc
= abuf
->addr
;
1989 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
1992 SI opval
= SLLSI (FLD (f_hi16
), 16);
1993 * FLD (i_dr
) = opval
;
1994 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2001 CASE (sem
, INSN_SLL
) : /* sll $dr,$sr */
2003 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2004 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2005 #define FLD(f) abuf->fields.sfmt_add.f
2006 int UNUSED written
= 0;
2007 IADDR UNUSED pc
= abuf
->addr
;
2008 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2011 SI opval
= SLLSI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2012 * FLD (i_dr
) = opval
;
2013 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2020 CASE (sem
, INSN_SLL3
) : /* sll3 $dr,$sr,$simm16 */
2022 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2023 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2024 #define FLD(f) abuf->fields.sfmt_add3.f
2025 int UNUSED written
= 0;
2026 IADDR UNUSED pc
= abuf
->addr
;
2027 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2030 SI opval
= SLLSI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2031 * FLD (i_dr
) = opval
;
2032 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2039 CASE (sem
, INSN_SLLI
) : /* slli $dr,$uimm5 */
2041 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2042 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2043 #define FLD(f) abuf->fields.sfmt_slli.f
2044 int UNUSED written
= 0;
2045 IADDR UNUSED pc
= abuf
->addr
;
2046 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2049 SI opval
= SLLSI (* FLD (i_dr
), FLD (f_uimm5
));
2050 * FLD (i_dr
) = opval
;
2051 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2058 CASE (sem
, INSN_SRA
) : /* sra $dr,$sr */
2060 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2061 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2062 #define FLD(f) abuf->fields.sfmt_add.f
2063 int UNUSED written
= 0;
2064 IADDR UNUSED pc
= abuf
->addr
;
2065 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2068 SI opval
= SRASI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2069 * FLD (i_dr
) = opval
;
2070 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2077 CASE (sem
, INSN_SRA3
) : /* sra3 $dr,$sr,$simm16 */
2079 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2080 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2081 #define FLD(f) abuf->fields.sfmt_add3.f
2082 int UNUSED written
= 0;
2083 IADDR UNUSED pc
= abuf
->addr
;
2084 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2087 SI opval
= SRASI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2088 * FLD (i_dr
) = opval
;
2089 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2096 CASE (sem
, INSN_SRAI
) : /* srai $dr,$uimm5 */
2098 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2099 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2100 #define FLD(f) abuf->fields.sfmt_slli.f
2101 int UNUSED written
= 0;
2102 IADDR UNUSED pc
= abuf
->addr
;
2103 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2106 SI opval
= SRASI (* FLD (i_dr
), FLD (f_uimm5
));
2107 * FLD (i_dr
) = opval
;
2108 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2115 CASE (sem
, INSN_SRL
) : /* srl $dr,$sr */
2117 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2118 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2119 #define FLD(f) abuf->fields.sfmt_add.f
2120 int UNUSED written
= 0;
2121 IADDR UNUSED pc
= abuf
->addr
;
2122 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2125 SI opval
= SRLSI (* FLD (i_dr
), ANDSI (* FLD (i_sr
), 31));
2126 * FLD (i_dr
) = opval
;
2127 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2134 CASE (sem
, INSN_SRL3
) : /* srl3 $dr,$sr,$simm16 */
2136 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2137 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2138 #define FLD(f) abuf->fields.sfmt_add3.f
2139 int UNUSED written
= 0;
2140 IADDR UNUSED pc
= abuf
->addr
;
2141 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2144 SI opval
= SRLSI (* FLD (i_sr
), ANDSI (FLD (f_simm16
), 31));
2145 * FLD (i_dr
) = opval
;
2146 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2153 CASE (sem
, INSN_SRLI
) : /* srli $dr,$uimm5 */
2155 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2156 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2157 #define FLD(f) abuf->fields.sfmt_slli.f
2158 int UNUSED written
= 0;
2159 IADDR UNUSED pc
= abuf
->addr
;
2160 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2163 SI opval
= SRLSI (* FLD (i_dr
), FLD (f_uimm5
));
2164 * FLD (i_dr
) = opval
;
2165 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2172 CASE (sem
, INSN_ST
) : /* st $src1,@$src2 */
2174 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2175 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2176 #define FLD(f) abuf->fields.sfmt_st_plus.f
2177 int UNUSED written
= 0;
2178 IADDR UNUSED pc
= abuf
->addr
;
2179 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2182 SI opval
= * FLD (i_src1
);
2183 SETMEMSI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2184 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2191 CASE (sem
, INSN_ST_D
) : /* st $src1,@($slo16,$src2) */
2193 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2194 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2195 #define FLD(f) abuf->fields.sfmt_st_d.f
2196 int UNUSED written
= 0;
2197 IADDR UNUSED pc
= abuf
->addr
;
2198 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2201 SI opval
= * FLD (i_src1
);
2202 SETMEMSI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2203 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2210 CASE (sem
, INSN_STB
) : /* stb $src1,@$src2 */
2212 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2213 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2214 #define FLD(f) abuf->fields.sfmt_st_plus.f
2215 int UNUSED written
= 0;
2216 IADDR UNUSED pc
= abuf
->addr
;
2217 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2220 QI opval
= * FLD (i_src1
);
2221 SETMEMQI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2222 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2229 CASE (sem
, INSN_STB_D
) : /* stb $src1,@($slo16,$src2) */
2231 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2232 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2233 #define FLD(f) abuf->fields.sfmt_st_d.f
2234 int UNUSED written
= 0;
2235 IADDR UNUSED pc
= abuf
->addr
;
2236 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2239 QI opval
= * FLD (i_src1
);
2240 SETMEMQI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2241 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2248 CASE (sem
, INSN_STH
) : /* sth $src1,@$src2 */
2250 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2251 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2252 #define FLD(f) abuf->fields.sfmt_st_plus.f
2253 int UNUSED written
= 0;
2254 IADDR UNUSED pc
= abuf
->addr
;
2255 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2258 HI opval
= * FLD (i_src1
);
2259 SETMEMHI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2260 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2267 CASE (sem
, INSN_STH_D
) : /* sth $src1,@($slo16,$src2) */
2269 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2270 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2271 #define FLD(f) abuf->fields.sfmt_st_d.f
2272 int UNUSED written
= 0;
2273 IADDR UNUSED pc
= abuf
->addr
;
2274 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 4);
2277 HI opval
= * FLD (i_src1
);
2278 SETMEMHI (current_cpu
, pc
, ADDSI (* FLD (i_src2
), FLD (f_simm16
)), opval
);
2279 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2286 CASE (sem
, INSN_ST_PLUS
) : /* st $src1,@+$src2 */
2288 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2289 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2290 #define FLD(f) abuf->fields.sfmt_st_plus.f
2291 int UNUSED written
= 0;
2292 IADDR UNUSED pc
= abuf
->addr
;
2293 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2297 tmp_new_src2
= ADDSI (* FLD (i_src2
), 4);
2299 SI opval
= * FLD (i_src1
);
2300 SETMEMSI (current_cpu
, pc
, tmp_new_src2
, opval
);
2301 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2304 SI opval
= tmp_new_src2
;
2305 * FLD (i_src2
) = opval
;
2306 TRACE_RESULT (current_cpu
, abuf
, "src2", 'x', opval
);
2314 CASE (sem
, INSN_ST_MINUS
) : /* st $src1,@-$src2 */
2316 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2317 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2318 #define FLD(f) abuf->fields.sfmt_st_plus.f
2319 int UNUSED written
= 0;
2320 IADDR UNUSED pc
= abuf
->addr
;
2321 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2325 tmp_new_src2
= SUBSI (* FLD (i_src2
), 4);
2327 SI opval
= * FLD (i_src1
);
2328 SETMEMSI (current_cpu
, pc
, tmp_new_src2
, opval
);
2329 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2332 SI opval
= tmp_new_src2
;
2333 * FLD (i_src2
) = opval
;
2334 TRACE_RESULT (current_cpu
, abuf
, "src2", 'x', opval
);
2342 CASE (sem
, INSN_SUB
) : /* sub $dr,$sr */
2344 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2345 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2346 #define FLD(f) abuf->fields.sfmt_add.f
2347 int UNUSED written
= 0;
2348 IADDR UNUSED pc
= abuf
->addr
;
2349 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2352 SI opval
= SUBSI (* FLD (i_dr
), * FLD (i_sr
));
2353 * FLD (i_dr
) = opval
;
2354 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2361 CASE (sem
, INSN_SUBV
) : /* subv $dr,$sr */
2363 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2364 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2365 #define FLD(f) abuf->fields.sfmt_add.f
2366 int UNUSED written
= 0;
2367 IADDR UNUSED pc
= abuf
->addr
;
2368 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2372 temp0
= SUBSI (* FLD (i_dr
), * FLD (i_sr
));
2373 temp1
= SUBOFSI (* FLD (i_dr
), * FLD (i_sr
), 0);
2376 * FLD (i_dr
) = opval
;
2377 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2381 CPU (h_cond
) = opval
;
2382 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
2390 CASE (sem
, INSN_SUBX
) : /* subx $dr,$sr */
2392 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2393 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2394 #define FLD(f) abuf->fields.sfmt_add.f
2395 int UNUSED written
= 0;
2396 IADDR UNUSED pc
= abuf
->addr
;
2397 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2401 temp0
= SUBCSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
2402 temp1
= SUBCFSI (* FLD (i_dr
), * FLD (i_sr
), CPU (h_cond
));
2405 * FLD (i_dr
) = opval
;
2406 TRACE_RESULT (current_cpu
, abuf
, "dr", 'x', opval
);
2410 CPU (h_cond
) = opval
;
2411 TRACE_RESULT (current_cpu
, abuf
, "condbit", 'x', opval
);
2419 CASE (sem
, INSN_TRAP
) : /* trap $uimm4 */
2421 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2422 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2423 #define FLD(f) abuf->fields.sfmt_trap.f
2424 int UNUSED written
= 0;
2425 IADDR UNUSED pc
= abuf
->addr
;
2427 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2431 USI opval
= GET_H_CR (((UINT
) 6));
2432 SET_H_CR (((UINT
) 14), opval
);
2433 TRACE_RESULT (current_cpu
, abuf
, "cr-14", 'x', opval
);
2436 USI opval
= ADDSI (pc
, 4);
2437 SET_H_CR (((UINT
) 6), opval
);
2438 TRACE_RESULT (current_cpu
, abuf
, "cr-6", 'x', opval
);
2441 UQI opval
= CPU (h_bpsw
);
2442 CPU (h_bbpsw
) = opval
;
2443 TRACE_RESULT (current_cpu
, abuf
, "bbpsw", 'x', opval
);
2446 UQI opval
= GET_H_PSW ();
2447 CPU (h_bpsw
) = opval
;
2448 TRACE_RESULT (current_cpu
, abuf
, "bpsw", 'x', opval
);
2451 UQI opval
= ANDQI (GET_H_PSW (), 128);
2453 TRACE_RESULT (current_cpu
, abuf
, "psw", 'x', opval
);
2456 SI opval
= m32r_trap (current_cpu
, pc
, FLD (f_uimm4
));
2457 SEM_BRANCH_VIA_ADDR (current_cpu
, sem_arg
, opval
, vpc
);
2458 TRACE_RESULT (current_cpu
, abuf
, "pc", 'x', opval
);
2462 SEM_BRANCH_FINI (vpc
);
2467 CASE (sem
, INSN_UNLOCK
) : /* unlock $src1,@$src2 */
2469 SEM_ARG sem_arg
= SEM_SEM_ARG (vpc
, sc
);
2470 ARGBUF
*abuf
= SEM_ARGBUF (sem_arg
);
2471 #define FLD(f) abuf->fields.sfmt_st_plus.f
2472 int UNUSED written
= 0;
2473 IADDR UNUSED pc
= abuf
->addr
;
2474 vpc
= SEM_NEXT_VPC (sem_arg
, pc
, 2);
2479 SI opval
= * FLD (i_src1
);
2480 SETMEMSI (current_cpu
, pc
, * FLD (i_src2
), opval
);
2481 written
|= (1 << 4);
2482 TRACE_RESULT (current_cpu
, abuf
, "memory", 'x', opval
);
2487 CPU (h_lock
) = opval
;
2488 TRACE_RESULT (current_cpu
, abuf
, "lock", 'x', opval
);
2492 abuf
->written
= written
;
2499 ENDSWITCH (sem
) /* End of semantic switch. */
2501 /* At this point `vpc' contains the next insn to execute. */
2504 #undef DEFINE_SWITCH
2505 #endif /* DEFINE_SWITCH */