1/* Simulator instruction semantics for m32rbf.
2
3THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5Copyright 1996-2023 Free Software Foundation, Inc.
6
7This 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
47static SEM_PC
48SEM_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
74static SEM_PC
75SEM_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
95static SEM_PC
96SEM_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
116static SEM_PC
117SEM_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
146static SEM_PC
147SEM_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
170static SEM_PC
171SEM_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
201static SEM_PC
202SEM_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
222static SEM_PC
223SEM_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
243static SEM_PC
244SEM_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
264static SEM_PC
265SEM_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
285static SEM_PC
286SEM_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
306static SEM_PC
307SEM_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
327static SEM_PC
328SEM_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
348static SEM_PC
349SEM_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
369static SEM_PC
370SEM_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
390static SEM_PC
391SEM_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
421static SEM_PC
422SEM_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
452static SEM_PC
453SEM_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
483static SEM_PC
484SEM_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
493if (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
510static SEM_PC
511SEM_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
520if (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
537static SEM_PC
538SEM_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
547if (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
564static SEM_PC
565SEM_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
574if (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
591static SEM_PC
592SEM_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
601if (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
618static SEM_PC
619SEM_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
628if (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
645static SEM_PC
646SEM_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
655if (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
672static SEM_PC
673SEM_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
682if (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
699static SEM_PC
700SEM_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
709if (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
726static SEM_PC
727SEM_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
756static SEM_PC
757SEM_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
786static SEM_PC
787SEM_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
796if (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
813static SEM_PC
814SEM_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
823if (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
840static SEM_PC
841SEM_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
850if (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
867static SEM_PC
868SEM_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
890static SEM_PC
891SEM_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
913static SEM_PC
914SEM_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
934static SEM_PC
935SEM_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
955static SEM_PC
956SEM_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
976static SEM_PC
977SEM_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
997static SEM_PC
998SEM_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
1006if (NESI (* FLD (i_sr), 0)) {
1007  {
1008    SI opval = DIVSI (* FLD (i_dr), * FLD (i_sr));
1009    * FLD (i_dr) = opval;
1010    written |= (1 << 2);
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
1022static SEM_PC
1023SEM_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
1031if (NESI (* FLD (i_sr), 0)) {
1032  {
1033    SI opval = UDIVSI (* FLD (i_dr), * FLD (i_sr));
1034    * FLD (i_dr) = opval;
1035    written |= (1 << 2);
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
1047static SEM_PC
1048SEM_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
1056if (NESI (* FLD (i_sr), 0)) {
1057  {
1058    SI opval = MODSI (* FLD (i_dr), * FLD (i_sr));
1059    * FLD (i_dr) = opval;
1060    written |= (1 << 2);
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
1072static SEM_PC
1073SEM_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
1081if (NESI (* FLD (i_sr), 0)) {
1082  {
1083    SI opval = UMODSI (* FLD (i_dr), * FLD (i_sr));
1084    * FLD (i_dr) = opval;
1085    written |= (1 << 2);
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
1097static SEM_PC
1098SEM_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
1130static SEM_PC
1131SEM_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
1153static SEM_PC
1154SEM_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
1174static SEM_PC
1175SEM_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
1195static SEM_PC
1196SEM_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
1216static SEM_PC
1217SEM_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
1237static SEM_PC
1238SEM_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
1258static SEM_PC
1259SEM_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
1279static SEM_PC
1280SEM_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
1300static SEM_PC
1301SEM_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
1321static SEM_PC
1322SEM_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
1342static SEM_PC
1343SEM_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
1363static SEM_PC
1364SEM_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
1394static SEM_PC
1395SEM_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
1415static SEM_PC
1416SEM_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
1436static SEM_PC
1437SEM_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
1457static SEM_PC
1458SEM_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
1485static SEM_PC
1486SEM_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
1506static SEM_PC
1507SEM_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
1527static SEM_PC
1528SEM_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
1548static SEM_PC
1549SEM_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
1569static SEM_PC
1570SEM_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
1590static SEM_PC
1591SEM_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
1611static SEM_PC
1612SEM_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
1632static SEM_PC
1633SEM_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
1653static SEM_PC
1654SEM_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
1674static SEM_PC
1675SEM_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
1695static SEM_PC
1696SEM_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
1716static SEM_PC
1717SEM_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
1737static SEM_PC
1738SEM_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
1758static SEM_PC
1759SEM_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
1779static SEM_PC
1780SEM_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
1800static SEM_PC
1801SEM_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
1821static SEM_PC
1822SEM_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
1842static SEM_PC
1843SEM_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
1863static SEM_PC
1864SEM_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
1872PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
1873
1874  return vpc;
1875#undef FLD
1876}
1877
1878/* not: not $dr,$sr */
1879
1880static SEM_PC
1881SEM_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
1901static SEM_PC
1902SEM_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
1927static SEM_PC
1928SEM_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));
1939if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
1940  tmp_tmp1 = MAKEDI (16383, 0x80000000);
1941} else {
1942if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
1943  tmp_tmp1 = MAKEDI (16760832, 0);
1944} else {
1945  tmp_tmp1 = ANDDI (ADDDI (GET_H_ACCUM (), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
1946}
1947}
1948  tmp_tmp1 = SLLDI (tmp_tmp1, 1);
1949  {
1950    DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7);
1951    SET_H_ACCUM (opval);
1952    CGEN_TRACE_RESULT (current_cpu, abuf, "accum", 'D', opval);
1953  }
1954}
1955
1956  return vpc;
1957#undef FLD
1958}
1959
1960/* rte: rte */
1961
1962static SEM_PC
1963SEM_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
2002static SEM_PC
2003SEM_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
2023static SEM_PC
2024SEM_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
2044static SEM_PC
2045SEM_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
2065static SEM_PC
2066SEM_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
2086static SEM_PC
2087SEM_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
2107static SEM_PC
2108SEM_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
2128static SEM_PC
2129SEM_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
2149static SEM_PC
2150SEM_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
2170static SEM_PC
2171SEM_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
2191static SEM_PC
2192SEM_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
2212static SEM_PC
2213SEM_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
2233static SEM_PC
2234SEM_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
2254static SEM_PC
2255SEM_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
2275static SEM_PC
2276SEM_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
2296static SEM_PC
2297SEM_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
2317static SEM_PC
2318SEM_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
2338static SEM_PC
2339SEM_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
2368static SEM_PC
2369SEM_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
2398static SEM_PC
2399SEM_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
2419static SEM_PC
2420SEM_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
2450static SEM_PC
2451SEM_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
2481static SEM_PC
2482SEM_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
2531static SEM_PC
2532SEM_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{
2541if (CPU (h_lock)) {
2542  {
2543    SI opval = * FLD (i_src1);
2544    SETMEMSI (current_cpu, pc, * FLD (i_src2), opval);
2545    written |= (1 << 4);
2546    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
2563static SEM_PC
2564SEM_FN_NAME (m32rbf,clrpsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2565{
2566#define FLD(f) abuf->fields.sfmt_clrpsw.f
2567  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2568  int UNUSED written = 0;
2569  IADDR UNUSED pc = abuf->addr;
2570  SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2571
2572  {
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
2584static SEM_PC
2585SEM_FN_NAME (m32rbf,setpsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2586{
2587#define FLD(f) abuf->fields.sfmt_clrpsw.f
2588  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2589  int UNUSED written = 0;
2590  IADDR UNUSED pc = abuf->addr;
2591  SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2592
2593  {
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
2605static SEM_PC
2606SEM_FN_NAME (m32rbf,bset) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2607{
2608#define FLD(f) abuf->fields.sfmt_bset.f
2609  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2610  int UNUSED written = 0;
2611  IADDR UNUSED pc = abuf->addr;
2612  SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2613
2614  {
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
2626static SEM_PC
2627SEM_FN_NAME (m32rbf,bclr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2628{
2629#define FLD(f) abuf->fields.sfmt_bset.f
2630  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2631  int UNUSED written = 0;
2632  IADDR UNUSED pc = abuf->addr;
2633  SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2634
2635  {
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
2647static SEM_PC
2648SEM_FN_NAME (m32rbf,btst) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2649{
2650#define FLD(f) abuf->fields.sfmt_bset.f
2651  ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2652  int UNUSED written = 0;
2653  IADDR UNUSED pc = abuf->addr;
2654  SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2655
2656  {
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
2668static const struct sem_fn_desc sem_fns[] = {
2669  { M32RBF_INSN_X_INVALID, SEM_FN_NAME (m32rbf,x_invalid) },
2670  { M32RBF_INSN_X_AFTER, SEM_FN_NAME (m32rbf,x_after) },
2671  { M32RBF_INSN_X_BEFORE, SEM_FN_NAME (m32rbf,x_before) },
2672  { M32RBF_INSN_X_CTI_CHAIN, SEM_FN_NAME (m32rbf,x_cti_chain) },
2673  { M32RBF_INSN_X_CHAIN, SEM_FN_NAME (m32rbf,x_chain) },
2674  { M32RBF_INSN_X_BEGIN, SEM_FN_NAME (m32rbf,x_begin) },
2675  { M32RBF_INSN_ADD, SEM_FN_NAME (m32rbf,add) },
2676  { M32RBF_INSN_ADD3, SEM_FN_NAME (m32rbf,add3) },
2677  { M32RBF_INSN_AND, SEM_FN_NAME (m32rbf,and) },
2678  { M32RBF_INSN_AND3, SEM_FN_NAME (m32rbf,and3) },
2679  { M32RBF_INSN_OR, SEM_FN_NAME (m32rbf,or) },
2680  { M32RBF_INSN_OR3, SEM_FN_NAME (m32rbf,or3) },
2681  { M32RBF_INSN_XOR, SEM_FN_NAME (m32rbf,xor) },
2682  { M32RBF_INSN_XOR3, SEM_FN_NAME (m32rbf,xor3) },
2683  { M32RBF_INSN_ADDI, SEM_FN_NAME (m32rbf,addi) },
2684  { M32RBF_INSN_ADDV, SEM_FN_NAME (m32rbf,addv) },
2685  { M32RBF_INSN_ADDV3, SEM_FN_NAME (m32rbf,addv3) },
2686  { M32RBF_INSN_ADDX, SEM_FN_NAME (m32rbf,addx) },
2687  { M32RBF_INSN_BC8, SEM_FN_NAME (m32rbf,bc8) },
2688  { M32RBF_INSN_BC24, SEM_FN_NAME (m32rbf,bc24) },
2689  { M32RBF_INSN_BEQ, SEM_FN_NAME (m32rbf,beq) },
2690  { M32RBF_INSN_BEQZ, SEM_FN_NAME (m32rbf,beqz) },
2691  { M32RBF_INSN_BGEZ, SEM_FN_NAME (m32rbf,bgez) },
2692  { M32RBF_INSN_BGTZ, SEM_FN_NAME (m32rbf,bgtz) },
2693  { M32RBF_INSN_BLEZ, SEM_FN_NAME (m32rbf,blez) },
2694  { M32RBF_INSN_BLTZ, SEM_FN_NAME (m32rbf,bltz) },
2695  { M32RBF_INSN_BNEZ, SEM_FN_NAME (m32rbf,bnez) },
2696  { M32RBF_INSN_BL8, SEM_FN_NAME (m32rbf,bl8) },
2697  { M32RBF_INSN_BL24, SEM_FN_NAME (m32rbf,bl24) },
2698  { M32RBF_INSN_BNC8, SEM_FN_NAME (m32rbf,bnc8) },
2699  { M32RBF_INSN_BNC24, SEM_FN_NAME (m32rbf,bnc24) },
2700  { M32RBF_INSN_BNE, SEM_FN_NAME (m32rbf,bne) },
2701  { M32RBF_INSN_BRA8, SEM_FN_NAME (m32rbf,bra8) },
2702  { M32RBF_INSN_BRA24, SEM_FN_NAME (m32rbf,bra24) },
2703  { M32RBF_INSN_CMP, SEM_FN_NAME (m32rbf,cmp) },
2704  { M32RBF_INSN_CMPI, SEM_FN_NAME (m32rbf,cmpi) },
2705  { M32RBF_INSN_CMPU, SEM_FN_NAME (m32rbf,cmpu) },
2706  { M32RBF_INSN_CMPUI, SEM_FN_NAME (m32rbf,cmpui) },
2707  { M32RBF_INSN_DIV, SEM_FN_NAME (m32rbf,div) },
2708  { M32RBF_INSN_DIVU, SEM_FN_NAME (m32rbf,divu) },
2709  { M32RBF_INSN_REM, SEM_FN_NAME (m32rbf,rem) },
2710  { M32RBF_INSN_REMU, SEM_FN_NAME (m32rbf,remu) },
2711  { M32RBF_INSN_JL, SEM_FN_NAME (m32rbf,jl) },
2712  { M32RBF_INSN_JMP, SEM_FN_NAME (m32rbf,jmp) },
2713  { M32RBF_INSN_LD, SEM_FN_NAME (m32rbf,ld) },
2714  { M32RBF_INSN_LD_D, SEM_FN_NAME (m32rbf,ld_d) },
2715  { M32RBF_INSN_LDB, SEM_FN_NAME (m32rbf,ldb) },
2716  { M32RBF_INSN_LDB_D, SEM_FN_NAME (m32rbf,ldb_d) },
2717  { M32RBF_INSN_LDH, SEM_FN_NAME (m32rbf,ldh) },
2718  { M32RBF_INSN_LDH_D, SEM_FN_NAME (m32rbf,ldh_d) },
2719  { M32RBF_INSN_LDUB, SEM_FN_NAME (m32rbf,ldub) },
2720  { M32RBF_INSN_LDUB_D, SEM_FN_NAME (m32rbf,ldub_d) },
2721  { M32RBF_INSN_LDUH, SEM_FN_NAME (m32rbf,lduh) },
2722  { M32RBF_INSN_LDUH_D, SEM_FN_NAME (m32rbf,lduh_d) },
2723  { M32RBF_INSN_LD_PLUS, SEM_FN_NAME (m32rbf,ld_plus) },
2724  { M32RBF_INSN_LD24, SEM_FN_NAME (m32rbf,ld24) },
2725  { M32RBF_INSN_LDI8, SEM_FN_NAME (m32rbf,ldi8) },
2726  { M32RBF_INSN_LDI16, SEM_FN_NAME (m32rbf,ldi16) },
2727  { M32RBF_INSN_LOCK, SEM_FN_NAME (m32rbf,lock) },
2728  { M32RBF_INSN_MACHI, SEM_FN_NAME (m32rbf,machi) },
2729  { M32RBF_INSN_MACLO, SEM_FN_NAME (m32rbf,maclo) },
2730  { M32RBF_INSN_MACWHI, SEM_FN_NAME (m32rbf,macwhi) },
2731  { M32RBF_INSN_MACWLO, SEM_FN_NAME (m32rbf,macwlo) },
2732  { M32RBF_INSN_MUL, SEM_FN_NAME (m32rbf,mul) },
2733  { M32RBF_INSN_MULHI, SEM_FN_NAME (m32rbf,mulhi) },
2734  { M32RBF_INSN_MULLO, SEM_FN_NAME (m32rbf,mullo) },
2735  { M32RBF_INSN_MULWHI, SEM_FN_NAME (m32rbf,mulwhi) },
2736  { M32RBF_INSN_MULWLO, SEM_FN_NAME (m32rbf,mulwlo) },
2737  { M32RBF_INSN_MV, SEM_FN_NAME (m32rbf,mv) },
2738  { M32RBF_INSN_MVFACHI, SEM_FN_NAME (m32rbf,mvfachi) },
2739  { M32RBF_INSN_MVFACLO, SEM_FN_NAME (m32rbf,mvfaclo) },
2740  { M32RBF_INSN_MVFACMI, SEM_FN_NAME (m32rbf,mvfacmi) },
2741  { M32RBF_INSN_MVFC, SEM_FN_NAME (m32rbf,mvfc) },
2742  { M32RBF_INSN_MVTACHI, SEM_FN_NAME (m32rbf,mvtachi) },
2743  { M32RBF_INSN_MVTACLO, SEM_FN_NAME (m32rbf,mvtaclo) },
2744  { M32RBF_INSN_MVTC, SEM_FN_NAME (m32rbf,mvtc) },
2745  { M32RBF_INSN_NEG, SEM_FN_NAME (m32rbf,neg) },
2746  { M32RBF_INSN_NOP, SEM_FN_NAME (m32rbf,nop) },
2747  { M32RBF_INSN_NOT, SEM_FN_NAME (m32rbf,not) },
2748  { M32RBF_INSN_RAC, SEM_FN_NAME (m32rbf,rac) },
2749  { M32RBF_INSN_RACH, SEM_FN_NAME (m32rbf,rach) },
2750  { M32RBF_INSN_RTE, SEM_FN_NAME (m32rbf,rte) },
2751  { M32RBF_INSN_SETH, SEM_FN_NAME (m32rbf,seth) },
2752  { M32RBF_INSN_SLL, SEM_FN_NAME (m32rbf,sll) },
2753  { M32RBF_INSN_SLL3, SEM_FN_NAME (m32rbf,sll3) },
2754  { M32RBF_INSN_SLLI, SEM_FN_NAME (m32rbf,slli) },
2755  { M32RBF_INSN_SRA, SEM_FN_NAME (m32rbf,sra) },
2756  { M32RBF_INSN_SRA3, SEM_FN_NAME (m32rbf,sra3) },
2757  { M32RBF_INSN_SRAI, SEM_FN_NAME (m32rbf,srai) },
2758  { M32RBF_INSN_SRL, SEM_FN_NAME (m32rbf,srl) },
2759  { M32RBF_INSN_SRL3, SEM_FN_NAME (m32rbf,srl3) },
2760  { M32RBF_INSN_SRLI, SEM_FN_NAME (m32rbf,srli) },
2761  { M32RBF_INSN_ST, SEM_FN_NAME (m32rbf,st) },
2762  { M32RBF_INSN_ST_D, SEM_FN_NAME (m32rbf,st_d) },
2763  { M32RBF_INSN_STB, SEM_FN_NAME (m32rbf,stb) },
2764  { M32RBF_INSN_STB_D, SEM_FN_NAME (m32rbf,stb_d) },
2765  { M32RBF_INSN_STH, SEM_FN_NAME (m32rbf,sth) },
2766  { M32RBF_INSN_STH_D, SEM_FN_NAME (m32rbf,sth_d) },
2767  { M32RBF_INSN_ST_PLUS, SEM_FN_NAME (m32rbf,st_plus) },
2768  { M32RBF_INSN_ST_MINUS, SEM_FN_NAME (m32rbf,st_minus) },
2769  { M32RBF_INSN_SUB, SEM_FN_NAME (m32rbf,sub) },
2770  { M32RBF_INSN_SUBV, SEM_FN_NAME (m32rbf,subv) },
2771  { M32RBF_INSN_SUBX, SEM_FN_NAME (m32rbf,subx) },
2772  { M32RBF_INSN_TRAP, SEM_FN_NAME (m32rbf,trap) },
2773  { M32RBF_INSN_UNLOCK, SEM_FN_NAME (m32rbf,unlock) },
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
2784void
2785SEM_FN_NAME (m32rbf,init_idesc_table) (SIM_CPU *current_cpu)
2786{
2787  IDESC *idesc_table = CPU_IDESC (current_cpu);
2788  const struct sem_fn_desc *sf;
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
2810