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
);
This page took 0.09147 seconds and 4 git commands to generate.