]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/m32r/sem.c
56cc2fca76153b9f297e2b78ec483c08b8a5e4c5
[thirdparty/binutils-gdb.git] / sim / m32r / sem.c
1 /* Simulator instruction semantics for m32rbf.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996-2016 Free Software Foundation, Inc.
6
7 This file is part of the GNU simulators.
8
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.
13
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.
18
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, see <http://www.gnu.org/licenses/>.
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
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 CGEN_TRACE_RESULT
40 #define CGEN_TRACE_RESULT(cpu, abuf, name, type, val)
41 #else
42 #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
43 #endif
44
45 /* x-invalid: --invalid-- */
46
47 static SEM_PC
48 SEM_FN_NAME (m32rbf,x_invalid) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
49 {
50 #define FLD(f) abuf->fields.sfmt_empty.f
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 {
57 /* Update the recorded pc in the cpu state struct.
58 Only necessary for WITH_SCACHE case, but to avoid the
59 conditional compilation .... */
60 SET_H_PC (pc);
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);
66 }
67
68 return vpc;
69 #undef FLD
70 }
71
72 /* x-after: --after-- */
73
74 static SEM_PC
75 SEM_FN_NAME (m32rbf,x_after) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
76 {
77 #define FLD(f) abuf->fields.sfmt_empty.f
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
95 static SEM_PC
96 SEM_FN_NAME (m32rbf,x_before) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
97 {
98 #define FLD(f) abuf->fields.sfmt_empty.f
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
116 static SEM_PC
117 SEM_FN_NAME (m32rbf,x_cti_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
118 {
119 #define FLD(f) abuf->fields.sfmt_empty.f
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,
129 pbb_br_type, pbb_br_npc);
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,
134 CPU_PBB_BR_TYPE (current_cpu),
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
146 static SEM_PC
147 SEM_FN_NAME (m32rbf,x_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
148 {
149 #define FLD(f) abuf->fields.sfmt_empty.f
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
170 static SEM_PC
171 SEM_FN_NAME (m32rbf,x_begin) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
172 {
173 #define FLD(f) abuf->fields.sfmt_empty.f
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
181 #if defined DEFINE_SWITCH || defined FAST_P
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
186 #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
187 vpc = m32rbf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
188 #else
189 vpc = m32rbf_pbb_begin (current_cpu, 0);
190 #endif
191 #endif
192 #endif
193 }
194
195 return vpc;
196 #undef FLD
197 }
198
199 /* add: add $dr,$sr */
200
201 static SEM_PC
202 SEM_FN_NAME (m32rbf,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
203 {
204 #define FLD(f) abuf->fields.sfmt_add.f
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;
213 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
214 }
215
216 return vpc;
217 #undef FLD
218 }
219
220 /* add3: add3 $dr,$sr,$hash$slo16 */
221
222 static SEM_PC
223 SEM_FN_NAME (m32rbf,add3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
224 {
225 #define FLD(f) abuf->fields.sfmt_add3.f
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;
234 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
235 }
236
237 return vpc;
238 #undef FLD
239 }
240
241 /* and: and $dr,$sr */
242
243 static SEM_PC
244 SEM_FN_NAME (m32rbf,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
245 {
246 #define FLD(f) abuf->fields.sfmt_add.f
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;
255 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
256 }
257
258 return vpc;
259 #undef FLD
260 }
261
262 /* and3: and3 $dr,$sr,$uimm16 */
263
264 static SEM_PC
265 SEM_FN_NAME (m32rbf,and3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
266 {
267 #define FLD(f) abuf->fields.sfmt_and3.f
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;
276 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
277 }
278
279 return vpc;
280 #undef FLD
281 }
282
283 /* or: or $dr,$sr */
284
285 static SEM_PC
286 SEM_FN_NAME (m32rbf,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
287 {
288 #define FLD(f) abuf->fields.sfmt_add.f
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;
297 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
298 }
299
300 return vpc;
301 #undef FLD
302 }
303
304 /* or3: or3 $dr,$sr,$hash$ulo16 */
305
306 static SEM_PC
307 SEM_FN_NAME (m32rbf,or3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
308 {
309 #define FLD(f) abuf->fields.sfmt_and3.f
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;
318 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
319 }
320
321 return vpc;
322 #undef FLD
323 }
324
325 /* xor: xor $dr,$sr */
326
327 static SEM_PC
328 SEM_FN_NAME (m32rbf,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
329 {
330 #define FLD(f) abuf->fields.sfmt_add.f
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;
339 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
340 }
341
342 return vpc;
343 #undef FLD
344 }
345
346 /* xor3: xor3 $dr,$sr,$uimm16 */
347
348 static SEM_PC
349 SEM_FN_NAME (m32rbf,xor3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
350 {
351 #define FLD(f) abuf->fields.sfmt_and3.f
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;
360 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
361 }
362
363 return vpc;
364 #undef FLD
365 }
366
367 /* addi: addi $dr,$simm8 */
368
369 static SEM_PC
370 SEM_FN_NAME (m32rbf,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
371 {
372 #define FLD(f) abuf->fields.sfmt_addi.f
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;
381 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
382 }
383
384 return vpc;
385 #undef FLD
386 }
387
388 /* addv: addv $dr,$sr */
389
390 static SEM_PC
391 SEM_FN_NAME (m32rbf,addv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
392 {
393 #define FLD(f) abuf->fields.sfmt_add.f
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
399 {
400 SI temp0;BI temp1;
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;
406 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
407 }
408 {
409 BI opval = temp1;
410 CPU (h_cond) = opval;
411 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
412 }
413 }
414
415 return vpc;
416 #undef FLD
417 }
418
419 /* addv3: addv3 $dr,$sr,$simm16 */
420
421 static SEM_PC
422 SEM_FN_NAME (m32rbf,addv3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
423 {
424 #define FLD(f) abuf->fields.sfmt_add3.f
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
430 {
431 SI temp0;BI temp1;
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;
437 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
438 }
439 {
440 BI opval = temp1;
441 CPU (h_cond) = opval;
442 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
443 }
444 }
445
446 return vpc;
447 #undef FLD
448 }
449
450 /* addx: addx $dr,$sr */
451
452 static SEM_PC
453 SEM_FN_NAME (m32rbf,addx) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
454 {
455 #define FLD(f) abuf->fields.sfmt_add.f
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
461 {
462 SI temp0;BI temp1;
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;
468 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
469 }
470 {
471 BI opval = temp1;
472 CPU (h_cond) = opval;
473 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
474 }
475 }
476
477 return vpc;
478 #undef FLD
479 }
480
481 /* bc8: bc.s $disp8 */
482
483 static SEM_PC
484 SEM_FN_NAME (m32rbf,bc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
485 {
486 #define FLD(f) abuf->fields.sfmt_bl8.f
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
493 if (CPU (h_cond)) {
494 {
495 USI opval = FLD (i_disp8);
496 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
497 written |= (1 << 2);
498 CGEN_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
510 static SEM_PC
511 SEM_FN_NAME (m32rbf,bc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
512 {
513 #define FLD(f) abuf->fields.sfmt_bl24.f
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
520 if (CPU (h_cond)) {
521 {
522 USI opval = FLD (i_disp24);
523 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
524 written |= (1 << 2);
525 CGEN_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
537 static SEM_PC
538 SEM_FN_NAME (m32rbf,beq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
539 {
540 #define FLD(f) abuf->fields.sfmt_beq.f
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
547 if (EQSI (* FLD (i_src1), * FLD (i_src2))) {
548 {
549 USI opval = FLD (i_disp16);
550 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
551 written |= (1 << 3);
552 CGEN_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
564 static SEM_PC
565 SEM_FN_NAME (m32rbf,beqz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
566 {
567 #define FLD(f) abuf->fields.sfmt_beq.f
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
574 if (EQSI (* FLD (i_src2), 0)) {
575 {
576 USI opval = FLD (i_disp16);
577 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
578 written |= (1 << 2);
579 CGEN_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
591 static SEM_PC
592 SEM_FN_NAME (m32rbf,bgez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
593 {
594 #define FLD(f) abuf->fields.sfmt_beq.f
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
601 if (GESI (* FLD (i_src2), 0)) {
602 {
603 USI opval = FLD (i_disp16);
604 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
605 written |= (1 << 2);
606 CGEN_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
618 static SEM_PC
619 SEM_FN_NAME (m32rbf,bgtz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
620 {
621 #define FLD(f) abuf->fields.sfmt_beq.f
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
628 if (GTSI (* FLD (i_src2), 0)) {
629 {
630 USI opval = FLD (i_disp16);
631 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
632 written |= (1 << 2);
633 CGEN_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
645 static SEM_PC
646 SEM_FN_NAME (m32rbf,blez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
647 {
648 #define FLD(f) abuf->fields.sfmt_beq.f
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
655 if (LESI (* FLD (i_src2), 0)) {
656 {
657 USI opval = FLD (i_disp16);
658 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
659 written |= (1 << 2);
660 CGEN_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
672 static SEM_PC
673 SEM_FN_NAME (m32rbf,bltz) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
674 {
675 #define FLD(f) abuf->fields.sfmt_beq.f
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
682 if (LTSI (* FLD (i_src2), 0)) {
683 {
684 USI opval = FLD (i_disp16);
685 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
686 written |= (1 << 2);
687 CGEN_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
699 static SEM_PC
700 SEM_FN_NAME (m32rbf,bnez) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
701 {
702 #define FLD(f) abuf->fields.sfmt_beq.f
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
709 if (NESI (* FLD (i_src2), 0)) {
710 {
711 USI opval = FLD (i_disp16);
712 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
713 written |= (1 << 2);
714 CGEN_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
726 static SEM_PC
727 SEM_FN_NAME (m32rbf,bl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
728 {
729 #define FLD(f) abuf->fields.sfmt_bl8.f
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
736 {
737 {
738 SI opval = ADDSI (ANDSI (pc, -4), 4);
739 CPU (h_gr[((UINT) 14)]) = opval;
740 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
741 }
742 {
743 USI opval = FLD (i_disp8);
744 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
745 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
746 }
747 }
748
749 SEM_BRANCH_FINI (vpc);
750 return vpc;
751 #undef FLD
752 }
753
754 /* bl24: bl.l $disp24 */
755
756 static SEM_PC
757 SEM_FN_NAME (m32rbf,bl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
758 {
759 #define FLD(f) abuf->fields.sfmt_bl24.f
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
766 {
767 {
768 SI opval = ADDSI (pc, 4);
769 CPU (h_gr[((UINT) 14)]) = opval;
770 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
771 }
772 {
773 USI opval = FLD (i_disp24);
774 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
775 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
776 }
777 }
778
779 SEM_BRANCH_FINI (vpc);
780 return vpc;
781 #undef FLD
782 }
783
784 /* bnc8: bnc.s $disp8 */
785
786 static SEM_PC
787 SEM_FN_NAME (m32rbf,bnc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
788 {
789 #define FLD(f) abuf->fields.sfmt_bl8.f
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
796 if (NOTBI (CPU (h_cond))) {
797 {
798 USI opval = FLD (i_disp8);
799 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
800 written |= (1 << 2);
801 CGEN_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
813 static SEM_PC
814 SEM_FN_NAME (m32rbf,bnc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
815 {
816 #define FLD(f) abuf->fields.sfmt_bl24.f
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
823 if (NOTBI (CPU (h_cond))) {
824 {
825 USI opval = FLD (i_disp24);
826 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
827 written |= (1 << 2);
828 CGEN_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
840 static SEM_PC
841 SEM_FN_NAME (m32rbf,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
842 {
843 #define FLD(f) abuf->fields.sfmt_beq.f
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
850 if (NESI (* FLD (i_src1), * FLD (i_src2))) {
851 {
852 USI opval = FLD (i_disp16);
853 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
854 written |= (1 << 3);
855 CGEN_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
867 static SEM_PC
868 SEM_FN_NAME (m32rbf,bra8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
869 {
870 #define FLD(f) abuf->fields.sfmt_bl8.f
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);
879 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
880 CGEN_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
890 static SEM_PC
891 SEM_FN_NAME (m32rbf,bra24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
892 {
893 #define FLD(f) abuf->fields.sfmt_bl24.f
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);
902 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
903 CGEN_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
913 static SEM_PC
914 SEM_FN_NAME (m32rbf,cmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
915 {
916 #define FLD(f) abuf->fields.sfmt_st_plus.f
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;
925 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
926 }
927
928 return vpc;
929 #undef FLD
930 }
931
932 /* cmpi: cmpi $src2,$simm16 */
933
934 static SEM_PC
935 SEM_FN_NAME (m32rbf,cmpi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
936 {
937 #define FLD(f) abuf->fields.sfmt_st_d.f
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;
946 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
947 }
948
949 return vpc;
950 #undef FLD
951 }
952
953 /* cmpu: cmpu $src1,$src2 */
954
955 static SEM_PC
956 SEM_FN_NAME (m32rbf,cmpu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
957 {
958 #define FLD(f) abuf->fields.sfmt_st_plus.f
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;
967 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
968 }
969
970 return vpc;
971 #undef FLD
972 }
973
974 /* cmpui: cmpui $src2,$simm16 */
975
976 static SEM_PC
977 SEM_FN_NAME (m32rbf,cmpui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
978 {
979 #define FLD(f) abuf->fields.sfmt_st_d.f
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;
988 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
989 }
990
991 return vpc;
992 #undef FLD
993 }
994
995 /* div: div $dr,$sr */
996
997 static SEM_PC
998 SEM_FN_NAME (m32rbf,div) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
999 {
1000 #define FLD(f) abuf->fields.sfmt_add.f
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
1006 if (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);
1011 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1012 }
1013 }
1014
1015 abuf->written = written;
1016 return vpc;
1017 #undef FLD
1018 }
1019
1020 /* divu: divu $dr,$sr */
1021
1022 static SEM_PC
1023 SEM_FN_NAME (m32rbf,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1024 {
1025 #define FLD(f) abuf->fields.sfmt_add.f
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
1031 if (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);
1036 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1037 }
1038 }
1039
1040 abuf->written = written;
1041 return vpc;
1042 #undef FLD
1043 }
1044
1045 /* rem: rem $dr,$sr */
1046
1047 static SEM_PC
1048 SEM_FN_NAME (m32rbf,rem) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1049 {
1050 #define FLD(f) abuf->fields.sfmt_add.f
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
1056 if (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);
1061 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1062 }
1063 }
1064
1065 abuf->written = written;
1066 return vpc;
1067 #undef FLD
1068 }
1069
1070 /* remu: remu $dr,$sr */
1071
1072 static SEM_PC
1073 SEM_FN_NAME (m32rbf,remu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1074 {
1075 #define FLD(f) abuf->fields.sfmt_add.f
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
1081 if (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);
1086 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1087 }
1088 }
1089
1090 abuf->written = written;
1091 return vpc;
1092 #undef FLD
1093 }
1094
1095 /* jl: jl $sr */
1096
1097 static SEM_PC
1098 SEM_FN_NAME (m32rbf,jl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1099 {
1100 #define FLD(f) abuf->fields.sfmt_jl.f
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
1107 {
1108 SI temp0;USI temp1;
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;
1114 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1115 }
1116 {
1117 USI opval = temp1;
1118 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1119 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1120 }
1121 }
1122
1123 SEM_BRANCH_FINI (vpc);
1124 return vpc;
1125 #undef FLD
1126 }
1127
1128 /* jmp: jmp $sr */
1129
1130 static SEM_PC
1131 SEM_FN_NAME (m32rbf,jmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1132 {
1133 #define FLD(f) abuf->fields.sfmt_jl.f
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 CGEN_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
1153 static SEM_PC
1154 SEM_FN_NAME (m32rbf,ld) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1155 {
1156 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1165 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1166 }
1167
1168 return vpc;
1169 #undef FLD
1170 }
1171
1172 /* ld-d: ld $dr,@($slo16,$sr) */
1173
1174 static SEM_PC
1175 SEM_FN_NAME (m32rbf,ld_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1176 {
1177 #define FLD(f) abuf->fields.sfmt_add3.f
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;
1186 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1187 }
1188
1189 return vpc;
1190 #undef FLD
1191 }
1192
1193 /* ldb: ldb $dr,@$sr */
1194
1195 static SEM_PC
1196 SEM_FN_NAME (m32rbf,ldb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1197 {
1198 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1207 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1208 }
1209
1210 return vpc;
1211 #undef FLD
1212 }
1213
1214 /* ldb-d: ldb $dr,@($slo16,$sr) */
1215
1216 static SEM_PC
1217 SEM_FN_NAME (m32rbf,ldb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1218 {
1219 #define FLD(f) abuf->fields.sfmt_add3.f
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;
1228 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1229 }
1230
1231 return vpc;
1232 #undef FLD
1233 }
1234
1235 /* ldh: ldh $dr,@$sr */
1236
1237 static SEM_PC
1238 SEM_FN_NAME (m32rbf,ldh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1239 {
1240 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1249 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1250 }
1251
1252 return vpc;
1253 #undef FLD
1254 }
1255
1256 /* ldh-d: ldh $dr,@($slo16,$sr) */
1257
1258 static SEM_PC
1259 SEM_FN_NAME (m32rbf,ldh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1260 {
1261 #define FLD(f) abuf->fields.sfmt_add3.f
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;
1270 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1271 }
1272
1273 return vpc;
1274 #undef FLD
1275 }
1276
1277 /* ldub: ldub $dr,@$sr */
1278
1279 static SEM_PC
1280 SEM_FN_NAME (m32rbf,ldub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1281 {
1282 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1291 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1292 }
1293
1294 return vpc;
1295 #undef FLD
1296 }
1297
1298 /* ldub-d: ldub $dr,@($slo16,$sr) */
1299
1300 static SEM_PC
1301 SEM_FN_NAME (m32rbf,ldub_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1302 {
1303 #define FLD(f) abuf->fields.sfmt_add3.f
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;
1312 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1313 }
1314
1315 return vpc;
1316 #undef FLD
1317 }
1318
1319 /* lduh: lduh $dr,@$sr */
1320
1321 static SEM_PC
1322 SEM_FN_NAME (m32rbf,lduh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1323 {
1324 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1333 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1334 }
1335
1336 return vpc;
1337 #undef FLD
1338 }
1339
1340 /* lduh-d: lduh $dr,@($slo16,$sr) */
1341
1342 static SEM_PC
1343 SEM_FN_NAME (m32rbf,lduh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1344 {
1345 #define FLD(f) abuf->fields.sfmt_add3.f
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;
1354 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1355 }
1356
1357 return vpc;
1358 #undef FLD
1359 }
1360
1361 /* ld-plus: ld $dr,@$sr+ */
1362
1363 static SEM_PC
1364 SEM_FN_NAME (m32rbf,ld_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1365 {
1366 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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
1372 {
1373 SI temp0;SI temp1;
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;
1379 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1380 }
1381 {
1382 SI opval = temp1;
1383 * FLD (i_sr) = opval;
1384 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1385 }
1386 }
1387
1388 return vpc;
1389 #undef FLD
1390 }
1391
1392 /* ld24: ld24 $dr,$uimm24 */
1393
1394 static SEM_PC
1395 SEM_FN_NAME (m32rbf,ld24) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1396 {
1397 #define FLD(f) abuf->fields.sfmt_ld24.f
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;
1406 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1407 }
1408
1409 return vpc;
1410 #undef FLD
1411 }
1412
1413 /* ldi8: ldi8 $dr,$simm8 */
1414
1415 static SEM_PC
1416 SEM_FN_NAME (m32rbf,ldi8) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1417 {
1418 #define FLD(f) abuf->fields.sfmt_addi.f
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;
1427 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1428 }
1429
1430 return vpc;
1431 #undef FLD
1432 }
1433
1434 /* ldi16: ldi16 $dr,$hash$slo16 */
1435
1436 static SEM_PC
1437 SEM_FN_NAME (m32rbf,ldi16) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1438 {
1439 #define FLD(f) abuf->fields.sfmt_add3.f
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;
1448 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1449 }
1450
1451 return vpc;
1452 #undef FLD
1453 }
1454
1455 /* lock: lock $dr,@$sr */
1456
1457 static SEM_PC
1458 SEM_FN_NAME (m32rbf,lock) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1459 {
1460 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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
1466 {
1467 {
1468 BI opval = 1;
1469 CPU (h_lock) = opval;
1470 CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
1471 }
1472 {
1473 SI opval = GETMEMSI (current_cpu, pc, * FLD (i_sr));
1474 * FLD (i_dr) = opval;
1475 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1476 }
1477 }
1478
1479 return vpc;
1480 #undef FLD
1481 }
1482
1483 /* machi: machi $src1,$src2 */
1484
1485 static SEM_PC
1486 SEM_FN_NAME (m32rbf,machi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1487 {
1488 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1498 }
1499
1500 return vpc;
1501 #undef FLD
1502 }
1503
1504 /* maclo: maclo $src1,$src2 */
1505
1506 static SEM_PC
1507 SEM_FN_NAME (m32rbf,maclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1508 {
1509 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1519 }
1520
1521 return vpc;
1522 #undef FLD
1523 }
1524
1525 /* macwhi: macwhi $src1,$src2 */
1526
1527 static SEM_PC
1528 SEM_FN_NAME (m32rbf,macwhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1529 {
1530 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1540 }
1541
1542 return vpc;
1543 #undef FLD
1544 }
1545
1546 /* macwlo: macwlo $src1,$src2 */
1547
1548 static SEM_PC
1549 SEM_FN_NAME (m32rbf,macwlo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1550 {
1551 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1561 }
1562
1563 return vpc;
1564 #undef FLD
1565 }
1566
1567 /* mul: mul $dr,$sr */
1568
1569 static SEM_PC
1570 SEM_FN_NAME (m32rbf,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1571 {
1572 #define FLD(f) abuf->fields.sfmt_add.f
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;
1581 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1582 }
1583
1584 return vpc;
1585 #undef FLD
1586 }
1587
1588 /* mulhi: mulhi $src1,$src2 */
1589
1590 static SEM_PC
1591 SEM_FN_NAME (m32rbf,mulhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1592 {
1593 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1603 }
1604
1605 return vpc;
1606 #undef FLD
1607 }
1608
1609 /* mullo: mullo $src1,$src2 */
1610
1611 static SEM_PC
1612 SEM_FN_NAME (m32rbf,mullo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1613 {
1614 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1624 }
1625
1626 return vpc;
1627 #undef FLD
1628 }
1629
1630 /* mulwhi: mulwhi $src1,$src2 */
1631
1632 static SEM_PC
1633 SEM_FN_NAME (m32rbf,mulwhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1634 {
1635 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1645 }
1646
1647 return vpc;
1648 #undef FLD
1649 }
1650
1651 /* mulwlo: mulwlo $src1,$src2 */
1652
1653 static SEM_PC
1654 SEM_FN_NAME (m32rbf,mulwlo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1655 {
1656 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1666 }
1667
1668 return vpc;
1669 #undef FLD
1670 }
1671
1672 /* mv: mv $dr,$sr */
1673
1674 static SEM_PC
1675 SEM_FN_NAME (m32rbf,mv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1676 {
1677 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1686 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1687 }
1688
1689 return vpc;
1690 #undef FLD
1691 }
1692
1693 /* mvfachi: mvfachi $dr */
1694
1695 static SEM_PC
1696 SEM_FN_NAME (m32rbf,mvfachi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1697 {
1698 #define FLD(f) abuf->fields.sfmt_seth.f
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;
1707 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1708 }
1709
1710 return vpc;
1711 #undef FLD
1712 }
1713
1714 /* mvfaclo: mvfaclo $dr */
1715
1716 static SEM_PC
1717 SEM_FN_NAME (m32rbf,mvfaclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1718 {
1719 #define FLD(f) abuf->fields.sfmt_seth.f
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;
1728 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1729 }
1730
1731 return vpc;
1732 #undef FLD
1733 }
1734
1735 /* mvfacmi: mvfacmi $dr */
1736
1737 static SEM_PC
1738 SEM_FN_NAME (m32rbf,mvfacmi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1739 {
1740 #define FLD(f) abuf->fields.sfmt_seth.f
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;
1749 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1750 }
1751
1752 return vpc;
1753 #undef FLD
1754 }
1755
1756 /* mvfc: mvfc $dr,$scr */
1757
1758 static SEM_PC
1759 SEM_FN_NAME (m32rbf,mvfc) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1760 {
1761 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1770 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1771 }
1772
1773 return vpc;
1774 #undef FLD
1775 }
1776
1777 /* mvtachi: mvtachi $src1 */
1778
1779 static SEM_PC
1780 SEM_FN_NAME (m32rbf,mvtachi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1781 {
1782 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1792 }
1793
1794 return vpc;
1795 #undef FLD
1796 }
1797
1798 /* mvtaclo: mvtaclo $src1 */
1799
1800 static SEM_PC
1801 SEM_FN_NAME (m32rbf,mvtaclo) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1802 {
1803 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1813 }
1814
1815 return vpc;
1816 #undef FLD
1817 }
1818
1819 /* mvtc: mvtc $sr,$dcr */
1820
1821 static SEM_PC
1822 SEM_FN_NAME (m32rbf,mvtc) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1823 {
1824 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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);
1833 CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
1834 }
1835
1836 return vpc;
1837 #undef FLD
1838 }
1839
1840 /* neg: neg $dr,$sr */
1841
1842 static SEM_PC
1843 SEM_FN_NAME (m32rbf,neg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1844 {
1845 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1854 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1855 }
1856
1857 return vpc;
1858 #undef FLD
1859 }
1860
1861 /* nop: nop */
1862
1863 static SEM_PC
1864 SEM_FN_NAME (m32rbf,nop) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1865 {
1866 #define FLD(f) abuf->fields.sfmt_empty.f
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
1872 PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
1873
1874 return vpc;
1875 #undef FLD
1876 }
1877
1878 /* not: not $dr,$sr */
1879
1880 static SEM_PC
1881 SEM_FN_NAME (m32rbf,not) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1882 {
1883 #define FLD(f) abuf->fields.sfmt_ld_plus.f
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;
1892 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1893 }
1894
1895 return vpc;
1896 #undef FLD
1897 }
1898
1899 /* rac: rac */
1900
1901 static SEM_PC
1902 SEM_FN_NAME (m32rbf,rac) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1903 {
1904 #define FLD(f) abuf->fields.sfmt_empty.f
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
1910 {
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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1918 }
1919 }
1920
1921 return vpc;
1922 #undef FLD
1923 }
1924
1925 /* rach: rach */
1926
1927 static SEM_PC
1928 SEM_FN_NAME (m32rbf,rach) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1929 {
1930 #define FLD(f) abuf->fields.sfmt_empty.f
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
1936 {
1937 DI tmp_tmp1;
1938 tmp_tmp1 = ANDDI (GET_H_ACCUM (), MAKEDI (16777215, 0xffffffff));
1939 if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
1940 tmp_tmp1 = MAKEDI (16383, 0x80000000);
1941 } else {
1942 if (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 CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1953 }
1954 }
1955
1956 return vpc;
1957 #undef FLD
1958 }
1959
1960 /* rte: rte */
1961
1962 static SEM_PC
1963 SEM_FN_NAME (m32rbf,rte) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1964 {
1965 #define FLD(f) abuf->fields.sfmt_empty.f
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
1972 {
1973 {
1974 USI opval = ANDSI (GET_H_CR (((UINT) 6)), -4);
1975 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1976 CGEN_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);
1981 CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
1982 }
1983 {
1984 UQI opval = CPU (h_bpsw);
1985 SET_H_PSW (opval);
1986 CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
1987 }
1988 {
1989 UQI opval = CPU (h_bbpsw);
1990 CPU (h_bpsw) = opval;
1991 CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
1992 }
1993 }
1994
1995 SEM_BRANCH_FINI (vpc);
1996 return vpc;
1997 #undef FLD
1998 }
1999
2000 /* seth: seth $dr,$hash$hi16 */
2001
2002 static SEM_PC
2003 SEM_FN_NAME (m32rbf,seth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2004 {
2005 #define FLD(f) abuf->fields.sfmt_seth.f
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;
2014 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2015 }
2016
2017 return vpc;
2018 #undef FLD
2019 }
2020
2021 /* sll: sll $dr,$sr */
2022
2023 static SEM_PC
2024 SEM_FN_NAME (m32rbf,sll) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2025 {
2026 #define FLD(f) abuf->fields.sfmt_add.f
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;
2035 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2036 }
2037
2038 return vpc;
2039 #undef FLD
2040 }
2041
2042 /* sll3: sll3 $dr,$sr,$simm16 */
2043
2044 static SEM_PC
2045 SEM_FN_NAME (m32rbf,sll3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2046 {
2047 #define FLD(f) abuf->fields.sfmt_add3.f
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;
2056 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2057 }
2058
2059 return vpc;
2060 #undef FLD
2061 }
2062
2063 /* slli: slli $dr,$uimm5 */
2064
2065 static SEM_PC
2066 SEM_FN_NAME (m32rbf,slli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2067 {
2068 #define FLD(f) abuf->fields.sfmt_slli.f
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;
2077 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2078 }
2079
2080 return vpc;
2081 #undef FLD
2082 }
2083
2084 /* sra: sra $dr,$sr */
2085
2086 static SEM_PC
2087 SEM_FN_NAME (m32rbf,sra) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2088 {
2089 #define FLD(f) abuf->fields.sfmt_add.f
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;
2098 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2099 }
2100
2101 return vpc;
2102 #undef FLD
2103 }
2104
2105 /* sra3: sra3 $dr,$sr,$simm16 */
2106
2107 static SEM_PC
2108 SEM_FN_NAME (m32rbf,sra3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2109 {
2110 #define FLD(f) abuf->fields.sfmt_add3.f
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;
2119 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2120 }
2121
2122 return vpc;
2123 #undef FLD
2124 }
2125
2126 /* srai: srai $dr,$uimm5 */
2127
2128 static SEM_PC
2129 SEM_FN_NAME (m32rbf,srai) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2130 {
2131 #define FLD(f) abuf->fields.sfmt_slli.f
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;
2140 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2141 }
2142
2143 return vpc;
2144 #undef FLD
2145 }
2146
2147 /* srl: srl $dr,$sr */
2148
2149 static SEM_PC
2150 SEM_FN_NAME (m32rbf,srl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2151 {
2152 #define FLD(f) abuf->fields.sfmt_add.f
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;
2161 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2162 }
2163
2164 return vpc;
2165 #undef FLD
2166 }
2167
2168 /* srl3: srl3 $dr,$sr,$simm16 */
2169
2170 static SEM_PC
2171 SEM_FN_NAME (m32rbf,srl3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2172 {
2173 #define FLD(f) abuf->fields.sfmt_add3.f
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;
2182 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2183 }
2184
2185 return vpc;
2186 #undef FLD
2187 }
2188
2189 /* srli: srli $dr,$uimm5 */
2190
2191 static SEM_PC
2192 SEM_FN_NAME (m32rbf,srli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2193 {
2194 #define FLD(f) abuf->fields.sfmt_slli.f
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;
2203 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2204 }
2205
2206 return vpc;
2207 #undef FLD
2208 }
2209
2210 /* st: st $src1,@$src2 */
2211
2212 static SEM_PC
2213 SEM_FN_NAME (m32rbf,st) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2214 {
2215 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_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
2233 static SEM_PC
2234 SEM_FN_NAME (m32rbf,st_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2235 {
2236 #define FLD(f) abuf->fields.sfmt_st_d.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2246 }
2247
2248 return vpc;
2249 #undef FLD
2250 }
2251
2252 /* stb: stb $src1,@$src2 */
2253
2254 static SEM_PC
2255 SEM_FN_NAME (m32rbf,stb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2256 {
2257 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_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
2275 static SEM_PC
2276 SEM_FN_NAME (m32rbf,stb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2277 {
2278 #define FLD(f) abuf->fields.sfmt_st_d.f
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 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2288 }
2289
2290 return vpc;
2291 #undef FLD
2292 }
2293
2294 /* sth: sth $src1,@$src2 */
2295
2296 static SEM_PC
2297 SEM_FN_NAME (m32rbf,sth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2298 {
2299 #define FLD(f) abuf->fields.sfmt_st_plus.f
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 CGEN_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
2317 static SEM_PC
2318 SEM_FN_NAME (m32rbf,sth_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2319 {
2320 #define FLD(f) abuf->fields.sfmt_st_d.f
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 CGEN_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
2338 static SEM_PC
2339 SEM_FN_NAME (m32rbf,st_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2340 {
2341 #define FLD(f) abuf->fields.sfmt_st_plus.f
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
2347 {
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 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2354 }
2355 {
2356 SI opval = tmp_new_src2;
2357 * FLD (i_src2) = opval;
2358 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2359 }
2360 }
2361
2362 return vpc;
2363 #undef FLD
2364 }
2365
2366 /* st-minus: st $src1,@-$src2 */
2367
2368 static SEM_PC
2369 SEM_FN_NAME (m32rbf,st_minus) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2370 {
2371 #define FLD(f) abuf->fields.sfmt_st_plus.f
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
2377 {
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 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2384 }
2385 {
2386 SI opval = tmp_new_src2;
2387 * FLD (i_src2) = opval;
2388 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2389 }
2390 }
2391
2392 return vpc;
2393 #undef FLD
2394 }
2395
2396 /* sub: sub $dr,$sr */
2397
2398 static SEM_PC
2399 SEM_FN_NAME (m32rbf,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2400 {
2401 #define FLD(f) abuf->fields.sfmt_add.f
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;
2410 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2411 }
2412
2413 return vpc;
2414 #undef FLD
2415 }
2416
2417 /* subv: subv $dr,$sr */
2418
2419 static SEM_PC
2420 SEM_FN_NAME (m32rbf,subv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2421 {
2422 #define FLD(f) abuf->fields.sfmt_add.f
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
2428 {
2429 SI temp0;BI temp1;
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;
2435 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2436 }
2437 {
2438 BI opval = temp1;
2439 CPU (h_cond) = opval;
2440 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
2441 }
2442 }
2443
2444 return vpc;
2445 #undef FLD
2446 }
2447
2448 /* subx: subx $dr,$sr */
2449
2450 static SEM_PC
2451 SEM_FN_NAME (m32rbf,subx) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2452 {
2453 #define FLD(f) abuf->fields.sfmt_add.f
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
2459 {
2460 SI temp0;BI temp1;
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;
2466 CGEN_TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
2467 }
2468 {
2469 BI opval = temp1;
2470 CPU (h_cond) = opval;
2471 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
2472 }
2473 }
2474
2475 return vpc;
2476 #undef FLD
2477 }
2478
2479 /* trap: trap $uimm4 */
2480
2481 static SEM_PC
2482 SEM_FN_NAME (m32rbf,trap) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2483 {
2484 #define FLD(f) abuf->fields.sfmt_trap.f
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
2491 {
2492 {
2493 USI opval = GET_H_CR (((UINT) 6));
2494 SET_H_CR (((UINT) 14), opval);
2495 CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2496 }
2497 {
2498 USI opval = ADDSI (pc, 4);
2499 SET_H_CR (((UINT) 6), opval);
2500 CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2501 }
2502 {
2503 UQI opval = CPU (h_bpsw);
2504 CPU (h_bbpsw) = opval;
2505 CGEN_TRACE_RESULT (current_cpu, abuf, "bbpsw", 'x', opval);
2506 }
2507 {
2508 UQI opval = GET_H_PSW ();
2509 CPU (h_bpsw) = opval;
2510 CGEN_TRACE_RESULT (current_cpu, abuf, "bpsw", 'x', opval);
2511 }
2512 {
2513 UQI opval = ANDQI (GET_H_PSW (), 128);
2514 SET_H_PSW (opval);
2515 CGEN_TRACE_RESULT (current_cpu, abuf, "psw", 'x', opval);
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 CGEN_TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
2521 }
2522 }
2523
2524 SEM_BRANCH_FINI (vpc);
2525 return vpc;
2526 #undef FLD
2527 }
2528
2529 /* unlock: unlock $src1,@$src2 */
2530
2531 static SEM_PC
2532 SEM_FN_NAME (m32rbf,unlock) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2533 {
2534 #define FLD(f) abuf->fields.sfmt_st_plus.f
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
2540 {
2541 if (CPU (h_lock)) {
2542 {
2543 SI opval = * FLD (i_src1);
2544 SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2545 written |= (1 << 4);
2546 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2547 }
2548 }
2549 {
2550 BI opval = 0;
2551 CPU (h_lock) = opval;
2552 CGEN_TRACE_RESULT (current_cpu, abuf, "lock", 'x', opval);
2553 }
2554 }
2555
2556 abuf->written = written;
2557 return vpc;
2558 #undef FLD
2559 }
2560
2561 /* clrpsw: clrpsw $uimm8 */
2562
2563 static SEM_PC
2564 SEM_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 {
2573 USI opval = ANDSI (GET_H_CR (((UINT) 0)), ORSI (ZEXTQISI (INVQI (FLD (f_uimm8))), 65280));
2574 SET_H_CR (((UINT) 0), opval);
2575 CGEN_TRACE_RESULT (current_cpu, abuf, "cr", 'x', opval);
2576 }
2577
2578 return vpc;
2579 #undef FLD
2580 }
2581
2582 /* setpsw: setpsw $uimm8 */
2583
2584 static SEM_PC
2585 SEM_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 {
2594 USI opval = FLD (f_uimm8);
2595 SET_H_CR (((UINT) 0), opval);
2596 CGEN_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
2605 static SEM_PC
2606 SEM_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 {
2615 QI opval = ORQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), SLLQI (1, SUBSI (7, FLD (f_uimm3))));
2616 SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
2617 CGEN_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
2626 static SEM_PC
2627 SEM_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 {
2636 QI opval = ANDQI (GETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16))), INVQI (SLLQI (1, SUBSI (7, FLD (f_uimm3)))));
2637 SETMEMQI (current_cpu, pc, ADDSI (* FLD (i_sr), FLD (f_simm16)), opval);
2638 CGEN_TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2639 }
2640
2641 return vpc;
2642 #undef FLD
2643 }
2644
2645 /* btst: btst $uimm3,$sr */
2646
2647 static SEM_PC
2648 SEM_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 {
2657 BI opval = ANDQI (SRLQI (* FLD (i_sr), SUBSI (7, FLD (f_uimm3))), 1);
2658 CPU (h_cond) = opval;
2659 CGEN_TRACE_RESULT (current_cpu, abuf, "cond", 'x', opval);
2660 }
2661
2662 return vpc;
2663 #undef FLD
2664 }
2665
2666 /* Table of all semantic fns. */
2667
2668 static 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) },
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) },
2779 { 0, 0 }
2780 };
2781
2782 /* Add the semantic fns to IDESC_TABLE. */
2783
2784 void
2785 SEM_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;
2789 int mach_num = MACH_NUM (CPU_MACH (current_cpu));
2790
2791 for (sf = &sem_fns[0]; sf->fn != 0; ++sf)
2792 {
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));
2796 #if FAST_P
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);
2801 #else
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);
2806 #endif
2807 }
2808 }
2809