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