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