]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/lm32/sem.c
Update years in copyright notice for the GDB files.
[thirdparty/binutils-gdb.git] / sim / lm32 / sem.c
1 /* Simulator instruction semantics for lm32bf.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996-2013 Free Software Foundation, Inc.
6
7 This file is part of the GNU simulators.
8
9 This file is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3, or (at your option)
12 any later version.
13
14 It is distributed in the hope that it will be useful, but WITHOUT
15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
17 License for more details.
18
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, see <http://www.gnu.org/licenses/>.
21
22 */
23
24 #define WANT_CPU lm32bf
25 #define WANT_CPU_LM32BF
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 TRACE_RESULT
40 #define TRACE_RESULT(cpu, abuf, name, type, val)
41 #else
42 #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
43 #endif
44
45 /* x-invalid: --invalid-- */
46
47 static SEM_PC
48 SEM_FN_NAME (lm32bf,x_invalid) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
49 {
50 #define FLD(f) abuf->fields.sfmt_empty.f
51 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
52 int UNUSED written = 0;
53 IADDR UNUSED pc = abuf->addr;
54 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
55
56 {
57 /* Update the recorded pc in the cpu state struct.
58 Only necessary for WITH_SCACHE case, but to avoid the
59 conditional compilation .... */
60 SET_H_PC (pc);
61 /* Virtual insns have zero size. Overwrite vpc with address of next insn
62 using the default-insn-bitsize spec. When executing insns in parallel
63 we may want to queue the fault and continue execution. */
64 vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
65 vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
66 }
67
68 return vpc;
69 #undef FLD
70 }
71
72 /* x-after: --after-- */
73
74 static SEM_PC
75 SEM_FN_NAME (lm32bf,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_LM32BF
85 lm32bf_pbb_after (current_cpu, sem_arg);
86 #endif
87 }
88
89 return vpc;
90 #undef FLD
91 }
92
93 /* x-before: --before-- */
94
95 static SEM_PC
96 SEM_FN_NAME (lm32bf,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_LM32BF
106 lm32bf_pbb_before (current_cpu, sem_arg);
107 #endif
108 }
109
110 return vpc;
111 #undef FLD
112 }
113
114 /* x-cti-chain: --cti-chain-- */
115
116 static SEM_PC
117 SEM_FN_NAME (lm32bf,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_LM32BF
127 #ifdef DEFINE_SWITCH
128 vpc = lm32bf_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 = lm32bf_pbb_cti_chain (current_cpu, sem_arg,
134 CPU_PBB_BR_TYPE (current_cpu),
135 CPU_PBB_BR_NPC (current_cpu));
136 #endif
137 #endif
138 }
139
140 return vpc;
141 #undef FLD
142 }
143
144 /* x-chain: --chain-- */
145
146 static SEM_PC
147 SEM_FN_NAME (lm32bf,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_LM32BF
157 vpc = lm32bf_pbb_chain (current_cpu, sem_arg);
158 #ifdef DEFINE_SWITCH
159 BREAK (sem);
160 #endif
161 #endif
162 }
163
164 return vpc;
165 #undef FLD
166 }
167
168 /* x-begin: --begin-- */
169
170 static SEM_PC
171 SEM_FN_NAME (lm32bf,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_LM32BF
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 = lm32bf_pbb_begin (current_cpu, FAST_P);
185 #else
186 #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
187 vpc = lm32bf_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
188 #else
189 vpc = lm32bf_pbb_begin (current_cpu, 0);
190 #endif
191 #endif
192 #endif
193 }
194
195 return vpc;
196 #undef FLD
197 }
198
199 /* add: add $r2,$r0,$r1 */
200
201 static SEM_PC
202 SEM_FN_NAME (lm32bf,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
203 {
204 #define FLD(f) abuf->fields.sfmt_user.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, 4);
209
210 {
211 SI opval = ADDSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
212 CPU (h_gr[FLD (f_r2)]) = opval;
213 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
214 }
215
216 return vpc;
217 #undef FLD
218 }
219
220 /* addi: addi $r1,$r0,$imm */
221
222 static SEM_PC
223 SEM_FN_NAME (lm32bf,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
224 {
225 #define FLD(f) abuf->fields.sfmt_addi.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 (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
233 CPU (h_gr[FLD (f_r1)]) = opval;
234 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
235 }
236
237 return vpc;
238 #undef FLD
239 }
240
241 /* and: and $r2,$r0,$r1 */
242
243 static SEM_PC
244 SEM_FN_NAME (lm32bf,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
245 {
246 #define FLD(f) abuf->fields.sfmt_user.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, 4);
251
252 {
253 SI opval = ANDSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
254 CPU (h_gr[FLD (f_r2)]) = opval;
255 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
256 }
257
258 return vpc;
259 #undef FLD
260 }
261
262 /* andi: andi $r1,$r0,$uimm */
263
264 static SEM_PC
265 SEM_FN_NAME (lm32bf,andi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
266 {
267 #define FLD(f) abuf->fields.sfmt_andi.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 (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
275 CPU (h_gr[FLD (f_r1)]) = opval;
276 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
277 }
278
279 return vpc;
280 #undef FLD
281 }
282
283 /* andhii: andhi $r1,$r0,$hi16 */
284
285 static SEM_PC
286 SEM_FN_NAME (lm32bf,andhii) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
287 {
288 #define FLD(f) abuf->fields.sfmt_andi.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, 4);
293
294 {
295 SI opval = ANDSI (CPU (h_gr[FLD (f_r0)]), SLLSI (FLD (f_uimm), 16));
296 CPU (h_gr[FLD (f_r1)]) = opval;
297 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
298 }
299
300 return vpc;
301 #undef FLD
302 }
303
304 /* b: b $r0 */
305
306 static SEM_PC
307 SEM_FN_NAME (lm32bf,b) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
308 {
309 #define FLD(f) abuf->fields.sfmt_be.f
310 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
311 int UNUSED written = 0;
312 IADDR UNUSED pc = abuf->addr;
313 SEM_BRANCH_INIT
314 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
315
316 {
317 USI opval = lm32bf_b_insn (current_cpu, CPU (h_gr[FLD (f_r0)]), FLD (f_r0));
318 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
319 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
320 }
321
322 SEM_BRANCH_FINI (vpc);
323 return vpc;
324 #undef FLD
325 }
326
327 /* bi: bi $call */
328
329 static SEM_PC
330 SEM_FN_NAME (lm32bf,bi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
331 {
332 #define FLD(f) abuf->fields.sfmt_bi.f
333 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
334 int UNUSED written = 0;
335 IADDR UNUSED pc = abuf->addr;
336 SEM_BRANCH_INIT
337 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
338
339 {
340 USI opval = EXTSISI (FLD (i_call));
341 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
342 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
343 }
344
345 SEM_BRANCH_FINI (vpc);
346 return vpc;
347 #undef FLD
348 }
349
350 /* be: be $r0,$r1,$branch */
351
352 static SEM_PC
353 SEM_FN_NAME (lm32bf,be) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
354 {
355 #define FLD(f) abuf->fields.sfmt_be.f
356 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
357 int UNUSED written = 0;
358 IADDR UNUSED pc = abuf->addr;
359 SEM_BRANCH_INIT
360 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
361
362 if (EQSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
363 {
364 USI opval = FLD (i_branch);
365 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
366 written |= (1 << 3);
367 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
368 }
369 }
370
371 abuf->written = written;
372 SEM_BRANCH_FINI (vpc);
373 return vpc;
374 #undef FLD
375 }
376
377 /* bg: bg $r0,$r1,$branch */
378
379 static SEM_PC
380 SEM_FN_NAME (lm32bf,bg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
381 {
382 #define FLD(f) abuf->fields.sfmt_be.f
383 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
384 int UNUSED written = 0;
385 IADDR UNUSED pc = abuf->addr;
386 SEM_BRANCH_INIT
387 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
388
389 if (GTSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
390 {
391 USI opval = FLD (i_branch);
392 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
393 written |= (1 << 3);
394 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
395 }
396 }
397
398 abuf->written = written;
399 SEM_BRANCH_FINI (vpc);
400 return vpc;
401 #undef FLD
402 }
403
404 /* bge: bge $r0,$r1,$branch */
405
406 static SEM_PC
407 SEM_FN_NAME (lm32bf,bge) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
408 {
409 #define FLD(f) abuf->fields.sfmt_be.f
410 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
411 int UNUSED written = 0;
412 IADDR UNUSED pc = abuf->addr;
413 SEM_BRANCH_INIT
414 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
415
416 if (GESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
417 {
418 USI opval = FLD (i_branch);
419 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
420 written |= (1 << 3);
421 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
422 }
423 }
424
425 abuf->written = written;
426 SEM_BRANCH_FINI (vpc);
427 return vpc;
428 #undef FLD
429 }
430
431 /* bgeu: bgeu $r0,$r1,$branch */
432
433 static SEM_PC
434 SEM_FN_NAME (lm32bf,bgeu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
435 {
436 #define FLD(f) abuf->fields.sfmt_be.f
437 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
438 int UNUSED written = 0;
439 IADDR UNUSED pc = abuf->addr;
440 SEM_BRANCH_INIT
441 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
442
443 if (GEUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
444 {
445 USI opval = FLD (i_branch);
446 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
447 written |= (1 << 3);
448 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
449 }
450 }
451
452 abuf->written = written;
453 SEM_BRANCH_FINI (vpc);
454 return vpc;
455 #undef FLD
456 }
457
458 /* bgu: bgu $r0,$r1,$branch */
459
460 static SEM_PC
461 SEM_FN_NAME (lm32bf,bgu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
462 {
463 #define FLD(f) abuf->fields.sfmt_be.f
464 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
465 int UNUSED written = 0;
466 IADDR UNUSED pc = abuf->addr;
467 SEM_BRANCH_INIT
468 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
469
470 if (GTUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
471 {
472 USI opval = FLD (i_branch);
473 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
474 written |= (1 << 3);
475 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
476 }
477 }
478
479 abuf->written = written;
480 SEM_BRANCH_FINI (vpc);
481 return vpc;
482 #undef FLD
483 }
484
485 /* bne: bne $r0,$r1,$branch */
486
487 static SEM_PC
488 SEM_FN_NAME (lm32bf,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
489 {
490 #define FLD(f) abuf->fields.sfmt_be.f
491 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
492 int UNUSED written = 0;
493 IADDR UNUSED pc = abuf->addr;
494 SEM_BRANCH_INIT
495 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
496
497 if (NESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]))) {
498 {
499 USI opval = FLD (i_branch);
500 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
501 written |= (1 << 3);
502 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
503 }
504 }
505
506 abuf->written = written;
507 SEM_BRANCH_FINI (vpc);
508 return vpc;
509 #undef FLD
510 }
511
512 /* call: call $r0 */
513
514 static SEM_PC
515 SEM_FN_NAME (lm32bf,call) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
516 {
517 #define FLD(f) abuf->fields.sfmt_be.f
518 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
519 int UNUSED written = 0;
520 IADDR UNUSED pc = abuf->addr;
521 SEM_BRANCH_INIT
522 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
523
524 {
525 {
526 SI opval = ADDSI (pc, 4);
527 CPU (h_gr[((UINT) 29)]) = opval;
528 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
529 }
530 {
531 USI opval = CPU (h_gr[FLD (f_r0)]);
532 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
533 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
534 }
535 }
536
537 SEM_BRANCH_FINI (vpc);
538 return vpc;
539 #undef FLD
540 }
541
542 /* calli: calli $call */
543
544 static SEM_PC
545 SEM_FN_NAME (lm32bf,calli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
546 {
547 #define FLD(f) abuf->fields.sfmt_bi.f
548 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
549 int UNUSED written = 0;
550 IADDR UNUSED pc = abuf->addr;
551 SEM_BRANCH_INIT
552 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
553
554 {
555 {
556 SI opval = ADDSI (pc, 4);
557 CPU (h_gr[((UINT) 29)]) = opval;
558 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
559 }
560 {
561 USI opval = EXTSISI (FLD (i_call));
562 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
563 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
564 }
565 }
566
567 SEM_BRANCH_FINI (vpc);
568 return vpc;
569 #undef FLD
570 }
571
572 /* cmpe: cmpe $r2,$r0,$r1 */
573
574 static SEM_PC
575 SEM_FN_NAME (lm32bf,cmpe) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
576 {
577 #define FLD(f) abuf->fields.sfmt_user.f
578 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
579 int UNUSED written = 0;
580 IADDR UNUSED pc = abuf->addr;
581 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
582
583 {
584 SI opval = EQSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
585 CPU (h_gr[FLD (f_r2)]) = opval;
586 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
587 }
588
589 return vpc;
590 #undef FLD
591 }
592
593 /* cmpei: cmpei $r1,$r0,$imm */
594
595 static SEM_PC
596 SEM_FN_NAME (lm32bf,cmpei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
597 {
598 #define FLD(f) abuf->fields.sfmt_addi.f
599 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
600 int UNUSED written = 0;
601 IADDR UNUSED pc = abuf->addr;
602 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
603
604 {
605 SI opval = EQSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
606 CPU (h_gr[FLD (f_r1)]) = opval;
607 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
608 }
609
610 return vpc;
611 #undef FLD
612 }
613
614 /* cmpg: cmpg $r2,$r0,$r1 */
615
616 static SEM_PC
617 SEM_FN_NAME (lm32bf,cmpg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
618 {
619 #define FLD(f) abuf->fields.sfmt_user.f
620 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
621 int UNUSED written = 0;
622 IADDR UNUSED pc = abuf->addr;
623 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
624
625 {
626 SI opval = GTSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
627 CPU (h_gr[FLD (f_r2)]) = opval;
628 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
629 }
630
631 return vpc;
632 #undef FLD
633 }
634
635 /* cmpgi: cmpgi $r1,$r0,$imm */
636
637 static SEM_PC
638 SEM_FN_NAME (lm32bf,cmpgi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
639 {
640 #define FLD(f) abuf->fields.sfmt_addi.f
641 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
642 int UNUSED written = 0;
643 IADDR UNUSED pc = abuf->addr;
644 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
645
646 {
647 SI opval = GTSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
648 CPU (h_gr[FLD (f_r1)]) = opval;
649 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
650 }
651
652 return vpc;
653 #undef FLD
654 }
655
656 /* cmpge: cmpge $r2,$r0,$r1 */
657
658 static SEM_PC
659 SEM_FN_NAME (lm32bf,cmpge) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
660 {
661 #define FLD(f) abuf->fields.sfmt_user.f
662 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
663 int UNUSED written = 0;
664 IADDR UNUSED pc = abuf->addr;
665 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
666
667 {
668 SI opval = GESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
669 CPU (h_gr[FLD (f_r2)]) = opval;
670 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
671 }
672
673 return vpc;
674 #undef FLD
675 }
676
677 /* cmpgei: cmpgei $r1,$r0,$imm */
678
679 static SEM_PC
680 SEM_FN_NAME (lm32bf,cmpgei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
681 {
682 #define FLD(f) abuf->fields.sfmt_addi.f
683 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
684 int UNUSED written = 0;
685 IADDR UNUSED pc = abuf->addr;
686 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
687
688 {
689 SI opval = GESI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
690 CPU (h_gr[FLD (f_r1)]) = opval;
691 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
692 }
693
694 return vpc;
695 #undef FLD
696 }
697
698 /* cmpgeu: cmpgeu $r2,$r0,$r1 */
699
700 static SEM_PC
701 SEM_FN_NAME (lm32bf,cmpgeu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
702 {
703 #define FLD(f) abuf->fields.sfmt_user.f
704 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
705 int UNUSED written = 0;
706 IADDR UNUSED pc = abuf->addr;
707 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
708
709 {
710 SI opval = GEUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
711 CPU (h_gr[FLD (f_r2)]) = opval;
712 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
713 }
714
715 return vpc;
716 #undef FLD
717 }
718
719 /* cmpgeui: cmpgeui $r1,$r0,$uimm */
720
721 static SEM_PC
722 SEM_FN_NAME (lm32bf,cmpgeui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
723 {
724 #define FLD(f) abuf->fields.sfmt_andi.f
725 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
726 int UNUSED written = 0;
727 IADDR UNUSED pc = abuf->addr;
728 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
729
730 {
731 SI opval = GEUSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
732 CPU (h_gr[FLD (f_r1)]) = opval;
733 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
734 }
735
736 return vpc;
737 #undef FLD
738 }
739
740 /* cmpgu: cmpgu $r2,$r0,$r1 */
741
742 static SEM_PC
743 SEM_FN_NAME (lm32bf,cmpgu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
744 {
745 #define FLD(f) abuf->fields.sfmt_user.f
746 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
747 int UNUSED written = 0;
748 IADDR UNUSED pc = abuf->addr;
749 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
750
751 {
752 SI opval = GTUSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
753 CPU (h_gr[FLD (f_r2)]) = opval;
754 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
755 }
756
757 return vpc;
758 #undef FLD
759 }
760
761 /* cmpgui: cmpgui $r1,$r0,$uimm */
762
763 static SEM_PC
764 SEM_FN_NAME (lm32bf,cmpgui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
765 {
766 #define FLD(f) abuf->fields.sfmt_andi.f
767 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
768 int UNUSED written = 0;
769 IADDR UNUSED pc = abuf->addr;
770 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
771
772 {
773 SI opval = GTUSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
774 CPU (h_gr[FLD (f_r1)]) = opval;
775 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
776 }
777
778 return vpc;
779 #undef FLD
780 }
781
782 /* cmpne: cmpne $r2,$r0,$r1 */
783
784 static SEM_PC
785 SEM_FN_NAME (lm32bf,cmpne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
786 {
787 #define FLD(f) abuf->fields.sfmt_user.f
788 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
789 int UNUSED written = 0;
790 IADDR UNUSED pc = abuf->addr;
791 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
792
793 {
794 SI opval = NESI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
795 CPU (h_gr[FLD (f_r2)]) = opval;
796 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
797 }
798
799 return vpc;
800 #undef FLD
801 }
802
803 /* cmpnei: cmpnei $r1,$r0,$imm */
804
805 static SEM_PC
806 SEM_FN_NAME (lm32bf,cmpnei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
807 {
808 #define FLD(f) abuf->fields.sfmt_addi.f
809 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
810 int UNUSED written = 0;
811 IADDR UNUSED pc = abuf->addr;
812 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
813
814 {
815 SI opval = NESI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
816 CPU (h_gr[FLD (f_r1)]) = opval;
817 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
818 }
819
820 return vpc;
821 #undef FLD
822 }
823
824 /* divu: divu $r2,$r0,$r1 */
825
826 static SEM_PC
827 SEM_FN_NAME (lm32bf,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
828 {
829 #define FLD(f) abuf->fields.sfmt_user.f
830 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
831 int UNUSED written = 0;
832 IADDR UNUSED pc = abuf->addr;
833 SEM_BRANCH_INIT
834 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
835
836 {
837 USI opval = lm32bf_divu_insn (current_cpu, pc, FLD (f_r0), FLD (f_r1), FLD (f_r2));
838 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
839 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
840 }
841
842 SEM_BRANCH_FINI (vpc);
843 return vpc;
844 #undef FLD
845 }
846
847 /* lb: lb $r1,($r0+$imm) */
848
849 static SEM_PC
850 SEM_FN_NAME (lm32bf,lb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
851 {
852 #define FLD(f) abuf->fields.sfmt_addi.f
853 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
854 int UNUSED written = 0;
855 IADDR UNUSED pc = abuf->addr;
856 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
857
858 {
859 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
860 CPU (h_gr[FLD (f_r1)]) = opval;
861 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
862 }
863
864 return vpc;
865 #undef FLD
866 }
867
868 /* lbu: lbu $r1,($r0+$imm) */
869
870 static SEM_PC
871 SEM_FN_NAME (lm32bf,lbu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
872 {
873 #define FLD(f) abuf->fields.sfmt_addi.f
874 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
875 int UNUSED written = 0;
876 IADDR UNUSED pc = abuf->addr;
877 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
878
879 {
880 SI opval = ZEXTQISI (GETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
881 CPU (h_gr[FLD (f_r1)]) = opval;
882 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
883 }
884
885 return vpc;
886 #undef FLD
887 }
888
889 /* lh: lh $r1,($r0+$imm) */
890
891 static SEM_PC
892 SEM_FN_NAME (lm32bf,lh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
893 {
894 #define FLD(f) abuf->fields.sfmt_addi.f
895 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
896 int UNUSED written = 0;
897 IADDR UNUSED pc = abuf->addr;
898 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
899
900 {
901 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
902 CPU (h_gr[FLD (f_r1)]) = opval;
903 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
904 }
905
906 return vpc;
907 #undef FLD
908 }
909
910 /* lhu: lhu $r1,($r0+$imm) */
911
912 static SEM_PC
913 SEM_FN_NAME (lm32bf,lhu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
914 {
915 #define FLD(f) abuf->fields.sfmt_addi.f
916 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
917 int UNUSED written = 0;
918 IADDR UNUSED pc = abuf->addr;
919 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
920
921 {
922 SI opval = ZEXTHISI (GETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))))));
923 CPU (h_gr[FLD (f_r1)]) = opval;
924 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
925 }
926
927 return vpc;
928 #undef FLD
929 }
930
931 /* lw: lw $r1,($r0+$imm) */
932
933 static SEM_PC
934 SEM_FN_NAME (lm32bf,lw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
935 {
936 #define FLD(f) abuf->fields.sfmt_addi.f
937 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
938 int UNUSED written = 0;
939 IADDR UNUSED pc = abuf->addr;
940 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
941
942 {
943 SI opval = GETMEMSI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))));
944 CPU (h_gr[FLD (f_r1)]) = opval;
945 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
946 }
947
948 return vpc;
949 #undef FLD
950 }
951
952 /* modu: modu $r2,$r0,$r1 */
953
954 static SEM_PC
955 SEM_FN_NAME (lm32bf,modu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
956 {
957 #define FLD(f) abuf->fields.sfmt_user.f
958 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
959 int UNUSED written = 0;
960 IADDR UNUSED pc = abuf->addr;
961 SEM_BRANCH_INIT
962 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
963
964 {
965 USI opval = lm32bf_modu_insn (current_cpu, pc, FLD (f_r0), FLD (f_r1), FLD (f_r2));
966 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
967 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
968 }
969
970 SEM_BRANCH_FINI (vpc);
971 return vpc;
972 #undef FLD
973 }
974
975 /* mul: mul $r2,$r0,$r1 */
976
977 static SEM_PC
978 SEM_FN_NAME (lm32bf,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
979 {
980 #define FLD(f) abuf->fields.sfmt_user.f
981 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
982 int UNUSED written = 0;
983 IADDR UNUSED pc = abuf->addr;
984 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
985
986 {
987 SI opval = MULSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
988 CPU (h_gr[FLD (f_r2)]) = opval;
989 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
990 }
991
992 return vpc;
993 #undef FLD
994 }
995
996 /* muli: muli $r1,$r0,$imm */
997
998 static SEM_PC
999 SEM_FN_NAME (lm32bf,muli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1000 {
1001 #define FLD(f) abuf->fields.sfmt_addi.f
1002 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1003 int UNUSED written = 0;
1004 IADDR UNUSED pc = abuf->addr;
1005 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1006
1007 {
1008 SI opval = MULSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm))));
1009 CPU (h_gr[FLD (f_r1)]) = opval;
1010 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1011 }
1012
1013 return vpc;
1014 #undef FLD
1015 }
1016
1017 /* nor: nor $r2,$r0,$r1 */
1018
1019 static SEM_PC
1020 SEM_FN_NAME (lm32bf,nor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1021 {
1022 #define FLD(f) abuf->fields.sfmt_user.f
1023 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1024 int UNUSED written = 0;
1025 IADDR UNUSED pc = abuf->addr;
1026 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1027
1028 {
1029 SI opval = INVSI (ORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)])));
1030 CPU (h_gr[FLD (f_r2)]) = opval;
1031 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1032 }
1033
1034 return vpc;
1035 #undef FLD
1036 }
1037
1038 /* nori: nori $r1,$r0,$uimm */
1039
1040 static SEM_PC
1041 SEM_FN_NAME (lm32bf,nori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1042 {
1043 #define FLD(f) abuf->fields.sfmt_andi.f
1044 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1045 int UNUSED written = 0;
1046 IADDR UNUSED pc = abuf->addr;
1047 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1048
1049 {
1050 SI opval = INVSI (ORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm))));
1051 CPU (h_gr[FLD (f_r1)]) = opval;
1052 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1053 }
1054
1055 return vpc;
1056 #undef FLD
1057 }
1058
1059 /* or: or $r2,$r0,$r1 */
1060
1061 static SEM_PC
1062 SEM_FN_NAME (lm32bf,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1063 {
1064 #define FLD(f) abuf->fields.sfmt_user.f
1065 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1066 int UNUSED written = 0;
1067 IADDR UNUSED pc = abuf->addr;
1068 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1069
1070 {
1071 SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1072 CPU (h_gr[FLD (f_r2)]) = opval;
1073 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1074 }
1075
1076 return vpc;
1077 #undef FLD
1078 }
1079
1080 /* ori: ori $r1,$r0,$lo16 */
1081
1082 static SEM_PC
1083 SEM_FN_NAME (lm32bf,ori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1084 {
1085 #define FLD(f) abuf->fields.sfmt_andi.f
1086 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1087 int UNUSED written = 0;
1088 IADDR UNUSED pc = abuf->addr;
1089 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1090
1091 {
1092 SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
1093 CPU (h_gr[FLD (f_r1)]) = opval;
1094 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1095 }
1096
1097 return vpc;
1098 #undef FLD
1099 }
1100
1101 /* orhii: orhi $r1,$r0,$hi16 */
1102
1103 static SEM_PC
1104 SEM_FN_NAME (lm32bf,orhii) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1105 {
1106 #define FLD(f) abuf->fields.sfmt_andi.f
1107 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1108 int UNUSED written = 0;
1109 IADDR UNUSED pc = abuf->addr;
1110 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1111
1112 {
1113 SI opval = ORSI (CPU (h_gr[FLD (f_r0)]), SLLSI (FLD (f_uimm), 16));
1114 CPU (h_gr[FLD (f_r1)]) = opval;
1115 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1116 }
1117
1118 return vpc;
1119 #undef FLD
1120 }
1121
1122 /* rcsr: rcsr $r2,$csr */
1123
1124 static SEM_PC
1125 SEM_FN_NAME (lm32bf,rcsr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1126 {
1127 #define FLD(f) abuf->fields.sfmt_rcsr.f
1128 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1129 int UNUSED written = 0;
1130 IADDR UNUSED pc = abuf->addr;
1131 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1132
1133 {
1134 SI opval = CPU (h_csr[FLD (f_csr)]);
1135 CPU (h_gr[FLD (f_r2)]) = opval;
1136 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1137 }
1138
1139 return vpc;
1140 #undef FLD
1141 }
1142
1143 /* sb: sb ($r0+$imm),$r1 */
1144
1145 static SEM_PC
1146 SEM_FN_NAME (lm32bf,sb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1147 {
1148 #define FLD(f) abuf->fields.sfmt_addi.f
1149 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1150 int UNUSED written = 0;
1151 IADDR UNUSED pc = abuf->addr;
1152 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1153
1154 {
1155 QI opval = CPU (h_gr[FLD (f_r1)]);
1156 SETMEMQI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1157 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1158 }
1159
1160 return vpc;
1161 #undef FLD
1162 }
1163
1164 /* sextb: sextb $r2,$r0 */
1165
1166 static SEM_PC
1167 SEM_FN_NAME (lm32bf,sextb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1168 {
1169 #define FLD(f) abuf->fields.sfmt_user.f
1170 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1171 int UNUSED written = 0;
1172 IADDR UNUSED pc = abuf->addr;
1173 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1174
1175 {
1176 SI opval = EXTQISI (TRUNCSIQI (CPU (h_gr[FLD (f_r0)])));
1177 CPU (h_gr[FLD (f_r2)]) = opval;
1178 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1179 }
1180
1181 return vpc;
1182 #undef FLD
1183 }
1184
1185 /* sexth: sexth $r2,$r0 */
1186
1187 static SEM_PC
1188 SEM_FN_NAME (lm32bf,sexth) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1189 {
1190 #define FLD(f) abuf->fields.sfmt_user.f
1191 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1192 int UNUSED written = 0;
1193 IADDR UNUSED pc = abuf->addr;
1194 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1195
1196 {
1197 SI opval = EXTHISI (TRUNCSIHI (CPU (h_gr[FLD (f_r0)])));
1198 CPU (h_gr[FLD (f_r2)]) = opval;
1199 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1200 }
1201
1202 return vpc;
1203 #undef FLD
1204 }
1205
1206 /* sh: sh ($r0+$imm),$r1 */
1207
1208 static SEM_PC
1209 SEM_FN_NAME (lm32bf,sh) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1210 {
1211 #define FLD(f) abuf->fields.sfmt_addi.f
1212 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1213 int UNUSED written = 0;
1214 IADDR UNUSED pc = abuf->addr;
1215 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1216
1217 {
1218 HI opval = CPU (h_gr[FLD (f_r1)]);
1219 SETMEMHI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1220 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1221 }
1222
1223 return vpc;
1224 #undef FLD
1225 }
1226
1227 /* sl: sl $r2,$r0,$r1 */
1228
1229 static SEM_PC
1230 SEM_FN_NAME (lm32bf,sl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1231 {
1232 #define FLD(f) abuf->fields.sfmt_user.f
1233 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1234 int UNUSED written = 0;
1235 IADDR UNUSED pc = abuf->addr;
1236 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1237
1238 {
1239 SI opval = SLLSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1240 CPU (h_gr[FLD (f_r2)]) = opval;
1241 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1242 }
1243
1244 return vpc;
1245 #undef FLD
1246 }
1247
1248 /* sli: sli $r1,$r0,$imm */
1249
1250 static SEM_PC
1251 SEM_FN_NAME (lm32bf,sli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1252 {
1253 #define FLD(f) abuf->fields.sfmt_addi.f
1254 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1255 int UNUSED written = 0;
1256 IADDR UNUSED pc = abuf->addr;
1257 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1258
1259 {
1260 SI opval = SLLSI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
1261 CPU (h_gr[FLD (f_r1)]) = opval;
1262 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1263 }
1264
1265 return vpc;
1266 #undef FLD
1267 }
1268
1269 /* sr: sr $r2,$r0,$r1 */
1270
1271 static SEM_PC
1272 SEM_FN_NAME (lm32bf,sr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1273 {
1274 #define FLD(f) abuf->fields.sfmt_user.f
1275 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1276 int UNUSED written = 0;
1277 IADDR UNUSED pc = abuf->addr;
1278 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1279
1280 {
1281 SI opval = SRASI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1282 CPU (h_gr[FLD (f_r2)]) = opval;
1283 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1284 }
1285
1286 return vpc;
1287 #undef FLD
1288 }
1289
1290 /* sri: sri $r1,$r0,$imm */
1291
1292 static SEM_PC
1293 SEM_FN_NAME (lm32bf,sri) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1294 {
1295 #define FLD(f) abuf->fields.sfmt_addi.f
1296 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1297 int UNUSED written = 0;
1298 IADDR UNUSED pc = abuf->addr;
1299 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1300
1301 {
1302 SI opval = SRASI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
1303 CPU (h_gr[FLD (f_r1)]) = opval;
1304 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1305 }
1306
1307 return vpc;
1308 #undef FLD
1309 }
1310
1311 /* sru: sru $r2,$r0,$r1 */
1312
1313 static SEM_PC
1314 SEM_FN_NAME (lm32bf,sru) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1315 {
1316 #define FLD(f) abuf->fields.sfmt_user.f
1317 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1318 int UNUSED written = 0;
1319 IADDR UNUSED pc = abuf->addr;
1320 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1321
1322 {
1323 SI opval = SRLSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1324 CPU (h_gr[FLD (f_r2)]) = opval;
1325 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1326 }
1327
1328 return vpc;
1329 #undef FLD
1330 }
1331
1332 /* srui: srui $r1,$r0,$imm */
1333
1334 static SEM_PC
1335 SEM_FN_NAME (lm32bf,srui) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1336 {
1337 #define FLD(f) abuf->fields.sfmt_addi.f
1338 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1339 int UNUSED written = 0;
1340 IADDR UNUSED pc = abuf->addr;
1341 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1342
1343 {
1344 SI opval = SRLSI (CPU (h_gr[FLD (f_r0)]), FLD (f_imm));
1345 CPU (h_gr[FLD (f_r1)]) = opval;
1346 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1347 }
1348
1349 return vpc;
1350 #undef FLD
1351 }
1352
1353 /* sub: sub $r2,$r0,$r1 */
1354
1355 static SEM_PC
1356 SEM_FN_NAME (lm32bf,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1357 {
1358 #define FLD(f) abuf->fields.sfmt_user.f
1359 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1360 int UNUSED written = 0;
1361 IADDR UNUSED pc = abuf->addr;
1362 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1363
1364 {
1365 SI opval = SUBSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1366 CPU (h_gr[FLD (f_r2)]) = opval;
1367 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1368 }
1369
1370 return vpc;
1371 #undef FLD
1372 }
1373
1374 /* sw: sw ($r0+$imm),$r1 */
1375
1376 static SEM_PC
1377 SEM_FN_NAME (lm32bf,sw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1378 {
1379 #define FLD(f) abuf->fields.sfmt_addi.f
1380 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1381 int UNUSED written = 0;
1382 IADDR UNUSED pc = abuf->addr;
1383 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1384
1385 {
1386 SI opval = CPU (h_gr[FLD (f_r1)]);
1387 SETMEMSI (current_cpu, pc, ADDSI (CPU (h_gr[FLD (f_r0)]), EXTHISI (TRUNCSIHI (FLD (f_imm)))), opval);
1388 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
1389 }
1390
1391 return vpc;
1392 #undef FLD
1393 }
1394
1395 /* user: user $r2,$r0,$r1,$user */
1396
1397 static SEM_PC
1398 SEM_FN_NAME (lm32bf,user) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1399 {
1400 #define FLD(f) abuf->fields.sfmt_user.f
1401 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1402 int UNUSED written = 0;
1403 IADDR UNUSED pc = abuf->addr;
1404 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1405
1406 {
1407 SI opval = lm32bf_user_insn (current_cpu, CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]), FLD (f_user));
1408 CPU (h_gr[FLD (f_r2)]) = opval;
1409 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1410 }
1411
1412 return vpc;
1413 #undef FLD
1414 }
1415
1416 /* wcsr: wcsr $csr,$r1 */
1417
1418 static SEM_PC
1419 SEM_FN_NAME (lm32bf,wcsr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1420 {
1421 #define FLD(f) abuf->fields.sfmt_wcsr.f
1422 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1423 int UNUSED written = 0;
1424 IADDR UNUSED pc = abuf->addr;
1425 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1426
1427 lm32bf_wcsr_insn (current_cpu, FLD (f_csr), CPU (h_gr[FLD (f_r1)]));
1428
1429 return vpc;
1430 #undef FLD
1431 }
1432
1433 /* xor: xor $r2,$r0,$r1 */
1434
1435 static SEM_PC
1436 SEM_FN_NAME (lm32bf,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1437 {
1438 #define FLD(f) abuf->fields.sfmt_user.f
1439 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1440 int UNUSED written = 0;
1441 IADDR UNUSED pc = abuf->addr;
1442 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1443
1444 {
1445 SI opval = XORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)]));
1446 CPU (h_gr[FLD (f_r2)]) = opval;
1447 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1448 }
1449
1450 return vpc;
1451 #undef FLD
1452 }
1453
1454 /* xori: xori $r1,$r0,$uimm */
1455
1456 static SEM_PC
1457 SEM_FN_NAME (lm32bf,xori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1458 {
1459 #define FLD(f) abuf->fields.sfmt_andi.f
1460 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1461 int UNUSED written = 0;
1462 IADDR UNUSED pc = abuf->addr;
1463 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1464
1465 {
1466 SI opval = XORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm)));
1467 CPU (h_gr[FLD (f_r1)]) = opval;
1468 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1469 }
1470
1471 return vpc;
1472 #undef FLD
1473 }
1474
1475 /* xnor: xnor $r2,$r0,$r1 */
1476
1477 static SEM_PC
1478 SEM_FN_NAME (lm32bf,xnor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1479 {
1480 #define FLD(f) abuf->fields.sfmt_user.f
1481 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1482 int UNUSED written = 0;
1483 IADDR UNUSED pc = abuf->addr;
1484 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1485
1486 {
1487 SI opval = INVSI (XORSI (CPU (h_gr[FLD (f_r0)]), CPU (h_gr[FLD (f_r1)])));
1488 CPU (h_gr[FLD (f_r2)]) = opval;
1489 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1490 }
1491
1492 return vpc;
1493 #undef FLD
1494 }
1495
1496 /* xnori: xnori $r1,$r0,$uimm */
1497
1498 static SEM_PC
1499 SEM_FN_NAME (lm32bf,xnori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1500 {
1501 #define FLD(f) abuf->fields.sfmt_andi.f
1502 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1503 int UNUSED written = 0;
1504 IADDR UNUSED pc = abuf->addr;
1505 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1506
1507 {
1508 SI opval = INVSI (XORSI (CPU (h_gr[FLD (f_r0)]), ZEXTSISI (FLD (f_uimm))));
1509 CPU (h_gr[FLD (f_r1)]) = opval;
1510 TRACE_RESULT (current_cpu, abuf, "gr", 'x', opval);
1511 }
1512
1513 return vpc;
1514 #undef FLD
1515 }
1516
1517 /* break: break */
1518
1519 static SEM_PC
1520 SEM_FN_NAME (lm32bf,break) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1521 {
1522 #define FLD(f) abuf->fields.sfmt_empty.f
1523 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1524 int UNUSED written = 0;
1525 IADDR UNUSED pc = abuf->addr;
1526 SEM_BRANCH_INIT
1527 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1528
1529 {
1530 USI opval = lm32bf_break_insn (current_cpu, pc);
1531 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1532 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1533 }
1534
1535 SEM_BRANCH_FINI (vpc);
1536 return vpc;
1537 #undef FLD
1538 }
1539
1540 /* scall: scall */
1541
1542 static SEM_PC
1543 SEM_FN_NAME (lm32bf,scall) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1544 {
1545 #define FLD(f) abuf->fields.sfmt_empty.f
1546 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1547 int UNUSED written = 0;
1548 IADDR UNUSED pc = abuf->addr;
1549 SEM_BRANCH_INIT
1550 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1551
1552 {
1553 USI opval = lm32bf_scall_insn (current_cpu, pc);
1554 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
1555 TRACE_RESULT (current_cpu, abuf, "pc", 'x', opval);
1556 }
1557
1558 SEM_BRANCH_FINI (vpc);
1559 return vpc;
1560 #undef FLD
1561 }
1562
1563 /* Table of all semantic fns. */
1564
1565 static const struct sem_fn_desc sem_fns[] = {
1566 { LM32BF_INSN_X_INVALID, SEM_FN_NAME (lm32bf,x_invalid) },
1567 { LM32BF_INSN_X_AFTER, SEM_FN_NAME (lm32bf,x_after) },
1568 { LM32BF_INSN_X_BEFORE, SEM_FN_NAME (lm32bf,x_before) },
1569 { LM32BF_INSN_X_CTI_CHAIN, SEM_FN_NAME (lm32bf,x_cti_chain) },
1570 { LM32BF_INSN_X_CHAIN, SEM_FN_NAME (lm32bf,x_chain) },
1571 { LM32BF_INSN_X_BEGIN, SEM_FN_NAME (lm32bf,x_begin) },
1572 { LM32BF_INSN_ADD, SEM_FN_NAME (lm32bf,add) },
1573 { LM32BF_INSN_ADDI, SEM_FN_NAME (lm32bf,addi) },
1574 { LM32BF_INSN_AND, SEM_FN_NAME (lm32bf,and) },
1575 { LM32BF_INSN_ANDI, SEM_FN_NAME (lm32bf,andi) },
1576 { LM32BF_INSN_ANDHII, SEM_FN_NAME (lm32bf,andhii) },
1577 { LM32BF_INSN_B, SEM_FN_NAME (lm32bf,b) },
1578 { LM32BF_INSN_BI, SEM_FN_NAME (lm32bf,bi) },
1579 { LM32BF_INSN_BE, SEM_FN_NAME (lm32bf,be) },
1580 { LM32BF_INSN_BG, SEM_FN_NAME (lm32bf,bg) },
1581 { LM32BF_INSN_BGE, SEM_FN_NAME (lm32bf,bge) },
1582 { LM32BF_INSN_BGEU, SEM_FN_NAME (lm32bf,bgeu) },
1583 { LM32BF_INSN_BGU, SEM_FN_NAME (lm32bf,bgu) },
1584 { LM32BF_INSN_BNE, SEM_FN_NAME (lm32bf,bne) },
1585 { LM32BF_INSN_CALL, SEM_FN_NAME (lm32bf,call) },
1586 { LM32BF_INSN_CALLI, SEM_FN_NAME (lm32bf,calli) },
1587 { LM32BF_INSN_CMPE, SEM_FN_NAME (lm32bf,cmpe) },
1588 { LM32BF_INSN_CMPEI, SEM_FN_NAME (lm32bf,cmpei) },
1589 { LM32BF_INSN_CMPG, SEM_FN_NAME (lm32bf,cmpg) },
1590 { LM32BF_INSN_CMPGI, SEM_FN_NAME (lm32bf,cmpgi) },
1591 { LM32BF_INSN_CMPGE, SEM_FN_NAME (lm32bf,cmpge) },
1592 { LM32BF_INSN_CMPGEI, SEM_FN_NAME (lm32bf,cmpgei) },
1593 { LM32BF_INSN_CMPGEU, SEM_FN_NAME (lm32bf,cmpgeu) },
1594 { LM32BF_INSN_CMPGEUI, SEM_FN_NAME (lm32bf,cmpgeui) },
1595 { LM32BF_INSN_CMPGU, SEM_FN_NAME (lm32bf,cmpgu) },
1596 { LM32BF_INSN_CMPGUI, SEM_FN_NAME (lm32bf,cmpgui) },
1597 { LM32BF_INSN_CMPNE, SEM_FN_NAME (lm32bf,cmpne) },
1598 { LM32BF_INSN_CMPNEI, SEM_FN_NAME (lm32bf,cmpnei) },
1599 { LM32BF_INSN_DIVU, SEM_FN_NAME (lm32bf,divu) },
1600 { LM32BF_INSN_LB, SEM_FN_NAME (lm32bf,lb) },
1601 { LM32BF_INSN_LBU, SEM_FN_NAME (lm32bf,lbu) },
1602 { LM32BF_INSN_LH, SEM_FN_NAME (lm32bf,lh) },
1603 { LM32BF_INSN_LHU, SEM_FN_NAME (lm32bf,lhu) },
1604 { LM32BF_INSN_LW, SEM_FN_NAME (lm32bf,lw) },
1605 { LM32BF_INSN_MODU, SEM_FN_NAME (lm32bf,modu) },
1606 { LM32BF_INSN_MUL, SEM_FN_NAME (lm32bf,mul) },
1607 { LM32BF_INSN_MULI, SEM_FN_NAME (lm32bf,muli) },
1608 { LM32BF_INSN_NOR, SEM_FN_NAME (lm32bf,nor) },
1609 { LM32BF_INSN_NORI, SEM_FN_NAME (lm32bf,nori) },
1610 { LM32BF_INSN_OR, SEM_FN_NAME (lm32bf,or) },
1611 { LM32BF_INSN_ORI, SEM_FN_NAME (lm32bf,ori) },
1612 { LM32BF_INSN_ORHII, SEM_FN_NAME (lm32bf,orhii) },
1613 { LM32BF_INSN_RCSR, SEM_FN_NAME (lm32bf,rcsr) },
1614 { LM32BF_INSN_SB, SEM_FN_NAME (lm32bf,sb) },
1615 { LM32BF_INSN_SEXTB, SEM_FN_NAME (lm32bf,sextb) },
1616 { LM32BF_INSN_SEXTH, SEM_FN_NAME (lm32bf,sexth) },
1617 { LM32BF_INSN_SH, SEM_FN_NAME (lm32bf,sh) },
1618 { LM32BF_INSN_SL, SEM_FN_NAME (lm32bf,sl) },
1619 { LM32BF_INSN_SLI, SEM_FN_NAME (lm32bf,sli) },
1620 { LM32BF_INSN_SR, SEM_FN_NAME (lm32bf,sr) },
1621 { LM32BF_INSN_SRI, SEM_FN_NAME (lm32bf,sri) },
1622 { LM32BF_INSN_SRU, SEM_FN_NAME (lm32bf,sru) },
1623 { LM32BF_INSN_SRUI, SEM_FN_NAME (lm32bf,srui) },
1624 { LM32BF_INSN_SUB, SEM_FN_NAME (lm32bf,sub) },
1625 { LM32BF_INSN_SW, SEM_FN_NAME (lm32bf,sw) },
1626 { LM32BF_INSN_USER, SEM_FN_NAME (lm32bf,user) },
1627 { LM32BF_INSN_WCSR, SEM_FN_NAME (lm32bf,wcsr) },
1628 { LM32BF_INSN_XOR, SEM_FN_NAME (lm32bf,xor) },
1629 { LM32BF_INSN_XORI, SEM_FN_NAME (lm32bf,xori) },
1630 { LM32BF_INSN_XNOR, SEM_FN_NAME (lm32bf,xnor) },
1631 { LM32BF_INSN_XNORI, SEM_FN_NAME (lm32bf,xnori) },
1632 { LM32BF_INSN_BREAK, SEM_FN_NAME (lm32bf,break) },
1633 { LM32BF_INSN_SCALL, SEM_FN_NAME (lm32bf,scall) },
1634 { 0, 0 }
1635 };
1636
1637 /* Add the semantic fns to IDESC_TABLE. */
1638
1639 void
1640 SEM_FN_NAME (lm32bf,init_idesc_table) (SIM_CPU *current_cpu)
1641 {
1642 IDESC *idesc_table = CPU_IDESC (current_cpu);
1643 const struct sem_fn_desc *sf;
1644 int mach_num = MACH_NUM (CPU_MACH (current_cpu));
1645
1646 for (sf = &sem_fns[0]; sf->fn != 0; ++sf)
1647 {
1648 const CGEN_INSN *insn = idesc_table[sf->index].idata;
1649 int valid_p = (CGEN_INSN_VIRTUAL_P (insn)
1650 || CGEN_INSN_MACH_HAS_P (insn, mach_num));
1651 #if FAST_P
1652 if (valid_p)
1653 idesc_table[sf->index].sem_fast = sf->fn;
1654 else
1655 idesc_table[sf->index].sem_fast = SEM_FN_NAME (lm32bf,x_invalid);
1656 #else
1657 if (valid_p)
1658 idesc_table[sf->index].sem_full = sf->fn;
1659 else
1660 idesc_table[sf->index].sem_full = SEM_FN_NAME (lm32bf,x_invalid);
1661 #endif
1662 }
1663 }
1664