Copyright year update in most files of the GDB Project.
[deliverable/binutils-gdb.git] / sim / m32r / sem.c
CommitLineData
c906108c
SS
1/* Simulator instruction semantics for m32rbf.
2
3THIS FILE IS MACHINE GENERATED WITH CGEN.
4
c5a57081 5Copyright 1996-2010, 2012 Free Software Foundation, Inc.
c906108c 6
378af1d6 7This file is part of the GNU simulators.
c906108c 8
e9c60591
DE
9 This file 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 3, or (at your option)
12 any later version.
c906108c 13
e9c60591
DE
14 It is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
c906108c 18
e9c60591
DE
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 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
c906108c
SS
22
23*/
24
25#define WANT_CPU m32rbf
26#define WANT_CPU_M32RBF
27
28#include "sim-main.h"
29#include "cgen-mem.h"
30#include "cgen-ops.h"
31
32#undef GET_ATTR
33#define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
34
96baa820
JM
35/* This is used so that we can compile two copies of the semantic code,
36 one with full feature support and one without that runs fast(er).
37 FAST_P, when desired, is defined on the command line, -DFAST_P=1. */
38#if FAST_P
39#define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_semf_,fn)
40#undef TRACE_RESULT
41#define TRACE_RESULT(cpu, abuf, name, type, val)
42#else
43#define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
44#endif
45
c906108c
SS
46/* x-invalid: --invalid-- */
47
96baa820 48static SEM_PC
c906108c
SS
49SEM_FN_NAME (m32rbf,x_invalid) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
50{
2310652a 51#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
52 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
53 int UNUSED written = 0;
54 IADDR UNUSED pc = abuf->addr;
55 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
56
57 {
2acceee2
JM
58 /* Update the recorded pc in the cpu state struct.
59 Only necessary for WITH_SCACHE case, but to avoid the
60 conditional compilation .... */
c906108c 61 SET_H_PC (pc);
2acceee2
JM
62 /* Virtual insns have zero size. Overwrite vpc with address of next insn
63 using the default-insn-bitsize spec. When executing insns in parallel
64 we may want to queue the fault and continue execution. */
65 vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
66 vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
c906108c
SS
67 }
68
69 return vpc;
70#undef FLD
71}
72
73/* x-after: --after-- */
74
96baa820 75static SEM_PC
c906108c
SS
76SEM_FN_NAME (m32rbf,x_after) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
77{
2310652a 78#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
79 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
80 int UNUSED written = 0;
81 IADDR UNUSED pc = abuf->addr;
82 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
83
84 {
85#if WITH_SCACHE_PBB_M32RBF
86 m32rbf_pbb_after (current_cpu, sem_arg);
87#endif
88 }
89
90 return vpc;
91#undef FLD
92}
93
94/* x-before: --before-- */
95
96baa820 96static SEM_PC
c906108c
SS
97SEM_FN_NAME (m32rbf,x_before) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
98{
2310652a 99#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
100 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
101 int UNUSED written = 0;
102 IADDR UNUSED pc = abuf->addr;
103 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
104
105 {
106#if WITH_SCACHE_PBB_M32RBF
107 m32rbf_pbb_before (current_cpu, sem_arg);
108#endif
109 }
110
111 return vpc;
112#undef FLD
113}
114
115/* x-cti-chain: --cti-chain-- */
116
96baa820 117static SEM_PC
c906108c
SS
118SEM_FN_NAME (m32rbf,x_cti_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
119{
2310652a 120#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
121 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
122 int UNUSED written = 0;
123 IADDR UNUSED pc = abuf->addr;
124 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
125
126 {
127#if WITH_SCACHE_PBB_M32RBF
128#ifdef DEFINE_SWITCH
129 vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
96baa820 130 pbb_br_type, pbb_br_npc);
c906108c
SS
131 BREAK (sem);
132#else
133 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
134 vpc = m32rbf_pbb_cti_chain (current_cpu, sem_arg,
96baa820 135 CPU_PBB_BR_TYPE (current_cpu),
c906108c
SS
136 CPU_PBB_BR_NPC (current_cpu));
137#endif
138#endif
139 }
140
141 return vpc;
142#undef FLD
143}
144
145/* x-chain: --chain-- */
146
96baa820 147static SEM_PC
c906108c
SS
148SEM_FN_NAME (m32rbf,x_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
149{
2310652a 150#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
151 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
152 int UNUSED written = 0;
153 IADDR UNUSED pc = abuf->addr;
154 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
155
156 {
157#if WITH_SCACHE_PBB_M32RBF
158 vpc = m32rbf_pbb_chain (current_cpu, sem_arg);
159#ifdef DEFINE_SWITCH
160 BREAK (sem);
161#endif
162#endif
163 }
164
165 return vpc;
166#undef FLD
167}
168
169/* x-begin: --begin-- */
170
96baa820 171static SEM_PC
c906108c
SS
172SEM_FN_NAME (m32rbf,x_begin) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
173{
2310652a 174#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
175 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
176 int UNUSED written = 0;
177 IADDR UNUSED pc = abuf->addr;
178 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
179
180 {
181#if WITH_SCACHE_PBB_M32RBF
fb27a91c 182#if defined DEFINE_SWITCH || defined FAST_P
c906108c
SS
183 /* In the switch case FAST_P is a constant, allowing several optimizations
184 in any called inline functions. */
185 vpc = m32rbf_pbb_begin (current_cpu, FAST_P);
186#else
fb27a91c 187#if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
c906108c 188 vpc = m32rbf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
fb27a91c
DB
189#else
190 vpc = m32rbf_pbb_begin (current_cpu, 0);
191#endif
c906108c
SS
192#endif
193#endif
194 }
195
196 return vpc;
197#undef FLD
198}
199
200/* add: add $dr,$sr */
201
96baa820 202static SEM_PC
c906108c
SS
203SEM_FN_NAME (m32rbf,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
204{
96baa820 205#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
206 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
207 int UNUSED written = 0;
208 IADDR UNUSED pc = abuf->addr;
209 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
210
211 {
212 SI opval = ADDSI (* FLD (i_dr), * FLD (i_sr));
213 * FLD (i_dr) = opval;
55552082 214 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
215 }
216
217 return vpc;
218#undef FLD
219}
220
221/* add3: add3 $dr,$sr,$hash$slo16 */
222
96baa820 223static SEM_PC
c906108c
SS
224SEM_FN_NAME (m32rbf,add3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
225{
96baa820 226#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
227 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
228 int UNUSED written = 0;
229 IADDR UNUSED pc = abuf->addr;
230 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
231
232 {
233 SI opval = ADDSI (* FLD (i_sr), FLD (f_simm16));
234 * FLD (i_dr) = opval;
55552082 235 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
236 }
237
238 return vpc;
239#undef FLD
240}
241
242/* and: and $dr,$sr */
243
96baa820 244static SEM_PC
c906108c
SS
245SEM_FN_NAME (m32rbf,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
246{
96baa820 247#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
248 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
249 int UNUSED written = 0;
250 IADDR UNUSED pc = abuf->addr;
251 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
252
253 {
254 SI opval = ANDSI (* FLD (i_dr), * FLD (i_sr));
255 * FLD (i_dr) = opval;
55552082 256 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
257 }
258
259 return vpc;
260#undef FLD
261}
262
263/* and3: and3 $dr,$sr,$uimm16 */
264
96baa820 265static SEM_PC
c906108c
SS
266SEM_FN_NAME (m32rbf,and3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
267{
96baa820 268#define FLD(f) abuf->fields.sfmt_and3.f
c906108c
SS
269 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
270 int UNUSED written = 0;
271 IADDR UNUSED pc = abuf->addr;
272 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
273
274 {
275 SI opval = ANDSI (* FLD (i_sr), FLD (f_uimm16));
276 * FLD (i_dr) = opval;
55552082 277 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
278 }
279
280 return vpc;
281#undef FLD
282}
283
284/* or: or $dr,$sr */
285
96baa820 286static SEM_PC
c906108c
SS
287SEM_FN_NAME (m32rbf,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
288{
96baa820 289#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
290 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
291 int UNUSED written = 0;
292 IADDR UNUSED pc = abuf->addr;
293 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
294
295 {
296 SI opval = ORSI (* FLD (i_dr), * FLD (i_sr));
297 * FLD (i_dr) = opval;
55552082 298 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
299 }
300
301 return vpc;
302#undef FLD
303}
304
305/* or3: or3 $dr,$sr,$hash$ulo16 */
306
96baa820 307static SEM_PC
c906108c
SS
308SEM_FN_NAME (m32rbf,or3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
309{
96baa820 310#define FLD(f) abuf->fields.sfmt_and3.f
c906108c
SS
311 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
312 int UNUSED written = 0;
313 IADDR UNUSED pc = abuf->addr;
314 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
315
316 {
317 SI opval = ORSI (* FLD (i_sr), FLD (f_uimm16));
318 * FLD (i_dr) = opval;
55552082 319 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
320 }
321
322 return vpc;
323#undef FLD
324}
325
326/* xor: xor $dr,$sr */
327
96baa820 328static SEM_PC
c906108c
SS
329SEM_FN_NAME (m32rbf,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
330{
96baa820 331#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
332 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
333 int UNUSED written = 0;
334 IADDR UNUSED pc = abuf->addr;
335 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
336
337 {
338 SI opval = XORSI (* FLD (i_dr), * FLD (i_sr));
339 * FLD (i_dr) = opval;
55552082 340 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
341 }
342
343 return vpc;
344#undef FLD
345}
346
347/* xor3: xor3 $dr,$sr,$uimm16 */
348
96baa820 349static SEM_PC
c906108c
SS
350SEM_FN_NAME (m32rbf,xor3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
351{
96baa820 352#define FLD(f) abuf->fields.sfmt_and3.f
c906108c
SS
353 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
354 int UNUSED written = 0;
355 IADDR UNUSED pc = abuf->addr;
356 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
357
358 {
359 SI opval = XORSI (* FLD (i_sr), FLD (f_uimm16));
360 * FLD (i_dr) = opval;
55552082 361 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
362 }
363
364 return vpc;
365#undef FLD
366}
367
368/* addi: addi $dr,$simm8 */
369
96baa820 370static SEM_PC
c906108c
SS
371SEM_FN_NAME (m32rbf,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
372{
96baa820 373#define FLD(f) abuf->fields.sfmt_addi.f
c906108c
SS
374 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
375 int UNUSED written = 0;
376 IADDR UNUSED pc = abuf->addr;
377 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
378
379 {
380 SI opval = ADDSI (* FLD (i_dr), FLD (f_simm8));
381 * FLD (i_dr) = opval;
55552082 382 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
383 }
384
385 return vpc;
386#undef FLD
387}
388
389/* addv: addv $dr,$sr */
390
96baa820 391static SEM_PC
c906108c
SS
392SEM_FN_NAME (m32rbf,addv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
393{
96baa820 394#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
395 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
396 int UNUSED written = 0;
397 IADDR UNUSED pc = abuf->addr;
398 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
399
7a292a7a
SS
400{
401 SI temp0;BI temp1;
c906108c
SS
402 temp0 = ADDSI (* FLD (i_dr), * FLD (i_sr));
403 temp1 = ADDOFSI (* FLD (i_dr), * FLD (i_sr), 0);
404 {
405 SI opval = temp0;
406 * FLD (i_dr) = opval;
55552082 407 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
408 }
409 {
410 BI opval = temp1;
411 CPU (h_cond) = opval;
55552082 412 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c 413 }
7a292a7a 414}
c906108c
SS
415
416 return vpc;
417#undef FLD
418}
419
420/* addv3: addv3 $dr,$sr,$simm16 */
421
96baa820 422static SEM_PC
c906108c
SS
423SEM_FN_NAME (m32rbf,addv3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
424{
96baa820 425#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
426 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
427 int UNUSED written = 0;
428 IADDR UNUSED pc = abuf->addr;
429 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
430
7a292a7a
SS
431{
432 SI temp0;BI temp1;
c906108c
SS
433 temp0 = ADDSI (* FLD (i_sr), FLD (f_simm16));
434 temp1 = ADDOFSI (* FLD (i_sr), FLD (f_simm16), 0);
435 {
436 SI opval = temp0;
437 * FLD (i_dr) = opval;
55552082 438 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
439 }
440 {
441 BI opval = temp1;
442 CPU (h_cond) = opval;
55552082 443 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c 444 }
7a292a7a 445}
c906108c
SS
446
447 return vpc;
448#undef FLD
449}
450
451/* addx: addx $dr,$sr */
452
96baa820 453static SEM_PC
c906108c
SS
454SEM_FN_NAME (m32rbf,addx) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
455{
96baa820 456#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
457 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
458 int UNUSED written = 0;
459 IADDR UNUSED pc = abuf->addr;
460 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
461
7a292a7a
SS
462{
463 SI temp0;BI temp1;
c906108c
SS
464 temp0 = ADDCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
465 temp1 = ADDCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
466 {
467 SI opval = temp0;
468 * FLD (i_dr) = opval;
55552082 469 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
470 }
471 {
472 BI opval = temp1;
473 CPU (h_cond) = opval;
55552082 474 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c 475 }
7a292a7a 476}
c906108c
SS
477
478 return vpc;
479#undef FLD
480}
481
482/* bc8: bc.s $disp8 */
483
96baa820 484static SEM_PC
c906108c
SS
485SEM_FN_NAME (m32rbf,bc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
486{
96baa820 487#define FLD(f) abuf->fields.sfmt_bl8.f
c906108c
SS
488 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
489 int UNUSED written = 0;
490 IADDR UNUSED pc = abuf->addr;
491 SEM_BRANCH_INIT
492 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
493
494if (CPU (h_cond)) {
495 {
496 USI opval = FLD (i_disp8);
96baa820 497 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
498 written |= (1 << 2);
499 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
500 }
501}
502
503 abuf->written = written;
504 SEM_BRANCH_FINI (vpc);
505 return vpc;
506#undef FLD
507}
508
509/* bc24: bc.l $disp24 */
510
96baa820 511static SEM_PC
c906108c
SS
512SEM_FN_NAME (m32rbf,bc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
513{
96baa820 514#define FLD(f) abuf->fields.sfmt_bl24.f
c906108c
SS
515 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
516 int UNUSED written = 0;
517 IADDR UNUSED pc = abuf->addr;
518 SEM_BRANCH_INIT
519 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
520
521if (CPU (h_cond)) {
522 {
523 USI opval = FLD (i_disp24);
96baa820 524 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
525 written |= (1 << 2);
526 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
527 }
528}
529
530 abuf->written = written;
531 SEM_BRANCH_FINI (vpc);
532 return vpc;
533#undef FLD
534}
535
536/* beq: beq $src1,$src2,$disp16 */
537
96baa820 538static SEM_PC
c906108c
SS
539SEM_FN_NAME (m32rbf,beq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
540{
96baa820 541#define FLD(f) abuf->fields.sfmt_beq.f
c906108c
SS
542 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
543 int UNUSED written = 0;
544 IADDR UNUSED pc = abuf->addr;
545 SEM_BRANCH_INIT
546 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
547
548if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
549 {
550 USI opval = FLD (i_disp16);
96baa820 551 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
552 written |= (1 << 3);
553 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
554 }
555}
556
557 abuf->written = written;
558 SEM_BRANCH_FINI (vpc);
559 return vpc;
560#undef FLD
561}
562
563/* beqz: beqz $src2,$disp16 */
564
96baa820 565static SEM_PC
c906108c
SS
566SEM_FN_NAME (m32rbf,beqz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
567{
96baa820 568#define FLD(f) abuf->fields.sfmt_beq.f
c906108c
SS
569 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
570 int UNUSED written = 0;
571 IADDR UNUSED pc = abuf->addr;
572 SEM_BRANCH_INIT
573 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
574
575if (EQSI (* FLD (i_src2), 0)) {
576 {
577 USI opval = FLD (i_disp16);
96baa820 578 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
579 written |= (1 << 2);
580 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
581 }
582}
583
584 abuf->written = written;
585 SEM_BRANCH_FINI (vpc);
586 return vpc;
587#undef FLD
588}
589
590/* bgez: bgez $src2,$disp16 */
591
96baa820 592static SEM_PC
c906108c
SS
593SEM_FN_NAME (m32rbf,bgez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
594{
96baa820 595#define FLD(f) abuf->fields.sfmt_beq.f
c906108c
SS
596 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
597 int UNUSED written = 0;
598 IADDR UNUSED pc = abuf->addr;
599 SEM_BRANCH_INIT
600 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
601
602if (GESI (* FLD (i_src2), 0)) {
603 {
604 USI opval = FLD (i_disp16);
96baa820 605 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
606 written |= (1 << 2);
607 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
608 }
609}
610
611 abuf->written = written;
612 SEM_BRANCH_FINI (vpc);
613 return vpc;
614#undef FLD
615}
616
617/* bgtz: bgtz $src2,$disp16 */
618
96baa820 619static SEM_PC
c906108c
SS
620SEM_FN_NAME (m32rbf,bgtz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
621{
96baa820 622#define FLD(f) abuf->fields.sfmt_beq.f
c906108c
SS
623 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
624 int UNUSED written = 0;
625 IADDR UNUSED pc = abuf->addr;
626 SEM_BRANCH_INIT
627 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
628
629if (GTSI (* FLD (i_src2), 0)) {
630 {
631 USI opval = FLD (i_disp16);
96baa820 632 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
633 written |= (1 << 2);
634 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
635 }
636}
637
638 abuf->written = written;
639 SEM_BRANCH_FINI (vpc);
640 return vpc;
641#undef FLD
642}
643
644/* blez: blez $src2,$disp16 */
645
96baa820 646static SEM_PC
c906108c
SS
647SEM_FN_NAME (m32rbf,blez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
648{
96baa820 649#define FLD(f) abuf->fields.sfmt_beq.f
c906108c
SS
650 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
651 int UNUSED written = 0;
652 IADDR UNUSED pc = abuf->addr;
653 SEM_BRANCH_INIT
654 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
655
656if (LESI (* FLD (i_src2), 0)) {
657 {
658 USI opval = FLD (i_disp16);
96baa820 659 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
660 written |= (1 << 2);
661 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
662 }
663}
664
665 abuf->written = written;
666 SEM_BRANCH_FINI (vpc);
667 return vpc;
668#undef FLD
669}
670
671/* bltz: bltz $src2,$disp16 */
672
96baa820 673static SEM_PC
c906108c
SS
674SEM_FN_NAME (m32rbf,bltz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
675{
96baa820 676#define FLD(f) abuf->fields.sfmt_beq.f
c906108c
SS
677 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
678 int UNUSED written = 0;
679 IADDR UNUSED pc = abuf->addr;
680 SEM_BRANCH_INIT
681 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
682
683if (LTSI (* FLD (i_src2), 0)) {
684 {
685 USI opval = FLD (i_disp16);
96baa820 686 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
687 written |= (1 << 2);
688 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
689 }
690}
691
692 abuf->written = written;
693 SEM_BRANCH_FINI (vpc);
694 return vpc;
695#undef FLD
696}
697
698/* bnez: bnez $src2,$disp16 */
699
96baa820 700static SEM_PC
c906108c
SS
701SEM_FN_NAME (m32rbf,bnez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
702{
96baa820 703#define FLD(f) abuf->fields.sfmt_beq.f
c906108c
SS
704 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
705 int UNUSED written = 0;
706 IADDR UNUSED pc = abuf->addr;
707 SEM_BRANCH_INIT
708 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
709
710if (NESI (* FLD (i_src2), 0)) {
711 {
712 USI opval = FLD (i_disp16);
96baa820 713 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
714 written |= (1 << 2);
715 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
716 }
717}
718
719 abuf->written = written;
720 SEM_BRANCH_FINI (vpc);
721 return vpc;
722#undef FLD
723}
724
725/* bl8: bl.s $disp8 */
726
96baa820 727static SEM_PC
c906108c
SS
728SEM_FN_NAME (m32rbf,bl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
729{
96baa820 730#define FLD(f) abuf->fields.sfmt_bl8.f
c906108c
SS
731 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
732 int UNUSED written = 0;
733 IADDR UNUSED pc = abuf->addr;
734 SEM_BRANCH_INIT
735 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
736
7a292a7a 737{
c906108c
SS
738 {
739 SI opval = ADDSI (ANDSI (pc, -4), 4);
740 CPU (h_gr[((UINT) 14)]) = opval;
55552082 741 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
742 }
743 {
744 USI opval = FLD (i_disp8);
96baa820 745 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
746 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
747 }
7a292a7a 748}
c906108c
SS
749
750 SEM_BRANCH_FINI (vpc);
751 return vpc;
752#undef FLD
753}
754
755/* bl24: bl.l $disp24 */
756
96baa820 757static SEM_PC
c906108c
SS
758SEM_FN_NAME (m32rbf,bl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
759{
96baa820 760#define FLD(f) abuf->fields.sfmt_bl24.f
c906108c
SS
761 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
762 int UNUSED written = 0;
763 IADDR UNUSED pc = abuf->addr;
764 SEM_BRANCH_INIT
765 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
766
7a292a7a 767{
c906108c
SS
768 {
769 SI opval = ADDSI (pc, 4);
770 CPU (h_gr[((UINT) 14)]) = opval;
55552082 771 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
772 }
773 {
774 USI opval = FLD (i_disp24);
96baa820 775 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
776 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
777 }
7a292a7a 778}
c906108c
SS
779
780 SEM_BRANCH_FINI (vpc);
781 return vpc;
782#undef FLD
783}
784
785/* bnc8: bnc.s $disp8 */
786
96baa820 787static SEM_PC
c906108c
SS
788SEM_FN_NAME (m32rbf,bnc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
789{
96baa820 790#define FLD(f) abuf->fields.sfmt_bl8.f
c906108c
SS
791 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
792 int UNUSED written = 0;
793 IADDR UNUSED pc = abuf->addr;
794 SEM_BRANCH_INIT
795 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
796
797if (NOTBI (CPU (h_cond))) {
798 {
799 USI opval = FLD (i_disp8);
96baa820 800 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
801 written |= (1 << 2);
802 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
803 }
804}
805
806 abuf->written = written;
807 SEM_BRANCH_FINI (vpc);
808 return vpc;
809#undef FLD
810}
811
812/* bnc24: bnc.l $disp24 */
813
96baa820 814static SEM_PC
c906108c
SS
815SEM_FN_NAME (m32rbf,bnc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
816{
96baa820 817#define FLD(f) abuf->fields.sfmt_bl24.f
c906108c
SS
818 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
819 int UNUSED written = 0;
820 IADDR UNUSED pc = abuf->addr;
821 SEM_BRANCH_INIT
822 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
823
824if (NOTBI (CPU (h_cond))) {
825 {
826 USI opval = FLD (i_disp24);
96baa820 827 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
828 written |= (1 << 2);
829 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
830 }
831}
832
833 abuf->written = written;
834 SEM_BRANCH_FINI (vpc);
835 return vpc;
836#undef FLD
837}
838
839/* bne: bne $src1,$src2,$disp16 */
840
96baa820 841static SEM_PC
c906108c
SS
842SEM_FN_NAME (m32rbf,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
843{
96baa820 844#define FLD(f) abuf->fields.sfmt_beq.f
c906108c
SS
845 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
846 int UNUSED written = 0;
847 IADDR UNUSED pc = abuf->addr;
848 SEM_BRANCH_INIT
849 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
850
851if (NESI (* FLD (i_src1), * FLD (i_src2))) {
852 {
853 USI opval = FLD (i_disp16);
96baa820 854 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
855 written |= (1 << 3);
856 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
857 }
858}
859
860 abuf->written = written;
861 SEM_BRANCH_FINI (vpc);
862 return vpc;
863#undef FLD
864}
865
866/* bra8: bra.s $disp8 */
867
96baa820 868static SEM_PC
c906108c
SS
869SEM_FN_NAME (m32rbf,bra8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
870{
96baa820 871#define FLD(f) abuf->fields.sfmt_bl8.f
c906108c
SS
872 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
873 int UNUSED written = 0;
874 IADDR UNUSED pc = abuf->addr;
875 SEM_BRANCH_INIT
876 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
877
878 {
879 USI opval = FLD (i_disp8);
96baa820 880 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
881 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
882 }
883
884 SEM_BRANCH_FINI (vpc);
885 return vpc;
886#undef FLD
887}
888
889/* bra24: bra.l $disp24 */
890
96baa820 891static SEM_PC
c906108c
SS
892SEM_FN_NAME (m32rbf,bra24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
893{
96baa820 894#define FLD(f) abuf->fields.sfmt_bl24.f
c906108c
SS
895 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
896 int UNUSED written = 0;
897 IADDR UNUSED pc = abuf->addr;
898 SEM_BRANCH_INIT
899 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
900
901 {
902 USI opval = FLD (i_disp24);
96baa820 903 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
c906108c
SS
904 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
905 }
906
907 SEM_BRANCH_FINI (vpc);
908 return vpc;
909#undef FLD
910}
911
912/* cmp: cmp $src1,$src2 */
913
96baa820 914static SEM_PC
c906108c
SS
915SEM_FN_NAME (m32rbf,cmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
916{
96baa820 917#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
918 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
919 int UNUSED written = 0;
920 IADDR UNUSED pc = abuf->addr;
921 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
922
923 {
924 BI opval = LTSI (* FLD (i_src1), * FLD (i_src2));
925 CPU (h_cond) = opval;
55552082 926 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c
SS
927 }
928
929 return vpc;
930#undef FLD
931}
932
933/* cmpi: cmpi $src2,$simm16 */
934
96baa820 935static SEM_PC
c906108c
SS
936SEM_FN_NAME (m32rbf,cmpi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
937{
96baa820 938#define FLD(f) abuf->fields.sfmt_st_d.f
c906108c
SS
939 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
940 int UNUSED written = 0;
941 IADDR UNUSED pc = abuf->addr;
942 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
943
944 {
945 BI opval = LTSI (* FLD (i_src2), FLD (f_simm16));
946 CPU (h_cond) = opval;
55552082 947 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c
SS
948 }
949
950 return vpc;
951#undef FLD
952}
953
954/* cmpu: cmpu $src1,$src2 */
955
96baa820 956static SEM_PC
c906108c
SS
957SEM_FN_NAME (m32rbf,cmpu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
958{
96baa820 959#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
960 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
961 int UNUSED written = 0;
962 IADDR UNUSED pc = abuf->addr;
963 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
964
965 {
966 BI opval = LTUSI (* FLD (i_src1), * FLD (i_src2));
967 CPU (h_cond) = opval;
55552082 968 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c
SS
969 }
970
971 return vpc;
972#undef FLD
973}
974
975/* cmpui: cmpui $src2,$simm16 */
976
96baa820 977static SEM_PC
c906108c
SS
978SEM_FN_NAME (m32rbf,cmpui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
979{
96baa820 980#define FLD(f) abuf->fields.sfmt_st_d.f
c906108c
SS
981 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
982 int UNUSED written = 0;
983 IADDR UNUSED pc = abuf->addr;
984 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
985
986 {
987 BI opval = LTUSI (* FLD (i_src2), FLD (f_simm16));
988 CPU (h_cond) = opval;
55552082 989 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c
SS
990 }
991
992 return vpc;
993#undef FLD
994}
995
996/* div: div $dr,$sr */
997
96baa820 998static SEM_PC
c906108c
SS
999SEM_FN_NAME (m32rbf,div) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1000{
96baa820 1001#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
1002 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1003 int UNUSED written = 0;
1004 IADDR UNUSED pc = abuf->addr;
1005 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1006
1007if (NESI (* FLD (i_sr), 0)) {
1008 {
1009 SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
1010 * FLD (i_dr) = opval;
1011 written |= (1 << 2);
55552082 1012 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1013 }
1014}
1015
1016 abuf->written = written;
1017 return vpc;
1018#undef FLD
1019}
1020
1021/* divu: divu $dr,$sr */
1022
96baa820 1023static SEM_PC
c906108c
SS
1024SEM_FN_NAME (m32rbf,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1025{
96baa820 1026#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
1027 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1028 int UNUSED written = 0;
1029 IADDR UNUSED pc = abuf->addr;
1030 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1031
1032if (NESI (* FLD (i_sr), 0)) {
1033 {
1034 SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
1035 * FLD (i_dr) = opval;
1036 written |= (1 << 2);
55552082 1037 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1038 }
1039}
1040
1041 abuf->written = written;
1042 return vpc;
1043#undef FLD
1044}
1045
1046/* rem: rem $dr,$sr */
1047
96baa820 1048static SEM_PC
c906108c
SS
1049SEM_FN_NAME (m32rbf,rem) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1050{
96baa820 1051#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
1052 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1053 int UNUSED written = 0;
1054 IADDR UNUSED pc = abuf->addr;
1055 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1056
1057if (NESI (* FLD (i_sr), 0)) {
1058 {
1059 SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
1060 * FLD (i_dr) = opval;
1061 written |= (1 << 2);
55552082 1062 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1063 }
1064}
1065
1066 abuf->written = written;
1067 return vpc;
1068#undef FLD
1069}
1070
1071/* remu: remu $dr,$sr */
1072
96baa820 1073static SEM_PC
c906108c
SS
1074SEM_FN_NAME (m32rbf,remu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1075{
96baa820 1076#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
1077 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1078 int UNUSED written = 0;
1079 IADDR UNUSED pc = abuf->addr;
1080 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1081
1082if (NESI (* FLD (i_sr), 0)) {
1083 {
1084 SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
1085 * FLD (i_dr) = opval;
1086 written |= (1 << 2);
55552082 1087 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1088 }
1089}
1090
1091 abuf->written = written;
1092 return vpc;
1093#undef FLD
1094}
1095
1096/* jl: jl $sr */
1097
96baa820 1098static SEM_PC
c906108c
SS
1099SEM_FN_NAME (m32rbf,jl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1100{
96baa820 1101#define FLD(f) abuf->fields.sfmt_jl.f
c906108c
SS
1102 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1103 int UNUSED written = 0;
1104 IADDR UNUSED pc = abuf->addr;
1105 SEM_BRANCH_INIT
1106 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1107
7a292a7a
SS
1108{
1109 SI temp0;USI temp1;
c906108c
SS
1110 temp0 = ADDSI (ANDSI (pc, -4), 4);
1111 temp1 = ANDSI (* FLD (i_sr), -4);
1112 {
1113 SI opval = temp0;
1114 CPU (h_gr[((UINT) 14)]) = opval;
55552082 1115 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1116 }
1117 {
1118 USI opval = temp1;
1119 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1120 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1121 }
7a292a7a 1122}
c906108c
SS
1123
1124 SEM_BRANCH_FINI (vpc);
1125 return vpc;
1126#undef FLD
1127}
1128
1129/* jmp: jmp $sr */
1130
96baa820 1131static SEM_PC
c906108c
SS
1132SEM_FN_NAME (m32rbf,jmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1133{
de8f5985 1134#define FLD(f) abuf->fields.sfmt_jl.f
c906108c
SS
1135 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1136 int UNUSED written = 0;
1137 IADDR UNUSED pc = abuf->addr;
1138 SEM_BRANCH_INIT
1139 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1140
1141 {
1142 USI opval = ANDSI (* FLD (i_sr), -4);
1143 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1144 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1145 }
1146
1147 SEM_BRANCH_FINI (vpc);
1148 return vpc;
1149#undef FLD
1150}
1151
1152/* ld: ld $dr,@$sr */
1153
96baa820 1154static SEM_PC
c906108c
SS
1155SEM_FN_NAME (m32rbf,ld) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1156{
96baa820 1157#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1158 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1159 int UNUSED written = 0;
1160 IADDR UNUSED pc = abuf->addr;
1161 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1162
1163 {
1164 SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1165 * FLD (i_dr) = opval;
55552082 1166 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1167 }
1168
1169 return vpc;
1170#undef FLD
1171}
1172
1173/* ld-d: ld $dr,@($slo16,$sr) */
1174
96baa820 1175static SEM_PC
c906108c
SS
1176SEM_FN_NAME (m32rbf,ld_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1177{
96baa820 1178#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
1179 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1180 int UNUSED written = 0;
1181 IADDR UNUSED pc = abuf->addr;
1182 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1183
1184 {
1185 SI opval = GETMEMSI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)));
1186 * FLD (i_dr) = opval;
55552082 1187 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1188 }
1189
1190 return vpc;
1191#undef FLD
1192}
1193
1194/* ldb: ldb $dr,@$sr */
1195
96baa820 1196static SEM_PC
c906108c
SS
1197SEM_FN_NAME (m32rbf,ldb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1198{
96baa820 1199#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1200 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1201 int UNUSED written = 0;
1202 IADDR UNUSED pc = abuf->addr;
1203 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1204
1205 {
1206 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
1207 * FLD (i_dr) = opval;
55552082 1208 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1209 }
1210
1211 return vpc;
1212#undef FLD
1213}
1214
1215/* ldb-d: ldb $dr,@($slo16,$sr) */
1216
96baa820 1217static SEM_PC
c906108c
SS
1218SEM_FN_NAME (m32rbf,ldb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1219{
96baa820 1220#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
1221 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1222 int UNUSED written = 0;
1223 IADDR UNUSED pc = abuf->addr;
1224 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1225
1226 {
1227 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1228 * FLD (i_dr) = opval;
55552082 1229 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1230 }
1231
1232 return vpc;
1233#undef FLD
1234}
1235
1236/* ldh: ldh $dr,@$sr */
1237
96baa820 1238static SEM_PC
c906108c
SS
1239SEM_FN_NAME (m32rbf,ldh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1240{
96baa820 1241#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1242 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1243 int UNUSED written = 0;
1244 IADDR UNUSED pc = abuf->addr;
1245 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1246
1247 {
1248 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
1249 * FLD (i_dr) = opval;
55552082 1250 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1251 }
1252
1253 return vpc;
1254#undef FLD
1255}
1256
1257/* ldh-d: ldh $dr,@($slo16,$sr) */
1258
96baa820 1259static SEM_PC
c906108c
SS
1260SEM_FN_NAME (m32rbf,ldh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1261{
96baa820 1262#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
1263 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1264 int UNUSED written = 0;
1265 IADDR UNUSED pc = abuf->addr;
1266 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1267
1268 {
1269 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1270 * FLD (i_dr) = opval;
55552082 1271 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1272 }
1273
1274 return vpc;
1275#undef FLD
1276}
1277
1278/* ldub: ldub $dr,@$sr */
1279
96baa820 1280static SEM_PC
c906108c
SS
1281SEM_FN_NAME (m32rbf,ldub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1282{
96baa820 1283#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1284 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1285 int UNUSED written = 0;
1286 IADDR UNUSED pc = abuf->addr;
1287 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1288
1289 {
1290 SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, * FLD (i_sr)));
1291 * FLD (i_dr) = opval;
55552082 1292 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1293 }
1294
1295 return vpc;
1296#undef FLD
1297}
1298
1299/* ldub-d: ldub $dr,@($slo16,$sr) */
1300
96baa820 1301static SEM_PC
c906108c
SS
1302SEM_FN_NAME (m32rbf,ldub_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1303{
96baa820 1304#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
1305 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1306 int UNUSED written = 0;
1307 IADDR UNUSED pc = abuf->addr;
1308 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1309
1310 {
1311 SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1312 * FLD (i_dr) = opval;
55552082 1313 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1314 }
1315
1316 return vpc;
1317#undef FLD
1318}
1319
1320/* lduh: lduh $dr,@$sr */
1321
96baa820 1322static SEM_PC
c906108c
SS
1323SEM_FN_NAME (m32rbf,lduh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1324{
96baa820 1325#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1326 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1327 int UNUSED written = 0;
1328 IADDR UNUSED pc = abuf->addr;
1329 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1330
1331 {
1332 SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, * FLD (i_sr)));
1333 * FLD (i_dr) = opval;
55552082 1334 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1335 }
1336
1337 return vpc;
1338#undef FLD
1339}
1340
1341/* lduh-d: lduh $dr,@($slo16,$sr) */
1342
96baa820 1343static SEM_PC
c906108c
SS
1344SEM_FN_NAME (m32rbf,lduh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1345{
96baa820 1346#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
1347 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1348 int UNUSED written = 0;
1349 IADDR UNUSED pc = abuf->addr;
1350 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1351
1352 {
1353 SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))));
1354 * FLD (i_dr) = opval;
55552082 1355 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1356 }
1357
1358 return vpc;
1359#undef FLD
1360}
1361
1362/* ld-plus: ld $dr,@$sr+ */
1363
96baa820 1364static SEM_PC
c906108c
SS
1365SEM_FN_NAME (m32rbf,ld_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1366{
96baa820 1367#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1368 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1369 int UNUSED written = 0;
1370 IADDR UNUSED pc = abuf->addr;
1371 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1372
7a292a7a
SS
1373{
1374 SI temp0;SI temp1;
c906108c
SS
1375 temp0 = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1376 temp1 = ADDSI (* FLD (i_sr), 4);
1377 {
1378 SI opval = temp0;
1379 * FLD (i_dr) = opval;
55552082 1380 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1381 }
1382 {
1383 SI opval = temp1;
1384 * FLD (i_sr) = opval;
55552082 1385 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c 1386 }
7a292a7a 1387}
c906108c
SS
1388
1389 return vpc;
1390#undef FLD
1391}
1392
1393/* ld24: ld24 $dr,$uimm24 */
1394
96baa820 1395static SEM_PC
c906108c
SS
1396SEM_FN_NAME (m32rbf,ld24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1397{
96baa820 1398#define FLD(f) abuf->fields.sfmt_ld24.f
c906108c
SS
1399 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1400 int UNUSED written = 0;
1401 IADDR UNUSED pc = abuf->addr;
1402 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1403
1404 {
1405 SI opval = FLD (i_uimm24);
1406 * FLD (i_dr) = opval;
55552082 1407 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1408 }
1409
1410 return vpc;
1411#undef FLD
1412}
1413
1414/* ldi8: ldi8 $dr,$simm8 */
1415
96baa820 1416static SEM_PC
c906108c
SS
1417SEM_FN_NAME (m32rbf,ldi8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1418{
96baa820 1419#define FLD(f) abuf->fields.sfmt_addi.f
c906108c
SS
1420 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1421 int UNUSED written = 0;
1422 IADDR UNUSED pc = abuf->addr;
1423 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1424
1425 {
1426 SI opval = FLD (f_simm8);
1427 * FLD (i_dr) = opval;
55552082 1428 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1429 }
1430
1431 return vpc;
1432#undef FLD
1433}
1434
1435/* ldi16: ldi16 $dr,$hash$slo16 */
1436
96baa820 1437static SEM_PC
c906108c
SS
1438SEM_FN_NAME (m32rbf,ldi16) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1439{
96baa820 1440#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
1441 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1442 int UNUSED written = 0;
1443 IADDR UNUSED pc = abuf->addr;
1444 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1445
1446 {
1447 SI opval = FLD (f_simm16);
1448 * FLD (i_dr) = opval;
55552082 1449 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1450 }
1451
1452 return vpc;
1453#undef FLD
1454}
1455
1456/* lock: lock $dr,@$sr */
1457
96baa820 1458static SEM_PC
c906108c
SS
1459SEM_FN_NAME (m32rbf,lock) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1460{
96baa820 1461#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1462 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1463 int UNUSED written = 0;
1464 IADDR UNUSED pc = abuf->addr;
1465 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1466
7a292a7a 1467{
c906108c
SS
1468 {
1469 BI opval = 1;
1470 CPU (h_lock) = opval;
7a292a7a 1471 TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
c906108c
SS
1472 }
1473 {
1474 SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1475 * FLD (i_dr) = opval;
55552082 1476 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c 1477 }
7a292a7a 1478}
c906108c
SS
1479
1480 return vpc;
1481#undef FLD
1482}
1483
1484/* machi: machi $src1,$src2 */
1485
96baa820 1486static SEM_PC
c906108c
SS
1487SEM_FN_NAME (m32rbf,machi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1488{
96baa820 1489#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1490 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1491 int UNUSED written = 0;
1492 IADDR UNUSED pc = abuf->addr;
1493 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1494
1495 {
1496 DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
1497 SET_H_ACCUM (opval);
1498 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1499 }
1500
1501 return vpc;
1502#undef FLD
1503}
1504
1505/* maclo: maclo $src1,$src2 */
1506
96baa820 1507static SEM_PC
c906108c
SS
1508SEM_FN_NAME (m32rbf,maclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1509{
96baa820 1510#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1511 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1512 int UNUSED written = 0;
1513 IADDR UNUSED pc = abuf->addr;
1514 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1515
1516 {
1517 DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
1518 SET_H_ACCUM (opval);
1519 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1520 }
1521
1522 return vpc;
1523#undef FLD
1524}
1525
1526/* macwhi: macwhi $src1,$src2 */
1527
96baa820 1528static SEM_PC
c906108c
SS
1529SEM_FN_NAME (m32rbf,macwhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1530{
96baa820 1531#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1532 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1533 int UNUSED written = 0;
1534 IADDR UNUSED pc = abuf->addr;
1535 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1536
1537 {
1538 DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16))))), 8), 8);
1539 SET_H_ACCUM (opval);
1540 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1541 }
1542
1543 return vpc;
1544#undef FLD
1545}
1546
1547/* macwlo: macwlo $src1,$src2 */
1548
96baa820 1549static SEM_PC
c906108c
SS
1550SEM_FN_NAME (m32rbf,macwlo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1551{
96baa820 1552#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1553 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1554 int UNUSED written = 0;
1555 IADDR UNUSED pc = abuf->addr;
1556 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1557
1558 {
1559 DI opval = SRADI (SLLDI (ADDDI (GET_H_ACCUM (), MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2))))), 8), 8);
1560 SET_H_ACCUM (opval);
1561 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1562 }
1563
1564 return vpc;
1565#undef FLD
1566}
1567
1568/* mul: mul $dr,$sr */
1569
96baa820 1570static SEM_PC
c906108c
SS
1571SEM_FN_NAME (m32rbf,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1572{
96baa820 1573#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
1574 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1575 int UNUSED written = 0;
1576 IADDR UNUSED pc = abuf->addr;
1577 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1578
1579 {
1580 SI opval = MULSI (* FLD (i_dr), * FLD (i_sr));
1581 * FLD (i_dr) = opval;
55552082 1582 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1583 }
1584
1585 return vpc;
1586#undef FLD
1587}
1588
1589/* mulhi: mulhi $src1,$src2 */
1590
96baa820 1591static SEM_PC
c906108c
SS
1592SEM_FN_NAME (m32rbf,mulhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1593{
96baa820 1594#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1595 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1596 int UNUSED written = 0;
1597 IADDR UNUSED pc = abuf->addr;
1598 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1599
1600 {
1601 DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (i_src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 16), 16);
1602 SET_H_ACCUM (opval);
1603 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1604 }
1605
1606 return vpc;
1607#undef FLD
1608}
1609
1610/* mullo: mullo $src1,$src2 */
1611
96baa820 1612static SEM_PC
c906108c
SS
1613SEM_FN_NAME (m32rbf,mullo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1614{
96baa820 1615#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1616 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1617 int UNUSED written = 0;
1618 IADDR UNUSED pc = abuf->addr;
1619 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1620
1621 {
1622 DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (i_src1), 16)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 16), 16);
1623 SET_H_ACCUM (opval);
1624 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1625 }
1626
1627 return vpc;
1628#undef FLD
1629}
1630
1631/* mulwhi: mulwhi $src1,$src2 */
1632
96baa820 1633static SEM_PC
c906108c
SS
1634SEM_FN_NAME (m32rbf,mulwhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1635{
96baa820 1636#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1637 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1638 int UNUSED written = 0;
1639 IADDR UNUSED pc = abuf->addr;
1640 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1641
1642 {
1643 DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (i_src2), 16)))), 8), 8);
1644 SET_H_ACCUM (opval);
1645 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1646 }
1647
1648 return vpc;
1649#undef FLD
1650}
1651
1652/* mulwlo: mulwlo $src1,$src2 */
1653
96baa820 1654static SEM_PC
c906108c
SS
1655SEM_FN_NAME (m32rbf,mulwlo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1656{
96baa820 1657#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1658 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1659 int UNUSED written = 0;
1660 IADDR UNUSED pc = abuf->addr;
1661 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1662
1663 {
1664 DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (i_src1)), EXTHIDI (TRUNCSIHI (* FLD (i_src2)))), 8), 8);
1665 SET_H_ACCUM (opval);
1666 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1667 }
1668
1669 return vpc;
1670#undef FLD
1671}
1672
1673/* mv: mv $dr,$sr */
1674
96baa820 1675static SEM_PC
c906108c
SS
1676SEM_FN_NAME (m32rbf,mv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1677{
96baa820 1678#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1679 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1680 int UNUSED written = 0;
1681 IADDR UNUSED pc = abuf->addr;
1682 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1683
1684 {
1685 SI opval = * FLD (i_sr);
1686 * FLD (i_dr) = opval;
55552082 1687 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1688 }
1689
1690 return vpc;
1691#undef FLD
1692}
1693
1694/* mvfachi: mvfachi $dr */
1695
96baa820 1696static SEM_PC
c906108c
SS
1697SEM_FN_NAME (m32rbf,mvfachi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1698{
96baa820 1699#define FLD(f) abuf->fields.sfmt_seth.f
c906108c
SS
1700 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1701 int UNUSED written = 0;
1702 IADDR UNUSED pc = abuf->addr;
1703 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1704
1705 {
1706 SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 32));
1707 * FLD (i_dr) = opval;
55552082 1708 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1709 }
1710
1711 return vpc;
1712#undef FLD
1713}
1714
1715/* mvfaclo: mvfaclo $dr */
1716
96baa820 1717static SEM_PC
c906108c
SS
1718SEM_FN_NAME (m32rbf,mvfaclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1719{
96baa820 1720#define FLD(f) abuf->fields.sfmt_seth.f
c906108c
SS
1721 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1722 int UNUSED written = 0;
1723 IADDR UNUSED pc = abuf->addr;
1724 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1725
1726 {
1727 SI opval = TRUNCDISI (GET_H_ACCUM ());
1728 * FLD (i_dr) = opval;
55552082 1729 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1730 }
1731
1732 return vpc;
1733#undef FLD
1734}
1735
1736/* mvfacmi: mvfacmi $dr */
1737
96baa820 1738static SEM_PC
c906108c
SS
1739SEM_FN_NAME (m32rbf,mvfacmi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1740{
96baa820 1741#define FLD(f) abuf->fields.sfmt_seth.f
c906108c
SS
1742 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1743 int UNUSED written = 0;
1744 IADDR UNUSED pc = abuf->addr;
1745 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1746
1747 {
1748 SI opval = TRUNCDISI (SRADI (GET_H_ACCUM (), 16));
1749 * FLD (i_dr) = opval;
55552082 1750 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1751 }
1752
1753 return vpc;
1754#undef FLD
1755}
1756
1757/* mvfc: mvfc $dr,$scr */
1758
96baa820 1759static SEM_PC
c906108c
SS
1760SEM_FN_NAME (m32rbf,mvfc) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1761{
de8f5985 1762#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1763 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1764 int UNUSED written = 0;
1765 IADDR UNUSED pc = abuf->addr;
1766 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1767
1768 {
1769 SI opval = GET_H_CR (FLD (f_r2));
1770 * FLD (i_dr) = opval;
55552082 1771 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1772 }
1773
1774 return vpc;
1775#undef FLD
1776}
1777
1778/* mvtachi: mvtachi $src1 */
1779
96baa820 1780static SEM_PC
c906108c
SS
1781SEM_FN_NAME (m32rbf,mvtachi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1782{
96baa820 1783#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1784 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1785 int UNUSED written = 0;
1786 IADDR UNUSED pc = abuf->addr;
1787 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1788
1789 {
1790 DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (i_src1)), 32));
1791 SET_H_ACCUM (opval);
1792 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1793 }
1794
1795 return vpc;
1796#undef FLD
1797}
1798
1799/* mvtaclo: mvtaclo $src1 */
1800
96baa820 1801static SEM_PC
c906108c
SS
1802SEM_FN_NAME (m32rbf,mvtaclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1803{
96baa820 1804#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
1805 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1806 int UNUSED written = 0;
1807 IADDR UNUSED pc = abuf->addr;
1808 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1809
1810 {
1811 DI opval = ORDI (ANDDI (GET_H_ACCUM (), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (i_src1)));
1812 SET_H_ACCUM (opval);
1813 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1814 }
1815
1816 return vpc;
1817#undef FLD
1818}
1819
1820/* mvtc: mvtc $sr,$dcr */
1821
96baa820 1822static SEM_PC
c906108c
SS
1823SEM_FN_NAME (m32rbf,mvtc) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1824{
de8f5985 1825#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1826 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1827 int UNUSED written = 0;
1828 IADDR UNUSED pc = abuf->addr;
1829 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1830
1831 {
1832 USI opval = * FLD (i_sr);
1833 SET_H_CR (FLD (f_r1), opval);
55552082 1834 TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
c906108c
SS
1835 }
1836
1837 return vpc;
1838#undef FLD
1839}
1840
1841/* neg: neg $dr,$sr */
1842
96baa820 1843static SEM_PC
c906108c
SS
1844SEM_FN_NAME (m32rbf,neg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1845{
96baa820 1846#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1847 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1848 int UNUSED written = 0;
1849 IADDR UNUSED pc = abuf->addr;
1850 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1851
1852 {
1853 SI opval = NEGSI (* FLD (i_sr));
1854 * FLD (i_dr) = opval;
55552082 1855 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1856 }
1857
1858 return vpc;
1859#undef FLD
1860}
1861
1862/* nop: nop */
1863
96baa820 1864static SEM_PC
c906108c
SS
1865SEM_FN_NAME (m32rbf,nop) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1866{
2310652a 1867#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
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);
1872
1873PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
1874
1875 return vpc;
1876#undef FLD
1877}
1878
1879/* not: not $dr,$sr */
1880
96baa820 1881static SEM_PC
c906108c
SS
1882SEM_FN_NAME (m32rbf,not) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1883{
96baa820 1884#define FLD(f) abuf->fields.sfmt_ld_plus.f
c906108c
SS
1885 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1886 int UNUSED written = 0;
1887 IADDR UNUSED pc = abuf->addr;
1888 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1889
1890 {
1891 SI opval = INVSI (* FLD (i_sr));
1892 * FLD (i_dr) = opval;
55552082 1893 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
1894 }
1895
1896 return vpc;
1897#undef FLD
1898}
1899
1900/* rac: rac */
1901
96baa820 1902static SEM_PC
c906108c
SS
1903SEM_FN_NAME (m32rbf,rac) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1904{
2310652a 1905#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
1906 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1907 int UNUSED written = 0;
1908 IADDR UNUSED pc = abuf->addr;
1909 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1910
7a292a7a 1911{
c906108c
SS
1912 DI tmp_tmp1;
1913 tmp_tmp1 = SLLDI (GET_H_ACCUM (), 1);
1914 tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
1915 {
1916 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)));
1917 SET_H_ACCUM (opval);
1918 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1919 }
7a292a7a 1920}
c906108c
SS
1921
1922 return vpc;
1923#undef FLD
1924}
1925
1926/* rach: rach */
1927
96baa820 1928static SEM_PC
c906108c
SS
1929SEM_FN_NAME (m32rbf,rach) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1930{
2310652a 1931#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
1932 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1933 int UNUSED written = 0;
1934 IADDR UNUSED pc = abuf->addr;
1935 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1936
7a292a7a 1937{
c906108c
SS
1938 DI tmp_tmp1;
1939 tmp_tmp1 = ANDDI (GET_H_ACCUM (), MAKEDI (16777215, 0xffffffff));
1940if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
1941 tmp_tmp1 = MAKEDI (16383, 0x80000000);
1942} else {
1943if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
1944 tmp_tmp1 = MAKEDI (16760832, 0);
1945} else {
1946 tmp_tmp1 = ANDDI (ADDDI (GET_H_ACCUM (), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
1947}
1948}
1949 tmp_tmp1 = SLLDI (tmp_tmp1, 1);
1950 {
1951 DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7);
1952 SET_H_ACCUM (opval);
1953 TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1954 }
7a292a7a 1955}
c906108c
SS
1956
1957 return vpc;
1958#undef FLD
1959}
1960
1961/* rte: rte */
1962
96baa820 1963static SEM_PC
c906108c
SS
1964SEM_FN_NAME (m32rbf,rte) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1965{
2310652a 1966#define FLD(f) abuf->fields.sfmt_empty.f
c906108c
SS
1967 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1968 int UNUSED written = 0;
1969 IADDR UNUSED pc = abuf->addr;
1970 SEM_BRANCH_INIT
1971 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1972
7a292a7a 1973{
c906108c
SS
1974 {
1975 USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
1976 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1977 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1978 }
1979 {
1980 USI opval = GET_H_CR (((UINT) 14));
1981 SET_H_CR (((UINT) 6), opval);
55552082 1982 TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
c906108c
SS
1983 }
1984 {
1985 UQI opval = CPU (h_bpsw);
1986 SET_H_PSW (opval);
7a292a7a 1987 TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
c906108c
SS
1988 }
1989 {
1990 UQI opval = CPU (h_bbpsw);
1991 CPU (h_bpsw) = opval;
7a292a7a 1992 TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
c906108c 1993 }
7a292a7a 1994}
c906108c
SS
1995
1996 SEM_BRANCH_FINI (vpc);
1997 return vpc;
1998#undef FLD
1999}
2000
2001/* seth: seth $dr,$hash$hi16 */
2002
96baa820 2003static SEM_PC
c906108c
SS
2004SEM_FN_NAME (m32rbf,seth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2005{
96baa820 2006#define FLD(f) abuf->fields.sfmt_seth.f
c906108c
SS
2007 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2008 int UNUSED written = 0;
2009 IADDR UNUSED pc = abuf->addr;
2010 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2011
2012 {
2013 SI opval = SLLSI (FLD (f_hi16), 16);
2014 * FLD (i_dr) = opval;
55552082 2015 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2016 }
2017
2018 return vpc;
2019#undef FLD
2020}
2021
2022/* sll: sll $dr,$sr */
2023
96baa820 2024static SEM_PC
c906108c
SS
2025SEM_FN_NAME (m32rbf,sll) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2026{
96baa820 2027#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
2028 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2029 int UNUSED written = 0;
2030 IADDR UNUSED pc = abuf->addr;
2031 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2032
2033 {
2034 SI opval = SLLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2035 * FLD (i_dr) = opval;
55552082 2036 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2037 }
2038
2039 return vpc;
2040#undef FLD
2041}
2042
2043/* sll3: sll3 $dr,$sr,$simm16 */
2044
96baa820 2045static SEM_PC
c906108c
SS
2046SEM_FN_NAME (m32rbf,sll3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2047{
96baa820 2048#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
2049 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2050 int UNUSED written = 0;
2051 IADDR UNUSED pc = abuf->addr;
2052 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2053
2054 {
2055 SI opval = SLLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2056 * FLD (i_dr) = opval;
55552082 2057 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2058 }
2059
2060 return vpc;
2061#undef FLD
2062}
2063
2064/* slli: slli $dr,$uimm5 */
2065
96baa820 2066static SEM_PC
c906108c
SS
2067SEM_FN_NAME (m32rbf,slli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2068{
96baa820 2069#define FLD(f) abuf->fields.sfmt_slli.f
c906108c
SS
2070 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2071 int UNUSED written = 0;
2072 IADDR UNUSED pc = abuf->addr;
2073 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2074
2075 {
2076 SI opval = SLLSI (* FLD (i_dr), FLD (f_uimm5));
2077 * FLD (i_dr) = opval;
55552082 2078 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2079 }
2080
2081 return vpc;
2082#undef FLD
2083}
2084
2085/* sra: sra $dr,$sr */
2086
96baa820 2087static SEM_PC
c906108c
SS
2088SEM_FN_NAME (m32rbf,sra) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2089{
96baa820 2090#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
2091 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2092 int UNUSED written = 0;
2093 IADDR UNUSED pc = abuf->addr;
2094 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2095
2096 {
2097 SI opval = SRASI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2098 * FLD (i_dr) = opval;
55552082 2099 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2100 }
2101
2102 return vpc;
2103#undef FLD
2104}
2105
2106/* sra3: sra3 $dr,$sr,$simm16 */
2107
96baa820 2108static SEM_PC
c906108c
SS
2109SEM_FN_NAME (m32rbf,sra3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2110{
96baa820 2111#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
2112 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2113 int UNUSED written = 0;
2114 IADDR UNUSED pc = abuf->addr;
2115 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2116
2117 {
2118 SI opval = SRASI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2119 * FLD (i_dr) = opval;
55552082 2120 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2121 }
2122
2123 return vpc;
2124#undef FLD
2125}
2126
2127/* srai: srai $dr,$uimm5 */
2128
96baa820 2129static SEM_PC
c906108c
SS
2130SEM_FN_NAME (m32rbf,srai) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2131{
96baa820 2132#define FLD(f) abuf->fields.sfmt_slli.f
c906108c
SS
2133 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2134 int UNUSED written = 0;
2135 IADDR UNUSED pc = abuf->addr;
2136 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2137
2138 {
2139 SI opval = SRASI (* FLD (i_dr), FLD (f_uimm5));
2140 * FLD (i_dr) = opval;
55552082 2141 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2142 }
2143
2144 return vpc;
2145#undef FLD
2146}
2147
2148/* srl: srl $dr,$sr */
2149
96baa820 2150static SEM_PC
c906108c
SS
2151SEM_FN_NAME (m32rbf,srl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2152{
96baa820 2153#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
2154 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2155 int UNUSED written = 0;
2156 IADDR UNUSED pc = abuf->addr;
2157 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2158
2159 {
2160 SI opval = SRLSI (* FLD (i_dr), ANDSI (* FLD (i_sr), 31));
2161 * FLD (i_dr) = opval;
55552082 2162 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2163 }
2164
2165 return vpc;
2166#undef FLD
2167}
2168
2169/* srl3: srl3 $dr,$sr,$simm16 */
2170
96baa820 2171static SEM_PC
c906108c
SS
2172SEM_FN_NAME (m32rbf,srl3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2173{
96baa820 2174#define FLD(f) abuf->fields.sfmt_add3.f
c906108c
SS
2175 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2176 int UNUSED written = 0;
2177 IADDR UNUSED pc = abuf->addr;
2178 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2179
2180 {
2181 SI opval = SRLSI (* FLD (i_sr), ANDSI (FLD (f_simm16), 31));
2182 * FLD (i_dr) = opval;
55552082 2183 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2184 }
2185
2186 return vpc;
2187#undef FLD
2188}
2189
2190/* srli: srli $dr,$uimm5 */
2191
96baa820 2192static SEM_PC
c906108c
SS
2193SEM_FN_NAME (m32rbf,srli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2194{
96baa820 2195#define FLD(f) abuf->fields.sfmt_slli.f
c906108c
SS
2196 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2197 int UNUSED written = 0;
2198 IADDR UNUSED pc = abuf->addr;
2199 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2200
2201 {
2202 SI opval = SRLSI (* FLD (i_dr), FLD (f_uimm5));
2203 * FLD (i_dr) = opval;
55552082 2204 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2205 }
2206
2207 return vpc;
2208#undef FLD
2209}
2210
2211/* st: st $src1,@$src2 */
2212
96baa820 2213static SEM_PC
c906108c
SS
2214SEM_FN_NAME (m32rbf,st) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2215{
96baa820 2216#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
2217 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2218 int UNUSED written = 0;
2219 IADDR UNUSED pc = abuf->addr;
2220 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2221
2222 {
2223 SI opval = * FLD (i_src1);
2224 SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2225 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2226 }
2227
2228 return vpc;
2229#undef FLD
2230}
2231
2232/* st-d: st $src1,@($slo16,$src2) */
2233
96baa820 2234static SEM_PC
c906108c
SS
2235SEM_FN_NAME (m32rbf,st_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2236{
96baa820 2237#define FLD(f) abuf->fields.sfmt_st_d.f
c906108c
SS
2238 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2239 int UNUSED written = 0;
2240 IADDR UNUSED pc = abuf->addr;
2241 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2242
2243 {
2244 SI opval = * FLD (i_src1);
2245 SETMEMSI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2246 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2247 }
2248
2249 return vpc;
2250#undef FLD
2251}
2252
2253/* stb: stb $src1,@$src2 */
2254
96baa820 2255static SEM_PC
c906108c
SS
2256SEM_FN_NAME (m32rbf,stb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2257{
96baa820 2258#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
2259 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2260 int UNUSED written = 0;
2261 IADDR UNUSED pc = abuf->addr;
2262 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2263
2264 {
2265 QI opval = * FLD (i_src1);
2266 SETMEMQI (current_cpu, pc, * FLD (i_src2), opval);
2267 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2268 }
2269
2270 return vpc;
2271#undef FLD
2272}
2273
2274/* stb-d: stb $src1,@($slo16,$src2) */
2275
96baa820 2276static SEM_PC
c906108c
SS
2277SEM_FN_NAME (m32rbf,stb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2278{
96baa820 2279#define FLD(f) abuf->fields.sfmt_st_d.f
c906108c
SS
2280 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2281 int UNUSED written = 0;
2282 IADDR UNUSED pc = abuf->addr;
2283 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2284
2285 {
2286 QI opval = * FLD (i_src1);
2287 SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2288 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2289 }
2290
2291 return vpc;
2292#undef FLD
2293}
2294
2295/* sth: sth $src1,@$src2 */
2296
96baa820 2297static SEM_PC
c906108c
SS
2298SEM_FN_NAME (m32rbf,sth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2299{
96baa820 2300#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
2301 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2302 int UNUSED written = 0;
2303 IADDR UNUSED pc = abuf->addr;
2304 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2305
2306 {
2307 HI opval = * FLD (i_src1);
2308 SETMEMHI (current_cpu, pc, * FLD (i_src2), opval);
2309 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2310 }
2311
2312 return vpc;
2313#undef FLD
2314}
2315
2316/* sth-d: sth $src1,@($slo16,$src2) */
2317
96baa820 2318static SEM_PC
c906108c
SS
2319SEM_FN_NAME (m32rbf,sth_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2320{
96baa820 2321#define FLD(f) abuf->fields.sfmt_st_d.f
c906108c
SS
2322 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2323 int UNUSED written = 0;
2324 IADDR UNUSED pc = abuf->addr;
2325 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2326
2327 {
2328 HI opval = * FLD (i_src1);
2329 SETMEMHI (current_cpu, pc, ADDSI (* FLD (i_src2), FLD (f_simm16)), opval);
2330 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2331 }
2332
2333 return vpc;
2334#undef FLD
2335}
2336
2337/* st-plus: st $src1,@+$src2 */
2338
96baa820 2339static SEM_PC
c906108c
SS
2340SEM_FN_NAME (m32rbf,st_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2341{
96baa820 2342#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
2343 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2344 int UNUSED written = 0;
2345 IADDR UNUSED pc = abuf->addr;
2346 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2347
7a292a7a 2348{
c906108c
SS
2349 SI tmp_new_src2;
2350 tmp_new_src2 = ADDSI (* FLD (i_src2), 4);
2351 {
2352 SI opval = * FLD (i_src1);
2353 SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2354 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2355 }
2356 {
2357 SI opval = tmp_new_src2;
2358 * FLD (i_src2) = opval;
55552082 2359 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c 2360 }
7a292a7a 2361}
c906108c
SS
2362
2363 return vpc;
2364#undef FLD
2365}
2366
2367/* st-minus: st $src1,@-$src2 */
2368
96baa820 2369static SEM_PC
c906108c
SS
2370SEM_FN_NAME (m32rbf,st_minus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2371{
96baa820 2372#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
2373 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2374 int UNUSED written = 0;
2375 IADDR UNUSED pc = abuf->addr;
2376 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2377
7a292a7a 2378{
c906108c
SS
2379 SI tmp_new_src2;
2380 tmp_new_src2 = SUBSI (* FLD (i_src2), 4);
2381 {
2382 SI opval = * FLD (i_src1);
2383 SETMEMSI (current_cpu, pc, tmp_new_src2, opval);
2384 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2385 }
2386 {
2387 SI opval = tmp_new_src2;
2388 * FLD (i_src2) = opval;
55552082 2389 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c 2390 }
7a292a7a 2391}
c906108c
SS
2392
2393 return vpc;
2394#undef FLD
2395}
2396
2397/* sub: sub $dr,$sr */
2398
96baa820 2399static SEM_PC
c906108c
SS
2400SEM_FN_NAME (m32rbf,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2401{
96baa820 2402#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
2403 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2404 int UNUSED written = 0;
2405 IADDR UNUSED pc = abuf->addr;
2406 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2407
2408 {
2409 SI opval = SUBSI (* FLD (i_dr), * FLD (i_sr));
2410 * FLD (i_dr) = opval;
55552082 2411 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2412 }
2413
2414 return vpc;
2415#undef FLD
2416}
2417
2418/* subv: subv $dr,$sr */
2419
96baa820 2420static SEM_PC
c906108c
SS
2421SEM_FN_NAME (m32rbf,subv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2422{
96baa820 2423#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
2424 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2425 int UNUSED written = 0;
2426 IADDR UNUSED pc = abuf->addr;
2427 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2428
7a292a7a
SS
2429{
2430 SI temp0;BI temp1;
c906108c
SS
2431 temp0 = SUBSI (* FLD (i_dr), * FLD (i_sr));
2432 temp1 = SUBOFSI (* FLD (i_dr), * FLD (i_sr), 0);
2433 {
2434 SI opval = temp0;
2435 * FLD (i_dr) = opval;
55552082 2436 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2437 }
2438 {
2439 BI opval = temp1;
2440 CPU (h_cond) = opval;
55552082 2441 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c 2442 }
7a292a7a 2443}
c906108c
SS
2444
2445 return vpc;
2446#undef FLD
2447}
2448
2449/* subx: subx $dr,$sr */
2450
96baa820 2451static SEM_PC
c906108c
SS
2452SEM_FN_NAME (m32rbf,subx) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2453{
96baa820 2454#define FLD(f) abuf->fields.sfmt_add.f
c906108c
SS
2455 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2456 int UNUSED written = 0;
2457 IADDR UNUSED pc = abuf->addr;
2458 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2459
7a292a7a
SS
2460{
2461 SI temp0;BI temp1;
c906108c
SS
2462 temp0 = SUBCSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
2463 temp1 = SUBCFSI (* FLD (i_dr), * FLD (i_sr), CPU (h_cond));
2464 {
2465 SI opval = temp0;
2466 * FLD (i_dr) = opval;
55552082 2467 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
c906108c
SS
2468 }
2469 {
2470 BI opval = temp1;
2471 CPU (h_cond) = opval;
55552082 2472 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
c906108c 2473 }
7a292a7a 2474}
c906108c
SS
2475
2476 return vpc;
2477#undef FLD
2478}
2479
2480/* trap: trap $uimm4 */
2481
96baa820 2482static SEM_PC
c906108c
SS
2483SEM_FN_NAME (m32rbf,trap) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2484{
96baa820 2485#define FLD(f) abuf->fields.sfmt_trap.f
c906108c
SS
2486 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2487 int UNUSED written = 0;
2488 IADDR UNUSED pc = abuf->addr;
2489 SEM_BRANCH_INIT
2490 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2491
7a292a7a 2492{
c906108c
SS
2493 {
2494 USI opval = GET_H_CR (((UINT) 6));
2495 SET_H_CR (((UINT) 14), opval);
55552082 2496 TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
c906108c
SS
2497 }
2498 {
2499 USI opval = ADDSI (pc, 4);
2500 SET_H_CR (((UINT) 6), opval);
55552082 2501 TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
c906108c
SS
2502 }
2503 {
2504 UQI opval = CPU (h_bpsw);
2505 CPU (h_bbpsw) = opval;
7a292a7a 2506 TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
c906108c
SS
2507 }
2508 {
2509 UQI opval = GET_H_PSW ();
2510 CPU (h_bpsw) = opval;
7a292a7a 2511 TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
c906108c
SS
2512 }
2513 {
2514 UQI opval = ANDQI (GET_H_PSW (), 128);
2515 SET_H_PSW (opval);
7a292a7a 2516 TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
c906108c
SS
2517 }
2518 {
2519 SI opval = m32r_trap (current_cpu, pc, FLD (f_uimm4));
2520 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2521 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
2522 }
7a292a7a 2523}
c906108c
SS
2524
2525 SEM_BRANCH_FINI (vpc);
2526 return vpc;
2527#undef FLD
2528}
2529
2530/* unlock: unlock $src1,@$src2 */
2531
96baa820 2532static SEM_PC
c906108c
SS
2533SEM_FN_NAME (m32rbf,unlock) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2534{
96baa820 2535#define FLD(f) abuf->fields.sfmt_st_plus.f
c906108c
SS
2536 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2537 int UNUSED written = 0;
2538 IADDR UNUSED pc = abuf->addr;
2539 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2540
7a292a7a 2541{
c906108c
SS
2542if (CPU (h_lock)) {
2543 {
2544 SI opval = * FLD (i_src1);
2545 SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2546 written |= (1 << 4);
2547 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2548 }
2549}
2550 {
2551 BI opval = 0;
2552 CPU (h_lock) = opval;
7a292a7a 2553 TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
c906108c 2554 }
7a292a7a 2555}
c906108c
SS
2556
2557 abuf->written = written;
2558 return vpc;
2559#undef FLD
2560}
2561
16b47b25
NC
2562/* clrpsw: clrpsw $uimm8 */
2563
2564static SEM_PC
2565SEM_FN_NAME (m32rbf,clrpsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2566{
2567#define FLD(f) abuf->fields.sfmt_clrpsw.f
2568 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2569 int UNUSED written = 0;
2570 IADDR UNUSED pc = abuf->addr;
2571 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2572
2573 {
e9c60591 2574 USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
16b47b25
NC
2575 SET_H_CR (((UINT) 0), opval);
2576 TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2577 }
2578
2579 return vpc;
2580#undef FLD
2581}
2582
2583/* setpsw: setpsw $uimm8 */
2584
2585static SEM_PC
2586SEM_FN_NAME (m32rbf,setpsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2587{
2588#define FLD(f) abuf->fields.sfmt_clrpsw.f
2589 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2590 int UNUSED written = 0;
2591 IADDR UNUSED pc = abuf->addr;
2592 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2593
2594 {
e9c60591 2595 USI opval = FLD (f_uimm8);
16b47b25
NC
2596 SET_H_CR (((UINT) 0), opval);
2597 TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2598 }
2599
2600 return vpc;
2601#undef FLD
2602}
2603
2604/* bset: bset $uimm3,@($slo16,$sr) */
2605
2606static SEM_PC
2607SEM_FN_NAME (m32rbf,bset) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2608{
2609#define FLD(f) abuf->fields.sfmt_bset.f
2610 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2611 int UNUSED written = 0;
2612 IADDR UNUSED pc = abuf->addr;
2613 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2614
2615 {
e9c60591 2616 QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLQI (1, SUBSI (7, FLD (f_uimm3))));
16b47b25
NC
2617 SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
2618 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2619 }
2620
2621 return vpc;
2622#undef FLD
2623}
2624
2625/* bclr: bclr $uimm3,@($slo16,$sr) */
2626
2627static SEM_PC
2628SEM_FN_NAME (m32rbf,bclr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2629{
2630#define FLD(f) abuf->fields.sfmt_bset.f
2631 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2632 int UNUSED written = 0;
2633 IADDR UNUSED pc = abuf->addr;
2634 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2635
2636 {
e9c60591 2637 QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLQI (1, SUBSI (7, FLD (f_uimm3)))));
16b47b25
NC
2638 SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
2639 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2640 }
2641
2642 return vpc;
2643#undef FLD
2644}
2645
2646/* btst: btst $uimm3,$sr */
2647
2648static SEM_PC
2649SEM_FN_NAME (m32rbf,btst) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2650{
2651#define FLD(f) abuf->fields.sfmt_bset.f
2652 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2653 int UNUSED written = 0;
2654 IADDR UNUSED pc = abuf->addr;
2655 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2656
2657 {
e9c60591 2658 BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
16b47b25
NC
2659 CPU (h_cond) = opval;
2660 TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
2661 }
2662
2663 return vpc;
2664#undef FLD
2665}
2666
96baa820
JM
2667/* Table of all semantic fns. */
2668
2669static const struct sem_fn_desc sem_fns[] = {
2670 { M32RBF_INSN_X_INVALID, SEM_FN_NAME (m32rbf,x_invalid) },
2671 { M32RBF_INSN_X_AFTER, SEM_FN_NAME (m32rbf,x_after) },
2672 { M32RBF_INSN_X_BEFORE, SEM_FN_NAME (m32rbf,x_before) },
2673 { M32RBF_INSN_X_CTI_CHAIN, SEM_FN_NAME (m32rbf,x_cti_chain) },
2674 { M32RBF_INSN_X_CHAIN, SEM_FN_NAME (m32rbf,x_chain) },
2675 { M32RBF_INSN_X_BEGIN, SEM_FN_NAME (m32rbf,x_begin) },
2676 { M32RBF_INSN_ADD, SEM_FN_NAME (m32rbf,add) },
2677 { M32RBF_INSN_ADD3, SEM_FN_NAME (m32rbf,add3) },
2678 { M32RBF_INSN_AND, SEM_FN_NAME (m32rbf,and) },
2679 { M32RBF_INSN_AND3, SEM_FN_NAME (m32rbf,and3) },
2680 { M32RBF_INSN_OR, SEM_FN_NAME (m32rbf,or) },
2681 { M32RBF_INSN_OR3, SEM_FN_NAME (m32rbf,or3) },
2682 { M32RBF_INSN_XOR, SEM_FN_NAME (m32rbf,xor) },
2683 { M32RBF_INSN_XOR3, SEM_FN_NAME (m32rbf,xor3) },
2684 { M32RBF_INSN_ADDI, SEM_FN_NAME (m32rbf,addi) },
2685 { M32RBF_INSN_ADDV, SEM_FN_NAME (m32rbf,addv) },
2686 { M32RBF_INSN_ADDV3, SEM_FN_NAME (m32rbf,addv3) },
2687 { M32RBF_INSN_ADDX, SEM_FN_NAME (m32rbf,addx) },
2688 { M32RBF_INSN_BC8, SEM_FN_NAME (m32rbf,bc8) },
2689 { M32RBF_INSN_BC24, SEM_FN_NAME (m32rbf,bc24) },
2690 { M32RBF_INSN_BEQ, SEM_FN_NAME (m32rbf,beq) },
2691 { M32RBF_INSN_BEQZ, SEM_FN_NAME (m32rbf,beqz) },
2692 { M32RBF_INSN_BGEZ, SEM_FN_NAME (m32rbf,bgez) },
2693 { M32RBF_INSN_BGTZ, SEM_FN_NAME (m32rbf,bgtz) },
2694 { M32RBF_INSN_BLEZ, SEM_FN_NAME (m32rbf,blez) },
2695 { M32RBF_INSN_BLTZ, SEM_FN_NAME (m32rbf,bltz) },
2696 { M32RBF_INSN_BNEZ, SEM_FN_NAME (m32rbf,bnez) },
2697 { M32RBF_INSN_BL8, SEM_FN_NAME (m32rbf,bl8) },
2698 { M32RBF_INSN_BL24, SEM_FN_NAME (m32rbf,bl24) },
2699 { M32RBF_INSN_BNC8, SEM_FN_NAME (m32rbf,bnc8) },
2700 { M32RBF_INSN_BNC24, SEM_FN_NAME (m32rbf,bnc24) },
2701 { M32RBF_INSN_BNE, SEM_FN_NAME (m32rbf,bne) },
2702 { M32RBF_INSN_BRA8, SEM_FN_NAME (m32rbf,bra8) },
2703 { M32RBF_INSN_BRA24, SEM_FN_NAME (m32rbf,bra24) },
2704 { M32RBF_INSN_CMP, SEM_FN_NAME (m32rbf,cmp) },
2705 { M32RBF_INSN_CMPI, SEM_FN_NAME (m32rbf,cmpi) },
2706 { M32RBF_INSN_CMPU, SEM_FN_NAME (m32rbf,cmpu) },
2707 { M32RBF_INSN_CMPUI, SEM_FN_NAME (m32rbf,cmpui) },
2708 { M32RBF_INSN_DIV, SEM_FN_NAME (m32rbf,div) },
2709 { M32RBF_INSN_DIVU, SEM_FN_NAME (m32rbf,divu) },
2710 { M32RBF_INSN_REM, SEM_FN_NAME (m32rbf,rem) },
2711 { M32RBF_INSN_REMU, SEM_FN_NAME (m32rbf,remu) },
2712 { M32RBF_INSN_JL, SEM_FN_NAME (m32rbf,jl) },
2713 { M32RBF_INSN_JMP, SEM_FN_NAME (m32rbf,jmp) },
2714 { M32RBF_INSN_LD, SEM_FN_NAME (m32rbf,ld) },
2715 { M32RBF_INSN_LD_D, SEM_FN_NAME (m32rbf,ld_d) },
2716 { M32RBF_INSN_LDB, SEM_FN_NAME (m32rbf,ldb) },
2717 { M32RBF_INSN_LDB_D, SEM_FN_NAME (m32rbf,ldb_d) },
2718 { M32RBF_INSN_LDH, SEM_FN_NAME (m32rbf,ldh) },
2719 { M32RBF_INSN_LDH_D, SEM_FN_NAME (m32rbf,ldh_d) },
2720 { M32RBF_INSN_LDUB, SEM_FN_NAME (m32rbf,ldub) },
2721 { M32RBF_INSN_LDUB_D, SEM_FN_NAME (m32rbf,ldub_d) },
2722 { M32RBF_INSN_LDUH, SEM_FN_NAME (m32rbf,lduh) },
2723 { M32RBF_INSN_LDUH_D, SEM_FN_NAME (m32rbf,lduh_d) },
2724 { M32RBF_INSN_LD_PLUS, SEM_FN_NAME (m32rbf,ld_plus) },
2725 { M32RBF_INSN_LD24, SEM_FN_NAME (m32rbf,ld24) },
2726 { M32RBF_INSN_LDI8, SEM_FN_NAME (m32rbf,ldi8) },
2727 { M32RBF_INSN_LDI16, SEM_FN_NAME (m32rbf,ldi16) },
2728 { M32RBF_INSN_LOCK, SEM_FN_NAME (m32rbf,lock) },
2729 { M32RBF_INSN_MACHI, SEM_FN_NAME (m32rbf,machi) },
2730 { M32RBF_INSN_MACLO, SEM_FN_NAME (m32rbf,maclo) },
2731 { M32RBF_INSN_MACWHI, SEM_FN_NAME (m32rbf,macwhi) },
2732 { M32RBF_INSN_MACWLO, SEM_FN_NAME (m32rbf,macwlo) },
2733 { M32RBF_INSN_MUL, SEM_FN_NAME (m32rbf,mul) },
2734 { M32RBF_INSN_MULHI, SEM_FN_NAME (m32rbf,mulhi) },
2735 { M32RBF_INSN_MULLO, SEM_FN_NAME (m32rbf,mullo) },
2736 { M32RBF_INSN_MULWHI, SEM_FN_NAME (m32rbf,mulwhi) },
2737 { M32RBF_INSN_MULWLO, SEM_FN_NAME (m32rbf,mulwlo) },
2738 { M32RBF_INSN_MV, SEM_FN_NAME (m32rbf,mv) },
2739 { M32RBF_INSN_MVFACHI, SEM_FN_NAME (m32rbf,mvfachi) },
2740 { M32RBF_INSN_MVFACLO, SEM_FN_NAME (m32rbf,mvfaclo) },
2741 { M32RBF_INSN_MVFACMI, SEM_FN_NAME (m32rbf,mvfacmi) },
2742 { M32RBF_INSN_MVFC, SEM_FN_NAME (m32rbf,mvfc) },
2743 { M32RBF_INSN_MVTACHI, SEM_FN_NAME (m32rbf,mvtachi) },
2744 { M32RBF_INSN_MVTACLO, SEM_FN_NAME (m32rbf,mvtaclo) },
2745 { M32RBF_INSN_MVTC, SEM_FN_NAME (m32rbf,mvtc) },
2746 { M32RBF_INSN_NEG, SEM_FN_NAME (m32rbf,neg) },
2747 { M32RBF_INSN_NOP, SEM_FN_NAME (m32rbf,nop) },
2748 { M32RBF_INSN_NOT, SEM_FN_NAME (m32rbf,not) },
2749 { M32RBF_INSN_RAC, SEM_FN_NAME (m32rbf,rac) },
2750 { M32RBF_INSN_RACH, SEM_FN_NAME (m32rbf,rach) },
2751 { M32RBF_INSN_RTE, SEM_FN_NAME (m32rbf,rte) },
2752 { M32RBF_INSN_SETH, SEM_FN_NAME (m32rbf,seth) },
2753 { M32RBF_INSN_SLL, SEM_FN_NAME (m32rbf,sll) },
2754 { M32RBF_INSN_SLL3, SEM_FN_NAME (m32rbf,sll3) },
2755 { M32RBF_INSN_SLLI, SEM_FN_NAME (m32rbf,slli) },
2756 { M32RBF_INSN_SRA, SEM_FN_NAME (m32rbf,sra) },
2757 { M32RBF_INSN_SRA3, SEM_FN_NAME (m32rbf,sra3) },
2758 { M32RBF_INSN_SRAI, SEM_FN_NAME (m32rbf,srai) },
2759 { M32RBF_INSN_SRL, SEM_FN_NAME (m32rbf,srl) },
2760 { M32RBF_INSN_SRL3, SEM_FN_NAME (m32rbf,srl3) },
2761 { M32RBF_INSN_SRLI, SEM_FN_NAME (m32rbf,srli) },
2762 { M32RBF_INSN_ST, SEM_FN_NAME (m32rbf,st) },
2763 { M32RBF_INSN_ST_D, SEM_FN_NAME (m32rbf,st_d) },
2764 { M32RBF_INSN_STB, SEM_FN_NAME (m32rbf,stb) },
2765 { M32RBF_INSN_STB_D, SEM_FN_NAME (m32rbf,stb_d) },
2766 { M32RBF_INSN_STH, SEM_FN_NAME (m32rbf,sth) },
2767 { M32RBF_INSN_STH_D, SEM_FN_NAME (m32rbf,sth_d) },
2768 { M32RBF_INSN_ST_PLUS, SEM_FN_NAME (m32rbf,st_plus) },
2769 { M32RBF_INSN_ST_MINUS, SEM_FN_NAME (m32rbf,st_minus) },
2770 { M32RBF_INSN_SUB, SEM_FN_NAME (m32rbf,sub) },
2771 { M32RBF_INSN_SUBV, SEM_FN_NAME (m32rbf,subv) },
2772 { M32RBF_INSN_SUBX, SEM_FN_NAME (m32rbf,subx) },
2773 { M32RBF_INSN_TRAP, SEM_FN_NAME (m32rbf,trap) },
2774 { M32RBF_INSN_UNLOCK, SEM_FN_NAME (m32rbf,unlock) },
16b47b25
NC
2775 { M32RBF_INSN_CLRPSW, SEM_FN_NAME (m32rbf,clrpsw) },
2776 { M32RBF_INSN_SETPSW, SEM_FN_NAME (m32rbf,setpsw) },
2777 { M32RBF_INSN_BSET, SEM_FN_NAME (m32rbf,bset) },
2778 { M32RBF_INSN_BCLR, SEM_FN_NAME (m32rbf,bclr) },
2779 { M32RBF_INSN_BTST, SEM_FN_NAME (m32rbf,btst) },
96baa820
JM
2780 { 0, 0 }
2781};
2782
2783/* Add the semantic fns to IDESC_TABLE. */
2784
2785void
2786SEM_FN_NAME (m32rbf,init_idesc_table) (SIM_CPU *current_cpu)
2787{
2788 IDESC *idesc_table = CPU_IDESC (current_cpu);
2789 const struct sem_fn_desc *sf;
104c1213 2790 int mach_num = MACH_NUM (CPU_MACH (current_cpu));
96baa820
JM
2791
2792 for (sf = &sem_fns[0]; sf->fn != 0; ++sf)
2793 {
2acceee2
JM
2794 const CGEN_INSN *insn = idesc_table[sf->index].idata;
2795 int valid_p = (CGEN_INSN_VIRTUAL_P (insn)
2796 || CGEN_INSN_MACH_HAS_P (insn, mach_num));
96baa820 2797#if FAST_P
104c1213
JM
2798 if (valid_p)
2799 idesc_table[sf->index].sem_fast = sf->fn;
2800 else
2801 idesc_table[sf->index].sem_fast = SEM_FN_NAME (m32rbf,x_invalid);
96baa820 2802#else
104c1213
JM
2803 if (valid_p)
2804 idesc_table[sf->index].sem_full = sf->fn;
2805 else
2806 idesc_table[sf->index].sem_full = SEM_FN_NAME (m32rbf,x_invalid);
96baa820
JM
2807#endif
2808 }
2809}
2810
This page took 0.634365 seconds and 4 git commands to generate.