]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - sim/sh64/sem-compact.c
3693860281f7f9d2ae623d63a24da78dc033b74a
[thirdparty/binutils-gdb.git] / sim / sh64 / sem-compact.c
1 /* Simulator instruction semantics for sh64.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996-2010, 2012 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, write to the Free Software Foundation, Inc.,
21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
22
23 */
24
25 #define WANT_CPU sh64
26 #define WANT_CPU_SH64
27
28 #include "sim-main.h"
29 #include "cgen-mem.h"
30 #include "cgen-ops.h"
31
32 #undef GET_ATTR
33 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
34
35 /* This is used so that we can compile two copies of the semantic code,
36 one with full feature support and one without that runs fast(er).
37 FAST_P, when desired, is defined on the command line, -DFAST_P=1. */
38 #if FAST_P
39 #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_semf_,fn)
40 #undef TRACE_RESULT
41 #define TRACE_RESULT(cpu, abuf, name, type, val)
42 #else
43 #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
44 #endif
45
46 /* x-invalid: --invalid-- */
47
48 static SEM_PC
49 SEM_FN_NAME (sh64_compact,x_invalid) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
50 {
51 #define FLD(f) abuf->fields.sfmt_empty.f
52 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
53 int UNUSED written = 0;
54 IADDR UNUSED pc = abuf->addr;
55 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
56
57 {
58 /* Update the recorded pc in the cpu state struct.
59 Only necessary for WITH_SCACHE case, but to avoid the
60 conditional compilation .... */
61 SET_H_PC (pc);
62 /* Virtual insns have zero size. Overwrite vpc with address of next insn
63 using the default-insn-bitsize spec. When executing insns in parallel
64 we may want to queue the fault and continue execution. */
65 vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
66 vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
67 }
68
69 return vpc;
70 #undef FLD
71 }
72
73 /* x-after: --after-- */
74
75 static SEM_PC
76 SEM_FN_NAME (sh64_compact,x_after) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
77 {
78 #define FLD(f) abuf->fields.sfmt_empty.f
79 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
80 int UNUSED written = 0;
81 IADDR UNUSED pc = abuf->addr;
82 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
83
84 {
85 #if WITH_SCACHE_PBB_SH64_COMPACT
86 sh64_compact_pbb_after (current_cpu, sem_arg);
87 #endif
88 }
89
90 return vpc;
91 #undef FLD
92 }
93
94 /* x-before: --before-- */
95
96 static SEM_PC
97 SEM_FN_NAME (sh64_compact,x_before) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
98 {
99 #define FLD(f) abuf->fields.sfmt_empty.f
100 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
101 int UNUSED written = 0;
102 IADDR UNUSED pc = abuf->addr;
103 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
104
105 {
106 #if WITH_SCACHE_PBB_SH64_COMPACT
107 sh64_compact_pbb_before (current_cpu, sem_arg);
108 #endif
109 }
110
111 return vpc;
112 #undef FLD
113 }
114
115 /* x-cti-chain: --cti-chain-- */
116
117 static SEM_PC
118 SEM_FN_NAME (sh64_compact,x_cti_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
119 {
120 #define FLD(f) abuf->fields.sfmt_empty.f
121 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
122 int UNUSED written = 0;
123 IADDR UNUSED pc = abuf->addr;
124 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
125
126 {
127 #if WITH_SCACHE_PBB_SH64_COMPACT
128 #ifdef DEFINE_SWITCH
129 vpc = sh64_compact_pbb_cti_chain (current_cpu, sem_arg,
130 pbb_br_type, pbb_br_npc);
131 BREAK (sem);
132 #else
133 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
134 vpc = sh64_compact_pbb_cti_chain (current_cpu, sem_arg,
135 CPU_PBB_BR_TYPE (current_cpu),
136 CPU_PBB_BR_NPC (current_cpu));
137 #endif
138 #endif
139 }
140
141 return vpc;
142 #undef FLD
143 }
144
145 /* x-chain: --chain-- */
146
147 static SEM_PC
148 SEM_FN_NAME (sh64_compact,x_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
149 {
150 #define FLD(f) abuf->fields.sfmt_empty.f
151 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
152 int UNUSED written = 0;
153 IADDR UNUSED pc = abuf->addr;
154 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
155
156 {
157 #if WITH_SCACHE_PBB_SH64_COMPACT
158 vpc = sh64_compact_pbb_chain (current_cpu, sem_arg);
159 #ifdef DEFINE_SWITCH
160 BREAK (sem);
161 #endif
162 #endif
163 }
164
165 return vpc;
166 #undef FLD
167 }
168
169 /* x-begin: --begin-- */
170
171 static SEM_PC
172 SEM_FN_NAME (sh64_compact,x_begin) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
173 {
174 #define FLD(f) abuf->fields.sfmt_empty.f
175 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
176 int UNUSED written = 0;
177 IADDR UNUSED pc = abuf->addr;
178 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
179
180 {
181 #if WITH_SCACHE_PBB_SH64_COMPACT
182 #if defined DEFINE_SWITCH || defined FAST_P
183 /* In the switch case FAST_P is a constant, allowing several optimizations
184 in any called inline functions. */
185 vpc = sh64_compact_pbb_begin (current_cpu, FAST_P);
186 #else
187 #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
188 vpc = sh64_compact_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
189 #else
190 vpc = sh64_compact_pbb_begin (current_cpu, 0);
191 #endif
192 #endif
193 #endif
194 }
195
196 return vpc;
197 #undef FLD
198 }
199
200 /* add-compact: add $rm, $rn */
201
202 static SEM_PC
203 SEM_FN_NAME (sh64_compact,add_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
204 {
205 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
206 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
207 int UNUSED written = 0;
208 IADDR UNUSED pc = abuf->addr;
209 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
210
211 {
212 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
213 SET_H_GRC (FLD (f_rn), opval);
214 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
215 }
216
217 return vpc;
218 #undef FLD
219 }
220
221 /* addi-compact: add #$imm8, $rn */
222
223 static SEM_PC
224 SEM_FN_NAME (sh64_compact,addi_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
225 {
226 #define FLD(f) abuf->fields.sfmt_addi_compact.f
227 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
228 int UNUSED written = 0;
229 IADDR UNUSED pc = abuf->addr;
230 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
231
232 {
233 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), EXTQISI (ANDQI (FLD (f_imm8), 255)));
234 SET_H_GRC (FLD (f_rn), opval);
235 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
236 }
237
238 return vpc;
239 #undef FLD
240 }
241
242 /* addc-compact: addc $rm, $rn */
243
244 static SEM_PC
245 SEM_FN_NAME (sh64_compact,addc_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
246 {
247 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
248 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
249 int UNUSED written = 0;
250 IADDR UNUSED pc = abuf->addr;
251 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
252
253 {
254 BI tmp_flag;
255 tmp_flag = ADDCFSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)), GET_H_TBIT ());
256 {
257 SI opval = ADDCSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)), GET_H_TBIT ());
258 SET_H_GRC (FLD (f_rn), opval);
259 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
260 }
261 {
262 BI opval = tmp_flag;
263 SET_H_TBIT (opval);
264 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
265 }
266 }
267
268 return vpc;
269 #undef FLD
270 }
271
272 /* addv-compact: addv $rm, $rn */
273
274 static SEM_PC
275 SEM_FN_NAME (sh64_compact,addv_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
276 {
277 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
278 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
279 int UNUSED written = 0;
280 IADDR UNUSED pc = abuf->addr;
281 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
282
283 {
284 BI tmp_t;
285 tmp_t = ADDOFSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)), 0);
286 {
287 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
288 SET_H_GRC (FLD (f_rn), opval);
289 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
290 }
291 {
292 BI opval = tmp_t;
293 SET_H_TBIT (opval);
294 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
295 }
296 }
297
298 return vpc;
299 #undef FLD
300 }
301
302 /* and-compact: and $rm64, $rn64 */
303
304 static SEM_PC
305 SEM_FN_NAME (sh64_compact,and_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
306 {
307 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
308 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
309 int UNUSED written = 0;
310 IADDR UNUSED pc = abuf->addr;
311 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
312
313 {
314 DI opval = ANDDI (GET_H_GR (FLD (f_rm)), GET_H_GR (FLD (f_rn)));
315 SET_H_GR (FLD (f_rn), opval);
316 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
317 }
318
319 return vpc;
320 #undef FLD
321 }
322
323 /* andi-compact: and #$uimm8, r0 */
324
325 static SEM_PC
326 SEM_FN_NAME (sh64_compact,andi_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
327 {
328 #define FLD(f) abuf->fields.sfmt_addi_compact.f
329 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
330 int UNUSED written = 0;
331 IADDR UNUSED pc = abuf->addr;
332 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
333
334 {
335 SI opval = ANDSI (GET_H_GRC (((UINT) 0)), ZEXTSIDI (FLD (f_imm8)));
336 SET_H_GRC (((UINT) 0), opval);
337 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
338 }
339
340 return vpc;
341 #undef FLD
342 }
343
344 /* andb-compact: and.b #$imm8, @(r0, gbr) */
345
346 static SEM_PC
347 SEM_FN_NAME (sh64_compact,andb_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
348 {
349 #define FLD(f) abuf->fields.sfmt_addi_compact.f
350 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
351 int UNUSED written = 0;
352 IADDR UNUSED pc = abuf->addr;
353 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
354
355 {
356 DI tmp_addr;
357 UQI tmp_data;
358 tmp_addr = ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GBR ());
359 tmp_data = ANDQI (GETMEMUQI (current_cpu, pc, tmp_addr), FLD (f_imm8));
360 {
361 UQI opval = tmp_data;
362 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
363 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
364 }
365 }
366
367 return vpc;
368 #undef FLD
369 }
370
371 /* bf-compact: bf $disp8 */
372
373 static SEM_PC
374 SEM_FN_NAME (sh64_compact,bf_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
375 {
376 #define FLD(f) abuf->fields.sfmt_bf_compact.f
377 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
378 int UNUSED written = 0;
379 IADDR UNUSED pc = abuf->addr;
380 SEM_BRANCH_INIT
381 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
382
383 if (NOTBI (GET_H_TBIT ())) {
384 {
385 UDI opval = FLD (i_disp8);
386 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
387 written |= (1 << 2);
388 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
389 }
390 }
391
392 abuf->written = written;
393 SEM_BRANCH_FINI (vpc);
394 return vpc;
395 #undef FLD
396 }
397
398 /* bfs-compact: bf/s $disp8 */
399
400 static SEM_PC
401 SEM_FN_NAME (sh64_compact,bfs_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
402 {
403 #define FLD(f) abuf->fields.sfmt_bf_compact.f
404 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
405 int UNUSED written = 0;
406 IADDR UNUSED pc = abuf->addr;
407 SEM_BRANCH_INIT
408 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
409
410 if (NOTBI (GET_H_TBIT ())) {
411 {
412 {
413 UDI opval = ADDDI (pc, 2);
414 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
415 written |= (1 << 3);
416 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
417 }
418 ((void) 0); /*nop*/
419 {
420 {
421 UDI opval = FLD (i_disp8);
422 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
423 written |= (1 << 3);
424 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
425 }
426 }
427 }
428 }
429
430 abuf->written = written;
431 SEM_BRANCH_FINI (vpc);
432 return vpc;
433 #undef FLD
434 }
435
436 /* bra-compact: bra $disp12 */
437
438 static SEM_PC
439 SEM_FN_NAME (sh64_compact,bra_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
440 {
441 #define FLD(f) abuf->fields.sfmt_bra_compact.f
442 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
443 int UNUSED written = 0;
444 IADDR UNUSED pc = abuf->addr;
445 SEM_BRANCH_INIT
446 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
447
448 {
449 {
450 UDI opval = ADDDI (pc, 2);
451 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
452 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
453 }
454 ((void) 0); /*nop*/
455 {
456 {
457 UDI opval = FLD (i_disp12);
458 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
459 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
460 }
461 }
462 }
463
464 SEM_BRANCH_FINI (vpc);
465 return vpc;
466 #undef FLD
467 }
468
469 /* braf-compact: braf $rn */
470
471 static SEM_PC
472 SEM_FN_NAME (sh64_compact,braf_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
473 {
474 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
475 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
476 int UNUSED written = 0;
477 IADDR UNUSED pc = abuf->addr;
478 SEM_BRANCH_INIT
479 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
480
481 {
482 {
483 UDI opval = ADDDI (pc, 2);
484 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
485 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
486 }
487 ((void) 0); /*nop*/
488 {
489 {
490 UDI opval = ADDDI (EXTSIDI (GET_H_GRC (FLD (f_rn))), ADDDI (pc, 4));
491 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
492 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
493 }
494 }
495 }
496
497 SEM_BRANCH_FINI (vpc);
498 return vpc;
499 #undef FLD
500 }
501
502 /* brk-compact: brk */
503
504 static SEM_PC
505 SEM_FN_NAME (sh64_compact,brk_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
506 {
507 #define FLD(f) abuf->fields.sfmt_empty.f
508 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
509 int UNUSED written = 0;
510 IADDR UNUSED pc = abuf->addr;
511 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
512
513 sh64_break (current_cpu, pc);
514
515 return vpc;
516 #undef FLD
517 }
518
519 /* bsr-compact: bsr $disp12 */
520
521 static SEM_PC
522 SEM_FN_NAME (sh64_compact,bsr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
523 {
524 #define FLD(f) abuf->fields.sfmt_bra_compact.f
525 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
526 int UNUSED written = 0;
527 IADDR UNUSED pc = abuf->addr;
528 SEM_BRANCH_INIT
529 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
530
531 {
532 {
533 {
534 SI opval = ADDDI (pc, 4);
535 SET_H_PR (opval);
536 TRACE_RESULT (current_cpu, abuf, "pr", 'x', opval);
537 }
538 }
539 {
540 UDI opval = ADDDI (pc, 2);
541 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
542 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
543 }
544 ((void) 0); /*nop*/
545 {
546 {
547 UDI opval = FLD (i_disp12);
548 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
549 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
550 }
551 }
552 }
553
554 SEM_BRANCH_FINI (vpc);
555 return vpc;
556 #undef FLD
557 }
558
559 /* bsrf-compact: bsrf $rn */
560
561 static SEM_PC
562 SEM_FN_NAME (sh64_compact,bsrf_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
563 {
564 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
565 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
566 int UNUSED written = 0;
567 IADDR UNUSED pc = abuf->addr;
568 SEM_BRANCH_INIT
569 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
570
571 {
572 {
573 {
574 SI opval = ADDDI (pc, 4);
575 SET_H_PR (opval);
576 TRACE_RESULT (current_cpu, abuf, "pr", 'x', opval);
577 }
578 }
579 {
580 UDI opval = ADDDI (pc, 2);
581 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
582 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
583 }
584 ((void) 0); /*nop*/
585 {
586 {
587 UDI opval = ADDDI (EXTSIDI (GET_H_GRC (FLD (f_rn))), ADDDI (pc, 4));
588 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
589 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
590 }
591 }
592 }
593
594 SEM_BRANCH_FINI (vpc);
595 return vpc;
596 #undef FLD
597 }
598
599 /* bt-compact: bt $disp8 */
600
601 static SEM_PC
602 SEM_FN_NAME (sh64_compact,bt_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
603 {
604 #define FLD(f) abuf->fields.sfmt_bf_compact.f
605 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
606 int UNUSED written = 0;
607 IADDR UNUSED pc = abuf->addr;
608 SEM_BRANCH_INIT
609 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
610
611 if (GET_H_TBIT ()) {
612 {
613 UDI opval = FLD (i_disp8);
614 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
615 written |= (1 << 2);
616 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
617 }
618 }
619
620 abuf->written = written;
621 SEM_BRANCH_FINI (vpc);
622 return vpc;
623 #undef FLD
624 }
625
626 /* bts-compact: bt/s $disp8 */
627
628 static SEM_PC
629 SEM_FN_NAME (sh64_compact,bts_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
630 {
631 #define FLD(f) abuf->fields.sfmt_bf_compact.f
632 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
633 int UNUSED written = 0;
634 IADDR UNUSED pc = abuf->addr;
635 SEM_BRANCH_INIT
636 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
637
638 if (GET_H_TBIT ()) {
639 {
640 {
641 UDI opval = ADDDI (pc, 2);
642 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
643 written |= (1 << 3);
644 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
645 }
646 ((void) 0); /*nop*/
647 {
648 {
649 UDI opval = FLD (i_disp8);
650 SEM_BRANCH_VIA_CACHE (current_cpu, sem_arg, opval, vpc);
651 written |= (1 << 3);
652 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
653 }
654 }
655 }
656 }
657
658 abuf->written = written;
659 SEM_BRANCH_FINI (vpc);
660 return vpc;
661 #undef FLD
662 }
663
664 /* clrmac-compact: clrmac */
665
666 static SEM_PC
667 SEM_FN_NAME (sh64_compact,clrmac_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
668 {
669 #define FLD(f) abuf->fields.sfmt_empty.f
670 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
671 int UNUSED written = 0;
672 IADDR UNUSED pc = abuf->addr;
673 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
674
675 {
676 {
677 SI opval = 0;
678 SET_H_MACL (opval);
679 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
680 }
681 {
682 SI opval = 0;
683 SET_H_MACH (opval);
684 TRACE_RESULT (current_cpu, abuf, "mach", 'x', opval);
685 }
686 }
687
688 return vpc;
689 #undef FLD
690 }
691
692 /* clrs-compact: clrs */
693
694 static SEM_PC
695 SEM_FN_NAME (sh64_compact,clrs_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
696 {
697 #define FLD(f) abuf->fields.sfmt_empty.f
698 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
699 int UNUSED written = 0;
700 IADDR UNUSED pc = abuf->addr;
701 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
702
703 {
704 BI opval = 0;
705 SET_H_SBIT (opval);
706 TRACE_RESULT (current_cpu, abuf, "sbit", 'x', opval);
707 }
708
709 return vpc;
710 #undef FLD
711 }
712
713 /* clrt-compact: clrt */
714
715 static SEM_PC
716 SEM_FN_NAME (sh64_compact,clrt_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
717 {
718 #define FLD(f) abuf->fields.sfmt_empty.f
719 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
720 int UNUSED written = 0;
721 IADDR UNUSED pc = abuf->addr;
722 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
723
724 {
725 BI opval = 0;
726 SET_H_TBIT (opval);
727 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
728 }
729
730 return vpc;
731 #undef FLD
732 }
733
734 /* cmpeq-compact: cmp/eq $rm, $rn */
735
736 static SEM_PC
737 SEM_FN_NAME (sh64_compact,cmpeq_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
738 {
739 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
740 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
741 int UNUSED written = 0;
742 IADDR UNUSED pc = abuf->addr;
743 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
744
745 {
746 BI opval = EQSI (GET_H_GRC (FLD (f_rm)), GET_H_GRC (FLD (f_rn)));
747 SET_H_TBIT (opval);
748 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
749 }
750
751 return vpc;
752 #undef FLD
753 }
754
755 /* cmpeqi-compact: cmp/eq #$imm8, r0 */
756
757 static SEM_PC
758 SEM_FN_NAME (sh64_compact,cmpeqi_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
759 {
760 #define FLD(f) abuf->fields.sfmt_addi_compact.f
761 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
762 int UNUSED written = 0;
763 IADDR UNUSED pc = abuf->addr;
764 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
765
766 {
767 BI opval = EQSI (GET_H_GRC (((UINT) 0)), EXTQISI (ANDQI (FLD (f_imm8), 255)));
768 SET_H_TBIT (opval);
769 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
770 }
771
772 return vpc;
773 #undef FLD
774 }
775
776 /* cmpge-compact: cmp/ge $rm, $rn */
777
778 static SEM_PC
779 SEM_FN_NAME (sh64_compact,cmpge_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
780 {
781 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
782 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
783 int UNUSED written = 0;
784 IADDR UNUSED pc = abuf->addr;
785 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
786
787 {
788 BI opval = GESI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
789 SET_H_TBIT (opval);
790 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
791 }
792
793 return vpc;
794 #undef FLD
795 }
796
797 /* cmpgt-compact: cmp/gt $rm, $rn */
798
799 static SEM_PC
800 SEM_FN_NAME (sh64_compact,cmpgt_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
801 {
802 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
803 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
804 int UNUSED written = 0;
805 IADDR UNUSED pc = abuf->addr;
806 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
807
808 {
809 BI opval = GTSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
810 SET_H_TBIT (opval);
811 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
812 }
813
814 return vpc;
815 #undef FLD
816 }
817
818 /* cmphi-compact: cmp/hi $rm, $rn */
819
820 static SEM_PC
821 SEM_FN_NAME (sh64_compact,cmphi_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
822 {
823 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
824 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
825 int UNUSED written = 0;
826 IADDR UNUSED pc = abuf->addr;
827 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
828
829 {
830 BI opval = GTUSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
831 SET_H_TBIT (opval);
832 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
833 }
834
835 return vpc;
836 #undef FLD
837 }
838
839 /* cmphs-compact: cmp/hs $rm, $rn */
840
841 static SEM_PC
842 SEM_FN_NAME (sh64_compact,cmphs_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
843 {
844 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
845 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
846 int UNUSED written = 0;
847 IADDR UNUSED pc = abuf->addr;
848 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
849
850 {
851 BI opval = GEUSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
852 SET_H_TBIT (opval);
853 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
854 }
855
856 return vpc;
857 #undef FLD
858 }
859
860 /* cmppl-compact: cmp/pl $rn */
861
862 static SEM_PC
863 SEM_FN_NAME (sh64_compact,cmppl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
864 {
865 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
866 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
867 int UNUSED written = 0;
868 IADDR UNUSED pc = abuf->addr;
869 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
870
871 {
872 BI opval = GTSI (GET_H_GRC (FLD (f_rn)), 0);
873 SET_H_TBIT (opval);
874 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
875 }
876
877 return vpc;
878 #undef FLD
879 }
880
881 /* cmppz-compact: cmp/pz $rn */
882
883 static SEM_PC
884 SEM_FN_NAME (sh64_compact,cmppz_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
885 {
886 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
887 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
888 int UNUSED written = 0;
889 IADDR UNUSED pc = abuf->addr;
890 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
891
892 {
893 BI opval = GESI (GET_H_GRC (FLD (f_rn)), 0);
894 SET_H_TBIT (opval);
895 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
896 }
897
898 return vpc;
899 #undef FLD
900 }
901
902 /* cmpstr-compact: cmp/str $rm, $rn */
903
904 static SEM_PC
905 SEM_FN_NAME (sh64_compact,cmpstr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
906 {
907 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
908 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
909 int UNUSED written = 0;
910 IADDR UNUSED pc = abuf->addr;
911 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
912
913 {
914 BI tmp_t;
915 SI tmp_temp;
916 tmp_temp = XORSI (GET_H_GRC (FLD (f_rm)), GET_H_GRC (FLD (f_rn)));
917 tmp_t = EQSI (ANDSI (tmp_temp, 0xff000000), 0);
918 tmp_t = ORBI (EQSI (ANDSI (tmp_temp, 16711680), 0), tmp_t);
919 tmp_t = ORBI (EQSI (ANDSI (tmp_temp, 65280), 0), tmp_t);
920 tmp_t = ORBI (EQSI (ANDSI (tmp_temp, 255), 0), tmp_t);
921 {
922 BI opval = ((GTUBI (tmp_t, 0)) ? (1) : (0));
923 SET_H_TBIT (opval);
924 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
925 }
926 }
927
928 return vpc;
929 #undef FLD
930 }
931
932 /* div0s-compact: div0s $rm, $rn */
933
934 static SEM_PC
935 SEM_FN_NAME (sh64_compact,div0s_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
936 {
937 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
938 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
939 int UNUSED written = 0;
940 IADDR UNUSED pc = abuf->addr;
941 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
942
943 {
944 {
945 BI opval = SRLSI (GET_H_GRC (FLD (f_rn)), 31);
946 SET_H_QBIT (opval);
947 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
948 }
949 {
950 BI opval = SRLSI (GET_H_GRC (FLD (f_rm)), 31);
951 SET_H_MBIT (opval);
952 TRACE_RESULT (current_cpu, abuf, "mbit", 'x', opval);
953 }
954 {
955 BI opval = ((EQSI (SRLSI (GET_H_GRC (FLD (f_rm)), 31), SRLSI (GET_H_GRC (FLD (f_rn)), 31))) ? (0) : (1));
956 SET_H_TBIT (opval);
957 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
958 }
959 }
960
961 return vpc;
962 #undef FLD
963 }
964
965 /* div0u-compact: div0u */
966
967 static SEM_PC
968 SEM_FN_NAME (sh64_compact,div0u_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
969 {
970 #define FLD(f) abuf->fields.sfmt_empty.f
971 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
972 int UNUSED written = 0;
973 IADDR UNUSED pc = abuf->addr;
974 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
975
976 {
977 {
978 BI opval = 0;
979 SET_H_TBIT (opval);
980 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
981 }
982 {
983 BI opval = 0;
984 SET_H_QBIT (opval);
985 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
986 }
987 {
988 BI opval = 0;
989 SET_H_MBIT (opval);
990 TRACE_RESULT (current_cpu, abuf, "mbit", 'x', opval);
991 }
992 }
993
994 return vpc;
995 #undef FLD
996 }
997
998 /* div1-compact: div1 $rm, $rn */
999
1000 static SEM_PC
1001 SEM_FN_NAME (sh64_compact,div1_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1002 {
1003 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1004 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1005 int UNUSED written = 0;
1006 IADDR UNUSED pc = abuf->addr;
1007 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1008
1009 {
1010 BI tmp_oldq;
1011 SI tmp_tmp0;
1012 UQI tmp_tmp1;
1013 tmp_oldq = GET_H_QBIT ();
1014 {
1015 BI opval = SRLSI (GET_H_GRC (FLD (f_rn)), 31);
1016 SET_H_QBIT (opval);
1017 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1018 }
1019 {
1020 SI opval = ORSI (SLLSI (GET_H_GRC (FLD (f_rn)), 1), ZEXTBISI (GET_H_TBIT ()));
1021 SET_H_GRC (FLD (f_rn), opval);
1022 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1023 }
1024 if (NOTBI (tmp_oldq)) {
1025 if (NOTBI (GET_H_MBIT ())) {
1026 {
1027 tmp_tmp0 = GET_H_GRC (FLD (f_rn));
1028 {
1029 SI opval = SUBSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
1030 SET_H_GRC (FLD (f_rn), opval);
1031 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1032 }
1033 tmp_tmp1 = GTUSI (GET_H_GRC (FLD (f_rn)), tmp_tmp0);
1034 if (NOTBI (GET_H_QBIT ())) {
1035 {
1036 BI opval = ((tmp_tmp1) ? (1) : (0));
1037 SET_H_QBIT (opval);
1038 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1039 }
1040 } else {
1041 {
1042 BI opval = ((EQQI (tmp_tmp1, 0)) ? (1) : (0));
1043 SET_H_QBIT (opval);
1044 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1045 }
1046 }
1047 }
1048 } else {
1049 {
1050 tmp_tmp0 = GET_H_GRC (FLD (f_rn));
1051 {
1052 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
1053 SET_H_GRC (FLD (f_rn), opval);
1054 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1055 }
1056 tmp_tmp1 = LTUSI (GET_H_GRC (FLD (f_rn)), tmp_tmp0);
1057 if (NOTBI (GET_H_QBIT ())) {
1058 {
1059 BI opval = ((EQQI (tmp_tmp1, 0)) ? (1) : (0));
1060 SET_H_QBIT (opval);
1061 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1062 }
1063 } else {
1064 {
1065 BI opval = ((tmp_tmp1) ? (1) : (0));
1066 SET_H_QBIT (opval);
1067 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1068 }
1069 }
1070 }
1071 }
1072 } else {
1073 if (NOTBI (GET_H_MBIT ())) {
1074 {
1075 tmp_tmp0 = GET_H_GRC (FLD (f_rn));
1076 {
1077 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), GET_H_GRC (FLD (f_rn)));
1078 SET_H_GRC (FLD (f_rn), opval);
1079 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1080 }
1081 tmp_tmp1 = LTUSI (GET_H_GRC (FLD (f_rn)), tmp_tmp0);
1082 if (NOTBI (GET_H_QBIT ())) {
1083 {
1084 BI opval = ((tmp_tmp1) ? (1) : (0));
1085 SET_H_QBIT (opval);
1086 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1087 }
1088 } else {
1089 {
1090 BI opval = ((EQQI (tmp_tmp1, 0)) ? (1) : (0));
1091 SET_H_QBIT (opval);
1092 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1093 }
1094 }
1095 }
1096 } else {
1097 {
1098 tmp_tmp0 = GET_H_GRC (FLD (f_rn));
1099 {
1100 SI opval = SUBSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
1101 SET_H_GRC (FLD (f_rn), opval);
1102 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1103 }
1104 tmp_tmp1 = GTUSI (GET_H_GRC (FLD (f_rn)), tmp_tmp0);
1105 if (NOTBI (GET_H_QBIT ())) {
1106 {
1107 BI opval = ((EQQI (tmp_tmp1, 0)) ? (1) : (0));
1108 SET_H_QBIT (opval);
1109 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1110 }
1111 } else {
1112 {
1113 BI opval = ((tmp_tmp1) ? (1) : (0));
1114 SET_H_QBIT (opval);
1115 TRACE_RESULT (current_cpu, abuf, "qbit", 'x', opval);
1116 }
1117 }
1118 }
1119 }
1120 }
1121 {
1122 BI opval = ((EQBI (GET_H_QBIT (), GET_H_MBIT ())) ? (1) : (0));
1123 SET_H_TBIT (opval);
1124 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
1125 }
1126 }
1127
1128 return vpc;
1129 #undef FLD
1130 }
1131
1132 /* divu-compact: divu r0, $rn */
1133
1134 static SEM_PC
1135 SEM_FN_NAME (sh64_compact,divu_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1136 {
1137 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
1138 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1139 int UNUSED written = 0;
1140 IADDR UNUSED pc = abuf->addr;
1141 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1142
1143 {
1144 SI opval = UDIVSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (((UINT) 0)));
1145 SET_H_GRC (FLD (f_rn), opval);
1146 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1147 }
1148
1149 return vpc;
1150 #undef FLD
1151 }
1152
1153 /* mulr-compact: mulr r0, $rn */
1154
1155 static SEM_PC
1156 SEM_FN_NAME (sh64_compact,mulr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1157 {
1158 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
1159 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1160 int UNUSED written = 0;
1161 IADDR UNUSED pc = abuf->addr;
1162 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1163
1164 {
1165 SI opval = MULSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (((UINT) 0)));
1166 SET_H_GRC (FLD (f_rn), opval);
1167 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1168 }
1169
1170 return vpc;
1171 #undef FLD
1172 }
1173
1174 /* dmulsl-compact: dmuls.l $rm, $rn */
1175
1176 static SEM_PC
1177 SEM_FN_NAME (sh64_compact,dmulsl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1178 {
1179 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1180 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1181 int UNUSED written = 0;
1182 IADDR UNUSED pc = abuf->addr;
1183 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1184
1185 {
1186 DI tmp_result;
1187 tmp_result = MULDI (EXTSIDI (GET_H_GRC (FLD (f_rm))), EXTSIDI (GET_H_GRC (FLD (f_rn))));
1188 {
1189 SI opval = SUBWORDDISI (tmp_result, 0);
1190 SET_H_MACH (opval);
1191 TRACE_RESULT (current_cpu, abuf, "mach", 'x', opval);
1192 }
1193 {
1194 SI opval = SUBWORDDISI (tmp_result, 1);
1195 SET_H_MACL (opval);
1196 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
1197 }
1198 }
1199
1200 return vpc;
1201 #undef FLD
1202 }
1203
1204 /* dmulul-compact: dmulu.l $rm, $rn */
1205
1206 static SEM_PC
1207 SEM_FN_NAME (sh64_compact,dmulul_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1208 {
1209 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1210 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1211 int UNUSED written = 0;
1212 IADDR UNUSED pc = abuf->addr;
1213 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1214
1215 {
1216 DI tmp_result;
1217 tmp_result = MULDI (ZEXTSIDI (GET_H_GRC (FLD (f_rm))), ZEXTSIDI (GET_H_GRC (FLD (f_rn))));
1218 {
1219 SI opval = SUBWORDDISI (tmp_result, 0);
1220 SET_H_MACH (opval);
1221 TRACE_RESULT (current_cpu, abuf, "mach", 'x', opval);
1222 }
1223 {
1224 SI opval = SUBWORDDISI (tmp_result, 1);
1225 SET_H_MACL (opval);
1226 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
1227 }
1228 }
1229
1230 return vpc;
1231 #undef FLD
1232 }
1233
1234 /* dt-compact: dt $rn */
1235
1236 static SEM_PC
1237 SEM_FN_NAME (sh64_compact,dt_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1238 {
1239 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
1240 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1241 int UNUSED written = 0;
1242 IADDR UNUSED pc = abuf->addr;
1243 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1244
1245 {
1246 {
1247 SI opval = SUBSI (GET_H_GRC (FLD (f_rn)), 1);
1248 SET_H_GRC (FLD (f_rn), opval);
1249 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1250 }
1251 {
1252 BI opval = EQSI (GET_H_GRC (FLD (f_rn)), 0);
1253 SET_H_TBIT (opval);
1254 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
1255 }
1256 }
1257
1258 return vpc;
1259 #undef FLD
1260 }
1261
1262 /* extsb-compact: exts.b $rm, $rn */
1263
1264 static SEM_PC
1265 SEM_FN_NAME (sh64_compact,extsb_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1266 {
1267 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1268 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1269 int UNUSED written = 0;
1270 IADDR UNUSED pc = abuf->addr;
1271 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1272
1273 {
1274 SI opval = EXTQISI (SUBWORDSIQI (GET_H_GRC (FLD (f_rm)), 3));
1275 SET_H_GRC (FLD (f_rn), opval);
1276 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1277 }
1278
1279 return vpc;
1280 #undef FLD
1281 }
1282
1283 /* extsw-compact: exts.w $rm, $rn */
1284
1285 static SEM_PC
1286 SEM_FN_NAME (sh64_compact,extsw_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1287 {
1288 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1289 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1290 int UNUSED written = 0;
1291 IADDR UNUSED pc = abuf->addr;
1292 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1293
1294 {
1295 SI opval = EXTHISI (SUBWORDSIHI (GET_H_GRC (FLD (f_rm)), 1));
1296 SET_H_GRC (FLD (f_rn), opval);
1297 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1298 }
1299
1300 return vpc;
1301 #undef FLD
1302 }
1303
1304 /* extub-compact: extu.b $rm, $rn */
1305
1306 static SEM_PC
1307 SEM_FN_NAME (sh64_compact,extub_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1308 {
1309 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1310 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1311 int UNUSED written = 0;
1312 IADDR UNUSED pc = abuf->addr;
1313 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1314
1315 {
1316 SI opval = ZEXTQISI (SUBWORDSIQI (GET_H_GRC (FLD (f_rm)), 3));
1317 SET_H_GRC (FLD (f_rn), opval);
1318 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1319 }
1320
1321 return vpc;
1322 #undef FLD
1323 }
1324
1325 /* extuw-compact: extu.w $rm, $rn */
1326
1327 static SEM_PC
1328 SEM_FN_NAME (sh64_compact,extuw_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1329 {
1330 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1331 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1332 int UNUSED written = 0;
1333 IADDR UNUSED pc = abuf->addr;
1334 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1335
1336 {
1337 SI opval = ZEXTHISI (SUBWORDSIHI (GET_H_GRC (FLD (f_rm)), 1));
1338 SET_H_GRC (FLD (f_rn), opval);
1339 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1340 }
1341
1342 return vpc;
1343 #undef FLD
1344 }
1345
1346 /* fabs-compact: fabs $fsdn */
1347
1348 static SEM_PC
1349 SEM_FN_NAME (sh64_compact,fabs_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1350 {
1351 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
1352 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1353 int UNUSED written = 0;
1354 IADDR UNUSED pc = abuf->addr;
1355 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1356
1357 if (GET_H_PRBIT ()) {
1358 {
1359 DF opval = sh64_fabsd (current_cpu, GET_H_FSD (FLD (f_rn)));
1360 SET_H_FSD (FLD (f_rn), opval);
1361 written |= (1 << 2);
1362 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1363 }
1364 } else {
1365 {
1366 DF opval = sh64_fabss (current_cpu, GET_H_FSD (FLD (f_rn)));
1367 SET_H_FSD (FLD (f_rn), opval);
1368 written |= (1 << 2);
1369 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1370 }
1371 }
1372
1373 abuf->written = written;
1374 return vpc;
1375 #undef FLD
1376 }
1377
1378 /* fadd-compact: fadd $fsdm, $fsdn */
1379
1380 static SEM_PC
1381 SEM_FN_NAME (sh64_compact,fadd_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1382 {
1383 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1384 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1385 int UNUSED written = 0;
1386 IADDR UNUSED pc = abuf->addr;
1387 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1388
1389 if (GET_H_PRBIT ()) {
1390 {
1391 DF opval = sh64_faddd (current_cpu, GET_H_FSD (FLD (f_rm)), GET_H_FSD (FLD (f_rn)));
1392 SET_H_FSD (FLD (f_rn), opval);
1393 written |= (1 << 3);
1394 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1395 }
1396 } else {
1397 {
1398 DF opval = sh64_fadds (current_cpu, GET_H_FSD (FLD (f_rm)), GET_H_FSD (FLD (f_rn)));
1399 SET_H_FSD (FLD (f_rn), opval);
1400 written |= (1 << 3);
1401 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1402 }
1403 }
1404
1405 abuf->written = written;
1406 return vpc;
1407 #undef FLD
1408 }
1409
1410 /* fcmpeq-compact: fcmp/eq $fsdm, $fsdn */
1411
1412 static SEM_PC
1413 SEM_FN_NAME (sh64_compact,fcmpeq_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1414 {
1415 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1416 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1417 int UNUSED written = 0;
1418 IADDR UNUSED pc = abuf->addr;
1419 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1420
1421 if (GET_H_PRBIT ()) {
1422 {
1423 BI opval = sh64_fcmpeqd (current_cpu, GET_H_FSD (FLD (f_rm)), GET_H_FSD (FLD (f_rn)));
1424 SET_H_TBIT (opval);
1425 written |= (1 << 3);
1426 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
1427 }
1428 } else {
1429 {
1430 BI opval = sh64_fcmpeqs (current_cpu, GET_H_FSD (FLD (f_rm)), GET_H_FSD (FLD (f_rn)));
1431 SET_H_TBIT (opval);
1432 written |= (1 << 3);
1433 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
1434 }
1435 }
1436
1437 abuf->written = written;
1438 return vpc;
1439 #undef FLD
1440 }
1441
1442 /* fcmpgt-compact: fcmp/gt $fsdm, $fsdn */
1443
1444 static SEM_PC
1445 SEM_FN_NAME (sh64_compact,fcmpgt_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1446 {
1447 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1448 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1449 int UNUSED written = 0;
1450 IADDR UNUSED pc = abuf->addr;
1451 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1452
1453 if (GET_H_PRBIT ()) {
1454 {
1455 BI opval = sh64_fcmpgtd (current_cpu, GET_H_FSD (FLD (f_rn)), GET_H_FSD (FLD (f_rm)));
1456 SET_H_TBIT (opval);
1457 written |= (1 << 3);
1458 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
1459 }
1460 } else {
1461 {
1462 BI opval = sh64_fcmpgts (current_cpu, GET_H_FSD (FLD (f_rn)), GET_H_FSD (FLD (f_rm)));
1463 SET_H_TBIT (opval);
1464 written |= (1 << 3);
1465 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
1466 }
1467 }
1468
1469 abuf->written = written;
1470 return vpc;
1471 #undef FLD
1472 }
1473
1474 /* fcnvds-compact: fcnvds $drn, fpul */
1475
1476 static SEM_PC
1477 SEM_FN_NAME (sh64_compact,fcnvds_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1478 {
1479 #define FLD(f) abuf->fields.sfmt_fmov8_compact.f
1480 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1481 int UNUSED written = 0;
1482 IADDR UNUSED pc = abuf->addr;
1483 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1484
1485 {
1486 SF opval = sh64_fcnvds (current_cpu, GET_H_DRC (FLD (f_dn)));
1487 CPU (h_fr[((UINT) 32)]) = opval;
1488 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1489 }
1490
1491 return vpc;
1492 #undef FLD
1493 }
1494
1495 /* fcnvsd-compact: fcnvsd fpul, $drn */
1496
1497 static SEM_PC
1498 SEM_FN_NAME (sh64_compact,fcnvsd_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1499 {
1500 #define FLD(f) abuf->fields.sfmt_fmov8_compact.f
1501 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1502 int UNUSED written = 0;
1503 IADDR UNUSED pc = abuf->addr;
1504 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1505
1506 {
1507 DF opval = sh64_fcnvsd (current_cpu, CPU (h_fr[((UINT) 32)]));
1508 SET_H_DRC (FLD (f_dn), opval);
1509 TRACE_RESULT (current_cpu, abuf, "drc", 'f', opval);
1510 }
1511
1512 return vpc;
1513 #undef FLD
1514 }
1515
1516 /* fdiv-compact: fdiv $fsdm, $fsdn */
1517
1518 static SEM_PC
1519 SEM_FN_NAME (sh64_compact,fdiv_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1520 {
1521 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1522 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1523 int UNUSED written = 0;
1524 IADDR UNUSED pc = abuf->addr;
1525 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1526
1527 if (GET_H_PRBIT ()) {
1528 {
1529 DF opval = sh64_fdivd (current_cpu, GET_H_FSD (FLD (f_rn)), GET_H_FSD (FLD (f_rm)));
1530 SET_H_FSD (FLD (f_rn), opval);
1531 written |= (1 << 3);
1532 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1533 }
1534 } else {
1535 {
1536 DF opval = sh64_fdivs (current_cpu, GET_H_FSD (FLD (f_rn)), GET_H_FSD (FLD (f_rm)));
1537 SET_H_FSD (FLD (f_rn), opval);
1538 written |= (1 << 3);
1539 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1540 }
1541 }
1542
1543 abuf->written = written;
1544 return vpc;
1545 #undef FLD
1546 }
1547
1548 /* fipr-compact: fipr $fvm, $fvn */
1549
1550 static SEM_PC
1551 SEM_FN_NAME (sh64_compact,fipr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1552 {
1553 #define FLD(f) abuf->fields.sfmt_fipr_compact.f
1554 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1555 int UNUSED written = 0;
1556 IADDR UNUSED pc = abuf->addr;
1557 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1558
1559 sh64_fipr (current_cpu, FLD (f_vm), FLD (f_vn));
1560
1561 return vpc;
1562 #undef FLD
1563 }
1564
1565 /* flds-compact: flds $frn, fpul */
1566
1567 static SEM_PC
1568 SEM_FN_NAME (sh64_compact,flds_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1569 {
1570 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
1571 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1572 int UNUSED written = 0;
1573 IADDR UNUSED pc = abuf->addr;
1574 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1575
1576 {
1577 SF opval = GET_H_FRC (FLD (f_rn));
1578 CPU (h_fr[((UINT) 32)]) = opval;
1579 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1580 }
1581
1582 return vpc;
1583 #undef FLD
1584 }
1585
1586 /* fldi0-compact: fldi0 $frn */
1587
1588 static SEM_PC
1589 SEM_FN_NAME (sh64_compact,fldi0_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1590 {
1591 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
1592 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1593 int UNUSED written = 0;
1594 IADDR UNUSED pc = abuf->addr;
1595 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1596
1597 {
1598 SF opval = sh64_fldi0 (current_cpu);
1599 SET_H_FRC (FLD (f_rn), opval);
1600 TRACE_RESULT (current_cpu, abuf, "frc", 'f', opval);
1601 }
1602
1603 return vpc;
1604 #undef FLD
1605 }
1606
1607 /* fldi1-compact: fldi1 $frn */
1608
1609 static SEM_PC
1610 SEM_FN_NAME (sh64_compact,fldi1_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1611 {
1612 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
1613 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1614 int UNUSED written = 0;
1615 IADDR UNUSED pc = abuf->addr;
1616 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1617
1618 {
1619 SF opval = sh64_fldi1 (current_cpu);
1620 SET_H_FRC (FLD (f_rn), opval);
1621 TRACE_RESULT (current_cpu, abuf, "frc", 'f', opval);
1622 }
1623
1624 return vpc;
1625 #undef FLD
1626 }
1627
1628 /* float-compact: float fpul, $fsdn */
1629
1630 static SEM_PC
1631 SEM_FN_NAME (sh64_compact,float_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1632 {
1633 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
1634 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1635 int UNUSED written = 0;
1636 IADDR UNUSED pc = abuf->addr;
1637 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1638
1639 if (GET_H_PRBIT ()) {
1640 {
1641 DF opval = sh64_floatld (current_cpu, CPU (h_fr[((UINT) 32)]));
1642 SET_H_FSD (FLD (f_rn), opval);
1643 written |= (1 << 2);
1644 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1645 }
1646 } else {
1647 {
1648 DF opval = sh64_floatls (current_cpu, CPU (h_fr[((UINT) 32)]));
1649 SET_H_FSD (FLD (f_rn), opval);
1650 written |= (1 << 2);
1651 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1652 }
1653 }
1654
1655 abuf->written = written;
1656 return vpc;
1657 #undef FLD
1658 }
1659
1660 /* fmac-compact: fmac fr0, $frm, $frn */
1661
1662 static SEM_PC
1663 SEM_FN_NAME (sh64_compact,fmac_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1664 {
1665 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1666 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1667 int UNUSED written = 0;
1668 IADDR UNUSED pc = abuf->addr;
1669 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1670
1671 {
1672 SF opval = sh64_fmacs (current_cpu, GET_H_FRC (((UINT) 0)), GET_H_FRC (FLD (f_rm)), GET_H_FRC (FLD (f_rn)));
1673 SET_H_FRC (FLD (f_rn), opval);
1674 TRACE_RESULT (current_cpu, abuf, "frc", 'f', opval);
1675 }
1676
1677 return vpc;
1678 #undef FLD
1679 }
1680
1681 /* fmov1-compact: fmov $fmovm, $fmovn */
1682
1683 static SEM_PC
1684 SEM_FN_NAME (sh64_compact,fmov1_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1685 {
1686 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1687 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1688 int UNUSED written = 0;
1689 IADDR UNUSED pc = abuf->addr;
1690 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1691
1692 {
1693 DF opval = GET_H_FMOV (FLD (f_rm));
1694 SET_H_FMOV (FLD (f_rn), opval);
1695 TRACE_RESULT (current_cpu, abuf, "fmov", 'f', opval);
1696 }
1697
1698 return vpc;
1699 #undef FLD
1700 }
1701
1702 /* fmov2-compact: fmov @$rm, $fmovn */
1703
1704 static SEM_PC
1705 SEM_FN_NAME (sh64_compact,fmov2_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1706 {
1707 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1708 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1709 int UNUSED written = 0;
1710 IADDR UNUSED pc = abuf->addr;
1711 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1712
1713 if (NOTBI (GET_H_SZBIT ())) {
1714 {
1715 DF opval = GETMEMSF (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
1716 SET_H_FMOV (FLD (f_rn), opval);
1717 written |= (1 << 4);
1718 TRACE_RESULT (current_cpu, abuf, "fmov", 'f', opval);
1719 }
1720 } else {
1721 {
1722 DF opval = GETMEMDF (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
1723 SET_H_FMOV (FLD (f_rn), opval);
1724 written |= (1 << 4);
1725 TRACE_RESULT (current_cpu, abuf, "fmov", 'f', opval);
1726 }
1727 }
1728
1729 abuf->written = written;
1730 return vpc;
1731 #undef FLD
1732 }
1733
1734 /* fmov3-compact: fmov @${rm}+, fmovn */
1735
1736 static SEM_PC
1737 SEM_FN_NAME (sh64_compact,fmov3_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1738 {
1739 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1740 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1741 int UNUSED written = 0;
1742 IADDR UNUSED pc = abuf->addr;
1743 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1744
1745 if (NOTBI (GET_H_SZBIT ())) {
1746 {
1747 {
1748 DF opval = GETMEMSF (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
1749 SET_H_FMOV (FLD (f_rn), opval);
1750 written |= (1 << 4);
1751 TRACE_RESULT (current_cpu, abuf, "fmov", 'f', opval);
1752 }
1753 {
1754 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 4);
1755 SET_H_GRC (FLD (f_rm), opval);
1756 written |= (1 << 5);
1757 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1758 }
1759 }
1760 } else {
1761 {
1762 {
1763 DF opval = GETMEMDF (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
1764 SET_H_FMOV (FLD (f_rn), opval);
1765 written |= (1 << 4);
1766 TRACE_RESULT (current_cpu, abuf, "fmov", 'f', opval);
1767 }
1768 {
1769 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 8);
1770 SET_H_GRC (FLD (f_rm), opval);
1771 written |= (1 << 5);
1772 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1773 }
1774 }
1775 }
1776
1777 abuf->written = written;
1778 return vpc;
1779 #undef FLD
1780 }
1781
1782 /* fmov4-compact: fmov @(r0, $rm), $fmovn */
1783
1784 static SEM_PC
1785 SEM_FN_NAME (sh64_compact,fmov4_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1786 {
1787 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1788 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1789 int UNUSED written = 0;
1790 IADDR UNUSED pc = abuf->addr;
1791 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1792
1793 if (NOTBI (GET_H_SZBIT ())) {
1794 {
1795 DF opval = GETMEMSF (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rm))));
1796 SET_H_FMOV (FLD (f_rn), opval);
1797 written |= (1 << 5);
1798 TRACE_RESULT (current_cpu, abuf, "fmov", 'f', opval);
1799 }
1800 } else {
1801 {
1802 DF opval = GETMEMDF (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rm))));
1803 SET_H_FMOV (FLD (f_rn), opval);
1804 written |= (1 << 5);
1805 TRACE_RESULT (current_cpu, abuf, "fmov", 'f', opval);
1806 }
1807 }
1808
1809 abuf->written = written;
1810 return vpc;
1811 #undef FLD
1812 }
1813
1814 /* fmov5-compact: fmov $fmovm, @$rn */
1815
1816 static SEM_PC
1817 SEM_FN_NAME (sh64_compact,fmov5_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1818 {
1819 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1820 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1821 int UNUSED written = 0;
1822 IADDR UNUSED pc = abuf->addr;
1823 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1824
1825 if (NOTBI (GET_H_SZBIT ())) {
1826 {
1827 SF opval = GET_H_FMOV (FLD (f_rm));
1828 SETMEMSF (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
1829 written |= (1 << 4);
1830 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1831 }
1832 } else {
1833 {
1834 DF opval = GET_H_FMOV (FLD (f_rm));
1835 SETMEMDF (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
1836 written |= (1 << 3);
1837 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1838 }
1839 }
1840
1841 abuf->written = written;
1842 return vpc;
1843 #undef FLD
1844 }
1845
1846 /* fmov6-compact: fmov $fmovm, @-$rn */
1847
1848 static SEM_PC
1849 SEM_FN_NAME (sh64_compact,fmov6_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1850 {
1851 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1852 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1853 int UNUSED written = 0;
1854 IADDR UNUSED pc = abuf->addr;
1855 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1856
1857 if (NOTBI (GET_H_SZBIT ())) {
1858 {
1859 {
1860 SI opval = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
1861 SET_H_GRC (FLD (f_rn), opval);
1862 written |= (1 << 5);
1863 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1864 }
1865 {
1866 SF opval = GET_H_FMOV (FLD (f_rm));
1867 SETMEMSF (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
1868 written |= (1 << 4);
1869 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1870 }
1871 }
1872 } else {
1873 {
1874 {
1875 SI opval = SUBSI (GET_H_GRC (FLD (f_rn)), 8);
1876 SET_H_GRC (FLD (f_rn), opval);
1877 written |= (1 << 5);
1878 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
1879 }
1880 {
1881 DF opval = GET_H_FMOV (FLD (f_rm));
1882 SETMEMDF (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
1883 written |= (1 << 3);
1884 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1885 }
1886 }
1887 }
1888
1889 abuf->written = written;
1890 return vpc;
1891 #undef FLD
1892 }
1893
1894 /* fmov7-compact: fmov $fmovm, @(r0, $rn) */
1895
1896 static SEM_PC
1897 SEM_FN_NAME (sh64_compact,fmov7_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1898 {
1899 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1900 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1901 int UNUSED written = 0;
1902 IADDR UNUSED pc = abuf->addr;
1903 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1904
1905 if (NOTBI (GET_H_SZBIT ())) {
1906 {
1907 SF opval = GET_H_FMOV (FLD (f_rm));
1908 SETMEMSF (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rn))), opval);
1909 written |= (1 << 5);
1910 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1911 }
1912 } else {
1913 {
1914 DF opval = GET_H_FMOV (FLD (f_rm));
1915 SETMEMDF (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rn))), opval);
1916 written |= (1 << 4);
1917 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1918 }
1919 }
1920
1921 abuf->written = written;
1922 return vpc;
1923 #undef FLD
1924 }
1925
1926 /* fmov8-compact: fmov.d @($imm12x8, $rm), $drn */
1927
1928 static SEM_PC
1929 SEM_FN_NAME (sh64_compact,fmov8_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1930 {
1931 #define FLD(f) abuf->fields.sfmt_fmov8_compact.f
1932 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1933 int UNUSED written = 0;
1934 IADDR UNUSED pc = abuf->addr;
1935 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1936
1937 {
1938 DF opval = GETMEMDF (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rm)), FLD (f_imm12x8)));
1939 SET_H_DRC (FLD (f_dn), opval);
1940 TRACE_RESULT (current_cpu, abuf, "drc", 'f', opval);
1941 }
1942
1943 return vpc;
1944 #undef FLD
1945 }
1946
1947 /* fmov9-compact: mov.l $drm, @($imm12x8, $rn) */
1948
1949 static SEM_PC
1950 SEM_FN_NAME (sh64_compact,fmov9_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1951 {
1952 #define FLD(f) abuf->fields.sfmt_fmov9_compact.f
1953 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1954 int UNUSED written = 0;
1955 IADDR UNUSED pc = abuf->addr;
1956 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1957
1958 {
1959 DF opval = GET_H_DRC (FLD (f_dm));
1960 SETMEMDF (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rn)), FLD (f_imm12x8)), opval);
1961 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1962 }
1963
1964 return vpc;
1965 #undef FLD
1966 }
1967
1968 /* fmul-compact: fmul $fsdm, $fsdn */
1969
1970 static SEM_PC
1971 SEM_FN_NAME (sh64_compact,fmul_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1972 {
1973 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
1974 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1975 int UNUSED written = 0;
1976 IADDR UNUSED pc = abuf->addr;
1977 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
1978
1979 if (GET_H_PRBIT ()) {
1980 {
1981 DF opval = sh64_fmuld (current_cpu, GET_H_FSD (FLD (f_rm)), GET_H_FSD (FLD (f_rn)));
1982 SET_H_FSD (FLD (f_rn), opval);
1983 written |= (1 << 3);
1984 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1985 }
1986 } else {
1987 {
1988 DF opval = sh64_fmuls (current_cpu, GET_H_FSD (FLD (f_rm)), GET_H_FSD (FLD (f_rn)));
1989 SET_H_FSD (FLD (f_rn), opval);
1990 written |= (1 << 3);
1991 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
1992 }
1993 }
1994
1995 abuf->written = written;
1996 return vpc;
1997 #undef FLD
1998 }
1999
2000 /* fneg-compact: fneg $fsdn */
2001
2002 static SEM_PC
2003 SEM_FN_NAME (sh64_compact,fneg_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2004 {
2005 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2006 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2007 int UNUSED written = 0;
2008 IADDR UNUSED pc = abuf->addr;
2009 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2010
2011 if (GET_H_PRBIT ()) {
2012 {
2013 DF opval = sh64_fnegd (current_cpu, GET_H_FSD (FLD (f_rn)));
2014 SET_H_FSD (FLD (f_rn), opval);
2015 written |= (1 << 2);
2016 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
2017 }
2018 } else {
2019 {
2020 DF opval = sh64_fnegs (current_cpu, GET_H_FSD (FLD (f_rn)));
2021 SET_H_FSD (FLD (f_rn), opval);
2022 written |= (1 << 2);
2023 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
2024 }
2025 }
2026
2027 abuf->written = written;
2028 return vpc;
2029 #undef FLD
2030 }
2031
2032 /* frchg-compact: frchg */
2033
2034 static SEM_PC
2035 SEM_FN_NAME (sh64_compact,frchg_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2036 {
2037 #define FLD(f) abuf->fields.sfmt_empty.f
2038 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2039 int UNUSED written = 0;
2040 IADDR UNUSED pc = abuf->addr;
2041 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2042
2043 {
2044 BI opval = NOTBI (GET_H_FRBIT ());
2045 SET_H_FRBIT (opval);
2046 TRACE_RESULT (current_cpu, abuf, "frbit", 'x', opval);
2047 }
2048
2049 return vpc;
2050 #undef FLD
2051 }
2052
2053 /* fschg-compact: fschg */
2054
2055 static SEM_PC
2056 SEM_FN_NAME (sh64_compact,fschg_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2057 {
2058 #define FLD(f) abuf->fields.sfmt_empty.f
2059 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2060 int UNUSED written = 0;
2061 IADDR UNUSED pc = abuf->addr;
2062 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2063
2064 {
2065 BI opval = NOTBI (GET_H_SZBIT ());
2066 SET_H_SZBIT (opval);
2067 TRACE_RESULT (current_cpu, abuf, "szbit", 'x', opval);
2068 }
2069
2070 return vpc;
2071 #undef FLD
2072 }
2073
2074 /* fsqrt-compact: fsqrt $fsdn */
2075
2076 static SEM_PC
2077 SEM_FN_NAME (sh64_compact,fsqrt_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2078 {
2079 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2080 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2081 int UNUSED written = 0;
2082 IADDR UNUSED pc = abuf->addr;
2083 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2084
2085 if (GET_H_PRBIT ()) {
2086 {
2087 DF opval = sh64_fsqrtd (current_cpu, GET_H_FSD (FLD (f_rn)));
2088 SET_H_FSD (FLD (f_rn), opval);
2089 written |= (1 << 2);
2090 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
2091 }
2092 } else {
2093 {
2094 DF opval = sh64_fsqrts (current_cpu, GET_H_FSD (FLD (f_rn)));
2095 SET_H_FSD (FLD (f_rn), opval);
2096 written |= (1 << 2);
2097 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
2098 }
2099 }
2100
2101 abuf->written = written;
2102 return vpc;
2103 #undef FLD
2104 }
2105
2106 /* fsts-compact: fsts fpul, $frn */
2107
2108 static SEM_PC
2109 SEM_FN_NAME (sh64_compact,fsts_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2110 {
2111 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2112 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2113 int UNUSED written = 0;
2114 IADDR UNUSED pc = abuf->addr;
2115 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2116
2117 {
2118 SF opval = CPU (h_fr[((UINT) 32)]);
2119 SET_H_FRC (FLD (f_rn), opval);
2120 TRACE_RESULT (current_cpu, abuf, "frc", 'f', opval);
2121 }
2122
2123 return vpc;
2124 #undef FLD
2125 }
2126
2127 /* fsub-compact: fsub $fsdm, $fsdn */
2128
2129 static SEM_PC
2130 SEM_FN_NAME (sh64_compact,fsub_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2131 {
2132 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
2133 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2134 int UNUSED written = 0;
2135 IADDR UNUSED pc = abuf->addr;
2136 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2137
2138 if (GET_H_PRBIT ()) {
2139 {
2140 DF opval = sh64_fsubd (current_cpu, GET_H_FSD (FLD (f_rn)), GET_H_FSD (FLD (f_rm)));
2141 SET_H_FSD (FLD (f_rn), opval);
2142 written |= (1 << 3);
2143 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
2144 }
2145 } else {
2146 {
2147 DF opval = sh64_fsubs (current_cpu, GET_H_FSD (FLD (f_rn)), GET_H_FSD (FLD (f_rm)));
2148 SET_H_FSD (FLD (f_rn), opval);
2149 written |= (1 << 3);
2150 TRACE_RESULT (current_cpu, abuf, "fsd", 'f', opval);
2151 }
2152 }
2153
2154 abuf->written = written;
2155 return vpc;
2156 #undef FLD
2157 }
2158
2159 /* ftrc-compact: ftrc $fsdn, fpul */
2160
2161 static SEM_PC
2162 SEM_FN_NAME (sh64_compact,ftrc_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2163 {
2164 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2165 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2166 int UNUSED written = 0;
2167 IADDR UNUSED pc = abuf->addr;
2168 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2169
2170 {
2171 SF opval = ((GET_H_PRBIT ()) ? (sh64_ftrcdl (current_cpu, GET_H_FSD (FLD (f_rn)))) : (sh64_ftrcsl (current_cpu, GET_H_FSD (FLD (f_rn)))));
2172 CPU (h_fr[((UINT) 32)]) = opval;
2173 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
2174 }
2175
2176 return vpc;
2177 #undef FLD
2178 }
2179
2180 /* ftrv-compact: ftrv xmtrx, $fvn */
2181
2182 static SEM_PC
2183 SEM_FN_NAME (sh64_compact,ftrv_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2184 {
2185 #define FLD(f) abuf->fields.sfmt_fipr_compact.f
2186 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2187 int UNUSED written = 0;
2188 IADDR UNUSED pc = abuf->addr;
2189 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2190
2191 sh64_ftrv (current_cpu, FLD (f_vn));
2192
2193 return vpc;
2194 #undef FLD
2195 }
2196
2197 /* jmp-compact: jmp @$rn */
2198
2199 static SEM_PC
2200 SEM_FN_NAME (sh64_compact,jmp_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2201 {
2202 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2203 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2204 int UNUSED written = 0;
2205 IADDR UNUSED pc = abuf->addr;
2206 SEM_BRANCH_INIT
2207 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2208
2209 {
2210 {
2211 UDI opval = ADDDI (pc, 2);
2212 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2213 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
2214 }
2215 ((void) 0); /*nop*/
2216 {
2217 {
2218 UDI opval = GET_H_GRC (FLD (f_rn));
2219 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2220 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
2221 }
2222 }
2223 ((void) 0); /*nop*/
2224 }
2225
2226 SEM_BRANCH_FINI (vpc);
2227 return vpc;
2228 #undef FLD
2229 }
2230
2231 /* jsr-compact: jsr @$rn */
2232
2233 static SEM_PC
2234 SEM_FN_NAME (sh64_compact,jsr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2235 {
2236 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2237 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2238 int UNUSED written = 0;
2239 IADDR UNUSED pc = abuf->addr;
2240 SEM_BRANCH_INIT
2241 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2242
2243 {
2244 {
2245 {
2246 SI opval = ADDDI (pc, 4);
2247 SET_H_PR (opval);
2248 TRACE_RESULT (current_cpu, abuf, "pr", 'x', opval);
2249 }
2250 }
2251 {
2252 UDI opval = ADDDI (pc, 2);
2253 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2254 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
2255 }
2256 ((void) 0); /*nop*/
2257 {
2258 {
2259 UDI opval = GET_H_GRC (FLD (f_rn));
2260 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
2261 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
2262 }
2263 }
2264 ((void) 0); /*nop*/
2265 }
2266
2267 SEM_BRANCH_FINI (vpc);
2268 return vpc;
2269 #undef FLD
2270 }
2271
2272 /* ldc-gbr-compact: ldc $rn, gbr */
2273
2274 static SEM_PC
2275 SEM_FN_NAME (sh64_compact,ldc_gbr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2276 {
2277 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2278 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2279 int UNUSED written = 0;
2280 IADDR UNUSED pc = abuf->addr;
2281 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2282
2283 {
2284 SI opval = GET_H_GRC (FLD (f_rn));
2285 SET_H_GBR (opval);
2286 TRACE_RESULT (current_cpu, abuf, "gbr", 'x', opval);
2287 }
2288
2289 return vpc;
2290 #undef FLD
2291 }
2292
2293 /* ldc-vbr-compact: ldc $rn, vbr */
2294
2295 static SEM_PC
2296 SEM_FN_NAME (sh64_compact,ldc_vbr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2297 {
2298 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2299 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2300 int UNUSED written = 0;
2301 IADDR UNUSED pc = abuf->addr;
2302 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2303
2304 {
2305 SI opval = GET_H_GRC (FLD (f_rn));
2306 SET_H_VBR (opval);
2307 TRACE_RESULT (current_cpu, abuf, "vbr", 'x', opval);
2308 }
2309
2310 return vpc;
2311 #undef FLD
2312 }
2313
2314 /* ldc-sr-compact: ldc $rn, sr */
2315
2316 static SEM_PC
2317 SEM_FN_NAME (sh64_compact,ldc_sr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2318 {
2319 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2320 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2321 int UNUSED written = 0;
2322 IADDR UNUSED pc = abuf->addr;
2323 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2324
2325 {
2326 SI opval = GET_H_GRC (FLD (f_rn));
2327 CPU (h_sr) = opval;
2328 TRACE_RESULT (current_cpu, abuf, "sr", 'x', opval);
2329 }
2330
2331 return vpc;
2332 #undef FLD
2333 }
2334
2335 /* ldcl-gbr-compact: ldc.l @${rn}+, gbr */
2336
2337 static SEM_PC
2338 SEM_FN_NAME (sh64_compact,ldcl_gbr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2339 {
2340 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2341 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2342 int UNUSED written = 0;
2343 IADDR UNUSED pc = abuf->addr;
2344 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2345
2346 {
2347 {
2348 SI opval = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2349 SET_H_GBR (opval);
2350 TRACE_RESULT (current_cpu, abuf, "gbr", 'x', opval);
2351 }
2352 {
2353 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2354 SET_H_GRC (FLD (f_rn), opval);
2355 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2356 }
2357 }
2358
2359 return vpc;
2360 #undef FLD
2361 }
2362
2363 /* ldcl-vbr-compact: ldc.l @${rn}+, vbr */
2364
2365 static SEM_PC
2366 SEM_FN_NAME (sh64_compact,ldcl_vbr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2367 {
2368 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2369 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2370 int UNUSED written = 0;
2371 IADDR UNUSED pc = abuf->addr;
2372 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2373
2374 {
2375 {
2376 SI opval = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2377 SET_H_VBR (opval);
2378 TRACE_RESULT (current_cpu, abuf, "vbr", 'x', opval);
2379 }
2380 {
2381 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2382 SET_H_GRC (FLD (f_rn), opval);
2383 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2384 }
2385 }
2386
2387 return vpc;
2388 #undef FLD
2389 }
2390
2391 /* lds-fpscr-compact: lds $rn, fpscr */
2392
2393 static SEM_PC
2394 SEM_FN_NAME (sh64_compact,lds_fpscr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2395 {
2396 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2397 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2398 int UNUSED written = 0;
2399 IADDR UNUSED pc = abuf->addr;
2400 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2401
2402 {
2403 SI opval = GET_H_GRC (FLD (f_rn));
2404 CPU (h_fpscr) = opval;
2405 TRACE_RESULT (current_cpu, abuf, "fpscr", 'x', opval);
2406 }
2407
2408 return vpc;
2409 #undef FLD
2410 }
2411
2412 /* ldsl-fpscr-compact: lds.l @${rn}+, fpscr */
2413
2414 static SEM_PC
2415 SEM_FN_NAME (sh64_compact,ldsl_fpscr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2416 {
2417 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2418 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2419 int UNUSED written = 0;
2420 IADDR UNUSED pc = abuf->addr;
2421 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2422
2423 {
2424 {
2425 SI opval = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2426 CPU (h_fpscr) = opval;
2427 TRACE_RESULT (current_cpu, abuf, "fpscr", 'x', opval);
2428 }
2429 {
2430 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2431 SET_H_GRC (FLD (f_rn), opval);
2432 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2433 }
2434 }
2435
2436 return vpc;
2437 #undef FLD
2438 }
2439
2440 /* lds-fpul-compact: lds $rn, fpul */
2441
2442 static SEM_PC
2443 SEM_FN_NAME (sh64_compact,lds_fpul_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2444 {
2445 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2446 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2447 int UNUSED written = 0;
2448 IADDR UNUSED pc = abuf->addr;
2449 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2450
2451 {
2452 SF opval = SUBWORDSISF (GET_H_GRC (FLD (f_rn)));
2453 CPU (h_fr[((UINT) 32)]) = opval;
2454 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
2455 }
2456
2457 return vpc;
2458 #undef FLD
2459 }
2460
2461 /* ldsl-fpul-compact: lds.l @${rn}+, fpul */
2462
2463 static SEM_PC
2464 SEM_FN_NAME (sh64_compact,ldsl_fpul_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2465 {
2466 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2467 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2468 int UNUSED written = 0;
2469 IADDR UNUSED pc = abuf->addr;
2470 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2471
2472 {
2473 {
2474 SF opval = GETMEMSF (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2475 CPU (h_fr[((UINT) 32)]) = opval;
2476 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
2477 }
2478 {
2479 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2480 SET_H_GRC (FLD (f_rn), opval);
2481 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2482 }
2483 }
2484
2485 return vpc;
2486 #undef FLD
2487 }
2488
2489 /* lds-mach-compact: lds $rn, mach */
2490
2491 static SEM_PC
2492 SEM_FN_NAME (sh64_compact,lds_mach_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2493 {
2494 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2495 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2496 int UNUSED written = 0;
2497 IADDR UNUSED pc = abuf->addr;
2498 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2499
2500 {
2501 SI opval = GET_H_GRC (FLD (f_rn));
2502 SET_H_MACH (opval);
2503 TRACE_RESULT (current_cpu, abuf, "mach", 'x', opval);
2504 }
2505
2506 return vpc;
2507 #undef FLD
2508 }
2509
2510 /* ldsl-mach-compact: lds.l @${rn}+, mach */
2511
2512 static SEM_PC
2513 SEM_FN_NAME (sh64_compact,ldsl_mach_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2514 {
2515 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2516 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2517 int UNUSED written = 0;
2518 IADDR UNUSED pc = abuf->addr;
2519 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2520
2521 {
2522 {
2523 SI opval = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2524 SET_H_MACH (opval);
2525 TRACE_RESULT (current_cpu, abuf, "mach", 'x', opval);
2526 }
2527 {
2528 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2529 SET_H_GRC (FLD (f_rn), opval);
2530 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2531 }
2532 }
2533
2534 return vpc;
2535 #undef FLD
2536 }
2537
2538 /* lds-macl-compact: lds $rn, macl */
2539
2540 static SEM_PC
2541 SEM_FN_NAME (sh64_compact,lds_macl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2542 {
2543 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2544 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2545 int UNUSED written = 0;
2546 IADDR UNUSED pc = abuf->addr;
2547 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2548
2549 {
2550 SI opval = GET_H_GRC (FLD (f_rn));
2551 SET_H_MACL (opval);
2552 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
2553 }
2554
2555 return vpc;
2556 #undef FLD
2557 }
2558
2559 /* ldsl-macl-compact: lds.l @${rn}+, macl */
2560
2561 static SEM_PC
2562 SEM_FN_NAME (sh64_compact,ldsl_macl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2563 {
2564 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2565 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2566 int UNUSED written = 0;
2567 IADDR UNUSED pc = abuf->addr;
2568 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2569
2570 {
2571 {
2572 SI opval = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2573 SET_H_MACL (opval);
2574 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
2575 }
2576 {
2577 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2578 SET_H_GRC (FLD (f_rn), opval);
2579 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2580 }
2581 }
2582
2583 return vpc;
2584 #undef FLD
2585 }
2586
2587 /* lds-pr-compact: lds $rn, pr */
2588
2589 static SEM_PC
2590 SEM_FN_NAME (sh64_compact,lds_pr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2591 {
2592 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2593 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2594 int UNUSED written = 0;
2595 IADDR UNUSED pc = abuf->addr;
2596 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2597
2598 {
2599 SI opval = GET_H_GRC (FLD (f_rn));
2600 SET_H_PR (opval);
2601 TRACE_RESULT (current_cpu, abuf, "pr", 'x', opval);
2602 }
2603
2604 return vpc;
2605 #undef FLD
2606 }
2607
2608 /* ldsl-pr-compact: lds.l @${rn}+, pr */
2609
2610 static SEM_PC
2611 SEM_FN_NAME (sh64_compact,ldsl_pr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2612 {
2613 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
2614 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2615 int UNUSED written = 0;
2616 IADDR UNUSED pc = abuf->addr;
2617 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2618
2619 {
2620 {
2621 SI opval = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2622 SET_H_PR (opval);
2623 TRACE_RESULT (current_cpu, abuf, "pr", 'x', opval);
2624 }
2625 {
2626 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2627 SET_H_GRC (FLD (f_rn), opval);
2628 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2629 }
2630 }
2631
2632 return vpc;
2633 #undef FLD
2634 }
2635
2636 /* macl-compact: mac.l @${rm}+, @${rn}+ */
2637
2638 static SEM_PC
2639 SEM_FN_NAME (sh64_compact,macl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2640 {
2641 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
2642 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2643 int UNUSED written = 0;
2644 IADDR UNUSED pc = abuf->addr;
2645 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2646
2647 {
2648 DI tmp_tmpry;
2649 DI tmp_mac;
2650 DI tmp_result;
2651 SI tmp_x;
2652 SI tmp_y;
2653 tmp_x = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2654 {
2655 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2656 SET_H_GRC (FLD (f_rn), opval);
2657 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2658 }
2659 if (EQSI (FLD (f_rn), FLD (f_rm))) {
2660 {
2661 {
2662 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
2663 SET_H_GRC (FLD (f_rn), opval);
2664 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2665 }
2666 {
2667 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 4);
2668 SET_H_GRC (FLD (f_rm), opval);
2669 written |= (1 << 11);
2670 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2671 }
2672 }
2673 }
2674 tmp_y = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
2675 {
2676 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 4);
2677 SET_H_GRC (FLD (f_rm), opval);
2678 written |= (1 << 11);
2679 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2680 }
2681 tmp_tmpry = MULDI (ZEXTSIDI (tmp_x), ZEXTSIDI (tmp_y));
2682 tmp_mac = ORDI (SLLDI (ZEXTSIDI (GET_H_MACH ()), 32), ZEXTSIDI (GET_H_MACL ()));
2683 tmp_result = ADDDI (tmp_mac, tmp_tmpry);
2684 {
2685 if (GET_H_SBIT ()) {
2686 {
2687 SI tmp_min;
2688 SI tmp_max;
2689 tmp_max = SRLDI (INVDI (0), 16);
2690 tmp_min = SRLDI (INVDI (0), 15);
2691 if (GTDI (tmp_result, tmp_max)) {
2692 tmp_result = tmp_max;
2693 } else {
2694 if (LTDI (tmp_result, tmp_min)) {
2695 tmp_result = tmp_min;
2696 }
2697 }
2698 }
2699 }
2700 {
2701 SI opval = SUBWORDDISI (tmp_result, 0);
2702 SET_H_MACH (opval);
2703 TRACE_RESULT (current_cpu, abuf, "mach", 'x', opval);
2704 }
2705 {
2706 SI opval = SUBWORDDISI (tmp_result, 1);
2707 SET_H_MACL (opval);
2708 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
2709 }
2710 }
2711 }
2712
2713 abuf->written = written;
2714 return vpc;
2715 #undef FLD
2716 }
2717
2718 /* macw-compact: mac.w @${rm}+, @${rn}+ */
2719
2720 static SEM_PC
2721 SEM_FN_NAME (sh64_compact,macw_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2722 {
2723 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
2724 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2725 int UNUSED written = 0;
2726 IADDR UNUSED pc = abuf->addr;
2727 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2728
2729 {
2730 SI tmp_tmpry;
2731 DI tmp_mac;
2732 DI tmp_result;
2733 HI tmp_x;
2734 HI tmp_y;
2735 tmp_x = GETMEMHI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
2736 {
2737 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 2);
2738 SET_H_GRC (FLD (f_rn), opval);
2739 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2740 }
2741 if (EQSI (FLD (f_rn), FLD (f_rm))) {
2742 {
2743 {
2744 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 2);
2745 SET_H_GRC (FLD (f_rn), opval);
2746 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2747 }
2748 {
2749 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 2);
2750 SET_H_GRC (FLD (f_rm), opval);
2751 written |= (1 << 11);
2752 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2753 }
2754 }
2755 }
2756 tmp_y = GETMEMHI (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
2757 {
2758 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 2);
2759 SET_H_GRC (FLD (f_rm), opval);
2760 written |= (1 << 11);
2761 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2762 }
2763 tmp_tmpry = MULSI (ZEXTHISI (tmp_x), ZEXTHISI (tmp_y));
2764 if (GET_H_SBIT ()) {
2765 {
2766 if (ADDOFSI (tmp_tmpry, GET_H_MACL (), 0)) {
2767 {
2768 SI opval = 1;
2769 SET_H_MACH (opval);
2770 written |= (1 << 9);
2771 TRACE_RESULT (current_cpu, abuf, "mach", 'x', opval);
2772 }
2773 }
2774 {
2775 SI opval = ADDSI (tmp_tmpry, GET_H_MACL ());
2776 SET_H_MACL (opval);
2777 written |= (1 << 10);
2778 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
2779 }
2780 }
2781 } else {
2782 {
2783 tmp_mac = ORDI (SLLDI (ZEXTSIDI (GET_H_MACH ()), 32), ZEXTSIDI (GET_H_MACL ()));
2784 tmp_result = ADDDI (tmp_mac, EXTSIDI (tmp_tmpry));
2785 {
2786 SI opval = SUBWORDDISI (tmp_result, 0);
2787 SET_H_MACH (opval);
2788 written |= (1 << 9);
2789 TRACE_RESULT (current_cpu, abuf, "mach", 'x', opval);
2790 }
2791 {
2792 SI opval = SUBWORDDISI (tmp_result, 1);
2793 SET_H_MACL (opval);
2794 written |= (1 << 10);
2795 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
2796 }
2797 }
2798 }
2799 }
2800
2801 abuf->written = written;
2802 return vpc;
2803 #undef FLD
2804 }
2805
2806 /* mov-compact: mov $rm64, $rn64 */
2807
2808 static SEM_PC
2809 SEM_FN_NAME (sh64_compact,mov_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2810 {
2811 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
2812 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2813 int UNUSED written = 0;
2814 IADDR UNUSED pc = abuf->addr;
2815 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2816
2817 {
2818 DI opval = GET_H_GR (FLD (f_rm));
2819 SET_H_GR (FLD (f_rn), opval);
2820 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2821 }
2822
2823 return vpc;
2824 #undef FLD
2825 }
2826
2827 /* movi-compact: mov #$imm8, $rn */
2828
2829 static SEM_PC
2830 SEM_FN_NAME (sh64_compact,movi_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2831 {
2832 #define FLD(f) abuf->fields.sfmt_addi_compact.f
2833 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2834 int UNUSED written = 0;
2835 IADDR UNUSED pc = abuf->addr;
2836 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2837
2838 {
2839 SI opval = EXTQIDI (ANDQI (FLD (f_imm8), 255));
2840 SET_H_GRC (FLD (f_rn), opval);
2841 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2842 }
2843
2844 return vpc;
2845 #undef FLD
2846 }
2847
2848 /* movi20-compact: movi20 #$imm20, $rn */
2849
2850 static SEM_PC
2851 SEM_FN_NAME (sh64_compact,movi20_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2852 {
2853 #define FLD(f) abuf->fields.sfmt_movi20_compact.f
2854 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2855 int UNUSED written = 0;
2856 IADDR UNUSED pc = abuf->addr;
2857 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2858
2859 {
2860 SI opval = FLD (f_imm20);
2861 SET_H_GRC (FLD (f_rn), opval);
2862 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2863 }
2864
2865 return vpc;
2866 #undef FLD
2867 }
2868
2869 /* movb1-compact: mov.b $rm, @$rn */
2870
2871 static SEM_PC
2872 SEM_FN_NAME (sh64_compact,movb1_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2873 {
2874 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
2875 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2876 int UNUSED written = 0;
2877 IADDR UNUSED pc = abuf->addr;
2878 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2879
2880 {
2881 UQI opval = SUBWORDSIUQI (GET_H_GRC (FLD (f_rm)), 3);
2882 SETMEMUQI (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
2883 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2884 }
2885
2886 return vpc;
2887 #undef FLD
2888 }
2889
2890 /* movb2-compact: mov.b $rm, @-$rn */
2891
2892 static SEM_PC
2893 SEM_FN_NAME (sh64_compact,movb2_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2894 {
2895 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
2896 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2897 int UNUSED written = 0;
2898 IADDR UNUSED pc = abuf->addr;
2899 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2900
2901 {
2902 DI tmp_addr;
2903 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 1);
2904 {
2905 UQI opval = SUBWORDSIUQI (GET_H_GRC (FLD (f_rm)), 3);
2906 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
2907 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2908 }
2909 {
2910 SI opval = tmp_addr;
2911 SET_H_GRC (FLD (f_rn), opval);
2912 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
2913 }
2914 }
2915
2916 return vpc;
2917 #undef FLD
2918 }
2919
2920 /* movb3-compact: mov.b $rm, @(r0,$rn) */
2921
2922 static SEM_PC
2923 SEM_FN_NAME (sh64_compact,movb3_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2924 {
2925 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
2926 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2927 int UNUSED written = 0;
2928 IADDR UNUSED pc = abuf->addr;
2929 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2930
2931 {
2932 UQI opval = SUBWORDSIUQI (GET_H_GRC (FLD (f_rm)), 3);
2933 SETMEMUQI (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rn))), opval);
2934 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2935 }
2936
2937 return vpc;
2938 #undef FLD
2939 }
2940
2941 /* movb4-compact: mov.b r0, @($imm8, gbr) */
2942
2943 static SEM_PC
2944 SEM_FN_NAME (sh64_compact,movb4_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2945 {
2946 #define FLD(f) abuf->fields.sfmt_addi_compact.f
2947 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2948 int UNUSED written = 0;
2949 IADDR UNUSED pc = abuf->addr;
2950 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2951
2952 {
2953 DI tmp_addr;
2954 tmp_addr = ADDSI (GET_H_GBR (), FLD (f_imm8));
2955 {
2956 UQI opval = SUBWORDSIUQI (GET_H_GRC (((UINT) 0)), 3);
2957 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
2958 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2959 }
2960 }
2961
2962 return vpc;
2963 #undef FLD
2964 }
2965
2966 /* movb5-compact: mov.b r0, @($imm4, $rm) */
2967
2968 static SEM_PC
2969 SEM_FN_NAME (sh64_compact,movb5_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2970 {
2971 #define FLD(f) abuf->fields.sfmt_movb5_compact.f
2972 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2973 int UNUSED written = 0;
2974 IADDR UNUSED pc = abuf->addr;
2975 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
2976
2977 {
2978 DI tmp_addr;
2979 tmp_addr = ADDSI (GET_H_GRC (FLD (f_rm)), FLD (f_imm4));
2980 {
2981 UQI opval = SUBWORDSIUQI (GET_H_GRC (((UINT) 0)), 3);
2982 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
2983 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
2984 }
2985 }
2986
2987 return vpc;
2988 #undef FLD
2989 }
2990
2991 /* movb6-compact: mov.b @$rm, $rn */
2992
2993 static SEM_PC
2994 SEM_FN_NAME (sh64_compact,movb6_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2995 {
2996 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
2997 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2998 int UNUSED written = 0;
2999 IADDR UNUSED pc = abuf->addr;
3000 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3001
3002 {
3003 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, GET_H_GRC (FLD (f_rm))));
3004 SET_H_GRC (FLD (f_rn), opval);
3005 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3006 }
3007
3008 return vpc;
3009 #undef FLD
3010 }
3011
3012 /* movb7-compact: mov.b @${rm}+, $rn */
3013
3014 static SEM_PC
3015 SEM_FN_NAME (sh64_compact,movb7_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3016 {
3017 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3018 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3019 int UNUSED written = 0;
3020 IADDR UNUSED pc = abuf->addr;
3021 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3022
3023 {
3024 QI tmp_data;
3025 tmp_data = GETMEMQI (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
3026 if (EQSI (FLD (f_rm), FLD (f_rn))) {
3027 {
3028 SI opval = EXTQISI (tmp_data);
3029 SET_H_GRC (FLD (f_rm), opval);
3030 written |= (1 << 4);
3031 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3032 }
3033 } else {
3034 {
3035 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 1);
3036 SET_H_GRC (FLD (f_rm), opval);
3037 written |= (1 << 4);
3038 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3039 }
3040 }
3041 {
3042 SI opval = EXTQISI (tmp_data);
3043 SET_H_GRC (FLD (f_rn), opval);
3044 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3045 }
3046 }
3047
3048 abuf->written = written;
3049 return vpc;
3050 #undef FLD
3051 }
3052
3053 /* movb8-compact: mov.b @(r0, $rm), $rn */
3054
3055 static SEM_PC
3056 SEM_FN_NAME (sh64_compact,movb8_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3057 {
3058 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3059 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3060 int UNUSED written = 0;
3061 IADDR UNUSED pc = abuf->addr;
3062 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3063
3064 {
3065 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rm)))));
3066 SET_H_GRC (FLD (f_rn), opval);
3067 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3068 }
3069
3070 return vpc;
3071 #undef FLD
3072 }
3073
3074 /* movb9-compact: mov.b @($imm8, gbr), r0 */
3075
3076 static SEM_PC
3077 SEM_FN_NAME (sh64_compact,movb9_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3078 {
3079 #define FLD(f) abuf->fields.sfmt_addi_compact.f
3080 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3081 int UNUSED written = 0;
3082 IADDR UNUSED pc = abuf->addr;
3083 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3084
3085 {
3086 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GBR (), FLD (f_imm8))));
3087 SET_H_GRC (((UINT) 0), opval);
3088 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3089 }
3090
3091 return vpc;
3092 #undef FLD
3093 }
3094
3095 /* movb10-compact: mov.b @($imm4, $rm), r0 */
3096
3097 static SEM_PC
3098 SEM_FN_NAME (sh64_compact,movb10_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3099 {
3100 #define FLD(f) abuf->fields.sfmt_movb5_compact.f
3101 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3102 int UNUSED written = 0;
3103 IADDR UNUSED pc = abuf->addr;
3104 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3105
3106 {
3107 SI opval = EXTQISI (GETMEMQI (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rm)), FLD (f_imm4))));
3108 SET_H_GRC (((UINT) 0), opval);
3109 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3110 }
3111
3112 return vpc;
3113 #undef FLD
3114 }
3115
3116 /* movl1-compact: mov.l $rm, @$rn */
3117
3118 static SEM_PC
3119 SEM_FN_NAME (sh64_compact,movl1_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3120 {
3121 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3122 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3123 int UNUSED written = 0;
3124 IADDR UNUSED pc = abuf->addr;
3125 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3126
3127 {
3128 SI opval = GET_H_GRC (FLD (f_rm));
3129 SETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
3130 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3131 }
3132
3133 return vpc;
3134 #undef FLD
3135 }
3136
3137 /* movl2-compact: mov.l $rm, @-$rn */
3138
3139 static SEM_PC
3140 SEM_FN_NAME (sh64_compact,movl2_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3141 {
3142 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3143 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3144 int UNUSED written = 0;
3145 IADDR UNUSED pc = abuf->addr;
3146 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3147
3148 {
3149 SI tmp_addr;
3150 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
3151 {
3152 SI opval = GET_H_GRC (FLD (f_rm));
3153 SETMEMSI (current_cpu, pc, tmp_addr, opval);
3154 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3155 }
3156 {
3157 SI opval = tmp_addr;
3158 SET_H_GRC (FLD (f_rn), opval);
3159 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3160 }
3161 }
3162
3163 return vpc;
3164 #undef FLD
3165 }
3166
3167 /* movl3-compact: mov.l $rm, @(r0, $rn) */
3168
3169 static SEM_PC
3170 SEM_FN_NAME (sh64_compact,movl3_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3171 {
3172 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3173 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3174 int UNUSED written = 0;
3175 IADDR UNUSED pc = abuf->addr;
3176 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3177
3178 {
3179 SI opval = GET_H_GRC (FLD (f_rm));
3180 SETMEMSI (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rn))), opval);
3181 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3182 }
3183
3184 return vpc;
3185 #undef FLD
3186 }
3187
3188 /* movl4-compact: mov.l r0, @($imm8x4, gbr) */
3189
3190 static SEM_PC
3191 SEM_FN_NAME (sh64_compact,movl4_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3192 {
3193 #define FLD(f) abuf->fields.sfmt_movl10_compact.f
3194 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3195 int UNUSED written = 0;
3196 IADDR UNUSED pc = abuf->addr;
3197 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3198
3199 {
3200 SI opval = GET_H_GRC (((UINT) 0));
3201 SETMEMSI (current_cpu, pc, ADDSI (GET_H_GBR (), FLD (f_imm8x4)), opval);
3202 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3203 }
3204
3205 return vpc;
3206 #undef FLD
3207 }
3208
3209 /* movl5-compact: mov.l $rm, @($imm4x4, $rn) */
3210
3211 static SEM_PC
3212 SEM_FN_NAME (sh64_compact,movl5_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3213 {
3214 #define FLD(f) abuf->fields.sfmt_movl5_compact.f
3215 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3216 int UNUSED written = 0;
3217 IADDR UNUSED pc = abuf->addr;
3218 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3219
3220 {
3221 SI opval = GET_H_GRC (FLD (f_rm));
3222 SETMEMSI (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rn)), FLD (f_imm4x4)), opval);
3223 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3224 }
3225
3226 return vpc;
3227 #undef FLD
3228 }
3229
3230 /* movl6-compact: mov.l @$rm, $rn */
3231
3232 static SEM_PC
3233 SEM_FN_NAME (sh64_compact,movl6_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3234 {
3235 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3236 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3237 int UNUSED written = 0;
3238 IADDR UNUSED pc = abuf->addr;
3239 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3240
3241 {
3242 SI opval = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
3243 SET_H_GRC (FLD (f_rn), opval);
3244 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3245 }
3246
3247 return vpc;
3248 #undef FLD
3249 }
3250
3251 /* movl7-compact: mov.l @${rm}+, $rn */
3252
3253 static SEM_PC
3254 SEM_FN_NAME (sh64_compact,movl7_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3255 {
3256 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3257 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3258 int UNUSED written = 0;
3259 IADDR UNUSED pc = abuf->addr;
3260 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3261
3262 {
3263 {
3264 SI opval = GETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
3265 SET_H_GRC (FLD (f_rn), opval);
3266 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3267 }
3268 if (EQSI (FLD (f_rm), FLD (f_rn))) {
3269 {
3270 SI opval = GET_H_GRC (FLD (f_rn));
3271 SET_H_GRC (FLD (f_rm), opval);
3272 written |= (1 << 5);
3273 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3274 }
3275 } else {
3276 {
3277 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 4);
3278 SET_H_GRC (FLD (f_rm), opval);
3279 written |= (1 << 5);
3280 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3281 }
3282 }
3283 }
3284
3285 abuf->written = written;
3286 return vpc;
3287 #undef FLD
3288 }
3289
3290 /* movl8-compact: mov.l @(r0, $rm), $rn */
3291
3292 static SEM_PC
3293 SEM_FN_NAME (sh64_compact,movl8_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3294 {
3295 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3296 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3297 int UNUSED written = 0;
3298 IADDR UNUSED pc = abuf->addr;
3299 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3300
3301 {
3302 SI opval = GETMEMSI (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rm))));
3303 SET_H_GRC (FLD (f_rn), opval);
3304 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3305 }
3306
3307 return vpc;
3308 #undef FLD
3309 }
3310
3311 /* movl9-compact: mov.l @($imm8x4, gbr), r0 */
3312
3313 static SEM_PC
3314 SEM_FN_NAME (sh64_compact,movl9_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3315 {
3316 #define FLD(f) abuf->fields.sfmt_movl10_compact.f
3317 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3318 int UNUSED written = 0;
3319 IADDR UNUSED pc = abuf->addr;
3320 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3321
3322 {
3323 SI opval = GETMEMSI (current_cpu, pc, ADDSI (GET_H_GBR (), FLD (f_imm8x4)));
3324 SET_H_GRC (((UINT) 0), opval);
3325 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3326 }
3327
3328 return vpc;
3329 #undef FLD
3330 }
3331
3332 /* movl10-compact: mov.l @($imm8x4, pc), $rn */
3333
3334 static SEM_PC
3335 SEM_FN_NAME (sh64_compact,movl10_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3336 {
3337 #define FLD(f) abuf->fields.sfmt_movl10_compact.f
3338 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3339 int UNUSED written = 0;
3340 IADDR UNUSED pc = abuf->addr;
3341 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3342
3343 {
3344 SI opval = GETMEMSI (current_cpu, pc, ADDSI (FLD (f_imm8x4), ANDDI (ADDDI (pc, 4), INVSI (3))));
3345 SET_H_GRC (FLD (f_rn), opval);
3346 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3347 }
3348
3349 return vpc;
3350 #undef FLD
3351 }
3352
3353 /* movl11-compact: mov.l @($imm4x4, $rm), $rn */
3354
3355 static SEM_PC
3356 SEM_FN_NAME (sh64_compact,movl11_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3357 {
3358 #define FLD(f) abuf->fields.sfmt_movl5_compact.f
3359 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3360 int UNUSED written = 0;
3361 IADDR UNUSED pc = abuf->addr;
3362 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3363
3364 {
3365 SI opval = GETMEMSI (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rm)), FLD (f_imm4x4)));
3366 SET_H_GRC (FLD (f_rn), opval);
3367 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3368 }
3369
3370 return vpc;
3371 #undef FLD
3372 }
3373
3374 /* movl12-compact: mov.l @($imm12x4, $rm), $rn */
3375
3376 static SEM_PC
3377 SEM_FN_NAME (sh64_compact,movl12_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3378 {
3379 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3380 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3381 int UNUSED written = 0;
3382 IADDR UNUSED pc = abuf->addr;
3383 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3384
3385 {
3386 SI opval = GETMEMSI (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rm)), FLD (f_imm12x4)));
3387 SET_H_GRC (FLD (f_rn), opval);
3388 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3389 }
3390
3391 return vpc;
3392 #undef FLD
3393 }
3394
3395 /* movl13-compact: mov.l $rm, @($imm12x4, $rn) */
3396
3397 static SEM_PC
3398 SEM_FN_NAME (sh64_compact,movl13_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3399 {
3400 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3401 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3402 int UNUSED written = 0;
3403 IADDR UNUSED pc = abuf->addr;
3404 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3405
3406 {
3407 SI opval = GET_H_GRC (FLD (f_rm));
3408 SETMEMSI (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rn)), FLD (f_imm12x4)), opval);
3409 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3410 }
3411
3412 return vpc;
3413 #undef FLD
3414 }
3415
3416 /* movw1-compact: mov.w $rm, @$rn */
3417
3418 static SEM_PC
3419 SEM_FN_NAME (sh64_compact,movw1_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3420 {
3421 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3422 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3423 int UNUSED written = 0;
3424 IADDR UNUSED pc = abuf->addr;
3425 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3426
3427 {
3428 HI opval = SUBWORDSIHI (GET_H_GRC (FLD (f_rm)), 1);
3429 SETMEMHI (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
3430 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3431 }
3432
3433 return vpc;
3434 #undef FLD
3435 }
3436
3437 /* movw2-compact: mov.w $rm, @-$rn */
3438
3439 static SEM_PC
3440 SEM_FN_NAME (sh64_compact,movw2_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3441 {
3442 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3443 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3444 int UNUSED written = 0;
3445 IADDR UNUSED pc = abuf->addr;
3446 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3447
3448 {
3449 DI tmp_addr;
3450 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 2);
3451 {
3452 HI opval = SUBWORDSIHI (GET_H_GRC (FLD (f_rm)), 1);
3453 SETMEMHI (current_cpu, pc, tmp_addr, opval);
3454 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3455 }
3456 {
3457 SI opval = tmp_addr;
3458 SET_H_GRC (FLD (f_rn), opval);
3459 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3460 }
3461 }
3462
3463 return vpc;
3464 #undef FLD
3465 }
3466
3467 /* movw3-compact: mov.w $rm, @(r0, $rn) */
3468
3469 static SEM_PC
3470 SEM_FN_NAME (sh64_compact,movw3_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3471 {
3472 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3473 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3474 int UNUSED written = 0;
3475 IADDR UNUSED pc = abuf->addr;
3476 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3477
3478 {
3479 HI opval = SUBWORDSIHI (GET_H_GRC (FLD (f_rm)), 1);
3480 SETMEMHI (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rn))), opval);
3481 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3482 }
3483
3484 return vpc;
3485 #undef FLD
3486 }
3487
3488 /* movw4-compact: mov.w r0, @($imm8x2, gbr) */
3489
3490 static SEM_PC
3491 SEM_FN_NAME (sh64_compact,movw4_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3492 {
3493 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3494 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3495 int UNUSED written = 0;
3496 IADDR UNUSED pc = abuf->addr;
3497 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3498
3499 {
3500 HI opval = SUBWORDSIHI (GET_H_GRC (((UINT) 0)), 1);
3501 SETMEMHI (current_cpu, pc, ADDSI (GET_H_GBR (), FLD (f_imm8x2)), opval);
3502 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3503 }
3504
3505 return vpc;
3506 #undef FLD
3507 }
3508
3509 /* movw5-compact: mov.w r0, @($imm4x2, $rm) */
3510
3511 static SEM_PC
3512 SEM_FN_NAME (sh64_compact,movw5_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3513 {
3514 #define FLD(f) abuf->fields.sfmt_movw5_compact.f
3515 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3516 int UNUSED written = 0;
3517 IADDR UNUSED pc = abuf->addr;
3518 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3519
3520 {
3521 HI opval = SUBWORDSIHI (GET_H_GRC (((UINT) 0)), 1);
3522 SETMEMHI (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rm)), FLD (f_imm4x2)), opval);
3523 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3524 }
3525
3526 return vpc;
3527 #undef FLD
3528 }
3529
3530 /* movw6-compact: mov.w @$rm, $rn */
3531
3532 static SEM_PC
3533 SEM_FN_NAME (sh64_compact,movw6_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3534 {
3535 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3536 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3537 int UNUSED written = 0;
3538 IADDR UNUSED pc = abuf->addr;
3539 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3540
3541 {
3542 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, GET_H_GRC (FLD (f_rm))));
3543 SET_H_GRC (FLD (f_rn), opval);
3544 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3545 }
3546
3547 return vpc;
3548 #undef FLD
3549 }
3550
3551 /* movw7-compact: mov.w @${rm}+, $rn */
3552
3553 static SEM_PC
3554 SEM_FN_NAME (sh64_compact,movw7_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3555 {
3556 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3557 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3558 int UNUSED written = 0;
3559 IADDR UNUSED pc = abuf->addr;
3560 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3561
3562 {
3563 HI tmp_data;
3564 tmp_data = GETMEMHI (current_cpu, pc, GET_H_GRC (FLD (f_rm)));
3565 if (EQSI (FLD (f_rm), FLD (f_rn))) {
3566 {
3567 SI opval = EXTHISI (tmp_data);
3568 SET_H_GRC (FLD (f_rm), opval);
3569 written |= (1 << 4);
3570 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3571 }
3572 } else {
3573 {
3574 SI opval = ADDSI (GET_H_GRC (FLD (f_rm)), 2);
3575 SET_H_GRC (FLD (f_rm), opval);
3576 written |= (1 << 4);
3577 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3578 }
3579 }
3580 {
3581 SI opval = EXTHISI (tmp_data);
3582 SET_H_GRC (FLD (f_rn), opval);
3583 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3584 }
3585 }
3586
3587 abuf->written = written;
3588 return vpc;
3589 #undef FLD
3590 }
3591
3592 /* movw8-compact: mov.w @(r0, $rm), $rn */
3593
3594 static SEM_PC
3595 SEM_FN_NAME (sh64_compact,movw8_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3596 {
3597 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3598 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3599 int UNUSED written = 0;
3600 IADDR UNUSED pc = abuf->addr;
3601 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3602
3603 {
3604 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GRC (FLD (f_rm)))));
3605 SET_H_GRC (FLD (f_rn), opval);
3606 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3607 }
3608
3609 return vpc;
3610 #undef FLD
3611 }
3612
3613 /* movw9-compact: mov.w @($imm8x2, gbr), r0 */
3614
3615 static SEM_PC
3616 SEM_FN_NAME (sh64_compact,movw9_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3617 {
3618 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3619 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3620 int UNUSED written = 0;
3621 IADDR UNUSED pc = abuf->addr;
3622 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3623
3624 {
3625 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GBR (), FLD (f_imm8x2))));
3626 SET_H_GRC (((UINT) 0), opval);
3627 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3628 }
3629
3630 return vpc;
3631 #undef FLD
3632 }
3633
3634 /* movw10-compact: mov.w @($imm8x2, pc), $rn */
3635
3636 static SEM_PC
3637 SEM_FN_NAME (sh64_compact,movw10_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3638 {
3639 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3640 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3641 int UNUSED written = 0;
3642 IADDR UNUSED pc = abuf->addr;
3643 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3644
3645 {
3646 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDDI (ADDDI (pc, 4), FLD (f_imm8x2))));
3647 SET_H_GRC (FLD (f_rn), opval);
3648 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3649 }
3650
3651 return vpc;
3652 #undef FLD
3653 }
3654
3655 /* movw11-compact: mov.w @($imm4x2, $rm), r0 */
3656
3657 static SEM_PC
3658 SEM_FN_NAME (sh64_compact,movw11_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3659 {
3660 #define FLD(f) abuf->fields.sfmt_movw5_compact.f
3661 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3662 int UNUSED written = 0;
3663 IADDR UNUSED pc = abuf->addr;
3664 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3665
3666 {
3667 SI opval = EXTHISI (GETMEMHI (current_cpu, pc, ADDSI (GET_H_GRC (FLD (f_rm)), FLD (f_imm4x2))));
3668 SET_H_GRC (((UINT) 0), opval);
3669 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3670 }
3671
3672 return vpc;
3673 #undef FLD
3674 }
3675
3676 /* mova-compact: mova @($imm8x4, pc), r0 */
3677
3678 static SEM_PC
3679 SEM_FN_NAME (sh64_compact,mova_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3680 {
3681 #define FLD(f) abuf->fields.sfmt_movl10_compact.f
3682 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3683 int UNUSED written = 0;
3684 IADDR UNUSED pc = abuf->addr;
3685 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3686
3687 {
3688 SI opval = ADDDI (ANDDI (ADDDI (pc, 4), INVSI (3)), FLD (f_imm8x4));
3689 SET_H_GRC (((UINT) 0), opval);
3690 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3691 }
3692
3693 return vpc;
3694 #undef FLD
3695 }
3696
3697 /* movcal-compact: movca.l r0, @$rn */
3698
3699 static SEM_PC
3700 SEM_FN_NAME (sh64_compact,movcal_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3701 {
3702 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3703 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3704 int UNUSED written = 0;
3705 IADDR UNUSED pc = abuf->addr;
3706 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3707
3708 {
3709 SI opval = GET_H_GRC (((UINT) 0));
3710 SETMEMSI (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
3711 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
3712 }
3713
3714 return vpc;
3715 #undef FLD
3716 }
3717
3718 /* movcol-compact: movco.l r0, @$rn */
3719
3720 static SEM_PC
3721 SEM_FN_NAME (sh64_compact,movcol_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3722 {
3723 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3724 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3725 int UNUSED written = 0;
3726 IADDR UNUSED pc = abuf->addr;
3727 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3728
3729 {
3730 SI opval = GET_H_GRC (FLD (f_rn));
3731 SET_H_GRC (FLD (f_rn), opval);
3732 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3733 }
3734
3735 return vpc;
3736 #undef FLD
3737 }
3738
3739 /* movt-compact: movt $rn */
3740
3741 static SEM_PC
3742 SEM_FN_NAME (sh64_compact,movt_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3743 {
3744 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3745 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3746 int UNUSED written = 0;
3747 IADDR UNUSED pc = abuf->addr;
3748 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3749
3750 {
3751 SI opval = ZEXTBISI (GET_H_TBIT ());
3752 SET_H_GRC (FLD (f_rn), opval);
3753 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3754 }
3755
3756 return vpc;
3757 #undef FLD
3758 }
3759
3760 /* movual-compact: movua.l @$rn, r0 */
3761
3762 static SEM_PC
3763 SEM_FN_NAME (sh64_compact,movual_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3764 {
3765 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3766 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3767 int UNUSED written = 0;
3768 IADDR UNUSED pc = abuf->addr;
3769 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3770
3771 {
3772 SI opval = sh64_movua (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
3773 SET_H_GRC (((UINT) 0), opval);
3774 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3775 }
3776
3777 return vpc;
3778 #undef FLD
3779 }
3780
3781 /* movual2-compact: movua.l @$rn+, r0 */
3782
3783 static SEM_PC
3784 SEM_FN_NAME (sh64_compact,movual2_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3785 {
3786 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3787 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3788 int UNUSED written = 0;
3789 IADDR UNUSED pc = abuf->addr;
3790 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3791
3792 {
3793 {
3794 SI opval = sh64_movua (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
3795 SET_H_GRC (((UINT) 0), opval);
3796 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3797 }
3798 {
3799 SI opval = ADDSI (GET_H_GRC (FLD (f_rn)), 4);
3800 SET_H_GRC (FLD (f_rn), opval);
3801 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3802 }
3803 }
3804
3805 return vpc;
3806 #undef FLD
3807 }
3808
3809 /* mull-compact: mul.l $rm, $rn */
3810
3811 static SEM_PC
3812 SEM_FN_NAME (sh64_compact,mull_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3813 {
3814 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3815 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3816 int UNUSED written = 0;
3817 IADDR UNUSED pc = abuf->addr;
3818 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3819
3820 {
3821 SI opval = MULSI (GET_H_GRC (FLD (f_rm)), GET_H_GRC (FLD (f_rn)));
3822 SET_H_MACL (opval);
3823 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
3824 }
3825
3826 return vpc;
3827 #undef FLD
3828 }
3829
3830 /* mulsw-compact: muls.w $rm, $rn */
3831
3832 static SEM_PC
3833 SEM_FN_NAME (sh64_compact,mulsw_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3834 {
3835 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3836 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3837 int UNUSED written = 0;
3838 IADDR UNUSED pc = abuf->addr;
3839 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3840
3841 {
3842 SI opval = MULSI (EXTHISI (SUBWORDSIHI (GET_H_GRC (FLD (f_rm)), 1)), EXTHISI (SUBWORDSIHI (GET_H_GRC (FLD (f_rn)), 1)));
3843 SET_H_MACL (opval);
3844 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
3845 }
3846
3847 return vpc;
3848 #undef FLD
3849 }
3850
3851 /* muluw-compact: mulu.w $rm, $rn */
3852
3853 static SEM_PC
3854 SEM_FN_NAME (sh64_compact,muluw_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3855 {
3856 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3857 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3858 int UNUSED written = 0;
3859 IADDR UNUSED pc = abuf->addr;
3860 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3861
3862 {
3863 SI opval = MULSI (ZEXTHISI (SUBWORDSIHI (GET_H_GRC (FLD (f_rm)), 1)), ZEXTHISI (SUBWORDSIHI (GET_H_GRC (FLD (f_rn)), 1)));
3864 SET_H_MACL (opval);
3865 TRACE_RESULT (current_cpu, abuf, "macl", 'x', opval);
3866 }
3867
3868 return vpc;
3869 #undef FLD
3870 }
3871
3872 /* neg-compact: neg $rm, $rn */
3873
3874 static SEM_PC
3875 SEM_FN_NAME (sh64_compact,neg_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3876 {
3877 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3878 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3879 int UNUSED written = 0;
3880 IADDR UNUSED pc = abuf->addr;
3881 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3882
3883 {
3884 SI opval = NEGSI (GET_H_GRC (FLD (f_rm)));
3885 SET_H_GRC (FLD (f_rn), opval);
3886 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3887 }
3888
3889 return vpc;
3890 #undef FLD
3891 }
3892
3893 /* negc-compact: negc $rm, $rn */
3894
3895 static SEM_PC
3896 SEM_FN_NAME (sh64_compact,negc_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3897 {
3898 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3899 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3900 int UNUSED written = 0;
3901 IADDR UNUSED pc = abuf->addr;
3902 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3903
3904 {
3905 BI tmp_flag;
3906 tmp_flag = SUBCFSI (0, GET_H_GRC (FLD (f_rm)), GET_H_TBIT ());
3907 {
3908 SI opval = SUBCSI (0, GET_H_GRC (FLD (f_rm)), GET_H_TBIT ());
3909 SET_H_GRC (FLD (f_rn), opval);
3910 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3911 }
3912 {
3913 BI opval = tmp_flag;
3914 SET_H_TBIT (opval);
3915 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
3916 }
3917 }
3918
3919 return vpc;
3920 #undef FLD
3921 }
3922
3923 /* nop-compact: nop */
3924
3925 static SEM_PC
3926 SEM_FN_NAME (sh64_compact,nop_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3927 {
3928 #define FLD(f) abuf->fields.sfmt_empty.f
3929 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3930 int UNUSED written = 0;
3931 IADDR UNUSED pc = abuf->addr;
3932 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3933
3934 ((void) 0); /*nop*/
3935
3936 return vpc;
3937 #undef FLD
3938 }
3939
3940 /* not-compact: not $rm64, $rn64 */
3941
3942 static SEM_PC
3943 SEM_FN_NAME (sh64_compact,not_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3944 {
3945 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
3946 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3947 int UNUSED written = 0;
3948 IADDR UNUSED pc = abuf->addr;
3949 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3950
3951 {
3952 DI opval = INVDI (GET_H_GR (FLD (f_rm)));
3953 SET_H_GR (FLD (f_rn), opval);
3954 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3955 }
3956
3957 return vpc;
3958 #undef FLD
3959 }
3960
3961 /* ocbi-compact: ocbi @$rn */
3962
3963 static SEM_PC
3964 SEM_FN_NAME (sh64_compact,ocbi_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3965 {
3966 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3967 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3968 int UNUSED written = 0;
3969 IADDR UNUSED pc = abuf->addr;
3970 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3971
3972 {
3973 {
3974 SI opval = GET_H_GRC (FLD (f_rn));
3975 SET_H_GRC (FLD (f_rn), opval);
3976 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
3977 }
3978 ((void) 0); /*nop*/
3979 }
3980
3981 return vpc;
3982 #undef FLD
3983 }
3984
3985 /* ocbp-compact: ocbp @$rn */
3986
3987 static SEM_PC
3988 SEM_FN_NAME (sh64_compact,ocbp_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3989 {
3990 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
3991 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3992 int UNUSED written = 0;
3993 IADDR UNUSED pc = abuf->addr;
3994 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
3995
3996 {
3997 {
3998 SI opval = GET_H_GRC (FLD (f_rn));
3999 SET_H_GRC (FLD (f_rn), opval);
4000 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4001 }
4002 ((void) 0); /*nop*/
4003 }
4004
4005 return vpc;
4006 #undef FLD
4007 }
4008
4009 /* ocbwb-compact: ocbwb @$rn */
4010
4011 static SEM_PC
4012 SEM_FN_NAME (sh64_compact,ocbwb_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4013 {
4014 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4015 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4016 int UNUSED written = 0;
4017 IADDR UNUSED pc = abuf->addr;
4018 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4019
4020 {
4021 {
4022 SI opval = GET_H_GRC (FLD (f_rn));
4023 SET_H_GRC (FLD (f_rn), opval);
4024 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4025 }
4026 ((void) 0); /*nop*/
4027 }
4028
4029 return vpc;
4030 #undef FLD
4031 }
4032
4033 /* or-compact: or $rm64, $rn64 */
4034
4035 static SEM_PC
4036 SEM_FN_NAME (sh64_compact,or_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4037 {
4038 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
4039 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4040 int UNUSED written = 0;
4041 IADDR UNUSED pc = abuf->addr;
4042 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4043
4044 {
4045 DI opval = ORDI (GET_H_GR (FLD (f_rm)), GET_H_GR (FLD (f_rn)));
4046 SET_H_GR (FLD (f_rn), opval);
4047 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4048 }
4049
4050 return vpc;
4051 #undef FLD
4052 }
4053
4054 /* ori-compact: or #$uimm8, r0 */
4055
4056 static SEM_PC
4057 SEM_FN_NAME (sh64_compact,ori_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4058 {
4059 #define FLD(f) abuf->fields.sfmt_addi_compact.f
4060 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4061 int UNUSED written = 0;
4062 IADDR UNUSED pc = abuf->addr;
4063 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4064
4065 {
4066 SI opval = ORSI (GET_H_GRC (((UINT) 0)), ZEXTSIDI (FLD (f_imm8)));
4067 SET_H_GRC (((UINT) 0), opval);
4068 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4069 }
4070
4071 return vpc;
4072 #undef FLD
4073 }
4074
4075 /* orb-compact: or.b #$imm8, @(r0, gbr) */
4076
4077 static SEM_PC
4078 SEM_FN_NAME (sh64_compact,orb_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4079 {
4080 #define FLD(f) abuf->fields.sfmt_addi_compact.f
4081 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4082 int UNUSED written = 0;
4083 IADDR UNUSED pc = abuf->addr;
4084 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4085
4086 {
4087 DI tmp_addr;
4088 UQI tmp_data;
4089 tmp_addr = ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GBR ());
4090 tmp_data = ORQI (GETMEMUQI (current_cpu, pc, tmp_addr), FLD (f_imm8));
4091 {
4092 UQI opval = tmp_data;
4093 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
4094 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
4095 }
4096 }
4097
4098 return vpc;
4099 #undef FLD
4100 }
4101
4102 /* pref-compact: pref @$rn */
4103
4104 static SEM_PC
4105 SEM_FN_NAME (sh64_compact,pref_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4106 {
4107 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4108 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4109 int UNUSED written = 0;
4110 IADDR UNUSED pc = abuf->addr;
4111 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4112
4113 sh64_pref (current_cpu, GET_H_GRC (FLD (f_rn)));
4114
4115 return vpc;
4116 #undef FLD
4117 }
4118
4119 /* rotcl-compact: rotcl $rn */
4120
4121 static SEM_PC
4122 SEM_FN_NAME (sh64_compact,rotcl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4123 {
4124 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4125 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4126 int UNUSED written = 0;
4127 IADDR UNUSED pc = abuf->addr;
4128 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4129
4130 {
4131 BI tmp_temp;
4132 tmp_temp = SRLSI (GET_H_GRC (FLD (f_rn)), 31);
4133 {
4134 SI opval = ORSI (SLLSI (GET_H_GRC (FLD (f_rn)), 1), GET_H_TBIT ());
4135 SET_H_GRC (FLD (f_rn), opval);
4136 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4137 }
4138 {
4139 BI opval = ((tmp_temp) ? (1) : (0));
4140 SET_H_TBIT (opval);
4141 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4142 }
4143 }
4144
4145 return vpc;
4146 #undef FLD
4147 }
4148
4149 /* rotcr-compact: rotcr $rn */
4150
4151 static SEM_PC
4152 SEM_FN_NAME (sh64_compact,rotcr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4153 {
4154 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4155 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4156 int UNUSED written = 0;
4157 IADDR UNUSED pc = abuf->addr;
4158 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4159
4160 {
4161 BI tmp_lsbit;
4162 SI tmp_temp;
4163 tmp_lsbit = ((EQSI (ANDSI (GET_H_GRC (FLD (f_rn)), 1), 0)) ? (0) : (1));
4164 tmp_temp = GET_H_TBIT ();
4165 {
4166 SI opval = ORSI (SRLSI (GET_H_GRC (FLD (f_rn)), 1), SLLSI (tmp_temp, 31));
4167 SET_H_GRC (FLD (f_rn), opval);
4168 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4169 }
4170 {
4171 BI opval = ((tmp_lsbit) ? (1) : (0));
4172 SET_H_TBIT (opval);
4173 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4174 }
4175 }
4176
4177 return vpc;
4178 #undef FLD
4179 }
4180
4181 /* rotl-compact: rotl $rn */
4182
4183 static SEM_PC
4184 SEM_FN_NAME (sh64_compact,rotl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4185 {
4186 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4187 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4188 int UNUSED written = 0;
4189 IADDR UNUSED pc = abuf->addr;
4190 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4191
4192 {
4193 BI tmp_temp;
4194 tmp_temp = SRLSI (GET_H_GRC (FLD (f_rn)), 31);
4195 {
4196 SI opval = ORSI (SLLSI (GET_H_GRC (FLD (f_rn)), 1), tmp_temp);
4197 SET_H_GRC (FLD (f_rn), opval);
4198 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4199 }
4200 {
4201 BI opval = ((tmp_temp) ? (1) : (0));
4202 SET_H_TBIT (opval);
4203 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4204 }
4205 }
4206
4207 return vpc;
4208 #undef FLD
4209 }
4210
4211 /* rotr-compact: rotr $rn */
4212
4213 static SEM_PC
4214 SEM_FN_NAME (sh64_compact,rotr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4215 {
4216 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4217 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4218 int UNUSED written = 0;
4219 IADDR UNUSED pc = abuf->addr;
4220 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4221
4222 {
4223 BI tmp_lsbit;
4224 SI tmp_temp;
4225 tmp_lsbit = ((EQSI (ANDSI (GET_H_GRC (FLD (f_rn)), 1), 0)) ? (0) : (1));
4226 tmp_temp = tmp_lsbit;
4227 {
4228 SI opval = ORSI (SRLSI (GET_H_GRC (FLD (f_rn)), 1), SLLSI (tmp_temp, 31));
4229 SET_H_GRC (FLD (f_rn), opval);
4230 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4231 }
4232 {
4233 BI opval = ((tmp_lsbit) ? (1) : (0));
4234 SET_H_TBIT (opval);
4235 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4236 }
4237 }
4238
4239 return vpc;
4240 #undef FLD
4241 }
4242
4243 /* rts-compact: rts */
4244
4245 static SEM_PC
4246 SEM_FN_NAME (sh64_compact,rts_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4247 {
4248 #define FLD(f) abuf->fields.sfmt_empty.f
4249 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4250 int UNUSED written = 0;
4251 IADDR UNUSED pc = abuf->addr;
4252 SEM_BRANCH_INIT
4253 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4254
4255 {
4256 {
4257 UDI opval = ADDDI (pc, 2);
4258 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
4259 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
4260 }
4261 ((void) 0); /*nop*/
4262 {
4263 {
4264 UDI opval = GET_H_PR ();
4265 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
4266 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
4267 }
4268 }
4269 ((void) 0); /*nop*/
4270 }
4271
4272 SEM_BRANCH_FINI (vpc);
4273 return vpc;
4274 #undef FLD
4275 }
4276
4277 /* sets-compact: sets */
4278
4279 static SEM_PC
4280 SEM_FN_NAME (sh64_compact,sets_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4281 {
4282 #define FLD(f) abuf->fields.sfmt_empty.f
4283 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4284 int UNUSED written = 0;
4285 IADDR UNUSED pc = abuf->addr;
4286 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4287
4288 {
4289 BI opval = 1;
4290 SET_H_SBIT (opval);
4291 TRACE_RESULT (current_cpu, abuf, "sbit", 'x', opval);
4292 }
4293
4294 return vpc;
4295 #undef FLD
4296 }
4297
4298 /* sett-compact: sett */
4299
4300 static SEM_PC
4301 SEM_FN_NAME (sh64_compact,sett_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4302 {
4303 #define FLD(f) abuf->fields.sfmt_empty.f
4304 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4305 int UNUSED written = 0;
4306 IADDR UNUSED pc = abuf->addr;
4307 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4308
4309 {
4310 BI opval = 1;
4311 SET_H_TBIT (opval);
4312 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4313 }
4314
4315 return vpc;
4316 #undef FLD
4317 }
4318
4319 /* shad-compact: shad $rm, $rn */
4320
4321 static SEM_PC
4322 SEM_FN_NAME (sh64_compact,shad_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4323 {
4324 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
4325 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4326 int UNUSED written = 0;
4327 IADDR UNUSED pc = abuf->addr;
4328 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4329
4330 {
4331 SI tmp_shamt;
4332 tmp_shamt = ANDSI (GET_H_GRC (FLD (f_rm)), 31);
4333 if (GESI (GET_H_GRC (FLD (f_rm)), 0)) {
4334 {
4335 SI opval = SLLSI (GET_H_GRC (FLD (f_rn)), tmp_shamt);
4336 SET_H_GRC (FLD (f_rn), opval);
4337 written |= (1 << 2);
4338 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4339 }
4340 } else {
4341 if (NESI (tmp_shamt, 0)) {
4342 {
4343 SI opval = SRASI (GET_H_GRC (FLD (f_rn)), SUBSI (32, tmp_shamt));
4344 SET_H_GRC (FLD (f_rn), opval);
4345 written |= (1 << 2);
4346 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4347 }
4348 } else {
4349 if (LTSI (GET_H_GRC (FLD (f_rn)), 0)) {
4350 {
4351 SI opval = NEGSI (1);
4352 SET_H_GRC (FLD (f_rn), opval);
4353 written |= (1 << 2);
4354 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4355 }
4356 } else {
4357 {
4358 SI opval = 0;
4359 SET_H_GRC (FLD (f_rn), opval);
4360 written |= (1 << 2);
4361 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4362 }
4363 }
4364 }
4365 }
4366 }
4367
4368 abuf->written = written;
4369 return vpc;
4370 #undef FLD
4371 }
4372
4373 /* shal-compact: shal $rn */
4374
4375 static SEM_PC
4376 SEM_FN_NAME (sh64_compact,shal_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4377 {
4378 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4379 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4380 int UNUSED written = 0;
4381 IADDR UNUSED pc = abuf->addr;
4382 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4383
4384 {
4385 BI tmp_t;
4386 tmp_t = SRLSI (GET_H_GRC (FLD (f_rn)), 31);
4387 {
4388 SI opval = SLLSI (GET_H_GRC (FLD (f_rn)), 1);
4389 SET_H_GRC (FLD (f_rn), opval);
4390 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4391 }
4392 {
4393 BI opval = ((tmp_t) ? (1) : (0));
4394 SET_H_TBIT (opval);
4395 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4396 }
4397 }
4398
4399 return vpc;
4400 #undef FLD
4401 }
4402
4403 /* shar-compact: shar $rn */
4404
4405 static SEM_PC
4406 SEM_FN_NAME (sh64_compact,shar_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4407 {
4408 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4409 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4410 int UNUSED written = 0;
4411 IADDR UNUSED pc = abuf->addr;
4412 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4413
4414 {
4415 BI tmp_t;
4416 tmp_t = ANDSI (GET_H_GRC (FLD (f_rn)), 1);
4417 {
4418 SI opval = SRASI (GET_H_GRC (FLD (f_rn)), 1);
4419 SET_H_GRC (FLD (f_rn), opval);
4420 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4421 }
4422 {
4423 BI opval = ((tmp_t) ? (1) : (0));
4424 SET_H_TBIT (opval);
4425 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4426 }
4427 }
4428
4429 return vpc;
4430 #undef FLD
4431 }
4432
4433 /* shld-compact: shld $rm, $rn */
4434
4435 static SEM_PC
4436 SEM_FN_NAME (sh64_compact,shld_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4437 {
4438 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
4439 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4440 int UNUSED written = 0;
4441 IADDR UNUSED pc = abuf->addr;
4442 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4443
4444 {
4445 SI tmp_shamt;
4446 tmp_shamt = ANDSI (GET_H_GRC (FLD (f_rm)), 31);
4447 if (GESI (GET_H_GRC (FLD (f_rm)), 0)) {
4448 {
4449 SI opval = SLLSI (GET_H_GRC (FLD (f_rn)), tmp_shamt);
4450 SET_H_GRC (FLD (f_rn), opval);
4451 written |= (1 << 2);
4452 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4453 }
4454 } else {
4455 if (NESI (tmp_shamt, 0)) {
4456 {
4457 SI opval = SRLSI (GET_H_GRC (FLD (f_rn)), SUBSI (32, tmp_shamt));
4458 SET_H_GRC (FLD (f_rn), opval);
4459 written |= (1 << 2);
4460 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4461 }
4462 } else {
4463 {
4464 SI opval = 0;
4465 SET_H_GRC (FLD (f_rn), opval);
4466 written |= (1 << 2);
4467 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4468 }
4469 }
4470 }
4471 }
4472
4473 abuf->written = written;
4474 return vpc;
4475 #undef FLD
4476 }
4477
4478 /* shll-compact: shll $rn */
4479
4480 static SEM_PC
4481 SEM_FN_NAME (sh64_compact,shll_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4482 {
4483 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4484 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4485 int UNUSED written = 0;
4486 IADDR UNUSED pc = abuf->addr;
4487 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4488
4489 {
4490 BI tmp_t;
4491 tmp_t = SRLSI (GET_H_GRC (FLD (f_rn)), 31);
4492 {
4493 SI opval = SLLSI (GET_H_GRC (FLD (f_rn)), 1);
4494 SET_H_GRC (FLD (f_rn), opval);
4495 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4496 }
4497 {
4498 BI opval = ((tmp_t) ? (1) : (0));
4499 SET_H_TBIT (opval);
4500 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4501 }
4502 }
4503
4504 return vpc;
4505 #undef FLD
4506 }
4507
4508 /* shll2-compact: shll2 $rn */
4509
4510 static SEM_PC
4511 SEM_FN_NAME (sh64_compact,shll2_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4512 {
4513 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4514 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4515 int UNUSED written = 0;
4516 IADDR UNUSED pc = abuf->addr;
4517 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4518
4519 {
4520 SI opval = SLLSI (GET_H_GRC (FLD (f_rn)), 2);
4521 SET_H_GRC (FLD (f_rn), opval);
4522 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4523 }
4524
4525 return vpc;
4526 #undef FLD
4527 }
4528
4529 /* shll8-compact: shll8 $rn */
4530
4531 static SEM_PC
4532 SEM_FN_NAME (sh64_compact,shll8_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4533 {
4534 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4535 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4536 int UNUSED written = 0;
4537 IADDR UNUSED pc = abuf->addr;
4538 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4539
4540 {
4541 SI opval = SLLSI (GET_H_GRC (FLD (f_rn)), 8);
4542 SET_H_GRC (FLD (f_rn), opval);
4543 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4544 }
4545
4546 return vpc;
4547 #undef FLD
4548 }
4549
4550 /* shll16-compact: shll16 $rn */
4551
4552 static SEM_PC
4553 SEM_FN_NAME (sh64_compact,shll16_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4554 {
4555 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4556 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4557 int UNUSED written = 0;
4558 IADDR UNUSED pc = abuf->addr;
4559 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4560
4561 {
4562 SI opval = SLLSI (GET_H_GRC (FLD (f_rn)), 16);
4563 SET_H_GRC (FLD (f_rn), opval);
4564 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4565 }
4566
4567 return vpc;
4568 #undef FLD
4569 }
4570
4571 /* shlr-compact: shlr $rn */
4572
4573 static SEM_PC
4574 SEM_FN_NAME (sh64_compact,shlr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4575 {
4576 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4577 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4578 int UNUSED written = 0;
4579 IADDR UNUSED pc = abuf->addr;
4580 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4581
4582 {
4583 BI tmp_t;
4584 tmp_t = ANDSI (GET_H_GRC (FLD (f_rn)), 1);
4585 {
4586 SI opval = SRLSI (GET_H_GRC (FLD (f_rn)), 1);
4587 SET_H_GRC (FLD (f_rn), opval);
4588 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4589 }
4590 {
4591 BI opval = ((tmp_t) ? (1) : (0));
4592 SET_H_TBIT (opval);
4593 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
4594 }
4595 }
4596
4597 return vpc;
4598 #undef FLD
4599 }
4600
4601 /* shlr2-compact: shlr2 $rn */
4602
4603 static SEM_PC
4604 SEM_FN_NAME (sh64_compact,shlr2_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4605 {
4606 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4607 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4608 int UNUSED written = 0;
4609 IADDR UNUSED pc = abuf->addr;
4610 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4611
4612 {
4613 SI opval = SRLSI (GET_H_GRC (FLD (f_rn)), 2);
4614 SET_H_GRC (FLD (f_rn), opval);
4615 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4616 }
4617
4618 return vpc;
4619 #undef FLD
4620 }
4621
4622 /* shlr8-compact: shlr8 $rn */
4623
4624 static SEM_PC
4625 SEM_FN_NAME (sh64_compact,shlr8_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4626 {
4627 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4628 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4629 int UNUSED written = 0;
4630 IADDR UNUSED pc = abuf->addr;
4631 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4632
4633 {
4634 SI opval = SRLSI (GET_H_GRC (FLD (f_rn)), 8);
4635 SET_H_GRC (FLD (f_rn), opval);
4636 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4637 }
4638
4639 return vpc;
4640 #undef FLD
4641 }
4642
4643 /* shlr16-compact: shlr16 $rn */
4644
4645 static SEM_PC
4646 SEM_FN_NAME (sh64_compact,shlr16_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4647 {
4648 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4649 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4650 int UNUSED written = 0;
4651 IADDR UNUSED pc = abuf->addr;
4652 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4653
4654 {
4655 SI opval = SRLSI (GET_H_GRC (FLD (f_rn)), 16);
4656 SET_H_GRC (FLD (f_rn), opval);
4657 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4658 }
4659
4660 return vpc;
4661 #undef FLD
4662 }
4663
4664 /* stc-gbr-compact: stc gbr, $rn */
4665
4666 static SEM_PC
4667 SEM_FN_NAME (sh64_compact,stc_gbr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4668 {
4669 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4670 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4671 int UNUSED written = 0;
4672 IADDR UNUSED pc = abuf->addr;
4673 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4674
4675 {
4676 SI opval = GET_H_GBR ();
4677 SET_H_GRC (FLD (f_rn), opval);
4678 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4679 }
4680
4681 return vpc;
4682 #undef FLD
4683 }
4684
4685 /* stc-vbr-compact: stc vbr, $rn */
4686
4687 static SEM_PC
4688 SEM_FN_NAME (sh64_compact,stc_vbr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4689 {
4690 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4691 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4692 int UNUSED written = 0;
4693 IADDR UNUSED pc = abuf->addr;
4694 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4695
4696 {
4697 SI opval = GET_H_VBR ();
4698 SET_H_GRC (FLD (f_rn), opval);
4699 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4700 }
4701
4702 return vpc;
4703 #undef FLD
4704 }
4705
4706 /* stcl-gbr-compact: stc.l gbr, @-$rn */
4707
4708 static SEM_PC
4709 SEM_FN_NAME (sh64_compact,stcl_gbr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4710 {
4711 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4712 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4713 int UNUSED written = 0;
4714 IADDR UNUSED pc = abuf->addr;
4715 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4716
4717 {
4718 DI tmp_addr;
4719 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
4720 {
4721 SI opval = GET_H_GBR ();
4722 SETMEMSI (current_cpu, pc, tmp_addr, opval);
4723 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
4724 }
4725 {
4726 SI opval = tmp_addr;
4727 SET_H_GRC (FLD (f_rn), opval);
4728 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4729 }
4730 }
4731
4732 return vpc;
4733 #undef FLD
4734 }
4735
4736 /* stcl-vbr-compact: stc.l vbr, @-$rn */
4737
4738 static SEM_PC
4739 SEM_FN_NAME (sh64_compact,stcl_vbr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4740 {
4741 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4742 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4743 int UNUSED written = 0;
4744 IADDR UNUSED pc = abuf->addr;
4745 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4746
4747 {
4748 DI tmp_addr;
4749 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
4750 {
4751 SI opval = GET_H_VBR ();
4752 SETMEMSI (current_cpu, pc, tmp_addr, opval);
4753 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
4754 }
4755 {
4756 SI opval = tmp_addr;
4757 SET_H_GRC (FLD (f_rn), opval);
4758 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4759 }
4760 }
4761
4762 return vpc;
4763 #undef FLD
4764 }
4765
4766 /* sts-fpscr-compact: sts fpscr, $rn */
4767
4768 static SEM_PC
4769 SEM_FN_NAME (sh64_compact,sts_fpscr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4770 {
4771 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4772 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4773 int UNUSED written = 0;
4774 IADDR UNUSED pc = abuf->addr;
4775 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4776
4777 {
4778 SI opval = CPU (h_fpscr);
4779 SET_H_GRC (FLD (f_rn), opval);
4780 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4781 }
4782
4783 return vpc;
4784 #undef FLD
4785 }
4786
4787 /* stsl-fpscr-compact: sts.l fpscr, @-$rn */
4788
4789 static SEM_PC
4790 SEM_FN_NAME (sh64_compact,stsl_fpscr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4791 {
4792 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4793 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4794 int UNUSED written = 0;
4795 IADDR UNUSED pc = abuf->addr;
4796 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4797
4798 {
4799 DI tmp_addr;
4800 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
4801 {
4802 SI opval = CPU (h_fpscr);
4803 SETMEMSI (current_cpu, pc, tmp_addr, opval);
4804 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
4805 }
4806 {
4807 SI opval = tmp_addr;
4808 SET_H_GRC (FLD (f_rn), opval);
4809 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4810 }
4811 }
4812
4813 return vpc;
4814 #undef FLD
4815 }
4816
4817 /* sts-fpul-compact: sts fpul, $rn */
4818
4819 static SEM_PC
4820 SEM_FN_NAME (sh64_compact,sts_fpul_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4821 {
4822 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4823 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4824 int UNUSED written = 0;
4825 IADDR UNUSED pc = abuf->addr;
4826 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4827
4828 {
4829 SI opval = SUBWORDSFSI (CPU (h_fr[((UINT) 32)]));
4830 SET_H_GRC (FLD (f_rn), opval);
4831 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4832 }
4833
4834 return vpc;
4835 #undef FLD
4836 }
4837
4838 /* stsl-fpul-compact: sts.l fpul, @-$rn */
4839
4840 static SEM_PC
4841 SEM_FN_NAME (sh64_compact,stsl_fpul_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4842 {
4843 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4844 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4845 int UNUSED written = 0;
4846 IADDR UNUSED pc = abuf->addr;
4847 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4848
4849 {
4850 DI tmp_addr;
4851 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
4852 {
4853 SF opval = CPU (h_fr[((UINT) 32)]);
4854 SETMEMSF (current_cpu, pc, tmp_addr, opval);
4855 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
4856 }
4857 {
4858 SI opval = tmp_addr;
4859 SET_H_GRC (FLD (f_rn), opval);
4860 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4861 }
4862 }
4863
4864 return vpc;
4865 #undef FLD
4866 }
4867
4868 /* sts-mach-compact: sts mach, $rn */
4869
4870 static SEM_PC
4871 SEM_FN_NAME (sh64_compact,sts_mach_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4872 {
4873 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4874 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4875 int UNUSED written = 0;
4876 IADDR UNUSED pc = abuf->addr;
4877 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4878
4879 {
4880 SI opval = GET_H_MACH ();
4881 SET_H_GRC (FLD (f_rn), opval);
4882 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4883 }
4884
4885 return vpc;
4886 #undef FLD
4887 }
4888
4889 /* stsl-mach-compact: sts.l mach, @-$rn */
4890
4891 static SEM_PC
4892 SEM_FN_NAME (sh64_compact,stsl_mach_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4893 {
4894 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4895 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4896 int UNUSED written = 0;
4897 IADDR UNUSED pc = abuf->addr;
4898 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4899
4900 {
4901 DI tmp_addr;
4902 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
4903 {
4904 SI opval = GET_H_MACH ();
4905 SETMEMSI (current_cpu, pc, tmp_addr, opval);
4906 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
4907 }
4908 {
4909 SI opval = tmp_addr;
4910 SET_H_GRC (FLD (f_rn), opval);
4911 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4912 }
4913 }
4914
4915 return vpc;
4916 #undef FLD
4917 }
4918
4919 /* sts-macl-compact: sts macl, $rn */
4920
4921 static SEM_PC
4922 SEM_FN_NAME (sh64_compact,sts_macl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4923 {
4924 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4925 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4926 int UNUSED written = 0;
4927 IADDR UNUSED pc = abuf->addr;
4928 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4929
4930 {
4931 SI opval = GET_H_MACL ();
4932 SET_H_GRC (FLD (f_rn), opval);
4933 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4934 }
4935
4936 return vpc;
4937 #undef FLD
4938 }
4939
4940 /* stsl-macl-compact: sts.l macl, @-$rn */
4941
4942 static SEM_PC
4943 SEM_FN_NAME (sh64_compact,stsl_macl_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4944 {
4945 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4946 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4947 int UNUSED written = 0;
4948 IADDR UNUSED pc = abuf->addr;
4949 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4950
4951 {
4952 DI tmp_addr;
4953 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
4954 {
4955 SI opval = GET_H_MACL ();
4956 SETMEMSI (current_cpu, pc, tmp_addr, opval);
4957 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
4958 }
4959 {
4960 SI opval = tmp_addr;
4961 SET_H_GRC (FLD (f_rn), opval);
4962 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4963 }
4964 }
4965
4966 return vpc;
4967 #undef FLD
4968 }
4969
4970 /* sts-pr-compact: sts pr, $rn */
4971
4972 static SEM_PC
4973 SEM_FN_NAME (sh64_compact,sts_pr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4974 {
4975 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4976 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4977 int UNUSED written = 0;
4978 IADDR UNUSED pc = abuf->addr;
4979 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
4980
4981 {
4982 SI opval = GET_H_PR ();
4983 SET_H_GRC (FLD (f_rn), opval);
4984 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
4985 }
4986
4987 return vpc;
4988 #undef FLD
4989 }
4990
4991 /* stsl-pr-compact: sts.l pr, @-$rn */
4992
4993 static SEM_PC
4994 SEM_FN_NAME (sh64_compact,stsl_pr_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4995 {
4996 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
4997 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4998 int UNUSED written = 0;
4999 IADDR UNUSED pc = abuf->addr;
5000 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5001
5002 {
5003 DI tmp_addr;
5004 tmp_addr = SUBSI (GET_H_GRC (FLD (f_rn)), 4);
5005 {
5006 SI opval = GET_H_PR ();
5007 SETMEMSI (current_cpu, pc, tmp_addr, opval);
5008 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5009 }
5010 {
5011 SI opval = tmp_addr;
5012 SET_H_GRC (FLD (f_rn), opval);
5013 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
5014 }
5015 }
5016
5017 return vpc;
5018 #undef FLD
5019 }
5020
5021 /* sub-compact: sub $rm, $rn */
5022
5023 static SEM_PC
5024 SEM_FN_NAME (sh64_compact,sub_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5025 {
5026 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
5027 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5028 int UNUSED written = 0;
5029 IADDR UNUSED pc = abuf->addr;
5030 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5031
5032 {
5033 SI opval = SUBSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
5034 SET_H_GRC (FLD (f_rn), opval);
5035 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
5036 }
5037
5038 return vpc;
5039 #undef FLD
5040 }
5041
5042 /* subc-compact: subc $rm, $rn */
5043
5044 static SEM_PC
5045 SEM_FN_NAME (sh64_compact,subc_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5046 {
5047 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
5048 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5049 int UNUSED written = 0;
5050 IADDR UNUSED pc = abuf->addr;
5051 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5052
5053 {
5054 BI tmp_flag;
5055 tmp_flag = SUBCFSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)), GET_H_TBIT ());
5056 {
5057 SI opval = SUBCSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)), GET_H_TBIT ());
5058 SET_H_GRC (FLD (f_rn), opval);
5059 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
5060 }
5061 {
5062 BI opval = tmp_flag;
5063 SET_H_TBIT (opval);
5064 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
5065 }
5066 }
5067
5068 return vpc;
5069 #undef FLD
5070 }
5071
5072 /* subv-compact: subv $rm, $rn */
5073
5074 static SEM_PC
5075 SEM_FN_NAME (sh64_compact,subv_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5076 {
5077 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
5078 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5079 int UNUSED written = 0;
5080 IADDR UNUSED pc = abuf->addr;
5081 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5082
5083 {
5084 BI tmp_t;
5085 tmp_t = SUBOFSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)), 0);
5086 {
5087 SI opval = SUBSI (GET_H_GRC (FLD (f_rn)), GET_H_GRC (FLD (f_rm)));
5088 SET_H_GRC (FLD (f_rn), opval);
5089 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
5090 }
5091 {
5092 BI opval = ((tmp_t) ? (1) : (0));
5093 SET_H_TBIT (opval);
5094 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
5095 }
5096 }
5097
5098 return vpc;
5099 #undef FLD
5100 }
5101
5102 /* swapb-compact: swap.b $rm, $rn */
5103
5104 static SEM_PC
5105 SEM_FN_NAME (sh64_compact,swapb_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5106 {
5107 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
5108 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5109 int UNUSED written = 0;
5110 IADDR UNUSED pc = abuf->addr;
5111 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5112
5113 {
5114 UHI tmp_top_half;
5115 UQI tmp_byte1;
5116 UQI tmp_byte0;
5117 tmp_top_half = SUBWORDSIHI (GET_H_GRC (FLD (f_rm)), 0);
5118 tmp_byte1 = SUBWORDSIQI (GET_H_GRC (FLD (f_rm)), 2);
5119 tmp_byte0 = SUBWORDSIQI (GET_H_GRC (FLD (f_rm)), 3);
5120 {
5121 SI opval = ORSI (SLLSI (tmp_top_half, 16), ORSI (SLLSI (tmp_byte0, 8), tmp_byte1));
5122 SET_H_GRC (FLD (f_rn), opval);
5123 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
5124 }
5125 }
5126
5127 return vpc;
5128 #undef FLD
5129 }
5130
5131 /* swapw-compact: swap.w $rm, $rn */
5132
5133 static SEM_PC
5134 SEM_FN_NAME (sh64_compact,swapw_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5135 {
5136 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
5137 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5138 int UNUSED written = 0;
5139 IADDR UNUSED pc = abuf->addr;
5140 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5141
5142 {
5143 SI opval = ORSI (SRLSI (GET_H_GRC (FLD (f_rm)), 16), SLLSI (GET_H_GRC (FLD (f_rm)), 16));
5144 SET_H_GRC (FLD (f_rn), opval);
5145 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
5146 }
5147
5148 return vpc;
5149 #undef FLD
5150 }
5151
5152 /* tasb-compact: tas.b @$rn */
5153
5154 static SEM_PC
5155 SEM_FN_NAME (sh64_compact,tasb_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5156 {
5157 #define FLD(f) abuf->fields.sfmt_movw10_compact.f
5158 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5159 int UNUSED written = 0;
5160 IADDR UNUSED pc = abuf->addr;
5161 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5162
5163 {
5164 UQI tmp_byte;
5165 tmp_byte = GETMEMUQI (current_cpu, pc, GET_H_GRC (FLD (f_rn)));
5166 {
5167 BI opval = ((EQQI (tmp_byte, 0)) ? (1) : (0));
5168 SET_H_TBIT (opval);
5169 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
5170 }
5171 tmp_byte = ORQI (tmp_byte, 128);
5172 {
5173 UQI opval = tmp_byte;
5174 SETMEMUQI (current_cpu, pc, GET_H_GRC (FLD (f_rn)), opval);
5175 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5176 }
5177 }
5178
5179 return vpc;
5180 #undef FLD
5181 }
5182
5183 /* trapa-compact: trapa #$uimm8 */
5184
5185 static SEM_PC
5186 SEM_FN_NAME (sh64_compact,trapa_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5187 {
5188 #define FLD(f) abuf->fields.sfmt_addi_compact.f
5189 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5190 int UNUSED written = 0;
5191 IADDR UNUSED pc = abuf->addr;
5192 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5193
5194 sh64_compact_trapa (current_cpu, FLD (f_imm8), pc);
5195
5196 return vpc;
5197 #undef FLD
5198 }
5199
5200 /* tst-compact: tst $rm, $rn */
5201
5202 static SEM_PC
5203 SEM_FN_NAME (sh64_compact,tst_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5204 {
5205 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
5206 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5207 int UNUSED written = 0;
5208 IADDR UNUSED pc = abuf->addr;
5209 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5210
5211 {
5212 BI opval = ((EQSI (ANDSI (GET_H_GRC (FLD (f_rm)), GET_H_GRC (FLD (f_rn))), 0)) ? (1) : (0));
5213 SET_H_TBIT (opval);
5214 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
5215 }
5216
5217 return vpc;
5218 #undef FLD
5219 }
5220
5221 /* tsti-compact: tst #$uimm8, r0 */
5222
5223 static SEM_PC
5224 SEM_FN_NAME (sh64_compact,tsti_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5225 {
5226 #define FLD(f) abuf->fields.sfmt_addi_compact.f
5227 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5228 int UNUSED written = 0;
5229 IADDR UNUSED pc = abuf->addr;
5230 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5231
5232 {
5233 BI opval = ((EQSI (ANDSI (GET_H_GRC (((UINT) 0)), ZEXTSISI (FLD (f_imm8))), 0)) ? (1) : (0));
5234 SET_H_TBIT (opval);
5235 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
5236 }
5237
5238 return vpc;
5239 #undef FLD
5240 }
5241
5242 /* tstb-compact: tst.b #$imm8, @(r0, gbr) */
5243
5244 static SEM_PC
5245 SEM_FN_NAME (sh64_compact,tstb_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5246 {
5247 #define FLD(f) abuf->fields.sfmt_addi_compact.f
5248 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5249 int UNUSED written = 0;
5250 IADDR UNUSED pc = abuf->addr;
5251 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5252
5253 {
5254 DI tmp_addr;
5255 tmp_addr = ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GBR ());
5256 {
5257 BI opval = ((EQQI (ANDQI (GETMEMUQI (current_cpu, pc, tmp_addr), FLD (f_imm8)), 0)) ? (1) : (0));
5258 SET_H_TBIT (opval);
5259 TRACE_RESULT (current_cpu, abuf, "tbit", 'x', opval);
5260 }
5261 }
5262
5263 return vpc;
5264 #undef FLD
5265 }
5266
5267 /* xor-compact: xor $rm64, $rn64 */
5268
5269 static SEM_PC
5270 SEM_FN_NAME (sh64_compact,xor_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5271 {
5272 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
5273 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5274 int UNUSED written = 0;
5275 IADDR UNUSED pc = abuf->addr;
5276 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5277
5278 {
5279 DI opval = XORDI (GET_H_GR (FLD (f_rn)), GET_H_GR (FLD (f_rm)));
5280 SET_H_GR (FLD (f_rn), opval);
5281 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
5282 }
5283
5284 return vpc;
5285 #undef FLD
5286 }
5287
5288 /* xori-compact: xor #$uimm8, r0 */
5289
5290 static SEM_PC
5291 SEM_FN_NAME (sh64_compact,xori_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5292 {
5293 #define FLD(f) abuf->fields.sfmt_addi_compact.f
5294 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5295 int UNUSED written = 0;
5296 IADDR UNUSED pc = abuf->addr;
5297 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5298
5299 {
5300 SI opval = XORSI (GET_H_GRC (((UINT) 0)), ZEXTSIDI (FLD (f_imm8)));
5301 SET_H_GRC (((UINT) 0), opval);
5302 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
5303 }
5304
5305 return vpc;
5306 #undef FLD
5307 }
5308
5309 /* xorb-compact: xor.b #$imm8, @(r0, gbr) */
5310
5311 static SEM_PC
5312 SEM_FN_NAME (sh64_compact,xorb_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5313 {
5314 #define FLD(f) abuf->fields.sfmt_addi_compact.f
5315 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5316 int UNUSED written = 0;
5317 IADDR UNUSED pc = abuf->addr;
5318 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5319
5320 {
5321 DI tmp_addr;
5322 UQI tmp_data;
5323 tmp_addr = ADDSI (GET_H_GRC (((UINT) 0)), GET_H_GBR ());
5324 tmp_data = XORQI (GETMEMUQI (current_cpu, pc, tmp_addr), FLD (f_imm8));
5325 {
5326 UQI opval = tmp_data;
5327 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5328 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5329 }
5330 }
5331
5332 return vpc;
5333 #undef FLD
5334 }
5335
5336 /* xtrct-compact: xtrct $rm, $rn */
5337
5338 static SEM_PC
5339 SEM_FN_NAME (sh64_compact,xtrct_compact) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5340 {
5341 #define FLD(f) abuf->fields.sfmt_movl12_compact.f
5342 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5343 int UNUSED written = 0;
5344 IADDR UNUSED pc = abuf->addr;
5345 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 2);
5346
5347 {
5348 SI opval = ORSI (SLLSI (GET_H_GRC (FLD (f_rm)), 16), SRLSI (GET_H_GRC (FLD (f_rn)), 16));
5349 SET_H_GRC (FLD (f_rn), opval);
5350 TRACE_RESULT (current_cpu, abuf, "grc", 'x', opval);
5351 }
5352
5353 return vpc;
5354 #undef FLD
5355 }
5356
5357 /* Table of all semantic fns. */
5358
5359 static const struct sem_fn_desc sem_fns[] = {
5360 { SH64_COMPACT_INSN_X_INVALID, SEM_FN_NAME (sh64_compact,x_invalid) },
5361 { SH64_COMPACT_INSN_X_AFTER, SEM_FN_NAME (sh64_compact,x_after) },
5362 { SH64_COMPACT_INSN_X_BEFORE, SEM_FN_NAME (sh64_compact,x_before) },
5363 { SH64_COMPACT_INSN_X_CTI_CHAIN, SEM_FN_NAME (sh64_compact,x_cti_chain) },
5364 { SH64_COMPACT_INSN_X_CHAIN, SEM_FN_NAME (sh64_compact,x_chain) },
5365 { SH64_COMPACT_INSN_X_BEGIN, SEM_FN_NAME (sh64_compact,x_begin) },
5366 { SH64_COMPACT_INSN_ADD_COMPACT, SEM_FN_NAME (sh64_compact,add_compact) },
5367 { SH64_COMPACT_INSN_ADDI_COMPACT, SEM_FN_NAME (sh64_compact,addi_compact) },
5368 { SH64_COMPACT_INSN_ADDC_COMPACT, SEM_FN_NAME (sh64_compact,addc_compact) },
5369 { SH64_COMPACT_INSN_ADDV_COMPACT, SEM_FN_NAME (sh64_compact,addv_compact) },
5370 { SH64_COMPACT_INSN_AND_COMPACT, SEM_FN_NAME (sh64_compact,and_compact) },
5371 { SH64_COMPACT_INSN_ANDI_COMPACT, SEM_FN_NAME (sh64_compact,andi_compact) },
5372 { SH64_COMPACT_INSN_ANDB_COMPACT, SEM_FN_NAME (sh64_compact,andb_compact) },
5373 { SH64_COMPACT_INSN_BF_COMPACT, SEM_FN_NAME (sh64_compact,bf_compact) },
5374 { SH64_COMPACT_INSN_BFS_COMPACT, SEM_FN_NAME (sh64_compact,bfs_compact) },
5375 { SH64_COMPACT_INSN_BRA_COMPACT, SEM_FN_NAME (sh64_compact,bra_compact) },
5376 { SH64_COMPACT_INSN_BRAF_COMPACT, SEM_FN_NAME (sh64_compact,braf_compact) },
5377 { SH64_COMPACT_INSN_BRK_COMPACT, SEM_FN_NAME (sh64_compact,brk_compact) },
5378 { SH64_COMPACT_INSN_BSR_COMPACT, SEM_FN_NAME (sh64_compact,bsr_compact) },
5379 { SH64_COMPACT_INSN_BSRF_COMPACT, SEM_FN_NAME (sh64_compact,bsrf_compact) },
5380 { SH64_COMPACT_INSN_BT_COMPACT, SEM_FN_NAME (sh64_compact,bt_compact) },
5381 { SH64_COMPACT_INSN_BTS_COMPACT, SEM_FN_NAME (sh64_compact,bts_compact) },
5382 { SH64_COMPACT_INSN_CLRMAC_COMPACT, SEM_FN_NAME (sh64_compact,clrmac_compact) },
5383 { SH64_COMPACT_INSN_CLRS_COMPACT, SEM_FN_NAME (sh64_compact,clrs_compact) },
5384 { SH64_COMPACT_INSN_CLRT_COMPACT, SEM_FN_NAME (sh64_compact,clrt_compact) },
5385 { SH64_COMPACT_INSN_CMPEQ_COMPACT, SEM_FN_NAME (sh64_compact,cmpeq_compact) },
5386 { SH64_COMPACT_INSN_CMPEQI_COMPACT, SEM_FN_NAME (sh64_compact,cmpeqi_compact) },
5387 { SH64_COMPACT_INSN_CMPGE_COMPACT, SEM_FN_NAME (sh64_compact,cmpge_compact) },
5388 { SH64_COMPACT_INSN_CMPGT_COMPACT, SEM_FN_NAME (sh64_compact,cmpgt_compact) },
5389 { SH64_COMPACT_INSN_CMPHI_COMPACT, SEM_FN_NAME (sh64_compact,cmphi_compact) },
5390 { SH64_COMPACT_INSN_CMPHS_COMPACT, SEM_FN_NAME (sh64_compact,cmphs_compact) },
5391 { SH64_COMPACT_INSN_CMPPL_COMPACT, SEM_FN_NAME (sh64_compact,cmppl_compact) },
5392 { SH64_COMPACT_INSN_CMPPZ_COMPACT, SEM_FN_NAME (sh64_compact,cmppz_compact) },
5393 { SH64_COMPACT_INSN_CMPSTR_COMPACT, SEM_FN_NAME (sh64_compact,cmpstr_compact) },
5394 { SH64_COMPACT_INSN_DIV0S_COMPACT, SEM_FN_NAME (sh64_compact,div0s_compact) },
5395 { SH64_COMPACT_INSN_DIV0U_COMPACT, SEM_FN_NAME (sh64_compact,div0u_compact) },
5396 { SH64_COMPACT_INSN_DIV1_COMPACT, SEM_FN_NAME (sh64_compact,div1_compact) },
5397 { SH64_COMPACT_INSN_DIVU_COMPACT, SEM_FN_NAME (sh64_compact,divu_compact) },
5398 { SH64_COMPACT_INSN_MULR_COMPACT, SEM_FN_NAME (sh64_compact,mulr_compact) },
5399 { SH64_COMPACT_INSN_DMULSL_COMPACT, SEM_FN_NAME (sh64_compact,dmulsl_compact) },
5400 { SH64_COMPACT_INSN_DMULUL_COMPACT, SEM_FN_NAME (sh64_compact,dmulul_compact) },
5401 { SH64_COMPACT_INSN_DT_COMPACT, SEM_FN_NAME (sh64_compact,dt_compact) },
5402 { SH64_COMPACT_INSN_EXTSB_COMPACT, SEM_FN_NAME (sh64_compact,extsb_compact) },
5403 { SH64_COMPACT_INSN_EXTSW_COMPACT, SEM_FN_NAME (sh64_compact,extsw_compact) },
5404 { SH64_COMPACT_INSN_EXTUB_COMPACT, SEM_FN_NAME (sh64_compact,extub_compact) },
5405 { SH64_COMPACT_INSN_EXTUW_COMPACT, SEM_FN_NAME (sh64_compact,extuw_compact) },
5406 { SH64_COMPACT_INSN_FABS_COMPACT, SEM_FN_NAME (sh64_compact,fabs_compact) },
5407 { SH64_COMPACT_INSN_FADD_COMPACT, SEM_FN_NAME (sh64_compact,fadd_compact) },
5408 { SH64_COMPACT_INSN_FCMPEQ_COMPACT, SEM_FN_NAME (sh64_compact,fcmpeq_compact) },
5409 { SH64_COMPACT_INSN_FCMPGT_COMPACT, SEM_FN_NAME (sh64_compact,fcmpgt_compact) },
5410 { SH64_COMPACT_INSN_FCNVDS_COMPACT, SEM_FN_NAME (sh64_compact,fcnvds_compact) },
5411 { SH64_COMPACT_INSN_FCNVSD_COMPACT, SEM_FN_NAME (sh64_compact,fcnvsd_compact) },
5412 { SH64_COMPACT_INSN_FDIV_COMPACT, SEM_FN_NAME (sh64_compact,fdiv_compact) },
5413 { SH64_COMPACT_INSN_FIPR_COMPACT, SEM_FN_NAME (sh64_compact,fipr_compact) },
5414 { SH64_COMPACT_INSN_FLDS_COMPACT, SEM_FN_NAME (sh64_compact,flds_compact) },
5415 { SH64_COMPACT_INSN_FLDI0_COMPACT, SEM_FN_NAME (sh64_compact,fldi0_compact) },
5416 { SH64_COMPACT_INSN_FLDI1_COMPACT, SEM_FN_NAME (sh64_compact,fldi1_compact) },
5417 { SH64_COMPACT_INSN_FLOAT_COMPACT, SEM_FN_NAME (sh64_compact,float_compact) },
5418 { SH64_COMPACT_INSN_FMAC_COMPACT, SEM_FN_NAME (sh64_compact,fmac_compact) },
5419 { SH64_COMPACT_INSN_FMOV1_COMPACT, SEM_FN_NAME (sh64_compact,fmov1_compact) },
5420 { SH64_COMPACT_INSN_FMOV2_COMPACT, SEM_FN_NAME (sh64_compact,fmov2_compact) },
5421 { SH64_COMPACT_INSN_FMOV3_COMPACT, SEM_FN_NAME (sh64_compact,fmov3_compact) },
5422 { SH64_COMPACT_INSN_FMOV4_COMPACT, SEM_FN_NAME (sh64_compact,fmov4_compact) },
5423 { SH64_COMPACT_INSN_FMOV5_COMPACT, SEM_FN_NAME (sh64_compact,fmov5_compact) },
5424 { SH64_COMPACT_INSN_FMOV6_COMPACT, SEM_FN_NAME (sh64_compact,fmov6_compact) },
5425 { SH64_COMPACT_INSN_FMOV7_COMPACT, SEM_FN_NAME (sh64_compact,fmov7_compact) },
5426 { SH64_COMPACT_INSN_FMOV8_COMPACT, SEM_FN_NAME (sh64_compact,fmov8_compact) },
5427 { SH64_COMPACT_INSN_FMOV9_COMPACT, SEM_FN_NAME (sh64_compact,fmov9_compact) },
5428 { SH64_COMPACT_INSN_FMUL_COMPACT, SEM_FN_NAME (sh64_compact,fmul_compact) },
5429 { SH64_COMPACT_INSN_FNEG_COMPACT, SEM_FN_NAME (sh64_compact,fneg_compact) },
5430 { SH64_COMPACT_INSN_FRCHG_COMPACT, SEM_FN_NAME (sh64_compact,frchg_compact) },
5431 { SH64_COMPACT_INSN_FSCHG_COMPACT, SEM_FN_NAME (sh64_compact,fschg_compact) },
5432 { SH64_COMPACT_INSN_FSQRT_COMPACT, SEM_FN_NAME (sh64_compact,fsqrt_compact) },
5433 { SH64_COMPACT_INSN_FSTS_COMPACT, SEM_FN_NAME (sh64_compact,fsts_compact) },
5434 { SH64_COMPACT_INSN_FSUB_COMPACT, SEM_FN_NAME (sh64_compact,fsub_compact) },
5435 { SH64_COMPACT_INSN_FTRC_COMPACT, SEM_FN_NAME (sh64_compact,ftrc_compact) },
5436 { SH64_COMPACT_INSN_FTRV_COMPACT, SEM_FN_NAME (sh64_compact,ftrv_compact) },
5437 { SH64_COMPACT_INSN_JMP_COMPACT, SEM_FN_NAME (sh64_compact,jmp_compact) },
5438 { SH64_COMPACT_INSN_JSR_COMPACT, SEM_FN_NAME (sh64_compact,jsr_compact) },
5439 { SH64_COMPACT_INSN_LDC_GBR_COMPACT, SEM_FN_NAME (sh64_compact,ldc_gbr_compact) },
5440 { SH64_COMPACT_INSN_LDC_VBR_COMPACT, SEM_FN_NAME (sh64_compact,ldc_vbr_compact) },
5441 { SH64_COMPACT_INSN_LDC_SR_COMPACT, SEM_FN_NAME (sh64_compact,ldc_sr_compact) },
5442 { SH64_COMPACT_INSN_LDCL_GBR_COMPACT, SEM_FN_NAME (sh64_compact,ldcl_gbr_compact) },
5443 { SH64_COMPACT_INSN_LDCL_VBR_COMPACT, SEM_FN_NAME (sh64_compact,ldcl_vbr_compact) },
5444 { SH64_COMPACT_INSN_LDS_FPSCR_COMPACT, SEM_FN_NAME (sh64_compact,lds_fpscr_compact) },
5445 { SH64_COMPACT_INSN_LDSL_FPSCR_COMPACT, SEM_FN_NAME (sh64_compact,ldsl_fpscr_compact) },
5446 { SH64_COMPACT_INSN_LDS_FPUL_COMPACT, SEM_FN_NAME (sh64_compact,lds_fpul_compact) },
5447 { SH64_COMPACT_INSN_LDSL_FPUL_COMPACT, SEM_FN_NAME (sh64_compact,ldsl_fpul_compact) },
5448 { SH64_COMPACT_INSN_LDS_MACH_COMPACT, SEM_FN_NAME (sh64_compact,lds_mach_compact) },
5449 { SH64_COMPACT_INSN_LDSL_MACH_COMPACT, SEM_FN_NAME (sh64_compact,ldsl_mach_compact) },
5450 { SH64_COMPACT_INSN_LDS_MACL_COMPACT, SEM_FN_NAME (sh64_compact,lds_macl_compact) },
5451 { SH64_COMPACT_INSN_LDSL_MACL_COMPACT, SEM_FN_NAME (sh64_compact,ldsl_macl_compact) },
5452 { SH64_COMPACT_INSN_LDS_PR_COMPACT, SEM_FN_NAME (sh64_compact,lds_pr_compact) },
5453 { SH64_COMPACT_INSN_LDSL_PR_COMPACT, SEM_FN_NAME (sh64_compact,ldsl_pr_compact) },
5454 { SH64_COMPACT_INSN_MACL_COMPACT, SEM_FN_NAME (sh64_compact,macl_compact) },
5455 { SH64_COMPACT_INSN_MACW_COMPACT, SEM_FN_NAME (sh64_compact,macw_compact) },
5456 { SH64_COMPACT_INSN_MOV_COMPACT, SEM_FN_NAME (sh64_compact,mov_compact) },
5457 { SH64_COMPACT_INSN_MOVI_COMPACT, SEM_FN_NAME (sh64_compact,movi_compact) },
5458 { SH64_COMPACT_INSN_MOVI20_COMPACT, SEM_FN_NAME (sh64_compact,movi20_compact) },
5459 { SH64_COMPACT_INSN_MOVB1_COMPACT, SEM_FN_NAME (sh64_compact,movb1_compact) },
5460 { SH64_COMPACT_INSN_MOVB2_COMPACT, SEM_FN_NAME (sh64_compact,movb2_compact) },
5461 { SH64_COMPACT_INSN_MOVB3_COMPACT, SEM_FN_NAME (sh64_compact,movb3_compact) },
5462 { SH64_COMPACT_INSN_MOVB4_COMPACT, SEM_FN_NAME (sh64_compact,movb4_compact) },
5463 { SH64_COMPACT_INSN_MOVB5_COMPACT, SEM_FN_NAME (sh64_compact,movb5_compact) },
5464 { SH64_COMPACT_INSN_MOVB6_COMPACT, SEM_FN_NAME (sh64_compact,movb6_compact) },
5465 { SH64_COMPACT_INSN_MOVB7_COMPACT, SEM_FN_NAME (sh64_compact,movb7_compact) },
5466 { SH64_COMPACT_INSN_MOVB8_COMPACT, SEM_FN_NAME (sh64_compact,movb8_compact) },
5467 { SH64_COMPACT_INSN_MOVB9_COMPACT, SEM_FN_NAME (sh64_compact,movb9_compact) },
5468 { SH64_COMPACT_INSN_MOVB10_COMPACT, SEM_FN_NAME (sh64_compact,movb10_compact) },
5469 { SH64_COMPACT_INSN_MOVL1_COMPACT, SEM_FN_NAME (sh64_compact,movl1_compact) },
5470 { SH64_COMPACT_INSN_MOVL2_COMPACT, SEM_FN_NAME (sh64_compact,movl2_compact) },
5471 { SH64_COMPACT_INSN_MOVL3_COMPACT, SEM_FN_NAME (sh64_compact,movl3_compact) },
5472 { SH64_COMPACT_INSN_MOVL4_COMPACT, SEM_FN_NAME (sh64_compact,movl4_compact) },
5473 { SH64_COMPACT_INSN_MOVL5_COMPACT, SEM_FN_NAME (sh64_compact,movl5_compact) },
5474 { SH64_COMPACT_INSN_MOVL6_COMPACT, SEM_FN_NAME (sh64_compact,movl6_compact) },
5475 { SH64_COMPACT_INSN_MOVL7_COMPACT, SEM_FN_NAME (sh64_compact,movl7_compact) },
5476 { SH64_COMPACT_INSN_MOVL8_COMPACT, SEM_FN_NAME (sh64_compact,movl8_compact) },
5477 { SH64_COMPACT_INSN_MOVL9_COMPACT, SEM_FN_NAME (sh64_compact,movl9_compact) },
5478 { SH64_COMPACT_INSN_MOVL10_COMPACT, SEM_FN_NAME (sh64_compact,movl10_compact) },
5479 { SH64_COMPACT_INSN_MOVL11_COMPACT, SEM_FN_NAME (sh64_compact,movl11_compact) },
5480 { SH64_COMPACT_INSN_MOVL12_COMPACT, SEM_FN_NAME (sh64_compact,movl12_compact) },
5481 { SH64_COMPACT_INSN_MOVL13_COMPACT, SEM_FN_NAME (sh64_compact,movl13_compact) },
5482 { SH64_COMPACT_INSN_MOVW1_COMPACT, SEM_FN_NAME (sh64_compact,movw1_compact) },
5483 { SH64_COMPACT_INSN_MOVW2_COMPACT, SEM_FN_NAME (sh64_compact,movw2_compact) },
5484 { SH64_COMPACT_INSN_MOVW3_COMPACT, SEM_FN_NAME (sh64_compact,movw3_compact) },
5485 { SH64_COMPACT_INSN_MOVW4_COMPACT, SEM_FN_NAME (sh64_compact,movw4_compact) },
5486 { SH64_COMPACT_INSN_MOVW5_COMPACT, SEM_FN_NAME (sh64_compact,movw5_compact) },
5487 { SH64_COMPACT_INSN_MOVW6_COMPACT, SEM_FN_NAME (sh64_compact,movw6_compact) },
5488 { SH64_COMPACT_INSN_MOVW7_COMPACT, SEM_FN_NAME (sh64_compact,movw7_compact) },
5489 { SH64_COMPACT_INSN_MOVW8_COMPACT, SEM_FN_NAME (sh64_compact,movw8_compact) },
5490 { SH64_COMPACT_INSN_MOVW9_COMPACT, SEM_FN_NAME (sh64_compact,movw9_compact) },
5491 { SH64_COMPACT_INSN_MOVW10_COMPACT, SEM_FN_NAME (sh64_compact,movw10_compact) },
5492 { SH64_COMPACT_INSN_MOVW11_COMPACT, SEM_FN_NAME (sh64_compact,movw11_compact) },
5493 { SH64_COMPACT_INSN_MOVA_COMPACT, SEM_FN_NAME (sh64_compact,mova_compact) },
5494 { SH64_COMPACT_INSN_MOVCAL_COMPACT, SEM_FN_NAME (sh64_compact,movcal_compact) },
5495 { SH64_COMPACT_INSN_MOVCOL_COMPACT, SEM_FN_NAME (sh64_compact,movcol_compact) },
5496 { SH64_COMPACT_INSN_MOVT_COMPACT, SEM_FN_NAME (sh64_compact,movt_compact) },
5497 { SH64_COMPACT_INSN_MOVUAL_COMPACT, SEM_FN_NAME (sh64_compact,movual_compact) },
5498 { SH64_COMPACT_INSN_MOVUAL2_COMPACT, SEM_FN_NAME (sh64_compact,movual2_compact) },
5499 { SH64_COMPACT_INSN_MULL_COMPACT, SEM_FN_NAME (sh64_compact,mull_compact) },
5500 { SH64_COMPACT_INSN_MULSW_COMPACT, SEM_FN_NAME (sh64_compact,mulsw_compact) },
5501 { SH64_COMPACT_INSN_MULUW_COMPACT, SEM_FN_NAME (sh64_compact,muluw_compact) },
5502 { SH64_COMPACT_INSN_NEG_COMPACT, SEM_FN_NAME (sh64_compact,neg_compact) },
5503 { SH64_COMPACT_INSN_NEGC_COMPACT, SEM_FN_NAME (sh64_compact,negc_compact) },
5504 { SH64_COMPACT_INSN_NOP_COMPACT, SEM_FN_NAME (sh64_compact,nop_compact) },
5505 { SH64_COMPACT_INSN_NOT_COMPACT, SEM_FN_NAME (sh64_compact,not_compact) },
5506 { SH64_COMPACT_INSN_OCBI_COMPACT, SEM_FN_NAME (sh64_compact,ocbi_compact) },
5507 { SH64_COMPACT_INSN_OCBP_COMPACT, SEM_FN_NAME (sh64_compact,ocbp_compact) },
5508 { SH64_COMPACT_INSN_OCBWB_COMPACT, SEM_FN_NAME (sh64_compact,ocbwb_compact) },
5509 { SH64_COMPACT_INSN_OR_COMPACT, SEM_FN_NAME (sh64_compact,or_compact) },
5510 { SH64_COMPACT_INSN_ORI_COMPACT, SEM_FN_NAME (sh64_compact,ori_compact) },
5511 { SH64_COMPACT_INSN_ORB_COMPACT, SEM_FN_NAME (sh64_compact,orb_compact) },
5512 { SH64_COMPACT_INSN_PREF_COMPACT, SEM_FN_NAME (sh64_compact,pref_compact) },
5513 { SH64_COMPACT_INSN_ROTCL_COMPACT, SEM_FN_NAME (sh64_compact,rotcl_compact) },
5514 { SH64_COMPACT_INSN_ROTCR_COMPACT, SEM_FN_NAME (sh64_compact,rotcr_compact) },
5515 { SH64_COMPACT_INSN_ROTL_COMPACT, SEM_FN_NAME (sh64_compact,rotl_compact) },
5516 { SH64_COMPACT_INSN_ROTR_COMPACT, SEM_FN_NAME (sh64_compact,rotr_compact) },
5517 { SH64_COMPACT_INSN_RTS_COMPACT, SEM_FN_NAME (sh64_compact,rts_compact) },
5518 { SH64_COMPACT_INSN_SETS_COMPACT, SEM_FN_NAME (sh64_compact,sets_compact) },
5519 { SH64_COMPACT_INSN_SETT_COMPACT, SEM_FN_NAME (sh64_compact,sett_compact) },
5520 { SH64_COMPACT_INSN_SHAD_COMPACT, SEM_FN_NAME (sh64_compact,shad_compact) },
5521 { SH64_COMPACT_INSN_SHAL_COMPACT, SEM_FN_NAME (sh64_compact,shal_compact) },
5522 { SH64_COMPACT_INSN_SHAR_COMPACT, SEM_FN_NAME (sh64_compact,shar_compact) },
5523 { SH64_COMPACT_INSN_SHLD_COMPACT, SEM_FN_NAME (sh64_compact,shld_compact) },
5524 { SH64_COMPACT_INSN_SHLL_COMPACT, SEM_FN_NAME (sh64_compact,shll_compact) },
5525 { SH64_COMPACT_INSN_SHLL2_COMPACT, SEM_FN_NAME (sh64_compact,shll2_compact) },
5526 { SH64_COMPACT_INSN_SHLL8_COMPACT, SEM_FN_NAME (sh64_compact,shll8_compact) },
5527 { SH64_COMPACT_INSN_SHLL16_COMPACT, SEM_FN_NAME (sh64_compact,shll16_compact) },
5528 { SH64_COMPACT_INSN_SHLR_COMPACT, SEM_FN_NAME (sh64_compact,shlr_compact) },
5529 { SH64_COMPACT_INSN_SHLR2_COMPACT, SEM_FN_NAME (sh64_compact,shlr2_compact) },
5530 { SH64_COMPACT_INSN_SHLR8_COMPACT, SEM_FN_NAME (sh64_compact,shlr8_compact) },
5531 { SH64_COMPACT_INSN_SHLR16_COMPACT, SEM_FN_NAME (sh64_compact,shlr16_compact) },
5532 { SH64_COMPACT_INSN_STC_GBR_COMPACT, SEM_FN_NAME (sh64_compact,stc_gbr_compact) },
5533 { SH64_COMPACT_INSN_STC_VBR_COMPACT, SEM_FN_NAME (sh64_compact,stc_vbr_compact) },
5534 { SH64_COMPACT_INSN_STCL_GBR_COMPACT, SEM_FN_NAME (sh64_compact,stcl_gbr_compact) },
5535 { SH64_COMPACT_INSN_STCL_VBR_COMPACT, SEM_FN_NAME (sh64_compact,stcl_vbr_compact) },
5536 { SH64_COMPACT_INSN_STS_FPSCR_COMPACT, SEM_FN_NAME (sh64_compact,sts_fpscr_compact) },
5537 { SH64_COMPACT_INSN_STSL_FPSCR_COMPACT, SEM_FN_NAME (sh64_compact,stsl_fpscr_compact) },
5538 { SH64_COMPACT_INSN_STS_FPUL_COMPACT, SEM_FN_NAME (sh64_compact,sts_fpul_compact) },
5539 { SH64_COMPACT_INSN_STSL_FPUL_COMPACT, SEM_FN_NAME (sh64_compact,stsl_fpul_compact) },
5540 { SH64_COMPACT_INSN_STS_MACH_COMPACT, SEM_FN_NAME (sh64_compact,sts_mach_compact) },
5541 { SH64_COMPACT_INSN_STSL_MACH_COMPACT, SEM_FN_NAME (sh64_compact,stsl_mach_compact) },
5542 { SH64_COMPACT_INSN_STS_MACL_COMPACT, SEM_FN_NAME (sh64_compact,sts_macl_compact) },
5543 { SH64_COMPACT_INSN_STSL_MACL_COMPACT, SEM_FN_NAME (sh64_compact,stsl_macl_compact) },
5544 { SH64_COMPACT_INSN_STS_PR_COMPACT, SEM_FN_NAME (sh64_compact,sts_pr_compact) },
5545 { SH64_COMPACT_INSN_STSL_PR_COMPACT, SEM_FN_NAME (sh64_compact,stsl_pr_compact) },
5546 { SH64_COMPACT_INSN_SUB_COMPACT, SEM_FN_NAME (sh64_compact,sub_compact) },
5547 { SH64_COMPACT_INSN_SUBC_COMPACT, SEM_FN_NAME (sh64_compact,subc_compact) },
5548 { SH64_COMPACT_INSN_SUBV_COMPACT, SEM_FN_NAME (sh64_compact,subv_compact) },
5549 { SH64_COMPACT_INSN_SWAPB_COMPACT, SEM_FN_NAME (sh64_compact,swapb_compact) },
5550 { SH64_COMPACT_INSN_SWAPW_COMPACT, SEM_FN_NAME (sh64_compact,swapw_compact) },
5551 { SH64_COMPACT_INSN_TASB_COMPACT, SEM_FN_NAME (sh64_compact,tasb_compact) },
5552 { SH64_COMPACT_INSN_TRAPA_COMPACT, SEM_FN_NAME (sh64_compact,trapa_compact) },
5553 { SH64_COMPACT_INSN_TST_COMPACT, SEM_FN_NAME (sh64_compact,tst_compact) },
5554 { SH64_COMPACT_INSN_TSTI_COMPACT, SEM_FN_NAME (sh64_compact,tsti_compact) },
5555 { SH64_COMPACT_INSN_TSTB_COMPACT, SEM_FN_NAME (sh64_compact,tstb_compact) },
5556 { SH64_COMPACT_INSN_XOR_COMPACT, SEM_FN_NAME (sh64_compact,xor_compact) },
5557 { SH64_COMPACT_INSN_XORI_COMPACT, SEM_FN_NAME (sh64_compact,xori_compact) },
5558 { SH64_COMPACT_INSN_XORB_COMPACT, SEM_FN_NAME (sh64_compact,xorb_compact) },
5559 { SH64_COMPACT_INSN_XTRCT_COMPACT, SEM_FN_NAME (sh64_compact,xtrct_compact) },
5560 { 0, 0 }
5561 };
5562
5563 /* Add the semantic fns to IDESC_TABLE. */
5564
5565 void
5566 SEM_FN_NAME (sh64_compact,init_idesc_table) (SIM_CPU *current_cpu)
5567 {
5568 IDESC *idesc_table = CPU_IDESC (current_cpu);
5569 const struct sem_fn_desc *sf;
5570 int mach_num = MACH_NUM (CPU_MACH (current_cpu));
5571
5572 for (sf = &sem_fns[0]; sf->fn != 0; ++sf)
5573 {
5574 const CGEN_INSN *insn = idesc_table[sf->index].idata;
5575 int valid_p = (CGEN_INSN_VIRTUAL_P (insn)
5576 || CGEN_INSN_MACH_HAS_P (insn, mach_num));
5577 #if FAST_P
5578 if (valid_p)
5579 idesc_table[sf->index].sem_fast = sf->fn;
5580 else
5581 idesc_table[sf->index].sem_fast = SEM_FN_NAME (sh64_compact,x_invalid);
5582 #else
5583 if (valid_p)
5584 idesc_table[sf->index].sem_full = sf->fn;
5585 else
5586 idesc_table[sf->index].sem_full = SEM_FN_NAME (sh64_compact,x_invalid);
5587 #endif
5588 }
5589 }
5590