* sim/sky/vu01reg-main.c: New file.
[binutils-gdb.git] / sim / m32r / semx.c
1 /* Simulator instruction semantics for m32rx.
2
3 This file is machine generated with CGEN.
4
5 Copyright (C) 1996, 1997, 1998 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
26 #define WANT_CPU_M32RX
27
28 #include "sim-main.h"
29 #include "cgen-mem.h"
30 #include "cgen-ops.h"
31 #include "cpu-sim.h"
32
33 #if ! WITH_SCACHE
34
35 #undef GET_ATTR
36 #define GET_ATTR(cpu, num, attr) CGEN_INSN_ATTR (abuf->idesc->opcode, CGEN_INSN_##attr)
37
38 /* add: add $dr,$sr. */
39
40 CIA
41 SEM_FN_NAME (m32rx,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
42 {
43 insn_t insn = SEM_INSN (sem_arg);
44 #define OPRND(f) par_exec->operands.fmt_add.f
45 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
46 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
47 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
48 EXTRACT_FMT_ADD_CODE
49
50 CPU (h_gr[f_r1]) = ADDSI (OPRND (dr), OPRND (sr));
51 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
52
53 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
54
55 #if WITH_PROFILE_MODEL_P
56 if (PROFILE_MODEL_P (current_cpu))
57 {
58 m32rx_model_mark_get_h_gr (current_cpu, abuf);
59 m32rx_model_mark_set_h_gr (current_cpu, abuf);
60 m32rx_model_profile_insn (current_cpu, abuf);
61 }
62 #endif
63
64 return new_pc;
65 #undef OPRND
66 }
67
68 /* add3: add3 $dr,$sr,$hash$slo16. */
69
70 CIA
71 SEM_FN_NAME (m32rx,add3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
72 {
73 insn_t insn = SEM_INSN (sem_arg);
74 #define OPRND(f) par_exec->operands.fmt_add3.f
75 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
76 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
77 EXTRACT_FMT_ADD3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
78 EXTRACT_FMT_ADD3_CODE
79
80 CPU (h_gr[f_r1]) = ADDSI (OPRND (sr), OPRND (slo16));
81 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
82
83 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
84
85 #if WITH_PROFILE_MODEL_P
86 if (PROFILE_MODEL_P (current_cpu))
87 {
88 m32rx_model_mark_get_h_gr (current_cpu, abuf);
89 m32rx_model_mark_set_h_gr (current_cpu, abuf);
90 m32rx_model_profile_insn (current_cpu, abuf);
91 }
92 #endif
93
94 return new_pc;
95 #undef OPRND
96 }
97
98 /* and: and $dr,$sr. */
99
100 CIA
101 SEM_FN_NAME (m32rx,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
102 {
103 insn_t insn = SEM_INSN (sem_arg);
104 #define OPRND(f) par_exec->operands.fmt_add.f
105 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
106 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
107 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
108 EXTRACT_FMT_ADD_CODE
109
110 CPU (h_gr[f_r1]) = ANDSI (OPRND (dr), OPRND (sr));
111 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
112
113 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
114
115 #if WITH_PROFILE_MODEL_P
116 if (PROFILE_MODEL_P (current_cpu))
117 {
118 m32rx_model_mark_get_h_gr (current_cpu, abuf);
119 m32rx_model_mark_set_h_gr (current_cpu, abuf);
120 m32rx_model_profile_insn (current_cpu, abuf);
121 }
122 #endif
123
124 return new_pc;
125 #undef OPRND
126 }
127
128 /* and3: and3 $dr,$sr,$uimm16. */
129
130 CIA
131 SEM_FN_NAME (m32rx,and3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
132 {
133 insn_t insn = SEM_INSN (sem_arg);
134 #define OPRND(f) par_exec->operands.fmt_and3.f
135 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
136 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
137 EXTRACT_FMT_AND3_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
138 EXTRACT_FMT_AND3_CODE
139
140 CPU (h_gr[f_r1]) = ANDSI (OPRND (sr), OPRND (uimm16));
141 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
142
143 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
144
145 #if WITH_PROFILE_MODEL_P
146 if (PROFILE_MODEL_P (current_cpu))
147 {
148 m32rx_model_mark_get_h_gr (current_cpu, abuf);
149 m32rx_model_mark_set_h_gr (current_cpu, abuf);
150 m32rx_model_profile_insn (current_cpu, abuf);
151 }
152 #endif
153
154 return new_pc;
155 #undef OPRND
156 }
157
158 /* or: or $dr,$sr. */
159
160 CIA
161 SEM_FN_NAME (m32rx,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
162 {
163 insn_t insn = SEM_INSN (sem_arg);
164 #define OPRND(f) par_exec->operands.fmt_add.f
165 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
166 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
167 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
168 EXTRACT_FMT_ADD_CODE
169
170 CPU (h_gr[f_r1]) = ORSI (OPRND (dr), OPRND (sr));
171 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
172
173 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
174
175 #if WITH_PROFILE_MODEL_P
176 if (PROFILE_MODEL_P (current_cpu))
177 {
178 m32rx_model_mark_get_h_gr (current_cpu, abuf);
179 m32rx_model_mark_set_h_gr (current_cpu, abuf);
180 m32rx_model_profile_insn (current_cpu, abuf);
181 }
182 #endif
183
184 return new_pc;
185 #undef OPRND
186 }
187
188 /* or3: or3 $dr,$sr,$hash$ulo16. */
189
190 CIA
191 SEM_FN_NAME (m32rx,or3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
192 {
193 insn_t insn = SEM_INSN (sem_arg);
194 #define OPRND(f) par_exec->operands.fmt_or3.f
195 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
196 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
197 EXTRACT_FMT_OR3_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
198 EXTRACT_FMT_OR3_CODE
199
200 CPU (h_gr[f_r1]) = ORSI (OPRND (sr), OPRND (ulo16));
201 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
202
203 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
204
205 #if WITH_PROFILE_MODEL_P
206 if (PROFILE_MODEL_P (current_cpu))
207 {
208 m32rx_model_mark_get_h_gr (current_cpu, abuf);
209 m32rx_model_mark_set_h_gr (current_cpu, abuf);
210 m32rx_model_profile_insn (current_cpu, abuf);
211 }
212 #endif
213
214 return new_pc;
215 #undef OPRND
216 }
217
218 /* xor: xor $dr,$sr. */
219
220 CIA
221 SEM_FN_NAME (m32rx,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
222 {
223 insn_t insn = SEM_INSN (sem_arg);
224 #define OPRND(f) par_exec->operands.fmt_add.f
225 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
226 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
227 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
228 EXTRACT_FMT_ADD_CODE
229
230 CPU (h_gr[f_r1]) = XORSI (OPRND (dr), OPRND (sr));
231 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
232
233 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
234
235 #if WITH_PROFILE_MODEL_P
236 if (PROFILE_MODEL_P (current_cpu))
237 {
238 m32rx_model_mark_get_h_gr (current_cpu, abuf);
239 m32rx_model_mark_set_h_gr (current_cpu, abuf);
240 m32rx_model_profile_insn (current_cpu, abuf);
241 }
242 #endif
243
244 return new_pc;
245 #undef OPRND
246 }
247
248 /* xor3: xor3 $dr,$sr,$uimm16. */
249
250 CIA
251 SEM_FN_NAME (m32rx,xor3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
252 {
253 insn_t insn = SEM_INSN (sem_arg);
254 #define OPRND(f) par_exec->operands.fmt_and3.f
255 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
256 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
257 EXTRACT_FMT_AND3_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
258 EXTRACT_FMT_AND3_CODE
259
260 CPU (h_gr[f_r1]) = XORSI (OPRND (sr), OPRND (uimm16));
261 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
262
263 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
264
265 #if WITH_PROFILE_MODEL_P
266 if (PROFILE_MODEL_P (current_cpu))
267 {
268 m32rx_model_mark_get_h_gr (current_cpu, abuf);
269 m32rx_model_mark_set_h_gr (current_cpu, abuf);
270 m32rx_model_profile_insn (current_cpu, abuf);
271 }
272 #endif
273
274 return new_pc;
275 #undef OPRND
276 }
277
278 /* addi: addi $dr,$simm8. */
279
280 CIA
281 SEM_FN_NAME (m32rx,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
282 {
283 insn_t insn = SEM_INSN (sem_arg);
284 #define OPRND(f) par_exec->operands.fmt_addi.f
285 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
286 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
287 EXTRACT_FMT_ADDI_VARS /* f-op1 f-r1 f-simm8 */
288 EXTRACT_FMT_ADDI_CODE
289
290 CPU (h_gr[f_r1]) = ADDSI (OPRND (dr), OPRND (simm8));
291 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
292
293 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
294
295 #if WITH_PROFILE_MODEL_P
296 if (PROFILE_MODEL_P (current_cpu))
297 {
298 m32rx_model_mark_get_h_gr (current_cpu, abuf);
299 m32rx_model_mark_set_h_gr (current_cpu, abuf);
300 m32rx_model_profile_insn (current_cpu, abuf);
301 }
302 #endif
303
304 return new_pc;
305 #undef OPRND
306 }
307
308 /* addv: addv $dr,$sr. */
309
310 CIA
311 SEM_FN_NAME (m32rx,addv) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
312 {
313 insn_t insn = SEM_INSN (sem_arg);
314 #define OPRND(f) par_exec->operands.fmt_addv.f
315 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
316 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
317 EXTRACT_FMT_ADDV_VARS /* f-op1 f-r1 f-op2 f-r2 */
318 EXTRACT_FMT_ADDV_CODE
319
320 do {
321 UBI temp1;SI temp0;
322 temp0 = ADDSI (OPRND (dr), OPRND (sr));
323 temp1 = ADDOFSI (OPRND (dr), OPRND (sr), 0);
324 CPU (h_gr[f_r1]) = temp0;
325 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
326 CPU (h_cond) = temp1;
327 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
328 } while (0);
329
330 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
331
332 #if WITH_PROFILE_MODEL_P
333 if (PROFILE_MODEL_P (current_cpu))
334 {
335 m32rx_model_mark_get_h_gr (current_cpu, abuf);
336 m32rx_model_mark_set_h_gr (current_cpu, abuf);
337 m32rx_model_profile_insn (current_cpu, abuf);
338 }
339 #endif
340
341 return new_pc;
342 #undef OPRND
343 }
344
345 /* addv3: addv3 $dr,$sr,$simm16. */
346
347 CIA
348 SEM_FN_NAME (m32rx,addv3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
349 {
350 insn_t insn = SEM_INSN (sem_arg);
351 #define OPRND(f) par_exec->operands.fmt_addv3.f
352 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
353 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
354 EXTRACT_FMT_ADDV3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
355 EXTRACT_FMT_ADDV3_CODE
356
357 do {
358 UBI temp1;SI temp0;
359 temp0 = ADDSI (OPRND (sr), OPRND (simm16));
360 temp1 = ADDOFSI (OPRND (sr), OPRND (simm16), 0);
361 CPU (h_gr[f_r1]) = temp0;
362 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
363 CPU (h_cond) = temp1;
364 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
365 } while (0);
366
367 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
368
369 #if WITH_PROFILE_MODEL_P
370 if (PROFILE_MODEL_P (current_cpu))
371 {
372 m32rx_model_mark_get_h_gr (current_cpu, abuf);
373 m32rx_model_mark_set_h_gr (current_cpu, abuf);
374 m32rx_model_profile_insn (current_cpu, abuf);
375 }
376 #endif
377
378 return new_pc;
379 #undef OPRND
380 }
381
382 /* addx: addx $dr,$sr. */
383
384 CIA
385 SEM_FN_NAME (m32rx,addx) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
386 {
387 insn_t insn = SEM_INSN (sem_arg);
388 #define OPRND(f) par_exec->operands.fmt_addx.f
389 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
390 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
391 EXTRACT_FMT_ADDX_VARS /* f-op1 f-r1 f-op2 f-r2 */
392 EXTRACT_FMT_ADDX_CODE
393
394 do {
395 UBI temp1;SI temp0;
396 temp0 = ADDCSI (OPRND (dr), OPRND (sr), OPRND (condbit));
397 temp1 = ADDCFSI (OPRND (dr), OPRND (sr), OPRND (condbit));
398 CPU (h_gr[f_r1]) = temp0;
399 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
400 CPU (h_cond) = temp1;
401 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
402 } while (0);
403
404 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
405
406 #if WITH_PROFILE_MODEL_P
407 if (PROFILE_MODEL_P (current_cpu))
408 {
409 m32rx_model_mark_get_h_gr (current_cpu, abuf);
410 m32rx_model_mark_set_h_gr (current_cpu, abuf);
411 m32rx_model_profile_insn (current_cpu, abuf);
412 }
413 #endif
414
415 return new_pc;
416 #undef OPRND
417 }
418
419 /* bc8: bc.s $disp8. */
420
421 CIA
422 SEM_FN_NAME (m32rx,bc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
423 {
424 insn_t insn = SEM_INSN (sem_arg);
425 #define OPRND(f) par_exec->operands.fmt_bc8.f
426 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
427 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
428 int taken_p = 0;
429 EXTRACT_FMT_BC8_VARS /* f-op1 f-r1 f-disp8 */
430 EXTRACT_FMT_BC8_CODE
431
432 if (OPRND (condbit)) {
433 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
434 taken_p = 1;
435 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
436 }
437
438 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
439
440 #if WITH_PROFILE_MODEL_P
441 if (PROFILE_MODEL_P (current_cpu))
442 {
443 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
444 }
445 #endif
446
447 return new_pc;
448 #undef OPRND
449 }
450
451 /* bc24: bc.l $disp24. */
452
453 CIA
454 SEM_FN_NAME (m32rx,bc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
455 {
456 insn_t insn = SEM_INSN (sem_arg);
457 #define OPRND(f) par_exec->operands.fmt_bc24.f
458 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
459 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
460 int taken_p = 0;
461 EXTRACT_FMT_BC24_VARS /* f-op1 f-r1 f-disp24 */
462 EXTRACT_FMT_BC24_CODE
463
464 if (OPRND (condbit)) {
465 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
466 taken_p = 1;
467 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
468 }
469
470 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
471
472 #if WITH_PROFILE_MODEL_P
473 if (PROFILE_MODEL_P (current_cpu))
474 {
475 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
476 }
477 #endif
478
479 return new_pc;
480 #undef OPRND
481 }
482
483 /* beq: beq $src1,$src2,$disp16. */
484
485 CIA
486 SEM_FN_NAME (m32rx,beq) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
487 {
488 insn_t insn = SEM_INSN (sem_arg);
489 #define OPRND(f) par_exec->operands.fmt_beq.f
490 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
491 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
492 int taken_p = 0;
493 EXTRACT_FMT_BEQ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
494 EXTRACT_FMT_BEQ_CODE
495
496 if (EQSI (OPRND (src1), OPRND (src2))) {
497 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
498 taken_p = 1;
499 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
500 }
501
502 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
503
504 #if WITH_PROFILE_MODEL_P
505 if (PROFILE_MODEL_P (current_cpu))
506 {
507 m32rx_model_mark_get_h_gr (current_cpu, abuf);
508 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
509 }
510 #endif
511
512 return new_pc;
513 #undef OPRND
514 }
515
516 /* beqz: beqz $src2,$disp16. */
517
518 CIA
519 SEM_FN_NAME (m32rx,beqz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
520 {
521 insn_t insn = SEM_INSN (sem_arg);
522 #define OPRND(f) par_exec->operands.fmt_beqz.f
523 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
524 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
525 int taken_p = 0;
526 EXTRACT_FMT_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
527 EXTRACT_FMT_BEQZ_CODE
528
529 if (EQSI (OPRND (src2), 0)) {
530 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
531 taken_p = 1;
532 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
533 }
534
535 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
536
537 #if WITH_PROFILE_MODEL_P
538 if (PROFILE_MODEL_P (current_cpu))
539 {
540 m32rx_model_mark_get_h_gr (current_cpu, abuf);
541 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
542 }
543 #endif
544
545 return new_pc;
546 #undef OPRND
547 }
548
549 /* bgez: bgez $src2,$disp16. */
550
551 CIA
552 SEM_FN_NAME (m32rx,bgez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
553 {
554 insn_t insn = SEM_INSN (sem_arg);
555 #define OPRND(f) par_exec->operands.fmt_beqz.f
556 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
557 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
558 int taken_p = 0;
559 EXTRACT_FMT_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
560 EXTRACT_FMT_BEQZ_CODE
561
562 if (GESI (OPRND (src2), 0)) {
563 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
564 taken_p = 1;
565 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
566 }
567
568 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
569
570 #if WITH_PROFILE_MODEL_P
571 if (PROFILE_MODEL_P (current_cpu))
572 {
573 m32rx_model_mark_get_h_gr (current_cpu, abuf);
574 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
575 }
576 #endif
577
578 return new_pc;
579 #undef OPRND
580 }
581
582 /* bgtz: bgtz $src2,$disp16. */
583
584 CIA
585 SEM_FN_NAME (m32rx,bgtz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
586 {
587 insn_t insn = SEM_INSN (sem_arg);
588 #define OPRND(f) par_exec->operands.fmt_beqz.f
589 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
590 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
591 int taken_p = 0;
592 EXTRACT_FMT_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
593 EXTRACT_FMT_BEQZ_CODE
594
595 if (GTSI (OPRND (src2), 0)) {
596 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
597 taken_p = 1;
598 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
599 }
600
601 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
602
603 #if WITH_PROFILE_MODEL_P
604 if (PROFILE_MODEL_P (current_cpu))
605 {
606 m32rx_model_mark_get_h_gr (current_cpu, abuf);
607 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
608 }
609 #endif
610
611 return new_pc;
612 #undef OPRND
613 }
614
615 /* blez: blez $src2,$disp16. */
616
617 CIA
618 SEM_FN_NAME (m32rx,blez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
619 {
620 insn_t insn = SEM_INSN (sem_arg);
621 #define OPRND(f) par_exec->operands.fmt_beqz.f
622 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
623 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
624 int taken_p = 0;
625 EXTRACT_FMT_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
626 EXTRACT_FMT_BEQZ_CODE
627
628 if (LESI (OPRND (src2), 0)) {
629 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
630 taken_p = 1;
631 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
632 }
633
634 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
635
636 #if WITH_PROFILE_MODEL_P
637 if (PROFILE_MODEL_P (current_cpu))
638 {
639 m32rx_model_mark_get_h_gr (current_cpu, abuf);
640 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
641 }
642 #endif
643
644 return new_pc;
645 #undef OPRND
646 }
647
648 /* bltz: bltz $src2,$disp16. */
649
650 CIA
651 SEM_FN_NAME (m32rx,bltz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
652 {
653 insn_t insn = SEM_INSN (sem_arg);
654 #define OPRND(f) par_exec->operands.fmt_beqz.f
655 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
656 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
657 int taken_p = 0;
658 EXTRACT_FMT_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
659 EXTRACT_FMT_BEQZ_CODE
660
661 if (LTSI (OPRND (src2), 0)) {
662 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
663 taken_p = 1;
664 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
665 }
666
667 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
668
669 #if WITH_PROFILE_MODEL_P
670 if (PROFILE_MODEL_P (current_cpu))
671 {
672 m32rx_model_mark_get_h_gr (current_cpu, abuf);
673 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
674 }
675 #endif
676
677 return new_pc;
678 #undef OPRND
679 }
680
681 /* bnez: bnez $src2,$disp16. */
682
683 CIA
684 SEM_FN_NAME (m32rx,bnez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
685 {
686 insn_t insn = SEM_INSN (sem_arg);
687 #define OPRND(f) par_exec->operands.fmt_beqz.f
688 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
689 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
690 int taken_p = 0;
691 EXTRACT_FMT_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
692 EXTRACT_FMT_BEQZ_CODE
693
694 if (NESI (OPRND (src2), 0)) {
695 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
696 taken_p = 1;
697 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
698 }
699
700 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
701
702 #if WITH_PROFILE_MODEL_P
703 if (PROFILE_MODEL_P (current_cpu))
704 {
705 m32rx_model_mark_get_h_gr (current_cpu, abuf);
706 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
707 }
708 #endif
709
710 return new_pc;
711 #undef OPRND
712 }
713
714 /* bl8: bl.s $disp8. */
715
716 CIA
717 SEM_FN_NAME (m32rx,bl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
718 {
719 insn_t insn = SEM_INSN (sem_arg);
720 #define OPRND(f) par_exec->operands.fmt_bl8.f
721 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
722 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
723 int taken_p = 0;
724 EXTRACT_FMT_BL8_VARS /* f-op1 f-r1 f-disp8 */
725 EXTRACT_FMT_BL8_CODE
726
727 do {
728 CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
729 TRACE_RESULT (current_cpu, "gr-14", 'x', CPU (h_gr[14]));
730 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
731 taken_p = 1;
732 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
733 } while (0);
734
735 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
736
737 #if WITH_PROFILE_MODEL_P
738 if (PROFILE_MODEL_P (current_cpu))
739 {
740 m32rx_model_mark_set_h_gr (current_cpu, abuf);
741 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
742 }
743 #endif
744
745 return new_pc;
746 #undef OPRND
747 }
748
749 /* bl24: bl.l $disp24. */
750
751 CIA
752 SEM_FN_NAME (m32rx,bl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
753 {
754 insn_t insn = SEM_INSN (sem_arg);
755 #define OPRND(f) par_exec->operands.fmt_bl24.f
756 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
757 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
758 int taken_p = 0;
759 EXTRACT_FMT_BL24_VARS /* f-op1 f-r1 f-disp24 */
760 EXTRACT_FMT_BL24_CODE
761
762 do {
763 CPU (h_gr[14]) = ADDSI (OPRND (pc), 4);
764 TRACE_RESULT (current_cpu, "gr-14", 'x', CPU (h_gr[14]));
765 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
766 taken_p = 1;
767 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
768 } while (0);
769
770 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
771
772 #if WITH_PROFILE_MODEL_P
773 if (PROFILE_MODEL_P (current_cpu))
774 {
775 m32rx_model_mark_set_h_gr (current_cpu, abuf);
776 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
777 }
778 #endif
779
780 return new_pc;
781 #undef OPRND
782 }
783
784 /* bcl8: bcl.s $disp8. */
785
786 CIA
787 SEM_FN_NAME (m32rx,bcl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
788 {
789 insn_t insn = SEM_INSN (sem_arg);
790 #define OPRND(f) par_exec->operands.fmt_bcl8.f
791 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
792 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
793 int taken_p = 0;
794 EXTRACT_FMT_BCL8_VARS /* f-op1 f-r1 f-disp8 */
795 EXTRACT_FMT_BCL8_CODE
796
797 if (OPRND (condbit)) {
798 do {
799 CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
800 TRACE_RESULT (current_cpu, "gr-14", 'x', CPU (h_gr[14]));
801 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
802 taken_p = 1;
803 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
804 } while (0);
805 }
806
807 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
808
809 #if WITH_PROFILE_MODEL_P
810 if (PROFILE_MODEL_P (current_cpu))
811 {
812 m32rx_model_mark_set_h_gr (current_cpu, abuf);
813 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
814 }
815 #endif
816
817 return new_pc;
818 #undef OPRND
819 }
820
821 /* bcl24: bcl.l $disp24. */
822
823 CIA
824 SEM_FN_NAME (m32rx,bcl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
825 {
826 insn_t insn = SEM_INSN (sem_arg);
827 #define OPRND(f) par_exec->operands.fmt_bcl24.f
828 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
829 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
830 int taken_p = 0;
831 EXTRACT_FMT_BCL24_VARS /* f-op1 f-r1 f-disp24 */
832 EXTRACT_FMT_BCL24_CODE
833
834 if (OPRND (condbit)) {
835 do {
836 CPU (h_gr[14]) = ADDSI (OPRND (pc), 4);
837 TRACE_RESULT (current_cpu, "gr-14", 'x', CPU (h_gr[14]));
838 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
839 taken_p = 1;
840 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
841 } while (0);
842 }
843
844 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
845
846 #if WITH_PROFILE_MODEL_P
847 if (PROFILE_MODEL_P (current_cpu))
848 {
849 m32rx_model_mark_set_h_gr (current_cpu, abuf);
850 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
851 }
852 #endif
853
854 return new_pc;
855 #undef OPRND
856 }
857
858 /* bnc8: bnc.s $disp8. */
859
860 CIA
861 SEM_FN_NAME (m32rx,bnc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
862 {
863 insn_t insn = SEM_INSN (sem_arg);
864 #define OPRND(f) par_exec->operands.fmt_bc8.f
865 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
866 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
867 int taken_p = 0;
868 EXTRACT_FMT_BC8_VARS /* f-op1 f-r1 f-disp8 */
869 EXTRACT_FMT_BC8_CODE
870
871 if (NOTBI (OPRND (condbit))) {
872 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
873 taken_p = 1;
874 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
875 }
876
877 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
878
879 #if WITH_PROFILE_MODEL_P
880 if (PROFILE_MODEL_P (current_cpu))
881 {
882 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
883 }
884 #endif
885
886 return new_pc;
887 #undef OPRND
888 }
889
890 /* bnc24: bnc.l $disp24. */
891
892 CIA
893 SEM_FN_NAME (m32rx,bnc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
894 {
895 insn_t insn = SEM_INSN (sem_arg);
896 #define OPRND(f) par_exec->operands.fmt_bc24.f
897 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
898 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
899 int taken_p = 0;
900 EXTRACT_FMT_BC24_VARS /* f-op1 f-r1 f-disp24 */
901 EXTRACT_FMT_BC24_CODE
902
903 if (NOTBI (OPRND (condbit))) {
904 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
905 taken_p = 1;
906 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
907 }
908
909 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
910
911 #if WITH_PROFILE_MODEL_P
912 if (PROFILE_MODEL_P (current_cpu))
913 {
914 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
915 }
916 #endif
917
918 return new_pc;
919 #undef OPRND
920 }
921
922 /* bne: bne $src1,$src2,$disp16. */
923
924 CIA
925 SEM_FN_NAME (m32rx,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
926 {
927 insn_t insn = SEM_INSN (sem_arg);
928 #define OPRND(f) par_exec->operands.fmt_beq.f
929 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
930 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
931 int taken_p = 0;
932 EXTRACT_FMT_BEQ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
933 EXTRACT_FMT_BEQ_CODE
934
935 if (NESI (OPRND (src1), OPRND (src2))) {
936 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
937 taken_p = 1;
938 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
939 }
940
941 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
942
943 #if WITH_PROFILE_MODEL_P
944 if (PROFILE_MODEL_P (current_cpu))
945 {
946 m32rx_model_mark_get_h_gr (current_cpu, abuf);
947 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
948 }
949 #endif
950
951 return new_pc;
952 #undef OPRND
953 }
954
955 /* bra8: bra.s $disp8. */
956
957 CIA
958 SEM_FN_NAME (m32rx,bra8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
959 {
960 insn_t insn = SEM_INSN (sem_arg);
961 #define OPRND(f) par_exec->operands.fmt_bra8.f
962 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
963 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
964 int taken_p = 0;
965 EXTRACT_FMT_BRA8_VARS /* f-op1 f-r1 f-disp8 */
966 EXTRACT_FMT_BRA8_CODE
967
968 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
969 taken_p = 1;
970 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
971
972 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
973
974 #if WITH_PROFILE_MODEL_P
975 if (PROFILE_MODEL_P (current_cpu))
976 {
977 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
978 }
979 #endif
980
981 return new_pc;
982 #undef OPRND
983 }
984
985 /* bra24: bra.l $disp24. */
986
987 CIA
988 SEM_FN_NAME (m32rx,bra24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
989 {
990 insn_t insn = SEM_INSN (sem_arg);
991 #define OPRND(f) par_exec->operands.fmt_bra24.f
992 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
993 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
994 int taken_p = 0;
995 EXTRACT_FMT_BRA24_VARS /* f-op1 f-r1 f-disp24 */
996 EXTRACT_FMT_BRA24_CODE
997
998 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
999 taken_p = 1;
1000 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
1001
1002 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1003
1004 #if WITH_PROFILE_MODEL_P
1005 if (PROFILE_MODEL_P (current_cpu))
1006 {
1007 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1008 }
1009 #endif
1010
1011 return new_pc;
1012 #undef OPRND
1013 }
1014
1015 /* bncl8: bncl.s $disp8. */
1016
1017 CIA
1018 SEM_FN_NAME (m32rx,bncl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1019 {
1020 insn_t insn = SEM_INSN (sem_arg);
1021 #define OPRND(f) par_exec->operands.fmt_bcl8.f
1022 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1023 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1024 int taken_p = 0;
1025 EXTRACT_FMT_BCL8_VARS /* f-op1 f-r1 f-disp8 */
1026 EXTRACT_FMT_BCL8_CODE
1027
1028 if (NOTBI (OPRND (condbit))) {
1029 do {
1030 CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
1031 TRACE_RESULT (current_cpu, "gr-14", 'x', CPU (h_gr[14]));
1032 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
1033 taken_p = 1;
1034 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
1035 } while (0);
1036 }
1037
1038 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1039
1040 #if WITH_PROFILE_MODEL_P
1041 if (PROFILE_MODEL_P (current_cpu))
1042 {
1043 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1044 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1045 }
1046 #endif
1047
1048 return new_pc;
1049 #undef OPRND
1050 }
1051
1052 /* bncl24: bncl.l $disp24. */
1053
1054 CIA
1055 SEM_FN_NAME (m32rx,bncl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1056 {
1057 insn_t insn = SEM_INSN (sem_arg);
1058 #define OPRND(f) par_exec->operands.fmt_bcl24.f
1059 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1060 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1061 int taken_p = 0;
1062 EXTRACT_FMT_BCL24_VARS /* f-op1 f-r1 f-disp24 */
1063 EXTRACT_FMT_BCL24_CODE
1064
1065 if (NOTBI (OPRND (condbit))) {
1066 do {
1067 CPU (h_gr[14]) = ADDSI (OPRND (pc), 4);
1068 TRACE_RESULT (current_cpu, "gr-14", 'x', CPU (h_gr[14]));
1069 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
1070 taken_p = 1;
1071 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
1072 } while (0);
1073 }
1074
1075 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1076
1077 #if WITH_PROFILE_MODEL_P
1078 if (PROFILE_MODEL_P (current_cpu))
1079 {
1080 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1081 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1082 }
1083 #endif
1084
1085 return new_pc;
1086 #undef OPRND
1087 }
1088
1089 /* cmp: cmp $src1,$src2. */
1090
1091 CIA
1092 SEM_FN_NAME (m32rx,cmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1093 {
1094 insn_t insn = SEM_INSN (sem_arg);
1095 #define OPRND(f) par_exec->operands.fmt_cmp.f
1096 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1097 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1098 EXTRACT_FMT_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1099 EXTRACT_FMT_CMP_CODE
1100
1101 CPU (h_cond) = LTSI (OPRND (src1), OPRND (src2));
1102 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1103
1104 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1105
1106 #if WITH_PROFILE_MODEL_P
1107 if (PROFILE_MODEL_P (current_cpu))
1108 {
1109 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1110 m32rx_model_profile_insn (current_cpu, abuf);
1111 }
1112 #endif
1113
1114 return new_pc;
1115 #undef OPRND
1116 }
1117
1118 /* cmpi: cmpi $src2,$simm16. */
1119
1120 CIA
1121 SEM_FN_NAME (m32rx,cmpi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1122 {
1123 insn_t insn = SEM_INSN (sem_arg);
1124 #define OPRND(f) par_exec->operands.fmt_cmpi.f
1125 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1126 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1127 EXTRACT_FMT_CMPI_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1128 EXTRACT_FMT_CMPI_CODE
1129
1130 CPU (h_cond) = LTSI (OPRND (src2), OPRND (simm16));
1131 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1132
1133 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1134
1135 #if WITH_PROFILE_MODEL_P
1136 if (PROFILE_MODEL_P (current_cpu))
1137 {
1138 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1139 m32rx_model_profile_insn (current_cpu, abuf);
1140 }
1141 #endif
1142
1143 return new_pc;
1144 #undef OPRND
1145 }
1146
1147 /* cmpu: cmpu $src1,$src2. */
1148
1149 CIA
1150 SEM_FN_NAME (m32rx,cmpu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1151 {
1152 insn_t insn = SEM_INSN (sem_arg);
1153 #define OPRND(f) par_exec->operands.fmt_cmp.f
1154 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1155 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1156 EXTRACT_FMT_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1157 EXTRACT_FMT_CMP_CODE
1158
1159 CPU (h_cond) = LTUSI (OPRND (src1), OPRND (src2));
1160 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1161
1162 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1163
1164 #if WITH_PROFILE_MODEL_P
1165 if (PROFILE_MODEL_P (current_cpu))
1166 {
1167 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1168 m32rx_model_profile_insn (current_cpu, abuf);
1169 }
1170 #endif
1171
1172 return new_pc;
1173 #undef OPRND
1174 }
1175
1176 /* cmpui: cmpui $src2,$simm16. */
1177
1178 CIA
1179 SEM_FN_NAME (m32rx,cmpui) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1180 {
1181 insn_t insn = SEM_INSN (sem_arg);
1182 #define OPRND(f) par_exec->operands.fmt_cmpi.f
1183 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1184 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1185 EXTRACT_FMT_CMPI_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1186 EXTRACT_FMT_CMPI_CODE
1187
1188 CPU (h_cond) = LTUSI (OPRND (src2), OPRND (simm16));
1189 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1190
1191 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1192
1193 #if WITH_PROFILE_MODEL_P
1194 if (PROFILE_MODEL_P (current_cpu))
1195 {
1196 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1197 m32rx_model_profile_insn (current_cpu, abuf);
1198 }
1199 #endif
1200
1201 return new_pc;
1202 #undef OPRND
1203 }
1204
1205 /* cmpeq: cmpeq $src1,$src2. */
1206
1207 CIA
1208 SEM_FN_NAME (m32rx,cmpeq) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1209 {
1210 insn_t insn = SEM_INSN (sem_arg);
1211 #define OPRND(f) par_exec->operands.fmt_cmp.f
1212 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1213 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1214 EXTRACT_FMT_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1215 EXTRACT_FMT_CMP_CODE
1216
1217 CPU (h_cond) = EQSI (OPRND (src1), OPRND (src2));
1218 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1219
1220 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1221
1222 #if WITH_PROFILE_MODEL_P
1223 if (PROFILE_MODEL_P (current_cpu))
1224 {
1225 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1226 m32rx_model_profile_insn (current_cpu, abuf);
1227 }
1228 #endif
1229
1230 return new_pc;
1231 #undef OPRND
1232 }
1233
1234 /* cmpz: cmpz $src2. */
1235
1236 CIA
1237 SEM_FN_NAME (m32rx,cmpz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1238 {
1239 insn_t insn = SEM_INSN (sem_arg);
1240 #define OPRND(f) par_exec->operands.fmt_cmpz.f
1241 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1242 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1243 EXTRACT_FMT_CMPZ_VARS /* f-op1 f-r1 f-op2 f-r2 */
1244 EXTRACT_FMT_CMPZ_CODE
1245
1246 CPU (h_cond) = EQSI (OPRND (src2), 0);
1247 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1248
1249 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1250
1251 #if WITH_PROFILE_MODEL_P
1252 if (PROFILE_MODEL_P (current_cpu))
1253 {
1254 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1255 m32rx_model_profile_insn (current_cpu, abuf);
1256 }
1257 #endif
1258
1259 return new_pc;
1260 #undef OPRND
1261 }
1262
1263 /* div: div $dr,$sr. */
1264
1265 CIA
1266 SEM_FN_NAME (m32rx,div) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1267 {
1268 insn_t insn = SEM_INSN (sem_arg);
1269 #define OPRND(f) par_exec->operands.fmt_div.f
1270 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1271 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1272 EXTRACT_FMT_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1273 EXTRACT_FMT_DIV_CODE
1274
1275 if (NESI (OPRND (sr), 0)) {
1276 CPU (h_gr[f_r1]) = DIVSI (OPRND (dr), OPRND (sr));
1277 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1278 }
1279
1280 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1281
1282 #if WITH_PROFILE_MODEL_P
1283 if (PROFILE_MODEL_P (current_cpu))
1284 {
1285 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1286 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1287 m32rx_model_profile_insn (current_cpu, abuf);
1288 }
1289 #endif
1290
1291 return new_pc;
1292 #undef OPRND
1293 }
1294
1295 /* divu: divu $dr,$sr. */
1296
1297 CIA
1298 SEM_FN_NAME (m32rx,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1299 {
1300 insn_t insn = SEM_INSN (sem_arg);
1301 #define OPRND(f) par_exec->operands.fmt_div.f
1302 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1303 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1304 EXTRACT_FMT_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1305 EXTRACT_FMT_DIV_CODE
1306
1307 if (NESI (OPRND (sr), 0)) {
1308 CPU (h_gr[f_r1]) = UDIVSI (OPRND (dr), OPRND (sr));
1309 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1310 }
1311
1312 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1313
1314 #if WITH_PROFILE_MODEL_P
1315 if (PROFILE_MODEL_P (current_cpu))
1316 {
1317 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1318 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1319 m32rx_model_profile_insn (current_cpu, abuf);
1320 }
1321 #endif
1322
1323 return new_pc;
1324 #undef OPRND
1325 }
1326
1327 /* rem: rem $dr,$sr. */
1328
1329 CIA
1330 SEM_FN_NAME (m32rx,rem) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1331 {
1332 insn_t insn = SEM_INSN (sem_arg);
1333 #define OPRND(f) par_exec->operands.fmt_div.f
1334 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1335 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1336 EXTRACT_FMT_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1337 EXTRACT_FMT_DIV_CODE
1338
1339 if (NESI (OPRND (sr), 0)) {
1340 CPU (h_gr[f_r1]) = MODSI (OPRND (dr), OPRND (sr));
1341 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1342 }
1343
1344 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1345
1346 #if WITH_PROFILE_MODEL_P
1347 if (PROFILE_MODEL_P (current_cpu))
1348 {
1349 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1350 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1351 m32rx_model_profile_insn (current_cpu, abuf);
1352 }
1353 #endif
1354
1355 return new_pc;
1356 #undef OPRND
1357 }
1358
1359 /* remu: remu $dr,$sr. */
1360
1361 CIA
1362 SEM_FN_NAME (m32rx,remu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1363 {
1364 insn_t insn = SEM_INSN (sem_arg);
1365 #define OPRND(f) par_exec->operands.fmt_div.f
1366 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1367 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1368 EXTRACT_FMT_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1369 EXTRACT_FMT_DIV_CODE
1370
1371 if (NESI (OPRND (sr), 0)) {
1372 CPU (h_gr[f_r1]) = UMODSI (OPRND (dr), OPRND (sr));
1373 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1374 }
1375
1376 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1377
1378 #if WITH_PROFILE_MODEL_P
1379 if (PROFILE_MODEL_P (current_cpu))
1380 {
1381 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1382 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1383 m32rx_model_profile_insn (current_cpu, abuf);
1384 }
1385 #endif
1386
1387 return new_pc;
1388 #undef OPRND
1389 }
1390
1391 /* divh: divh $dr,$sr. */
1392
1393 CIA
1394 SEM_FN_NAME (m32rx,divh) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1395 {
1396 insn_t insn = SEM_INSN (sem_arg);
1397 #define OPRND(f) par_exec->operands.fmt_div.f
1398 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1399 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1400 EXTRACT_FMT_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1401 EXTRACT_FMT_DIV_CODE
1402
1403 if (NESI (OPRND (sr), 0)) {
1404 CPU (h_gr[f_r1]) = DIVSI (EXTHISI (TRUNCSIHI (OPRND (dr))), OPRND (sr));
1405 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1406 }
1407
1408 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1409
1410 #if WITH_PROFILE_MODEL_P
1411 if (PROFILE_MODEL_P (current_cpu))
1412 {
1413 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1414 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1415 m32rx_model_profile_insn (current_cpu, abuf);
1416 }
1417 #endif
1418
1419 return new_pc;
1420 #undef OPRND
1421 }
1422
1423 /* jc: jc $sr. */
1424
1425 CIA
1426 SEM_FN_NAME (m32rx,jc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1427 {
1428 insn_t insn = SEM_INSN (sem_arg);
1429 #define OPRND(f) par_exec->operands.fmt_jc.f
1430 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1431 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1432 int taken_p = 0;
1433 EXTRACT_FMT_JC_VARS /* f-op1 f-r1 f-op2 f-r2 */
1434 EXTRACT_FMT_JC_CODE
1435
1436 if (OPRND (condbit)) {
1437 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, ANDSI (OPRND (sr), -4)));
1438 taken_p = 1;
1439 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
1440 }
1441
1442 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1443
1444 #if WITH_PROFILE_MODEL_P
1445 if (PROFILE_MODEL_P (current_cpu))
1446 {
1447 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1448 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1449 }
1450 #endif
1451
1452 return new_pc;
1453 #undef OPRND
1454 }
1455
1456 /* jnc: jnc $sr. */
1457
1458 CIA
1459 SEM_FN_NAME (m32rx,jnc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1460 {
1461 insn_t insn = SEM_INSN (sem_arg);
1462 #define OPRND(f) par_exec->operands.fmt_jc.f
1463 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1464 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1465 int taken_p = 0;
1466 EXTRACT_FMT_JC_VARS /* f-op1 f-r1 f-op2 f-r2 */
1467 EXTRACT_FMT_JC_CODE
1468
1469 if (NOTBI (OPRND (condbit))) {
1470 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, ANDSI (OPRND (sr), -4)));
1471 taken_p = 1;
1472 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
1473 }
1474
1475 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1476
1477 #if WITH_PROFILE_MODEL_P
1478 if (PROFILE_MODEL_P (current_cpu))
1479 {
1480 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1481 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1482 }
1483 #endif
1484
1485 return new_pc;
1486 #undef OPRND
1487 }
1488
1489 /* jl: jl $sr. */
1490
1491 CIA
1492 SEM_FN_NAME (m32rx,jl) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1493 {
1494 insn_t insn = SEM_INSN (sem_arg);
1495 #define OPRND(f) par_exec->operands.fmt_jl.f
1496 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1497 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1498 int taken_p = 0;
1499 EXTRACT_FMT_JL_VARS /* f-op1 f-r1 f-op2 f-r2 */
1500 EXTRACT_FMT_JL_CODE
1501
1502 do {
1503 USI temp1;SI temp0;
1504 temp0 = ADDSI (ANDSI (OPRND (pc), -4), 4);
1505 temp1 = ANDSI (OPRND (sr), -4);
1506 CPU (h_gr[14]) = temp0;
1507 TRACE_RESULT (current_cpu, "gr-14", 'x', CPU (h_gr[14]));
1508 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, temp1));
1509 taken_p = 1;
1510 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
1511 } while (0);
1512
1513 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1514
1515 #if WITH_PROFILE_MODEL_P
1516 if (PROFILE_MODEL_P (current_cpu))
1517 {
1518 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1519 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1520 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1521 }
1522 #endif
1523
1524 return new_pc;
1525 #undef OPRND
1526 }
1527
1528 /* jmp: jmp $sr. */
1529
1530 CIA
1531 SEM_FN_NAME (m32rx,jmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1532 {
1533 insn_t insn = SEM_INSN (sem_arg);
1534 #define OPRND(f) par_exec->operands.fmt_jmp.f
1535 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1536 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1537 int taken_p = 0;
1538 EXTRACT_FMT_JMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1539 EXTRACT_FMT_JMP_CODE
1540
1541 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, ANDSI (OPRND (sr), -4)));
1542 taken_p = 1;
1543 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
1544
1545 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1546
1547 #if WITH_PROFILE_MODEL_P
1548 if (PROFILE_MODEL_P (current_cpu))
1549 {
1550 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1551 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1552 }
1553 #endif
1554
1555 return new_pc;
1556 #undef OPRND
1557 }
1558
1559 /* ld: ld $dr,@$sr. */
1560
1561 CIA
1562 SEM_FN_NAME (m32rx,ld) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1563 {
1564 insn_t insn = SEM_INSN (sem_arg);
1565 #define OPRND(f) par_exec->operands.fmt_ld.f
1566 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1567 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1568 EXTRACT_FMT_LD_VARS /* f-op1 f-r1 f-op2 f-r2 */
1569 EXTRACT_FMT_LD_CODE
1570
1571 CPU (h_gr[f_r1]) = OPRND (h_memory_sr);
1572 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1573
1574 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1575
1576 #if WITH_PROFILE_MODEL_P
1577 if (PROFILE_MODEL_P (current_cpu))
1578 {
1579 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1580 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1581 m32rx_model_profile_insn (current_cpu, abuf);
1582 }
1583 #endif
1584
1585 return new_pc;
1586 #undef OPRND
1587 }
1588
1589 /* ld-d: ld $dr,@($slo16,$sr). */
1590
1591 CIA
1592 SEM_FN_NAME (m32rx,ld_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1593 {
1594 insn_t insn = SEM_INSN (sem_arg);
1595 #define OPRND(f) par_exec->operands.fmt_ld_d.f
1596 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1597 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1598 EXTRACT_FMT_LD_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1599 EXTRACT_FMT_LD_D_CODE
1600
1601 CPU (h_gr[f_r1]) = OPRND (h_memory_add__VM_sr_slo16);
1602 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1603
1604 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1605
1606 #if WITH_PROFILE_MODEL_P
1607 if (PROFILE_MODEL_P (current_cpu))
1608 {
1609 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1610 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1611 m32rx_model_profile_insn (current_cpu, abuf);
1612 }
1613 #endif
1614
1615 return new_pc;
1616 #undef OPRND
1617 }
1618
1619 /* ldb: ldb $dr,@$sr. */
1620
1621 CIA
1622 SEM_FN_NAME (m32rx,ldb) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1623 {
1624 insn_t insn = SEM_INSN (sem_arg);
1625 #define OPRND(f) par_exec->operands.fmt_ldb.f
1626 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1627 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1628 EXTRACT_FMT_LDB_VARS /* f-op1 f-r1 f-op2 f-r2 */
1629 EXTRACT_FMT_LDB_CODE
1630
1631 CPU (h_gr[f_r1]) = EXTQISI (OPRND (h_memory_sr));
1632 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1633
1634 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1635
1636 #if WITH_PROFILE_MODEL_P
1637 if (PROFILE_MODEL_P (current_cpu))
1638 {
1639 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1640 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1641 m32rx_model_profile_insn (current_cpu, abuf);
1642 }
1643 #endif
1644
1645 return new_pc;
1646 #undef OPRND
1647 }
1648
1649 /* ldb-d: ldb $dr,@($slo16,$sr). */
1650
1651 CIA
1652 SEM_FN_NAME (m32rx,ldb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1653 {
1654 insn_t insn = SEM_INSN (sem_arg);
1655 #define OPRND(f) par_exec->operands.fmt_ldb_d.f
1656 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1657 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1658 EXTRACT_FMT_LDB_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1659 EXTRACT_FMT_LDB_D_CODE
1660
1661 CPU (h_gr[f_r1]) = EXTQISI (OPRND (h_memory_add__VM_sr_slo16));
1662 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1663
1664 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1665
1666 #if WITH_PROFILE_MODEL_P
1667 if (PROFILE_MODEL_P (current_cpu))
1668 {
1669 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1670 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1671 m32rx_model_profile_insn (current_cpu, abuf);
1672 }
1673 #endif
1674
1675 return new_pc;
1676 #undef OPRND
1677 }
1678
1679 /* ldh: ldh $dr,@$sr. */
1680
1681 CIA
1682 SEM_FN_NAME (m32rx,ldh) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1683 {
1684 insn_t insn = SEM_INSN (sem_arg);
1685 #define OPRND(f) par_exec->operands.fmt_ldh.f
1686 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1687 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1688 EXTRACT_FMT_LDH_VARS /* f-op1 f-r1 f-op2 f-r2 */
1689 EXTRACT_FMT_LDH_CODE
1690
1691 CPU (h_gr[f_r1]) = EXTHISI (OPRND (h_memory_sr));
1692 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1693
1694 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1695
1696 #if WITH_PROFILE_MODEL_P
1697 if (PROFILE_MODEL_P (current_cpu))
1698 {
1699 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1700 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1701 m32rx_model_profile_insn (current_cpu, abuf);
1702 }
1703 #endif
1704
1705 return new_pc;
1706 #undef OPRND
1707 }
1708
1709 /* ldh-d: ldh $dr,@($slo16,$sr). */
1710
1711 CIA
1712 SEM_FN_NAME (m32rx,ldh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1713 {
1714 insn_t insn = SEM_INSN (sem_arg);
1715 #define OPRND(f) par_exec->operands.fmt_ldh_d.f
1716 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1717 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1718 EXTRACT_FMT_LDH_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1719 EXTRACT_FMT_LDH_D_CODE
1720
1721 CPU (h_gr[f_r1]) = EXTHISI (OPRND (h_memory_add__VM_sr_slo16));
1722 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1723
1724 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1725
1726 #if WITH_PROFILE_MODEL_P
1727 if (PROFILE_MODEL_P (current_cpu))
1728 {
1729 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1730 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1731 m32rx_model_profile_insn (current_cpu, abuf);
1732 }
1733 #endif
1734
1735 return new_pc;
1736 #undef OPRND
1737 }
1738
1739 /* ldub: ldub $dr,@$sr. */
1740
1741 CIA
1742 SEM_FN_NAME (m32rx,ldub) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1743 {
1744 insn_t insn = SEM_INSN (sem_arg);
1745 #define OPRND(f) par_exec->operands.fmt_ldb.f
1746 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1747 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1748 EXTRACT_FMT_LDB_VARS /* f-op1 f-r1 f-op2 f-r2 */
1749 EXTRACT_FMT_LDB_CODE
1750
1751 CPU (h_gr[f_r1]) = ZEXTQISI (OPRND (h_memory_sr));
1752 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1753
1754 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1755
1756 #if WITH_PROFILE_MODEL_P
1757 if (PROFILE_MODEL_P (current_cpu))
1758 {
1759 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1760 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1761 m32rx_model_profile_insn (current_cpu, abuf);
1762 }
1763 #endif
1764
1765 return new_pc;
1766 #undef OPRND
1767 }
1768
1769 /* ldub-d: ldub $dr,@($slo16,$sr). */
1770
1771 CIA
1772 SEM_FN_NAME (m32rx,ldub_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1773 {
1774 insn_t insn = SEM_INSN (sem_arg);
1775 #define OPRND(f) par_exec->operands.fmt_ldb_d.f
1776 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1777 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1778 EXTRACT_FMT_LDB_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1779 EXTRACT_FMT_LDB_D_CODE
1780
1781 CPU (h_gr[f_r1]) = ZEXTQISI (OPRND (h_memory_add__VM_sr_slo16));
1782 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1783
1784 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1785
1786 #if WITH_PROFILE_MODEL_P
1787 if (PROFILE_MODEL_P (current_cpu))
1788 {
1789 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1790 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1791 m32rx_model_profile_insn (current_cpu, abuf);
1792 }
1793 #endif
1794
1795 return new_pc;
1796 #undef OPRND
1797 }
1798
1799 /* lduh: lduh $dr,@$sr. */
1800
1801 CIA
1802 SEM_FN_NAME (m32rx,lduh) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1803 {
1804 insn_t insn = SEM_INSN (sem_arg);
1805 #define OPRND(f) par_exec->operands.fmt_ldh.f
1806 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1807 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1808 EXTRACT_FMT_LDH_VARS /* f-op1 f-r1 f-op2 f-r2 */
1809 EXTRACT_FMT_LDH_CODE
1810
1811 CPU (h_gr[f_r1]) = ZEXTHISI (OPRND (h_memory_sr));
1812 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1813
1814 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1815
1816 #if WITH_PROFILE_MODEL_P
1817 if (PROFILE_MODEL_P (current_cpu))
1818 {
1819 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1820 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1821 m32rx_model_profile_insn (current_cpu, abuf);
1822 }
1823 #endif
1824
1825 return new_pc;
1826 #undef OPRND
1827 }
1828
1829 /* lduh-d: lduh $dr,@($slo16,$sr). */
1830
1831 CIA
1832 SEM_FN_NAME (m32rx,lduh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1833 {
1834 insn_t insn = SEM_INSN (sem_arg);
1835 #define OPRND(f) par_exec->operands.fmt_ldh_d.f
1836 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1837 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1838 EXTRACT_FMT_LDH_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1839 EXTRACT_FMT_LDH_D_CODE
1840
1841 CPU (h_gr[f_r1]) = ZEXTHISI (OPRND (h_memory_add__VM_sr_slo16));
1842 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1843
1844 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1845
1846 #if WITH_PROFILE_MODEL_P
1847 if (PROFILE_MODEL_P (current_cpu))
1848 {
1849 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1850 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1851 m32rx_model_profile_insn (current_cpu, abuf);
1852 }
1853 #endif
1854
1855 return new_pc;
1856 #undef OPRND
1857 }
1858
1859 /* ld-plus: ld $dr,@$sr+. */
1860
1861 CIA
1862 SEM_FN_NAME (m32rx,ld_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1863 {
1864 insn_t insn = SEM_INSN (sem_arg);
1865 #define OPRND(f) par_exec->operands.fmt_ld_plus.f
1866 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1867 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1868 EXTRACT_FMT_LD_PLUS_VARS /* f-op1 f-r1 f-op2 f-r2 */
1869 EXTRACT_FMT_LD_PLUS_CODE
1870
1871 do {
1872 SI temp1;SI temp0;
1873 temp0 = OPRND (h_memory_sr);
1874 temp1 = ADDSI (OPRND (sr), 4);
1875 CPU (h_gr[f_r1]) = temp0;
1876 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1877 CPU (h_gr[f_r2]) = temp1;
1878 TRACE_RESULT (current_cpu, "sr", 'x', CPU (h_gr[f_r2]));
1879 } while (0);
1880
1881 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1882
1883 #if WITH_PROFILE_MODEL_P
1884 if (PROFILE_MODEL_P (current_cpu))
1885 {
1886 m32rx_model_mark_get_h_gr (current_cpu, abuf);
1887 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1888 m32rx_model_profile_insn (current_cpu, abuf);
1889 }
1890 #endif
1891
1892 return new_pc;
1893 #undef OPRND
1894 }
1895
1896 /* ld24: ld24 $dr,$uimm24. */
1897
1898 CIA
1899 SEM_FN_NAME (m32rx,ld24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1900 {
1901 insn_t insn = SEM_INSN (sem_arg);
1902 #define OPRND(f) par_exec->operands.fmt_ld24.f
1903 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1904 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1905 EXTRACT_FMT_LD24_VARS /* f-op1 f-r1 f-uimm24 */
1906 EXTRACT_FMT_LD24_CODE
1907
1908 CPU (h_gr[f_r1]) = OPRND (uimm24);
1909 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1910
1911 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1912
1913 #if WITH_PROFILE_MODEL_P
1914 if (PROFILE_MODEL_P (current_cpu))
1915 {
1916 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1917 m32rx_model_profile_insn (current_cpu, abuf);
1918 }
1919 #endif
1920
1921 return new_pc;
1922 #undef OPRND
1923 }
1924
1925 /* ldi8: ldi8 $dr,$simm8. */
1926
1927 CIA
1928 SEM_FN_NAME (m32rx,ldi8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1929 {
1930 insn_t insn = SEM_INSN (sem_arg);
1931 #define OPRND(f) par_exec->operands.fmt_ldi8.f
1932 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1933 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1934 EXTRACT_FMT_LDI8_VARS /* f-op1 f-r1 f-simm8 */
1935 EXTRACT_FMT_LDI8_CODE
1936
1937 CPU (h_gr[f_r1]) = OPRND (simm8);
1938 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1939
1940 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1941
1942 #if WITH_PROFILE_MODEL_P
1943 if (PROFILE_MODEL_P (current_cpu))
1944 {
1945 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1946 m32rx_model_profile_insn (current_cpu, abuf);
1947 }
1948 #endif
1949
1950 return new_pc;
1951 #undef OPRND
1952 }
1953
1954 /* ldi16: ldi16 $dr,$hash$slo16. */
1955
1956 CIA
1957 SEM_FN_NAME (m32rx,ldi16) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1958 {
1959 insn_t insn = SEM_INSN (sem_arg);
1960 #define OPRND(f) par_exec->operands.fmt_ldi16.f
1961 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1962 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1963 EXTRACT_FMT_LDI16_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1964 EXTRACT_FMT_LDI16_CODE
1965
1966 CPU (h_gr[f_r1]) = OPRND (slo16);
1967 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1968
1969 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
1970
1971 #if WITH_PROFILE_MODEL_P
1972 if (PROFILE_MODEL_P (current_cpu))
1973 {
1974 m32rx_model_mark_set_h_gr (current_cpu, abuf);
1975 m32rx_model_profile_insn (current_cpu, abuf);
1976 }
1977 #endif
1978
1979 return new_pc;
1980 #undef OPRND
1981 }
1982
1983 /* lock: lock $dr,@$sr. */
1984
1985 CIA
1986 SEM_FN_NAME (m32rx,lock) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1987 {
1988 insn_t insn = SEM_INSN (sem_arg);
1989 #define OPRND(f) par_exec->operands.fmt_lock.f
1990 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1991 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1992 EXTRACT_FMT_LOCK_VARS /* f-op1 f-r1 f-op2 f-r2 */
1993 EXTRACT_FMT_LOCK_CODE
1994
1995 do {
1996 CPU (h_lock) = 1;
1997 TRACE_RESULT (current_cpu, "lock-0", 'x', CPU (h_lock));
1998 CPU (h_gr[f_r1]) = OPRND (h_memory_sr);
1999 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2000 } while (0);
2001
2002 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2003
2004 #if WITH_PROFILE_MODEL_P
2005 if (PROFILE_MODEL_P (current_cpu))
2006 {
2007 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2008 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2009 m32rx_model_profile_insn (current_cpu, abuf);
2010 }
2011 #endif
2012
2013 return new_pc;
2014 #undef OPRND
2015 }
2016
2017 /* machi-a: machi $src1,$src2,$acc. */
2018
2019 CIA
2020 SEM_FN_NAME (m32rx,machi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2021 {
2022 insn_t insn = SEM_INSN (sem_arg);
2023 #define OPRND(f) par_exec->operands.fmt_machi_a.f
2024 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2025 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2026 EXTRACT_FMT_MACHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
2027 EXTRACT_FMT_MACHI_A_CODE
2028
2029 m32rx_h_accums_set (current_cpu, f_acc, SRADI (SLLDI (ADDDI (OPRND (acc), MULDI (EXTSIDI (ANDSI (OPRND (src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (OPRND (src2), 16))))), 8), 8));
2030 TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
2031
2032 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2033
2034 #if WITH_PROFILE_MODEL_P
2035 if (PROFILE_MODEL_P (current_cpu))
2036 {
2037 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2038 m32rx_model_profile_insn (current_cpu, abuf);
2039 }
2040 #endif
2041
2042 return new_pc;
2043 #undef OPRND
2044 }
2045
2046 /* maclo-a: maclo $src1,$src2,$acc. */
2047
2048 CIA
2049 SEM_FN_NAME (m32rx,maclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2050 {
2051 insn_t insn = SEM_INSN (sem_arg);
2052 #define OPRND(f) par_exec->operands.fmt_machi_a.f
2053 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2054 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2055 EXTRACT_FMT_MACHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
2056 EXTRACT_FMT_MACHI_A_CODE
2057
2058 m32rx_h_accums_set (current_cpu, f_acc, SRADI (SLLDI (ADDDI (OPRND (acc), MULDI (EXTSIDI (SLLSI (OPRND (src1), 16)), EXTHIDI (TRUNCSIHI (OPRND (src2))))), 8), 8));
2059 TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
2060
2061 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2062
2063 #if WITH_PROFILE_MODEL_P
2064 if (PROFILE_MODEL_P (current_cpu))
2065 {
2066 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2067 m32rx_model_profile_insn (current_cpu, abuf);
2068 }
2069 #endif
2070
2071 return new_pc;
2072 #undef OPRND
2073 }
2074
2075 /* macwhi: macwhi $src1,$src2. */
2076
2077 CIA
2078 SEM_FN_NAME (m32rx,macwhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2079 {
2080 insn_t insn = SEM_INSN (sem_arg);
2081 #define OPRND(f) par_exec->operands.fmt_macwhi.f
2082 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2083 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2084 EXTRACT_FMT_MACWHI_VARS /* f-op1 f-r1 f-op2 f-r2 */
2085 EXTRACT_FMT_MACWHI_CODE
2086
2087 m32rx_h_accum_set (current_cpu, SRADI (SLLDI (ADDDI (OPRND (accum), MULDI (EXTSIDI (OPRND (src1)), EXTHIDI (TRUNCSIHI (SRASI (OPRND (src2), 16))))), 8), 8));
2088 TRACE_RESULT (current_cpu, "accum", 'D', m32rx_h_accum_get (current_cpu));
2089
2090 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2091
2092 #if WITH_PROFILE_MODEL_P
2093 if (PROFILE_MODEL_P (current_cpu))
2094 {
2095 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2096 m32rx_model_profile_insn (current_cpu, abuf);
2097 }
2098 #endif
2099
2100 return new_pc;
2101 #undef OPRND
2102 }
2103
2104 /* macwlo: macwlo $src1,$src2. */
2105
2106 CIA
2107 SEM_FN_NAME (m32rx,macwlo) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2108 {
2109 insn_t insn = SEM_INSN (sem_arg);
2110 #define OPRND(f) par_exec->operands.fmt_macwhi.f
2111 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2112 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2113 EXTRACT_FMT_MACWHI_VARS /* f-op1 f-r1 f-op2 f-r2 */
2114 EXTRACT_FMT_MACWHI_CODE
2115
2116 m32rx_h_accum_set (current_cpu, SRADI (SLLDI (ADDDI (OPRND (accum), MULDI (EXTSIDI (OPRND (src1)), EXTHIDI (TRUNCSIHI (OPRND (src2))))), 8), 8));
2117 TRACE_RESULT (current_cpu, "accum", 'D', m32rx_h_accum_get (current_cpu));
2118
2119 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2120
2121 #if WITH_PROFILE_MODEL_P
2122 if (PROFILE_MODEL_P (current_cpu))
2123 {
2124 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2125 m32rx_model_profile_insn (current_cpu, abuf);
2126 }
2127 #endif
2128
2129 return new_pc;
2130 #undef OPRND
2131 }
2132
2133 /* mul: mul $dr,$sr. */
2134
2135 CIA
2136 SEM_FN_NAME (m32rx,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2137 {
2138 insn_t insn = SEM_INSN (sem_arg);
2139 #define OPRND(f) par_exec->operands.fmt_add.f
2140 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2141 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2142 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2143 EXTRACT_FMT_ADD_CODE
2144
2145 CPU (h_gr[f_r1]) = MULSI (OPRND (dr), OPRND (sr));
2146 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2147
2148 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2149
2150 #if WITH_PROFILE_MODEL_P
2151 if (PROFILE_MODEL_P (current_cpu))
2152 {
2153 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2154 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2155 m32rx_model_profile_insn (current_cpu, abuf);
2156 }
2157 #endif
2158
2159 return new_pc;
2160 #undef OPRND
2161 }
2162
2163 /* mulhi-a: mulhi $src1,$src2,$acc. */
2164
2165 CIA
2166 SEM_FN_NAME (m32rx,mulhi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2167 {
2168 insn_t insn = SEM_INSN (sem_arg);
2169 #define OPRND(f) par_exec->operands.fmt_mulhi_a.f
2170 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2171 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2172 EXTRACT_FMT_MULHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
2173 EXTRACT_FMT_MULHI_A_CODE
2174
2175 m32rx_h_accums_set (current_cpu, f_acc, SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (OPRND (src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (OPRND (src2), 16)))), 16), 16));
2176 TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
2177
2178 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2179
2180 #if WITH_PROFILE_MODEL_P
2181 if (PROFILE_MODEL_P (current_cpu))
2182 {
2183 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2184 m32rx_model_profile_insn (current_cpu, abuf);
2185 }
2186 #endif
2187
2188 return new_pc;
2189 #undef OPRND
2190 }
2191
2192 /* mullo-a: mullo $src1,$src2,$acc. */
2193
2194 CIA
2195 SEM_FN_NAME (m32rx,mullo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2196 {
2197 insn_t insn = SEM_INSN (sem_arg);
2198 #define OPRND(f) par_exec->operands.fmt_mulhi_a.f
2199 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2200 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2201 EXTRACT_FMT_MULHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
2202 EXTRACT_FMT_MULHI_A_CODE
2203
2204 m32rx_h_accums_set (current_cpu, f_acc, SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (OPRND (src1), 16)), EXTHIDI (TRUNCSIHI (OPRND (src2)))), 16), 16));
2205 TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
2206
2207 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2208
2209 #if WITH_PROFILE_MODEL_P
2210 if (PROFILE_MODEL_P (current_cpu))
2211 {
2212 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2213 m32rx_model_profile_insn (current_cpu, abuf);
2214 }
2215 #endif
2216
2217 return new_pc;
2218 #undef OPRND
2219 }
2220
2221 /* mulwhi: mulwhi $src1,$src2. */
2222
2223 CIA
2224 SEM_FN_NAME (m32rx,mulwhi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2225 {
2226 insn_t insn = SEM_INSN (sem_arg);
2227 #define OPRND(f) par_exec->operands.fmt_mulwhi.f
2228 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2229 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2230 EXTRACT_FMT_MULWHI_VARS /* f-op1 f-r1 f-op2 f-r2 */
2231 EXTRACT_FMT_MULWHI_CODE
2232
2233 m32rx_h_accum_set (current_cpu, SRADI (SLLDI (MULDI (EXTSIDI (OPRND (src1)), EXTHIDI (TRUNCSIHI (SRASI (OPRND (src2), 16)))), 8), 8));
2234 TRACE_RESULT (current_cpu, "accum", 'D', m32rx_h_accum_get (current_cpu));
2235
2236 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2237
2238 #if WITH_PROFILE_MODEL_P
2239 if (PROFILE_MODEL_P (current_cpu))
2240 {
2241 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2242 m32rx_model_profile_insn (current_cpu, abuf);
2243 }
2244 #endif
2245
2246 return new_pc;
2247 #undef OPRND
2248 }
2249
2250 /* mulwlo: mulwlo $src1,$src2. */
2251
2252 CIA
2253 SEM_FN_NAME (m32rx,mulwlo) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2254 {
2255 insn_t insn = SEM_INSN (sem_arg);
2256 #define OPRND(f) par_exec->operands.fmt_mulwhi.f
2257 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2258 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2259 EXTRACT_FMT_MULWHI_VARS /* f-op1 f-r1 f-op2 f-r2 */
2260 EXTRACT_FMT_MULWHI_CODE
2261
2262 m32rx_h_accum_set (current_cpu, SRADI (SLLDI (MULDI (EXTSIDI (OPRND (src1)), EXTHIDI (TRUNCSIHI (OPRND (src2)))), 8), 8));
2263 TRACE_RESULT (current_cpu, "accum", 'D', m32rx_h_accum_get (current_cpu));
2264
2265 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2266
2267 #if WITH_PROFILE_MODEL_P
2268 if (PROFILE_MODEL_P (current_cpu))
2269 {
2270 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2271 m32rx_model_profile_insn (current_cpu, abuf);
2272 }
2273 #endif
2274
2275 return new_pc;
2276 #undef OPRND
2277 }
2278
2279 /* mv: mv $dr,$sr. */
2280
2281 CIA
2282 SEM_FN_NAME (m32rx,mv) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2283 {
2284 insn_t insn = SEM_INSN (sem_arg);
2285 #define OPRND(f) par_exec->operands.fmt_mv.f
2286 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2287 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2288 EXTRACT_FMT_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
2289 EXTRACT_FMT_MV_CODE
2290
2291 CPU (h_gr[f_r1]) = OPRND (sr);
2292 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2293
2294 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2295
2296 #if WITH_PROFILE_MODEL_P
2297 if (PROFILE_MODEL_P (current_cpu))
2298 {
2299 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2300 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2301 m32rx_model_profile_insn (current_cpu, abuf);
2302 }
2303 #endif
2304
2305 return new_pc;
2306 #undef OPRND
2307 }
2308
2309 /* mvfachi-a: mvfachi $dr,$accs. */
2310
2311 CIA
2312 SEM_FN_NAME (m32rx,mvfachi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2313 {
2314 insn_t insn = SEM_INSN (sem_arg);
2315 #define OPRND(f) par_exec->operands.fmt_mvfachi_a.f
2316 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2317 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2318 EXTRACT_FMT_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2319 EXTRACT_FMT_MVFACHI_A_CODE
2320
2321 CPU (h_gr[f_r1]) = TRUNCDISI (SRADI (OPRND (accs), 32));
2322 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2323
2324 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2325
2326 #if WITH_PROFILE_MODEL_P
2327 if (PROFILE_MODEL_P (current_cpu))
2328 {
2329 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2330 m32rx_model_profile_insn (current_cpu, abuf);
2331 }
2332 #endif
2333
2334 return new_pc;
2335 #undef OPRND
2336 }
2337
2338 /* mvfaclo-a: mvfaclo $dr,$accs. */
2339
2340 CIA
2341 SEM_FN_NAME (m32rx,mvfaclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2342 {
2343 insn_t insn = SEM_INSN (sem_arg);
2344 #define OPRND(f) par_exec->operands.fmt_mvfachi_a.f
2345 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2346 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2347 EXTRACT_FMT_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2348 EXTRACT_FMT_MVFACHI_A_CODE
2349
2350 CPU (h_gr[f_r1]) = TRUNCDISI (OPRND (accs));
2351 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2352
2353 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2354
2355 #if WITH_PROFILE_MODEL_P
2356 if (PROFILE_MODEL_P (current_cpu))
2357 {
2358 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2359 m32rx_model_profile_insn (current_cpu, abuf);
2360 }
2361 #endif
2362
2363 return new_pc;
2364 #undef OPRND
2365 }
2366
2367 /* mvfacmi-a: mvfacmi $dr,$accs. */
2368
2369 CIA
2370 SEM_FN_NAME (m32rx,mvfacmi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2371 {
2372 insn_t insn = SEM_INSN (sem_arg);
2373 #define OPRND(f) par_exec->operands.fmt_mvfachi_a.f
2374 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2375 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2376 EXTRACT_FMT_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2377 EXTRACT_FMT_MVFACHI_A_CODE
2378
2379 CPU (h_gr[f_r1]) = TRUNCDISI (SRADI (OPRND (accs), 16));
2380 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2381
2382 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2383
2384 #if WITH_PROFILE_MODEL_P
2385 if (PROFILE_MODEL_P (current_cpu))
2386 {
2387 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2388 m32rx_model_profile_insn (current_cpu, abuf);
2389 }
2390 #endif
2391
2392 return new_pc;
2393 #undef OPRND
2394 }
2395
2396 /* mvfc: mvfc $dr,$scr. */
2397
2398 CIA
2399 SEM_FN_NAME (m32rx,mvfc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2400 {
2401 insn_t insn = SEM_INSN (sem_arg);
2402 #define OPRND(f) par_exec->operands.fmt_mvfc.f
2403 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2404 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2405 EXTRACT_FMT_MVFC_VARS /* f-op1 f-r1 f-op2 f-r2 */
2406 EXTRACT_FMT_MVFC_CODE
2407
2408 CPU (h_gr[f_r1]) = OPRND (scr);
2409 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2410
2411 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2412
2413 #if WITH_PROFILE_MODEL_P
2414 if (PROFILE_MODEL_P (current_cpu))
2415 {
2416 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2417 m32rx_model_profile_insn (current_cpu, abuf);
2418 }
2419 #endif
2420
2421 return new_pc;
2422 #undef OPRND
2423 }
2424
2425 /* mvtachi-a: mvtachi $src1,$accs. */
2426
2427 CIA
2428 SEM_FN_NAME (m32rx,mvtachi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2429 {
2430 insn_t insn = SEM_INSN (sem_arg);
2431 #define OPRND(f) par_exec->operands.fmt_mvtachi_a.f
2432 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2433 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2434 EXTRACT_FMT_MVTACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2435 EXTRACT_FMT_MVTACHI_A_CODE
2436
2437 m32rx_h_accums_set (current_cpu, f_accs, ORDI (ANDDI (OPRND (accs), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (OPRND (src1)), 32)));
2438 TRACE_RESULT (current_cpu, "accs", 'D', m32rx_h_accums_get (current_cpu, f_accs));
2439
2440 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2441
2442 #if WITH_PROFILE_MODEL_P
2443 if (PROFILE_MODEL_P (current_cpu))
2444 {
2445 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2446 m32rx_model_profile_insn (current_cpu, abuf);
2447 }
2448 #endif
2449
2450 return new_pc;
2451 #undef OPRND
2452 }
2453
2454 /* mvtaclo-a: mvtaclo $src1,$accs. */
2455
2456 CIA
2457 SEM_FN_NAME (m32rx,mvtaclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2458 {
2459 insn_t insn = SEM_INSN (sem_arg);
2460 #define OPRND(f) par_exec->operands.fmt_mvtachi_a.f
2461 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2462 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2463 EXTRACT_FMT_MVTACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2464 EXTRACT_FMT_MVTACHI_A_CODE
2465
2466 m32rx_h_accums_set (current_cpu, f_accs, ORDI (ANDDI (OPRND (accs), MAKEDI (0xffffffff, 0)), ZEXTSIDI (OPRND (src1))));
2467 TRACE_RESULT (current_cpu, "accs", 'D', m32rx_h_accums_get (current_cpu, f_accs));
2468
2469 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2470
2471 #if WITH_PROFILE_MODEL_P
2472 if (PROFILE_MODEL_P (current_cpu))
2473 {
2474 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2475 m32rx_model_profile_insn (current_cpu, abuf);
2476 }
2477 #endif
2478
2479 return new_pc;
2480 #undef OPRND
2481 }
2482
2483 /* mvtc: mvtc $sr,$dcr. */
2484
2485 CIA
2486 SEM_FN_NAME (m32rx,mvtc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2487 {
2488 insn_t insn = SEM_INSN (sem_arg);
2489 #define OPRND(f) par_exec->operands.fmt_mvtc.f
2490 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2491 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2492 EXTRACT_FMT_MVTC_VARS /* f-op1 f-r1 f-op2 f-r2 */
2493 EXTRACT_FMT_MVTC_CODE
2494
2495 m32rx_h_cr_set (current_cpu, f_r1, OPRND (sr));
2496 TRACE_RESULT (current_cpu, "dcr", 'x', m32rx_h_cr_get (current_cpu, f_r1));
2497
2498 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2499
2500 #if WITH_PROFILE_MODEL_P
2501 if (PROFILE_MODEL_P (current_cpu))
2502 {
2503 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2504 m32rx_model_profile_insn (current_cpu, abuf);
2505 }
2506 #endif
2507
2508 return new_pc;
2509 #undef OPRND
2510 }
2511
2512 /* neg: neg $dr,$sr. */
2513
2514 CIA
2515 SEM_FN_NAME (m32rx,neg) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2516 {
2517 insn_t insn = SEM_INSN (sem_arg);
2518 #define OPRND(f) par_exec->operands.fmt_mv.f
2519 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2520 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2521 EXTRACT_FMT_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
2522 EXTRACT_FMT_MV_CODE
2523
2524 CPU (h_gr[f_r1]) = NEGSI (OPRND (sr));
2525 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2526
2527 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2528
2529 #if WITH_PROFILE_MODEL_P
2530 if (PROFILE_MODEL_P (current_cpu))
2531 {
2532 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2533 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2534 m32rx_model_profile_insn (current_cpu, abuf);
2535 }
2536 #endif
2537
2538 return new_pc;
2539 #undef OPRND
2540 }
2541
2542 /* nop: nop. */
2543
2544 CIA
2545 SEM_FN_NAME (m32rx,nop) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2546 {
2547 insn_t insn = SEM_INSN (sem_arg);
2548 #define OPRND(f) par_exec->operands.fmt_nop.f
2549 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2550 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2551 EXTRACT_FMT_NOP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2552 EXTRACT_FMT_NOP_CODE
2553
2554 PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
2555
2556 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2557
2558 #if WITH_PROFILE_MODEL_P
2559 if (PROFILE_MODEL_P (current_cpu))
2560 {
2561 m32rx_model_profile_insn (current_cpu, abuf);
2562 }
2563 #endif
2564
2565 return new_pc;
2566 #undef OPRND
2567 }
2568
2569 /* not: not $dr,$sr. */
2570
2571 CIA
2572 SEM_FN_NAME (m32rx,not) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2573 {
2574 insn_t insn = SEM_INSN (sem_arg);
2575 #define OPRND(f) par_exec->operands.fmt_mv.f
2576 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2577 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2578 EXTRACT_FMT_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
2579 EXTRACT_FMT_MV_CODE
2580
2581 CPU (h_gr[f_r1]) = INVSI (OPRND (sr));
2582 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2583
2584 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2585
2586 #if WITH_PROFILE_MODEL_P
2587 if (PROFILE_MODEL_P (current_cpu))
2588 {
2589 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2590 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2591 m32rx_model_profile_insn (current_cpu, abuf);
2592 }
2593 #endif
2594
2595 return new_pc;
2596 #undef OPRND
2597 }
2598
2599 /* rac-dsi: rac $accd,$accs,$imm1. */
2600
2601 CIA
2602 SEM_FN_NAME (m32rx,rac_dsi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2603 {
2604 insn_t insn = SEM_INSN (sem_arg);
2605 #define OPRND(f) par_exec->operands.fmt_rac_dsi.f
2606 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2607 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2608 EXTRACT_FMT_RAC_DSI_VARS /* f-op1 f-accd f-bits67 f-op2 f-accs f-bit14 f-imm1 */
2609 EXTRACT_FMT_RAC_DSI_CODE
2610
2611 do {
2612 DI tmp_tmp1;
2613 tmp_tmp1 = SLLDI (OPRND (accs), OPRND (imm1));
2614 tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
2615 m32rx_h_accums_set (current_cpu, f_accd, (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000))));
2616 TRACE_RESULT (current_cpu, "accd", 'D', m32rx_h_accums_get (current_cpu, f_accd));
2617 } while (0);
2618
2619 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2620
2621 #if WITH_PROFILE_MODEL_P
2622 if (PROFILE_MODEL_P (current_cpu))
2623 {
2624 m32rx_model_profile_insn (current_cpu, abuf);
2625 }
2626 #endif
2627
2628 return new_pc;
2629 #undef OPRND
2630 }
2631
2632 /* rach-dsi: rach $accd,$accs,$imm1. */
2633
2634 CIA
2635 SEM_FN_NAME (m32rx,rach_dsi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2636 {
2637 insn_t insn = SEM_INSN (sem_arg);
2638 #define OPRND(f) par_exec->operands.fmt_rac_dsi.f
2639 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2640 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2641 EXTRACT_FMT_RAC_DSI_VARS /* f-op1 f-accd f-bits67 f-op2 f-accs f-bit14 f-imm1 */
2642 EXTRACT_FMT_RAC_DSI_CODE
2643
2644 do {
2645 DI tmp_tmp1;
2646 tmp_tmp1 = SLLDI (OPRND (accs), OPRND (imm1));
2647 tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 0x80000000));
2648 m32rx_h_accums_set (current_cpu, f_accd, (GTDI (tmp_tmp1, MAKEDI (32767, 0))) ? (MAKEDI (32767, 0)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0))));
2649 TRACE_RESULT (current_cpu, "accd", 'D', m32rx_h_accums_get (current_cpu, f_accd));
2650 } while (0);
2651
2652 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2653
2654 #if WITH_PROFILE_MODEL_P
2655 if (PROFILE_MODEL_P (current_cpu))
2656 {
2657 m32rx_model_profile_insn (current_cpu, abuf);
2658 }
2659 #endif
2660
2661 return new_pc;
2662 #undef OPRND
2663 }
2664
2665 /* rte: rte. */
2666
2667 CIA
2668 SEM_FN_NAME (m32rx,rte) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2669 {
2670 insn_t insn = SEM_INSN (sem_arg);
2671 #define OPRND(f) par_exec->operands.fmt_rte.f
2672 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2673 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2674 int taken_p = 0;
2675 EXTRACT_FMT_RTE_VARS /* f-op1 f-r1 f-op2 f-r2 */
2676 EXTRACT_FMT_RTE_CODE
2677
2678 do {
2679 CPU (h_sm) = OPRND (h_bsm_0);
2680 TRACE_RESULT (current_cpu, "sm-0", 'x', CPU (h_sm));
2681 CPU (h_ie) = OPRND (h_bie_0);
2682 TRACE_RESULT (current_cpu, "ie-0", 'x', CPU (h_ie));
2683 CPU (h_cond) = OPRND (h_bcond_0);
2684 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
2685 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, ANDSI (OPRND (h_bpc_0), -4)));
2686 taken_p = 1;
2687 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
2688 } while (0);
2689
2690 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2691
2692 #if WITH_PROFILE_MODEL_P
2693 if (PROFILE_MODEL_P (current_cpu))
2694 {
2695 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
2696 }
2697 #endif
2698
2699 return new_pc;
2700 #undef OPRND
2701 }
2702
2703 /* seth: seth $dr,$hash$hi16. */
2704
2705 CIA
2706 SEM_FN_NAME (m32rx,seth) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2707 {
2708 insn_t insn = SEM_INSN (sem_arg);
2709 #define OPRND(f) par_exec->operands.fmt_seth.f
2710 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2711 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2712 EXTRACT_FMT_SETH_VARS /* f-op1 f-r1 f-op2 f-r2 f-hi16 */
2713 EXTRACT_FMT_SETH_CODE
2714
2715 CPU (h_gr[f_r1]) = SLLSI (OPRND (hi16), 16);
2716 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2717
2718 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2719
2720 #if WITH_PROFILE_MODEL_P
2721 if (PROFILE_MODEL_P (current_cpu))
2722 {
2723 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2724 m32rx_model_profile_insn (current_cpu, abuf);
2725 }
2726 #endif
2727
2728 return new_pc;
2729 #undef OPRND
2730 }
2731
2732 /* sll: sll $dr,$sr. */
2733
2734 CIA
2735 SEM_FN_NAME (m32rx,sll) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2736 {
2737 insn_t insn = SEM_INSN (sem_arg);
2738 #define OPRND(f) par_exec->operands.fmt_add.f
2739 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2740 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2741 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2742 EXTRACT_FMT_ADD_CODE
2743
2744 CPU (h_gr[f_r1]) = SLLSI (OPRND (dr), ANDSI (OPRND (sr), 31));
2745 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2746
2747 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2748
2749 #if WITH_PROFILE_MODEL_P
2750 if (PROFILE_MODEL_P (current_cpu))
2751 {
2752 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2753 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2754 m32rx_model_profile_insn (current_cpu, abuf);
2755 }
2756 #endif
2757
2758 return new_pc;
2759 #undef OPRND
2760 }
2761
2762 /* sll3: sll3 $dr,$sr,$simm16. */
2763
2764 CIA
2765 SEM_FN_NAME (m32rx,sll3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2766 {
2767 insn_t insn = SEM_INSN (sem_arg);
2768 #define OPRND(f) par_exec->operands.fmt_sll3.f
2769 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2770 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2771 EXTRACT_FMT_SLL3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2772 EXTRACT_FMT_SLL3_CODE
2773
2774 CPU (h_gr[f_r1]) = SLLSI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2775 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2776
2777 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2778
2779 #if WITH_PROFILE_MODEL_P
2780 if (PROFILE_MODEL_P (current_cpu))
2781 {
2782 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2783 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2784 m32rx_model_profile_insn (current_cpu, abuf);
2785 }
2786 #endif
2787
2788 return new_pc;
2789 #undef OPRND
2790 }
2791
2792 /* slli: slli $dr,$uimm5. */
2793
2794 CIA
2795 SEM_FN_NAME (m32rx,slli) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2796 {
2797 insn_t insn = SEM_INSN (sem_arg);
2798 #define OPRND(f) par_exec->operands.fmt_slli.f
2799 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2800 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2801 EXTRACT_FMT_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2802 EXTRACT_FMT_SLLI_CODE
2803
2804 CPU (h_gr[f_r1]) = SLLSI (OPRND (dr), OPRND (uimm5));
2805 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2806
2807 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2808
2809 #if WITH_PROFILE_MODEL_P
2810 if (PROFILE_MODEL_P (current_cpu))
2811 {
2812 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2813 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2814 m32rx_model_profile_insn (current_cpu, abuf);
2815 }
2816 #endif
2817
2818 return new_pc;
2819 #undef OPRND
2820 }
2821
2822 /* sra: sra $dr,$sr. */
2823
2824 CIA
2825 SEM_FN_NAME (m32rx,sra) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2826 {
2827 insn_t insn = SEM_INSN (sem_arg);
2828 #define OPRND(f) par_exec->operands.fmt_add.f
2829 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2830 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2831 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2832 EXTRACT_FMT_ADD_CODE
2833
2834 CPU (h_gr[f_r1]) = SRASI (OPRND (dr), ANDSI (OPRND (sr), 31));
2835 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2836
2837 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2838
2839 #if WITH_PROFILE_MODEL_P
2840 if (PROFILE_MODEL_P (current_cpu))
2841 {
2842 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2843 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2844 m32rx_model_profile_insn (current_cpu, abuf);
2845 }
2846 #endif
2847
2848 return new_pc;
2849 #undef OPRND
2850 }
2851
2852 /* sra3: sra3 $dr,$sr,$simm16. */
2853
2854 CIA
2855 SEM_FN_NAME (m32rx,sra3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2856 {
2857 insn_t insn = SEM_INSN (sem_arg);
2858 #define OPRND(f) par_exec->operands.fmt_sll3.f
2859 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2860 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2861 EXTRACT_FMT_SLL3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2862 EXTRACT_FMT_SLL3_CODE
2863
2864 CPU (h_gr[f_r1]) = SRASI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2865 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2866
2867 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2868
2869 #if WITH_PROFILE_MODEL_P
2870 if (PROFILE_MODEL_P (current_cpu))
2871 {
2872 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2873 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2874 m32rx_model_profile_insn (current_cpu, abuf);
2875 }
2876 #endif
2877
2878 return new_pc;
2879 #undef OPRND
2880 }
2881
2882 /* srai: srai $dr,$uimm5. */
2883
2884 CIA
2885 SEM_FN_NAME (m32rx,srai) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2886 {
2887 insn_t insn = SEM_INSN (sem_arg);
2888 #define OPRND(f) par_exec->operands.fmt_slli.f
2889 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2890 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2891 EXTRACT_FMT_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2892 EXTRACT_FMT_SLLI_CODE
2893
2894 CPU (h_gr[f_r1]) = SRASI (OPRND (dr), OPRND (uimm5));
2895 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2896
2897 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2898
2899 #if WITH_PROFILE_MODEL_P
2900 if (PROFILE_MODEL_P (current_cpu))
2901 {
2902 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2903 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2904 m32rx_model_profile_insn (current_cpu, abuf);
2905 }
2906 #endif
2907
2908 return new_pc;
2909 #undef OPRND
2910 }
2911
2912 /* srl: srl $dr,$sr. */
2913
2914 CIA
2915 SEM_FN_NAME (m32rx,srl) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2916 {
2917 insn_t insn = SEM_INSN (sem_arg);
2918 #define OPRND(f) par_exec->operands.fmt_add.f
2919 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2920 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2921 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2922 EXTRACT_FMT_ADD_CODE
2923
2924 CPU (h_gr[f_r1]) = SRLSI (OPRND (dr), ANDSI (OPRND (sr), 31));
2925 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2926
2927 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2928
2929 #if WITH_PROFILE_MODEL_P
2930 if (PROFILE_MODEL_P (current_cpu))
2931 {
2932 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2933 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2934 m32rx_model_profile_insn (current_cpu, abuf);
2935 }
2936 #endif
2937
2938 return new_pc;
2939 #undef OPRND
2940 }
2941
2942 /* srl3: srl3 $dr,$sr,$simm16. */
2943
2944 CIA
2945 SEM_FN_NAME (m32rx,srl3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2946 {
2947 insn_t insn = SEM_INSN (sem_arg);
2948 #define OPRND(f) par_exec->operands.fmt_sll3.f
2949 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2950 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2951 EXTRACT_FMT_SLL3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2952 EXTRACT_FMT_SLL3_CODE
2953
2954 CPU (h_gr[f_r1]) = SRLSI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2955 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2956
2957 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2958
2959 #if WITH_PROFILE_MODEL_P
2960 if (PROFILE_MODEL_P (current_cpu))
2961 {
2962 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2963 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2964 m32rx_model_profile_insn (current_cpu, abuf);
2965 }
2966 #endif
2967
2968 return new_pc;
2969 #undef OPRND
2970 }
2971
2972 /* srli: srli $dr,$uimm5. */
2973
2974 CIA
2975 SEM_FN_NAME (m32rx,srli) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2976 {
2977 insn_t insn = SEM_INSN (sem_arg);
2978 #define OPRND(f) par_exec->operands.fmt_slli.f
2979 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2980 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2981 EXTRACT_FMT_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2982 EXTRACT_FMT_SLLI_CODE
2983
2984 CPU (h_gr[f_r1]) = SRLSI (OPRND (dr), OPRND (uimm5));
2985 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2986
2987 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
2988
2989 #if WITH_PROFILE_MODEL_P
2990 if (PROFILE_MODEL_P (current_cpu))
2991 {
2992 m32rx_model_mark_get_h_gr (current_cpu, abuf);
2993 m32rx_model_mark_set_h_gr (current_cpu, abuf);
2994 m32rx_model_profile_insn (current_cpu, abuf);
2995 }
2996 #endif
2997
2998 return new_pc;
2999 #undef OPRND
3000 }
3001
3002 /* st: st $src1,@$src2. */
3003
3004 CIA
3005 SEM_FN_NAME (m32rx,st) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3006 {
3007 insn_t insn = SEM_INSN (sem_arg);
3008 #define OPRND(f) par_exec->operands.fmt_st.f
3009 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3010 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3011 EXTRACT_FMT_ST_VARS /* f-op1 f-r1 f-op2 f-r2 */
3012 EXTRACT_FMT_ST_CODE
3013
3014 SETMEMSI (current_cpu, OPRND (src2), OPRND (src1));
3015 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMSI (current_cpu, OPRND (src2)));
3016
3017 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3018
3019 #if WITH_PROFILE_MODEL_P
3020 if (PROFILE_MODEL_P (current_cpu))
3021 {
3022 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3023 m32rx_model_profile_insn (current_cpu, abuf);
3024 }
3025 #endif
3026
3027 return new_pc;
3028 #undef OPRND
3029 }
3030
3031 /* st-d: st $src1,@($slo16,$src2). */
3032
3033 CIA
3034 SEM_FN_NAME (m32rx,st_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3035 {
3036 insn_t insn = SEM_INSN (sem_arg);
3037 #define OPRND(f) par_exec->operands.fmt_st_d.f
3038 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3039 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
3040 EXTRACT_FMT_ST_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
3041 EXTRACT_FMT_ST_D_CODE
3042
3043 SETMEMSI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
3044 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMSI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
3045
3046 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3047
3048 #if WITH_PROFILE_MODEL_P
3049 if (PROFILE_MODEL_P (current_cpu))
3050 {
3051 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3052 m32rx_model_profile_insn (current_cpu, abuf);
3053 }
3054 #endif
3055
3056 return new_pc;
3057 #undef OPRND
3058 }
3059
3060 /* stb: stb $src1,@$src2. */
3061
3062 CIA
3063 SEM_FN_NAME (m32rx,stb) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3064 {
3065 insn_t insn = SEM_INSN (sem_arg);
3066 #define OPRND(f) par_exec->operands.fmt_stb.f
3067 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3068 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3069 EXTRACT_FMT_STB_VARS /* f-op1 f-r1 f-op2 f-r2 */
3070 EXTRACT_FMT_STB_CODE
3071
3072 SETMEMQI (current_cpu, OPRND (src2), OPRND (src1));
3073 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMQI (current_cpu, OPRND (src2)));
3074
3075 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3076
3077 #if WITH_PROFILE_MODEL_P
3078 if (PROFILE_MODEL_P (current_cpu))
3079 {
3080 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3081 m32rx_model_profile_insn (current_cpu, abuf);
3082 }
3083 #endif
3084
3085 return new_pc;
3086 #undef OPRND
3087 }
3088
3089 /* stb-d: stb $src1,@($slo16,$src2). */
3090
3091 CIA
3092 SEM_FN_NAME (m32rx,stb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3093 {
3094 insn_t insn = SEM_INSN (sem_arg);
3095 #define OPRND(f) par_exec->operands.fmt_stb_d.f
3096 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3097 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
3098 EXTRACT_FMT_STB_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
3099 EXTRACT_FMT_STB_D_CODE
3100
3101 SETMEMQI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
3102 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMQI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
3103
3104 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3105
3106 #if WITH_PROFILE_MODEL_P
3107 if (PROFILE_MODEL_P (current_cpu))
3108 {
3109 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3110 m32rx_model_profile_insn (current_cpu, abuf);
3111 }
3112 #endif
3113
3114 return new_pc;
3115 #undef OPRND
3116 }
3117
3118 /* sth: sth $src1,@$src2. */
3119
3120 CIA
3121 SEM_FN_NAME (m32rx,sth) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3122 {
3123 insn_t insn = SEM_INSN (sem_arg);
3124 #define OPRND(f) par_exec->operands.fmt_sth.f
3125 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3126 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3127 EXTRACT_FMT_STH_VARS /* f-op1 f-r1 f-op2 f-r2 */
3128 EXTRACT_FMT_STH_CODE
3129
3130 SETMEMHI (current_cpu, OPRND (src2), OPRND (src1));
3131 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMHI (current_cpu, OPRND (src2)));
3132
3133 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3134
3135 #if WITH_PROFILE_MODEL_P
3136 if (PROFILE_MODEL_P (current_cpu))
3137 {
3138 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3139 m32rx_model_profile_insn (current_cpu, abuf);
3140 }
3141 #endif
3142
3143 return new_pc;
3144 #undef OPRND
3145 }
3146
3147 /* sth-d: sth $src1,@($slo16,$src2). */
3148
3149 CIA
3150 SEM_FN_NAME (m32rx,sth_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3151 {
3152 insn_t insn = SEM_INSN (sem_arg);
3153 #define OPRND(f) par_exec->operands.fmt_sth_d.f
3154 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3155 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
3156 EXTRACT_FMT_STH_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
3157 EXTRACT_FMT_STH_D_CODE
3158
3159 SETMEMHI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
3160 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMHI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
3161
3162 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3163
3164 #if WITH_PROFILE_MODEL_P
3165 if (PROFILE_MODEL_P (current_cpu))
3166 {
3167 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3168 m32rx_model_profile_insn (current_cpu, abuf);
3169 }
3170 #endif
3171
3172 return new_pc;
3173 #undef OPRND
3174 }
3175
3176 /* st-plus: st $src1,@+$src2. */
3177
3178 CIA
3179 SEM_FN_NAME (m32rx,st_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3180 {
3181 insn_t insn = SEM_INSN (sem_arg);
3182 #define OPRND(f) par_exec->operands.fmt_st_plus.f
3183 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3184 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3185 EXTRACT_FMT_ST_PLUS_VARS /* f-op1 f-r1 f-op2 f-r2 */
3186 EXTRACT_FMT_ST_PLUS_CODE
3187
3188 do {
3189 SI tmp_new_src2;
3190 tmp_new_src2 = ADDSI (OPRND (src2), 4);
3191 SETMEMSI (current_cpu, tmp_new_src2, OPRND (src1));
3192 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMSI (current_cpu, tmp_new_src2));
3193 CPU (h_gr[f_r2]) = tmp_new_src2;
3194 TRACE_RESULT (current_cpu, "src2", 'x', CPU (h_gr[f_r2]));
3195 } while (0);
3196
3197 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3198
3199 #if WITH_PROFILE_MODEL_P
3200 if (PROFILE_MODEL_P (current_cpu))
3201 {
3202 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3203 m32rx_model_mark_set_h_gr (current_cpu, abuf);
3204 m32rx_model_profile_insn (current_cpu, abuf);
3205 }
3206 #endif
3207
3208 return new_pc;
3209 #undef OPRND
3210 }
3211
3212 /* st-minus: st $src1,@-$src2. */
3213
3214 CIA
3215 SEM_FN_NAME (m32rx,st_minus) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3216 {
3217 insn_t insn = SEM_INSN (sem_arg);
3218 #define OPRND(f) par_exec->operands.fmt_st_plus.f
3219 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3220 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3221 EXTRACT_FMT_ST_PLUS_VARS /* f-op1 f-r1 f-op2 f-r2 */
3222 EXTRACT_FMT_ST_PLUS_CODE
3223
3224 do {
3225 SI tmp_new_src2;
3226 tmp_new_src2 = SUBSI (OPRND (src2), 4);
3227 SETMEMSI (current_cpu, tmp_new_src2, OPRND (src1));
3228 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMSI (current_cpu, tmp_new_src2));
3229 CPU (h_gr[f_r2]) = tmp_new_src2;
3230 TRACE_RESULT (current_cpu, "src2", 'x', CPU (h_gr[f_r2]));
3231 } while (0);
3232
3233 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3234
3235 #if WITH_PROFILE_MODEL_P
3236 if (PROFILE_MODEL_P (current_cpu))
3237 {
3238 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3239 m32rx_model_mark_set_h_gr (current_cpu, abuf);
3240 m32rx_model_profile_insn (current_cpu, abuf);
3241 }
3242 #endif
3243
3244 return new_pc;
3245 #undef OPRND
3246 }
3247
3248 /* sub: sub $dr,$sr. */
3249
3250 CIA
3251 SEM_FN_NAME (m32rx,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3252 {
3253 insn_t insn = SEM_INSN (sem_arg);
3254 #define OPRND(f) par_exec->operands.fmt_add.f
3255 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3256 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3257 EXTRACT_FMT_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
3258 EXTRACT_FMT_ADD_CODE
3259
3260 CPU (h_gr[f_r1]) = SUBSI (OPRND (dr), OPRND (sr));
3261 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
3262
3263 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3264
3265 #if WITH_PROFILE_MODEL_P
3266 if (PROFILE_MODEL_P (current_cpu))
3267 {
3268 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3269 m32rx_model_mark_set_h_gr (current_cpu, abuf);
3270 m32rx_model_profile_insn (current_cpu, abuf);
3271 }
3272 #endif
3273
3274 return new_pc;
3275 #undef OPRND
3276 }
3277
3278 /* subv: subv $dr,$sr. */
3279
3280 CIA
3281 SEM_FN_NAME (m32rx,subv) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3282 {
3283 insn_t insn = SEM_INSN (sem_arg);
3284 #define OPRND(f) par_exec->operands.fmt_addv.f
3285 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3286 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3287 EXTRACT_FMT_ADDV_VARS /* f-op1 f-r1 f-op2 f-r2 */
3288 EXTRACT_FMT_ADDV_CODE
3289
3290 do {
3291 UBI temp1;SI temp0;
3292 temp0 = SUBSI (OPRND (dr), OPRND (sr));
3293 temp1 = SUBOFSI (OPRND (dr), OPRND (sr), 0);
3294 CPU (h_gr[f_r1]) = temp0;
3295 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
3296 CPU (h_cond) = temp1;
3297 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
3298 } while (0);
3299
3300 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3301
3302 #if WITH_PROFILE_MODEL_P
3303 if (PROFILE_MODEL_P (current_cpu))
3304 {
3305 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3306 m32rx_model_mark_set_h_gr (current_cpu, abuf);
3307 m32rx_model_profile_insn (current_cpu, abuf);
3308 }
3309 #endif
3310
3311 return new_pc;
3312 #undef OPRND
3313 }
3314
3315 /* subx: subx $dr,$sr. */
3316
3317 CIA
3318 SEM_FN_NAME (m32rx,subx) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3319 {
3320 insn_t insn = SEM_INSN (sem_arg);
3321 #define OPRND(f) par_exec->operands.fmt_addx.f
3322 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3323 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3324 EXTRACT_FMT_ADDX_VARS /* f-op1 f-r1 f-op2 f-r2 */
3325 EXTRACT_FMT_ADDX_CODE
3326
3327 do {
3328 UBI temp1;SI temp0;
3329 temp0 = SUBCSI (OPRND (dr), OPRND (sr), OPRND (condbit));
3330 temp1 = SUBCFSI (OPRND (dr), OPRND (sr), OPRND (condbit));
3331 CPU (h_gr[f_r1]) = temp0;
3332 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
3333 CPU (h_cond) = temp1;
3334 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
3335 } while (0);
3336
3337 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3338
3339 #if WITH_PROFILE_MODEL_P
3340 if (PROFILE_MODEL_P (current_cpu))
3341 {
3342 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3343 m32rx_model_mark_set_h_gr (current_cpu, abuf);
3344 m32rx_model_profile_insn (current_cpu, abuf);
3345 }
3346 #endif
3347
3348 return new_pc;
3349 #undef OPRND
3350 }
3351
3352 /* trap: trap $uimm4. */
3353
3354 CIA
3355 SEM_FN_NAME (m32rx,trap) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3356 {
3357 insn_t insn = SEM_INSN (sem_arg);
3358 #define OPRND(f) par_exec->operands.fmt_trap.f
3359 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3360 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3361 int taken_p = 0;
3362 EXTRACT_FMT_TRAP_VARS /* f-op1 f-r1 f-op2 f-uimm4 */
3363 EXTRACT_FMT_TRAP_CODE
3364
3365 do {
3366 m32rx_h_cr_set (current_cpu, 6, ADDSI (OPRND (pc), 4));
3367 TRACE_RESULT (current_cpu, "cr-6", 'x', m32rx_h_cr_get (current_cpu, 6));
3368 m32rx_h_cr_set (current_cpu, 0, ANDSI (SLLSI (OPRND (h_cr_0), 8), 65408));
3369 TRACE_RESULT (current_cpu, "cr-0", 'x', m32rx_h_cr_get (current_cpu, 0));
3370 BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, m32r_trap (current_cpu, OPRND (uimm4))));
3371 taken_p = 1;
3372 TRACE_RESULT (current_cpu, "pc", 'x', new_pc);
3373 } while (0);
3374
3375 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3376
3377 #if WITH_PROFILE_MODEL_P
3378 if (PROFILE_MODEL_P (current_cpu))
3379 {
3380 m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
3381 }
3382 #endif
3383
3384 return new_pc;
3385 #undef OPRND
3386 }
3387
3388 /* unlock: unlock $src1,@$src2. */
3389
3390 CIA
3391 SEM_FN_NAME (m32rx,unlock) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3392 {
3393 insn_t insn = SEM_INSN (sem_arg);
3394 #define OPRND(f) par_exec->operands.fmt_unlock.f
3395 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3396 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3397 EXTRACT_FMT_UNLOCK_VARS /* f-op1 f-r1 f-op2 f-r2 */
3398 EXTRACT_FMT_UNLOCK_CODE
3399
3400 do {
3401 if (OPRND (h_lock_0)) {
3402 SETMEMSI (current_cpu, OPRND (src2), OPRND (src1));
3403 TRACE_RESULT (current_cpu, "memory", 'x', GETMEMSI (current_cpu, OPRND (src2)));
3404 }
3405 CPU (h_lock) = 0;
3406 TRACE_RESULT (current_cpu, "lock-0", 'x', CPU (h_lock));
3407 } while (0);
3408
3409 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3410
3411 #if WITH_PROFILE_MODEL_P
3412 if (PROFILE_MODEL_P (current_cpu))
3413 {
3414 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3415 m32rx_model_profile_insn (current_cpu, abuf);
3416 }
3417 #endif
3418
3419 return new_pc;
3420 #undef OPRND
3421 }
3422
3423 /* satb: satb $dr,$sr. */
3424
3425 CIA
3426 SEM_FN_NAME (m32rx,satb) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3427 {
3428 insn_t insn = SEM_INSN (sem_arg);
3429 #define OPRND(f) par_exec->operands.fmt_satb.f
3430 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3431 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
3432 EXTRACT_FMT_SATB_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
3433 EXTRACT_FMT_SATB_CODE
3434
3435 CPU (h_gr[f_r1]) = (GESI (OPRND (sr), 127)) ? (127) : (LESI (OPRND (sr), -128)) ? (-128) : (OPRND (sr));
3436 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
3437
3438 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3439
3440 #if WITH_PROFILE_MODEL_P
3441 if (PROFILE_MODEL_P (current_cpu))
3442 {
3443 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3444 m32rx_model_mark_set_h_gr (current_cpu, abuf);
3445 m32rx_model_profile_insn (current_cpu, abuf);
3446 }
3447 #endif
3448
3449 return new_pc;
3450 #undef OPRND
3451 }
3452
3453 /* sath: sath $dr,$sr. */
3454
3455 CIA
3456 SEM_FN_NAME (m32rx,sath) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3457 {
3458 insn_t insn = SEM_INSN (sem_arg);
3459 #define OPRND(f) par_exec->operands.fmt_satb.f
3460 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3461 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
3462 EXTRACT_FMT_SATB_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
3463 EXTRACT_FMT_SATB_CODE
3464
3465 CPU (h_gr[f_r1]) = (GESI (OPRND (sr), 32767)) ? (32767) : (LESI (OPRND (sr), -32768)) ? (-32768) : (OPRND (sr));
3466 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
3467
3468 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3469
3470 #if WITH_PROFILE_MODEL_P
3471 if (PROFILE_MODEL_P (current_cpu))
3472 {
3473 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3474 m32rx_model_mark_set_h_gr (current_cpu, abuf);
3475 m32rx_model_profile_insn (current_cpu, abuf);
3476 }
3477 #endif
3478
3479 return new_pc;
3480 #undef OPRND
3481 }
3482
3483 /* sat: sat $dr,$sr. */
3484
3485 CIA
3486 SEM_FN_NAME (m32rx,sat) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3487 {
3488 insn_t insn = SEM_INSN (sem_arg);
3489 #define OPRND(f) par_exec->operands.fmt_sat.f
3490 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3491 CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
3492 EXTRACT_FMT_SAT_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
3493 EXTRACT_FMT_SAT_CODE
3494
3495 CPU (h_gr[f_r1]) = ((OPRND (condbit)) ? (((LTSI (OPRND (sr), 0)) ? (2147483647) : (0x80000000))) : (OPRND (sr)));
3496 TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
3497
3498 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3499
3500 #if WITH_PROFILE_MODEL_P
3501 if (PROFILE_MODEL_P (current_cpu))
3502 {
3503 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3504 m32rx_model_mark_set_h_gr (current_cpu, abuf);
3505 m32rx_model_profile_insn (current_cpu, abuf);
3506 }
3507 #endif
3508
3509 return new_pc;
3510 #undef OPRND
3511 }
3512
3513 /* pcmpbz: pcmpbz $src2. */
3514
3515 CIA
3516 SEM_FN_NAME (m32rx,pcmpbz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3517 {
3518 insn_t insn = SEM_INSN (sem_arg);
3519 #define OPRND(f) par_exec->operands.fmt_cmpz.f
3520 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3521 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3522 EXTRACT_FMT_CMPZ_VARS /* f-op1 f-r1 f-op2 f-r2 */
3523 EXTRACT_FMT_CMPZ_CODE
3524
3525 CPU (h_cond) = (EQSI (ANDSI (OPRND (src2), 255), 0)) ? (1) : (EQSI (ANDSI (OPRND (src2), 65280), 0)) ? (1) : (EQSI (ANDSI (OPRND (src2), 16711680), 0)) ? (1) : (EQSI (ANDSI (OPRND (src2), 0xff000000), 0)) ? (1) : (0);
3526 TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
3527
3528 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3529
3530 #if WITH_PROFILE_MODEL_P
3531 if (PROFILE_MODEL_P (current_cpu))
3532 {
3533 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3534 m32rx_model_profile_insn (current_cpu, abuf);
3535 }
3536 #endif
3537
3538 return new_pc;
3539 #undef OPRND
3540 }
3541
3542 /* sadd: sadd. */
3543
3544 CIA
3545 SEM_FN_NAME (m32rx,sadd) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3546 {
3547 insn_t insn = SEM_INSN (sem_arg);
3548 #define OPRND(f) par_exec->operands.fmt_sadd.f
3549 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3550 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3551 EXTRACT_FMT_SADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
3552 EXTRACT_FMT_SADD_CODE
3553
3554 m32rx_h_accums_set (current_cpu, 0, ADDDI (SRADI (OPRND (h_accums_1), 16), OPRND (h_accums_0)));
3555 TRACE_RESULT (current_cpu, "accums-0", 'D', m32rx_h_accums_get (current_cpu, 0));
3556
3557 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3558
3559 #if WITH_PROFILE_MODEL_P
3560 if (PROFILE_MODEL_P (current_cpu))
3561 {
3562 m32rx_model_profile_insn (current_cpu, abuf);
3563 }
3564 #endif
3565
3566 return new_pc;
3567 #undef OPRND
3568 }
3569
3570 /* macwu1: macwu1 $src1,$src2. */
3571
3572 CIA
3573 SEM_FN_NAME (m32rx,macwu1) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3574 {
3575 insn_t insn = SEM_INSN (sem_arg);
3576 #define OPRND(f) par_exec->operands.fmt_macwu1.f
3577 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3578 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3579 EXTRACT_FMT_MACWU1_VARS /* f-op1 f-r1 f-op2 f-r2 */
3580 EXTRACT_FMT_MACWU1_CODE
3581
3582 m32rx_h_accums_set (current_cpu, 1, SRADI (SLLDI (ADDDI (OPRND (h_accums_1), MULDI (EXTSIDI (OPRND (src1)), EXTSIDI (ANDSI (OPRND (src2), 65535)))), 8), 8));
3583 TRACE_RESULT (current_cpu, "accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3584
3585 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3586
3587 #if WITH_PROFILE_MODEL_P
3588 if (PROFILE_MODEL_P (current_cpu))
3589 {
3590 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3591 m32rx_model_profile_insn (current_cpu, abuf);
3592 }
3593 #endif
3594
3595 return new_pc;
3596 #undef OPRND
3597 }
3598
3599 /* msblo: msblo $src1,$src2. */
3600
3601 CIA
3602 SEM_FN_NAME (m32rx,msblo) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3603 {
3604 insn_t insn = SEM_INSN (sem_arg);
3605 #define OPRND(f) par_exec->operands.fmt_macwhi.f
3606 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3607 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3608 EXTRACT_FMT_MACWHI_VARS /* f-op1 f-r1 f-op2 f-r2 */
3609 EXTRACT_FMT_MACWHI_CODE
3610
3611 m32rx_h_accum_set (current_cpu, SRADI (SLLDI (SUBDI (OPRND (accum), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (OPRND (src1))), EXTHIDI (TRUNCSIHI (OPRND (src2)))), 32), 16)), 8), 8));
3612 TRACE_RESULT (current_cpu, "accum", 'D', m32rx_h_accum_get (current_cpu));
3613
3614 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3615
3616 #if WITH_PROFILE_MODEL_P
3617 if (PROFILE_MODEL_P (current_cpu))
3618 {
3619 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3620 m32rx_model_profile_insn (current_cpu, abuf);
3621 }
3622 #endif
3623
3624 return new_pc;
3625 #undef OPRND
3626 }
3627
3628 /* mulwu1: mulwu1 $src1,$src2. */
3629
3630 CIA
3631 SEM_FN_NAME (m32rx,mulwu1) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3632 {
3633 insn_t insn = SEM_INSN (sem_arg);
3634 #define OPRND(f) par_exec->operands.fmt_mulwu1.f
3635 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3636 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3637 EXTRACT_FMT_MULWU1_VARS /* f-op1 f-r1 f-op2 f-r2 */
3638 EXTRACT_FMT_MULWU1_CODE
3639
3640 m32rx_h_accums_set (current_cpu, 1, SRADI (SLLDI (MULDI (EXTSIDI (OPRND (src1)), EXTSIDI (ANDSI (OPRND (src2), 65535))), 16), 16));
3641 TRACE_RESULT (current_cpu, "accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3642
3643 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3644
3645 #if WITH_PROFILE_MODEL_P
3646 if (PROFILE_MODEL_P (current_cpu))
3647 {
3648 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3649 m32rx_model_profile_insn (current_cpu, abuf);
3650 }
3651 #endif
3652
3653 return new_pc;
3654 #undef OPRND
3655 }
3656
3657 /* maclh1: maclh1 $src1,$src2. */
3658
3659 CIA
3660 SEM_FN_NAME (m32rx,maclh1) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3661 {
3662 insn_t insn = SEM_INSN (sem_arg);
3663 #define OPRND(f) par_exec->operands.fmt_macwu1.f
3664 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3665 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3666 EXTRACT_FMT_MACWU1_VARS /* f-op1 f-r1 f-op2 f-r2 */
3667 EXTRACT_FMT_MACWU1_CODE
3668
3669 m32rx_h_accums_set (current_cpu, 1, SRADI (SLLDI (ADDDI (OPRND (h_accums_1), SLLDI (EXTSIDI (MULSI (EXTHISI (TRUNCSIHI (OPRND (src1))), SRASI (OPRND (src2), 16))), 16)), 8), 8));
3670 TRACE_RESULT (current_cpu, "accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3671
3672 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3673
3674 #if WITH_PROFILE_MODEL_P
3675 if (PROFILE_MODEL_P (current_cpu))
3676 {
3677 m32rx_model_mark_get_h_gr (current_cpu, abuf);
3678 m32rx_model_profile_insn (current_cpu, abuf);
3679 }
3680 #endif
3681
3682 return new_pc;
3683 #undef OPRND
3684 }
3685
3686 /* sc: sc. */
3687
3688 CIA
3689 SEM_FN_NAME (m32rx,sc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3690 {
3691 insn_t insn = SEM_INSN (sem_arg);
3692 #define OPRND(f) par_exec->operands.fmt_sc.f
3693 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3694 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3695 EXTRACT_FMT_SC_VARS /* f-op1 f-r1 f-op2 f-r2 */
3696 EXTRACT_FMT_SC_CODE
3697
3698 if (OPRND (condbit)) {
3699 BRANCH_NEW_PC (new_pc, NEW_PC_SKIP);
3700 }
3701
3702 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3703
3704 #if WITH_PROFILE_MODEL_P
3705 if (PROFILE_MODEL_P (current_cpu))
3706 {
3707 m32rx_model_profile_insn (current_cpu, abuf);
3708 }
3709 #endif
3710
3711 return new_pc;
3712 #undef OPRND
3713 }
3714
3715 /* snc: snc. */
3716
3717 CIA
3718 SEM_FN_NAME (m32rx,snc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3719 {
3720 insn_t insn = SEM_INSN (sem_arg);
3721 #define OPRND(f) par_exec->operands.fmt_sc.f
3722 ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3723 CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3724 EXTRACT_FMT_SC_VARS /* f-op1 f-r1 f-op2 f-r2 */
3725 EXTRACT_FMT_SC_CODE
3726
3727 if (NOTBI (OPRND (condbit))) {
3728 BRANCH_NEW_PC (new_pc, NEW_PC_SKIP);
3729 }
3730
3731 PROFILE_COUNT_INSN (current_cpu, 0, abuf->idesc->num);
3732
3733 #if WITH_PROFILE_MODEL_P
3734 if (PROFILE_MODEL_P (current_cpu))
3735 {
3736 m32rx_model_profile_insn (current_cpu, abuf);
3737 }
3738 #endif
3739
3740 return new_pc;
3741 #undef OPRND
3742 }
3743
3744 CIA
3745 SEM_FN_NAME (m32rx,illegal) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3746 {
3747 sim_engine_illegal_insn (current_cpu, NULL_CIA /*FIXME*/);
3748 return 0;
3749 }
3750
3751 #endif /* WANT_CPU */