cgen:
[deliverable/binutils-gdb.git] / sim / sh64 / sem-media.c
1 /* Simulator instruction semantics for sh64.
2
3 THIS FILE IS MACHINE GENERATED WITH CGEN.
4
5 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
6
7 This file is part of the GNU simulators.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2, or (at your option)
12 any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
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 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 #if defined (__STDC__) || defined (ALMOST_STDC) || defined (HAVE_STRINGIZE)
34 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_##attr)
35 #else
36 #define GET_ATTR(cpu, num, attr) CGEN_ATTR_VALUE (NULL, abuf->idesc->attrs, CGEN_INSN_/**/attr)
37 #endif
38
39 /* This is used so that we can compile two copies of the semantic code,
40 one with full feature support and one without that runs fast(er).
41 FAST_P, when desired, is defined on the command line, -DFAST_P=1. */
42 #if FAST_P
43 #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_semf_,fn)
44 #undef TRACE_RESULT
45 #define TRACE_RESULT(cpu, abuf, name, type, val)
46 #else
47 #define SEM_FN_NAME(cpu,fn) XCONCAT3 (cpu,_sem_,fn)
48 #endif
49
50 /* x-invalid: --invalid-- */
51
52 static SEM_PC
53 SEM_FN_NAME (sh64_media,x_invalid) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
54 {
55 #define FLD(f) abuf->fields.fmt_empty.f
56 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
57 int UNUSED written = 0;
58 IADDR UNUSED pc = abuf->addr;
59 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
60
61 {
62 /* Update the recorded pc in the cpu state struct.
63 Only necessary for WITH_SCACHE case, but to avoid the
64 conditional compilation .... */
65 SET_H_PC (pc);
66 /* Virtual insns have zero size. Overwrite vpc with address of next insn
67 using the default-insn-bitsize spec. When executing insns in parallel
68 we may want to queue the fault and continue execution. */
69 vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
70 vpc = sim_engine_invalid_insn (current_cpu, pc, vpc);
71 }
72
73 return vpc;
74 #undef FLD
75 }
76
77 /* x-after: --after-- */
78
79 static SEM_PC
80 SEM_FN_NAME (sh64_media,x_after) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
81 {
82 #define FLD(f) abuf->fields.fmt_empty.f
83 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
84 int UNUSED written = 0;
85 IADDR UNUSED pc = abuf->addr;
86 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
87
88 {
89 #if WITH_SCACHE_PBB_SH64_MEDIA
90 sh64_media_pbb_after (current_cpu, sem_arg);
91 #endif
92 }
93
94 return vpc;
95 #undef FLD
96 }
97
98 /* x-before: --before-- */
99
100 static SEM_PC
101 SEM_FN_NAME (sh64_media,x_before) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
102 {
103 #define FLD(f) abuf->fields.fmt_empty.f
104 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
105 int UNUSED written = 0;
106 IADDR UNUSED pc = abuf->addr;
107 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
108
109 {
110 #if WITH_SCACHE_PBB_SH64_MEDIA
111 sh64_media_pbb_before (current_cpu, sem_arg);
112 #endif
113 }
114
115 return vpc;
116 #undef FLD
117 }
118
119 /* x-cti-chain: --cti-chain-- */
120
121 static SEM_PC
122 SEM_FN_NAME (sh64_media,x_cti_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
123 {
124 #define FLD(f) abuf->fields.fmt_empty.f
125 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
126 int UNUSED written = 0;
127 IADDR UNUSED pc = abuf->addr;
128 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
129
130 {
131 #if WITH_SCACHE_PBB_SH64_MEDIA
132 #ifdef DEFINE_SWITCH
133 vpc = sh64_media_pbb_cti_chain (current_cpu, sem_arg,
134 pbb_br_type, pbb_br_npc);
135 BREAK (sem);
136 #else
137 /* FIXME: Allow provision of explicit ifmt spec in insn spec. */
138 vpc = sh64_media_pbb_cti_chain (current_cpu, sem_arg,
139 CPU_PBB_BR_TYPE (current_cpu),
140 CPU_PBB_BR_NPC (current_cpu));
141 #endif
142 #endif
143 }
144
145 return vpc;
146 #undef FLD
147 }
148
149 /* x-chain: --chain-- */
150
151 static SEM_PC
152 SEM_FN_NAME (sh64_media,x_chain) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
153 {
154 #define FLD(f) abuf->fields.fmt_empty.f
155 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
156 int UNUSED written = 0;
157 IADDR UNUSED pc = abuf->addr;
158 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
159
160 {
161 #if WITH_SCACHE_PBB_SH64_MEDIA
162 vpc = sh64_media_pbb_chain (current_cpu, sem_arg);
163 #ifdef DEFINE_SWITCH
164 BREAK (sem);
165 #endif
166 #endif
167 }
168
169 return vpc;
170 #undef FLD
171 }
172
173 /* x-begin: --begin-- */
174
175 static SEM_PC
176 SEM_FN_NAME (sh64_media,x_begin) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
177 {
178 #define FLD(f) abuf->fields.fmt_empty.f
179 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
180 int UNUSED written = 0;
181 IADDR UNUSED pc = abuf->addr;
182 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 0);
183
184 {
185 #if WITH_SCACHE_PBB_SH64_MEDIA
186 #if defined DEFINE_SWITCH || defined FAST_P
187 /* In the switch case FAST_P is a constant, allowing several optimizations
188 in any called inline functions. */
189 vpc = sh64_media_pbb_begin (current_cpu, FAST_P);
190 #else
191 #if 0 /* cgen engine can't handle dynamic fast/full switching yet. */
192 vpc = sh64_media_pbb_begin (current_cpu, STATE_RUN_FAST_P (CPU_STATE (current_cpu)));
193 #else
194 vpc = sh64_media_pbb_begin (current_cpu, 0);
195 #endif
196 #endif
197 #endif
198 }
199
200 return vpc;
201 #undef FLD
202 }
203
204 /* add: add $rm, $rn, $rd */
205
206 static SEM_PC
207 SEM_FN_NAME (sh64_media,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
208 {
209 #define FLD(f) abuf->fields.sfmt_add.f
210 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
211 int UNUSED written = 0;
212 IADDR UNUSED pc = abuf->addr;
213 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
214
215 {
216 DI opval = ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)));
217 SET_H_GR (FLD (f_dest), opval);
218 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
219 }
220
221 return vpc;
222 #undef FLD
223 }
224
225 /* addl: add.l $rm, $rn, $rd */
226
227 static SEM_PC
228 SEM_FN_NAME (sh64_media,addl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
229 {
230 #define FLD(f) abuf->fields.sfmt_add.f
231 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
232 int UNUSED written = 0;
233 IADDR UNUSED pc = abuf->addr;
234 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
235
236 {
237 DI opval = ADDSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SUBWORDDISI (GET_H_GR (FLD (f_right)), 1));
238 SET_H_GR (FLD (f_dest), opval);
239 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
240 }
241
242 return vpc;
243 #undef FLD
244 }
245
246 /* addi: addi $rm, $disp10, $rd */
247
248 static SEM_PC
249 SEM_FN_NAME (sh64_media,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
250 {
251 #define FLD(f) abuf->fields.sfmt_addi.f
252 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
253 int UNUSED written = 0;
254 IADDR UNUSED pc = abuf->addr;
255 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
256
257 {
258 DI opval = ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10)));
259 SET_H_GR (FLD (f_dest), opval);
260 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
261 }
262
263 return vpc;
264 #undef FLD
265 }
266
267 /* addil: addi.l $rm, $disp10, $rd */
268
269 static SEM_PC
270 SEM_FN_NAME (sh64_media,addil) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
271 {
272 #define FLD(f) abuf->fields.sfmt_addi.f
273 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
274 int UNUSED written = 0;
275 IADDR UNUSED pc = abuf->addr;
276 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
277
278 {
279 DI opval = EXTSIDI (ADDSI (EXTSISI (FLD (f_disp10)), SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)));
280 SET_H_GR (FLD (f_dest), opval);
281 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
282 }
283
284 return vpc;
285 #undef FLD
286 }
287
288 /* addzl: addz.l $rm, $rn, $rd */
289
290 static SEM_PC
291 SEM_FN_NAME (sh64_media,addzl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
292 {
293 #define FLD(f) abuf->fields.sfmt_add.f
294 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
295 int UNUSED written = 0;
296 IADDR UNUSED pc = abuf->addr;
297 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
298
299 {
300 DI opval = ZEXTSIDI (ADDSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SUBWORDDISI (GET_H_GR (FLD (f_right)), 1)));
301 SET_H_GR (FLD (f_dest), opval);
302 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
303 }
304
305 return vpc;
306 #undef FLD
307 }
308
309 /* alloco: alloco $rm, $disp6x32 */
310
311 static SEM_PC
312 SEM_FN_NAME (sh64_media,alloco) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
313 {
314 #define FLD(f) abuf->fields.fmt_empty.f
315 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
316 int UNUSED written = 0;
317 IADDR UNUSED pc = abuf->addr;
318 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
319
320 ((void) 0); /*nop*/
321
322 return vpc;
323 #undef FLD
324 }
325
326 /* and: and $rm, $rn, $rd */
327
328 static SEM_PC
329 SEM_FN_NAME (sh64_media,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
330 {
331 #define FLD(f) abuf->fields.sfmt_add.f
332 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
333 int UNUSED written = 0;
334 IADDR UNUSED pc = abuf->addr;
335 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
336
337 {
338 DI opval = ANDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)));
339 SET_H_GR (FLD (f_dest), opval);
340 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
341 }
342
343 return vpc;
344 #undef FLD
345 }
346
347 /* andc: andc $rm, $rn, $rd */
348
349 static SEM_PC
350 SEM_FN_NAME (sh64_media,andc) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
351 {
352 #define FLD(f) abuf->fields.sfmt_add.f
353 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
354 int UNUSED written = 0;
355 IADDR UNUSED pc = abuf->addr;
356 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
357
358 {
359 DI opval = ANDDI (GET_H_GR (FLD (f_left)), INVDI (GET_H_GR (FLD (f_right))));
360 SET_H_GR (FLD (f_dest), opval);
361 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
362 }
363
364 return vpc;
365 #undef FLD
366 }
367
368 /* andi: andi $rm, $disp10, $rd */
369
370 static SEM_PC
371 SEM_FN_NAME (sh64_media,andi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
372 {
373 #define FLD(f) abuf->fields.sfmt_addi.f
374 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
375 int UNUSED written = 0;
376 IADDR UNUSED pc = abuf->addr;
377 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
378
379 {
380 DI opval = ANDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10)));
381 SET_H_GR (FLD (f_dest), opval);
382 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
383 }
384
385 return vpc;
386 #undef FLD
387 }
388
389 /* beq: beq$likely $rm, $rn, $tra */
390
391 static SEM_PC
392 SEM_FN_NAME (sh64_media,beq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
393 {
394 #define FLD(f) abuf->fields.sfmt_beq.f
395 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
396 int UNUSED written = 0;
397 IADDR UNUSED pc = abuf->addr;
398 SEM_BRANCH_INIT
399 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
400
401 if (EQDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) {
402 {
403 UDI opval = CPU (h_tr[FLD (f_tra)]);
404 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
405 written |= (1 << 3);
406 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
407 }
408 }
409
410 abuf->written = written;
411 SEM_BRANCH_FINI (vpc);
412 return vpc;
413 #undef FLD
414 }
415
416 /* beqi: beqi$likely $rm, $imm6, $tra */
417
418 static SEM_PC
419 SEM_FN_NAME (sh64_media,beqi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
420 {
421 #define FLD(f) abuf->fields.sfmt_beqi.f
422 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
423 int UNUSED written = 0;
424 IADDR UNUSED pc = abuf->addr;
425 SEM_BRANCH_INIT
426 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
427
428 if (EQDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_imm6)))) {
429 {
430 UDI opval = CPU (h_tr[FLD (f_tra)]);
431 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
432 written |= (1 << 3);
433 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
434 }
435 }
436
437 abuf->written = written;
438 SEM_BRANCH_FINI (vpc);
439 return vpc;
440 #undef FLD
441 }
442
443 /* bge: bge$likely $rm, $rn, $tra */
444
445 static SEM_PC
446 SEM_FN_NAME (sh64_media,bge) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
447 {
448 #define FLD(f) abuf->fields.sfmt_beq.f
449 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
450 int UNUSED written = 0;
451 IADDR UNUSED pc = abuf->addr;
452 SEM_BRANCH_INIT
453 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
454
455 if (GEDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) {
456 {
457 UDI opval = CPU (h_tr[FLD (f_tra)]);
458 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
459 written |= (1 << 3);
460 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
461 }
462 }
463
464 abuf->written = written;
465 SEM_BRANCH_FINI (vpc);
466 return vpc;
467 #undef FLD
468 }
469
470 /* bgeu: bgeu$likely $rm, $rn, $tra */
471
472 static SEM_PC
473 SEM_FN_NAME (sh64_media,bgeu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
474 {
475 #define FLD(f) abuf->fields.sfmt_beq.f
476 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
477 int UNUSED written = 0;
478 IADDR UNUSED pc = abuf->addr;
479 SEM_BRANCH_INIT
480 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
481
482 if (GEUDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) {
483 {
484 UDI opval = CPU (h_tr[FLD (f_tra)]);
485 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
486 written |= (1 << 3);
487 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
488 }
489 }
490
491 abuf->written = written;
492 SEM_BRANCH_FINI (vpc);
493 return vpc;
494 #undef FLD
495 }
496
497 /* bgt: bgt$likely $rm, $rn, $tra */
498
499 static SEM_PC
500 SEM_FN_NAME (sh64_media,bgt) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
501 {
502 #define FLD(f) abuf->fields.sfmt_beq.f
503 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
504 int UNUSED written = 0;
505 IADDR UNUSED pc = abuf->addr;
506 SEM_BRANCH_INIT
507 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
508
509 if (GTDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) {
510 {
511 UDI opval = CPU (h_tr[FLD (f_tra)]);
512 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
513 written |= (1 << 3);
514 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
515 }
516 }
517
518 abuf->written = written;
519 SEM_BRANCH_FINI (vpc);
520 return vpc;
521 #undef FLD
522 }
523
524 /* bgtu: bgtu$likely $rm, $rn, $tra */
525
526 static SEM_PC
527 SEM_FN_NAME (sh64_media,bgtu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
528 {
529 #define FLD(f) abuf->fields.sfmt_beq.f
530 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
531 int UNUSED written = 0;
532 IADDR UNUSED pc = abuf->addr;
533 SEM_BRANCH_INIT
534 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
535
536 if (GTUDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) {
537 {
538 UDI opval = CPU (h_tr[FLD (f_tra)]);
539 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
540 written |= (1 << 3);
541 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
542 }
543 }
544
545 abuf->written = written;
546 SEM_BRANCH_FINI (vpc);
547 return vpc;
548 #undef FLD
549 }
550
551 /* blink: blink $trb, $rd */
552
553 static SEM_PC
554 SEM_FN_NAME (sh64_media,blink) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
555 {
556 #define FLD(f) abuf->fields.sfmt_blink.f
557 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
558 int UNUSED written = 0;
559 IADDR UNUSED pc = abuf->addr;
560 SEM_BRANCH_INIT
561 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
562
563 {
564 {
565 DI opval = ORDI (ADDDI (pc, 4), 1);
566 SET_H_GR (FLD (f_dest), opval);
567 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
568 }
569 {
570 UDI opval = CPU (h_tr[FLD (f_trb)]);
571 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
572 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
573 }
574 }
575
576 SEM_BRANCH_FINI (vpc);
577 return vpc;
578 #undef FLD
579 }
580
581 /* bne: bne$likely $rm, $rn, $tra */
582
583 static SEM_PC
584 SEM_FN_NAME (sh64_media,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
585 {
586 #define FLD(f) abuf->fields.sfmt_beq.f
587 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
588 int UNUSED written = 0;
589 IADDR UNUSED pc = abuf->addr;
590 SEM_BRANCH_INIT
591 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
592
593 if (NEDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) {
594 {
595 UDI opval = CPU (h_tr[FLD (f_tra)]);
596 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
597 written |= (1 << 3);
598 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
599 }
600 }
601
602 abuf->written = written;
603 SEM_BRANCH_FINI (vpc);
604 return vpc;
605 #undef FLD
606 }
607
608 /* bnei: bnei$likely $rm, $imm6, $tra */
609
610 static SEM_PC
611 SEM_FN_NAME (sh64_media,bnei) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
612 {
613 #define FLD(f) abuf->fields.sfmt_beqi.f
614 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
615 int UNUSED written = 0;
616 IADDR UNUSED pc = abuf->addr;
617 SEM_BRANCH_INIT
618 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
619
620 if (NEDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_imm6)))) {
621 {
622 UDI opval = CPU (h_tr[FLD (f_tra)]);
623 SEM_BRANCH_VIA_ADDR (current_cpu, sem_arg, opval, vpc);
624 written |= (1 << 3);
625 TRACE_RESULT (current_cpu, abuf, "pc", 'D', opval);
626 }
627 }
628
629 abuf->written = written;
630 SEM_BRANCH_FINI (vpc);
631 return vpc;
632 #undef FLD
633 }
634
635 /* brk: brk */
636
637 static SEM_PC
638 SEM_FN_NAME (sh64_media,brk) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
639 {
640 #define FLD(f) abuf->fields.fmt_empty.f
641 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
642 int UNUSED written = 0;
643 IADDR UNUSED pc = abuf->addr;
644 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
645
646 sh64_break (current_cpu, pc);
647
648 return vpc;
649 #undef FLD
650 }
651
652 /* byterev: byterev $rm, $rd */
653
654 static SEM_PC
655 SEM_FN_NAME (sh64_media,byterev) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
656 {
657 #define FLD(f) abuf->fields.sfmt_xori.f
658 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
659 int UNUSED written = 0;
660 IADDR UNUSED pc = abuf->addr;
661 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
662
663 {
664 DI tmp_source;
665 DI tmp_result;
666 tmp_source = GET_H_GR (FLD (f_left));
667 tmp_result = 0;
668 {
669 tmp_result = ORDI (SLLDI (tmp_result, 8), ANDDI (tmp_source, 255));
670 tmp_source = SRLDI (tmp_source, 8);
671 }
672 {
673 tmp_result = ORDI (SLLDI (tmp_result, 8), ANDDI (tmp_source, 255));
674 tmp_source = SRLDI (tmp_source, 8);
675 }
676 {
677 tmp_result = ORDI (SLLDI (tmp_result, 8), ANDDI (tmp_source, 255));
678 tmp_source = SRLDI (tmp_source, 8);
679 }
680 {
681 tmp_result = ORDI (SLLDI (tmp_result, 8), ANDDI (tmp_source, 255));
682 tmp_source = SRLDI (tmp_source, 8);
683 }
684 {
685 tmp_result = ORDI (SLLDI (tmp_result, 8), ANDDI (tmp_source, 255));
686 tmp_source = SRLDI (tmp_source, 8);
687 }
688 {
689 tmp_result = ORDI (SLLDI (tmp_result, 8), ANDDI (tmp_source, 255));
690 tmp_source = SRLDI (tmp_source, 8);
691 }
692 {
693 tmp_result = ORDI (SLLDI (tmp_result, 8), ANDDI (tmp_source, 255));
694 tmp_source = SRLDI (tmp_source, 8);
695 }
696 {
697 tmp_result = ORDI (SLLDI (tmp_result, 8), ANDDI (tmp_source, 255));
698 tmp_source = SRLDI (tmp_source, 8);
699 }
700 {
701 DI opval = tmp_result;
702 SET_H_GR (FLD (f_dest), opval);
703 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
704 }
705 }
706
707 return vpc;
708 #undef FLD
709 }
710
711 /* cmpeq: cmpeq $rm, $rn, $rd */
712
713 static SEM_PC
714 SEM_FN_NAME (sh64_media,cmpeq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
715 {
716 #define FLD(f) abuf->fields.sfmt_add.f
717 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
718 int UNUSED written = 0;
719 IADDR UNUSED pc = abuf->addr;
720 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
721
722 {
723 DI opval = ((EQDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) ? (1) : (0));
724 SET_H_GR (FLD (f_dest), opval);
725 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
726 }
727
728 return vpc;
729 #undef FLD
730 }
731
732 /* cmpgt: cmpgt $rm, $rn, $rd */
733
734 static SEM_PC
735 SEM_FN_NAME (sh64_media,cmpgt) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
736 {
737 #define FLD(f) abuf->fields.sfmt_add.f
738 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
739 int UNUSED written = 0;
740 IADDR UNUSED pc = abuf->addr;
741 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
742
743 {
744 DI opval = ((GTDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) ? (1) : (0));
745 SET_H_GR (FLD (f_dest), opval);
746 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
747 }
748
749 return vpc;
750 #undef FLD
751 }
752
753 /* cmpgtu: cmpgtu $rm,$rn, $rd */
754
755 static SEM_PC
756 SEM_FN_NAME (sh64_media,cmpgtu) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
757 {
758 #define FLD(f) abuf->fields.sfmt_add.f
759 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
760 int UNUSED written = 0;
761 IADDR UNUSED pc = abuf->addr;
762 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
763
764 {
765 DI opval = ((GTUDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))) ? (1) : (0));
766 SET_H_GR (FLD (f_dest), opval);
767 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
768 }
769
770 return vpc;
771 #undef FLD
772 }
773
774 /* cmveq: cmveq $rm, $rn, $rd */
775
776 static SEM_PC
777 SEM_FN_NAME (sh64_media,cmveq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
778 {
779 #define FLD(f) abuf->fields.sfmt_add.f
780 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
781 int UNUSED written = 0;
782 IADDR UNUSED pc = abuf->addr;
783 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
784
785 if (EQDI (GET_H_GR (FLD (f_left)), 0)) {
786 {
787 DI opval = GET_H_GR (FLD (f_right));
788 SET_H_GR (FLD (f_dest), opval);
789 written |= (1 << 2);
790 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
791 }
792 }
793
794 abuf->written = written;
795 return vpc;
796 #undef FLD
797 }
798
799 /* cmvne: cmvne $rm, $rn, $rd */
800
801 static SEM_PC
802 SEM_FN_NAME (sh64_media,cmvne) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
803 {
804 #define FLD(f) abuf->fields.sfmt_add.f
805 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
806 int UNUSED written = 0;
807 IADDR UNUSED pc = abuf->addr;
808 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
809
810 if (NEDI (GET_H_GR (FLD (f_left)), 0)) {
811 {
812 DI opval = GET_H_GR (FLD (f_right));
813 SET_H_GR (FLD (f_dest), opval);
814 written |= (1 << 2);
815 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
816 }
817 }
818
819 abuf->written = written;
820 return vpc;
821 #undef FLD
822 }
823
824 /* fabsd: fabs.d $drgh, $drf */
825
826 static SEM_PC
827 SEM_FN_NAME (sh64_media,fabsd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
828 {
829 #define FLD(f) abuf->fields.sfmt_fabsd.f
830 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
831 int UNUSED written = 0;
832 IADDR UNUSED pc = abuf->addr;
833 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
834
835 {
836 DF opval = sh64_fabsd (current_cpu, GET_H_DR (FLD (f_left_right)));
837 SET_H_DR (FLD (f_dest), opval);
838 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
839 }
840
841 return vpc;
842 #undef FLD
843 }
844
845 /* fabss: fabs.s $frgh, $frf */
846
847 static SEM_PC
848 SEM_FN_NAME (sh64_media,fabss) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
849 {
850 #define FLD(f) abuf->fields.sfmt_fabsd.f
851 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
852 int UNUSED written = 0;
853 IADDR UNUSED pc = abuf->addr;
854 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
855
856 {
857 SF opval = sh64_fabss (current_cpu, CPU (h_fr[FLD (f_left_right)]));
858 CPU (h_fr[FLD (f_dest)]) = opval;
859 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
860 }
861
862 return vpc;
863 #undef FLD
864 }
865
866 /* faddd: fadd.d $drg, $drh, $drf */
867
868 static SEM_PC
869 SEM_FN_NAME (sh64_media,faddd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
870 {
871 #define FLD(f) abuf->fields.sfmt_add.f
872 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
873 int UNUSED written = 0;
874 IADDR UNUSED pc = abuf->addr;
875 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
876
877 {
878 DF opval = sh64_faddd (current_cpu, GET_H_DR (FLD (f_left)), GET_H_DR (FLD (f_right)));
879 SET_H_DR (FLD (f_dest), opval);
880 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
881 }
882
883 return vpc;
884 #undef FLD
885 }
886
887 /* fadds: fadd.s $frg, $frh, $frf */
888
889 static SEM_PC
890 SEM_FN_NAME (sh64_media,fadds) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
891 {
892 #define FLD(f) abuf->fields.sfmt_add.f
893 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
894 int UNUSED written = 0;
895 IADDR UNUSED pc = abuf->addr;
896 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
897
898 {
899 SF opval = sh64_fadds (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)]));
900 CPU (h_fr[FLD (f_dest)]) = opval;
901 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
902 }
903
904 return vpc;
905 #undef FLD
906 }
907
908 /* fcmpeqd: fcmpeq.d $drg, $drh, $rd */
909
910 static SEM_PC
911 SEM_FN_NAME (sh64_media,fcmpeqd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
912 {
913 #define FLD(f) abuf->fields.sfmt_add.f
914 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
915 int UNUSED written = 0;
916 IADDR UNUSED pc = abuf->addr;
917 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
918
919 {
920 DI opval = ZEXTBIDI (sh64_fcmpeqd (current_cpu, GET_H_DR (FLD (f_left)), GET_H_DR (FLD (f_right))));
921 SET_H_GR (FLD (f_dest), opval);
922 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
923 }
924
925 return vpc;
926 #undef FLD
927 }
928
929 /* fcmpeqs: fcmpeq.s $frg, $frh, $rd */
930
931 static SEM_PC
932 SEM_FN_NAME (sh64_media,fcmpeqs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
933 {
934 #define FLD(f) abuf->fields.sfmt_add.f
935 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
936 int UNUSED written = 0;
937 IADDR UNUSED pc = abuf->addr;
938 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
939
940 {
941 DI opval = ZEXTBIDI (sh64_fcmpeqs (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)])));
942 SET_H_GR (FLD (f_dest), opval);
943 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
944 }
945
946 return vpc;
947 #undef FLD
948 }
949
950 /* fcmpged: fcmpge.d $drg, $drh, $rd */
951
952 static SEM_PC
953 SEM_FN_NAME (sh64_media,fcmpged) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
954 {
955 #define FLD(f) abuf->fields.sfmt_add.f
956 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
957 int UNUSED written = 0;
958 IADDR UNUSED pc = abuf->addr;
959 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
960
961 {
962 DI opval = ZEXTBIDI (sh64_fcmpged (current_cpu, GET_H_DR (FLD (f_left)), GET_H_DR (FLD (f_right))));
963 SET_H_GR (FLD (f_dest), opval);
964 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
965 }
966
967 return vpc;
968 #undef FLD
969 }
970
971 /* fcmpges: fcmpge.s $frg, $frh, $rd */
972
973 static SEM_PC
974 SEM_FN_NAME (sh64_media,fcmpges) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
975 {
976 #define FLD(f) abuf->fields.sfmt_add.f
977 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
978 int UNUSED written = 0;
979 IADDR UNUSED pc = abuf->addr;
980 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
981
982 {
983 DI opval = ZEXTBIDI (sh64_fcmpges (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)])));
984 SET_H_GR (FLD (f_dest), opval);
985 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
986 }
987
988 return vpc;
989 #undef FLD
990 }
991
992 /* fcmpgtd: fcmpgt.d $drg, $drh, $rd */
993
994 static SEM_PC
995 SEM_FN_NAME (sh64_media,fcmpgtd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
996 {
997 #define FLD(f) abuf->fields.sfmt_add.f
998 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
999 int UNUSED written = 0;
1000 IADDR UNUSED pc = abuf->addr;
1001 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1002
1003 {
1004 DI opval = ZEXTBIDI (sh64_fcmpgtd (current_cpu, GET_H_DR (FLD (f_left)), GET_H_DR (FLD (f_right))));
1005 SET_H_GR (FLD (f_dest), opval);
1006 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
1007 }
1008
1009 return vpc;
1010 #undef FLD
1011 }
1012
1013 /* fcmpgts: fcmpgt.s $frg, $frh, $rd */
1014
1015 static SEM_PC
1016 SEM_FN_NAME (sh64_media,fcmpgts) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1017 {
1018 #define FLD(f) abuf->fields.sfmt_add.f
1019 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1020 int UNUSED written = 0;
1021 IADDR UNUSED pc = abuf->addr;
1022 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1023
1024 {
1025 DI opval = ZEXTBIDI (sh64_fcmpgts (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)])));
1026 SET_H_GR (FLD (f_dest), opval);
1027 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
1028 }
1029
1030 return vpc;
1031 #undef FLD
1032 }
1033
1034 /* fcmpund: fcmpun.d $drg, $drh, $rd */
1035
1036 static SEM_PC
1037 SEM_FN_NAME (sh64_media,fcmpund) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1038 {
1039 #define FLD(f) abuf->fields.sfmt_add.f
1040 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1041 int UNUSED written = 0;
1042 IADDR UNUSED pc = abuf->addr;
1043 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1044
1045 {
1046 DI opval = ZEXTBIDI (sh64_fcmpund (current_cpu, GET_H_DR (FLD (f_left)), GET_H_DR (FLD (f_right))));
1047 SET_H_GR (FLD (f_dest), opval);
1048 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
1049 }
1050
1051 return vpc;
1052 #undef FLD
1053 }
1054
1055 /* fcmpuns: fcmpun.s $frg, $frh, $rd */
1056
1057 static SEM_PC
1058 SEM_FN_NAME (sh64_media,fcmpuns) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1059 {
1060 #define FLD(f) abuf->fields.sfmt_add.f
1061 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1062 int UNUSED written = 0;
1063 IADDR UNUSED pc = abuf->addr;
1064 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1065
1066 {
1067 DI opval = ZEXTBIDI (sh64_fcmpuns (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)])));
1068 SET_H_GR (FLD (f_dest), opval);
1069 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
1070 }
1071
1072 return vpc;
1073 #undef FLD
1074 }
1075
1076 /* fcnvds: fcnv.ds $drgh, $frf */
1077
1078 static SEM_PC
1079 SEM_FN_NAME (sh64_media,fcnvds) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1080 {
1081 #define FLD(f) abuf->fields.sfmt_fabsd.f
1082 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1083 int UNUSED written = 0;
1084 IADDR UNUSED pc = abuf->addr;
1085 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1086
1087 {
1088 SF opval = sh64_fcnvds (current_cpu, GET_H_DR (FLD (f_left_right)));
1089 CPU (h_fr[FLD (f_dest)]) = opval;
1090 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1091 }
1092
1093 return vpc;
1094 #undef FLD
1095 }
1096
1097 /* fcnvsd: fcnv.sd $frgh, $drf */
1098
1099 static SEM_PC
1100 SEM_FN_NAME (sh64_media,fcnvsd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1101 {
1102 #define FLD(f) abuf->fields.sfmt_fabsd.f
1103 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1104 int UNUSED written = 0;
1105 IADDR UNUSED pc = abuf->addr;
1106 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1107
1108 {
1109 DF opval = sh64_fcnvsd (current_cpu, CPU (h_fr[FLD (f_left_right)]));
1110 SET_H_DR (FLD (f_dest), opval);
1111 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1112 }
1113
1114 return vpc;
1115 #undef FLD
1116 }
1117
1118 /* fdivd: fdiv.d $drg, $drh, $drf */
1119
1120 static SEM_PC
1121 SEM_FN_NAME (sh64_media,fdivd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1122 {
1123 #define FLD(f) abuf->fields.sfmt_add.f
1124 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1125 int UNUSED written = 0;
1126 IADDR UNUSED pc = abuf->addr;
1127 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1128
1129 {
1130 DF opval = sh64_fdivd (current_cpu, GET_H_DR (FLD (f_left)), GET_H_DR (FLD (f_right)));
1131 SET_H_DR (FLD (f_dest), opval);
1132 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1133 }
1134
1135 return vpc;
1136 #undef FLD
1137 }
1138
1139 /* fdivs: fdiv.s $frg, $frh, $frf */
1140
1141 static SEM_PC
1142 SEM_FN_NAME (sh64_media,fdivs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1143 {
1144 #define FLD(f) abuf->fields.sfmt_add.f
1145 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1146 int UNUSED written = 0;
1147 IADDR UNUSED pc = abuf->addr;
1148 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1149
1150 {
1151 SF opval = sh64_fdivs (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)]));
1152 CPU (h_fr[FLD (f_dest)]) = opval;
1153 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1154 }
1155
1156 return vpc;
1157 #undef FLD
1158 }
1159
1160 /* fgetscr: fgetscr $frf */
1161
1162 static SEM_PC
1163 SEM_FN_NAME (sh64_media,fgetscr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1164 {
1165 #define FLD(f) abuf->fields.fmt_empty.f
1166 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1167 int UNUSED written = 0;
1168 IADDR UNUSED pc = abuf->addr;
1169 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1170
1171 ((void) 0); /*nop*/
1172
1173 return vpc;
1174 #undef FLD
1175 }
1176
1177 /* fiprs: fipr.s $fvg, $fvh, $frf */
1178
1179 static SEM_PC
1180 SEM_FN_NAME (sh64_media,fiprs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1181 {
1182 #define FLD(f) abuf->fields.sfmt_add.f
1183 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1184 int UNUSED written = 0;
1185 IADDR UNUSED pc = abuf->addr;
1186 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1187
1188 {
1189 UQI tmp_g;
1190 UQI tmp_h;
1191 SF tmp_temp;
1192 tmp_g = FLD (f_left);
1193 tmp_h = FLD (f_right);
1194 tmp_temp = sh64_fmuls (current_cpu, CPU (h_fr[tmp_g]), CPU (h_fr[tmp_h]));
1195 tmp_temp = sh64_fadds (current_cpu, tmp_temp, sh64_fmuls (current_cpu, CPU (h_fr[ADDQI (tmp_g, 1)]), CPU (h_fr[ADDQI (tmp_h, 1)])));
1196 tmp_temp = sh64_fadds (current_cpu, tmp_temp, sh64_fmuls (current_cpu, CPU (h_fr[ADDQI (tmp_g, 2)]), CPU (h_fr[ADDQI (tmp_h, 2)])));
1197 tmp_temp = sh64_fadds (current_cpu, tmp_temp, sh64_fmuls (current_cpu, CPU (h_fr[ADDQI (tmp_g, 3)]), CPU (h_fr[ADDQI (tmp_h, 3)])));
1198 {
1199 SF opval = tmp_temp;
1200 CPU (h_fr[FLD (f_dest)]) = opval;
1201 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1202 }
1203 }
1204
1205 return vpc;
1206 #undef FLD
1207 }
1208
1209 /* fldd: fld.d $rm, $disp10x8, $drf */
1210
1211 static SEM_PC
1212 SEM_FN_NAME (sh64_media,fldd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1213 {
1214 #define FLD(f) abuf->fields.sfmt_fldd.f
1215 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1216 int UNUSED written = 0;
1217 IADDR UNUSED pc = abuf->addr;
1218 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1219
1220 {
1221 DF opval = GETMEMDF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp10x8)));
1222 SET_H_DR (FLD (f_dest), opval);
1223 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1224 }
1225
1226 return vpc;
1227 #undef FLD
1228 }
1229
1230 /* fldp: fld.p $rm, $disp10x8, $fpf */
1231
1232 static SEM_PC
1233 SEM_FN_NAME (sh64_media,fldp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1234 {
1235 #define FLD(f) abuf->fields.sfmt_fldd.f
1236 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1237 int UNUSED written = 0;
1238 IADDR UNUSED pc = abuf->addr;
1239 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1240
1241 {
1242 QI tmp_f;
1243 tmp_f = FLD (f_dest);
1244 {
1245 SF opval = GETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp10x8)));
1246 CPU (h_fr[tmp_f]) = opval;
1247 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1248 }
1249 {
1250 SF opval = GETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), ADDSI (FLD (f_disp10x8), 4)));
1251 CPU (h_fr[ADDQI (tmp_f, 1)]) = opval;
1252 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1253 }
1254 }
1255
1256 return vpc;
1257 #undef FLD
1258 }
1259
1260 /* flds: fld.s $rm, $disp10x4, $frf */
1261
1262 static SEM_PC
1263 SEM_FN_NAME (sh64_media,flds) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1264 {
1265 #define FLD(f) abuf->fields.sfmt_flds.f
1266 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1267 int UNUSED written = 0;
1268 IADDR UNUSED pc = abuf->addr;
1269 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1270
1271 {
1272 SF opval = GETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp10x4)));
1273 CPU (h_fr[FLD (f_dest)]) = opval;
1274 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1275 }
1276
1277 return vpc;
1278 #undef FLD
1279 }
1280
1281 /* fldxd: fldx.d $rm, $rn, $drf */
1282
1283 static SEM_PC
1284 SEM_FN_NAME (sh64_media,fldxd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1285 {
1286 #define FLD(f) abuf->fields.sfmt_add.f
1287 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1288 int UNUSED written = 0;
1289 IADDR UNUSED pc = abuf->addr;
1290 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1291
1292 {
1293 DF opval = GETMEMDF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))));
1294 SET_H_DR (FLD (f_dest), opval);
1295 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1296 }
1297
1298 return vpc;
1299 #undef FLD
1300 }
1301
1302 /* fldxp: fldx.p $rm, $rn, $fpf */
1303
1304 static SEM_PC
1305 SEM_FN_NAME (sh64_media,fldxp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1306 {
1307 #define FLD(f) abuf->fields.sfmt_add.f
1308 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1309 int UNUSED written = 0;
1310 IADDR UNUSED pc = abuf->addr;
1311 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1312
1313 {
1314 QI tmp_f;
1315 tmp_f = FLD (f_dest);
1316 {
1317 SF opval = GETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))));
1318 CPU (h_fr[tmp_f]) = opval;
1319 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1320 }
1321 {
1322 SF opval = GETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), ADDDI (GET_H_GR (FLD (f_right)), 4)));
1323 CPU (h_fr[ADDQI (tmp_f, 1)]) = opval;
1324 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1325 }
1326 }
1327
1328 return vpc;
1329 #undef FLD
1330 }
1331
1332 /* fldxs: fldx.s $rm, $rn, $frf */
1333
1334 static SEM_PC
1335 SEM_FN_NAME (sh64_media,fldxs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1336 {
1337 #define FLD(f) abuf->fields.sfmt_add.f
1338 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1339 int UNUSED written = 0;
1340 IADDR UNUSED pc = abuf->addr;
1341 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1342
1343 {
1344 SF opval = GETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))));
1345 CPU (h_fr[FLD (f_dest)]) = opval;
1346 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1347 }
1348
1349 return vpc;
1350 #undef FLD
1351 }
1352
1353 /* floatld: float.ld $frgh, $drf */
1354
1355 static SEM_PC
1356 SEM_FN_NAME (sh64_media,floatld) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1357 {
1358 #define FLD(f) abuf->fields.sfmt_fabsd.f
1359 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1360 int UNUSED written = 0;
1361 IADDR UNUSED pc = abuf->addr;
1362 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1363
1364 {
1365 DF opval = sh64_floatld (current_cpu, CPU (h_fr[FLD (f_left_right)]));
1366 SET_H_DR (FLD (f_dest), opval);
1367 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1368 }
1369
1370 return vpc;
1371 #undef FLD
1372 }
1373
1374 /* floatls: float.ls $frgh, $frf */
1375
1376 static SEM_PC
1377 SEM_FN_NAME (sh64_media,floatls) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1378 {
1379 #define FLD(f) abuf->fields.sfmt_fabsd.f
1380 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1381 int UNUSED written = 0;
1382 IADDR UNUSED pc = abuf->addr;
1383 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1384
1385 {
1386 SF opval = sh64_floatls (current_cpu, CPU (h_fr[FLD (f_left_right)]));
1387 CPU (h_fr[FLD (f_dest)]) = opval;
1388 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1389 }
1390
1391 return vpc;
1392 #undef FLD
1393 }
1394
1395 /* floatqd: float.qd $drgh, $drf */
1396
1397 static SEM_PC
1398 SEM_FN_NAME (sh64_media,floatqd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1399 {
1400 #define FLD(f) abuf->fields.sfmt_fabsd.f
1401 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1402 int UNUSED written = 0;
1403 IADDR UNUSED pc = abuf->addr;
1404 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1405
1406 {
1407 DF opval = sh64_floatqd (current_cpu, GET_H_DR (FLD (f_left_right)));
1408 SET_H_DR (FLD (f_dest), opval);
1409 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1410 }
1411
1412 return vpc;
1413 #undef FLD
1414 }
1415
1416 /* floatqs: float.qs $drgh, $frf */
1417
1418 static SEM_PC
1419 SEM_FN_NAME (sh64_media,floatqs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1420 {
1421 #define FLD(f) abuf->fields.sfmt_fabsd.f
1422 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1423 int UNUSED written = 0;
1424 IADDR UNUSED pc = abuf->addr;
1425 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1426
1427 {
1428 SF opval = sh64_floatqs (current_cpu, GET_H_DR (FLD (f_left_right)));
1429 CPU (h_fr[FLD (f_dest)]) = opval;
1430 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1431 }
1432
1433 return vpc;
1434 #undef FLD
1435 }
1436
1437 /* fmacs: fmac.s $frg, $frh, $frf */
1438
1439 static SEM_PC
1440 SEM_FN_NAME (sh64_media,fmacs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1441 {
1442 #define FLD(f) abuf->fields.sfmt_add.f
1443 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1444 int UNUSED written = 0;
1445 IADDR UNUSED pc = abuf->addr;
1446 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1447
1448 {
1449 SF opval = sh64_fadds (current_cpu, CPU (h_fr[FLD (f_dest)]), sh64_fmuls (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)])));
1450 CPU (h_fr[FLD (f_dest)]) = opval;
1451 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1452 }
1453
1454 return vpc;
1455 #undef FLD
1456 }
1457
1458 /* fmovd: fmov.d $drgh, $drf */
1459
1460 static SEM_PC
1461 SEM_FN_NAME (sh64_media,fmovd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1462 {
1463 #define FLD(f) abuf->fields.sfmt_fabsd.f
1464 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1465 int UNUSED written = 0;
1466 IADDR UNUSED pc = abuf->addr;
1467 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1468
1469 {
1470 DF opval = GET_H_DR (FLD (f_left_right));
1471 SET_H_DR (FLD (f_dest), opval);
1472 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1473 }
1474
1475 return vpc;
1476 #undef FLD
1477 }
1478
1479 /* fmovdq: fmov.dq $drgh, $rd */
1480
1481 static SEM_PC
1482 SEM_FN_NAME (sh64_media,fmovdq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1483 {
1484 #define FLD(f) abuf->fields.sfmt_fabsd.f
1485 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1486 int UNUSED written = 0;
1487 IADDR UNUSED pc = abuf->addr;
1488 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1489
1490 {
1491 DI opval = SUBWORDDFDI (GET_H_DR (FLD (f_left_right)));
1492 SET_H_GR (FLD (f_dest), opval);
1493 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
1494 }
1495
1496 return vpc;
1497 #undef FLD
1498 }
1499
1500 /* fmovls: fmov.ls $rm, $frf */
1501
1502 static SEM_PC
1503 SEM_FN_NAME (sh64_media,fmovls) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1504 {
1505 #define FLD(f) abuf->fields.sfmt_xori.f
1506 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1507 int UNUSED written = 0;
1508 IADDR UNUSED pc = abuf->addr;
1509 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1510
1511 {
1512 SF opval = SUBWORDSISF (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1));
1513 CPU (h_fr[FLD (f_dest)]) = opval;
1514 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1515 }
1516
1517 return vpc;
1518 #undef FLD
1519 }
1520
1521 /* fmovqd: fmov.qd $rm, $drf */
1522
1523 static SEM_PC
1524 SEM_FN_NAME (sh64_media,fmovqd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1525 {
1526 #define FLD(f) abuf->fields.sfmt_xori.f
1527 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1528 int UNUSED written = 0;
1529 IADDR UNUSED pc = abuf->addr;
1530 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1531
1532 {
1533 DF opval = SUBWORDDIDF (GET_H_GR (FLD (f_left)));
1534 SET_H_DR (FLD (f_dest), opval);
1535 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1536 }
1537
1538 return vpc;
1539 #undef FLD
1540 }
1541
1542 /* fmovs: fmov.s $frgh, $frf */
1543
1544 static SEM_PC
1545 SEM_FN_NAME (sh64_media,fmovs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1546 {
1547 #define FLD(f) abuf->fields.sfmt_fabsd.f
1548 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1549 int UNUSED written = 0;
1550 IADDR UNUSED pc = abuf->addr;
1551 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1552
1553 {
1554 SF opval = CPU (h_fr[FLD (f_left_right)]);
1555 CPU (h_fr[FLD (f_dest)]) = opval;
1556 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1557 }
1558
1559 return vpc;
1560 #undef FLD
1561 }
1562
1563 /* fmovsl: fmov.sl $frgh, $rd */
1564
1565 static SEM_PC
1566 SEM_FN_NAME (sh64_media,fmovsl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1567 {
1568 #define FLD(f) abuf->fields.sfmt_fabsd.f
1569 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1570 int UNUSED written = 0;
1571 IADDR UNUSED pc = abuf->addr;
1572 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1573
1574 {
1575 DI opval = EXTSIDI (SUBWORDSFSI (CPU (h_fr[FLD (f_left_right)])));
1576 SET_H_GR (FLD (f_dest), opval);
1577 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
1578 }
1579
1580 return vpc;
1581 #undef FLD
1582 }
1583
1584 /* fmuld: fmul.d $drg, $drh, $drf */
1585
1586 static SEM_PC
1587 SEM_FN_NAME (sh64_media,fmuld) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1588 {
1589 #define FLD(f) abuf->fields.sfmt_add.f
1590 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1591 int UNUSED written = 0;
1592 IADDR UNUSED pc = abuf->addr;
1593 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1594
1595 {
1596 DF opval = sh64_fmuld (current_cpu, GET_H_DR (FLD (f_left)), GET_H_DR (FLD (f_right)));
1597 SET_H_DR (FLD (f_dest), opval);
1598 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1599 }
1600
1601 return vpc;
1602 #undef FLD
1603 }
1604
1605 /* fmuls: fmul.s $frg, $frh, $frf */
1606
1607 static SEM_PC
1608 SEM_FN_NAME (sh64_media,fmuls) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1609 {
1610 #define FLD(f) abuf->fields.sfmt_add.f
1611 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1612 int UNUSED written = 0;
1613 IADDR UNUSED pc = abuf->addr;
1614 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1615
1616 {
1617 SF opval = sh64_fmuls (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)]));
1618 CPU (h_fr[FLD (f_dest)]) = opval;
1619 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1620 }
1621
1622 return vpc;
1623 #undef FLD
1624 }
1625
1626 /* fnegd: fneg.d $drgh, $drf */
1627
1628 static SEM_PC
1629 SEM_FN_NAME (sh64_media,fnegd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1630 {
1631 #define FLD(f) abuf->fields.sfmt_fabsd.f
1632 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1633 int UNUSED written = 0;
1634 IADDR UNUSED pc = abuf->addr;
1635 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1636
1637 {
1638 DF opval = sh64_fnegd (current_cpu, GET_H_DR (FLD (f_left_right)));
1639 SET_H_DR (FLD (f_dest), opval);
1640 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1641 }
1642
1643 return vpc;
1644 #undef FLD
1645 }
1646
1647 /* fnegs: fneg.s $frgh, $frf */
1648
1649 static SEM_PC
1650 SEM_FN_NAME (sh64_media,fnegs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1651 {
1652 #define FLD(f) abuf->fields.sfmt_fabsd.f
1653 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1654 int UNUSED written = 0;
1655 IADDR UNUSED pc = abuf->addr;
1656 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1657
1658 {
1659 SF opval = sh64_fnegs (current_cpu, CPU (h_fr[FLD (f_left_right)]));
1660 CPU (h_fr[FLD (f_dest)]) = opval;
1661 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1662 }
1663
1664 return vpc;
1665 #undef FLD
1666 }
1667
1668 /* fputscr: fputscr $frgh */
1669
1670 static SEM_PC
1671 SEM_FN_NAME (sh64_media,fputscr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1672 {
1673 #define FLD(f) abuf->fields.fmt_empty.f
1674 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1675 int UNUSED written = 0;
1676 IADDR UNUSED pc = abuf->addr;
1677 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1678
1679 ((void) 0); /*nop*/
1680
1681 return vpc;
1682 #undef FLD
1683 }
1684
1685 /* fsqrtd: fsqrt.d $drgh, $drf */
1686
1687 static SEM_PC
1688 SEM_FN_NAME (sh64_media,fsqrtd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1689 {
1690 #define FLD(f) abuf->fields.sfmt_fabsd.f
1691 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1692 int UNUSED written = 0;
1693 IADDR UNUSED pc = abuf->addr;
1694 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1695
1696 {
1697 DF opval = sh64_fsqrtd (current_cpu, GET_H_DR (FLD (f_left_right)));
1698 SET_H_DR (FLD (f_dest), opval);
1699 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1700 }
1701
1702 return vpc;
1703 #undef FLD
1704 }
1705
1706 /* fsqrts: fsqrt.s $frgh, $frf */
1707
1708 static SEM_PC
1709 SEM_FN_NAME (sh64_media,fsqrts) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1710 {
1711 #define FLD(f) abuf->fields.sfmt_fabsd.f
1712 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1713 int UNUSED written = 0;
1714 IADDR UNUSED pc = abuf->addr;
1715 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1716
1717 {
1718 SF opval = sh64_fsqrts (current_cpu, CPU (h_fr[FLD (f_left_right)]));
1719 CPU (h_fr[FLD (f_dest)]) = opval;
1720 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1721 }
1722
1723 return vpc;
1724 #undef FLD
1725 }
1726
1727 /* fstd: fst.d $rm, $disp10x8, $drf */
1728
1729 static SEM_PC
1730 SEM_FN_NAME (sh64_media,fstd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1731 {
1732 #define FLD(f) abuf->fields.sfmt_fldd.f
1733 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1734 int UNUSED written = 0;
1735 IADDR UNUSED pc = abuf->addr;
1736 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1737
1738 {
1739 DF opval = GET_H_DR (FLD (f_dest));
1740 SETMEMDF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp10x8)), opval);
1741 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1742 }
1743
1744 return vpc;
1745 #undef FLD
1746 }
1747
1748 /* fstp: fst.p $rm, $disp10x8, $fpf */
1749
1750 static SEM_PC
1751 SEM_FN_NAME (sh64_media,fstp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1752 {
1753 #define FLD(f) abuf->fields.sfmt_fldd.f
1754 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1755 int UNUSED written = 0;
1756 IADDR UNUSED pc = abuf->addr;
1757 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1758
1759 {
1760 QI tmp_f;
1761 tmp_f = FLD (f_dest);
1762 {
1763 SF opval = CPU (h_fr[tmp_f]);
1764 SETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp10x8)), opval);
1765 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1766 }
1767 {
1768 SF opval = CPU (h_fr[ADDQI (tmp_f, 1)]);
1769 SETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), ADDSI (FLD (f_disp10x8), 4)), opval);
1770 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1771 }
1772 }
1773
1774 return vpc;
1775 #undef FLD
1776 }
1777
1778 /* fsts: fst.s $rm, $disp10x4, $frf */
1779
1780 static SEM_PC
1781 SEM_FN_NAME (sh64_media,fsts) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1782 {
1783 #define FLD(f) abuf->fields.sfmt_flds.f
1784 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1785 int UNUSED written = 0;
1786 IADDR UNUSED pc = abuf->addr;
1787 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1788
1789 {
1790 SF opval = CPU (h_fr[FLD (f_dest)]);
1791 SETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp10x4)), opval);
1792 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1793 }
1794
1795 return vpc;
1796 #undef FLD
1797 }
1798
1799 /* fstxd: fstx.d $rm, $rn, $drf */
1800
1801 static SEM_PC
1802 SEM_FN_NAME (sh64_media,fstxd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1803 {
1804 #define FLD(f) abuf->fields.sfmt_add.f
1805 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1806 int UNUSED written = 0;
1807 IADDR UNUSED pc = abuf->addr;
1808 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1809
1810 {
1811 DF opval = GET_H_DR (FLD (f_dest));
1812 SETMEMDF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))), opval);
1813 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1814 }
1815
1816 return vpc;
1817 #undef FLD
1818 }
1819
1820 /* fstxp: fstx.p $rm, $rn, $fpf */
1821
1822 static SEM_PC
1823 SEM_FN_NAME (sh64_media,fstxp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1824 {
1825 #define FLD(f) abuf->fields.sfmt_add.f
1826 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1827 int UNUSED written = 0;
1828 IADDR UNUSED pc = abuf->addr;
1829 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1830
1831 {
1832 QI tmp_f;
1833 tmp_f = FLD (f_dest);
1834 {
1835 SF opval = CPU (h_fr[tmp_f]);
1836 SETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))), opval);
1837 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1838 }
1839 {
1840 SF opval = CPU (h_fr[ADDQI (tmp_f, 1)]);
1841 SETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), ADDDI (GET_H_GR (FLD (f_right)), 4)), opval);
1842 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1843 }
1844 }
1845
1846 return vpc;
1847 #undef FLD
1848 }
1849
1850 /* fstxs: fstx.s $rm, $rn, $frf */
1851
1852 static SEM_PC
1853 SEM_FN_NAME (sh64_media,fstxs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1854 {
1855 #define FLD(f) abuf->fields.sfmt_add.f
1856 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1857 int UNUSED written = 0;
1858 IADDR UNUSED pc = abuf->addr;
1859 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1860
1861 {
1862 SF opval = CPU (h_fr[FLD (f_dest)]);
1863 SETMEMSF (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))), opval);
1864 TRACE_RESULT (current_cpu, abuf, "memory", 'f', opval);
1865 }
1866
1867 return vpc;
1868 #undef FLD
1869 }
1870
1871 /* fsubd: fsub.d $drg, $drh, $drf */
1872
1873 static SEM_PC
1874 SEM_FN_NAME (sh64_media,fsubd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1875 {
1876 #define FLD(f) abuf->fields.sfmt_add.f
1877 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1878 int UNUSED written = 0;
1879 IADDR UNUSED pc = abuf->addr;
1880 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1881
1882 {
1883 DF opval = sh64_fsubd (current_cpu, GET_H_DR (FLD (f_left)), GET_H_DR (FLD (f_right)));
1884 SET_H_DR (FLD (f_dest), opval);
1885 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1886 }
1887
1888 return vpc;
1889 #undef FLD
1890 }
1891
1892 /* fsubs: fsub.s $frg, $frh, $frf */
1893
1894 static SEM_PC
1895 SEM_FN_NAME (sh64_media,fsubs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1896 {
1897 #define FLD(f) abuf->fields.sfmt_add.f
1898 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1899 int UNUSED written = 0;
1900 IADDR UNUSED pc = abuf->addr;
1901 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1902
1903 {
1904 SF opval = sh64_fsubs (current_cpu, CPU (h_fr[FLD (f_left)]), CPU (h_fr[FLD (f_right)]));
1905 CPU (h_fr[FLD (f_dest)]) = opval;
1906 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1907 }
1908
1909 return vpc;
1910 #undef FLD
1911 }
1912
1913 /* ftrcdl: ftrc.dl $drgh, $frf */
1914
1915 static SEM_PC
1916 SEM_FN_NAME (sh64_media,ftrcdl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1917 {
1918 #define FLD(f) abuf->fields.sfmt_fabsd.f
1919 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1920 int UNUSED written = 0;
1921 IADDR UNUSED pc = abuf->addr;
1922 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1923
1924 {
1925 SF opval = sh64_ftrcdl (current_cpu, GET_H_DR (FLD (f_left_right)));
1926 CPU (h_fr[FLD (f_dest)]) = opval;
1927 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1928 }
1929
1930 return vpc;
1931 #undef FLD
1932 }
1933
1934 /* ftrcsl: ftrc.sl $frgh, $frf */
1935
1936 static SEM_PC
1937 SEM_FN_NAME (sh64_media,ftrcsl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1938 {
1939 #define FLD(f) abuf->fields.sfmt_fabsd.f
1940 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1941 int UNUSED written = 0;
1942 IADDR UNUSED pc = abuf->addr;
1943 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1944
1945 {
1946 SF opval = sh64_ftrcsl (current_cpu, CPU (h_fr[FLD (f_left_right)]));
1947 CPU (h_fr[FLD (f_dest)]) = opval;
1948 TRACE_RESULT (current_cpu, abuf, "fr", 'f', opval);
1949 }
1950
1951 return vpc;
1952 #undef FLD
1953 }
1954
1955 /* ftrcdq: ftrc.dq $drgh, $drf */
1956
1957 static SEM_PC
1958 SEM_FN_NAME (sh64_media,ftrcdq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1959 {
1960 #define FLD(f) abuf->fields.sfmt_fabsd.f
1961 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1962 int UNUSED written = 0;
1963 IADDR UNUSED pc = abuf->addr;
1964 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1965
1966 {
1967 DF opval = sh64_ftrcdq (current_cpu, GET_H_DR (FLD (f_left_right)));
1968 SET_H_DR (FLD (f_dest), opval);
1969 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1970 }
1971
1972 return vpc;
1973 #undef FLD
1974 }
1975
1976 /* ftrcsq: ftrc.sq $frgh, $drf */
1977
1978 static SEM_PC
1979 SEM_FN_NAME (sh64_media,ftrcsq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
1980 {
1981 #define FLD(f) abuf->fields.sfmt_fabsd.f
1982 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1983 int UNUSED written = 0;
1984 IADDR UNUSED pc = abuf->addr;
1985 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
1986
1987 {
1988 DF opval = sh64_ftrcsq (current_cpu, CPU (h_fr[FLD (f_left_right)]));
1989 SET_H_DR (FLD (f_dest), opval);
1990 TRACE_RESULT (current_cpu, abuf, "dr", 'f', opval);
1991 }
1992
1993 return vpc;
1994 #undef FLD
1995 }
1996
1997 /* ftrvs: ftrv.s $mtrxg, $fvh, $fvf */
1998
1999 static SEM_PC
2000 SEM_FN_NAME (sh64_media,ftrvs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2001 {
2002 #define FLD(f) abuf->fields.sfmt_add.f
2003 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2004 int UNUSED written = 0;
2005 IADDR UNUSED pc = abuf->addr;
2006 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2007
2008 sh64_ftrvs (current_cpu, FLD (f_left), FLD (f_right), FLD (f_dest));
2009
2010 return vpc;
2011 #undef FLD
2012 }
2013
2014 /* getcfg: getcfg $rm, $disp6, $rd */
2015
2016 static SEM_PC
2017 SEM_FN_NAME (sh64_media,getcfg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2018 {
2019 #define FLD(f) abuf->fields.fmt_empty.f
2020 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2021 int UNUSED written = 0;
2022 IADDR UNUSED pc = abuf->addr;
2023 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2024
2025 ((void) 0); /*nop*/
2026
2027 return vpc;
2028 #undef FLD
2029 }
2030
2031 /* getcon: getcon $crk, $rd */
2032
2033 static SEM_PC
2034 SEM_FN_NAME (sh64_media,getcon) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2035 {
2036 #define FLD(f) abuf->fields.sfmt_xori.f
2037 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2038 int UNUSED written = 0;
2039 IADDR UNUSED pc = abuf->addr;
2040 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2041
2042 {
2043 DI opval = GET_H_CR (FLD (f_left));
2044 SET_H_GR (FLD (f_dest), opval);
2045 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2046 }
2047
2048 return vpc;
2049 #undef FLD
2050 }
2051
2052 /* gettr: gettr $trb, $rd */
2053
2054 static SEM_PC
2055 SEM_FN_NAME (sh64_media,gettr) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2056 {
2057 #define FLD(f) abuf->fields.sfmt_blink.f
2058 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2059 int UNUSED written = 0;
2060 IADDR UNUSED pc = abuf->addr;
2061 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2062
2063 {
2064 DI opval = CPU (h_tr[FLD (f_trb)]);
2065 SET_H_GR (FLD (f_dest), opval);
2066 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2067 }
2068
2069 return vpc;
2070 #undef FLD
2071 }
2072
2073 /* icbi: icbi $rm, $disp6x32 */
2074
2075 static SEM_PC
2076 SEM_FN_NAME (sh64_media,icbi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2077 {
2078 #define FLD(f) abuf->fields.fmt_empty.f
2079 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2080 int UNUSED written = 0;
2081 IADDR UNUSED pc = abuf->addr;
2082 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2083
2084 ((void) 0); /*nop*/
2085
2086 return vpc;
2087 #undef FLD
2088 }
2089
2090 /* ldb: ld.b $rm, $disp10, $rd */
2091
2092 static SEM_PC
2093 SEM_FN_NAME (sh64_media,ldb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2094 {
2095 #define FLD(f) abuf->fields.sfmt_addi.f
2096 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2097 int UNUSED written = 0;
2098 IADDR UNUSED pc = abuf->addr;
2099 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2100
2101 {
2102 DI opval = EXTQIDI (GETMEMQI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10)))));
2103 SET_H_GR (FLD (f_dest), opval);
2104 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2105 }
2106
2107 return vpc;
2108 #undef FLD
2109 }
2110
2111 /* ldl: ld.l $rm, $disp10x4, $rd */
2112
2113 static SEM_PC
2114 SEM_FN_NAME (sh64_media,ldl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2115 {
2116 #define FLD(f) abuf->fields.sfmt_flds.f
2117 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2118 int UNUSED written = 0;
2119 IADDR UNUSED pc = abuf->addr;
2120 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2121
2122 {
2123 DI opval = EXTSIDI (GETMEMSI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10x4)))));
2124 SET_H_GR (FLD (f_dest), opval);
2125 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2126 }
2127
2128 return vpc;
2129 #undef FLD
2130 }
2131
2132 /* ldq: ld.q $rm, $disp10x8, $rd */
2133
2134 static SEM_PC
2135 SEM_FN_NAME (sh64_media,ldq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2136 {
2137 #define FLD(f) abuf->fields.sfmt_fldd.f
2138 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2139 int UNUSED written = 0;
2140 IADDR UNUSED pc = abuf->addr;
2141 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2142
2143 {
2144 DI opval = GETMEMDI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10x8))));
2145 SET_H_GR (FLD (f_dest), opval);
2146 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2147 }
2148
2149 return vpc;
2150 #undef FLD
2151 }
2152
2153 /* ldub: ld.ub $rm, $disp10, $rd */
2154
2155 static SEM_PC
2156 SEM_FN_NAME (sh64_media,ldub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2157 {
2158 #define FLD(f) abuf->fields.sfmt_addi.f
2159 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2160 int UNUSED written = 0;
2161 IADDR UNUSED pc = abuf->addr;
2162 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2163
2164 {
2165 DI opval = ZEXTQIDI (GETMEMQI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10)))));
2166 SET_H_GR (FLD (f_dest), opval);
2167 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2168 }
2169
2170 return vpc;
2171 #undef FLD
2172 }
2173
2174 /* lduw: ld.uw $rm, $disp10x2, $rd */
2175
2176 static SEM_PC
2177 SEM_FN_NAME (sh64_media,lduw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2178 {
2179 #define FLD(f) abuf->fields.sfmt_lduw.f
2180 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2181 int UNUSED written = 0;
2182 IADDR UNUSED pc = abuf->addr;
2183 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2184
2185 {
2186 DI opval = ZEXTHIDI (GETMEMHI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10x2)))));
2187 SET_H_GR (FLD (f_dest), opval);
2188 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2189 }
2190
2191 return vpc;
2192 #undef FLD
2193 }
2194
2195 /* ldw: ld.w $rm, $disp10x2, $rd */
2196
2197 static SEM_PC
2198 SEM_FN_NAME (sh64_media,ldw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2199 {
2200 #define FLD(f) abuf->fields.sfmt_lduw.f
2201 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2202 int UNUSED written = 0;
2203 IADDR UNUSED pc = abuf->addr;
2204 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2205
2206 {
2207 DI opval = EXTHIDI (GETMEMHI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10x2)))));
2208 SET_H_GR (FLD (f_dest), opval);
2209 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2210 }
2211
2212 return vpc;
2213 #undef FLD
2214 }
2215
2216 /* ldhil: ldhi.l $rm, $disp6, $rd */
2217
2218 static SEM_PC
2219 SEM_FN_NAME (sh64_media,ldhil) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2220 {
2221 #define FLD(f) abuf->fields.sfmt_ldhil.f
2222 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2223 int UNUSED written = 0;
2224 IADDR UNUSED pc = abuf->addr;
2225 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2226
2227 {
2228 DI tmp_addr;
2229 QI tmp_bytecount;
2230 SI tmp_val;
2231 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp6));
2232 tmp_bytecount = ADDDI (ANDDI (tmp_addr, 3), 1);
2233 tmp_val = 0;
2234 if (ANDQI (tmp_bytecount, 4)) {
2235 {
2236 DI opval = EXTSIDI (GETMEMSI (current_cpu, pc, ANDDI (tmp_addr, -4)));
2237 SET_H_GR (FLD (f_dest), opval);
2238 written |= (1 << 6);
2239 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2240 }
2241 } else {
2242 if (GET_H_ENDIAN ()) {
2243 {
2244 if (ANDQI (tmp_bytecount, 2)) {
2245 tmp_val = ADDSI (SLLSI (tmp_val, 16), ZEXTHIDI (GETMEMHI (current_cpu, pc, ANDDI (tmp_addr, -4))));
2246 }
2247 if (ANDQI (tmp_bytecount, 1)) {
2248 tmp_val = ADDSI (SLLSI (tmp_val, 8), ZEXTQIDI (GETMEMQI (current_cpu, pc, tmp_addr)));
2249 }
2250 {
2251 DI opval = EXTSIDI (tmp_val);
2252 SET_H_GR (FLD (f_dest), opval);
2253 written |= (1 << 6);
2254 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2255 }
2256 }
2257 } else {
2258 {
2259 if (ANDQI (tmp_bytecount, 1)) {
2260 tmp_val = ADDSI (SLLSI (tmp_val, 8), ZEXTQIDI (GETMEMQI (current_cpu, pc, tmp_addr)));
2261 }
2262 if (ANDQI (tmp_bytecount, 2)) {
2263 tmp_val = ADDSI (SLLSI (tmp_val, 16), ZEXTHIDI (GETMEMHI (current_cpu, pc, ANDDI (tmp_addr, -4))));
2264 }
2265 {
2266 DI opval = EXTSIDI (SLLSI (tmp_val, SUBSI (32, MULSI (8, tmp_bytecount))));
2267 SET_H_GR (FLD (f_dest), opval);
2268 written |= (1 << 6);
2269 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2270 }
2271 }
2272 }
2273 }
2274 }
2275
2276 abuf->written = written;
2277 return vpc;
2278 #undef FLD
2279 }
2280
2281 /* ldhiq: ldhi.q $rm, $disp6, $rd */
2282
2283 static SEM_PC
2284 SEM_FN_NAME (sh64_media,ldhiq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2285 {
2286 #define FLD(f) abuf->fields.sfmt_ldhil.f
2287 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2288 int UNUSED written = 0;
2289 IADDR UNUSED pc = abuf->addr;
2290 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2291
2292 {
2293 DI tmp_addr;
2294 QI tmp_bytecount;
2295 DI tmp_val;
2296 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp6));
2297 tmp_bytecount = ADDDI (ANDDI (tmp_addr, 7), 1);
2298 tmp_val = 0;
2299 if (ANDQI (tmp_bytecount, 8)) {
2300 {
2301 DI opval = GETMEMDI (current_cpu, pc, ANDDI (tmp_addr, -8));
2302 SET_H_GR (FLD (f_dest), opval);
2303 written |= (1 << 7);
2304 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2305 }
2306 } else {
2307 if (GET_H_ENDIAN ()) {
2308 {
2309 if (ANDQI (tmp_bytecount, 4)) {
2310 tmp_val = ADDDI (SLLDI (tmp_val, 32), ZEXTSIDI (GETMEMSI (current_cpu, pc, ANDDI (tmp_addr, -8))));
2311 }
2312 if (ANDQI (tmp_bytecount, 2)) {
2313 tmp_val = ADDDI (SLLDI (tmp_val, 16), ZEXTHIDI (GETMEMHI (current_cpu, pc, ANDDI (tmp_addr, -4))));
2314 }
2315 if (ANDQI (tmp_bytecount, 1)) {
2316 tmp_val = ADDDI (SLLDI (tmp_val, 8), ZEXTQIDI (GETMEMQI (current_cpu, pc, tmp_addr)));
2317 }
2318 {
2319 DI opval = tmp_val;
2320 SET_H_GR (FLD (f_dest), opval);
2321 written |= (1 << 7);
2322 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2323 }
2324 }
2325 } else {
2326 {
2327 if (ANDQI (tmp_bytecount, 1)) {
2328 tmp_val = ADDDI (SLLDI (tmp_val, 8), ZEXTQIDI (GETMEMQI (current_cpu, pc, tmp_addr)));
2329 }
2330 if (ANDQI (tmp_bytecount, 2)) {
2331 tmp_val = ADDDI (SLLDI (tmp_val, 16), ZEXTHIDI (GETMEMHI (current_cpu, pc, ANDDI (tmp_addr, -4))));
2332 }
2333 if (ANDQI (tmp_bytecount, 4)) {
2334 tmp_val = ADDDI (SLLDI (tmp_val, 32), ZEXTSIDI (GETMEMSI (current_cpu, pc, ANDDI (tmp_addr, -8))));
2335 }
2336 {
2337 DI opval = SLLDI (tmp_val, SUBSI (64, MULSI (8, tmp_bytecount)));
2338 SET_H_GR (FLD (f_dest), opval);
2339 written |= (1 << 7);
2340 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2341 }
2342 }
2343 }
2344 }
2345 }
2346
2347 abuf->written = written;
2348 return vpc;
2349 #undef FLD
2350 }
2351
2352 /* ldlol: ldlo.l $rm, $disp6, $rd */
2353
2354 static SEM_PC
2355 SEM_FN_NAME (sh64_media,ldlol) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2356 {
2357 #define FLD(f) abuf->fields.sfmt_ldhil.f
2358 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2359 int UNUSED written = 0;
2360 IADDR UNUSED pc = abuf->addr;
2361 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2362
2363 {
2364 DI tmp_addr;
2365 QI tmp_bytecount;
2366 SI tmp_val;
2367 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp6));
2368 tmp_bytecount = SUBSI (4, ANDDI (tmp_addr, 3));
2369 tmp_val = 0;
2370 if (ANDQI (tmp_bytecount, 4)) {
2371 {
2372 DI opval = EXTSIDI (GETMEMSI (current_cpu, pc, tmp_addr));
2373 SET_H_GR (FLD (f_dest), opval);
2374 written |= (1 << 6);
2375 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2376 }
2377 } else {
2378 if (GET_H_ENDIAN ()) {
2379 {
2380 if (ANDQI (tmp_bytecount, 1)) {
2381 tmp_val = ADDSI (SLLSI (tmp_val, 8), ZEXTQIDI (GETMEMQI (current_cpu, pc, tmp_addr)));
2382 }
2383 if (ANDQI (tmp_bytecount, 2)) {
2384 tmp_val = ADDSI (SLLSI (tmp_val, 16), ZEXTHIDI (GETMEMHI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 1), -2))));
2385 }
2386 {
2387 DI opval = EXTSIDI (SLLSI (tmp_val, SUBSI (32, MULSI (8, tmp_bytecount))));
2388 SET_H_GR (FLD (f_dest), opval);
2389 written |= (1 << 6);
2390 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2391 }
2392 }
2393 } else {
2394 {
2395 if (ANDQI (tmp_bytecount, 2)) {
2396 tmp_val = ADDSI (SLLSI (tmp_val, 16), ZEXTHIDI (GETMEMHI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 1), -2))));
2397 }
2398 if (ANDQI (tmp_bytecount, 1)) {
2399 tmp_val = ADDSI (SLLSI (tmp_val, 8), ZEXTQIDI (GETMEMQI (current_cpu, pc, tmp_addr)));
2400 }
2401 {
2402 DI opval = EXTSIDI (tmp_val);
2403 SET_H_GR (FLD (f_dest), opval);
2404 written |= (1 << 6);
2405 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2406 }
2407 }
2408 }
2409 }
2410 }
2411
2412 abuf->written = written;
2413 return vpc;
2414 #undef FLD
2415 }
2416
2417 /* ldloq: ldlo.q $rm, $disp6, $rd */
2418
2419 static SEM_PC
2420 SEM_FN_NAME (sh64_media,ldloq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2421 {
2422 #define FLD(f) abuf->fields.sfmt_ldhil.f
2423 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2424 int UNUSED written = 0;
2425 IADDR UNUSED pc = abuf->addr;
2426 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2427
2428 {
2429 DI tmp_addr;
2430 QI tmp_bytecount;
2431 DI tmp_val;
2432 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp6));
2433 tmp_bytecount = SUBSI (8, ANDDI (tmp_addr, 7));
2434 tmp_val = 0;
2435 if (ANDQI (tmp_bytecount, 8)) {
2436 {
2437 DI opval = GETMEMDI (current_cpu, pc, tmp_addr);
2438 SET_H_GR (FLD (f_dest), opval);
2439 written |= (1 << 7);
2440 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2441 }
2442 } else {
2443 if (GET_H_ENDIAN ()) {
2444 {
2445 if (ANDQI (tmp_bytecount, 1)) {
2446 tmp_val = ADDDI (SLLDI (tmp_val, 8), ZEXTQIDI (GETMEMQI (current_cpu, pc, tmp_addr)));
2447 }
2448 if (ANDQI (tmp_bytecount, 2)) {
2449 tmp_val = ADDDI (SLLDI (tmp_val, 16), ZEXTHIDI (GETMEMHI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 1), -2))));
2450 }
2451 if (ANDQI (tmp_bytecount, 4)) {
2452 tmp_val = ADDDI (SLLDI (tmp_val, 32), ZEXTSIDI (GETMEMSI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 3), -4))));
2453 }
2454 {
2455 DI opval = SLLDI (tmp_val, SUBSI (64, MULSI (8, tmp_bytecount)));
2456 SET_H_GR (FLD (f_dest), opval);
2457 written |= (1 << 7);
2458 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2459 }
2460 }
2461 } else {
2462 {
2463 if (ANDQI (tmp_bytecount, 4)) {
2464 tmp_val = ADDDI (SLLDI (tmp_val, 32), ZEXTSIDI (GETMEMSI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 3), -4))));
2465 }
2466 if (ANDQI (tmp_bytecount, 2)) {
2467 tmp_val = ADDDI (SLLDI (tmp_val, 16), ZEXTHIDI (GETMEMHI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 1), -2))));
2468 }
2469 if (ANDQI (tmp_bytecount, 1)) {
2470 tmp_val = ADDDI (SLLDI (tmp_val, 8), ZEXTQIDI (GETMEMQI (current_cpu, pc, tmp_addr)));
2471 }
2472 {
2473 DI opval = tmp_val;
2474 SET_H_GR (FLD (f_dest), opval);
2475 written |= (1 << 7);
2476 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2477 }
2478 }
2479 }
2480 }
2481 }
2482
2483 abuf->written = written;
2484 return vpc;
2485 #undef FLD
2486 }
2487
2488 /* ldxb: ldx.b $rm, $rn, $rd */
2489
2490 static SEM_PC
2491 SEM_FN_NAME (sh64_media,ldxb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2492 {
2493 #define FLD(f) abuf->fields.sfmt_add.f
2494 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2495 int UNUSED written = 0;
2496 IADDR UNUSED pc = abuf->addr;
2497 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2498
2499 {
2500 DI opval = EXTQIDI (GETMEMQI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))));
2501 SET_H_GR (FLD (f_dest), opval);
2502 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2503 }
2504
2505 return vpc;
2506 #undef FLD
2507 }
2508
2509 /* ldxl: ldx.l $rm, $rn, $rd */
2510
2511 static SEM_PC
2512 SEM_FN_NAME (sh64_media,ldxl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2513 {
2514 #define FLD(f) abuf->fields.sfmt_add.f
2515 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2516 int UNUSED written = 0;
2517 IADDR UNUSED pc = abuf->addr;
2518 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2519
2520 {
2521 DI opval = EXTSIDI (GETMEMSI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))));
2522 SET_H_GR (FLD (f_dest), opval);
2523 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2524 }
2525
2526 return vpc;
2527 #undef FLD
2528 }
2529
2530 /* ldxq: ldx.q $rm, $rn, $rd */
2531
2532 static SEM_PC
2533 SEM_FN_NAME (sh64_media,ldxq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2534 {
2535 #define FLD(f) abuf->fields.sfmt_add.f
2536 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2537 int UNUSED written = 0;
2538 IADDR UNUSED pc = abuf->addr;
2539 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2540
2541 {
2542 DI opval = GETMEMDI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))));
2543 SET_H_GR (FLD (f_dest), opval);
2544 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2545 }
2546
2547 return vpc;
2548 #undef FLD
2549 }
2550
2551 /* ldxub: ldx.ub $rm, $rn, $rd */
2552
2553 static SEM_PC
2554 SEM_FN_NAME (sh64_media,ldxub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2555 {
2556 #define FLD(f) abuf->fields.sfmt_add.f
2557 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2558 int UNUSED written = 0;
2559 IADDR UNUSED pc = abuf->addr;
2560 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2561
2562 {
2563 DI opval = ZEXTQIDI (GETMEMUQI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))));
2564 SET_H_GR (FLD (f_dest), opval);
2565 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2566 }
2567
2568 return vpc;
2569 #undef FLD
2570 }
2571
2572 /* ldxuw: ldx.uw $rm, $rn, $rd */
2573
2574 static SEM_PC
2575 SEM_FN_NAME (sh64_media,ldxuw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2576 {
2577 #define FLD(f) abuf->fields.sfmt_add.f
2578 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2579 int UNUSED written = 0;
2580 IADDR UNUSED pc = abuf->addr;
2581 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2582
2583 {
2584 DI opval = ZEXTHIDI (GETMEMUHI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))));
2585 SET_H_GR (FLD (f_dest), opval);
2586 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2587 }
2588
2589 return vpc;
2590 #undef FLD
2591 }
2592
2593 /* ldxw: ldx.w $rm, $rn, $rd */
2594
2595 static SEM_PC
2596 SEM_FN_NAME (sh64_media,ldxw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2597 {
2598 #define FLD(f) abuf->fields.sfmt_add.f
2599 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2600 int UNUSED written = 0;
2601 IADDR UNUSED pc = abuf->addr;
2602 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2603
2604 {
2605 DI opval = EXTHIDI (GETMEMHI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)))));
2606 SET_H_GR (FLD (f_dest), opval);
2607 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2608 }
2609
2610 return vpc;
2611 #undef FLD
2612 }
2613
2614 /* mabsl: mabs.l $rm, $rd */
2615
2616 static SEM_PC
2617 SEM_FN_NAME (sh64_media,mabsl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2618 {
2619 #define FLD(f) abuf->fields.sfmt_xori.f
2620 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2621 int UNUSED written = 0;
2622 IADDR UNUSED pc = abuf->addr;
2623 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2624
2625 {
2626 SI tmp_result1;
2627 SI tmp_result0;
2628 tmp_result0 = ABSSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1));
2629 tmp_result1 = ABSSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0));
2630 {
2631 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
2632 SET_H_GR (FLD (f_dest), opval);
2633 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2634 }
2635 }
2636
2637 return vpc;
2638 #undef FLD
2639 }
2640
2641 /* mabsw: mabs.w $rm, $rd */
2642
2643 static SEM_PC
2644 SEM_FN_NAME (sh64_media,mabsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2645 {
2646 #define FLD(f) abuf->fields.sfmt_xori.f
2647 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2648 int UNUSED written = 0;
2649 IADDR UNUSED pc = abuf->addr;
2650 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2651
2652 {
2653 HI tmp_result3;
2654 HI tmp_result2;
2655 HI tmp_result1;
2656 HI tmp_result0;
2657 tmp_result0 = ABSHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3));
2658 tmp_result1 = ABSHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2));
2659 tmp_result2 = ABSHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1));
2660 tmp_result3 = ABSHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0));
2661 {
2662 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
2663 SET_H_GR (FLD (f_dest), opval);
2664 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2665 }
2666 }
2667
2668 return vpc;
2669 #undef FLD
2670 }
2671
2672 /* maddl: madd.l $rm, $rn, $rd */
2673
2674 static SEM_PC
2675 SEM_FN_NAME (sh64_media,maddl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2676 {
2677 #define FLD(f) abuf->fields.sfmt_add.f
2678 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2679 int UNUSED written = 0;
2680 IADDR UNUSED pc = abuf->addr;
2681 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2682
2683 {
2684 SI tmp_result1;
2685 SI tmp_result0;
2686 tmp_result0 = ADDSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SUBWORDDISI (GET_H_GR (FLD (f_right)), 1));
2687 tmp_result1 = ADDSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), SUBWORDDISI (GET_H_GR (FLD (f_right)), 0));
2688 {
2689 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
2690 SET_H_GR (FLD (f_dest), opval);
2691 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2692 }
2693 }
2694
2695 return vpc;
2696 #undef FLD
2697 }
2698
2699 /* maddw: madd.w $rm, $rn, $rd */
2700
2701 static SEM_PC
2702 SEM_FN_NAME (sh64_media,maddw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2703 {
2704 #define FLD(f) abuf->fields.sfmt_add.f
2705 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2706 int UNUSED written = 0;
2707 IADDR UNUSED pc = abuf->addr;
2708 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2709
2710 {
2711 HI tmp_result3;
2712 HI tmp_result2;
2713 HI tmp_result1;
2714 HI tmp_result0;
2715 tmp_result0 = ADDHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3));
2716 tmp_result1 = ADDHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2));
2717 tmp_result2 = ADDHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1));
2718 tmp_result3 = ADDHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0));
2719 {
2720 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
2721 SET_H_GR (FLD (f_dest), opval);
2722 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2723 }
2724 }
2725
2726 return vpc;
2727 #undef FLD
2728 }
2729
2730 /* maddsl: madds.l $rm, $rn, $rd */
2731
2732 static SEM_PC
2733 SEM_FN_NAME (sh64_media,maddsl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2734 {
2735 #define FLD(f) abuf->fields.sfmt_add.f
2736 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2737 int UNUSED written = 0;
2738 IADDR UNUSED pc = abuf->addr;
2739 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2740
2741 {
2742 SI tmp_result1;
2743 SI tmp_result0;
2744 tmp_result0 = ((LTDI (ADDDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1))), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (ADDDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1))), SLLDI (1, SUBSI (32, 1)))) ? (ADDDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1)))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
2745 tmp_result1 = ((LTDI (ADDDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0))), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (ADDDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0))), SLLDI (1, SUBSI (32, 1)))) ? (ADDDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0)))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
2746 {
2747 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
2748 SET_H_GR (FLD (f_dest), opval);
2749 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2750 }
2751 }
2752
2753 return vpc;
2754 #undef FLD
2755 }
2756
2757 /* maddsub: madds.ub $rm, $rn, $rd */
2758
2759 static SEM_PC
2760 SEM_FN_NAME (sh64_media,maddsub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2761 {
2762 #define FLD(f) abuf->fields.sfmt_add.f
2763 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2764 int UNUSED written = 0;
2765 IADDR UNUSED pc = abuf->addr;
2766 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2767
2768 {
2769 QI tmp_result7;
2770 QI tmp_result6;
2771 QI tmp_result5;
2772 QI tmp_result4;
2773 QI tmp_result3;
2774 QI tmp_result2;
2775 QI tmp_result1;
2776 QI tmp_result0;
2777 tmp_result0 = ((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))), MAKEDI (0, 0))) ? (0) : (((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))), SLLDI (1, 8))) ? (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7)))) : (SUBQI (SLLQI (1, 8), 1)))));
2778 tmp_result1 = ((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))), MAKEDI (0, 0))) ? (0) : (((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))), SLLDI (1, 8))) ? (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6)))) : (SUBQI (SLLQI (1, 8), 1)))));
2779 tmp_result2 = ((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))), MAKEDI (0, 0))) ? (0) : (((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))), SLLDI (1, 8))) ? (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5)))) : (SUBQI (SLLQI (1, 8), 1)))));
2780 tmp_result3 = ((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))), MAKEDI (0, 0))) ? (0) : (((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))), SLLDI (1, 8))) ? (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4)))) : (SUBQI (SLLQI (1, 8), 1)))));
2781 tmp_result4 = ((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))), MAKEDI (0, 0))) ? (0) : (((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))), SLLDI (1, 8))) ? (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3)))) : (SUBQI (SLLQI (1, 8), 1)))));
2782 tmp_result5 = ((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))), MAKEDI (0, 0))) ? (0) : (((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))), SLLDI (1, 8))) ? (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2)))) : (SUBQI (SLLQI (1, 8), 1)))));
2783 tmp_result6 = ((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))), MAKEDI (0, 0))) ? (0) : (((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))), SLLDI (1, 8))) ? (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1)))) : (SUBQI (SLLQI (1, 8), 1)))));
2784 tmp_result7 = ((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0))), MAKEDI (0, 0))) ? (0) : (((LTDI (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0))), SLLDI (1, 8))) ? (ADDDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0)))) : (SUBQI (SLLQI (1, 8), 1)))));
2785 {
2786 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
2787 SET_H_GR (FLD (f_dest), opval);
2788 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2789 }
2790 }
2791
2792 return vpc;
2793 #undef FLD
2794 }
2795
2796 /* maddsw: madds.w $rm, $rn, $rd */
2797
2798 static SEM_PC
2799 SEM_FN_NAME (sh64_media,maddsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2800 {
2801 #define FLD(f) abuf->fields.sfmt_add.f
2802 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2803 int UNUSED written = 0;
2804 IADDR UNUSED pc = abuf->addr;
2805 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2806
2807 {
2808 HI tmp_result3;
2809 HI tmp_result2;
2810 HI tmp_result1;
2811 HI tmp_result0;
2812 tmp_result0 = ((LTDI (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3))), SLLDI (1, SUBSI (16, 1)))) ? (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
2813 tmp_result1 = ((LTDI (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2))), SLLDI (1, SUBSI (16, 1)))) ? (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
2814 tmp_result2 = ((LTDI (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1))), SLLDI (1, SUBSI (16, 1)))) ? (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
2815 tmp_result3 = ((LTDI (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0))), SLLDI (1, SUBSI (16, 1)))) ? (ADDDI (EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)), EXTHIDI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
2816 {
2817 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
2818 SET_H_GR (FLD (f_dest), opval);
2819 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2820 }
2821 }
2822
2823 return vpc;
2824 #undef FLD
2825 }
2826
2827 /* mcmpeqb: mcmpeq.b $rm, $rn, $rd */
2828
2829 static SEM_PC
2830 SEM_FN_NAME (sh64_media,mcmpeqb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2831 {
2832 #define FLD(f) abuf->fields.sfmt_add.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, 4);
2837
2838 {
2839 QI tmp_result7;
2840 QI tmp_result6;
2841 QI tmp_result5;
2842 QI tmp_result4;
2843 QI tmp_result3;
2844 QI tmp_result2;
2845 QI tmp_result1;
2846 QI tmp_result0;
2847 tmp_result0 = ((EQQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))) ? (INVQI (0)) : (0));
2848 tmp_result1 = ((EQQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))) ? (INVQI (0)) : (0));
2849 tmp_result2 = ((EQQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))) ? (INVQI (0)) : (0));
2850 tmp_result3 = ((EQQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))) ? (INVQI (0)) : (0));
2851 tmp_result4 = ((EQQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))) ? (INVQI (0)) : (0));
2852 tmp_result5 = ((EQQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))) ? (INVQI (0)) : (0));
2853 tmp_result6 = ((EQQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))) ? (INVQI (0)) : (0));
2854 tmp_result7 = ((EQQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0))) ? (INVQI (0)) : (0));
2855 {
2856 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
2857 SET_H_GR (FLD (f_dest), opval);
2858 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2859 }
2860 }
2861
2862 return vpc;
2863 #undef FLD
2864 }
2865
2866 /* mcmpeql: mcmpeq.l $rm, $rn, $rd */
2867
2868 static SEM_PC
2869 SEM_FN_NAME (sh64_media,mcmpeql) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2870 {
2871 #define FLD(f) abuf->fields.sfmt_add.f
2872 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2873 int UNUSED written = 0;
2874 IADDR UNUSED pc = abuf->addr;
2875 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2876
2877 {
2878 SI tmp_result1;
2879 SI tmp_result0;
2880 tmp_result0 = ((EQSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SUBWORDDISI (GET_H_GR (FLD (f_right)), 1))) ? (INVSI (0)) : (0));
2881 tmp_result1 = ((EQSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), SUBWORDDISI (GET_H_GR (FLD (f_right)), 0))) ? (INVSI (0)) : (0));
2882 {
2883 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
2884 SET_H_GR (FLD (f_dest), opval);
2885 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2886 }
2887 }
2888
2889 return vpc;
2890 #undef FLD
2891 }
2892
2893 /* mcmpeqw: mcmpeq.w $rm, $rn, $rd */
2894
2895 static SEM_PC
2896 SEM_FN_NAME (sh64_media,mcmpeqw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2897 {
2898 #define FLD(f) abuf->fields.sfmt_add.f
2899 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2900 int UNUSED written = 0;
2901 IADDR UNUSED pc = abuf->addr;
2902 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2903
2904 {
2905 HI tmp_result3;
2906 HI tmp_result2;
2907 HI tmp_result1;
2908 HI tmp_result0;
2909 tmp_result0 = ((EQHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3))) ? (INVHI (0)) : (0));
2910 tmp_result1 = ((EQHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2))) ? (INVHI (0)) : (0));
2911 tmp_result2 = ((EQHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1))) ? (INVHI (0)) : (0));
2912 tmp_result3 = ((EQHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0))) ? (INVHI (0)) : (0));
2913 {
2914 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
2915 SET_H_GR (FLD (f_dest), opval);
2916 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2917 }
2918 }
2919
2920 return vpc;
2921 #undef FLD
2922 }
2923
2924 /* mcmpgtl: mcmpgt.l $rm, $rn, $rd */
2925
2926 static SEM_PC
2927 SEM_FN_NAME (sh64_media,mcmpgtl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2928 {
2929 #define FLD(f) abuf->fields.sfmt_add.f
2930 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2931 int UNUSED written = 0;
2932 IADDR UNUSED pc = abuf->addr;
2933 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2934
2935 {
2936 SI tmp_result1;
2937 SI tmp_result0;
2938 tmp_result0 = ((GTSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SUBWORDDISI (GET_H_GR (FLD (f_right)), 1))) ? (INVSI (0)) : (0));
2939 tmp_result1 = ((GTSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), SUBWORDDISI (GET_H_GR (FLD (f_right)), 0))) ? (INVSI (0)) : (0));
2940 {
2941 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
2942 SET_H_GR (FLD (f_dest), opval);
2943 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2944 }
2945 }
2946
2947 return vpc;
2948 #undef FLD
2949 }
2950
2951 /* mcmpgtub: mcmpgt.ub $rm, $rn, $rd */
2952
2953 static SEM_PC
2954 SEM_FN_NAME (sh64_media,mcmpgtub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2955 {
2956 #define FLD(f) abuf->fields.sfmt_add.f
2957 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2958 int UNUSED written = 0;
2959 IADDR UNUSED pc = abuf->addr;
2960 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
2961
2962 {
2963 QI tmp_result7;
2964 QI tmp_result6;
2965 QI tmp_result5;
2966 QI tmp_result4;
2967 QI tmp_result3;
2968 QI tmp_result2;
2969 QI tmp_result1;
2970 QI tmp_result0;
2971 tmp_result0 = ((GTUQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))) ? (INVQI (0)) : (0));
2972 tmp_result1 = ((GTUQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))) ? (INVQI (0)) : (0));
2973 tmp_result2 = ((GTUQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))) ? (INVQI (0)) : (0));
2974 tmp_result3 = ((GTUQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))) ? (INVQI (0)) : (0));
2975 tmp_result4 = ((GTUQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))) ? (INVQI (0)) : (0));
2976 tmp_result5 = ((GTUQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))) ? (INVQI (0)) : (0));
2977 tmp_result6 = ((GTUQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))) ? (INVQI (0)) : (0));
2978 tmp_result7 = ((GTUQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0))) ? (INVQI (0)) : (0));
2979 {
2980 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
2981 SET_H_GR (FLD (f_dest), opval);
2982 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
2983 }
2984 }
2985
2986 return vpc;
2987 #undef FLD
2988 }
2989
2990 /* mcmpgtw: mcmpgt.w $rm, $rn, $rd */
2991
2992 static SEM_PC
2993 SEM_FN_NAME (sh64_media,mcmpgtw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
2994 {
2995 #define FLD(f) abuf->fields.sfmt_add.f
2996 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2997 int UNUSED written = 0;
2998 IADDR UNUSED pc = abuf->addr;
2999 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3000
3001 {
3002 HI tmp_result3;
3003 HI tmp_result2;
3004 HI tmp_result1;
3005 HI tmp_result0;
3006 tmp_result0 = ((GTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3))) ? (INVHI (0)) : (0));
3007 tmp_result1 = ((GTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2))) ? (INVHI (0)) : (0));
3008 tmp_result2 = ((GTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1))) ? (INVHI (0)) : (0));
3009 tmp_result3 = ((GTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0))) ? (INVHI (0)) : (0));
3010 {
3011 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3012 SET_H_GR (FLD (f_dest), opval);
3013 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3014 }
3015 }
3016
3017 return vpc;
3018 #undef FLD
3019 }
3020
3021 /* mcmv: mcmv $rm, $rn, $rd */
3022
3023 static SEM_PC
3024 SEM_FN_NAME (sh64_media,mcmv) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3025 {
3026 #define FLD(f) abuf->fields.sfmt_add.f
3027 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3028 int UNUSED written = 0;
3029 IADDR UNUSED pc = abuf->addr;
3030 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3031
3032 {
3033 DI opval = ORDI (ANDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))), ANDDI (GET_H_GR (FLD (f_dest)), INVDI (GET_H_GR (FLD (f_right)))));
3034 SET_H_GR (FLD (f_dest), opval);
3035 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3036 }
3037
3038 return vpc;
3039 #undef FLD
3040 }
3041
3042 /* mcnvslw: mcnvs.lw $rm, $rn, $rd */
3043
3044 static SEM_PC
3045 SEM_FN_NAME (sh64_media,mcnvslw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3046 {
3047 #define FLD(f) abuf->fields.sfmt_add.f
3048 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3049 int UNUSED written = 0;
3050 IADDR UNUSED pc = abuf->addr;
3051 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3052
3053 {
3054 HI tmp_result3;
3055 HI tmp_result2;
3056 HI tmp_result1;
3057 HI tmp_result0;
3058 tmp_result0 = ((LTSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SLLDI (1, SUBSI (16, 1)))) ? (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3059 tmp_result1 = ((LTSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), SLLDI (1, SUBSI (16, 1)))) ? (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3060 tmp_result2 = ((LTSI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1), SLLDI (1, SUBSI (16, 1)))) ? (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3061 tmp_result3 = ((LTSI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0), SLLDI (1, SUBSI (16, 1)))) ? (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3062 {
3063 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3064 SET_H_GR (FLD (f_dest), opval);
3065 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3066 }
3067 }
3068
3069 return vpc;
3070 #undef FLD
3071 }
3072
3073 /* mcnvswb: mcnvs.wb $rm, $rn, $rd */
3074
3075 static SEM_PC
3076 SEM_FN_NAME (sh64_media,mcnvswb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3077 {
3078 #define FLD(f) abuf->fields.sfmt_add.f
3079 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3080 int UNUSED written = 0;
3081 IADDR UNUSED pc = abuf->addr;
3082 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3083
3084 {
3085 QI tmp_result7;
3086 QI tmp_result6;
3087 QI tmp_result5;
3088 QI tmp_result4;
3089 QI tmp_result3;
3090 QI tmp_result2;
3091 QI tmp_result1;
3092 QI tmp_result0;
3093 tmp_result0 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), NEGDI (SLLDI (1, SUBSI (8, 1))))) ? (NEGQI (SLLQI (1, SUBSI (8, 1)))) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), SLLDI (1, SUBSI (8, 1)))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)) : (SUBQI (SLLQI (1, SUBSI (8, 1)), 1)))));
3094 tmp_result1 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), NEGDI (SLLDI (1, SUBSI (8, 1))))) ? (NEGQI (SLLQI (1, SUBSI (8, 1)))) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), SLLDI (1, SUBSI (8, 1)))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)) : (SUBQI (SLLQI (1, SUBSI (8, 1)), 1)))));
3095 tmp_result2 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), NEGDI (SLLDI (1, SUBSI (8, 1))))) ? (NEGQI (SLLQI (1, SUBSI (8, 1)))) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), SLLDI (1, SUBSI (8, 1)))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)) : (SUBQI (SLLQI (1, SUBSI (8, 1)), 1)))));
3096 tmp_result3 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), NEGDI (SLLDI (1, SUBSI (8, 1))))) ? (NEGQI (SLLQI (1, SUBSI (8, 1)))) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), SLLDI (1, SUBSI (8, 1)))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)) : (SUBQI (SLLQI (1, SUBSI (8, 1)), 1)))));
3097 tmp_result4 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3), NEGDI (SLLDI (1, SUBSI (8, 1))))) ? (NEGQI (SLLQI (1, SUBSI (8, 1)))) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3), SLLDI (1, SUBSI (8, 1)))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3)) : (SUBQI (SLLQI (1, SUBSI (8, 1)), 1)))));
3098 tmp_result5 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2), NEGDI (SLLDI (1, SUBSI (8, 1))))) ? (NEGQI (SLLQI (1, SUBSI (8, 1)))) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2), SLLDI (1, SUBSI (8, 1)))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2)) : (SUBQI (SLLQI (1, SUBSI (8, 1)), 1)))));
3099 tmp_result6 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1), NEGDI (SLLDI (1, SUBSI (8, 1))))) ? (NEGQI (SLLQI (1, SUBSI (8, 1)))) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1), SLLDI (1, SUBSI (8, 1)))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1)) : (SUBQI (SLLQI (1, SUBSI (8, 1)), 1)))));
3100 tmp_result7 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0), NEGDI (SLLDI (1, SUBSI (8, 1))))) ? (NEGQI (SLLQI (1, SUBSI (8, 1)))) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0), SLLDI (1, SUBSI (8, 1)))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0)) : (SUBQI (SLLQI (1, SUBSI (8, 1)), 1)))));
3101 {
3102 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
3103 SET_H_GR (FLD (f_dest), opval);
3104 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3105 }
3106 }
3107
3108 return vpc;
3109 #undef FLD
3110 }
3111
3112 /* mcnvswub: mcnvs.wub $rm, $rn, $rd */
3113
3114 static SEM_PC
3115 SEM_FN_NAME (sh64_media,mcnvswub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3116 {
3117 #define FLD(f) abuf->fields.sfmt_add.f
3118 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3119 int UNUSED written = 0;
3120 IADDR UNUSED pc = abuf->addr;
3121 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3122
3123 {
3124 QI tmp_result7;
3125 QI tmp_result6;
3126 QI tmp_result5;
3127 QI tmp_result4;
3128 QI tmp_result3;
3129 QI tmp_result2;
3130 QI tmp_result1;
3131 QI tmp_result0;
3132 tmp_result0 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), MAKEDI (0, 0))) ? (0) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), SLLDI (1, 8))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)) : (SUBQI (SLLQI (1, 8), 1)))));
3133 tmp_result1 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), MAKEDI (0, 0))) ? (0) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), SLLDI (1, 8))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)) : (SUBQI (SLLQI (1, 8), 1)))));
3134 tmp_result2 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), MAKEDI (0, 0))) ? (0) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), SLLDI (1, 8))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)) : (SUBQI (SLLQI (1, 8), 1)))));
3135 tmp_result3 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), MAKEDI (0, 0))) ? (0) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), SLLDI (1, 8))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)) : (SUBQI (SLLQI (1, 8), 1)))));
3136 tmp_result4 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3), MAKEDI (0, 0))) ? (0) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3), SLLDI (1, 8))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3)) : (SUBQI (SLLQI (1, 8), 1)))));
3137 tmp_result5 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2), MAKEDI (0, 0))) ? (0) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2), SLLDI (1, 8))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2)) : (SUBQI (SLLQI (1, 8), 1)))));
3138 tmp_result6 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1), MAKEDI (0, 0))) ? (0) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1), SLLDI (1, 8))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1)) : (SUBQI (SLLQI (1, 8), 1)))));
3139 tmp_result7 = ((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0), MAKEDI (0, 0))) ? (0) : (((LTHI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0), SLLDI (1, 8))) ? (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0)) : (SUBQI (SLLQI (1, 8), 1)))));
3140 {
3141 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
3142 SET_H_GR (FLD (f_dest), opval);
3143 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3144 }
3145 }
3146
3147 return vpc;
3148 #undef FLD
3149 }
3150
3151 /* mextr1: mextr1 $rm, $rn, $rd */
3152
3153 static SEM_PC
3154 SEM_FN_NAME (sh64_media,mextr1) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3155 {
3156 #define FLD(f) abuf->fields.sfmt_add.f
3157 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3158 int UNUSED written = 0;
3159 IADDR UNUSED pc = abuf->addr;
3160 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3161
3162 {
3163 QI tmp_count;
3164 DI tmp_mask;
3165 DI tmp_rhs;
3166 tmp_count = MULQI (8, 1);
3167 tmp_mask = SLLDI (INVSI (0), tmp_count);
3168 tmp_rhs = SRLDI (ANDDI (GET_H_GR (FLD (f_left)), tmp_mask), tmp_count);
3169 tmp_count = MULQI (8, SUBQI (8, 1));
3170 tmp_mask = SRLDI (INVSI (0), tmp_count);
3171 {
3172 DI opval = ORDI (tmp_rhs, SLLDI (ANDDI (GET_H_GR (FLD (f_right)), tmp_mask), tmp_count));
3173 SET_H_GR (FLD (f_dest), opval);
3174 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3175 }
3176 }
3177
3178 return vpc;
3179 #undef FLD
3180 }
3181
3182 /* mextr2: mextr2 $rm, $rn, $rd */
3183
3184 static SEM_PC
3185 SEM_FN_NAME (sh64_media,mextr2) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3186 {
3187 #define FLD(f) abuf->fields.sfmt_add.f
3188 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3189 int UNUSED written = 0;
3190 IADDR UNUSED pc = abuf->addr;
3191 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3192
3193 {
3194 QI tmp_count;
3195 DI tmp_mask;
3196 DI tmp_rhs;
3197 tmp_count = MULQI (8, 2);
3198 tmp_mask = SLLDI (INVSI (0), tmp_count);
3199 tmp_rhs = SRLDI (ANDDI (GET_H_GR (FLD (f_left)), tmp_mask), tmp_count);
3200 tmp_count = MULQI (8, SUBQI (8, 2));
3201 tmp_mask = SRLDI (INVSI (0), tmp_count);
3202 {
3203 DI opval = ORDI (tmp_rhs, SLLDI (ANDDI (GET_H_GR (FLD (f_right)), tmp_mask), tmp_count));
3204 SET_H_GR (FLD (f_dest), opval);
3205 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3206 }
3207 }
3208
3209 return vpc;
3210 #undef FLD
3211 }
3212
3213 /* mextr3: mextr3 $rm, $rn, $rd */
3214
3215 static SEM_PC
3216 SEM_FN_NAME (sh64_media,mextr3) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3217 {
3218 #define FLD(f) abuf->fields.sfmt_add.f
3219 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3220 int UNUSED written = 0;
3221 IADDR UNUSED pc = abuf->addr;
3222 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3223
3224 {
3225 QI tmp_count;
3226 DI tmp_mask;
3227 DI tmp_rhs;
3228 tmp_count = MULQI (8, 3);
3229 tmp_mask = SLLDI (INVSI (0), tmp_count);
3230 tmp_rhs = SRLDI (ANDDI (GET_H_GR (FLD (f_left)), tmp_mask), tmp_count);
3231 tmp_count = MULQI (8, SUBQI (8, 3));
3232 tmp_mask = SRLDI (INVSI (0), tmp_count);
3233 {
3234 DI opval = ORDI (tmp_rhs, SLLDI (ANDDI (GET_H_GR (FLD (f_right)), tmp_mask), tmp_count));
3235 SET_H_GR (FLD (f_dest), opval);
3236 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3237 }
3238 }
3239
3240 return vpc;
3241 #undef FLD
3242 }
3243
3244 /* mextr4: mextr4 $rm, $rn, $rd */
3245
3246 static SEM_PC
3247 SEM_FN_NAME (sh64_media,mextr4) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3248 {
3249 #define FLD(f) abuf->fields.sfmt_add.f
3250 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3251 int UNUSED written = 0;
3252 IADDR UNUSED pc = abuf->addr;
3253 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3254
3255 {
3256 QI tmp_count;
3257 DI tmp_mask;
3258 DI tmp_rhs;
3259 tmp_count = MULQI (8, 4);
3260 tmp_mask = SLLDI (INVSI (0), tmp_count);
3261 tmp_rhs = SRLDI (ANDDI (GET_H_GR (FLD (f_left)), tmp_mask), tmp_count);
3262 tmp_count = MULQI (8, SUBQI (8, 4));
3263 tmp_mask = SRLDI (INVSI (0), tmp_count);
3264 {
3265 DI opval = ORDI (tmp_rhs, SLLDI (ANDDI (GET_H_GR (FLD (f_right)), tmp_mask), tmp_count));
3266 SET_H_GR (FLD (f_dest), opval);
3267 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3268 }
3269 }
3270
3271 return vpc;
3272 #undef FLD
3273 }
3274
3275 /* mextr5: mextr5 $rm, $rn, $rd */
3276
3277 static SEM_PC
3278 SEM_FN_NAME (sh64_media,mextr5) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3279 {
3280 #define FLD(f) abuf->fields.sfmt_add.f
3281 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3282 int UNUSED written = 0;
3283 IADDR UNUSED pc = abuf->addr;
3284 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3285
3286 {
3287 QI tmp_count;
3288 DI tmp_mask;
3289 DI tmp_rhs;
3290 tmp_count = MULQI (8, 5);
3291 tmp_mask = SLLDI (INVSI (0), tmp_count);
3292 tmp_rhs = SRLDI (ANDDI (GET_H_GR (FLD (f_left)), tmp_mask), tmp_count);
3293 tmp_count = MULQI (8, SUBQI (8, 5));
3294 tmp_mask = SRLDI (INVSI (0), tmp_count);
3295 {
3296 DI opval = ORDI (tmp_rhs, SLLDI (ANDDI (GET_H_GR (FLD (f_right)), tmp_mask), tmp_count));
3297 SET_H_GR (FLD (f_dest), opval);
3298 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3299 }
3300 }
3301
3302 return vpc;
3303 #undef FLD
3304 }
3305
3306 /* mextr6: mextr6 $rm, $rn, $rd */
3307
3308 static SEM_PC
3309 SEM_FN_NAME (sh64_media,mextr6) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3310 {
3311 #define FLD(f) abuf->fields.sfmt_add.f
3312 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3313 int UNUSED written = 0;
3314 IADDR UNUSED pc = abuf->addr;
3315 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3316
3317 {
3318 QI tmp_count;
3319 DI tmp_mask;
3320 DI tmp_rhs;
3321 tmp_count = MULQI (8, 6);
3322 tmp_mask = SLLDI (INVSI (0), tmp_count);
3323 tmp_rhs = SRLDI (ANDDI (GET_H_GR (FLD (f_left)), tmp_mask), tmp_count);
3324 tmp_count = MULQI (8, SUBQI (8, 6));
3325 tmp_mask = SRLDI (INVSI (0), tmp_count);
3326 {
3327 DI opval = ORDI (tmp_rhs, SLLDI (ANDDI (GET_H_GR (FLD (f_right)), tmp_mask), tmp_count));
3328 SET_H_GR (FLD (f_dest), opval);
3329 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3330 }
3331 }
3332
3333 return vpc;
3334 #undef FLD
3335 }
3336
3337 /* mextr7: mextr7 $rm, $rn, $rd */
3338
3339 static SEM_PC
3340 SEM_FN_NAME (sh64_media,mextr7) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3341 {
3342 #define FLD(f) abuf->fields.sfmt_add.f
3343 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3344 int UNUSED written = 0;
3345 IADDR UNUSED pc = abuf->addr;
3346 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3347
3348 {
3349 QI tmp_count;
3350 DI tmp_mask;
3351 DI tmp_rhs;
3352 tmp_count = MULQI (8, 7);
3353 tmp_mask = SLLDI (INVSI (0), tmp_count);
3354 tmp_rhs = SRLDI (ANDDI (GET_H_GR (FLD (f_left)), tmp_mask), tmp_count);
3355 tmp_count = MULQI (8, SUBQI (8, 7));
3356 tmp_mask = SRLDI (INVSI (0), tmp_count);
3357 {
3358 DI opval = ORDI (tmp_rhs, SLLDI (ANDDI (GET_H_GR (FLD (f_right)), tmp_mask), tmp_count));
3359 SET_H_GR (FLD (f_dest), opval);
3360 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3361 }
3362 }
3363
3364 return vpc;
3365 #undef FLD
3366 }
3367
3368 /* mmacfxwl: mmacfx.wl $rm, $rn, $rd */
3369
3370 static SEM_PC
3371 SEM_FN_NAME (sh64_media,mmacfxwl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3372 {
3373 #define FLD(f) abuf->fields.sfmt_add.f
3374 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3375 int UNUSED written = 0;
3376 IADDR UNUSED pc = abuf->addr;
3377 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3378
3379 {
3380 SI tmp_temp;
3381 SI tmp_result1;
3382 SI tmp_result0;
3383 tmp_result0 = SUBWORDDISI (GET_H_GR (FLD (f_dest)), 1);
3384 tmp_result1 = SUBWORDDISI (GET_H_GR (FLD (f_dest)), 0);
3385 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3)));
3386 tmp_temp = ((LTDI (SLLDI (tmp_temp, 1), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SLLDI (tmp_temp, 1), SLLDI (1, SUBSI (32, 1)))) ? (SLLDI (tmp_temp, 1)) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3387 tmp_result0 = ((LTDI (ADDDI (EXTSIDI (tmp_result0), EXTSIDI (tmp_temp)), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (ADDDI (EXTSIDI (tmp_result0), EXTSIDI (tmp_temp)), SLLDI (1, SUBSI (32, 1)))) ? (ADDDI (EXTSIDI (tmp_result0), EXTSIDI (tmp_temp))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3388 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2)));
3389 tmp_temp = ((LTDI (SLLDI (tmp_temp, 1), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SLLDI (tmp_temp, 1), SLLDI (1, SUBSI (32, 1)))) ? (SLLDI (tmp_temp, 1)) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3390 tmp_result1 = ((LTDI (ADDDI (EXTSIDI (tmp_result1), EXTSIDI (tmp_temp)), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (ADDDI (EXTSIDI (tmp_result1), EXTSIDI (tmp_temp)), SLLDI (1, SUBSI (32, 1)))) ? (ADDDI (EXTSIDI (tmp_result1), EXTSIDI (tmp_temp))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3391 {
3392 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3393 SET_H_GR (FLD (f_dest), opval);
3394 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3395 }
3396 }
3397
3398 return vpc;
3399 #undef FLD
3400 }
3401
3402 /* mmacnfx.wl: mmacnfx.wl $rm, $rn, $rd */
3403
3404 static SEM_PC
3405 SEM_FN_NAME (sh64_media,mmacnfx_wl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3406 {
3407 #define FLD(f) abuf->fields.sfmt_add.f
3408 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3409 int UNUSED written = 0;
3410 IADDR UNUSED pc = abuf->addr;
3411 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3412
3413 {
3414 SI tmp_temp;
3415 SI tmp_result1;
3416 SI tmp_result0;
3417 tmp_result0 = SUBWORDDISI (GET_H_GR (FLD (f_dest)), 1);
3418 tmp_result1 = SUBWORDDISI (GET_H_GR (FLD (f_dest)), 0);
3419 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3)));
3420 tmp_temp = ((LTDI (SLLDI (tmp_temp, 1), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SLLDI (tmp_temp, 1), SLLDI (1, SUBSI (32, 1)))) ? (SLLDI (tmp_temp, 1)) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3421 tmp_result0 = ((LTDI (SUBDI (EXTSIDI (tmp_result0), EXTSIDI (tmp_temp)), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SUBDI (EXTSIDI (tmp_result0), EXTSIDI (tmp_temp)), SLLDI (1, SUBSI (32, 1)))) ? (SUBDI (EXTSIDI (tmp_result0), EXTSIDI (tmp_temp))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3422 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2)));
3423 tmp_temp = ((LTDI (SLLDI (tmp_temp, 1), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SLLDI (tmp_temp, 1), SLLDI (1, SUBSI (32, 1)))) ? (SLLDI (tmp_temp, 1)) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3424 tmp_result1 = ((LTDI (SUBDI (EXTSIDI (tmp_result1), EXTSIDI (tmp_temp)), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SUBDI (EXTSIDI (tmp_result1), EXTSIDI (tmp_temp)), SLLDI (1, SUBSI (32, 1)))) ? (SUBDI (EXTSIDI (tmp_result1), EXTSIDI (tmp_temp))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3425 {
3426 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3427 SET_H_GR (FLD (f_dest), opval);
3428 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3429 }
3430 }
3431
3432 return vpc;
3433 #undef FLD
3434 }
3435
3436 /* mmull: mmul.l $rm, $rn, $rd */
3437
3438 static SEM_PC
3439 SEM_FN_NAME (sh64_media,mmull) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3440 {
3441 #define FLD(f) abuf->fields.sfmt_add.f
3442 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3443 int UNUSED written = 0;
3444 IADDR UNUSED pc = abuf->addr;
3445 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3446
3447 {
3448 SI tmp_result1;
3449 SI tmp_result0;
3450 tmp_result0 = MULSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SUBWORDDISI (GET_H_GR (FLD (f_right)), 1));
3451 tmp_result1 = MULSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), SUBWORDDISI (GET_H_GR (FLD (f_right)), 0));
3452 {
3453 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3454 SET_H_GR (FLD (f_dest), opval);
3455 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3456 }
3457 }
3458
3459 return vpc;
3460 #undef FLD
3461 }
3462
3463 /* mmulw: mmul.w $rm, $rn, $rd */
3464
3465 static SEM_PC
3466 SEM_FN_NAME (sh64_media,mmulw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3467 {
3468 #define FLD(f) abuf->fields.sfmt_add.f
3469 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3470 int UNUSED written = 0;
3471 IADDR UNUSED pc = abuf->addr;
3472 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3473
3474 {
3475 HI tmp_result3;
3476 HI tmp_result2;
3477 HI tmp_result1;
3478 HI tmp_result0;
3479 tmp_result0 = MULHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3));
3480 tmp_result1 = MULHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2));
3481 tmp_result2 = MULHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1));
3482 tmp_result3 = MULHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0));
3483 {
3484 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3485 SET_H_GR (FLD (f_dest), opval);
3486 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3487 }
3488 }
3489
3490 return vpc;
3491 #undef FLD
3492 }
3493
3494 /* mmulfxl: mmulfx.l $rm, $rn, $rd */
3495
3496 static SEM_PC
3497 SEM_FN_NAME (sh64_media,mmulfxl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3498 {
3499 #define FLD(f) abuf->fields.sfmt_add.f
3500 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3501 int UNUSED written = 0;
3502 IADDR UNUSED pc = abuf->addr;
3503 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3504
3505 {
3506 DI tmp_temp;
3507 SI tmp_result0;
3508 SI tmp_result1;
3509 tmp_temp = MULDI (ZEXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), ZEXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1)));
3510 tmp_result0 = ((LTDI (SRADI (tmp_temp, 31), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SRADI (tmp_temp, 31), SLLDI (1, SUBSI (32, 1)))) ? (SRADI (tmp_temp, 31)) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3511 tmp_temp = MULDI (ZEXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0)), ZEXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0)));
3512 tmp_result1 = ((LTDI (SRADI (tmp_temp, 31), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SRADI (tmp_temp, 31), SLLDI (1, SUBSI (32, 1)))) ? (SRADI (tmp_temp, 31)) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3513 {
3514 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3515 SET_H_GR (FLD (f_dest), opval);
3516 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3517 }
3518 }
3519
3520 return vpc;
3521 #undef FLD
3522 }
3523
3524 /* mmulfxw: mmulfx.w $rm, $rn, $rd */
3525
3526 static SEM_PC
3527 SEM_FN_NAME (sh64_media,mmulfxw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3528 {
3529 #define FLD(f) abuf->fields.sfmt_add.f
3530 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3531 int UNUSED written = 0;
3532 IADDR UNUSED pc = abuf->addr;
3533 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3534
3535 {
3536 SI tmp_temp;
3537 HI tmp_result0;
3538 HI tmp_result1;
3539 HI tmp_result2;
3540 HI tmp_result3;
3541 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3)));
3542 tmp_result0 = ((LTSI (SRASI (tmp_temp, 15), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SRASI (tmp_temp, 15), SLLDI (1, SUBSI (16, 1)))) ? (SRASI (tmp_temp, 15)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3543 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2)));
3544 tmp_result1 = ((LTSI (SRASI (tmp_temp, 15), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SRASI (tmp_temp, 15), SLLDI (1, SUBSI (16, 1)))) ? (SRASI (tmp_temp, 15)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3545 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1)));
3546 tmp_result2 = ((LTSI (SRASI (tmp_temp, 15), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SRASI (tmp_temp, 15), SLLDI (1, SUBSI (16, 1)))) ? (SRASI (tmp_temp, 15)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3547 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0)));
3548 tmp_result3 = ((LTSI (SRASI (tmp_temp, 15), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SRASI (tmp_temp, 15), SLLDI (1, SUBSI (16, 1)))) ? (SRASI (tmp_temp, 15)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3549 {
3550 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3551 SET_H_GR (FLD (f_dest), opval);
3552 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3553 }
3554 }
3555
3556 return vpc;
3557 #undef FLD
3558 }
3559
3560 /* mmulfxrpw: mmulfxrp.w $rm, $rn, $rd */
3561
3562 static SEM_PC
3563 SEM_FN_NAME (sh64_media,mmulfxrpw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3564 {
3565 #define FLD(f) abuf->fields.sfmt_add.f
3566 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3567 int UNUSED written = 0;
3568 IADDR UNUSED pc = abuf->addr;
3569 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3570
3571 {
3572 SI tmp_temp;
3573 HI tmp_result0;
3574 HI tmp_result1;
3575 HI tmp_result2;
3576 HI tmp_result3;
3577 HI tmp_c;
3578 tmp_c = SLLSI (1, 14);
3579 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3)));
3580 tmp_result0 = ((LTSI (SRASI (ADDSI (tmp_temp, tmp_c), 15), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SRASI (ADDSI (tmp_temp, tmp_c), 15), SLLDI (1, SUBSI (16, 1)))) ? (SRASI (ADDSI (tmp_temp, tmp_c), 15)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3581 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2)));
3582 tmp_result1 = ((LTSI (SRASI (ADDSI (tmp_temp, tmp_c), 15), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SRASI (ADDSI (tmp_temp, tmp_c), 15), SLLDI (1, SUBSI (16, 1)))) ? (SRASI (ADDSI (tmp_temp, tmp_c), 15)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3583 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1)));
3584 tmp_result2 = ((LTSI (SRASI (ADDSI (tmp_temp, tmp_c), 15), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SRASI (ADDSI (tmp_temp, tmp_c), 15), SLLDI (1, SUBSI (16, 1)))) ? (SRASI (ADDSI (tmp_temp, tmp_c), 15)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3585 tmp_temp = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0)));
3586 tmp_result3 = ((LTSI (SRASI (ADDSI (tmp_temp, tmp_c), 15), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTSI (SRASI (ADDSI (tmp_temp, tmp_c), 15), SLLDI (1, SUBSI (16, 1)))) ? (SRASI (ADDSI (tmp_temp, tmp_c), 15)) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3587 {
3588 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3589 SET_H_GR (FLD (f_dest), opval);
3590 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3591 }
3592 }
3593
3594 return vpc;
3595 #undef FLD
3596 }
3597
3598 /* mmulhiwl: mmulhi.wl $rm, $rn, $rd */
3599
3600 static SEM_PC
3601 SEM_FN_NAME (sh64_media,mmulhiwl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3602 {
3603 #define FLD(f) abuf->fields.sfmt_add.f
3604 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3605 int UNUSED written = 0;
3606 IADDR UNUSED pc = abuf->addr;
3607 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3608
3609 {
3610 SI tmp_result1;
3611 SI tmp_result0;
3612 tmp_result0 = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1)));
3613 tmp_result1 = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0)));
3614 {
3615 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3616 SET_H_GR (FLD (f_dest), opval);
3617 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3618 }
3619 }
3620
3621 return vpc;
3622 #undef FLD
3623 }
3624
3625 /* mmullowl: mmullo.wl $rm, $rn, $rd */
3626
3627 static SEM_PC
3628 SEM_FN_NAME (sh64_media,mmullowl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3629 {
3630 #define FLD(f) abuf->fields.sfmt_add.f
3631 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3632 int UNUSED written = 0;
3633 IADDR UNUSED pc = abuf->addr;
3634 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3635
3636 {
3637 SI tmp_result1;
3638 SI tmp_result0;
3639 tmp_result0 = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3)));
3640 tmp_result1 = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2)));
3641 {
3642 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3643 SET_H_GR (FLD (f_dest), opval);
3644 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3645 }
3646 }
3647
3648 return vpc;
3649 #undef FLD
3650 }
3651
3652 /* mmulsumwq: mmulsum.wq $rm, $rn, $rd */
3653
3654 static SEM_PC
3655 SEM_FN_NAME (sh64_media,mmulsumwq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3656 {
3657 #define FLD(f) abuf->fields.sfmt_add.f
3658 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3659 int UNUSED written = 0;
3660 IADDR UNUSED pc = abuf->addr;
3661 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3662
3663 {
3664 DI tmp_acc;
3665 tmp_acc = MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0)));
3666 tmp_acc = ADDDI (tmp_acc, MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1))));
3667 tmp_acc = ADDDI (tmp_acc, MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2))));
3668 tmp_acc = ADDDI (tmp_acc, MULSI (ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3)), ZEXTHISI (SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3))));
3669 {
3670 DI opval = ADDDI (GET_H_GR (FLD (f_dest)), tmp_acc);
3671 SET_H_GR (FLD (f_dest), opval);
3672 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3673 }
3674 }
3675
3676 return vpc;
3677 #undef FLD
3678 }
3679
3680 /* movi: movi $imm16, $rd */
3681
3682 static SEM_PC
3683 SEM_FN_NAME (sh64_media,movi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3684 {
3685 #define FLD(f) abuf->fields.sfmt_movi.f
3686 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3687 int UNUSED written = 0;
3688 IADDR UNUSED pc = abuf->addr;
3689 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3690
3691 {
3692 DI opval = EXTSIDI (FLD (f_imm16));
3693 SET_H_GR (FLD (f_dest), opval);
3694 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3695 }
3696
3697 return vpc;
3698 #undef FLD
3699 }
3700
3701 /* mpermw: mperm.w $rm, $rn, $rd */
3702
3703 static SEM_PC
3704 SEM_FN_NAME (sh64_media,mpermw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3705 {
3706 #define FLD(f) abuf->fields.sfmt_add.f
3707 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3708 int UNUSED written = 0;
3709 IADDR UNUSED pc = abuf->addr;
3710 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3711
3712 {
3713 QI tmp_control;
3714 HI tmp_result3;
3715 HI tmp_result2;
3716 HI tmp_result1;
3717 HI tmp_result0;
3718 tmp_control = ANDQI (GET_H_GR (FLD (f_right)), 255);
3719 tmp_result0 = SUBWORDDIHI (GET_H_GR (FLD (f_left)), SUBSI (3, ANDQI (tmp_control, 3)));
3720 tmp_result1 = SUBWORDDIHI (GET_H_GR (FLD (f_left)), SUBSI (3, ANDQI (SRLQI (tmp_control, 2), 3)));
3721 tmp_result2 = SUBWORDDIHI (GET_H_GR (FLD (f_left)), SUBSI (3, ANDQI (SRLQI (tmp_control, 4), 3)));
3722 tmp_result3 = SUBWORDDIHI (GET_H_GR (FLD (f_left)), SUBSI (3, ANDQI (SRLQI (tmp_control, 6), 3)));
3723 {
3724 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3725 SET_H_GR (FLD (f_dest), opval);
3726 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3727 }
3728 }
3729
3730 return vpc;
3731 #undef FLD
3732 }
3733
3734 /* msadubq: msad.ubq $rm, $rn, $rd */
3735
3736 static SEM_PC
3737 SEM_FN_NAME (sh64_media,msadubq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3738 {
3739 #define FLD(f) abuf->fields.sfmt_add.f
3740 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3741 int UNUSED written = 0;
3742 IADDR UNUSED pc = abuf->addr;
3743 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3744
3745 {
3746 DI tmp_acc;
3747 tmp_acc = ABSDI (SUBQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0)));
3748 tmp_acc = ADDDI (tmp_acc, ABSQI (SUBQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))));
3749 tmp_acc = ADDDI (tmp_acc, ABSQI (SUBQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))));
3750 tmp_acc = ADDDI (tmp_acc, ABSQI (SUBQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))));
3751 tmp_acc = ADDDI (tmp_acc, ABSQI (SUBQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))));
3752 tmp_acc = ADDDI (tmp_acc, ABSQI (SUBQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))));
3753 tmp_acc = ADDDI (tmp_acc, ABSQI (SUBQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))));
3754 tmp_acc = ADDDI (tmp_acc, ABSQI (SUBQI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7), SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))));
3755 {
3756 DI opval = ADDDI (GET_H_GR (FLD (f_dest)), tmp_acc);
3757 SET_H_GR (FLD (f_dest), opval);
3758 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3759 }
3760 }
3761
3762 return vpc;
3763 #undef FLD
3764 }
3765
3766 /* mshaldsl: mshalds.l $rm, $rn, $rd */
3767
3768 static SEM_PC
3769 SEM_FN_NAME (sh64_media,mshaldsl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3770 {
3771 #define FLD(f) abuf->fields.sfmt_add.f
3772 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3773 int UNUSED written = 0;
3774 IADDR UNUSED pc = abuf->addr;
3775 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3776
3777 {
3778 SI tmp_result1;
3779 SI tmp_result0;
3780 tmp_result0 = ((LTDI (SLLDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 31)), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SLLDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 31)), SLLDI (1, SUBSI (32, 1)))) ? (SLLDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 31))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3781 tmp_result1 = ((LTDI (SLLDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 31)), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SLLDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 31)), SLLDI (1, SUBSI (32, 1)))) ? (SLLDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 31))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
3782 {
3783 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3784 SET_H_GR (FLD (f_dest), opval);
3785 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3786 }
3787 }
3788
3789 return vpc;
3790 #undef FLD
3791 }
3792
3793 /* mshaldsw: mshalds.w $rm, $rn, $rd */
3794
3795 static SEM_PC
3796 SEM_FN_NAME (sh64_media,mshaldsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3797 {
3798 #define FLD(f) abuf->fields.sfmt_add.f
3799 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3800 int UNUSED written = 0;
3801 IADDR UNUSED pc = abuf->addr;
3802 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3803
3804 {
3805 HI tmp_result3;
3806 HI tmp_result2;
3807 HI tmp_result1;
3808 HI tmp_result0;
3809 tmp_result0 = ((LTDI (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), ANDDI (GET_H_GR (FLD (f_right)), 15)), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), ANDDI (GET_H_GR (FLD (f_right)), 15)), SLLDI (1, SUBSI (16, 1)))) ? (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), ANDDI (GET_H_GR (FLD (f_right)), 15))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3810 tmp_result1 = ((LTDI (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), ANDDI (GET_H_GR (FLD (f_right)), 15)), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), ANDDI (GET_H_GR (FLD (f_right)), 15)), SLLDI (1, SUBSI (16, 1)))) ? (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), ANDDI (GET_H_GR (FLD (f_right)), 15))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3811 tmp_result2 = ((LTDI (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 15)), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 15)), SLLDI (1, SUBSI (16, 1)))) ? (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 15))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3812 tmp_result3 = ((LTDI (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 15)), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 15)), SLLDI (1, SUBSI (16, 1)))) ? (SLLDI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 15))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
3813 {
3814 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3815 SET_H_GR (FLD (f_dest), opval);
3816 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3817 }
3818 }
3819
3820 return vpc;
3821 #undef FLD
3822 }
3823
3824 /* mshardl: mshard.l $rm, $rn, $rd */
3825
3826 static SEM_PC
3827 SEM_FN_NAME (sh64_media,mshardl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3828 {
3829 #define FLD(f) abuf->fields.sfmt_add.f
3830 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3831 int UNUSED written = 0;
3832 IADDR UNUSED pc = abuf->addr;
3833 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3834
3835 {
3836 SI tmp_result1;
3837 SI tmp_result0;
3838 tmp_result0 = SRASI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 31));
3839 tmp_result1 = SRASI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 31));
3840 {
3841 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3842 SET_H_GR (FLD (f_dest), opval);
3843 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3844 }
3845 }
3846
3847 return vpc;
3848 #undef FLD
3849 }
3850
3851 /* mshardw: mshard.w $rm, $rn, $rd */
3852
3853 static SEM_PC
3854 SEM_FN_NAME (sh64_media,mshardw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3855 {
3856 #define FLD(f) abuf->fields.sfmt_add.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, 4);
3861
3862 {
3863 HI tmp_result3;
3864 HI tmp_result2;
3865 HI tmp_result1;
3866 HI tmp_result0;
3867 tmp_result0 = SRAHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), ANDDI (GET_H_GR (FLD (f_right)), 15));
3868 tmp_result1 = SRAHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), ANDDI (GET_H_GR (FLD (f_right)), 15));
3869 tmp_result2 = SRAHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 15));
3870 tmp_result3 = SRAHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 15));
3871 {
3872 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3873 SET_H_GR (FLD (f_dest), opval);
3874 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3875 }
3876 }
3877
3878 return vpc;
3879 #undef FLD
3880 }
3881
3882 /* mshardsq: mshards.q $rm, $rn, $rd */
3883
3884 static SEM_PC
3885 SEM_FN_NAME (sh64_media,mshardsq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3886 {
3887 #define FLD(f) abuf->fields.sfmt_add.f
3888 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3889 int UNUSED written = 0;
3890 IADDR UNUSED pc = abuf->addr;
3891 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3892
3893 {
3894 DI opval = ((LTDI (SRADI (GET_H_GR (FLD (f_left)), ANDDI (GET_H_GR (FLD (f_right)), 63)), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGDI (SLLDI (1, SUBSI (16, 1)))) : (((LTDI (SRADI (GET_H_GR (FLD (f_left)), ANDDI (GET_H_GR (FLD (f_right)), 63)), SLLDI (1, SUBSI (16, 1)))) ? (SRADI (GET_H_GR (FLD (f_left)), ANDDI (GET_H_GR (FLD (f_right)), 63))) : (SUBDI (SLLDI (1, SUBSI (16, 1)), 1)))));
3895 SET_H_GR (FLD (f_dest), opval);
3896 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3897 }
3898
3899 return vpc;
3900 #undef FLD
3901 }
3902
3903 /* mshfhib: mshfhi.b $rm, $rn, $rd */
3904
3905 static SEM_PC
3906 SEM_FN_NAME (sh64_media,mshfhib) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3907 {
3908 #define FLD(f) abuf->fields.sfmt_add.f
3909 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3910 int UNUSED written = 0;
3911 IADDR UNUSED pc = abuf->addr;
3912 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3913
3914 {
3915 QI tmp_result7;
3916 QI tmp_result6;
3917 QI tmp_result5;
3918 QI tmp_result4;
3919 QI tmp_result3;
3920 QI tmp_result2;
3921 QI tmp_result1;
3922 QI tmp_result0;
3923 tmp_result0 = SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3);
3924 tmp_result1 = SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3);
3925 tmp_result2 = SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2);
3926 tmp_result3 = SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2);
3927 tmp_result4 = SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1);
3928 tmp_result5 = SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1);
3929 tmp_result6 = SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0);
3930 tmp_result7 = SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0);
3931 {
3932 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
3933 SET_H_GR (FLD (f_dest), opval);
3934 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3935 }
3936 }
3937
3938 return vpc;
3939 #undef FLD
3940 }
3941
3942 /* mshfhil: mshfhi.l $rm, $rn, $rd */
3943
3944 static SEM_PC
3945 SEM_FN_NAME (sh64_media,mshfhil) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3946 {
3947 #define FLD(f) abuf->fields.sfmt_add.f
3948 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3949 int UNUSED written = 0;
3950 IADDR UNUSED pc = abuf->addr;
3951 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3952
3953 {
3954 SI tmp_result1;
3955 SI tmp_result0;
3956 tmp_result0 = SUBWORDDISI (GET_H_GR (FLD (f_left)), 0);
3957 tmp_result1 = SUBWORDDISI (GET_H_GR (FLD (f_right)), 0);
3958 {
3959 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
3960 SET_H_GR (FLD (f_dest), opval);
3961 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3962 }
3963 }
3964
3965 return vpc;
3966 #undef FLD
3967 }
3968
3969 /* mshfhiw: mshfhi.w $rm, $rn, $rd */
3970
3971 static SEM_PC
3972 SEM_FN_NAME (sh64_media,mshfhiw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
3973 {
3974 #define FLD(f) abuf->fields.sfmt_add.f
3975 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3976 int UNUSED written = 0;
3977 IADDR UNUSED pc = abuf->addr;
3978 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
3979
3980 {
3981 HI tmp_result3;
3982 HI tmp_result2;
3983 HI tmp_result1;
3984 HI tmp_result0;
3985 tmp_result0 = SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1);
3986 tmp_result1 = SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1);
3987 tmp_result2 = SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0);
3988 tmp_result3 = SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0);
3989 {
3990 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
3991 SET_H_GR (FLD (f_dest), opval);
3992 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
3993 }
3994 }
3995
3996 return vpc;
3997 #undef FLD
3998 }
3999
4000 /* mshflob: mshflo.b $rm, $rn, $rd */
4001
4002 static SEM_PC
4003 SEM_FN_NAME (sh64_media,mshflob) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4004 {
4005 #define FLD(f) abuf->fields.sfmt_add.f
4006 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4007 int UNUSED written = 0;
4008 IADDR UNUSED pc = abuf->addr;
4009 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4010
4011 {
4012 QI tmp_result7;
4013 QI tmp_result6;
4014 QI tmp_result5;
4015 QI tmp_result4;
4016 QI tmp_result3;
4017 QI tmp_result2;
4018 QI tmp_result1;
4019 QI tmp_result0;
4020 tmp_result0 = SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7);
4021 tmp_result1 = SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7);
4022 tmp_result2 = SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6);
4023 tmp_result3 = SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6);
4024 tmp_result4 = SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5);
4025 tmp_result5 = SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5);
4026 tmp_result6 = SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4);
4027 tmp_result7 = SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4);
4028 {
4029 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
4030 SET_H_GR (FLD (f_dest), opval);
4031 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4032 }
4033 }
4034
4035 return vpc;
4036 #undef FLD
4037 }
4038
4039 /* mshflol: mshflo.l $rm, $rn, $rd */
4040
4041 static SEM_PC
4042 SEM_FN_NAME (sh64_media,mshflol) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4043 {
4044 #define FLD(f) abuf->fields.sfmt_add.f
4045 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4046 int UNUSED written = 0;
4047 IADDR UNUSED pc = abuf->addr;
4048 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4049
4050 {
4051 SI tmp_result1;
4052 SI tmp_result0;
4053 tmp_result0 = SUBWORDDISI (GET_H_GR (FLD (f_left)), 1);
4054 tmp_result1 = SUBWORDDISI (GET_H_GR (FLD (f_right)), 1);
4055 {
4056 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
4057 SET_H_GR (FLD (f_dest), opval);
4058 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4059 }
4060 }
4061
4062 return vpc;
4063 #undef FLD
4064 }
4065
4066 /* mshflow: mshflo.w $rm, $rn, $rd */
4067
4068 static SEM_PC
4069 SEM_FN_NAME (sh64_media,mshflow) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4070 {
4071 #define FLD(f) abuf->fields.sfmt_add.f
4072 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4073 int UNUSED written = 0;
4074 IADDR UNUSED pc = abuf->addr;
4075 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4076
4077 {
4078 HI tmp_result3;
4079 HI tmp_result2;
4080 HI tmp_result1;
4081 HI tmp_result0;
4082 tmp_result0 = SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3);
4083 tmp_result1 = SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3);
4084 tmp_result2 = SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2);
4085 tmp_result3 = SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2);
4086 {
4087 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
4088 SET_H_GR (FLD (f_dest), opval);
4089 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4090 }
4091 }
4092
4093 return vpc;
4094 #undef FLD
4095 }
4096
4097 /* mshlldl: mshlld.l $rm, $rn, $rd */
4098
4099 static SEM_PC
4100 SEM_FN_NAME (sh64_media,mshlldl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4101 {
4102 #define FLD(f) abuf->fields.sfmt_add.f
4103 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4104 int UNUSED written = 0;
4105 IADDR UNUSED pc = abuf->addr;
4106 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4107
4108 {
4109 SI tmp_result1;
4110 SI tmp_result0;
4111 tmp_result0 = SLLSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 31));
4112 tmp_result1 = SLLSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 31));
4113 {
4114 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
4115 SET_H_GR (FLD (f_dest), opval);
4116 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4117 }
4118 }
4119
4120 return vpc;
4121 #undef FLD
4122 }
4123
4124 /* mshlldw: mshlld.w $rm, $rn, $rd */
4125
4126 static SEM_PC
4127 SEM_FN_NAME (sh64_media,mshlldw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4128 {
4129 #define FLD(f) abuf->fields.sfmt_add.f
4130 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4131 int UNUSED written = 0;
4132 IADDR UNUSED pc = abuf->addr;
4133 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4134
4135 {
4136 HI tmp_result3;
4137 HI tmp_result2;
4138 HI tmp_result1;
4139 HI tmp_result0;
4140 tmp_result0 = SLLHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), ANDDI (GET_H_GR (FLD (f_right)), 15));
4141 tmp_result1 = SLLHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), ANDDI (GET_H_GR (FLD (f_right)), 15));
4142 tmp_result2 = SLLHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 15));
4143 tmp_result3 = SLLHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 15));
4144 {
4145 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
4146 SET_H_GR (FLD (f_dest), opval);
4147 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4148 }
4149 }
4150
4151 return vpc;
4152 #undef FLD
4153 }
4154
4155 /* mshlrdl: mshlrd.l $rm, $rn, $rd */
4156
4157 static SEM_PC
4158 SEM_FN_NAME (sh64_media,mshlrdl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4159 {
4160 #define FLD(f) abuf->fields.sfmt_add.f
4161 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4162 int UNUSED written = 0;
4163 IADDR UNUSED pc = abuf->addr;
4164 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4165
4166 {
4167 SI tmp_result1;
4168 SI tmp_result0;
4169 tmp_result0 = SRLSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 31));
4170 tmp_result1 = SRLSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 31));
4171 {
4172 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
4173 SET_H_GR (FLD (f_dest), opval);
4174 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4175 }
4176 }
4177
4178 return vpc;
4179 #undef FLD
4180 }
4181
4182 /* mshlrdw: mshlrd.w $rm, $rn, $rd */
4183
4184 static SEM_PC
4185 SEM_FN_NAME (sh64_media,mshlrdw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4186 {
4187 #define FLD(f) abuf->fields.sfmt_add.f
4188 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4189 int UNUSED written = 0;
4190 IADDR UNUSED pc = abuf->addr;
4191 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4192
4193 {
4194 HI tmp_result3;
4195 HI tmp_result2;
4196 HI tmp_result1;
4197 HI tmp_result0;
4198 tmp_result0 = SRLHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), ANDDI (GET_H_GR (FLD (f_right)), 15));
4199 tmp_result1 = SRLHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), ANDDI (GET_H_GR (FLD (f_right)), 15));
4200 tmp_result2 = SRLHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 15));
4201 tmp_result3 = SRLHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), ANDDI (GET_H_GR (FLD (f_right)), 15));
4202 {
4203 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
4204 SET_H_GR (FLD (f_dest), opval);
4205 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4206 }
4207 }
4208
4209 return vpc;
4210 #undef FLD
4211 }
4212
4213 /* msubl: msub.l $rm, $rn, $rd */
4214
4215 static SEM_PC
4216 SEM_FN_NAME (sh64_media,msubl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4217 {
4218 #define FLD(f) abuf->fields.sfmt_add.f
4219 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4220 int UNUSED written = 0;
4221 IADDR UNUSED pc = abuf->addr;
4222 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4223
4224 {
4225 SI tmp_result1;
4226 SI tmp_result0;
4227 tmp_result0 = SUBSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SUBWORDDISI (GET_H_GR (FLD (f_right)), 1));
4228 tmp_result1 = SUBSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0), SUBWORDDISI (GET_H_GR (FLD (f_right)), 0));
4229 {
4230 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
4231 SET_H_GR (FLD (f_dest), opval);
4232 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4233 }
4234 }
4235
4236 return vpc;
4237 #undef FLD
4238 }
4239
4240 /* msubw: msub.w $rm, $rn, $rd */
4241
4242 static SEM_PC
4243 SEM_FN_NAME (sh64_media,msubw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4244 {
4245 #define FLD(f) abuf->fields.sfmt_add.f
4246 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4247 int UNUSED written = 0;
4248 IADDR UNUSED pc = abuf->addr;
4249 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4250
4251 {
4252 HI tmp_result3;
4253 HI tmp_result2;
4254 HI tmp_result1;
4255 HI tmp_result0;
4256 tmp_result0 = SUBHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 3), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 3));
4257 tmp_result1 = SUBHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 2), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 2));
4258 tmp_result2 = SUBHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 1), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 1));
4259 tmp_result3 = SUBHI (SUBWORDDIHI (GET_H_GR (FLD (f_left)), 0), SUBWORDDIHI (GET_H_GR (FLD (f_right)), 0));
4260 {
4261 DI opval = ORDI (SLLDI (ZEXTHIDI (tmp_result3), 48), ORDI (SLLDI (ZEXTHIDI (tmp_result2), 32), ORDI (SLLDI (ZEXTHIDI (tmp_result1), 16), ZEXTHIDI (tmp_result0))));
4262 SET_H_GR (FLD (f_dest), opval);
4263 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4264 }
4265 }
4266
4267 return vpc;
4268 #undef FLD
4269 }
4270
4271 /* msubsl: msubs.l $rm, $rn, $rd */
4272
4273 static SEM_PC
4274 SEM_FN_NAME (sh64_media,msubsl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4275 {
4276 #define FLD(f) abuf->fields.sfmt_add.f
4277 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4278 int UNUSED written = 0;
4279 IADDR UNUSED pc = abuf->addr;
4280 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4281
4282 {
4283 SI tmp_result1;
4284 SI tmp_result0;
4285 tmp_result0 = ((LTDI (SUBDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1))), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SUBDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1))), SLLDI (1, SUBSI (32, 1)))) ? (SUBDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1)))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
4286 tmp_result1 = ((LTDI (SUBDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0))), NEGDI (SLLDI (1, SUBSI (32, 1))))) ? (NEGSI (SLLSI (1, SUBSI (32, 1)))) : (((LTDI (SUBDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0))), SLLDI (1, SUBSI (32, 1)))) ? (SUBDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 0)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 0)))) : (SUBSI (SLLSI (1, SUBSI (32, 1)), 1)))));
4287 {
4288 DI opval = ORDI (SLLDI (ZEXTSIDI (tmp_result1), 32), ZEXTSIDI (tmp_result0));
4289 SET_H_GR (FLD (f_dest), opval);
4290 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4291 }
4292 }
4293
4294 return vpc;
4295 #undef FLD
4296 }
4297
4298 /* msubsub: msubs.ub $rm, $rn, $rd */
4299
4300 static SEM_PC
4301 SEM_FN_NAME (sh64_media,msubsub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4302 {
4303 #define FLD(f) abuf->fields.sfmt_add.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, 4);
4308
4309 {
4310 QI tmp_result7;
4311 QI tmp_result6;
4312 QI tmp_result5;
4313 QI tmp_result4;
4314 QI tmp_result3;
4315 QI tmp_result2;
4316 QI tmp_result1;
4317 QI tmp_result0;
4318 tmp_result0 = ((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))), MAKEDI (0, 0))) ? (0) : (((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))), SLLDI (1, 8))) ? (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7)))) : (SUBQI (SLLQI (1, 8), 1)))));
4319 tmp_result1 = ((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))), MAKEDI (0, 0))) ? (0) : (((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))), SLLDI (1, 8))) ? (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6)))) : (SUBQI (SLLQI (1, 8), 1)))));
4320 tmp_result2 = ((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))), MAKEDI (0, 0))) ? (0) : (((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))), SLLDI (1, 8))) ? (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5)))) : (SUBQI (SLLQI (1, 8), 1)))));
4321 tmp_result3 = ((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))), MAKEDI (0, 0))) ? (0) : (((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))), SLLDI (1, 8))) ? (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4)))) : (SUBQI (SLLQI (1, 8), 1)))));
4322 tmp_result4 = ((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))), MAKEDI (0, 0))) ? (0) : (((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))), SLLDI (1, 8))) ? (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3)))) : (SUBQI (SLLQI (1, 8), 1)))));
4323 tmp_result5 = ((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))), MAKEDI (0, 0))) ? (0) : (((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))), SLLDI (1, 8))) ? (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2)))) : (SUBQI (SLLQI (1, 8), 1)))));
4324 tmp_result6 = ((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))), MAKEDI (0, 0))) ? (0) : (((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))), SLLDI (1, 8))) ? (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1)))) : (SUBQI (SLLQI (1, 8), 1)))));
4325 tmp_result7 = ((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0))), MAKEDI (0, 0))) ? (0) : (((LTDI (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0))), SLLDI (1, 8))) ? (SUBDI (ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), ZEXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0)))) : (SUBQI (SLLQI (1, 8), 1)))));
4326 {
4327 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
4328 SET_H_GR (FLD (f_dest), opval);
4329 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4330 }
4331 }
4332
4333 return vpc;
4334 #undef FLD
4335 }
4336
4337 /* msubsw: msubs.w $rm, $rn, $rd */
4338
4339 static SEM_PC
4340 SEM_FN_NAME (sh64_media,msubsw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4341 {
4342 #define FLD(f) abuf->fields.sfmt_add.f
4343 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4344 int UNUSED written = 0;
4345 IADDR UNUSED pc = abuf->addr;
4346 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4347
4348 {
4349 QI tmp_result7;
4350 QI tmp_result6;
4351 QI tmp_result5;
4352 QI tmp_result4;
4353 QI tmp_result3;
4354 QI tmp_result2;
4355 QI tmp_result1;
4356 QI tmp_result0;
4357 tmp_result0 = ((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7))), SLLDI (1, SUBSI (16, 1)))) ? (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 7)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 7)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
4358 tmp_result1 = ((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6))), SLLDI (1, SUBSI (16, 1)))) ? (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 6)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 6)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
4359 tmp_result2 = ((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5))), SLLDI (1, SUBSI (16, 1)))) ? (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 5)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 5)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
4360 tmp_result3 = ((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4))), SLLDI (1, SUBSI (16, 1)))) ? (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 4)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 4)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
4361 tmp_result4 = ((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3))), SLLDI (1, SUBSI (16, 1)))) ? (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 3)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 3)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
4362 tmp_result5 = ((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2))), SLLDI (1, SUBSI (16, 1)))) ? (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 2)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 2)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
4363 tmp_result6 = ((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1))), SLLDI (1, SUBSI (16, 1)))) ? (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 1)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 1)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
4364 tmp_result7 = ((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0))), NEGDI (SLLDI (1, SUBSI (16, 1))))) ? (NEGHI (SLLHI (1, SUBSI (16, 1)))) : (((LTDI (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0))), SLLDI (1, SUBSI (16, 1)))) ? (SUBDI (EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_left)), 0)), EXTQIDI (SUBWORDDIQI (GET_H_GR (FLD (f_right)), 0)))) : (SUBHI (SLLHI (1, SUBSI (16, 1)), 1)))));
4365 {
4366 DI opval = ORDI (SLLDI (ZEXTQIDI (tmp_result7), 56), ORDI (SLLDI (ZEXTQIDI (tmp_result6), 48), ORDI (SLLDI (ZEXTQIDI (tmp_result5), 40), ORDI (SLLDI (ZEXTQIDI (tmp_result4), 32), ORDI (SLLDI (ZEXTQIDI (tmp_result3), 24), ORDI (SLLDI (ZEXTQIDI (tmp_result2), 16), ORDI (SLLDI (ZEXTQIDI (tmp_result1), 8), ZEXTQIDI (tmp_result0))))))));
4367 SET_H_GR (FLD (f_dest), opval);
4368 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4369 }
4370 }
4371
4372 return vpc;
4373 #undef FLD
4374 }
4375
4376 /* mulsl: muls.l $rm, $rn, $rd */
4377
4378 static SEM_PC
4379 SEM_FN_NAME (sh64_media,mulsl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4380 {
4381 #define FLD(f) abuf->fields.sfmt_add.f
4382 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4383 int UNUSED written = 0;
4384 IADDR UNUSED pc = abuf->addr;
4385 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4386
4387 {
4388 DI opval = MULDI (EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), EXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1)));
4389 SET_H_GR (FLD (f_dest), opval);
4390 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4391 }
4392
4393 return vpc;
4394 #undef FLD
4395 }
4396
4397 /* mulul: mulu.l $rm, $rn, $rd */
4398
4399 static SEM_PC
4400 SEM_FN_NAME (sh64_media,mulul) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4401 {
4402 #define FLD(f) abuf->fields.sfmt_add.f
4403 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4404 int UNUSED written = 0;
4405 IADDR UNUSED pc = abuf->addr;
4406 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4407
4408 {
4409 DI opval = MULDI (ZEXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1)), ZEXTSIDI (SUBWORDDISI (GET_H_GR (FLD (f_right)), 1)));
4410 SET_H_GR (FLD (f_dest), opval);
4411 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4412 }
4413
4414 return vpc;
4415 #undef FLD
4416 }
4417
4418 /* nop: nop */
4419
4420 static SEM_PC
4421 SEM_FN_NAME (sh64_media,nop) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4422 {
4423 #define FLD(f) abuf->fields.fmt_empty.f
4424 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4425 int UNUSED written = 0;
4426 IADDR UNUSED pc = abuf->addr;
4427 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4428
4429 ((void) 0); /*nop*/
4430
4431 return vpc;
4432 #undef FLD
4433 }
4434
4435 /* nsb: nsb $rm, $rd */
4436
4437 static SEM_PC
4438 SEM_FN_NAME (sh64_media,nsb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4439 {
4440 #define FLD(f) abuf->fields.sfmt_xori.f
4441 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4442 int UNUSED written = 0;
4443 IADDR UNUSED pc = abuf->addr;
4444 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4445
4446 {
4447 DI opval = sh64_nsb (current_cpu, GET_H_GR (FLD (f_left)));
4448 SET_H_GR (FLD (f_dest), opval);
4449 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4450 }
4451
4452 return vpc;
4453 #undef FLD
4454 }
4455
4456 /* ocbi: ocbi $rm, $disp6x32 */
4457
4458 static SEM_PC
4459 SEM_FN_NAME (sh64_media,ocbi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4460 {
4461 #define FLD(f) abuf->fields.fmt_empty.f
4462 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4463 int UNUSED written = 0;
4464 IADDR UNUSED pc = abuf->addr;
4465 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4466
4467 ((void) 0); /*nop*/
4468
4469 return vpc;
4470 #undef FLD
4471 }
4472
4473 /* ocbp: ocbp $rm, $disp6x32 */
4474
4475 static SEM_PC
4476 SEM_FN_NAME (sh64_media,ocbp) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4477 {
4478 #define FLD(f) abuf->fields.fmt_empty.f
4479 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4480 int UNUSED written = 0;
4481 IADDR UNUSED pc = abuf->addr;
4482 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4483
4484 ((void) 0); /*nop*/
4485
4486 return vpc;
4487 #undef FLD
4488 }
4489
4490 /* ocbwb: ocbwb $rm, $disp6x32 */
4491
4492 static SEM_PC
4493 SEM_FN_NAME (sh64_media,ocbwb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4494 {
4495 #define FLD(f) abuf->fields.fmt_empty.f
4496 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4497 int UNUSED written = 0;
4498 IADDR UNUSED pc = abuf->addr;
4499 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4500
4501 ((void) 0); /*nop*/
4502
4503 return vpc;
4504 #undef FLD
4505 }
4506
4507 /* or: or $rm, $rn, $rd */
4508
4509 static SEM_PC
4510 SEM_FN_NAME (sh64_media,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4511 {
4512 #define FLD(f) abuf->fields.sfmt_add.f
4513 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4514 int UNUSED written = 0;
4515 IADDR UNUSED pc = abuf->addr;
4516 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4517
4518 {
4519 DI opval = ORDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)));
4520 SET_H_GR (FLD (f_dest), opval);
4521 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4522 }
4523
4524 return vpc;
4525 #undef FLD
4526 }
4527
4528 /* ori: ori $rm, $imm10, $rd */
4529
4530 static SEM_PC
4531 SEM_FN_NAME (sh64_media,ori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4532 {
4533 #define FLD(f) abuf->fields.sfmt_ori.f
4534 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4535 int UNUSED written = 0;
4536 IADDR UNUSED pc = abuf->addr;
4537 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4538
4539 {
4540 DI opval = ORDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_imm10)));
4541 SET_H_GR (FLD (f_dest), opval);
4542 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4543 }
4544
4545 return vpc;
4546 #undef FLD
4547 }
4548
4549 /* prefi: prefi $rm, $disp6x32 */
4550
4551 static SEM_PC
4552 SEM_FN_NAME (sh64_media,prefi) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4553 {
4554 #define FLD(f) abuf->fields.fmt_empty.f
4555 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4556 int UNUSED written = 0;
4557 IADDR UNUSED pc = abuf->addr;
4558 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4559
4560 ((void) 0); /*nop*/
4561
4562 return vpc;
4563 #undef FLD
4564 }
4565
4566 /* pta: pta$likely $disp16, $tra */
4567
4568 static SEM_PC
4569 SEM_FN_NAME (sh64_media,pta) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4570 {
4571 #define FLD(f) abuf->fields.sfmt_pta.f
4572 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4573 int UNUSED written = 0;
4574 IADDR UNUSED pc = abuf->addr;
4575 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4576
4577 {
4578 DI opval = ADDSI (FLD (f_disp16), 1);
4579 CPU (h_tr[FLD (f_tra)]) = opval;
4580 TRACE_RESULT (current_cpu, abuf, "tr", 'D', opval);
4581 }
4582
4583 return vpc;
4584 #undef FLD
4585 }
4586
4587 /* ptabs: ptabs$likely $rn, $tra */
4588
4589 static SEM_PC
4590 SEM_FN_NAME (sh64_media,ptabs) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4591 {
4592 #define FLD(f) abuf->fields.sfmt_beq.f
4593 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4594 int UNUSED written = 0;
4595 IADDR UNUSED pc = abuf->addr;
4596 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4597
4598 {
4599 DI opval = GET_H_GR (FLD (f_right));
4600 CPU (h_tr[FLD (f_tra)]) = opval;
4601 TRACE_RESULT (current_cpu, abuf, "tr", 'D', opval);
4602 }
4603
4604 return vpc;
4605 #undef FLD
4606 }
4607
4608 /* ptb: ptb$likely $disp16, $tra */
4609
4610 static SEM_PC
4611 SEM_FN_NAME (sh64_media,ptb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4612 {
4613 #define FLD(f) abuf->fields.sfmt_pta.f
4614 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4615 int UNUSED written = 0;
4616 IADDR UNUSED pc = abuf->addr;
4617 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4618
4619 {
4620 DI opval = FLD (f_disp16);
4621 CPU (h_tr[FLD (f_tra)]) = opval;
4622 TRACE_RESULT (current_cpu, abuf, "tr", 'D', opval);
4623 }
4624
4625 return vpc;
4626 #undef FLD
4627 }
4628
4629 /* ptrel: ptrel$likely $rn, $tra */
4630
4631 static SEM_PC
4632 SEM_FN_NAME (sh64_media,ptrel) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4633 {
4634 #define FLD(f) abuf->fields.sfmt_beq.f
4635 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4636 int UNUSED written = 0;
4637 IADDR UNUSED pc = abuf->addr;
4638 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4639
4640 {
4641 DI opval = ADDDI (pc, GET_H_GR (FLD (f_right)));
4642 CPU (h_tr[FLD (f_tra)]) = opval;
4643 TRACE_RESULT (current_cpu, abuf, "tr", 'D', opval);
4644 }
4645
4646 return vpc;
4647 #undef FLD
4648 }
4649
4650 /* putcfg: putcfg $rm, $disp6, $rd */
4651
4652 static SEM_PC
4653 SEM_FN_NAME (sh64_media,putcfg) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4654 {
4655 #define FLD(f) abuf->fields.fmt_empty.f
4656 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4657 int UNUSED written = 0;
4658 IADDR UNUSED pc = abuf->addr;
4659 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4660
4661 ((void) 0); /*nop*/
4662
4663 return vpc;
4664 #undef FLD
4665 }
4666
4667 /* putcon: putcon $rm, $crj */
4668
4669 static SEM_PC
4670 SEM_FN_NAME (sh64_media,putcon) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4671 {
4672 #define FLD(f) abuf->fields.sfmt_xori.f
4673 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4674 int UNUSED written = 0;
4675 IADDR UNUSED pc = abuf->addr;
4676 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4677
4678 {
4679 DI opval = GET_H_GR (FLD (f_left));
4680 SET_H_CR (FLD (f_dest), opval);
4681 TRACE_RESULT (current_cpu, abuf, "cr", 'D', opval);
4682 }
4683
4684 return vpc;
4685 #undef FLD
4686 }
4687
4688 /* rte: rte */
4689
4690 static SEM_PC
4691 SEM_FN_NAME (sh64_media,rte) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4692 {
4693 #define FLD(f) abuf->fields.fmt_empty.f
4694 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4695 int UNUSED written = 0;
4696 IADDR UNUSED pc = abuf->addr;
4697 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4698
4699 ((void) 0); /*nop*/
4700
4701 return vpc;
4702 #undef FLD
4703 }
4704
4705 /* shard: shard $rm, $rn, $rd */
4706
4707 static SEM_PC
4708 SEM_FN_NAME (sh64_media,shard) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4709 {
4710 #define FLD(f) abuf->fields.sfmt_add.f
4711 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4712 int UNUSED written = 0;
4713 IADDR UNUSED pc = abuf->addr;
4714 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4715
4716 {
4717 DI opval = SRADI (GET_H_GR (FLD (f_left)), ANDDI (GET_H_GR (FLD (f_right)), 63));
4718 SET_H_GR (FLD (f_dest), opval);
4719 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4720 }
4721
4722 return vpc;
4723 #undef FLD
4724 }
4725
4726 /* shardl: shard.l $rm, $rn, $rd */
4727
4728 static SEM_PC
4729 SEM_FN_NAME (sh64_media,shardl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4730 {
4731 #define FLD(f) abuf->fields.sfmt_add.f
4732 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4733 int UNUSED written = 0;
4734 IADDR UNUSED pc = abuf->addr;
4735 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4736
4737 {
4738 DI opval = EXTSIDI (SRASI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 63)));
4739 SET_H_GR (FLD (f_dest), opval);
4740 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4741 }
4742
4743 return vpc;
4744 #undef FLD
4745 }
4746
4747 /* shari: shari $rm, $uimm6, $rd */
4748
4749 static SEM_PC
4750 SEM_FN_NAME (sh64_media,shari) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4751 {
4752 #define FLD(f) abuf->fields.sfmt_shari.f
4753 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4754 int UNUSED written = 0;
4755 IADDR UNUSED pc = abuf->addr;
4756 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4757
4758 {
4759 DI opval = SRADI (GET_H_GR (FLD (f_left)), FLD (f_uimm6));
4760 SET_H_GR (FLD (f_dest), opval);
4761 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4762 }
4763
4764 return vpc;
4765 #undef FLD
4766 }
4767
4768 /* sharil: shari.l $rm, $uimm6, $rd */
4769
4770 static SEM_PC
4771 SEM_FN_NAME (sh64_media,sharil) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4772 {
4773 #define FLD(f) abuf->fields.sfmt_shari.f
4774 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4775 int UNUSED written = 0;
4776 IADDR UNUSED pc = abuf->addr;
4777 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4778
4779 {
4780 DI opval = EXTSIDI (SRASI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDSI (FLD (f_uimm6), 63)));
4781 SET_H_GR (FLD (f_dest), opval);
4782 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4783 }
4784
4785 return vpc;
4786 #undef FLD
4787 }
4788
4789 /* shlld: shlld $rm, $rn, $rd */
4790
4791 static SEM_PC
4792 SEM_FN_NAME (sh64_media,shlld) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4793 {
4794 #define FLD(f) abuf->fields.sfmt_add.f
4795 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4796 int UNUSED written = 0;
4797 IADDR UNUSED pc = abuf->addr;
4798 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4799
4800 {
4801 DI opval = SLLDI (GET_H_GR (FLD (f_left)), ANDDI (GET_H_GR (FLD (f_right)), 63));
4802 SET_H_GR (FLD (f_dest), opval);
4803 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4804 }
4805
4806 return vpc;
4807 #undef FLD
4808 }
4809
4810 /* shlldl: shlld.l $rm, $rn, $rd */
4811
4812 static SEM_PC
4813 SEM_FN_NAME (sh64_media,shlldl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4814 {
4815 #define FLD(f) abuf->fields.sfmt_add.f
4816 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4817 int UNUSED written = 0;
4818 IADDR UNUSED pc = abuf->addr;
4819 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4820
4821 {
4822 DI opval = EXTSIDI (SLLSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 63)));
4823 SET_H_GR (FLD (f_dest), opval);
4824 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4825 }
4826
4827 return vpc;
4828 #undef FLD
4829 }
4830
4831 /* shlli: shlli $rm, $uimm6, $rd */
4832
4833 static SEM_PC
4834 SEM_FN_NAME (sh64_media,shlli) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4835 {
4836 #define FLD(f) abuf->fields.sfmt_shari.f
4837 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4838 int UNUSED written = 0;
4839 IADDR UNUSED pc = abuf->addr;
4840 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4841
4842 {
4843 DI opval = SLLDI (GET_H_GR (FLD (f_left)), FLD (f_uimm6));
4844 SET_H_GR (FLD (f_dest), opval);
4845 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4846 }
4847
4848 return vpc;
4849 #undef FLD
4850 }
4851
4852 /* shllil: shlli.l $rm, $uimm6, $rd */
4853
4854 static SEM_PC
4855 SEM_FN_NAME (sh64_media,shllil) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4856 {
4857 #define FLD(f) abuf->fields.sfmt_shari.f
4858 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4859 int UNUSED written = 0;
4860 IADDR UNUSED pc = abuf->addr;
4861 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4862
4863 {
4864 DI opval = EXTSIDI (SLLSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDSI (FLD (f_uimm6), 63)));
4865 SET_H_GR (FLD (f_dest), opval);
4866 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4867 }
4868
4869 return vpc;
4870 #undef FLD
4871 }
4872
4873 /* shlrd: shlrd $rm, $rn, $rd */
4874
4875 static SEM_PC
4876 SEM_FN_NAME (sh64_media,shlrd) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4877 {
4878 #define FLD(f) abuf->fields.sfmt_add.f
4879 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4880 int UNUSED written = 0;
4881 IADDR UNUSED pc = abuf->addr;
4882 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4883
4884 {
4885 DI opval = SRLDI (GET_H_GR (FLD (f_left)), ANDDI (GET_H_GR (FLD (f_right)), 63));
4886 SET_H_GR (FLD (f_dest), opval);
4887 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4888 }
4889
4890 return vpc;
4891 #undef FLD
4892 }
4893
4894 /* shlrdl: shlrd.l $rm, $rn, $rd */
4895
4896 static SEM_PC
4897 SEM_FN_NAME (sh64_media,shlrdl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4898 {
4899 #define FLD(f) abuf->fields.sfmt_add.f
4900 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4901 int UNUSED written = 0;
4902 IADDR UNUSED pc = abuf->addr;
4903 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4904
4905 {
4906 DI opval = EXTSIDI (SRLSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDDI (GET_H_GR (FLD (f_right)), 63)));
4907 SET_H_GR (FLD (f_dest), opval);
4908 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4909 }
4910
4911 return vpc;
4912 #undef FLD
4913 }
4914
4915 /* shlri: shlri $rm, $uimm6, $rd */
4916
4917 static SEM_PC
4918 SEM_FN_NAME (sh64_media,shlri) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4919 {
4920 #define FLD(f) abuf->fields.sfmt_shari.f
4921 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4922 int UNUSED written = 0;
4923 IADDR UNUSED pc = abuf->addr;
4924 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4925
4926 {
4927 DI opval = SRLDI (GET_H_GR (FLD (f_left)), FLD (f_uimm6));
4928 SET_H_GR (FLD (f_dest), opval);
4929 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4930 }
4931
4932 return vpc;
4933 #undef FLD
4934 }
4935
4936 /* shlril: shlri.l $rm, $uimm6, $rd */
4937
4938 static SEM_PC
4939 SEM_FN_NAME (sh64_media,shlril) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4940 {
4941 #define FLD(f) abuf->fields.sfmt_shari.f
4942 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4943 int UNUSED written = 0;
4944 IADDR UNUSED pc = abuf->addr;
4945 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4946
4947 {
4948 DI opval = EXTSIDI (SRLSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), ANDSI (FLD (f_uimm6), 63)));
4949 SET_H_GR (FLD (f_dest), opval);
4950 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4951 }
4952
4953 return vpc;
4954 #undef FLD
4955 }
4956
4957 /* shori: shori $uimm16, $rd */
4958
4959 static SEM_PC
4960 SEM_FN_NAME (sh64_media,shori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4961 {
4962 #define FLD(f) abuf->fields.sfmt_shori.f
4963 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4964 int UNUSED written = 0;
4965 IADDR UNUSED pc = abuf->addr;
4966 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4967
4968 {
4969 DI opval = ORDI (SLLDI (GET_H_GR (FLD (f_dest)), 16), ZEXTSIDI (FLD (f_uimm16)));
4970 SET_H_GR (FLD (f_dest), opval);
4971 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
4972 }
4973
4974 return vpc;
4975 #undef FLD
4976 }
4977
4978 /* sleep: sleep */
4979
4980 static SEM_PC
4981 SEM_FN_NAME (sh64_media,sleep) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4982 {
4983 #define FLD(f) abuf->fields.fmt_empty.f
4984 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
4985 int UNUSED written = 0;
4986 IADDR UNUSED pc = abuf->addr;
4987 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
4988
4989 ((void) 0); /*nop*/
4990
4991 return vpc;
4992 #undef FLD
4993 }
4994
4995 /* stb: st.b $rm, $disp10, $rd */
4996
4997 static SEM_PC
4998 SEM_FN_NAME (sh64_media,stb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
4999 {
5000 #define FLD(f) abuf->fields.sfmt_addi.f
5001 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5002 int UNUSED written = 0;
5003 IADDR UNUSED pc = abuf->addr;
5004 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5005
5006 {
5007 UQI opval = ANDQI (GET_H_GR (FLD (f_dest)), 255);
5008 SETMEMUQI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10))), opval);
5009 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5010 }
5011
5012 return vpc;
5013 #undef FLD
5014 }
5015
5016 /* stl: st.l $rm, $disp10x4, $rd */
5017
5018 static SEM_PC
5019 SEM_FN_NAME (sh64_media,stl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5020 {
5021 #define FLD(f) abuf->fields.sfmt_flds.f
5022 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5023 int UNUSED written = 0;
5024 IADDR UNUSED pc = abuf->addr;
5025 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5026
5027 {
5028 SI opval = ANDSI (GET_H_GR (FLD (f_dest)), 0xffffffff);
5029 SETMEMSI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10x4))), opval);
5030 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5031 }
5032
5033 return vpc;
5034 #undef FLD
5035 }
5036
5037 /* stq: st.q $rm, $disp10x8, $rd */
5038
5039 static SEM_PC
5040 SEM_FN_NAME (sh64_media,stq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5041 {
5042 #define FLD(f) abuf->fields.sfmt_fldd.f
5043 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5044 int UNUSED written = 0;
5045 IADDR UNUSED pc = abuf->addr;
5046 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5047
5048 {
5049 DI opval = GET_H_GR (FLD (f_dest));
5050 SETMEMDI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10x8))), opval);
5051 TRACE_RESULT (current_cpu, abuf, "memory", 'D', opval);
5052 }
5053
5054 return vpc;
5055 #undef FLD
5056 }
5057
5058 /* stw: st.w $rm, $disp10x2, $rd */
5059
5060 static SEM_PC
5061 SEM_FN_NAME (sh64_media,stw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5062 {
5063 #define FLD(f) abuf->fields.sfmt_lduw.f
5064 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5065 int UNUSED written = 0;
5066 IADDR UNUSED pc = abuf->addr;
5067 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5068
5069 {
5070 HI opval = ANDHI (GET_H_GR (FLD (f_dest)), 65535);
5071 SETMEMHI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_disp10x2))), opval);
5072 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5073 }
5074
5075 return vpc;
5076 #undef FLD
5077 }
5078
5079 /* sthil: sthi.l $rm, $disp6, $rd */
5080
5081 static SEM_PC
5082 SEM_FN_NAME (sh64_media,sthil) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5083 {
5084 #define FLD(f) abuf->fields.sfmt_ldhil.f
5085 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5086 int UNUSED written = 0;
5087 IADDR UNUSED pc = abuf->addr;
5088 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5089
5090 {
5091 DI tmp_addr;
5092 QI tmp_bytecount;
5093 DI tmp_val;
5094 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp6));
5095 tmp_bytecount = ADDDI (ANDDI (tmp_addr, 3), 1);
5096 if (ANDQI (tmp_bytecount, 4)) {
5097 {
5098 SI opval = GET_H_GR (FLD (f_dest));
5099 SETMEMSI (current_cpu, pc, ANDDI (tmp_addr, -4), opval);
5100 written |= (1 << 5);
5101 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5102 }
5103 } else {
5104 if (GET_H_ENDIAN ()) {
5105 {
5106 tmp_val = GET_H_GR (FLD (f_dest));
5107 if (ANDQI (tmp_bytecount, 1)) {
5108 {
5109 {
5110 UQI opval = ANDQI (tmp_val, 255);
5111 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5112 written |= (1 << 6);
5113 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5114 }
5115 tmp_val = SRLDI (tmp_val, 8);
5116 }
5117 }
5118 if (ANDQI (tmp_bytecount, 2)) {
5119 {
5120 {
5121 HI opval = ANDHI (tmp_val, 65535);
5122 SETMEMHI (current_cpu, pc, ANDDI (tmp_addr, -4), opval);
5123 written |= (1 << 4);
5124 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5125 }
5126 tmp_val = SRLDI (tmp_val, 16);
5127 }
5128 }
5129 }
5130 } else {
5131 {
5132 tmp_val = SRLDI (GET_H_GR (FLD (f_dest)), SUBSI (32, MULSI (8, tmp_bytecount)));
5133 if (ANDQI (tmp_bytecount, 2)) {
5134 {
5135 {
5136 HI opval = ANDHI (tmp_val, 65535);
5137 SETMEMHI (current_cpu, pc, ANDDI (tmp_addr, -4), opval);
5138 written |= (1 << 4);
5139 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5140 }
5141 tmp_val = SRLDI (tmp_val, 16);
5142 }
5143 }
5144 if (ANDQI (tmp_bytecount, 1)) {
5145 {
5146 {
5147 UQI opval = ANDQI (tmp_val, 255);
5148 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5149 written |= (1 << 6);
5150 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5151 }
5152 tmp_val = SRLDI (tmp_val, 8);
5153 }
5154 }
5155 }
5156 }
5157 }
5158 }
5159
5160 abuf->written = written;
5161 return vpc;
5162 #undef FLD
5163 }
5164
5165 /* sthiq: sthi.q $rm, $disp6, $rd */
5166
5167 static SEM_PC
5168 SEM_FN_NAME (sh64_media,sthiq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5169 {
5170 #define FLD(f) abuf->fields.sfmt_ldhil.f
5171 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5172 int UNUSED written = 0;
5173 IADDR UNUSED pc = abuf->addr;
5174 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5175
5176 {
5177 DI tmp_addr;
5178 QI tmp_bytecount;
5179 DI tmp_val;
5180 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp6));
5181 tmp_bytecount = ADDDI (ANDDI (tmp_addr, 7), 1);
5182 if (ANDQI (tmp_bytecount, 8)) {
5183 {
5184 DI opval = GET_H_GR (FLD (f_dest));
5185 SETMEMDI (current_cpu, pc, ANDDI (tmp_addr, -8), opval);
5186 written |= (1 << 4);
5187 TRACE_RESULT (current_cpu, abuf, "memory", 'D', opval);
5188 }
5189 } else {
5190 if (GET_H_ENDIAN ()) {
5191 {
5192 tmp_val = GET_H_GR (FLD (f_dest));
5193 if (ANDQI (tmp_bytecount, 1)) {
5194 {
5195 {
5196 UQI opval = ANDQI (tmp_val, 255);
5197 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5198 written |= (1 << 7);
5199 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5200 }
5201 tmp_val = SRLDI (tmp_val, 8);
5202 }
5203 }
5204 if (ANDQI (tmp_bytecount, 2)) {
5205 {
5206 {
5207 HI opval = ANDHI (tmp_val, 65535);
5208 SETMEMHI (current_cpu, pc, ANDDI (tmp_addr, -4), opval);
5209 written |= (1 << 5);
5210 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5211 }
5212 tmp_val = SRLDI (tmp_val, 16);
5213 }
5214 }
5215 if (ANDQI (tmp_bytecount, 4)) {
5216 {
5217 {
5218 SI opval = ANDSI (tmp_val, 0xffffffff);
5219 SETMEMSI (current_cpu, pc, ANDDI (tmp_addr, -8), opval);
5220 written |= (1 << 6);
5221 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5222 }
5223 tmp_val = SRLDI (tmp_val, 32);
5224 }
5225 }
5226 }
5227 } else {
5228 {
5229 tmp_val = SRLDI (GET_H_GR (FLD (f_dest)), SUBSI (64, MULSI (8, tmp_bytecount)));
5230 if (ANDQI (tmp_bytecount, 4)) {
5231 {
5232 {
5233 SI opval = ANDSI (tmp_val, 0xffffffff);
5234 SETMEMSI (current_cpu, pc, ANDDI (tmp_addr, -8), opval);
5235 written |= (1 << 6);
5236 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5237 }
5238 tmp_val = SRLDI (tmp_val, 32);
5239 }
5240 }
5241 if (ANDQI (tmp_bytecount, 2)) {
5242 {
5243 {
5244 HI opval = ANDHI (tmp_val, 65535);
5245 SETMEMHI (current_cpu, pc, ANDDI (tmp_addr, -4), opval);
5246 written |= (1 << 5);
5247 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5248 }
5249 tmp_val = SRLDI (tmp_val, 16);
5250 }
5251 }
5252 if (ANDQI (tmp_bytecount, 1)) {
5253 {
5254 {
5255 UQI opval = ANDQI (tmp_val, 255);
5256 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5257 written |= (1 << 7);
5258 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5259 }
5260 tmp_val = SRLDI (tmp_val, 8);
5261 }
5262 }
5263 }
5264 }
5265 }
5266 }
5267
5268 abuf->written = written;
5269 return vpc;
5270 #undef FLD
5271 }
5272
5273 /* stlol: stlo.l $rm, $disp6, $rd */
5274
5275 static SEM_PC
5276 SEM_FN_NAME (sh64_media,stlol) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5277 {
5278 #define FLD(f) abuf->fields.sfmt_ldhil.f
5279 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5280 int UNUSED written = 0;
5281 IADDR UNUSED pc = abuf->addr;
5282 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5283
5284 {
5285 DI tmp_addr;
5286 QI tmp_bytecount;
5287 DI tmp_val;
5288 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp6));
5289 tmp_bytecount = SUBSI (4, ANDDI (tmp_addr, 3));
5290 if (ANDQI (tmp_bytecount, 4)) {
5291 {
5292 USI opval = GET_H_GR (FLD (f_dest));
5293 SETMEMUSI (current_cpu, pc, tmp_addr, opval);
5294 written |= (1 << 6);
5295 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5296 }
5297 } else {
5298 if (GET_H_ENDIAN ()) {
5299 {
5300 tmp_val = SRLDI (GET_H_GR (FLD (f_dest)), SUBSI (32, MULSI (8, tmp_bytecount)));
5301 if (ANDQI (tmp_bytecount, 2)) {
5302 {
5303 {
5304 UHI opval = ANDHI (tmp_val, 65535);
5305 SETMEMUHI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 1), -2), opval);
5306 written |= (1 << 4);
5307 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5308 }
5309 tmp_val = SRLDI (tmp_val, 16);
5310 }
5311 }
5312 if (ANDQI (tmp_bytecount, 1)) {
5313 {
5314 {
5315 UQI opval = ANDQI (tmp_val, 255);
5316 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5317 written |= (1 << 5);
5318 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5319 }
5320 tmp_val = SRLDI (tmp_val, 8);
5321 }
5322 }
5323 }
5324 } else {
5325 {
5326 tmp_val = GET_H_GR (FLD (f_dest));
5327 if (ANDQI (tmp_bytecount, 1)) {
5328 {
5329 {
5330 UQI opval = ANDQI (tmp_val, 255);
5331 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5332 written |= (1 << 5);
5333 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5334 }
5335 tmp_val = SRLDI (tmp_val, 8);
5336 }
5337 }
5338 if (ANDQI (tmp_bytecount, 2)) {
5339 {
5340 {
5341 UHI opval = ANDHI (tmp_val, 65535);
5342 SETMEMUHI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 1), -2), opval);
5343 written |= (1 << 4);
5344 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5345 }
5346 tmp_val = SRLDI (tmp_val, 16);
5347 }
5348 }
5349 }
5350 }
5351 }
5352 }
5353
5354 abuf->written = written;
5355 return vpc;
5356 #undef FLD
5357 }
5358
5359 /* stloq: stlo.q $rm, $disp6, $rd */
5360
5361 static SEM_PC
5362 SEM_FN_NAME (sh64_media,stloq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5363 {
5364 #define FLD(f) abuf->fields.sfmt_ldhil.f
5365 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5366 int UNUSED written = 0;
5367 IADDR UNUSED pc = abuf->addr;
5368 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5369
5370 {
5371 DI tmp_addr;
5372 QI tmp_bytecount;
5373 DI tmp_val;
5374 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), FLD (f_disp6));
5375 tmp_bytecount = SUBSI (8, ANDDI (tmp_addr, 7));
5376 if (ANDQI (tmp_bytecount, 8)) {
5377 {
5378 UDI opval = GET_H_GR (FLD (f_dest));
5379 SETMEMUDI (current_cpu, pc, tmp_addr, opval);
5380 written |= (1 << 4);
5381 TRACE_RESULT (current_cpu, abuf, "memory", 'D', opval);
5382 }
5383 } else {
5384 if (GET_H_ENDIAN ()) {
5385 {
5386 tmp_val = SRLDI (GET_H_GR (FLD (f_dest)), SUBSI (64, MULSI (8, tmp_bytecount)));
5387 if (ANDQI (tmp_bytecount, 4)) {
5388 {
5389 {
5390 USI opval = ANDSI (tmp_val, 0xffffffff);
5391 SETMEMUSI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 3), -4), opval);
5392 written |= (1 << 7);
5393 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5394 }
5395 tmp_val = SRLDI (tmp_val, 32);
5396 }
5397 }
5398 if (ANDQI (tmp_bytecount, 2)) {
5399 {
5400 {
5401 UHI opval = ANDHI (tmp_val, 65535);
5402 SETMEMUHI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 1), -2), opval);
5403 written |= (1 << 5);
5404 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5405 }
5406 tmp_val = SRLDI (tmp_val, 16);
5407 }
5408 }
5409 if (ANDQI (tmp_bytecount, 1)) {
5410 {
5411 {
5412 UQI opval = ANDQI (tmp_val, 255);
5413 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5414 written |= (1 << 6);
5415 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5416 }
5417 tmp_val = SRLDI (tmp_val, 8);
5418 }
5419 }
5420 }
5421 } else {
5422 {
5423 tmp_val = GET_H_GR (FLD (f_dest));
5424 if (ANDQI (tmp_bytecount, 1)) {
5425 {
5426 {
5427 UQI opval = ANDQI (tmp_val, 255);
5428 SETMEMUQI (current_cpu, pc, tmp_addr, opval);
5429 written |= (1 << 6);
5430 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5431 }
5432 tmp_val = SRLDI (tmp_val, 8);
5433 }
5434 }
5435 if (ANDQI (tmp_bytecount, 2)) {
5436 {
5437 {
5438 UHI opval = ANDHI (tmp_val, 65535);
5439 SETMEMUHI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 1), -2), opval);
5440 written |= (1 << 5);
5441 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5442 }
5443 tmp_val = SRLDI (tmp_val, 16);
5444 }
5445 }
5446 if (ANDQI (tmp_bytecount, 4)) {
5447 {
5448 {
5449 USI opval = ANDSI (tmp_val, 0xffffffff);
5450 SETMEMUSI (current_cpu, pc, ANDDI (ADDDI (tmp_addr, 3), -4), opval);
5451 written |= (1 << 7);
5452 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5453 }
5454 tmp_val = SRLDI (tmp_val, 32);
5455 }
5456 }
5457 }
5458 }
5459 }
5460 }
5461
5462 abuf->written = written;
5463 return vpc;
5464 #undef FLD
5465 }
5466
5467 /* stxb: stx.b $rm, $rn, $rd */
5468
5469 static SEM_PC
5470 SEM_FN_NAME (sh64_media,stxb) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5471 {
5472 #define FLD(f) abuf->fields.sfmt_add.f
5473 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5474 int UNUSED written = 0;
5475 IADDR UNUSED pc = abuf->addr;
5476 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5477
5478 {
5479 UQI opval = SUBWORDDIQI (GET_H_GR (FLD (f_dest)), 7);
5480 SETMEMUQI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))), opval);
5481 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5482 }
5483
5484 return vpc;
5485 #undef FLD
5486 }
5487
5488 /* stxl: stx.l $rm, $rn, $rd */
5489
5490 static SEM_PC
5491 SEM_FN_NAME (sh64_media,stxl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5492 {
5493 #define FLD(f) abuf->fields.sfmt_add.f
5494 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5495 int UNUSED written = 0;
5496 IADDR UNUSED pc = abuf->addr;
5497 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5498
5499 {
5500 SI opval = SUBWORDDISI (GET_H_GR (FLD (f_dest)), 1);
5501 SETMEMSI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))), opval);
5502 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5503 }
5504
5505 return vpc;
5506 #undef FLD
5507 }
5508
5509 /* stxq: stx.q $rm, $rn, $rd */
5510
5511 static SEM_PC
5512 SEM_FN_NAME (sh64_media,stxq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5513 {
5514 #define FLD(f) abuf->fields.sfmt_add.f
5515 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5516 int UNUSED written = 0;
5517 IADDR UNUSED pc = abuf->addr;
5518 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5519
5520 {
5521 DI opval = GET_H_GR (FLD (f_dest));
5522 SETMEMDI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))), opval);
5523 TRACE_RESULT (current_cpu, abuf, "memory", 'D', opval);
5524 }
5525
5526 return vpc;
5527 #undef FLD
5528 }
5529
5530 /* stxw: stx.w $rm, $rn, $rd */
5531
5532 static SEM_PC
5533 SEM_FN_NAME (sh64_media,stxw) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5534 {
5535 #define FLD(f) abuf->fields.sfmt_add.f
5536 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5537 int UNUSED written = 0;
5538 IADDR UNUSED pc = abuf->addr;
5539 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5540
5541 {
5542 HI opval = SUBWORDDIHI (GET_H_GR (FLD (f_dest)), 3);
5543 SETMEMHI (current_cpu, pc, ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right))), opval);
5544 TRACE_RESULT (current_cpu, abuf, "memory", 'x', opval);
5545 }
5546
5547 return vpc;
5548 #undef FLD
5549 }
5550
5551 /* sub: sub $rm, $rn, $rd */
5552
5553 static SEM_PC
5554 SEM_FN_NAME (sh64_media,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5555 {
5556 #define FLD(f) abuf->fields.sfmt_add.f
5557 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5558 int UNUSED written = 0;
5559 IADDR UNUSED pc = abuf->addr;
5560 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5561
5562 {
5563 DI opval = SUBDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)));
5564 SET_H_GR (FLD (f_dest), opval);
5565 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
5566 }
5567
5568 return vpc;
5569 #undef FLD
5570 }
5571
5572 /* subl: sub.l $rm, $rn, $rd */
5573
5574 static SEM_PC
5575 SEM_FN_NAME (sh64_media,subl) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5576 {
5577 #define FLD(f) abuf->fields.sfmt_add.f
5578 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5579 int UNUSED written = 0;
5580 IADDR UNUSED pc = abuf->addr;
5581 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5582
5583 {
5584 DI opval = EXTSIDI (SUBSI (SUBWORDDISI (GET_H_GR (FLD (f_left)), 1), SUBWORDDISI (GET_H_GR (FLD (f_right)), 1)));
5585 SET_H_GR (FLD (f_dest), opval);
5586 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
5587 }
5588
5589 return vpc;
5590 #undef FLD
5591 }
5592
5593 /* swapq: swap.q $rm, $rn, $rd */
5594
5595 static SEM_PC
5596 SEM_FN_NAME (sh64_media,swapq) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5597 {
5598 #define FLD(f) abuf->fields.sfmt_add.f
5599 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5600 int UNUSED written = 0;
5601 IADDR UNUSED pc = abuf->addr;
5602 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5603
5604 {
5605 DI tmp_addr;
5606 DI tmp_temp;
5607 tmp_addr = ADDDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)));
5608 tmp_temp = GETMEMDI (current_cpu, pc, tmp_addr);
5609 {
5610 DI opval = GET_H_GR (FLD (f_dest));
5611 SETMEMDI (current_cpu, pc, tmp_addr, opval);
5612 TRACE_RESULT (current_cpu, abuf, "memory", 'D', opval);
5613 }
5614 {
5615 DI opval = tmp_temp;
5616 SET_H_GR (FLD (f_dest), opval);
5617 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
5618 }
5619 }
5620
5621 return vpc;
5622 #undef FLD
5623 }
5624
5625 /* synci: synci */
5626
5627 static SEM_PC
5628 SEM_FN_NAME (sh64_media,synci) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5629 {
5630 #define FLD(f) abuf->fields.fmt_empty.f
5631 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5632 int UNUSED written = 0;
5633 IADDR UNUSED pc = abuf->addr;
5634 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5635
5636 ((void) 0); /*nop*/
5637
5638 return vpc;
5639 #undef FLD
5640 }
5641
5642 /* synco: synco */
5643
5644 static SEM_PC
5645 SEM_FN_NAME (sh64_media,synco) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5646 {
5647 #define FLD(f) abuf->fields.fmt_empty.f
5648 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5649 int UNUSED written = 0;
5650 IADDR UNUSED pc = abuf->addr;
5651 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5652
5653 ((void) 0); /*nop*/
5654
5655 return vpc;
5656 #undef FLD
5657 }
5658
5659 /* trapa: trapa $rm */
5660
5661 static SEM_PC
5662 SEM_FN_NAME (sh64_media,trapa) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5663 {
5664 #define FLD(f) abuf->fields.sfmt_xori.f
5665 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5666 int UNUSED written = 0;
5667 IADDR UNUSED pc = abuf->addr;
5668 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5669
5670 sh64_trapa (current_cpu, GET_H_GR (FLD (f_left)), pc);
5671
5672 return vpc;
5673 #undef FLD
5674 }
5675
5676 /* xor: xor $rm, $rn, $rd */
5677
5678 static SEM_PC
5679 SEM_FN_NAME (sh64_media,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5680 {
5681 #define FLD(f) abuf->fields.sfmt_add.f
5682 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5683 int UNUSED written = 0;
5684 IADDR UNUSED pc = abuf->addr;
5685 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5686
5687 {
5688 DI opval = XORDI (GET_H_GR (FLD (f_left)), GET_H_GR (FLD (f_right)));
5689 SET_H_GR (FLD (f_dest), opval);
5690 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
5691 }
5692
5693 return vpc;
5694 #undef FLD
5695 }
5696
5697 /* xori: xori $rm, $imm6, $rd */
5698
5699 static SEM_PC
5700 SEM_FN_NAME (sh64_media,xori) (SIM_CPU *current_cpu, SEM_ARG sem_arg)
5701 {
5702 #define FLD(f) abuf->fields.sfmt_xori.f
5703 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
5704 int UNUSED written = 0;
5705 IADDR UNUSED pc = abuf->addr;
5706 SEM_PC vpc = SEM_NEXT_VPC (sem_arg, pc, 4);
5707
5708 {
5709 DI opval = XORDI (GET_H_GR (FLD (f_left)), EXTSIDI (FLD (f_imm6)));
5710 SET_H_GR (FLD (f_dest), opval);
5711 TRACE_RESULT (current_cpu, abuf, "gr", 'D', opval);
5712 }
5713
5714 return vpc;
5715 #undef FLD
5716 }
5717
5718 /* Table of all semantic fns. */
5719
5720 static const struct sem_fn_desc sem_fns[] = {
5721 { SH64_MEDIA_INSN_X_INVALID, SEM_FN_NAME (sh64_media,x_invalid) },
5722 { SH64_MEDIA_INSN_X_AFTER, SEM_FN_NAME (sh64_media,x_after) },
5723 { SH64_MEDIA_INSN_X_BEFORE, SEM_FN_NAME (sh64_media,x_before) },
5724 { SH64_MEDIA_INSN_X_CTI_CHAIN, SEM_FN_NAME (sh64_media,x_cti_chain) },
5725 { SH64_MEDIA_INSN_X_CHAIN, SEM_FN_NAME (sh64_media,x_chain) },
5726 { SH64_MEDIA_INSN_X_BEGIN, SEM_FN_NAME (sh64_media,x_begin) },
5727 { SH64_MEDIA_INSN_ADD, SEM_FN_NAME (sh64_media,add) },
5728 { SH64_MEDIA_INSN_ADDL, SEM_FN_NAME (sh64_media,addl) },
5729 { SH64_MEDIA_INSN_ADDI, SEM_FN_NAME (sh64_media,addi) },
5730 { SH64_MEDIA_INSN_ADDIL, SEM_FN_NAME (sh64_media,addil) },
5731 { SH64_MEDIA_INSN_ADDZL, SEM_FN_NAME (sh64_media,addzl) },
5732 { SH64_MEDIA_INSN_ALLOCO, SEM_FN_NAME (sh64_media,alloco) },
5733 { SH64_MEDIA_INSN_AND, SEM_FN_NAME (sh64_media,and) },
5734 { SH64_MEDIA_INSN_ANDC, SEM_FN_NAME (sh64_media,andc) },
5735 { SH64_MEDIA_INSN_ANDI, SEM_FN_NAME (sh64_media,andi) },
5736 { SH64_MEDIA_INSN_BEQ, SEM_FN_NAME (sh64_media,beq) },
5737 { SH64_MEDIA_INSN_BEQI, SEM_FN_NAME (sh64_media,beqi) },
5738 { SH64_MEDIA_INSN_BGE, SEM_FN_NAME (sh64_media,bge) },
5739 { SH64_MEDIA_INSN_BGEU, SEM_FN_NAME (sh64_media,bgeu) },
5740 { SH64_MEDIA_INSN_BGT, SEM_FN_NAME (sh64_media,bgt) },
5741 { SH64_MEDIA_INSN_BGTU, SEM_FN_NAME (sh64_media,bgtu) },
5742 { SH64_MEDIA_INSN_BLINK, SEM_FN_NAME (sh64_media,blink) },
5743 { SH64_MEDIA_INSN_BNE, SEM_FN_NAME (sh64_media,bne) },
5744 { SH64_MEDIA_INSN_BNEI, SEM_FN_NAME (sh64_media,bnei) },
5745 { SH64_MEDIA_INSN_BRK, SEM_FN_NAME (sh64_media,brk) },
5746 { SH64_MEDIA_INSN_BYTEREV, SEM_FN_NAME (sh64_media,byterev) },
5747 { SH64_MEDIA_INSN_CMPEQ, SEM_FN_NAME (sh64_media,cmpeq) },
5748 { SH64_MEDIA_INSN_CMPGT, SEM_FN_NAME (sh64_media,cmpgt) },
5749 { SH64_MEDIA_INSN_CMPGTU, SEM_FN_NAME (sh64_media,cmpgtu) },
5750 { SH64_MEDIA_INSN_CMVEQ, SEM_FN_NAME (sh64_media,cmveq) },
5751 { SH64_MEDIA_INSN_CMVNE, SEM_FN_NAME (sh64_media,cmvne) },
5752 { SH64_MEDIA_INSN_FABSD, SEM_FN_NAME (sh64_media,fabsd) },
5753 { SH64_MEDIA_INSN_FABSS, SEM_FN_NAME (sh64_media,fabss) },
5754 { SH64_MEDIA_INSN_FADDD, SEM_FN_NAME (sh64_media,faddd) },
5755 { SH64_MEDIA_INSN_FADDS, SEM_FN_NAME (sh64_media,fadds) },
5756 { SH64_MEDIA_INSN_FCMPEQD, SEM_FN_NAME (sh64_media,fcmpeqd) },
5757 { SH64_MEDIA_INSN_FCMPEQS, SEM_FN_NAME (sh64_media,fcmpeqs) },
5758 { SH64_MEDIA_INSN_FCMPGED, SEM_FN_NAME (sh64_media,fcmpged) },
5759 { SH64_MEDIA_INSN_FCMPGES, SEM_FN_NAME (sh64_media,fcmpges) },
5760 { SH64_MEDIA_INSN_FCMPGTD, SEM_FN_NAME (sh64_media,fcmpgtd) },
5761 { SH64_MEDIA_INSN_FCMPGTS, SEM_FN_NAME (sh64_media,fcmpgts) },
5762 { SH64_MEDIA_INSN_FCMPUND, SEM_FN_NAME (sh64_media,fcmpund) },
5763 { SH64_MEDIA_INSN_FCMPUNS, SEM_FN_NAME (sh64_media,fcmpuns) },
5764 { SH64_MEDIA_INSN_FCNVDS, SEM_FN_NAME (sh64_media,fcnvds) },
5765 { SH64_MEDIA_INSN_FCNVSD, SEM_FN_NAME (sh64_media,fcnvsd) },
5766 { SH64_MEDIA_INSN_FDIVD, SEM_FN_NAME (sh64_media,fdivd) },
5767 { SH64_MEDIA_INSN_FDIVS, SEM_FN_NAME (sh64_media,fdivs) },
5768 { SH64_MEDIA_INSN_FGETSCR, SEM_FN_NAME (sh64_media,fgetscr) },
5769 { SH64_MEDIA_INSN_FIPRS, SEM_FN_NAME (sh64_media,fiprs) },
5770 { SH64_MEDIA_INSN_FLDD, SEM_FN_NAME (sh64_media,fldd) },
5771 { SH64_MEDIA_INSN_FLDP, SEM_FN_NAME (sh64_media,fldp) },
5772 { SH64_MEDIA_INSN_FLDS, SEM_FN_NAME (sh64_media,flds) },
5773 { SH64_MEDIA_INSN_FLDXD, SEM_FN_NAME (sh64_media,fldxd) },
5774 { SH64_MEDIA_INSN_FLDXP, SEM_FN_NAME (sh64_media,fldxp) },
5775 { SH64_MEDIA_INSN_FLDXS, SEM_FN_NAME (sh64_media,fldxs) },
5776 { SH64_MEDIA_INSN_FLOATLD, SEM_FN_NAME (sh64_media,floatld) },
5777 { SH64_MEDIA_INSN_FLOATLS, SEM_FN_NAME (sh64_media,floatls) },
5778 { SH64_MEDIA_INSN_FLOATQD, SEM_FN_NAME (sh64_media,floatqd) },
5779 { SH64_MEDIA_INSN_FLOATQS, SEM_FN_NAME (sh64_media,floatqs) },
5780 { SH64_MEDIA_INSN_FMACS, SEM_FN_NAME (sh64_media,fmacs) },
5781 { SH64_MEDIA_INSN_FMOVD, SEM_FN_NAME (sh64_media,fmovd) },
5782 { SH64_MEDIA_INSN_FMOVDQ, SEM_FN_NAME (sh64_media,fmovdq) },
5783 { SH64_MEDIA_INSN_FMOVLS, SEM_FN_NAME (sh64_media,fmovls) },
5784 { SH64_MEDIA_INSN_FMOVQD, SEM_FN_NAME (sh64_media,fmovqd) },
5785 { SH64_MEDIA_INSN_FMOVS, SEM_FN_NAME (sh64_media,fmovs) },
5786 { SH64_MEDIA_INSN_FMOVSL, SEM_FN_NAME (sh64_media,fmovsl) },
5787 { SH64_MEDIA_INSN_FMULD, SEM_FN_NAME (sh64_media,fmuld) },
5788 { SH64_MEDIA_INSN_FMULS, SEM_FN_NAME (sh64_media,fmuls) },
5789 { SH64_MEDIA_INSN_FNEGD, SEM_FN_NAME (sh64_media,fnegd) },
5790 { SH64_MEDIA_INSN_FNEGS, SEM_FN_NAME (sh64_media,fnegs) },
5791 { SH64_MEDIA_INSN_FPUTSCR, SEM_FN_NAME (sh64_media,fputscr) },
5792 { SH64_MEDIA_INSN_FSQRTD, SEM_FN_NAME (sh64_media,fsqrtd) },
5793 { SH64_MEDIA_INSN_FSQRTS, SEM_FN_NAME (sh64_media,fsqrts) },
5794 { SH64_MEDIA_INSN_FSTD, SEM_FN_NAME (sh64_media,fstd) },
5795 { SH64_MEDIA_INSN_FSTP, SEM_FN_NAME (sh64_media,fstp) },
5796 { SH64_MEDIA_INSN_FSTS, SEM_FN_NAME (sh64_media,fsts) },
5797 { SH64_MEDIA_INSN_FSTXD, SEM_FN_NAME (sh64_media,fstxd) },
5798 { SH64_MEDIA_INSN_FSTXP, SEM_FN_NAME (sh64_media,fstxp) },
5799 { SH64_MEDIA_INSN_FSTXS, SEM_FN_NAME (sh64_media,fstxs) },
5800 { SH64_MEDIA_INSN_FSUBD, SEM_FN_NAME (sh64_media,fsubd) },
5801 { SH64_MEDIA_INSN_FSUBS, SEM_FN_NAME (sh64_media,fsubs) },
5802 { SH64_MEDIA_INSN_FTRCDL, SEM_FN_NAME (sh64_media,ftrcdl) },
5803 { SH64_MEDIA_INSN_FTRCSL, SEM_FN_NAME (sh64_media,ftrcsl) },
5804 { SH64_MEDIA_INSN_FTRCDQ, SEM_FN_NAME (sh64_media,ftrcdq) },
5805 { SH64_MEDIA_INSN_FTRCSQ, SEM_FN_NAME (sh64_media,ftrcsq) },
5806 { SH64_MEDIA_INSN_FTRVS, SEM_FN_NAME (sh64_media,ftrvs) },
5807 { SH64_MEDIA_INSN_GETCFG, SEM_FN_NAME (sh64_media,getcfg) },
5808 { SH64_MEDIA_INSN_GETCON, SEM_FN_NAME (sh64_media,getcon) },
5809 { SH64_MEDIA_INSN_GETTR, SEM_FN_NAME (sh64_media,gettr) },
5810 { SH64_MEDIA_INSN_ICBI, SEM_FN_NAME (sh64_media,icbi) },
5811 { SH64_MEDIA_INSN_LDB, SEM_FN_NAME (sh64_media,ldb) },
5812 { SH64_MEDIA_INSN_LDL, SEM_FN_NAME (sh64_media,ldl) },
5813 { SH64_MEDIA_INSN_LDQ, SEM_FN_NAME (sh64_media,ldq) },
5814 { SH64_MEDIA_INSN_LDUB, SEM_FN_NAME (sh64_media,ldub) },
5815 { SH64_MEDIA_INSN_LDUW, SEM_FN_NAME (sh64_media,lduw) },
5816 { SH64_MEDIA_INSN_LDW, SEM_FN_NAME (sh64_media,ldw) },
5817 { SH64_MEDIA_INSN_LDHIL, SEM_FN_NAME (sh64_media,ldhil) },
5818 { SH64_MEDIA_INSN_LDHIQ, SEM_FN_NAME (sh64_media,ldhiq) },
5819 { SH64_MEDIA_INSN_LDLOL, SEM_FN_NAME (sh64_media,ldlol) },
5820 { SH64_MEDIA_INSN_LDLOQ, SEM_FN_NAME (sh64_media,ldloq) },
5821 { SH64_MEDIA_INSN_LDXB, SEM_FN_NAME (sh64_media,ldxb) },
5822 { SH64_MEDIA_INSN_LDXL, SEM_FN_NAME (sh64_media,ldxl) },
5823 { SH64_MEDIA_INSN_LDXQ, SEM_FN_NAME (sh64_media,ldxq) },
5824 { SH64_MEDIA_INSN_LDXUB, SEM_FN_NAME (sh64_media,ldxub) },
5825 { SH64_MEDIA_INSN_LDXUW, SEM_FN_NAME (sh64_media,ldxuw) },
5826 { SH64_MEDIA_INSN_LDXW, SEM_FN_NAME (sh64_media,ldxw) },
5827 { SH64_MEDIA_INSN_MABSL, SEM_FN_NAME (sh64_media,mabsl) },
5828 { SH64_MEDIA_INSN_MABSW, SEM_FN_NAME (sh64_media,mabsw) },
5829 { SH64_MEDIA_INSN_MADDL, SEM_FN_NAME (sh64_media,maddl) },
5830 { SH64_MEDIA_INSN_MADDW, SEM_FN_NAME (sh64_media,maddw) },
5831 { SH64_MEDIA_INSN_MADDSL, SEM_FN_NAME (sh64_media,maddsl) },
5832 { SH64_MEDIA_INSN_MADDSUB, SEM_FN_NAME (sh64_media,maddsub) },
5833 { SH64_MEDIA_INSN_MADDSW, SEM_FN_NAME (sh64_media,maddsw) },
5834 { SH64_MEDIA_INSN_MCMPEQB, SEM_FN_NAME (sh64_media,mcmpeqb) },
5835 { SH64_MEDIA_INSN_MCMPEQL, SEM_FN_NAME (sh64_media,mcmpeql) },
5836 { SH64_MEDIA_INSN_MCMPEQW, SEM_FN_NAME (sh64_media,mcmpeqw) },
5837 { SH64_MEDIA_INSN_MCMPGTL, SEM_FN_NAME (sh64_media,mcmpgtl) },
5838 { SH64_MEDIA_INSN_MCMPGTUB, SEM_FN_NAME (sh64_media,mcmpgtub) },
5839 { SH64_MEDIA_INSN_MCMPGTW, SEM_FN_NAME (sh64_media,mcmpgtw) },
5840 { SH64_MEDIA_INSN_MCMV, SEM_FN_NAME (sh64_media,mcmv) },
5841 { SH64_MEDIA_INSN_MCNVSLW, SEM_FN_NAME (sh64_media,mcnvslw) },
5842 { SH64_MEDIA_INSN_MCNVSWB, SEM_FN_NAME (sh64_media,mcnvswb) },
5843 { SH64_MEDIA_INSN_MCNVSWUB, SEM_FN_NAME (sh64_media,mcnvswub) },
5844 { SH64_MEDIA_INSN_MEXTR1, SEM_FN_NAME (sh64_media,mextr1) },
5845 { SH64_MEDIA_INSN_MEXTR2, SEM_FN_NAME (sh64_media,mextr2) },
5846 { SH64_MEDIA_INSN_MEXTR3, SEM_FN_NAME (sh64_media,mextr3) },
5847 { SH64_MEDIA_INSN_MEXTR4, SEM_FN_NAME (sh64_media,mextr4) },
5848 { SH64_MEDIA_INSN_MEXTR5, SEM_FN_NAME (sh64_media,mextr5) },
5849 { SH64_MEDIA_INSN_MEXTR6, SEM_FN_NAME (sh64_media,mextr6) },
5850 { SH64_MEDIA_INSN_MEXTR7, SEM_FN_NAME (sh64_media,mextr7) },
5851 { SH64_MEDIA_INSN_MMACFXWL, SEM_FN_NAME (sh64_media,mmacfxwl) },
5852 { SH64_MEDIA_INSN_MMACNFX_WL, SEM_FN_NAME (sh64_media,mmacnfx_wl) },
5853 { SH64_MEDIA_INSN_MMULL, SEM_FN_NAME (sh64_media,mmull) },
5854 { SH64_MEDIA_INSN_MMULW, SEM_FN_NAME (sh64_media,mmulw) },
5855 { SH64_MEDIA_INSN_MMULFXL, SEM_FN_NAME (sh64_media,mmulfxl) },
5856 { SH64_MEDIA_INSN_MMULFXW, SEM_FN_NAME (sh64_media,mmulfxw) },
5857 { SH64_MEDIA_INSN_MMULFXRPW, SEM_FN_NAME (sh64_media,mmulfxrpw) },
5858 { SH64_MEDIA_INSN_MMULHIWL, SEM_FN_NAME (sh64_media,mmulhiwl) },
5859 { SH64_MEDIA_INSN_MMULLOWL, SEM_FN_NAME (sh64_media,mmullowl) },
5860 { SH64_MEDIA_INSN_MMULSUMWQ, SEM_FN_NAME (sh64_media,mmulsumwq) },
5861 { SH64_MEDIA_INSN_MOVI, SEM_FN_NAME (sh64_media,movi) },
5862 { SH64_MEDIA_INSN_MPERMW, SEM_FN_NAME (sh64_media,mpermw) },
5863 { SH64_MEDIA_INSN_MSADUBQ, SEM_FN_NAME (sh64_media,msadubq) },
5864 { SH64_MEDIA_INSN_MSHALDSL, SEM_FN_NAME (sh64_media,mshaldsl) },
5865 { SH64_MEDIA_INSN_MSHALDSW, SEM_FN_NAME (sh64_media,mshaldsw) },
5866 { SH64_MEDIA_INSN_MSHARDL, SEM_FN_NAME (sh64_media,mshardl) },
5867 { SH64_MEDIA_INSN_MSHARDW, SEM_FN_NAME (sh64_media,mshardw) },
5868 { SH64_MEDIA_INSN_MSHARDSQ, SEM_FN_NAME (sh64_media,mshardsq) },
5869 { SH64_MEDIA_INSN_MSHFHIB, SEM_FN_NAME (sh64_media,mshfhib) },
5870 { SH64_MEDIA_INSN_MSHFHIL, SEM_FN_NAME (sh64_media,mshfhil) },
5871 { SH64_MEDIA_INSN_MSHFHIW, SEM_FN_NAME (sh64_media,mshfhiw) },
5872 { SH64_MEDIA_INSN_MSHFLOB, SEM_FN_NAME (sh64_media,mshflob) },
5873 { SH64_MEDIA_INSN_MSHFLOL, SEM_FN_NAME (sh64_media,mshflol) },
5874 { SH64_MEDIA_INSN_MSHFLOW, SEM_FN_NAME (sh64_media,mshflow) },
5875 { SH64_MEDIA_INSN_MSHLLDL, SEM_FN_NAME (sh64_media,mshlldl) },
5876 { SH64_MEDIA_INSN_MSHLLDW, SEM_FN_NAME (sh64_media,mshlldw) },
5877 { SH64_MEDIA_INSN_MSHLRDL, SEM_FN_NAME (sh64_media,mshlrdl) },
5878 { SH64_MEDIA_INSN_MSHLRDW, SEM_FN_NAME (sh64_media,mshlrdw) },
5879 { SH64_MEDIA_INSN_MSUBL, SEM_FN_NAME (sh64_media,msubl) },
5880 { SH64_MEDIA_INSN_MSUBW, SEM_FN_NAME (sh64_media,msubw) },
5881 { SH64_MEDIA_INSN_MSUBSL, SEM_FN_NAME (sh64_media,msubsl) },
5882 { SH64_MEDIA_INSN_MSUBSUB, SEM_FN_NAME (sh64_media,msubsub) },
5883 { SH64_MEDIA_INSN_MSUBSW, SEM_FN_NAME (sh64_media,msubsw) },
5884 { SH64_MEDIA_INSN_MULSL, SEM_FN_NAME (sh64_media,mulsl) },
5885 { SH64_MEDIA_INSN_MULUL, SEM_FN_NAME (sh64_media,mulul) },
5886 { SH64_MEDIA_INSN_NOP, SEM_FN_NAME (sh64_media,nop) },
5887 { SH64_MEDIA_INSN_NSB, SEM_FN_NAME (sh64_media,nsb) },
5888 { SH64_MEDIA_INSN_OCBI, SEM_FN_NAME (sh64_media,ocbi) },
5889 { SH64_MEDIA_INSN_OCBP, SEM_FN_NAME (sh64_media,ocbp) },
5890 { SH64_MEDIA_INSN_OCBWB, SEM_FN_NAME (sh64_media,ocbwb) },
5891 { SH64_MEDIA_INSN_OR, SEM_FN_NAME (sh64_media,or) },
5892 { SH64_MEDIA_INSN_ORI, SEM_FN_NAME (sh64_media,ori) },
5893 { SH64_MEDIA_INSN_PREFI, SEM_FN_NAME (sh64_media,prefi) },
5894 { SH64_MEDIA_INSN_PTA, SEM_FN_NAME (sh64_media,pta) },
5895 { SH64_MEDIA_INSN_PTABS, SEM_FN_NAME (sh64_media,ptabs) },
5896 { SH64_MEDIA_INSN_PTB, SEM_FN_NAME (sh64_media,ptb) },
5897 { SH64_MEDIA_INSN_PTREL, SEM_FN_NAME (sh64_media,ptrel) },
5898 { SH64_MEDIA_INSN_PUTCFG, SEM_FN_NAME (sh64_media,putcfg) },
5899 { SH64_MEDIA_INSN_PUTCON, SEM_FN_NAME (sh64_media,putcon) },
5900 { SH64_MEDIA_INSN_RTE, SEM_FN_NAME (sh64_media,rte) },
5901 { SH64_MEDIA_INSN_SHARD, SEM_FN_NAME (sh64_media,shard) },
5902 { SH64_MEDIA_INSN_SHARDL, SEM_FN_NAME (sh64_media,shardl) },
5903 { SH64_MEDIA_INSN_SHARI, SEM_FN_NAME (sh64_media,shari) },
5904 { SH64_MEDIA_INSN_SHARIL, SEM_FN_NAME (sh64_media,sharil) },
5905 { SH64_MEDIA_INSN_SHLLD, SEM_FN_NAME (sh64_media,shlld) },
5906 { SH64_MEDIA_INSN_SHLLDL, SEM_FN_NAME (sh64_media,shlldl) },
5907 { SH64_MEDIA_INSN_SHLLI, SEM_FN_NAME (sh64_media,shlli) },
5908 { SH64_MEDIA_INSN_SHLLIL, SEM_FN_NAME (sh64_media,shllil) },
5909 { SH64_MEDIA_INSN_SHLRD, SEM_FN_NAME (sh64_media,shlrd) },
5910 { SH64_MEDIA_INSN_SHLRDL, SEM_FN_NAME (sh64_media,shlrdl) },
5911 { SH64_MEDIA_INSN_SHLRI, SEM_FN_NAME (sh64_media,shlri) },
5912 { SH64_MEDIA_INSN_SHLRIL, SEM_FN_NAME (sh64_media,shlril) },
5913 { SH64_MEDIA_INSN_SHORI, SEM_FN_NAME (sh64_media,shori) },
5914 { SH64_MEDIA_INSN_SLEEP, SEM_FN_NAME (sh64_media,sleep) },
5915 { SH64_MEDIA_INSN_STB, SEM_FN_NAME (sh64_media,stb) },
5916 { SH64_MEDIA_INSN_STL, SEM_FN_NAME (sh64_media,stl) },
5917 { SH64_MEDIA_INSN_STQ, SEM_FN_NAME (sh64_media,stq) },
5918 { SH64_MEDIA_INSN_STW, SEM_FN_NAME (sh64_media,stw) },
5919 { SH64_MEDIA_INSN_STHIL, SEM_FN_NAME (sh64_media,sthil) },
5920 { SH64_MEDIA_INSN_STHIQ, SEM_FN_NAME (sh64_media,sthiq) },
5921 { SH64_MEDIA_INSN_STLOL, SEM_FN_NAME (sh64_media,stlol) },
5922 { SH64_MEDIA_INSN_STLOQ, SEM_FN_NAME (sh64_media,stloq) },
5923 { SH64_MEDIA_INSN_STXB, SEM_FN_NAME (sh64_media,stxb) },
5924 { SH64_MEDIA_INSN_STXL, SEM_FN_NAME (sh64_media,stxl) },
5925 { SH64_MEDIA_INSN_STXQ, SEM_FN_NAME (sh64_media,stxq) },
5926 { SH64_MEDIA_INSN_STXW, SEM_FN_NAME (sh64_media,stxw) },
5927 { SH64_MEDIA_INSN_SUB, SEM_FN_NAME (sh64_media,sub) },
5928 { SH64_MEDIA_INSN_SUBL, SEM_FN_NAME (sh64_media,subl) },
5929 { SH64_MEDIA_INSN_SWAPQ, SEM_FN_NAME (sh64_media,swapq) },
5930 { SH64_MEDIA_INSN_SYNCI, SEM_FN_NAME (sh64_media,synci) },
5931 { SH64_MEDIA_INSN_SYNCO, SEM_FN_NAME (sh64_media,synco) },
5932 { SH64_MEDIA_INSN_TRAPA, SEM_FN_NAME (sh64_media,trapa) },
5933 { SH64_MEDIA_INSN_XOR, SEM_FN_NAME (sh64_media,xor) },
5934 { SH64_MEDIA_INSN_XORI, SEM_FN_NAME (sh64_media,xori) },
5935 { 0, 0 }
5936 };
5937
5938 /* Add the semantic fns to IDESC_TABLE. */
5939
5940 void
5941 SEM_FN_NAME (sh64_media,init_idesc_table) (SIM_CPU *current_cpu)
5942 {
5943 IDESC *idesc_table = CPU_IDESC (current_cpu);
5944 const struct sem_fn_desc *sf;
5945 int mach_num = MACH_NUM (CPU_MACH (current_cpu));
5946
5947 for (sf = &sem_fns[0]; sf->fn != 0; ++sf)
5948 {
5949 const CGEN_INSN *insn = idesc_table[sf->index].idata;
5950 int valid_p = (CGEN_INSN_VIRTUAL_P (insn)
5951 || CGEN_INSN_MACH_HAS_P (insn, mach_num));
5952 #if FAST_P
5953 if (valid_p)
5954 idesc_table[sf->index].sem_fast = sf->fn;
5955 else
5956 idesc_table[sf->index].sem_fast = SEM_FN_NAME (sh64_media,x_invalid);
5957 #else
5958 if (valid_p)
5959 idesc_table[sf->index].sem_full = sf->fn;
5960 else
5961 idesc_table[sf->index].sem_full = SEM_FN_NAME (sh64_media,x_invalid);
5962 #endif
5963 }
5964 }
5965
This page took 0.211666 seconds and 5 git commands to generate.