1 /* Simulator instruction semantics for lm32bf.
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
5 Copyright 1996-2005 Free Software Foundation, Inc.
7 This file is part of the GNU simulators.
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)
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.
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
25 #define WANT_CPU lm32bf
26 #define WANT_CPU_LM32BF
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)
36 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_/**/attr)
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. */
43 #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_semf_,fn)
45 #define TRACE_RESULT(cpu, abuf, name, type, val)
47 #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
50 /* x-invalid: --invalid-- */
53 SEM_FN_NAME (lm32bf,x_invalid) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
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);
62 /* Update the recorded pc in the cpu state struct.
63 Only necessary for WITH_SCACHE case, but to avoid the
64 conditional compilation .... */
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);
77 /* x-after: --after-- */
80 SEM_FN_NAME (lm32bf,x_after) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
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);
89 #if WITH_SCACHE_PBB_LM32BF
90 lm32bf_pbb_after (current_cpu, sem_arg);
98 /* x-before: --before-- */
101 SEM_FN_NAME (lm32bf,x_before) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
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);
110 #if WITH_SCACHE_PBB_LM32BF
111 lm32bf_pbb_before (current_cpu, sem_arg);
119 /* x-cti-chain: --cti-chain-- */
122 SEM_FN_NAME (lm32bf,x_cti_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
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);
131 #if WITH_SCACHE_PBB_LM32BF
133 vpc = lm32bf_pbb_cti_chain (current_cpu, sem_arg,
134 pbb_br_type, pbb_br_npc);
137 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
138 vpc = lm32bf_pbb_cti_chain (current_cpu, sem_arg,
139 CPU_PBB_BR_TYPE (current_cpu),
140 CPU_PBB_BR_NPC (current_cpu));
149 /* x-chain: --chain-- */
152 SEM_FN_NAME (lm32bf,x_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
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);
161 #if WITH_SCACHE_PBB_LM32BF
162 vpc = lm32bf_pbb_chain (current_cpu, sem_arg);
173 /* x-begin: --begin-- */
176 SEM_FN_NAME (lm32bf,x_begin) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
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);
185 #if WITH_SCACHE_PBB_LM32BF
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 = lm32bf_pbb_begin (current_cpu, FAST_P);
191 #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
192 vpc = lm32bf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
194 vpc = lm32bf_pbb_begin (current_cpu, 0);
204 /* add: add $r2,$r0,$r1 */
207 SEM_FN_NAME (lm32bf,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
209 #define FLD(f) abuf->fields.sfmt_user.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, 4);
216 SI opval = ADDSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
217 CPU (h_gr[FLD (f_r2)]) = opval;
218 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
225 /* addi: addi $r1,$r0,$imm */
228 SEM_FN_NAME (lm32bf,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
230 #define FLD(f) abuf->fields.sfmt_addi.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);
237 SI opval = ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
238 CPU (h_gr[FLD (f_r1)]) = opval;
239 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
246 /* and: and $r2,$r0,$r1 */
249 SEM_FN_NAME (lm32bf,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
251 #define FLD(f) abuf->fields.sfmt_user.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, 4);
258 SI opval = ANDSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
259 CPU (h_gr[FLD (f_r2)]) = opval;
260 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
267 /* andi: andi $r1,$r0,$uimm */
270 SEM_FN_NAME (lm32bf,andi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
272 #define FLD(f) abuf->fields.sfmt_andi.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);
279 SI opval = ANDSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
280 CPU (h_gr[FLD (f_r1)]) = opval;
281 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
288 /* andhii: andhi $r1,$r0,$hi16 */
291 SEM_FN_NAME (lm32bf,andhii) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
293 #define FLD(f) abuf->fields.sfmt_andi.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, 4);
300 SI opval = ANDSI (CPU (h_gr[FLD (f_r0)]), SLLSI (FLD (f_uimm), 16));
301 CPU (h_gr[FLD (f_r1)]) = opval;
302 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
312 SEM_FN_NAME (lm32bf,b) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
314 #define FLD(f) abuf->fields.sfmt_be.f
315 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
316 int UNUSED written = 0;
317 IADDR UNUSED pc = abuf->addr;
319 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
322 USI opval = lm32bf_b_insn (current_cpu, CPU (h_gr[FLD (f_r0)]), FLD (f_r0));
323 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
324 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
327 SEM_BRANCH_FINI (vpc);
335 SEM_FN_NAME (lm32bf,bi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
337 #define FLD(f) abuf->fields.sfmt_bi.f
338 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
339 int UNUSED written = 0;
340 IADDR UNUSED pc = abuf->addr;
342 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
345 USI opval = EXTSISI (FLD (i_call));
346 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
347 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
350 SEM_BRANCH_FINI (vpc);
355 /* be: be $r0,$r1,$branch */
358 SEM_FN_NAME (lm32bf,be) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
360 #define FLD(f) abuf->fields.sfmt_be.f
361 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
362 int UNUSED written = 0;
363 IADDR UNUSED pc = abuf->addr;
365 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
367 if (EQSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
369 USI opval = FLD (i_branch);
370 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
372 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
376 abuf->written = written;
377 SEM_BRANCH_FINI (vpc);
382 /* bg: bg $r0,$r1,$branch */
385 SEM_FN_NAME (lm32bf,bg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
387 #define FLD(f) abuf->fields.sfmt_be.f
388 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
389 int UNUSED written = 0;
390 IADDR UNUSED pc = abuf->addr;
392 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
394 if (GTSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
396 USI opval = FLD (i_branch);
397 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
399 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
403 abuf->written = written;
404 SEM_BRANCH_FINI (vpc);
409 /* bge: bge $r0,$r1,$branch */
412 SEM_FN_NAME (lm32bf,bge) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
414 #define FLD(f) abuf->fields.sfmt_be.f
415 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
416 int UNUSED written = 0;
417 IADDR UNUSED pc = abuf->addr;
419 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
421 if (GESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
423 USI opval = FLD (i_branch);
424 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
426 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
430 abuf->written = written;
431 SEM_BRANCH_FINI (vpc);
436 /* bgeu: bgeu $r0,$r1,$branch */
439 SEM_FN_NAME (lm32bf,bgeu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
441 #define FLD(f) abuf->fields.sfmt_be.f
442 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
443 int UNUSED written = 0;
444 IADDR UNUSED pc = abuf->addr;
446 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
448 if (GEUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
450 USI opval = FLD (i_branch);
451 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
453 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
457 abuf->written = written;
458 SEM_BRANCH_FINI (vpc);
463 /* bgu: bgu $r0,$r1,$branch */
466 SEM_FN_NAME (lm32bf,bgu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
468 #define FLD(f) abuf->fields.sfmt_be.f
469 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
470 int UNUSED written = 0;
471 IADDR UNUSED pc = abuf->addr;
473 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
475 if (GTUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
477 USI opval = FLD (i_branch);
478 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
480 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
484 abuf->written = written;
485 SEM_BRANCH_FINI (vpc);
490 /* bne: bne $r0,$r1,$branch */
493 SEM_FN_NAME (lm32bf,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
495 #define FLD(f) abuf->fields.sfmt_be.f
496 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
497 int UNUSED written = 0;
498 IADDR UNUSED pc = abuf->addr;
500 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
502 if (NESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
504 USI opval = FLD (i_branch);
505 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
507 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
511 abuf->written = written;
512 SEM_BRANCH_FINI (vpc);
520 SEM_FN_NAME (lm32bf,call) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
522 #define FLD(f) abuf->fields.sfmt_be.f
523 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
524 int UNUSED written = 0;
525 IADDR UNUSED pc = abuf->addr;
527 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
531 SI opval = ADDSI (pc, 4);
532 CPU (h_gr[((UINT) 29)]) = opval;
533 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
536 USI opval = CPU (h_gr[FLD (f_r0)]);
537 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
538 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
542 SEM_BRANCH_FINI (vpc);
547 /* calli: calli $call */
550 SEM_FN_NAME (lm32bf,calli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
552 #define FLD(f) abuf->fields.sfmt_bi.f
553 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
554 int UNUSED written = 0;
555 IADDR UNUSED pc = abuf->addr;
557 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
561 SI opval = ADDSI (pc, 4);
562 CPU (h_gr[((UINT) 29)]) = opval;
563 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
566 USI opval = EXTSISI (FLD (i_call));
567 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
568 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
572 SEM_BRANCH_FINI (vpc);
577 /* cmpe: cmpe $r2,$r0,$r1 */
580 SEM_FN_NAME (lm32bf,cmpe) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
582 #define FLD(f) abuf->fields.sfmt_user.f
583 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
584 int UNUSED written = 0;
585 IADDR UNUSED pc = abuf->addr;
586 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
589 SI opval = EQSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
590 CPU (h_gr[FLD (f_r2)]) = opval;
591 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
598 /* cmpei: cmpei $r1,$r0,$imm */
601 SEM_FN_NAME (lm32bf,cmpei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
603 #define FLD(f) abuf->fields.sfmt_addi.f
604 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
605 int UNUSED written = 0;
606 IADDR UNUSED pc = abuf->addr;
607 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
610 SI opval = EQSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
611 CPU (h_gr[FLD (f_r1)]) = opval;
612 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
619 /* cmpg: cmpg $r2,$r0,$r1 */
622 SEM_FN_NAME (lm32bf,cmpg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
624 #define FLD(f) abuf->fields.sfmt_user.f
625 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
626 int UNUSED written = 0;
627 IADDR UNUSED pc = abuf->addr;
628 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
631 SI opval = GTSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
632 CPU (h_gr[FLD (f_r2)]) = opval;
633 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
640 /* cmpgi: cmpgi $r1,$r0,$imm */
643 SEM_FN_NAME (lm32bf,cmpgi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
645 #define FLD(f) abuf->fields.sfmt_addi.f
646 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
647 int UNUSED written = 0;
648 IADDR UNUSED pc = abuf->addr;
649 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
652 SI opval = GTSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
653 CPU (h_gr[FLD (f_r1)]) = opval;
654 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
661 /* cmpge: cmpge $r2,$r0,$r1 */
664 SEM_FN_NAME (lm32bf,cmpge) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
666 #define FLD(f) abuf->fields.sfmt_user.f
667 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
668 int UNUSED written = 0;
669 IADDR UNUSED pc = abuf->addr;
670 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
673 SI opval = GESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
674 CPU (h_gr[FLD (f_r2)]) = opval;
675 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
682 /* cmpgei: cmpgei $r1,$r0,$imm */
685 SEM_FN_NAME (lm32bf,cmpgei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
687 #define FLD(f) abuf->fields.sfmt_addi.f
688 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
689 int UNUSED written = 0;
690 IADDR UNUSED pc = abuf->addr;
691 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
694 SI opval = GESI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
695 CPU (h_gr[FLD (f_r1)]) = opval;
696 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
703 /* cmpgeu: cmpgeu $r2,$r0,$r1 */
706 SEM_FN_NAME (lm32bf,cmpgeu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
708 #define FLD(f) abuf->fields.sfmt_user.f
709 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
710 int UNUSED written = 0;
711 IADDR UNUSED pc = abuf->addr;
712 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
715 SI opval = GEUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
716 CPU (h_gr[FLD (f_r2)]) = opval;
717 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
724 /* cmpgeui: cmpgeui $r1,$r0,$uimm */
727 SEM_FN_NAME (lm32bf,cmpgeui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
729 #define FLD(f) abuf->fields.sfmt_andi.f
730 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
731 int UNUSED written = 0;
732 IADDR UNUSED pc = abuf->addr;
733 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
736 SI opval = GEUSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
737 CPU (h_gr[FLD (f_r1)]) = opval;
738 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
745 /* cmpgu: cmpgu $r2,$r0,$r1 */
748 SEM_FN_NAME (lm32bf,cmpgu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
750 #define FLD(f) abuf->fields.sfmt_user.f
751 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
752 int UNUSED written = 0;
753 IADDR UNUSED pc = abuf->addr;
754 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
757 SI opval = GTUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
758 CPU (h_gr[FLD (f_r2)]) = opval;
759 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
766 /* cmpgui: cmpgui $r1,$r0,$uimm */
769 SEM_FN_NAME (lm32bf,cmpgui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
771 #define FLD(f) abuf->fields.sfmt_andi.f
772 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
773 int UNUSED written = 0;
774 IADDR UNUSED pc = abuf->addr;
775 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
778 SI opval = GTUSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
779 CPU (h_gr[FLD (f_r1)]) = opval;
780 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
787 /* cmpne: cmpne $r2,$r0,$r1 */
790 SEM_FN_NAME (lm32bf,cmpne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
792 #define FLD(f) abuf->fields.sfmt_user.f
793 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
794 int UNUSED written = 0;
795 IADDR UNUSED pc = abuf->addr;
796 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
799 SI opval = NESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
800 CPU (h_gr[FLD (f_r2)]) = opval;
801 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
808 /* cmpnei: cmpnei $r1,$r0,$imm */
811 SEM_FN_NAME (lm32bf,cmpnei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
813 #define FLD(f) abuf->fields.sfmt_addi.f
814 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
815 int UNUSED written = 0;
816 IADDR UNUSED pc = abuf->addr;
817 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
820 SI opval = NESI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
821 CPU (h_gr[FLD (f_r1)]) = opval;
822 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
829 /* divu: divu $r2,$r0,$r1 */
832 SEM_FN_NAME (lm32bf,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
834 #define FLD(f) abuf->fields.sfmt_user.f
835 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
836 int UNUSED written = 0;
837 IADDR UNUSED pc = abuf->addr;
839 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
842 USI opval = lm32bf_divu_insn (current_cpu, pc, FLD (f_r0), FLD (f_r1), FLD (f_r2));
843 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
844 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
847 SEM_BRANCH_FINI (vpc);
852 /* lb: lb $r1,($r0+$imm) */
855 SEM_FN_NAME (lm32bf,lb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
857 #define FLD(f) abuf->fields.sfmt_addi.f
858 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
859 int UNUSED written = 0;
860 IADDR UNUSED pc = abuf->addr;
861 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
864 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
865 CPU (h_gr[FLD (f_r1)]) = opval;
866 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
873 /* lbu: lbu $r1,($r0+$imm) */
876 SEM_FN_NAME (lm32bf,lbu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
878 #define FLD(f) abuf->fields.sfmt_addi.f
879 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
880 int UNUSED written = 0;
881 IADDR UNUSED pc = abuf->addr;
882 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
885 SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
886 CPU (h_gr[FLD (f_r1)]) = opval;
887 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
894 /* lh: lh $r1,($r0+$imm) */
897 SEM_FN_NAME (lm32bf,lh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
899 #define FLD(f) abuf->fields.sfmt_addi.f
900 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
901 int UNUSED written = 0;
902 IADDR UNUSED pc = abuf->addr;
903 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
906 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
907 CPU (h_gr[FLD (f_r1)]) = opval;
908 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
915 /* lhu: lhu $r1,($r0+$imm) */
918 SEM_FN_NAME (lm32bf,lhu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
920 #define FLD(f) abuf->fields.sfmt_addi.f
921 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
922 int UNUSED written = 0;
923 IADDR UNUSED pc = abuf->addr;
924 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
927 SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
928 CPU (h_gr[FLD (f_r1)]) = opval;
929 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
936 /* lw: lw $r1,($r0+$imm) */
939 SEM_FN_NAME (lm32bf,lw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
941 #define FLD(f) abuf->fields.sfmt_addi.f
942 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
943 int UNUSED written = 0;
944 IADDR UNUSED pc = abuf->addr;
945 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
948 SI opval = GETMEMSI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))));
949 CPU (h_gr[FLD (f_r1)]) = opval;
950 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
957 /* modu: modu $r2,$r0,$r1 */
960 SEM_FN_NAME (lm32bf,modu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
962 #define FLD(f) abuf->fields.sfmt_user.f
963 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
964 int UNUSED written = 0;
965 IADDR UNUSED pc = abuf->addr;
967 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
970 USI opval = lm32bf_modu_insn (current_cpu, pc, FLD (f_r0), FLD (f_r1), FLD (f_r2));
971 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
972 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
975 SEM_BRANCH_FINI (vpc);
980 /* mul: mul $r2,$r0,$r1 */
983 SEM_FN_NAME (lm32bf,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
985 #define FLD(f) abuf->fields.sfmt_user.f
986 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
987 int UNUSED written = 0;
988 IADDR UNUSED pc = abuf->addr;
989 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
992 SI opval = MULSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
993 CPU (h_gr[FLD (f_r2)]) = opval;
994 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1001 /* muli: muli $r1,$r0,$imm */
1004 SEM_FN_NAME (lm32bf,muli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1006 #define FLD(f) abuf->fields.sfmt_addi.f
1007 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1008 int UNUSED written = 0;
1009 IADDR UNUSED pc = abuf->addr;
1010 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1013 SI opval = MULSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
1014 CPU (h_gr[FLD (f_r1)]) = opval;
1015 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1022 /* nor: nor $r2,$r0,$r1 */
1025 SEM_FN_NAME (lm32bf,nor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1027 #define FLD(f) abuf->fields.sfmt_user.f
1028 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1029 int UNUSED written = 0;
1030 IADDR UNUSED pc = abuf->addr;
1031 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1034 SI opval = INVSI (ORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)])));
1035 CPU (h_gr[FLD (f_r2)]) = opval;
1036 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1043 /* nori: nori $r1,$r0,$uimm */
1046 SEM_FN_NAME (lm32bf,nori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1048 #define FLD(f) abuf->fields.sfmt_andi.f
1049 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1050 int UNUSED written = 0;
1051 IADDR UNUSED pc = abuf->addr;
1052 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1055 SI opval = INVSI (ORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm))));
1056 CPU (h_gr[FLD (f_r1)]) = opval;
1057 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1064 /* or: or $r2,$r0,$r1 */
1067 SEM_FN_NAME (lm32bf,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1069 #define FLD(f) abuf->fields.sfmt_user.f
1070 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1071 int UNUSED written = 0;
1072 IADDR UNUSED pc = abuf->addr;
1073 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1076 SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1077 CPU (h_gr[FLD (f_r2)]) = opval;
1078 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1085 /* ori: ori $r1,$r0,$lo16 */
1088 SEM_FN_NAME (lm32bf,ori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1090 #define FLD(f) abuf->fields.sfmt_andi.f
1091 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1092 int UNUSED written = 0;
1093 IADDR UNUSED pc = abuf->addr;
1094 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1097 SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
1098 CPU (h_gr[FLD (f_r1)]) = opval;
1099 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1106 /* orhii: orhi $r1,$r0,$hi16 */
1109 SEM_FN_NAME (lm32bf,orhii) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1111 #define FLD(f) abuf->fields.sfmt_andi.f
1112 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1113 int UNUSED written = 0;
1114 IADDR UNUSED pc = abuf->addr;
1115 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1118 SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), SLLSI (FLD (f_uimm), 16));
1119 CPU (h_gr[FLD (f_r1)]) = opval;
1120 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1127 /* rcsr: rcsr $r2,$csr */
1130 SEM_FN_NAME (lm32bf,rcsr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1132 #define FLD(f) abuf->fields.sfmt_rcsr.f
1133 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1134 int UNUSED written = 0;
1135 IADDR UNUSED pc = abuf->addr;
1136 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1139 SI opval = CPU (h_csr[FLD (f_csr)]);
1140 CPU (h_gr[FLD (f_r2)]) = opval;
1141 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1148 /* sb: sb ($r0+$imm),$r1 */
1151 SEM_FN_NAME (lm32bf,sb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1153 #define FLD(f) abuf->fields.sfmt_addi.f
1154 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1155 int UNUSED written = 0;
1156 IADDR UNUSED pc = abuf->addr;
1157 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1160 QI opval = CPU (h_gr[FLD (f_r1)]);
1161 SETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1162 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1169 /* sextb: sextb $r2,$r0 */
1172 SEM_FN_NAME (lm32bf,sextb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1174 #define FLD(f) abuf->fields.sfmt_user.f
1175 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1176 int UNUSED written = 0;
1177 IADDR UNUSED pc = abuf->addr;
1178 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1181 SI opval = EXTQISI (TRUNCSIQI (CPU (h_gr[FLD (f_r0)])));
1182 CPU (h_gr[FLD (f_r2)]) = opval;
1183 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1190 /* sexth: sexth $r2,$r0 */
1193 SEM_FN_NAME (lm32bf,sexth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1195 #define FLD(f) abuf->fields.sfmt_user.f
1196 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1197 int UNUSED written = 0;
1198 IADDR UNUSED pc = abuf->addr;
1199 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1202 SI opval = EXTHISI (TRUNCSIHI (CPU (h_gr[FLD (f_r0)])));
1203 CPU (h_gr[FLD (f_r2)]) = opval;
1204 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1211 /* sh: sh ($r0+$imm),$r1 */
1214 SEM_FN_NAME (lm32bf,sh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1216 #define FLD(f) abuf->fields.sfmt_addi.f
1217 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1218 int UNUSED written = 0;
1219 IADDR UNUSED pc = abuf->addr;
1220 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1223 HI opval = CPU (h_gr[FLD (f_r1)]);
1224 SETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1225 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1232 /* sl: sl $r2,$r0,$r1 */
1235 SEM_FN_NAME (lm32bf,sl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1237 #define FLD(f) abuf->fields.sfmt_user.f
1238 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1239 int UNUSED written = 0;
1240 IADDR UNUSED pc = abuf->addr;
1241 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1244 SI opval = SLLSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1245 CPU (h_gr[FLD (f_r2)]) = opval;
1246 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1253 /* sli: sli $r1,$r0,$imm */
1256 SEM_FN_NAME (lm32bf,sli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1258 #define FLD(f) abuf->fields.sfmt_addi.f
1259 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1260 int UNUSED written = 0;
1261 IADDR UNUSED pc = abuf->addr;
1262 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1265 SI opval = SLLSI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
1266 CPU (h_gr[FLD (f_r1)]) = opval;
1267 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1274 /* sr: sr $r2,$r0,$r1 */
1277 SEM_FN_NAME (lm32bf,sr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1279 #define FLD(f) abuf->fields.sfmt_user.f
1280 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1281 int UNUSED written = 0;
1282 IADDR UNUSED pc = abuf->addr;
1283 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1286 SI opval = SRASI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1287 CPU (h_gr[FLD (f_r2)]) = opval;
1288 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1295 /* sri: sri $r1,$r0,$imm */
1298 SEM_FN_NAME (lm32bf,sri) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1300 #define FLD(f) abuf->fields.sfmt_addi.f
1301 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1302 int UNUSED written = 0;
1303 IADDR UNUSED pc = abuf->addr;
1304 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1307 SI opval = SRASI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
1308 CPU (h_gr[FLD (f_r1)]) = opval;
1309 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1316 /* sru: sru $r2,$r0,$r1 */
1319 SEM_FN_NAME (lm32bf,sru) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1321 #define FLD(f) abuf->fields.sfmt_user.f
1322 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1323 int UNUSED written = 0;
1324 IADDR UNUSED pc = abuf->addr;
1325 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1328 SI opval = SRLSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1329 CPU (h_gr[FLD (f_r2)]) = opval;
1330 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1337 /* srui: srui $r1,$r0,$imm */
1340 SEM_FN_NAME (lm32bf,srui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1342 #define FLD(f) abuf->fields.sfmt_addi.f
1343 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1344 int UNUSED written = 0;
1345 IADDR UNUSED pc = abuf->addr;
1346 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1349 SI opval = SRLSI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
1350 CPU (h_gr[FLD (f_r1)]) = opval;
1351 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1358 /* sub: sub $r2,$r0,$r1 */
1361 SEM_FN_NAME (lm32bf,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1363 #define FLD(f) abuf->fields.sfmt_user.f
1364 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1365 int UNUSED written = 0;
1366 IADDR UNUSED pc = abuf->addr;
1367 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1370 SI opval = SUBSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1371 CPU (h_gr[FLD (f_r2)]) = opval;
1372 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1379 /* sw: sw ($r0+$imm),$r1 */
1382 SEM_FN_NAME (lm32bf,sw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1384 #define FLD(f) abuf->fields.sfmt_addi.f
1385 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1386 int UNUSED written = 0;
1387 IADDR UNUSED pc = abuf->addr;
1388 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1391 SI opval = CPU (h_gr[FLD (f_r1)]);
1392 SETMEMSI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1393 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1400 /* user: user $r2,$r0,$r1,$user */
1403 SEM_FN_NAME (lm32bf,user) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1405 #define FLD(f) abuf->fields.sfmt_user.f
1406 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1407 int UNUSED written = 0;
1408 IADDR UNUSED pc = abuf->addr;
1409 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1412 SI opval = lm32bf_user_insn (current_cpu, CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]), FLD (f_user));
1413 CPU (h_gr[FLD (f_r2)]) = opval;
1414 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1421 /* wcsr: wcsr $csr,$r1 */
1424 SEM_FN_NAME (lm32bf,wcsr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1426 #define FLD(f) abuf->fields.sfmt_wcsr.f
1427 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1428 int UNUSED written = 0;
1429 IADDR UNUSED pc = abuf->addr;
1430 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1432 lm32bf_wcsr_insn (current_cpu, FLD (f_csr), CPU (h_gr[FLD (f_r1)]));
1438 /* xor: xor $r2,$r0,$r1 */
1441 SEM_FN_NAME (lm32bf,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1443 #define FLD(f) abuf->fields.sfmt_user.f
1444 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1445 int UNUSED written = 0;
1446 IADDR UNUSED pc = abuf->addr;
1447 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1450 SI opval = XORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1451 CPU (h_gr[FLD (f_r2)]) = opval;
1452 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1459 /* xori: xori $r1,$r0,$uimm */
1462 SEM_FN_NAME (lm32bf,xori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1464 #define FLD(f) abuf->fields.sfmt_andi.f
1465 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1466 int UNUSED written = 0;
1467 IADDR UNUSED pc = abuf->addr;
1468 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1471 SI opval = XORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
1472 CPU (h_gr[FLD (f_r1)]) = opval;
1473 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1480 /* xnor: xnor $r2,$r0,$r1 */
1483 SEM_FN_NAME (lm32bf,xnor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1485 #define FLD(f) abuf->fields.sfmt_user.f
1486 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1487 int UNUSED written = 0;
1488 IADDR UNUSED pc = abuf->addr;
1489 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1492 SI opval = INVSI (XORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)])));
1493 CPU (h_gr[FLD (f_r2)]) = opval;
1494 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1501 /* xnori: xnori $r1,$r0,$uimm */
1504 SEM_FN_NAME (lm32bf,xnori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1506 #define FLD(f) abuf->fields.sfmt_andi.f
1507 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1508 int UNUSED written = 0;
1509 IADDR UNUSED pc = abuf->addr;
1510 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1513 SI opval = INVSI (XORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm))));
1514 CPU (h_gr[FLD (f_r1)]) = opval;
1515 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1525 SEM_FN_NAME (lm32bf,break) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1527 #define FLD(f) abuf->fields.fmt_empty.f
1528 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1529 int UNUSED written = 0;
1530 IADDR UNUSED pc = abuf->addr;
1532 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1535 USI opval = lm32bf_break_insn (current_cpu, pc);
1536 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1537 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1540 SEM_BRANCH_FINI (vpc);
1548 SEM_FN_NAME (lm32bf,scall) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1550 #define FLD(f) abuf->fields.fmt_empty.f
1551 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1552 int UNUSED written = 0;
1553 IADDR UNUSED pc = abuf->addr;
1555 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1558 USI opval = lm32bf_scall_insn (current_cpu, pc);
1559 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1560 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1563 SEM_BRANCH_FINI (vpc);
1568 /* Table of all semantic fns. */
1570 static const struct sem_fn_desc sem_fns[] = {
1571 { LM32BF_INSN_X_INVALID, SEM_FN_NAME (lm32bf,x_invalid) },
1572 { LM32BF_INSN_X_AFTER, SEM_FN_NAME (lm32bf,x_after) },
1573 { LM32BF_INSN_X_BEFORE, SEM_FN_NAME (lm32bf,x_before) },
1574 { LM32BF_INSN_X_CTI_CHAIN, SEM_FN_NAME (lm32bf,x_cti_chain) },
1575 { LM32BF_INSN_X_CHAIN, SEM_FN_NAME (lm32bf,x_chain) },
1576 { LM32BF_INSN_X_BEGIN, SEM_FN_NAME (lm32bf,x_begin) },
1577 { LM32BF_INSN_ADD, SEM_FN_NAME (lm32bf,add) },
1578 { LM32BF_INSN_ADDI, SEM_FN_NAME (lm32bf,addi) },
1579 { LM32BF_INSN_AND, SEM_FN_NAME (lm32bf,and) },
1580 { LM32BF_INSN_ANDI, SEM_FN_NAME (lm32bf,andi) },
1581 { LM32BF_INSN_ANDHII, SEM_FN_NAME (lm32bf,andhii) },
1582 { LM32BF_INSN_B, SEM_FN_NAME (lm32bf,b) },
1583 { LM32BF_INSN_BI, SEM_FN_NAME (lm32bf,bi) },
1584 { LM32BF_INSN_BE, SEM_FN_NAME (lm32bf,be) },
1585 { LM32BF_INSN_BG, SEM_FN_NAME (lm32bf,bg) },
1586 { LM32BF_INSN_BGE, SEM_FN_NAME (lm32bf,bge) },
1587 { LM32BF_INSN_BGEU, SEM_FN_NAME (lm32bf,bgeu) },
1588 { LM32BF_INSN_BGU, SEM_FN_NAME (lm32bf,bgu) },
1589 { LM32BF_INSN_BNE, SEM_FN_NAME (lm32bf,bne) },
1590 { LM32BF_INSN_CALL, SEM_FN_NAME (lm32bf,call) },
1591 { LM32BF_INSN_CALLI, SEM_FN_NAME (lm32bf,calli) },
1592 { LM32BF_INSN_CMPE, SEM_FN_NAME (lm32bf,cmpe) },
1593 { LM32BF_INSN_CMPEI, SEM_FN_NAME (lm32bf,cmpei) },
1594 { LM32BF_INSN_CMPG, SEM_FN_NAME (lm32bf,cmpg) },
1595 { LM32BF_INSN_CMPGI, SEM_FN_NAME (lm32bf,cmpgi) },
1596 { LM32BF_INSN_CMPGE, SEM_FN_NAME (lm32bf,cmpge) },
1597 { LM32BF_INSN_CMPGEI, SEM_FN_NAME (lm32bf,cmpgei) },
1598 { LM32BF_INSN_CMPGEU, SEM_FN_NAME (lm32bf,cmpgeu) },
1599 { LM32BF_INSN_CMPGEUI, SEM_FN_NAME (lm32bf,cmpgeui) },
1600 { LM32BF_INSN_CMPGU, SEM_FN_NAME (lm32bf,cmpgu) },
1601 { LM32BF_INSN_CMPGUI, SEM_FN_NAME (lm32bf,cmpgui) },
1602 { LM32BF_INSN_CMPNE, SEM_FN_NAME (lm32bf,cmpne) },
1603 { LM32BF_INSN_CMPNEI, SEM_FN_NAME (lm32bf,cmpnei) },
1604 { LM32BF_INSN_DIVU, SEM_FN_NAME (lm32bf,divu) },
1605 { LM32BF_INSN_LB, SEM_FN_NAME (lm32bf,lb) },
1606 { LM32BF_INSN_LBU, SEM_FN_NAME (lm32bf,lbu) },
1607 { LM32BF_INSN_LH, SEM_FN_NAME (lm32bf,lh) },
1608 { LM32BF_INSN_LHU, SEM_FN_NAME (lm32bf,lhu) },
1609 { LM32BF_INSN_LW, SEM_FN_NAME (lm32bf,lw) },
1610 { LM32BF_INSN_MODU, SEM_FN_NAME (lm32bf,modu) },
1611 { LM32BF_INSN_MUL, SEM_FN_NAME (lm32bf,mul) },
1612 { LM32BF_INSN_MULI, SEM_FN_NAME (lm32bf,muli) },
1613 { LM32BF_INSN_NOR, SEM_FN_NAME (lm32bf,nor) },
1614 { LM32BF_INSN_NORI, SEM_FN_NAME (lm32bf,nori) },
1615 { LM32BF_INSN_OR, SEM_FN_NAME (lm32bf,or) },
1616 { LM32BF_INSN_ORI, SEM_FN_NAME (lm32bf,ori) },
1617 { LM32BF_INSN_ORHII, SEM_FN_NAME (lm32bf,orhii) },
1618 { LM32BF_INSN_RCSR, SEM_FN_NAME (lm32bf,rcsr) },
1619 { LM32BF_INSN_SB, SEM_FN_NAME (lm32bf,sb) },
1620 { LM32BF_INSN_SEXTB, SEM_FN_NAME (lm32bf,sextb) },
1621 { LM32BF_INSN_SEXTH, SEM_FN_NAME (lm32bf,sexth) },
1622 { LM32BF_INSN_SH, SEM_FN_NAME (lm32bf,sh) },
1623 { LM32BF_INSN_SL, SEM_FN_NAME (lm32bf,sl) },
1624 { LM32BF_INSN_SLI, SEM_FN_NAME (lm32bf,sli) },
1625 { LM32BF_INSN_SR, SEM_FN_NAME (lm32bf,sr) },
1626 { LM32BF_INSN_SRI, SEM_FN_NAME (lm32bf,sri) },
1627 { LM32BF_INSN_SRU, SEM_FN_NAME (lm32bf,sru) },
1628 { LM32BF_INSN_SRUI, SEM_FN_NAME (lm32bf,srui) },
1629 { LM32BF_INSN_SUB, SEM_FN_NAME (lm32bf,sub) },
1630 { LM32BF_INSN_SW, SEM_FN_NAME (lm32bf,sw) },
1631 { LM32BF_INSN_USER, SEM_FN_NAME (lm32bf,user) },
1632 { LM32BF_INSN_WCSR, SEM_FN_NAME (lm32bf,wcsr) },
1633 { LM32BF_INSN_XOR, SEM_FN_NAME (lm32bf,xor) },
1634 { LM32BF_INSN_XORI, SEM_FN_NAME (lm32bf,xori) },
1635 { LM32BF_INSN_XNOR, SEM_FN_NAME (lm32bf,xnor) },
1636 { LM32BF_INSN_XNORI, SEM_FN_NAME (lm32bf,xnori) },
1637 { LM32BF_INSN_BREAK, SEM_FN_NAME (lm32bf,break) },
1638 { LM32BF_INSN_SCALL, SEM_FN_NAME (lm32bf,scall) },
1642 /* Add the semantic fns to IDESC_TABLE. */
1645 SEM_FN_NAME (lm32bf,init_idesc_table) (SIM_CPU *current_cpu)
1647 IDESC *idesc_table = CPU_IDESC (current_cpu);
1648 const struct sem_fn_desc *sf;
1649 int mach_num = MACH_NUM (CPU_MACH (current_cpu));
1651 for (sf = &sem_fns[0]; sf->fn != 0; ++sf)
1653 const CGEN_INSN *insn = idesc_table[sf->index].idata;
1654 int valid_p = (CGEN_INSN_VIRTUAL_P (insn)
1655 || CGEN_INSN_MACH_HAS_P (insn, mach_num));
1658 idesc_table[sf->index].sem_fast = sf->fn;
1660 idesc_table[sf->index].sem_fast = SEM_FN_NAME (lm32bf,x_invalid);
1663 idesc_table[sf->index].sem_full = sf->fn;
1665 idesc_table[sf->index].sem_full = SEM_FN_NAME (lm32bf,x_invalid);