519dda2ad28ce77b86a4249d84c1cb0f16a13e5c
[external/binutils.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 ! defined (SCACHE_P) || (defined (SCACHE_P) && WITH_SCACHE)
34
35 #undef GET_ATTR
36 #define GET_ATTR(cpu, num, attr) CGEN_INSN_ATTR (abuf->opcode, CGEN_INSN_##attr)
37
38 /* Perform add: add $dr,$sr.  */
39 CIA
40 SEM_FN_NAME (m32rx,add) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
41 {
42   insn_t insn = SEM_INSN (sem_arg);
43 #define OPRND(f) par_exec->operands.fmt_0_add.f
44   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
45   CIA new_pc = CPU (h_pc) + 2;
46   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
47   EXTRACT_FMT_0_ADD_CODE
48
49   CPU (h_gr[f_r1]) = ADDSI (OPRND (dr), OPRND (sr));
50   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
51
52 #if WITH_PROFILE_MODEL_P
53   if (PROFILE_MODEL_P (current_cpu))
54     {
55       m32rx_model_mark_get_h_gr (current_cpu, abuf);
56       m32rx_model_mark_set_h_gr (current_cpu, abuf);
57       m32rx_model_profile_insn (current_cpu, abuf);
58     }
59 #endif
60
61   return new_pc;
62 #undef OPRND
63 }
64
65 /* Perform add3: add3 $dr,$sr,#$slo16.  */
66 CIA
67 SEM_FN_NAME (m32rx,add3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
68 {
69   insn_t insn = SEM_INSN (sem_arg);
70 #define OPRND(f) par_exec->operands.fmt_1_add3.f
71   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
72   CIA new_pc = CPU (h_pc) + 4;
73   EXTRACT_FMT_1_ADD3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
74   EXTRACT_FMT_1_ADD3_CODE
75
76   CPU (h_gr[f_r1]) = ADDSI (OPRND (sr), OPRND (slo16));
77   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
78
79 #if WITH_PROFILE_MODEL_P
80   if (PROFILE_MODEL_P (current_cpu))
81     {
82       m32rx_model_mark_get_h_gr (current_cpu, abuf);
83       m32rx_model_mark_set_h_gr (current_cpu, abuf);
84       m32rx_model_profile_insn (current_cpu, abuf);
85     }
86 #endif
87
88   return new_pc;
89 #undef OPRND
90 }
91
92 /* Perform and: and $dr,$sr.  */
93 CIA
94 SEM_FN_NAME (m32rx,and) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
95 {
96   insn_t insn = SEM_INSN (sem_arg);
97 #define OPRND(f) par_exec->operands.fmt_0_add.f
98   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
99   CIA new_pc = CPU (h_pc) + 2;
100   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
101   EXTRACT_FMT_0_ADD_CODE
102
103   CPU (h_gr[f_r1]) = ANDSI (OPRND (dr), OPRND (sr));
104   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
105
106 #if WITH_PROFILE_MODEL_P
107   if (PROFILE_MODEL_P (current_cpu))
108     {
109       m32rx_model_mark_get_h_gr (current_cpu, abuf);
110       m32rx_model_mark_set_h_gr (current_cpu, abuf);
111       m32rx_model_profile_insn (current_cpu, abuf);
112     }
113 #endif
114
115   return new_pc;
116 #undef OPRND
117 }
118
119 /* Perform and3: and3 $dr,$sr,#$uimm16.  */
120 CIA
121 SEM_FN_NAME (m32rx,and3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
122 {
123   insn_t insn = SEM_INSN (sem_arg);
124 #define OPRND(f) par_exec->operands.fmt_2_and3.f
125   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
126   CIA new_pc = CPU (h_pc) + 4;
127   EXTRACT_FMT_2_AND3_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
128   EXTRACT_FMT_2_AND3_CODE
129
130   CPU (h_gr[f_r1]) = ANDSI (OPRND (sr), OPRND (uimm16));
131   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
132
133 #if WITH_PROFILE_MODEL_P
134   if (PROFILE_MODEL_P (current_cpu))
135     {
136       m32rx_model_mark_get_h_gr (current_cpu, abuf);
137       m32rx_model_mark_set_h_gr (current_cpu, abuf);
138       m32rx_model_profile_insn (current_cpu, abuf);
139     }
140 #endif
141
142   return new_pc;
143 #undef OPRND
144 }
145
146 /* Perform or: or $dr,$sr.  */
147 CIA
148 SEM_FN_NAME (m32rx,or) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
149 {
150   insn_t insn = SEM_INSN (sem_arg);
151 #define OPRND(f) par_exec->operands.fmt_0_add.f
152   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
153   CIA new_pc = CPU (h_pc) + 2;
154   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
155   EXTRACT_FMT_0_ADD_CODE
156
157   CPU (h_gr[f_r1]) = ORSI (OPRND (dr), OPRND (sr));
158   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
159
160 #if WITH_PROFILE_MODEL_P
161   if (PROFILE_MODEL_P (current_cpu))
162     {
163       m32rx_model_mark_get_h_gr (current_cpu, abuf);
164       m32rx_model_mark_set_h_gr (current_cpu, abuf);
165       m32rx_model_profile_insn (current_cpu, abuf);
166     }
167 #endif
168
169   return new_pc;
170 #undef OPRND
171 }
172
173 /* Perform or3: or3 $dr,$sr,#$ulo16.  */
174 CIA
175 SEM_FN_NAME (m32rx,or3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
176 {
177   insn_t insn = SEM_INSN (sem_arg);
178 #define OPRND(f) par_exec->operands.fmt_3_or3.f
179   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
180   CIA new_pc = CPU (h_pc) + 4;
181   EXTRACT_FMT_3_OR3_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
182   EXTRACT_FMT_3_OR3_CODE
183
184   CPU (h_gr[f_r1]) = ORSI (OPRND (sr), OPRND (ulo16));
185   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
186
187 #if WITH_PROFILE_MODEL_P
188   if (PROFILE_MODEL_P (current_cpu))
189     {
190       m32rx_model_mark_get_h_gr (current_cpu, abuf);
191       m32rx_model_mark_set_h_gr (current_cpu, abuf);
192       m32rx_model_profile_insn (current_cpu, abuf);
193     }
194 #endif
195
196   return new_pc;
197 #undef OPRND
198 }
199
200 /* Perform xor: xor $dr,$sr.  */
201 CIA
202 SEM_FN_NAME (m32rx,xor) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
203 {
204   insn_t insn = SEM_INSN (sem_arg);
205 #define OPRND(f) par_exec->operands.fmt_0_add.f
206   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
207   CIA new_pc = CPU (h_pc) + 2;
208   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
209   EXTRACT_FMT_0_ADD_CODE
210
211   CPU (h_gr[f_r1]) = XORSI (OPRND (dr), OPRND (sr));
212   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
213
214 #if WITH_PROFILE_MODEL_P
215   if (PROFILE_MODEL_P (current_cpu))
216     {
217       m32rx_model_mark_get_h_gr (current_cpu, abuf);
218       m32rx_model_mark_set_h_gr (current_cpu, abuf);
219       m32rx_model_profile_insn (current_cpu, abuf);
220     }
221 #endif
222
223   return new_pc;
224 #undef OPRND
225 }
226
227 /* Perform xor3: xor3 $dr,$sr,#$uimm16.  */
228 CIA
229 SEM_FN_NAME (m32rx,xor3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
230 {
231   insn_t insn = SEM_INSN (sem_arg);
232 #define OPRND(f) par_exec->operands.fmt_2_and3.f
233   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
234   CIA new_pc = CPU (h_pc) + 4;
235   EXTRACT_FMT_2_AND3_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
236   EXTRACT_FMT_2_AND3_CODE
237
238   CPU (h_gr[f_r1]) = XORSI (OPRND (sr), OPRND (uimm16));
239   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
240
241 #if WITH_PROFILE_MODEL_P
242   if (PROFILE_MODEL_P (current_cpu))
243     {
244       m32rx_model_mark_get_h_gr (current_cpu, abuf);
245       m32rx_model_mark_set_h_gr (current_cpu, abuf);
246       m32rx_model_profile_insn (current_cpu, abuf);
247     }
248 #endif
249
250   return new_pc;
251 #undef OPRND
252 }
253
254 /* Perform addi: addi $dr,#$simm8.  */
255 CIA
256 SEM_FN_NAME (m32rx,addi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
257 {
258   insn_t insn = SEM_INSN (sem_arg);
259 #define OPRND(f) par_exec->operands.fmt_4_addi.f
260   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
261   CIA new_pc = CPU (h_pc) + 2;
262   EXTRACT_FMT_4_ADDI_VARS /* f-op1 f-r1 f-simm8 */
263   EXTRACT_FMT_4_ADDI_CODE
264
265   CPU (h_gr[f_r1]) = ADDSI (OPRND (dr), OPRND (simm8));
266   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
267
268 #if WITH_PROFILE_MODEL_P
269   if (PROFILE_MODEL_P (current_cpu))
270     {
271       m32rx_model_mark_get_h_gr (current_cpu, abuf);
272       m32rx_model_mark_set_h_gr (current_cpu, abuf);
273       m32rx_model_profile_insn (current_cpu, abuf);
274     }
275 #endif
276
277   return new_pc;
278 #undef OPRND
279 }
280
281 /* Perform addv: addv $dr,$sr.  */
282 CIA
283 SEM_FN_NAME (m32rx,addv) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
284 {
285   insn_t insn = SEM_INSN (sem_arg);
286 #define OPRND(f) par_exec->operands.fmt_0_add.f
287   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
288   CIA new_pc = CPU (h_pc) + 2;
289   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
290   EXTRACT_FMT_0_ADD_CODE
291
292 do {
293   BI temp1;SI temp0;
294   temp0 = ADDSI (OPRND (dr), OPRND (sr));
295   temp1 = ADDOFSI (OPRND (dr), OPRND (sr), 0);
296   CPU (h_gr[f_r1]) = temp0;
297   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
298   CPU (h_cond) = temp1;
299   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
300 } while (0);
301
302 #if WITH_PROFILE_MODEL_P
303   if (PROFILE_MODEL_P (current_cpu))
304     {
305       m32rx_model_mark_get_h_gr (current_cpu, abuf);
306       m32rx_model_mark_set_h_gr (current_cpu, abuf);
307       m32rx_model_profile_insn (current_cpu, abuf);
308     }
309 #endif
310
311   return new_pc;
312 #undef OPRND
313 }
314
315 /* Perform addv3: addv3 $dr,$sr,#$simm16.  */
316 CIA
317 SEM_FN_NAME (m32rx,addv3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
318 {
319   insn_t insn = SEM_INSN (sem_arg);
320 #define OPRND(f) par_exec->operands.fmt_5_addv3.f
321   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
322   CIA new_pc = CPU (h_pc) + 4;
323   EXTRACT_FMT_5_ADDV3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
324   EXTRACT_FMT_5_ADDV3_CODE
325
326 do {
327   BI temp1;SI temp0;
328   temp0 = ADDSI (OPRND (sr), OPRND (simm16));
329   temp1 = ADDOFSI (OPRND (sr), OPRND (simm16), 0);
330   CPU (h_gr[f_r1]) = temp0;
331   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
332   CPU (h_cond) = temp1;
333   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
334 } while (0);
335
336 #if WITH_PROFILE_MODEL_P
337   if (PROFILE_MODEL_P (current_cpu))
338     {
339       m32rx_model_mark_get_h_gr (current_cpu, abuf);
340       m32rx_model_mark_set_h_gr (current_cpu, abuf);
341       m32rx_model_profile_insn (current_cpu, abuf);
342     }
343 #endif
344
345   return new_pc;
346 #undef OPRND
347 }
348
349 /* Perform addx: addx $dr,$sr.  */
350 CIA
351 SEM_FN_NAME (m32rx,addx) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
352 {
353   insn_t insn = SEM_INSN (sem_arg);
354 #define OPRND(f) par_exec->operands.fmt_6_addx.f
355   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
356   CIA new_pc = CPU (h_pc) + 2;
357   EXTRACT_FMT_6_ADDX_VARS /* f-op1 f-r1 f-op2 f-r2 */
358   EXTRACT_FMT_6_ADDX_CODE
359
360 do {
361   BI temp1;SI temp0;
362   temp0 = ADDCSI (OPRND (dr), OPRND (sr), OPRND (condbit));
363   temp1 = ADDCFSI (OPRND (dr), OPRND (sr), OPRND (condbit));
364   CPU (h_gr[f_r1]) = temp0;
365   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
366   CPU (h_cond) = temp1;
367   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
368 } while (0);
369
370 #if WITH_PROFILE_MODEL_P
371   if (PROFILE_MODEL_P (current_cpu))
372     {
373       m32rx_model_mark_get_h_gr (current_cpu, abuf);
374       m32rx_model_mark_set_h_gr (current_cpu, abuf);
375       m32rx_model_profile_insn (current_cpu, abuf);
376     }
377 #endif
378
379   return new_pc;
380 #undef OPRND
381 }
382
383 /* Perform bc8: bc $disp8.  */
384 CIA
385 SEM_FN_NAME (m32rx,bc8) (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_7_bc8.f
389   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
390   CIA new_pc = CPU (h_pc) + 2;
391   int taken_p = 0;
392   EXTRACT_FMT_7_BC8_VARS /* f-op1 f-r1 f-disp8 */
393   EXTRACT_FMT_7_BC8_CODE
394
395 if (OPRND (condbit)) {
396   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
397 }
398
399 #if WITH_PROFILE_MODEL_P
400   if (PROFILE_MODEL_P (current_cpu))
401     {
402       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
403     }
404 #endif
405
406   return new_pc;
407 #undef OPRND
408 }
409
410 /* Perform bc24: bc $disp24.  */
411 CIA
412 SEM_FN_NAME (m32rx,bc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
413 {
414   insn_t insn = SEM_INSN (sem_arg);
415 #define OPRND(f) par_exec->operands.fmt_8_bc24.f
416   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
417   CIA new_pc = CPU (h_pc) + 4;
418   int taken_p = 0;
419   EXTRACT_FMT_8_BC24_VARS /* f-op1 f-r1 f-disp24 */
420   EXTRACT_FMT_8_BC24_CODE
421
422 if (OPRND (condbit)) {
423   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
424 }
425
426 #if WITH_PROFILE_MODEL_P
427   if (PROFILE_MODEL_P (current_cpu))
428     {
429       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
430     }
431 #endif
432
433   return new_pc;
434 #undef OPRND
435 }
436
437 /* Perform beq: beq $src1,$src2,$disp16.  */
438 CIA
439 SEM_FN_NAME (m32rx,beq) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
440 {
441   insn_t insn = SEM_INSN (sem_arg);
442 #define OPRND(f) par_exec->operands.fmt_9_beq.f
443   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
444   CIA new_pc = CPU (h_pc) + 4;
445   int taken_p = 0;
446   EXTRACT_FMT_9_BEQ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
447   EXTRACT_FMT_9_BEQ_CODE
448
449 if (EQSI (OPRND (src1), OPRND (src2))) {
450   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
451 }
452
453 #if WITH_PROFILE_MODEL_P
454   if (PROFILE_MODEL_P (current_cpu))
455     {
456       m32rx_model_mark_get_h_gr (current_cpu, abuf);
457       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
458     }
459 #endif
460
461   return new_pc;
462 #undef OPRND
463 }
464
465 /* Perform beqz: beqz $src2,$disp16.  */
466 CIA
467 SEM_FN_NAME (m32rx,beqz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
468 {
469   insn_t insn = SEM_INSN (sem_arg);
470 #define OPRND(f) par_exec->operands.fmt_10_beqz.f
471   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
472   CIA new_pc = CPU (h_pc) + 4;
473   int taken_p = 0;
474   EXTRACT_FMT_10_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
475   EXTRACT_FMT_10_BEQZ_CODE
476
477 if (EQSI (OPRND (src2), 0)) {
478   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
479 }
480
481 #if WITH_PROFILE_MODEL_P
482   if (PROFILE_MODEL_P (current_cpu))
483     {
484       m32rx_model_mark_get_h_gr (current_cpu, abuf);
485       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
486     }
487 #endif
488
489   return new_pc;
490 #undef OPRND
491 }
492
493 /* Perform bgez: bgez $src2,$disp16.  */
494 CIA
495 SEM_FN_NAME (m32rx,bgez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
496 {
497   insn_t insn = SEM_INSN (sem_arg);
498 #define OPRND(f) par_exec->operands.fmt_10_beqz.f
499   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
500   CIA new_pc = CPU (h_pc) + 4;
501   int taken_p = 0;
502   EXTRACT_FMT_10_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
503   EXTRACT_FMT_10_BEQZ_CODE
504
505 if (GESI (OPRND (src2), 0)) {
506   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
507 }
508
509 #if WITH_PROFILE_MODEL_P
510   if (PROFILE_MODEL_P (current_cpu))
511     {
512       m32rx_model_mark_get_h_gr (current_cpu, abuf);
513       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
514     }
515 #endif
516
517   return new_pc;
518 #undef OPRND
519 }
520
521 /* Perform bgtz: bgtz $src2,$disp16.  */
522 CIA
523 SEM_FN_NAME (m32rx,bgtz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
524 {
525   insn_t insn = SEM_INSN (sem_arg);
526 #define OPRND(f) par_exec->operands.fmt_10_beqz.f
527   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
528   CIA new_pc = CPU (h_pc) + 4;
529   int taken_p = 0;
530   EXTRACT_FMT_10_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
531   EXTRACT_FMT_10_BEQZ_CODE
532
533 if (GTSI (OPRND (src2), 0)) {
534   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
535 }
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 /* Perform blez: blez $src2,$disp16.  */
550 CIA
551 SEM_FN_NAME (m32rx,blez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
552 {
553   insn_t insn = SEM_INSN (sem_arg);
554 #define OPRND(f) par_exec->operands.fmt_10_beqz.f
555   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
556   CIA new_pc = CPU (h_pc) + 4;
557   int taken_p = 0;
558   EXTRACT_FMT_10_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
559   EXTRACT_FMT_10_BEQZ_CODE
560
561 if (LESI (OPRND (src2), 0)) {
562   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
563 }
564
565 #if WITH_PROFILE_MODEL_P
566   if (PROFILE_MODEL_P (current_cpu))
567     {
568       m32rx_model_mark_get_h_gr (current_cpu, abuf);
569       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
570     }
571 #endif
572
573   return new_pc;
574 #undef OPRND
575 }
576
577 /* Perform bltz: bltz $src2,$disp16.  */
578 CIA
579 SEM_FN_NAME (m32rx,bltz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
580 {
581   insn_t insn = SEM_INSN (sem_arg);
582 #define OPRND(f) par_exec->operands.fmt_10_beqz.f
583   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
584   CIA new_pc = CPU (h_pc) + 4;
585   int taken_p = 0;
586   EXTRACT_FMT_10_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
587   EXTRACT_FMT_10_BEQZ_CODE
588
589 if (LTSI (OPRND (src2), 0)) {
590   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
591 }
592
593 #if WITH_PROFILE_MODEL_P
594   if (PROFILE_MODEL_P (current_cpu))
595     {
596       m32rx_model_mark_get_h_gr (current_cpu, abuf);
597       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
598     }
599 #endif
600
601   return new_pc;
602 #undef OPRND
603 }
604
605 /* Perform bnez: bnez $src2,$disp16.  */
606 CIA
607 SEM_FN_NAME (m32rx,bnez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
608 {
609   insn_t insn = SEM_INSN (sem_arg);
610 #define OPRND(f) par_exec->operands.fmt_10_beqz.f
611   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
612   CIA new_pc = CPU (h_pc) + 4;
613   int taken_p = 0;
614   EXTRACT_FMT_10_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
615   EXTRACT_FMT_10_BEQZ_CODE
616
617 if (NESI (OPRND (src2), 0)) {
618   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
619 }
620
621 #if WITH_PROFILE_MODEL_P
622   if (PROFILE_MODEL_P (current_cpu))
623     {
624       m32rx_model_mark_get_h_gr (current_cpu, abuf);
625       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
626     }
627 #endif
628
629   return new_pc;
630 #undef OPRND
631 }
632
633 /* Perform bl8: bl $disp8.  */
634 CIA
635 SEM_FN_NAME (m32rx,bl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
636 {
637   insn_t insn = SEM_INSN (sem_arg);
638 #define OPRND(f) par_exec->operands.fmt_11_bl8.f
639   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
640   CIA new_pc = CPU (h_pc) + 2;
641   int taken_p = 0;
642   EXTRACT_FMT_11_BL8_VARS /* f-op1 f-r1 f-disp8 */
643   EXTRACT_FMT_11_BL8_CODE
644
645 do {
646   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
647   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
648   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
649 } while (0);
650
651 #if WITH_PROFILE_MODEL_P
652   if (PROFILE_MODEL_P (current_cpu))
653     {
654       m32rx_model_mark_set_h_gr (current_cpu, abuf);
655       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
656     }
657 #endif
658
659   return new_pc;
660 #undef OPRND
661 }
662
663 /* Perform bl24: bl $disp24.  */
664 CIA
665 SEM_FN_NAME (m32rx,bl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
666 {
667   insn_t insn = SEM_INSN (sem_arg);
668 #define OPRND(f) par_exec->operands.fmt_12_bl24.f
669   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
670   CIA new_pc = CPU (h_pc) + 4;
671   int taken_p = 0;
672   EXTRACT_FMT_12_BL24_VARS /* f-op1 f-r1 f-disp24 */
673   EXTRACT_FMT_12_BL24_CODE
674
675 do {
676   CPU (h_gr[14]) = ADDSI (OPRND (pc), 4);
677   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
678   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
679 } while (0);
680
681 #if WITH_PROFILE_MODEL_P
682   if (PROFILE_MODEL_P (current_cpu))
683     {
684       m32rx_model_mark_set_h_gr (current_cpu, abuf);
685       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
686     }
687 #endif
688
689   return new_pc;
690 #undef OPRND
691 }
692
693 /* Perform bcl8: bcl $disp8.  */
694 CIA
695 SEM_FN_NAME (m32rx,bcl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
696 {
697   insn_t insn = SEM_INSN (sem_arg);
698 #define OPRND(f) par_exec->operands.fmt_13_bcl8.f
699   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
700   CIA new_pc = CPU (h_pc) + 2;
701   int taken_p = 0;
702   EXTRACT_FMT_13_BCL8_VARS /* f-op1 f-r1 f-disp8 */
703   EXTRACT_FMT_13_BCL8_CODE
704
705 if (OPRND (condbit)) {
706 do {
707   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
708   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
709   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
710 } while (0);
711 }
712
713 #if WITH_PROFILE_MODEL_P
714   if (PROFILE_MODEL_P (current_cpu))
715     {
716       m32rx_model_mark_set_h_gr (current_cpu, abuf);
717       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
718     }
719 #endif
720
721   return new_pc;
722 #undef OPRND
723 }
724
725 /* Perform bcl24: bcl $disp24.  */
726 CIA
727 SEM_FN_NAME (m32rx,bcl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
728 {
729   insn_t insn = SEM_INSN (sem_arg);
730 #define OPRND(f) par_exec->operands.fmt_14_bcl24.f
731   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
732   CIA new_pc = CPU (h_pc) + 4;
733   int taken_p = 0;
734   EXTRACT_FMT_14_BCL24_VARS /* f-op1 f-r1 f-disp24 */
735   EXTRACT_FMT_14_BCL24_CODE
736
737 if (OPRND (condbit)) {
738 do {
739   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
740   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
741   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
742 } while (0);
743 }
744
745 #if WITH_PROFILE_MODEL_P
746   if (PROFILE_MODEL_P (current_cpu))
747     {
748       m32rx_model_mark_set_h_gr (current_cpu, abuf);
749       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
750     }
751 #endif
752
753   return new_pc;
754 #undef OPRND
755 }
756
757 /* Perform bnc8: bnc $disp8.  */
758 CIA
759 SEM_FN_NAME (m32rx,bnc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
760 {
761   insn_t insn = SEM_INSN (sem_arg);
762 #define OPRND(f) par_exec->operands.fmt_7_bc8.f
763   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
764   CIA new_pc = CPU (h_pc) + 2;
765   int taken_p = 0;
766   EXTRACT_FMT_7_BC8_VARS /* f-op1 f-r1 f-disp8 */
767   EXTRACT_FMT_7_BC8_CODE
768
769 if (NOTBI (OPRND (condbit))) {
770   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
771 }
772
773 #if WITH_PROFILE_MODEL_P
774   if (PROFILE_MODEL_P (current_cpu))
775     {
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 /* Perform bnc24: bnc $disp24.  */
785 CIA
786 SEM_FN_NAME (m32rx,bnc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
787 {
788   insn_t insn = SEM_INSN (sem_arg);
789 #define OPRND(f) par_exec->operands.fmt_8_bc24.f
790   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
791   CIA new_pc = CPU (h_pc) + 4;
792   int taken_p = 0;
793   EXTRACT_FMT_8_BC24_VARS /* f-op1 f-r1 f-disp24 */
794   EXTRACT_FMT_8_BC24_CODE
795
796 if (NOTBI (OPRND (condbit))) {
797   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
798 }
799
800 #if WITH_PROFILE_MODEL_P
801   if (PROFILE_MODEL_P (current_cpu))
802     {
803       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
804     }
805 #endif
806
807   return new_pc;
808 #undef OPRND
809 }
810
811 /* Perform bne: bne $src1,$src2,$disp16.  */
812 CIA
813 SEM_FN_NAME (m32rx,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
814 {
815   insn_t insn = SEM_INSN (sem_arg);
816 #define OPRND(f) par_exec->operands.fmt_9_beq.f
817   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
818   CIA new_pc = CPU (h_pc) + 4;
819   int taken_p = 0;
820   EXTRACT_FMT_9_BEQ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
821   EXTRACT_FMT_9_BEQ_CODE
822
823 if (NESI (OPRND (src1), OPRND (src2))) {
824   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
825 }
826
827 #if WITH_PROFILE_MODEL_P
828   if (PROFILE_MODEL_P (current_cpu))
829     {
830       m32rx_model_mark_get_h_gr (current_cpu, abuf);
831       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
832     }
833 #endif
834
835   return new_pc;
836 #undef OPRND
837 }
838
839 /* Perform bra8: bra $disp8.  */
840 CIA
841 SEM_FN_NAME (m32rx,bra8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
842 {
843   insn_t insn = SEM_INSN (sem_arg);
844 #define OPRND(f) par_exec->operands.fmt_15_bra8.f
845   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
846   CIA new_pc = CPU (h_pc) + 2;
847   int taken_p = 0;
848   EXTRACT_FMT_15_BRA8_VARS /* f-op1 f-r1 f-disp8 */
849   EXTRACT_FMT_15_BRA8_CODE
850
851   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
852
853 #if WITH_PROFILE_MODEL_P
854   if (PROFILE_MODEL_P (current_cpu))
855     {
856       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
857     }
858 #endif
859
860   return new_pc;
861 #undef OPRND
862 }
863
864 /* Perform bra24: bra $disp24.  */
865 CIA
866 SEM_FN_NAME (m32rx,bra24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
867 {
868   insn_t insn = SEM_INSN (sem_arg);
869 #define OPRND(f) par_exec->operands.fmt_16_bra24.f
870   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
871   CIA new_pc = CPU (h_pc) + 4;
872   int taken_p = 0;
873   EXTRACT_FMT_16_BRA24_VARS /* f-op1 f-r1 f-disp24 */
874   EXTRACT_FMT_16_BRA24_CODE
875
876   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
877
878 #if WITH_PROFILE_MODEL_P
879   if (PROFILE_MODEL_P (current_cpu))
880     {
881       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
882     }
883 #endif
884
885   return new_pc;
886 #undef OPRND
887 }
888
889 /* Perform bncl8: bncl $disp8.  */
890 CIA
891 SEM_FN_NAME (m32rx,bncl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
892 {
893   insn_t insn = SEM_INSN (sem_arg);
894 #define OPRND(f) par_exec->operands.fmt_13_bcl8.f
895   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
896   CIA new_pc = CPU (h_pc) + 2;
897   int taken_p = 0;
898   EXTRACT_FMT_13_BCL8_VARS /* f-op1 f-r1 f-disp8 */
899   EXTRACT_FMT_13_BCL8_CODE
900
901 if (NOTBI (OPRND (condbit))) {
902 do {
903   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
904   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
905   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
906 } while (0);
907 }
908
909 #if WITH_PROFILE_MODEL_P
910   if (PROFILE_MODEL_P (current_cpu))
911     {
912       m32rx_model_mark_set_h_gr (current_cpu, abuf);
913       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
914     }
915 #endif
916
917   return new_pc;
918 #undef OPRND
919 }
920
921 /* Perform bncl24: bncl $disp24.  */
922 CIA
923 SEM_FN_NAME (m32rx,bncl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
924 {
925   insn_t insn = SEM_INSN (sem_arg);
926 #define OPRND(f) par_exec->operands.fmt_14_bcl24.f
927   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
928   CIA new_pc = CPU (h_pc) + 4;
929   int taken_p = 0;
930   EXTRACT_FMT_14_BCL24_VARS /* f-op1 f-r1 f-disp24 */
931   EXTRACT_FMT_14_BCL24_CODE
932
933 if (NOTBI (OPRND (condbit))) {
934 do {
935   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
936   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
937   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
938 } while (0);
939 }
940
941 #if WITH_PROFILE_MODEL_P
942   if (PROFILE_MODEL_P (current_cpu))
943     {
944       m32rx_model_mark_set_h_gr (current_cpu, abuf);
945       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
946     }
947 #endif
948
949   return new_pc;
950 #undef OPRND
951 }
952
953 /* Perform cmp: cmp $src1,$src2.  */
954 CIA
955 SEM_FN_NAME (m32rx,cmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
956 {
957   insn_t insn = SEM_INSN (sem_arg);
958 #define OPRND(f) par_exec->operands.fmt_17_cmp.f
959   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
960   CIA new_pc = CPU (h_pc) + 2;
961   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
962   EXTRACT_FMT_17_CMP_CODE
963
964   CPU (h_cond) = LTSI (OPRND (src1), OPRND (src2));
965   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
966
967 #if WITH_PROFILE_MODEL_P
968   if (PROFILE_MODEL_P (current_cpu))
969     {
970       m32rx_model_mark_get_h_gr (current_cpu, abuf);
971       m32rx_model_profile_insn (current_cpu, abuf);
972     }
973 #endif
974
975   return new_pc;
976 #undef OPRND
977 }
978
979 /* Perform cmpi: cmpi $src2,#$simm16.  */
980 CIA
981 SEM_FN_NAME (m32rx,cmpi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
982 {
983   insn_t insn = SEM_INSN (sem_arg);
984 #define OPRND(f) par_exec->operands.fmt_18_cmpi.f
985   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
986   CIA new_pc = CPU (h_pc) + 4;
987   EXTRACT_FMT_18_CMPI_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
988   EXTRACT_FMT_18_CMPI_CODE
989
990   CPU (h_cond) = LTSI (OPRND (src2), OPRND (simm16));
991   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
992
993 #if WITH_PROFILE_MODEL_P
994   if (PROFILE_MODEL_P (current_cpu))
995     {
996       m32rx_model_mark_get_h_gr (current_cpu, abuf);
997       m32rx_model_profile_insn (current_cpu, abuf);
998     }
999 #endif
1000
1001   return new_pc;
1002 #undef OPRND
1003 }
1004
1005 /* Perform cmpu: cmpu $src1,$src2.  */
1006 CIA
1007 SEM_FN_NAME (m32rx,cmpu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1008 {
1009   insn_t insn = SEM_INSN (sem_arg);
1010 #define OPRND(f) par_exec->operands.fmt_17_cmp.f
1011   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1012   CIA new_pc = CPU (h_pc) + 2;
1013   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1014   EXTRACT_FMT_17_CMP_CODE
1015
1016   CPU (h_cond) = LTUSI (OPRND (src1), OPRND (src2));
1017   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1018
1019 #if WITH_PROFILE_MODEL_P
1020   if (PROFILE_MODEL_P (current_cpu))
1021     {
1022       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1023       m32rx_model_profile_insn (current_cpu, abuf);
1024     }
1025 #endif
1026
1027   return new_pc;
1028 #undef OPRND
1029 }
1030
1031 /* Perform cmpui: cmpui $src2,#$uimm16.  */
1032 CIA
1033 SEM_FN_NAME (m32rx,cmpui) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1034 {
1035   insn_t insn = SEM_INSN (sem_arg);
1036 #define OPRND(f) par_exec->operands.fmt_19_cmpui.f
1037   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1038   CIA new_pc = CPU (h_pc) + 4;
1039   EXTRACT_FMT_19_CMPUI_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
1040   EXTRACT_FMT_19_CMPUI_CODE
1041
1042   CPU (h_cond) = LTUSI (OPRND (src2), OPRND (uimm16));
1043   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1044
1045 #if WITH_PROFILE_MODEL_P
1046   if (PROFILE_MODEL_P (current_cpu))
1047     {
1048       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1049       m32rx_model_profile_insn (current_cpu, abuf);
1050     }
1051 #endif
1052
1053   return new_pc;
1054 #undef OPRND
1055 }
1056
1057 /* Perform cmpeq: cmpeq $src1,$src2.  */
1058 CIA
1059 SEM_FN_NAME (m32rx,cmpeq) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1060 {
1061   insn_t insn = SEM_INSN (sem_arg);
1062 #define OPRND(f) par_exec->operands.fmt_17_cmp.f
1063   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1064   CIA new_pc = CPU (h_pc) + 2;
1065   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1066   EXTRACT_FMT_17_CMP_CODE
1067
1068   CPU (h_cond) = EQSI (OPRND (src1), OPRND (src2));
1069   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1070
1071 #if WITH_PROFILE_MODEL_P
1072   if (PROFILE_MODEL_P (current_cpu))
1073     {
1074       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1075       m32rx_model_profile_insn (current_cpu, abuf);
1076     }
1077 #endif
1078
1079   return new_pc;
1080 #undef OPRND
1081 }
1082
1083 /* Perform cmpz: cmpz $src2.  */
1084 CIA
1085 SEM_FN_NAME (m32rx,cmpz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1086 {
1087   insn_t insn = SEM_INSN (sem_arg);
1088 #define OPRND(f) par_exec->operands.fmt_20_cmpz.f
1089   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1090   CIA new_pc = CPU (h_pc) + 2;
1091   EXTRACT_FMT_20_CMPZ_VARS /* f-op1 f-r1 f-op2 f-r2 */
1092   EXTRACT_FMT_20_CMPZ_CODE
1093
1094   CPU (h_cond) = EQSI (OPRND (src2), 0);
1095   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1096
1097 #if WITH_PROFILE_MODEL_P
1098   if (PROFILE_MODEL_P (current_cpu))
1099     {
1100       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1101       m32rx_model_profile_insn (current_cpu, abuf);
1102     }
1103 #endif
1104
1105   return new_pc;
1106 #undef OPRND
1107 }
1108
1109 /* Perform div: div $dr,$sr.  */
1110 CIA
1111 SEM_FN_NAME (m32rx,div) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1112 {
1113   insn_t insn = SEM_INSN (sem_arg);
1114 #define OPRND(f) par_exec->operands.fmt_21_div.f
1115   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1116   CIA new_pc = CPU (h_pc) + 4;
1117   EXTRACT_FMT_21_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1118   EXTRACT_FMT_21_DIV_CODE
1119
1120 if (NESI (OPRND (sr), 0)) {
1121   CPU (h_gr[f_r1]) = DIVSI (OPRND (dr), OPRND (sr));
1122   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1123 }
1124
1125 #if WITH_PROFILE_MODEL_P
1126   if (PROFILE_MODEL_P (current_cpu))
1127     {
1128       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1129       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1130       m32rx_model_profile_insn (current_cpu, abuf);
1131     }
1132 #endif
1133
1134   return new_pc;
1135 #undef OPRND
1136 }
1137
1138 /* Perform divu: divu $dr,$sr.  */
1139 CIA
1140 SEM_FN_NAME (m32rx,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1141 {
1142   insn_t insn = SEM_INSN (sem_arg);
1143 #define OPRND(f) par_exec->operands.fmt_21_div.f
1144   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1145   CIA new_pc = CPU (h_pc) + 4;
1146   EXTRACT_FMT_21_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1147   EXTRACT_FMT_21_DIV_CODE
1148
1149 if (NESI (OPRND (sr), 0)) {
1150   CPU (h_gr[f_r1]) = UDIVSI (OPRND (dr), OPRND (sr));
1151   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1152 }
1153
1154 #if WITH_PROFILE_MODEL_P
1155   if (PROFILE_MODEL_P (current_cpu))
1156     {
1157       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1158       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1159       m32rx_model_profile_insn (current_cpu, abuf);
1160     }
1161 #endif
1162
1163   return new_pc;
1164 #undef OPRND
1165 }
1166
1167 /* Perform rem: rem $dr,$sr.  */
1168 CIA
1169 SEM_FN_NAME (m32rx,rem) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1170 {
1171   insn_t insn = SEM_INSN (sem_arg);
1172 #define OPRND(f) par_exec->operands.fmt_21_div.f
1173   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1174   CIA new_pc = CPU (h_pc) + 4;
1175   EXTRACT_FMT_21_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1176   EXTRACT_FMT_21_DIV_CODE
1177
1178 if (NESI (OPRND (sr), 0)) {
1179   CPU (h_gr[f_r1]) = MODSI (OPRND (dr), OPRND (sr));
1180   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1181 }
1182
1183 #if WITH_PROFILE_MODEL_P
1184   if (PROFILE_MODEL_P (current_cpu))
1185     {
1186       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1187       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1188       m32rx_model_profile_insn (current_cpu, abuf);
1189     }
1190 #endif
1191
1192   return new_pc;
1193 #undef OPRND
1194 }
1195
1196 /* Perform remu: remu $dr,$sr.  */
1197 CIA
1198 SEM_FN_NAME (m32rx,remu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1199 {
1200   insn_t insn = SEM_INSN (sem_arg);
1201 #define OPRND(f) par_exec->operands.fmt_21_div.f
1202   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1203   CIA new_pc = CPU (h_pc) + 4;
1204   EXTRACT_FMT_21_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1205   EXTRACT_FMT_21_DIV_CODE
1206
1207 if (NESI (OPRND (sr), 0)) {
1208   CPU (h_gr[f_r1]) = UMODSI (OPRND (dr), OPRND (sr));
1209   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1210 }
1211
1212 #if WITH_PROFILE_MODEL_P
1213   if (PROFILE_MODEL_P (current_cpu))
1214     {
1215       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1216       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1217       m32rx_model_profile_insn (current_cpu, abuf);
1218     }
1219 #endif
1220
1221   return new_pc;
1222 #undef OPRND
1223 }
1224
1225 /* Perform jc: jc $sr.  */
1226 CIA
1227 SEM_FN_NAME (m32rx,jc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1228 {
1229   insn_t insn = SEM_INSN (sem_arg);
1230 #define OPRND(f) par_exec->operands.fmt_22_jc.f
1231   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1232   CIA new_pc = CPU (h_pc) + 2;
1233   int taken_p = 0;
1234   EXTRACT_FMT_22_JC_VARS /* f-op1 f-r1 f-op2 f-r2 */
1235   EXTRACT_FMT_22_JC_CODE
1236
1237 if (OPRND (condbit)) {
1238   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, ANDSI (OPRND (sr), -4)));
1239 }
1240
1241 #if WITH_PROFILE_MODEL_P
1242   if (PROFILE_MODEL_P (current_cpu))
1243     {
1244       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1245       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1246     }
1247 #endif
1248
1249   return new_pc;
1250 #undef OPRND
1251 }
1252
1253 /* Perform jnc: jnc $sr.  */
1254 CIA
1255 SEM_FN_NAME (m32rx,jnc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1256 {
1257   insn_t insn = SEM_INSN (sem_arg);
1258 #define OPRND(f) par_exec->operands.fmt_22_jc.f
1259   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1260   CIA new_pc = CPU (h_pc) + 2;
1261   int taken_p = 0;
1262   EXTRACT_FMT_22_JC_VARS /* f-op1 f-r1 f-op2 f-r2 */
1263   EXTRACT_FMT_22_JC_CODE
1264
1265 if (NOTBI (OPRND (condbit))) {
1266   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, ANDSI (OPRND (sr), -4)));
1267 }
1268
1269 #if WITH_PROFILE_MODEL_P
1270   if (PROFILE_MODEL_P (current_cpu))
1271     {
1272       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1273       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1274     }
1275 #endif
1276
1277   return new_pc;
1278 #undef OPRND
1279 }
1280
1281 /* Perform jl: jl $sr.  */
1282 CIA
1283 SEM_FN_NAME (m32rx,jl) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1284 {
1285   insn_t insn = SEM_INSN (sem_arg);
1286 #define OPRND(f) par_exec->operands.fmt_23_jl.f
1287   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1288   CIA new_pc = CPU (h_pc) + 2;
1289   int taken_p = 0;
1290   EXTRACT_FMT_23_JL_VARS /* f-op1 f-r1 f-op2 f-r2 */
1291   EXTRACT_FMT_23_JL_CODE
1292
1293 do {
1294   USI temp1;SI temp0;
1295   temp0 = ADDSI (ANDSI (OPRND (pc), -4), 4);
1296   temp1 = OPRND (sr);
1297   CPU (h_gr[14]) = temp0;
1298   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
1299   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, temp1));
1300 } while (0);
1301
1302 #if WITH_PROFILE_MODEL_P
1303   if (PROFILE_MODEL_P (current_cpu))
1304     {
1305       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1306       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1307       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1308     }
1309 #endif
1310
1311   return new_pc;
1312 #undef OPRND
1313 }
1314
1315 /* Perform jmp: jmp $sr.  */
1316 CIA
1317 SEM_FN_NAME (m32rx,jmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1318 {
1319   insn_t insn = SEM_INSN (sem_arg);
1320 #define OPRND(f) par_exec->operands.fmt_24_jmp.f
1321   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1322   CIA new_pc = CPU (h_pc) + 2;
1323   int taken_p = 0;
1324   EXTRACT_FMT_24_JMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1325   EXTRACT_FMT_24_JMP_CODE
1326
1327   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, OPRND (sr)));
1328
1329 #if WITH_PROFILE_MODEL_P
1330   if (PROFILE_MODEL_P (current_cpu))
1331     {
1332       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1333       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1334     }
1335 #endif
1336
1337   return new_pc;
1338 #undef OPRND
1339 }
1340
1341 /* Perform ld: ld $dr,@$sr.  */
1342 CIA
1343 SEM_FN_NAME (m32rx,ld) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1344 {
1345   insn_t insn = SEM_INSN (sem_arg);
1346 #define OPRND(f) par_exec->operands.fmt_25_ld.f
1347   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1348   CIA new_pc = CPU (h_pc) + 2;
1349   EXTRACT_FMT_25_LD_VARS /* f-op1 f-r1 f-op2 f-r2 */
1350   EXTRACT_FMT_25_LD_CODE
1351
1352   CPU (h_gr[f_r1]) = OPRND (h_memory_sr);
1353   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1354
1355 #if WITH_PROFILE_MODEL_P
1356   if (PROFILE_MODEL_P (current_cpu))
1357     {
1358       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1359       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1360       m32rx_model_profile_insn (current_cpu, abuf);
1361     }
1362 #endif
1363
1364   return new_pc;
1365 #undef OPRND
1366 }
1367
1368 /* Perform ld-d: ld $dr,@($slo16,$sr).  */
1369 CIA
1370 SEM_FN_NAME (m32rx,ld_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1371 {
1372   insn_t insn = SEM_INSN (sem_arg);
1373 #define OPRND(f) par_exec->operands.fmt_26_ld_d.f
1374   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1375   CIA new_pc = CPU (h_pc) + 4;
1376   EXTRACT_FMT_26_LD_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1377   EXTRACT_FMT_26_LD_D_CODE
1378
1379   CPU (h_gr[f_r1]) = OPRND (h_memory_add_WI_sr_slo16);
1380   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1381
1382 #if WITH_PROFILE_MODEL_P
1383   if (PROFILE_MODEL_P (current_cpu))
1384     {
1385       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1386       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1387       m32rx_model_profile_insn (current_cpu, abuf);
1388     }
1389 #endif
1390
1391   return new_pc;
1392 #undef OPRND
1393 }
1394
1395 /* Perform ldb: ldb $dr,@$sr.  */
1396 CIA
1397 SEM_FN_NAME (m32rx,ldb) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1398 {
1399   insn_t insn = SEM_INSN (sem_arg);
1400 #define OPRND(f) par_exec->operands.fmt_27_ldb.f
1401   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1402   CIA new_pc = CPU (h_pc) + 2;
1403   EXTRACT_FMT_27_LDB_VARS /* f-op1 f-r1 f-op2 f-r2 */
1404   EXTRACT_FMT_27_LDB_CODE
1405
1406   CPU (h_gr[f_r1]) = EXTQISI (OPRND (h_memory_sr));
1407   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1408
1409 #if WITH_PROFILE_MODEL_P
1410   if (PROFILE_MODEL_P (current_cpu))
1411     {
1412       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1413       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1414       m32rx_model_profile_insn (current_cpu, abuf);
1415     }
1416 #endif
1417
1418   return new_pc;
1419 #undef OPRND
1420 }
1421
1422 /* Perform ldb-d: ldb $dr,@($slo16,$sr).  */
1423 CIA
1424 SEM_FN_NAME (m32rx,ldb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1425 {
1426   insn_t insn = SEM_INSN (sem_arg);
1427 #define OPRND(f) par_exec->operands.fmt_28_ldb_d.f
1428   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1429   CIA new_pc = CPU (h_pc) + 4;
1430   EXTRACT_FMT_28_LDB_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1431   EXTRACT_FMT_28_LDB_D_CODE
1432
1433   CPU (h_gr[f_r1]) = EXTQISI (OPRND (h_memory_add_WI_sr_slo16));
1434   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1435
1436 #if WITH_PROFILE_MODEL_P
1437   if (PROFILE_MODEL_P (current_cpu))
1438     {
1439       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1440       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1441       m32rx_model_profile_insn (current_cpu, abuf);
1442     }
1443 #endif
1444
1445   return new_pc;
1446 #undef OPRND
1447 }
1448
1449 /* Perform ldh: ldh $dr,@$sr.  */
1450 CIA
1451 SEM_FN_NAME (m32rx,ldh) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1452 {
1453   insn_t insn = SEM_INSN (sem_arg);
1454 #define OPRND(f) par_exec->operands.fmt_29_ldh.f
1455   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1456   CIA new_pc = CPU (h_pc) + 2;
1457   EXTRACT_FMT_29_LDH_VARS /* f-op1 f-r1 f-op2 f-r2 */
1458   EXTRACT_FMT_29_LDH_CODE
1459
1460   CPU (h_gr[f_r1]) = EXTHISI (OPRND (h_memory_sr));
1461   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1462
1463 #if WITH_PROFILE_MODEL_P
1464   if (PROFILE_MODEL_P (current_cpu))
1465     {
1466       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1467       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1468       m32rx_model_profile_insn (current_cpu, abuf);
1469     }
1470 #endif
1471
1472   return new_pc;
1473 #undef OPRND
1474 }
1475
1476 /* Perform ldh-d: ldh $dr,@($slo16,$sr).  */
1477 CIA
1478 SEM_FN_NAME (m32rx,ldh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1479 {
1480   insn_t insn = SEM_INSN (sem_arg);
1481 #define OPRND(f) par_exec->operands.fmt_30_ldh_d.f
1482   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1483   CIA new_pc = CPU (h_pc) + 4;
1484   EXTRACT_FMT_30_LDH_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1485   EXTRACT_FMT_30_LDH_D_CODE
1486
1487   CPU (h_gr[f_r1]) = EXTHISI (OPRND (h_memory_add_WI_sr_slo16));
1488   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1489
1490 #if WITH_PROFILE_MODEL_P
1491   if (PROFILE_MODEL_P (current_cpu))
1492     {
1493       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1494       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1495       m32rx_model_profile_insn (current_cpu, abuf);
1496     }
1497 #endif
1498
1499   return new_pc;
1500 #undef OPRND
1501 }
1502
1503 /* Perform ldub: ldub $dr,@$sr.  */
1504 CIA
1505 SEM_FN_NAME (m32rx,ldub) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1506 {
1507   insn_t insn = SEM_INSN (sem_arg);
1508 #define OPRND(f) par_exec->operands.fmt_27_ldb.f
1509   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1510   CIA new_pc = CPU (h_pc) + 2;
1511   EXTRACT_FMT_27_LDB_VARS /* f-op1 f-r1 f-op2 f-r2 */
1512   EXTRACT_FMT_27_LDB_CODE
1513
1514   CPU (h_gr[f_r1]) = ZEXTQISI (OPRND (h_memory_sr));
1515   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1516
1517 #if WITH_PROFILE_MODEL_P
1518   if (PROFILE_MODEL_P (current_cpu))
1519     {
1520       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1521       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1522       m32rx_model_profile_insn (current_cpu, abuf);
1523     }
1524 #endif
1525
1526   return new_pc;
1527 #undef OPRND
1528 }
1529
1530 /* Perform ldub-d: ldub $dr,@($slo16,$sr).  */
1531 CIA
1532 SEM_FN_NAME (m32rx,ldub_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1533 {
1534   insn_t insn = SEM_INSN (sem_arg);
1535 #define OPRND(f) par_exec->operands.fmt_28_ldb_d.f
1536   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1537   CIA new_pc = CPU (h_pc) + 4;
1538   EXTRACT_FMT_28_LDB_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1539   EXTRACT_FMT_28_LDB_D_CODE
1540
1541   CPU (h_gr[f_r1]) = ZEXTQISI (OPRND (h_memory_add_WI_sr_slo16));
1542   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1543
1544 #if WITH_PROFILE_MODEL_P
1545   if (PROFILE_MODEL_P (current_cpu))
1546     {
1547       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1548       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1549       m32rx_model_profile_insn (current_cpu, abuf);
1550     }
1551 #endif
1552
1553   return new_pc;
1554 #undef OPRND
1555 }
1556
1557 /* Perform lduh: lduh $dr,@$sr.  */
1558 CIA
1559 SEM_FN_NAME (m32rx,lduh) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1560 {
1561   insn_t insn = SEM_INSN (sem_arg);
1562 #define OPRND(f) par_exec->operands.fmt_29_ldh.f
1563   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1564   CIA new_pc = CPU (h_pc) + 2;
1565   EXTRACT_FMT_29_LDH_VARS /* f-op1 f-r1 f-op2 f-r2 */
1566   EXTRACT_FMT_29_LDH_CODE
1567
1568   CPU (h_gr[f_r1]) = ZEXTHISI (OPRND (h_memory_sr));
1569   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1570
1571 #if WITH_PROFILE_MODEL_P
1572   if (PROFILE_MODEL_P (current_cpu))
1573     {
1574       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1575       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1576       m32rx_model_profile_insn (current_cpu, abuf);
1577     }
1578 #endif
1579
1580   return new_pc;
1581 #undef OPRND
1582 }
1583
1584 /* Perform lduh-d: lduh $dr,@($slo16,$sr).  */
1585 CIA
1586 SEM_FN_NAME (m32rx,lduh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1587 {
1588   insn_t insn = SEM_INSN (sem_arg);
1589 #define OPRND(f) par_exec->operands.fmt_30_ldh_d.f
1590   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1591   CIA new_pc = CPU (h_pc) + 4;
1592   EXTRACT_FMT_30_LDH_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1593   EXTRACT_FMT_30_LDH_D_CODE
1594
1595   CPU (h_gr[f_r1]) = ZEXTHISI (OPRND (h_memory_add_WI_sr_slo16));
1596   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1597
1598 #if WITH_PROFILE_MODEL_P
1599   if (PROFILE_MODEL_P (current_cpu))
1600     {
1601       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1602       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1603       m32rx_model_profile_insn (current_cpu, abuf);
1604     }
1605 #endif
1606
1607   return new_pc;
1608 #undef OPRND
1609 }
1610
1611 /* Perform ld-plus: ld $dr,@$sr+.  */
1612 CIA
1613 SEM_FN_NAME (m32rx,ld_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1614 {
1615   insn_t insn = SEM_INSN (sem_arg);
1616 #define OPRND(f) par_exec->operands.fmt_25_ld.f
1617   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1618   CIA new_pc = CPU (h_pc) + 2;
1619   EXTRACT_FMT_25_LD_VARS /* f-op1 f-r1 f-op2 f-r2 */
1620   EXTRACT_FMT_25_LD_CODE
1621
1622 do {
1623   SI temp1;SI temp0;
1624   temp0 = OPRND (h_memory_sr);
1625   temp1 = ADDSI (OPRND (sr), 4);
1626   CPU (h_gr[f_r1]) = temp0;
1627   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1628   CPU (h_gr[f_r2]) = temp1;
1629   TRACE_RESULT (current_cpu, "sr", 'x', CPU (h_gr[f_r2]));
1630 } while (0);
1631
1632 #if WITH_PROFILE_MODEL_P
1633   if (PROFILE_MODEL_P (current_cpu))
1634     {
1635       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1636       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1637       m32rx_model_profile_insn (current_cpu, abuf);
1638     }
1639 #endif
1640
1641   return new_pc;
1642 #undef OPRND
1643 }
1644
1645 /* Perform ld24: ld24 $dr,#$uimm24.  */
1646 CIA
1647 SEM_FN_NAME (m32rx,ld24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1648 {
1649   insn_t insn = SEM_INSN (sem_arg);
1650 #define OPRND(f) par_exec->operands.fmt_31_ld24.f
1651   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1652   CIA new_pc = CPU (h_pc) + 4;
1653   EXTRACT_FMT_31_LD24_VARS /* f-op1 f-r1 f-uimm24 */
1654   EXTRACT_FMT_31_LD24_CODE
1655
1656   CPU (h_gr[f_r1]) = OPRND (uimm24);
1657   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1658
1659 #if WITH_PROFILE_MODEL_P
1660   if (PROFILE_MODEL_P (current_cpu))
1661     {
1662       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1663       m32rx_model_profile_insn (current_cpu, abuf);
1664     }
1665 #endif
1666
1667   return new_pc;
1668 #undef OPRND
1669 }
1670
1671 /* Perform ldi8: ldi $dr,#$simm8.  */
1672 CIA
1673 SEM_FN_NAME (m32rx,ldi8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1674 {
1675   insn_t insn = SEM_INSN (sem_arg);
1676 #define OPRND(f) par_exec->operands.fmt_32_ldi8.f
1677   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1678   CIA new_pc = CPU (h_pc) + 2;
1679   EXTRACT_FMT_32_LDI8_VARS /* f-op1 f-r1 f-simm8 */
1680   EXTRACT_FMT_32_LDI8_CODE
1681
1682   CPU (h_gr[f_r1]) = OPRND (simm8);
1683   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1684
1685 #if WITH_PROFILE_MODEL_P
1686   if (PROFILE_MODEL_P (current_cpu))
1687     {
1688       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1689       m32rx_model_profile_insn (current_cpu, abuf);
1690     }
1691 #endif
1692
1693   return new_pc;
1694 #undef OPRND
1695 }
1696
1697 /* Perform ldi16: ldi $dr,$slo16.  */
1698 CIA
1699 SEM_FN_NAME (m32rx,ldi16) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1700 {
1701   insn_t insn = SEM_INSN (sem_arg);
1702 #define OPRND(f) par_exec->operands.fmt_33_ldi16.f
1703   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1704   CIA new_pc = CPU (h_pc) + 4;
1705   EXTRACT_FMT_33_LDI16_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1706   EXTRACT_FMT_33_LDI16_CODE
1707
1708   CPU (h_gr[f_r1]) = OPRND (slo16);
1709   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1710
1711 #if WITH_PROFILE_MODEL_P
1712   if (PROFILE_MODEL_P (current_cpu))
1713     {
1714       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1715       m32rx_model_profile_insn (current_cpu, abuf);
1716     }
1717 #endif
1718
1719   return new_pc;
1720 #undef OPRND
1721 }
1722
1723 /* Perform lock: lock $dr,@$sr.  */
1724 CIA
1725 SEM_FN_NAME (m32rx,lock) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1726 {
1727   insn_t insn = SEM_INSN (sem_arg);
1728 #define OPRND(f) par_exec->operands.fmt_0_add.f
1729   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1730   CIA new_pc = CPU (h_pc) + 2;
1731   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
1732   EXTRACT_FMT_0_ADD_CODE
1733
1734 do_lock (current_cpu, OPRND (dr), OPRND (sr));
1735
1736 #if WITH_PROFILE_MODEL_P
1737   if (PROFILE_MODEL_P (current_cpu))
1738     {
1739       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1740       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1741       m32rx_model_profile_insn (current_cpu, abuf);
1742     }
1743 #endif
1744
1745   return new_pc;
1746 #undef OPRND
1747 }
1748
1749 /* Perform machi-a: machi $src1,$src2,$acc.  */
1750 CIA
1751 SEM_FN_NAME (m32rx,machi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1752 {
1753   insn_t insn = SEM_INSN (sem_arg);
1754 #define OPRND(f) par_exec->operands.fmt_34_machi_a.f
1755   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1756   CIA new_pc = CPU (h_pc) + 2;
1757   EXTRACT_FMT_34_MACHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
1758   EXTRACT_FMT_34_MACHI_A_CODE
1759
1760 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));
1761   TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
1762
1763 #if WITH_PROFILE_MODEL_P
1764   if (PROFILE_MODEL_P (current_cpu))
1765     {
1766       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1767       m32rx_model_profile_insn (current_cpu, abuf);
1768     }
1769 #endif
1770
1771   return new_pc;
1772 #undef OPRND
1773 }
1774
1775 /* Perform maclo-a: maclo $src1,$src2,$acc.  */
1776 CIA
1777 SEM_FN_NAME (m32rx,maclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1778 {
1779   insn_t insn = SEM_INSN (sem_arg);
1780 #define OPRND(f) par_exec->operands.fmt_34_machi_a.f
1781   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1782   CIA new_pc = CPU (h_pc) + 2;
1783   EXTRACT_FMT_34_MACHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
1784   EXTRACT_FMT_34_MACHI_A_CODE
1785
1786 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));
1787   TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
1788
1789 #if WITH_PROFILE_MODEL_P
1790   if (PROFILE_MODEL_P (current_cpu))
1791     {
1792       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1793       m32rx_model_profile_insn (current_cpu, abuf);
1794     }
1795 #endif
1796
1797   return new_pc;
1798 #undef OPRND
1799 }
1800
1801 /* Perform mul: mul $dr,$sr.  */
1802 CIA
1803 SEM_FN_NAME (m32rx,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1804 {
1805   insn_t insn = SEM_INSN (sem_arg);
1806 #define OPRND(f) par_exec->operands.fmt_0_add.f
1807   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1808   CIA new_pc = CPU (h_pc) + 2;
1809   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
1810   EXTRACT_FMT_0_ADD_CODE
1811
1812   CPU (h_gr[f_r1]) = MULSI (OPRND (dr), OPRND (sr));
1813   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1814
1815 #if WITH_PROFILE_MODEL_P
1816   if (PROFILE_MODEL_P (current_cpu))
1817     {
1818       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1819       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1820       m32rx_model_profile_insn (current_cpu, abuf);
1821     }
1822 #endif
1823
1824   return new_pc;
1825 #undef OPRND
1826 }
1827
1828 /* Perform mulhi-a: mulhi $src1,$src2,$acc.  */
1829 CIA
1830 SEM_FN_NAME (m32rx,mulhi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1831 {
1832   insn_t insn = SEM_INSN (sem_arg);
1833 #define OPRND(f) par_exec->operands.fmt_35_mulhi_a.f
1834   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1835   CIA new_pc = CPU (h_pc) + 2;
1836   EXTRACT_FMT_35_MULHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
1837   EXTRACT_FMT_35_MULHI_A_CODE
1838
1839 m32rx_h_accums_set (current_cpu, f_acc, SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (OPRND (src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (OPRND (src2), 16)))), 16), 16));
1840   TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
1841
1842 #if WITH_PROFILE_MODEL_P
1843   if (PROFILE_MODEL_P (current_cpu))
1844     {
1845       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1846       m32rx_model_profile_insn (current_cpu, abuf);
1847     }
1848 #endif
1849
1850   return new_pc;
1851 #undef OPRND
1852 }
1853
1854 /* Perform mullo-a: mullo $src1,$src2,$acc.  */
1855 CIA
1856 SEM_FN_NAME (m32rx,mullo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1857 {
1858   insn_t insn = SEM_INSN (sem_arg);
1859 #define OPRND(f) par_exec->operands.fmt_35_mulhi_a.f
1860   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1861   CIA new_pc = CPU (h_pc) + 2;
1862   EXTRACT_FMT_35_MULHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
1863   EXTRACT_FMT_35_MULHI_A_CODE
1864
1865 m32rx_h_accums_set (current_cpu, f_acc, SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (OPRND (src1), 16)), EXTHIDI (TRUNCSIHI (OPRND (src2)))), 16), 16));
1866   TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
1867
1868 #if WITH_PROFILE_MODEL_P
1869   if (PROFILE_MODEL_P (current_cpu))
1870     {
1871       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1872       m32rx_model_profile_insn (current_cpu, abuf);
1873     }
1874 #endif
1875
1876   return new_pc;
1877 #undef OPRND
1878 }
1879
1880 /* Perform mv: mv $dr,$sr.  */
1881 CIA
1882 SEM_FN_NAME (m32rx,mv) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1883 {
1884   insn_t insn = SEM_INSN (sem_arg);
1885 #define OPRND(f) par_exec->operands.fmt_36_mv.f
1886   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1887   CIA new_pc = CPU (h_pc) + 2;
1888   EXTRACT_FMT_36_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
1889   EXTRACT_FMT_36_MV_CODE
1890
1891   CPU (h_gr[f_r1]) = OPRND (sr);
1892   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1893
1894 #if WITH_PROFILE_MODEL_P
1895   if (PROFILE_MODEL_P (current_cpu))
1896     {
1897       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1898       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1899       m32rx_model_profile_insn (current_cpu, abuf);
1900     }
1901 #endif
1902
1903   return new_pc;
1904 #undef OPRND
1905 }
1906
1907 /* Perform mvfachi-a: mvfachi $dr,$accs.  */
1908 CIA
1909 SEM_FN_NAME (m32rx,mvfachi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1910 {
1911   insn_t insn = SEM_INSN (sem_arg);
1912 #define OPRND(f) par_exec->operands.fmt_37_mvfachi_a.f
1913   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1914   CIA new_pc = CPU (h_pc) + 2;
1915   EXTRACT_FMT_37_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
1916   EXTRACT_FMT_37_MVFACHI_A_CODE
1917
1918   CPU (h_gr[f_r1]) = TRUNCDISI (SRADI (OPRND (accs), 32));
1919   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1920
1921 #if WITH_PROFILE_MODEL_P
1922   if (PROFILE_MODEL_P (current_cpu))
1923     {
1924       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1925       m32rx_model_profile_insn (current_cpu, abuf);
1926     }
1927 #endif
1928
1929   return new_pc;
1930 #undef OPRND
1931 }
1932
1933 /* Perform mvfaclo-a: mvfaclo $dr,$accs.  */
1934 CIA
1935 SEM_FN_NAME (m32rx,mvfaclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1936 {
1937   insn_t insn = SEM_INSN (sem_arg);
1938 #define OPRND(f) par_exec->operands.fmt_37_mvfachi_a.f
1939   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1940   CIA new_pc = CPU (h_pc) + 2;
1941   EXTRACT_FMT_37_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
1942   EXTRACT_FMT_37_MVFACHI_A_CODE
1943
1944   CPU (h_gr[f_r1]) = TRUNCDISI (OPRND (accs));
1945   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1946
1947 #if WITH_PROFILE_MODEL_P
1948   if (PROFILE_MODEL_P (current_cpu))
1949     {
1950       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1951       m32rx_model_profile_insn (current_cpu, abuf);
1952     }
1953 #endif
1954
1955   return new_pc;
1956 #undef OPRND
1957 }
1958
1959 /* Perform mvfacmi-a: mvfacmi $dr,$accs.  */
1960 CIA
1961 SEM_FN_NAME (m32rx,mvfacmi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1962 {
1963   insn_t insn = SEM_INSN (sem_arg);
1964 #define OPRND(f) par_exec->operands.fmt_37_mvfachi_a.f
1965   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1966   CIA new_pc = CPU (h_pc) + 2;
1967   EXTRACT_FMT_37_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
1968   EXTRACT_FMT_37_MVFACHI_A_CODE
1969
1970   CPU (h_gr[f_r1]) = TRUNCDISI (SRADI (OPRND (accs), 16));
1971   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1972
1973 #if WITH_PROFILE_MODEL_P
1974   if (PROFILE_MODEL_P (current_cpu))
1975     {
1976       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1977       m32rx_model_profile_insn (current_cpu, abuf);
1978     }
1979 #endif
1980
1981   return new_pc;
1982 #undef OPRND
1983 }
1984
1985 /* Perform mvfc: mvfc $dr,$scr.  */
1986 CIA
1987 SEM_FN_NAME (m32rx,mvfc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1988 {
1989   insn_t insn = SEM_INSN (sem_arg);
1990 #define OPRND(f) par_exec->operands.fmt_38_mvfc.f
1991   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1992   CIA new_pc = CPU (h_pc) + 2;
1993   EXTRACT_FMT_38_MVFC_VARS /* f-op1 f-r1 f-op2 f-r2 */
1994   EXTRACT_FMT_38_MVFC_CODE
1995
1996   CPU (h_gr[f_r1]) = OPRND (scr);
1997   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1998
1999 #if WITH_PROFILE_MODEL_P
2000   if (PROFILE_MODEL_P (current_cpu))
2001     {
2002       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2003       m32rx_model_profile_insn (current_cpu, abuf);
2004     }
2005 #endif
2006
2007   return new_pc;
2008 #undef OPRND
2009 }
2010
2011 /* Perform mvtachi-a: mvtachi $src1,$accs.  */
2012 CIA
2013 SEM_FN_NAME (m32rx,mvtachi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2014 {
2015   insn_t insn = SEM_INSN (sem_arg);
2016 #define OPRND(f) par_exec->operands.fmt_39_mvtachi_a.f
2017   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2018   CIA new_pc = CPU (h_pc) + 2;
2019   EXTRACT_FMT_39_MVTACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2020   EXTRACT_FMT_39_MVTACHI_A_CODE
2021
2022 m32rx_h_accums_set (current_cpu, f_accs, ORDI (ANDDI (OPRND (accs), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (OPRND (src1)), 32)));
2023   TRACE_RESULT (current_cpu, "accs", 'D', m32rx_h_accums_get (current_cpu, f_accs));
2024
2025 #if WITH_PROFILE_MODEL_P
2026   if (PROFILE_MODEL_P (current_cpu))
2027     {
2028       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2029       m32rx_model_profile_insn (current_cpu, abuf);
2030     }
2031 #endif
2032
2033   return new_pc;
2034 #undef OPRND
2035 }
2036
2037 /* Perform mvtaclo-a: mvtaclo $src1,$accs.  */
2038 CIA
2039 SEM_FN_NAME (m32rx,mvtaclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2040 {
2041   insn_t insn = SEM_INSN (sem_arg);
2042 #define OPRND(f) par_exec->operands.fmt_39_mvtachi_a.f
2043   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2044   CIA new_pc = CPU (h_pc) + 2;
2045   EXTRACT_FMT_39_MVTACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2046   EXTRACT_FMT_39_MVTACHI_A_CODE
2047
2048 m32rx_h_accums_set (current_cpu, f_accs, ORDI (ANDDI (OPRND (accs), MAKEDI (0xffffffff, 0)), EXTSIDI (OPRND (src1))));
2049   TRACE_RESULT (current_cpu, "accs", 'D', m32rx_h_accums_get (current_cpu, f_accs));
2050
2051 #if WITH_PROFILE_MODEL_P
2052   if (PROFILE_MODEL_P (current_cpu))
2053     {
2054       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2055       m32rx_model_profile_insn (current_cpu, abuf);
2056     }
2057 #endif
2058
2059   return new_pc;
2060 #undef OPRND
2061 }
2062
2063 /* Perform mvtc: mvtc $sr,$dcr.  */
2064 CIA
2065 SEM_FN_NAME (m32rx,mvtc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2066 {
2067   insn_t insn = SEM_INSN (sem_arg);
2068 #define OPRND(f) par_exec->operands.fmt_40_mvtc.f
2069   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2070   CIA new_pc = CPU (h_pc) + 2;
2071   EXTRACT_FMT_40_MVTC_VARS /* f-op1 f-r1 f-op2 f-r2 */
2072   EXTRACT_FMT_40_MVTC_CODE
2073
2074 m32rx_h_cr_set (current_cpu, f_r1, OPRND (sr));
2075   TRACE_RESULT (current_cpu, "dcr", 'x', m32rx_h_cr_get (current_cpu, f_r1));
2076
2077 #if WITH_PROFILE_MODEL_P
2078   if (PROFILE_MODEL_P (current_cpu))
2079     {
2080       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2081       m32rx_model_profile_insn (current_cpu, abuf);
2082     }
2083 #endif
2084
2085   return new_pc;
2086 #undef OPRND
2087 }
2088
2089 /* Perform neg: neg $dr,$sr.  */
2090 CIA
2091 SEM_FN_NAME (m32rx,neg) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2092 {
2093   insn_t insn = SEM_INSN (sem_arg);
2094 #define OPRND(f) par_exec->operands.fmt_36_mv.f
2095   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2096   CIA new_pc = CPU (h_pc) + 2;
2097   EXTRACT_FMT_36_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
2098   EXTRACT_FMT_36_MV_CODE
2099
2100   CPU (h_gr[f_r1]) = NEGSI (OPRND (sr));
2101   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2102
2103 #if WITH_PROFILE_MODEL_P
2104   if (PROFILE_MODEL_P (current_cpu))
2105     {
2106       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2107       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2108       m32rx_model_profile_insn (current_cpu, abuf);
2109     }
2110 #endif
2111
2112   return new_pc;
2113 #undef OPRND
2114 }
2115
2116 /* Perform nop: nop.  */
2117 CIA
2118 SEM_FN_NAME (m32rx,nop) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2119 {
2120   insn_t insn = SEM_INSN (sem_arg);
2121 #define OPRND(f) par_exec->operands.fmt_41_nop.f
2122   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2123   CIA new_pc = CPU (h_pc) + 2;
2124   EXTRACT_FMT_41_NOP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2125   EXTRACT_FMT_41_NOP_CODE
2126
2127 PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
2128
2129 #if WITH_PROFILE_MODEL_P
2130   if (PROFILE_MODEL_P (current_cpu))
2131     {
2132       m32rx_model_profile_insn (current_cpu, abuf);
2133     }
2134 #endif
2135
2136   return new_pc;
2137 #undef OPRND
2138 }
2139
2140 /* Perform not: not $dr,$sr.  */
2141 CIA
2142 SEM_FN_NAME (m32rx,not) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2143 {
2144   insn_t insn = SEM_INSN (sem_arg);
2145 #define OPRND(f) par_exec->operands.fmt_36_mv.f
2146   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2147   CIA new_pc = CPU (h_pc) + 2;
2148   EXTRACT_FMT_36_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
2149   EXTRACT_FMT_36_MV_CODE
2150
2151   CPU (h_gr[f_r1]) = INVSI (OPRND (sr));
2152   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2153
2154 #if WITH_PROFILE_MODEL_P
2155   if (PROFILE_MODEL_P (current_cpu))
2156     {
2157       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2158       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2159       m32rx_model_profile_insn (current_cpu, abuf);
2160     }
2161 #endif
2162
2163   return new_pc;
2164 #undef OPRND
2165 }
2166
2167 /* Perform rac-a: rac $accs.  */
2168 CIA
2169 SEM_FN_NAME (m32rx,rac_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2170 {
2171   insn_t insn = SEM_INSN (sem_arg);
2172 #define OPRND(f) par_exec->operands.fmt_42_rac_a.f
2173   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2174   CIA new_pc = CPU (h_pc) + 2;
2175   EXTRACT_FMT_42_RAC_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2176   EXTRACT_FMT_42_RAC_A_CODE
2177
2178 do {
2179   DI tmp_tmp1;
2180   tmp_tmp1 = ANDDI (OPRND (accs), MAKEDI (16777215, 0xffffffff));
2181 if (ANDIFSI (GEDI (tmp_tmp1, MAKEDI (16383, 0xffff8000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
2182   tmp_tmp1 = MAKEDI (16383, 0xffff8000);
2183 } else {
2184 if (ANDIFSI (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
2185   tmp_tmp1 = MAKEDI (16760832, 0);
2186 } else {
2187   tmp_tmp1 = ANDDI (ADDDI (OPRND (accs), MAKEDI (0, 16384)), MAKEDI (16777215, 0xffff8000));
2188 }
2189 }
2190   tmp_tmp1 = SLLDI (tmp_tmp1, 1);
2191 m32rx_h_accums_set (current_cpu, f_accs, SRADI (SLLDI (tmp_tmp1, 7), 7));
2192   TRACE_RESULT (current_cpu, "accs", 'D', m32rx_h_accums_get (current_cpu, f_accs));
2193 } while (0);
2194
2195 #if WITH_PROFILE_MODEL_P
2196   if (PROFILE_MODEL_P (current_cpu))
2197     {
2198       m32rx_model_profile_insn (current_cpu, abuf);
2199     }
2200 #endif
2201
2202   return new_pc;
2203 #undef OPRND
2204 }
2205
2206 /* Perform rach-a: rach $accs.  */
2207 CIA
2208 SEM_FN_NAME (m32rx,rach_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2209 {
2210   insn_t insn = SEM_INSN (sem_arg);
2211 #define OPRND(f) par_exec->operands.fmt_42_rac_a.f
2212   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2213   CIA new_pc = CPU (h_pc) + 2;
2214   EXTRACT_FMT_42_RAC_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2215   EXTRACT_FMT_42_RAC_A_CODE
2216
2217 do {
2218   DI tmp_tmp1;
2219   tmp_tmp1 = ANDDI (OPRND (accs), MAKEDI (16777215, 0xffffffff));
2220 if (ANDIFSI (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) {
2221   tmp_tmp1 = MAKEDI (16383, 0x80000000);
2222 } else {
2223 if (ANDIFSI (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) {
2224   tmp_tmp1 = MAKEDI (16760832, 0);
2225 } else {
2226   tmp_tmp1 = ANDDI (ADDDI (OPRND (accs), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000));
2227 }
2228 }
2229   tmp_tmp1 = SLLDI (tmp_tmp1, 1);
2230 m32rx_h_accums_set (current_cpu, f_accs, SRADI (SLLDI (tmp_tmp1, 7), 7));
2231   TRACE_RESULT (current_cpu, "accs", 'D', m32rx_h_accums_get (current_cpu, f_accs));
2232 } while (0);
2233
2234 #if WITH_PROFILE_MODEL_P
2235   if (PROFILE_MODEL_P (current_cpu))
2236     {
2237       m32rx_model_profile_insn (current_cpu, abuf);
2238     }
2239 #endif
2240
2241   return new_pc;
2242 #undef OPRND
2243 }
2244
2245 /* Perform rte: rte.  */
2246 CIA
2247 SEM_FN_NAME (m32rx,rte) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2248 {
2249   insn_t insn = SEM_INSN (sem_arg);
2250 #define OPRND(f) par_exec->operands.fmt_43_rte.f
2251   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2252   CIA new_pc = CPU (h_pc) + 2;
2253   int taken_p = 0;
2254   EXTRACT_FMT_43_RTE_VARS /* f-op1 f-r1 f-op2 f-r2 */
2255   EXTRACT_FMT_43_RTE_CODE
2256
2257 do {
2258   CPU (h_sm) = OPRND (h_bsm_0);
2259   TRACE_RESULT (current_cpu, "h-sm-0", 'x', CPU (h_sm));
2260   CPU (h_ie) = OPRND (h_bie_0);
2261   TRACE_RESULT (current_cpu, "h-ie-0", 'x', CPU (h_ie));
2262   CPU (h_cond) = OPRND (h_bcond_0);
2263   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
2264   BRANCH_NEW_PC (current_cpu, new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, OPRND (h_bpc_0)));
2265   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
2266 } while (0);
2267
2268 #if WITH_PROFILE_MODEL_P
2269   if (PROFILE_MODEL_P (current_cpu))
2270     {
2271       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
2272     }
2273 #endif
2274
2275   return new_pc;
2276 #undef OPRND
2277 }
2278
2279 /* Perform seth: seth $dr,#$hi16.  */
2280 CIA
2281 SEM_FN_NAME (m32rx,seth) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2282 {
2283   insn_t insn = SEM_INSN (sem_arg);
2284 #define OPRND(f) par_exec->operands.fmt_44_seth.f
2285   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2286   CIA new_pc = CPU (h_pc) + 4;
2287   EXTRACT_FMT_44_SETH_VARS /* f-op1 f-r1 f-op2 f-r2 f-hi16 */
2288   EXTRACT_FMT_44_SETH_CODE
2289
2290   CPU (h_gr[f_r1]) = SLLSI (OPRND (hi16), 16);
2291   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2292
2293 #if WITH_PROFILE_MODEL_P
2294   if (PROFILE_MODEL_P (current_cpu))
2295     {
2296       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2297       m32rx_model_profile_insn (current_cpu, abuf);
2298     }
2299 #endif
2300
2301   return new_pc;
2302 #undef OPRND
2303 }
2304
2305 /* Perform sll: sll $dr,$sr.  */
2306 CIA
2307 SEM_FN_NAME (m32rx,sll) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2308 {
2309   insn_t insn = SEM_INSN (sem_arg);
2310 #define OPRND(f) par_exec->operands.fmt_0_add.f
2311   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2312   CIA new_pc = CPU (h_pc) + 2;
2313   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2314   EXTRACT_FMT_0_ADD_CODE
2315
2316   CPU (h_gr[f_r1]) = SLLSI (OPRND (dr), ANDSI (OPRND (sr), 31));
2317   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2318
2319 #if WITH_PROFILE_MODEL_P
2320   if (PROFILE_MODEL_P (current_cpu))
2321     {
2322       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2323       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2324       m32rx_model_profile_insn (current_cpu, abuf);
2325     }
2326 #endif
2327
2328   return new_pc;
2329 #undef OPRND
2330 }
2331
2332 /* Perform sll3: sll3 $dr,$sr,#$simm16.  */
2333 CIA
2334 SEM_FN_NAME (m32rx,sll3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2335 {
2336   insn_t insn = SEM_INSN (sem_arg);
2337 #define OPRND(f) par_exec->operands.fmt_5_addv3.f
2338   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2339   CIA new_pc = CPU (h_pc) + 4;
2340   EXTRACT_FMT_5_ADDV3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2341   EXTRACT_FMT_5_ADDV3_CODE
2342
2343   CPU (h_gr[f_r1]) = SLLSI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2344   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2345
2346 #if WITH_PROFILE_MODEL_P
2347   if (PROFILE_MODEL_P (current_cpu))
2348     {
2349       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2350       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2351       m32rx_model_profile_insn (current_cpu, abuf);
2352     }
2353 #endif
2354
2355   return new_pc;
2356 #undef OPRND
2357 }
2358
2359 /* Perform slli: slli $dr,#$uimm5.  */
2360 CIA
2361 SEM_FN_NAME (m32rx,slli) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2362 {
2363   insn_t insn = SEM_INSN (sem_arg);
2364 #define OPRND(f) par_exec->operands.fmt_45_slli.f
2365   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2366   CIA new_pc = CPU (h_pc) + 2;
2367   EXTRACT_FMT_45_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2368   EXTRACT_FMT_45_SLLI_CODE
2369
2370   CPU (h_gr[f_r1]) = SLLSI (OPRND (dr), OPRND (uimm5));
2371   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2372
2373 #if WITH_PROFILE_MODEL_P
2374   if (PROFILE_MODEL_P (current_cpu))
2375     {
2376       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2377       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2378       m32rx_model_profile_insn (current_cpu, abuf);
2379     }
2380 #endif
2381
2382   return new_pc;
2383 #undef OPRND
2384 }
2385
2386 /* Perform sra: sra $dr,$sr.  */
2387 CIA
2388 SEM_FN_NAME (m32rx,sra) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2389 {
2390   insn_t insn = SEM_INSN (sem_arg);
2391 #define OPRND(f) par_exec->operands.fmt_0_add.f
2392   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2393   CIA new_pc = CPU (h_pc) + 2;
2394   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2395   EXTRACT_FMT_0_ADD_CODE
2396
2397   CPU (h_gr[f_r1]) = SRASI (OPRND (dr), ANDSI (OPRND (sr), 31));
2398   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2399
2400 #if WITH_PROFILE_MODEL_P
2401   if (PROFILE_MODEL_P (current_cpu))
2402     {
2403       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2404       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2405       m32rx_model_profile_insn (current_cpu, abuf);
2406     }
2407 #endif
2408
2409   return new_pc;
2410 #undef OPRND
2411 }
2412
2413 /* Perform sra3: sra3 $dr,$sr,#$simm16.  */
2414 CIA
2415 SEM_FN_NAME (m32rx,sra3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2416 {
2417   insn_t insn = SEM_INSN (sem_arg);
2418 #define OPRND(f) par_exec->operands.fmt_5_addv3.f
2419   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2420   CIA new_pc = CPU (h_pc) + 4;
2421   EXTRACT_FMT_5_ADDV3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2422   EXTRACT_FMT_5_ADDV3_CODE
2423
2424   CPU (h_gr[f_r1]) = SRASI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2425   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2426
2427 #if WITH_PROFILE_MODEL_P
2428   if (PROFILE_MODEL_P (current_cpu))
2429     {
2430       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2431       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2432       m32rx_model_profile_insn (current_cpu, abuf);
2433     }
2434 #endif
2435
2436   return new_pc;
2437 #undef OPRND
2438 }
2439
2440 /* Perform srai: srai $dr,#$uimm5.  */
2441 CIA
2442 SEM_FN_NAME (m32rx,srai) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2443 {
2444   insn_t insn = SEM_INSN (sem_arg);
2445 #define OPRND(f) par_exec->operands.fmt_45_slli.f
2446   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2447   CIA new_pc = CPU (h_pc) + 2;
2448   EXTRACT_FMT_45_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2449   EXTRACT_FMT_45_SLLI_CODE
2450
2451   CPU (h_gr[f_r1]) = SRASI (OPRND (dr), OPRND (uimm5));
2452   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2453
2454 #if WITH_PROFILE_MODEL_P
2455   if (PROFILE_MODEL_P (current_cpu))
2456     {
2457       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2458       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2459       m32rx_model_profile_insn (current_cpu, abuf);
2460     }
2461 #endif
2462
2463   return new_pc;
2464 #undef OPRND
2465 }
2466
2467 /* Perform srl: srl $dr,$sr.  */
2468 CIA
2469 SEM_FN_NAME (m32rx,srl) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2470 {
2471   insn_t insn = SEM_INSN (sem_arg);
2472 #define OPRND(f) par_exec->operands.fmt_0_add.f
2473   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2474   CIA new_pc = CPU (h_pc) + 2;
2475   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2476   EXTRACT_FMT_0_ADD_CODE
2477
2478   CPU (h_gr[f_r1]) = SRLSI (OPRND (dr), ANDSI (OPRND (sr), 31));
2479   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2480
2481 #if WITH_PROFILE_MODEL_P
2482   if (PROFILE_MODEL_P (current_cpu))
2483     {
2484       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2485       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2486       m32rx_model_profile_insn (current_cpu, abuf);
2487     }
2488 #endif
2489
2490   return new_pc;
2491 #undef OPRND
2492 }
2493
2494 /* Perform srl3: srl3 $dr,$sr,#$simm16.  */
2495 CIA
2496 SEM_FN_NAME (m32rx,srl3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2497 {
2498   insn_t insn = SEM_INSN (sem_arg);
2499 #define OPRND(f) par_exec->operands.fmt_5_addv3.f
2500   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2501   CIA new_pc = CPU (h_pc) + 4;
2502   EXTRACT_FMT_5_ADDV3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2503   EXTRACT_FMT_5_ADDV3_CODE
2504
2505   CPU (h_gr[f_r1]) = SRLSI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2506   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2507
2508 #if WITH_PROFILE_MODEL_P
2509   if (PROFILE_MODEL_P (current_cpu))
2510     {
2511       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2512       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2513       m32rx_model_profile_insn (current_cpu, abuf);
2514     }
2515 #endif
2516
2517   return new_pc;
2518 #undef OPRND
2519 }
2520
2521 /* Perform srli: srli $dr,#$uimm5.  */
2522 CIA
2523 SEM_FN_NAME (m32rx,srli) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2524 {
2525   insn_t insn = SEM_INSN (sem_arg);
2526 #define OPRND(f) par_exec->operands.fmt_45_slli.f
2527   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2528   CIA new_pc = CPU (h_pc) + 2;
2529   EXTRACT_FMT_45_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2530   EXTRACT_FMT_45_SLLI_CODE
2531
2532   CPU (h_gr[f_r1]) = SRLSI (OPRND (dr), OPRND (uimm5));
2533   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2534
2535 #if WITH_PROFILE_MODEL_P
2536   if (PROFILE_MODEL_P (current_cpu))
2537     {
2538       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2539       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2540       m32rx_model_profile_insn (current_cpu, abuf);
2541     }
2542 #endif
2543
2544   return new_pc;
2545 #undef OPRND
2546 }
2547
2548 /* Perform st: st $src1,@$src2.  */
2549 CIA
2550 SEM_FN_NAME (m32rx,st) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2551 {
2552   insn_t insn = SEM_INSN (sem_arg);
2553 #define OPRND(f) par_exec->operands.fmt_17_cmp.f
2554   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2555   CIA new_pc = CPU (h_pc) + 2;
2556   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2557   EXTRACT_FMT_17_CMP_CODE
2558
2559 SETMEMSI (current_cpu, OPRND (src2), OPRND (src1));
2560   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMSI (current_cpu, OPRND (src2)));
2561
2562 #if WITH_PROFILE_MODEL_P
2563   if (PROFILE_MODEL_P (current_cpu))
2564     {
2565       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2566       m32rx_model_profile_insn (current_cpu, abuf);
2567     }
2568 #endif
2569
2570   return new_pc;
2571 #undef OPRND
2572 }
2573
2574 /* Perform st-d: st $src1,@($slo16,$src2).  */
2575 CIA
2576 SEM_FN_NAME (m32rx,st_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2577 {
2578   insn_t insn = SEM_INSN (sem_arg);
2579 #define OPRND(f) par_exec->operands.fmt_46_st_d.f
2580   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2581   CIA new_pc = CPU (h_pc) + 4;
2582   EXTRACT_FMT_46_ST_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2583   EXTRACT_FMT_46_ST_D_CODE
2584
2585 SETMEMSI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
2586   TRACE_RESULT (current_cpu, "h-memory-add-WI-src2-slo16", 'x', GETMEMSI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
2587
2588 #if WITH_PROFILE_MODEL_P
2589   if (PROFILE_MODEL_P (current_cpu))
2590     {
2591       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2592       m32rx_model_profile_insn (current_cpu, abuf);
2593     }
2594 #endif
2595
2596   return new_pc;
2597 #undef OPRND
2598 }
2599
2600 /* Perform stb: stb $src1,@$src2.  */
2601 CIA
2602 SEM_FN_NAME (m32rx,stb) (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_17_cmp.f
2606   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2607   CIA new_pc = CPU (h_pc) + 2;
2608   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2609   EXTRACT_FMT_17_CMP_CODE
2610
2611 SETMEMQI (current_cpu, OPRND (src2), OPRND (src1));
2612   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMQI (current_cpu, OPRND (src2)));
2613
2614 #if WITH_PROFILE_MODEL_P
2615   if (PROFILE_MODEL_P (current_cpu))
2616     {
2617       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2618       m32rx_model_profile_insn (current_cpu, abuf);
2619     }
2620 #endif
2621
2622   return new_pc;
2623 #undef OPRND
2624 }
2625
2626 /* Perform stb-d: stb $src1,@($slo16,$src2).  */
2627 CIA
2628 SEM_FN_NAME (m32rx,stb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2629 {
2630   insn_t insn = SEM_INSN (sem_arg);
2631 #define OPRND(f) par_exec->operands.fmt_46_st_d.f
2632   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2633   CIA new_pc = CPU (h_pc) + 4;
2634   EXTRACT_FMT_46_ST_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2635   EXTRACT_FMT_46_ST_D_CODE
2636
2637 SETMEMQI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
2638   TRACE_RESULT (current_cpu, "h-memory-add-WI-src2-slo16", 'x', GETMEMQI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
2639
2640 #if WITH_PROFILE_MODEL_P
2641   if (PROFILE_MODEL_P (current_cpu))
2642     {
2643       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2644       m32rx_model_profile_insn (current_cpu, abuf);
2645     }
2646 #endif
2647
2648   return new_pc;
2649 #undef OPRND
2650 }
2651
2652 /* Perform sth: sth $src1,@$src2.  */
2653 CIA
2654 SEM_FN_NAME (m32rx,sth) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2655 {
2656   insn_t insn = SEM_INSN (sem_arg);
2657 #define OPRND(f) par_exec->operands.fmt_17_cmp.f
2658   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2659   CIA new_pc = CPU (h_pc) + 2;
2660   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2661   EXTRACT_FMT_17_CMP_CODE
2662
2663 SETMEMHI (current_cpu, OPRND (src2), OPRND (src1));
2664   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMHI (current_cpu, OPRND (src2)));
2665
2666 #if WITH_PROFILE_MODEL_P
2667   if (PROFILE_MODEL_P (current_cpu))
2668     {
2669       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2670       m32rx_model_profile_insn (current_cpu, abuf);
2671     }
2672 #endif
2673
2674   return new_pc;
2675 #undef OPRND
2676 }
2677
2678 /* Perform sth-d: sth $src1,@($slo16,$src2).  */
2679 CIA
2680 SEM_FN_NAME (m32rx,sth_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2681 {
2682   insn_t insn = SEM_INSN (sem_arg);
2683 #define OPRND(f) par_exec->operands.fmt_46_st_d.f
2684   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2685   CIA new_pc = CPU (h_pc) + 4;
2686   EXTRACT_FMT_46_ST_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2687   EXTRACT_FMT_46_ST_D_CODE
2688
2689 SETMEMHI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
2690   TRACE_RESULT (current_cpu, "h-memory-add-WI-src2-slo16", 'x', GETMEMHI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
2691
2692 #if WITH_PROFILE_MODEL_P
2693   if (PROFILE_MODEL_P (current_cpu))
2694     {
2695       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2696       m32rx_model_profile_insn (current_cpu, abuf);
2697     }
2698 #endif
2699
2700   return new_pc;
2701 #undef OPRND
2702 }
2703
2704 /* Perform st-plus: st $src1,@+$src2.  */
2705 CIA
2706 SEM_FN_NAME (m32rx,st_plus) (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_17_cmp.f
2710   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2711   CIA new_pc = CPU (h_pc) + 2;
2712   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2713   EXTRACT_FMT_17_CMP_CODE
2714
2715 do {
2716   CPU (h_gr[f_r2]) = ADDSI (OPRND (src2), 4);
2717   TRACE_RESULT (current_cpu, "src2", 'x', CPU (h_gr[f_r2]));
2718 SETMEMSI (current_cpu, OPRND (src2), OPRND (src1));
2719   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMSI (current_cpu, OPRND (src2)));
2720 } while (0);
2721
2722 #if WITH_PROFILE_MODEL_P
2723   if (PROFILE_MODEL_P (current_cpu))
2724     {
2725       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2726       m32rx_model_profile_insn (current_cpu, abuf);
2727     }
2728 #endif
2729
2730   return new_pc;
2731 #undef OPRND
2732 }
2733
2734 /* Perform st-minus: st $src1,@-$src2.  */
2735 CIA
2736 SEM_FN_NAME (m32rx,st_minus) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2737 {
2738   insn_t insn = SEM_INSN (sem_arg);
2739 #define OPRND(f) par_exec->operands.fmt_17_cmp.f
2740   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2741   CIA new_pc = CPU (h_pc) + 2;
2742   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2743   EXTRACT_FMT_17_CMP_CODE
2744
2745 do {
2746   CPU (h_gr[f_r2]) = SUBSI (OPRND (src2), 4);
2747   TRACE_RESULT (current_cpu, "src2", 'x', CPU (h_gr[f_r2]));
2748 SETMEMSI (current_cpu, OPRND (src2), OPRND (src1));
2749   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMSI (current_cpu, OPRND (src2)));
2750 } while (0);
2751
2752 #if WITH_PROFILE_MODEL_P
2753   if (PROFILE_MODEL_P (current_cpu))
2754     {
2755       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2756       m32rx_model_profile_insn (current_cpu, abuf);
2757     }
2758 #endif
2759
2760   return new_pc;
2761 #undef OPRND
2762 }
2763
2764 /* Perform sub: sub $dr,$sr.  */
2765 CIA
2766 SEM_FN_NAME (m32rx,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2767 {
2768   insn_t insn = SEM_INSN (sem_arg);
2769 #define OPRND(f) par_exec->operands.fmt_0_add.f
2770   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2771   CIA new_pc = CPU (h_pc) + 2;
2772   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2773   EXTRACT_FMT_0_ADD_CODE
2774
2775   CPU (h_gr[f_r1]) = SUBSI (OPRND (dr), OPRND (sr));
2776   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2777
2778 #if WITH_PROFILE_MODEL_P
2779   if (PROFILE_MODEL_P (current_cpu))
2780     {
2781       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2782       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2783       m32rx_model_profile_insn (current_cpu, abuf);
2784     }
2785 #endif
2786
2787   return new_pc;
2788 #undef OPRND
2789 }
2790
2791 /* Perform subv: subv $dr,$sr.  */
2792 CIA
2793 SEM_FN_NAME (m32rx,subv) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2794 {
2795   insn_t insn = SEM_INSN (sem_arg);
2796 #define OPRND(f) par_exec->operands.fmt_0_add.f
2797   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2798   CIA new_pc = CPU (h_pc) + 2;
2799   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2800   EXTRACT_FMT_0_ADD_CODE
2801
2802 do {
2803   BI temp1;SI temp0;
2804   temp0 = SUBSI (OPRND (dr), OPRND (sr));
2805   temp1 = SUBOFSI (OPRND (dr), OPRND (sr), 0);
2806   CPU (h_gr[f_r1]) = temp0;
2807   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2808   CPU (h_cond) = temp1;
2809   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
2810 } while (0);
2811
2812 #if WITH_PROFILE_MODEL_P
2813   if (PROFILE_MODEL_P (current_cpu))
2814     {
2815       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2816       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2817       m32rx_model_profile_insn (current_cpu, abuf);
2818     }
2819 #endif
2820
2821   return new_pc;
2822 #undef OPRND
2823 }
2824
2825 /* Perform subx: subx $dr,$sr.  */
2826 CIA
2827 SEM_FN_NAME (m32rx,subx) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2828 {
2829   insn_t insn = SEM_INSN (sem_arg);
2830 #define OPRND(f) par_exec->operands.fmt_6_addx.f
2831   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2832   CIA new_pc = CPU (h_pc) + 2;
2833   EXTRACT_FMT_6_ADDX_VARS /* f-op1 f-r1 f-op2 f-r2 */
2834   EXTRACT_FMT_6_ADDX_CODE
2835
2836 do {
2837   BI temp1;SI temp0;
2838   temp0 = SUBCSI (OPRND (dr), OPRND (sr), OPRND (condbit));
2839   temp1 = SUBCFSI (OPRND (dr), OPRND (sr), OPRND (condbit));
2840   CPU (h_gr[f_r1]) = temp0;
2841   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2842   CPU (h_cond) = temp1;
2843   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
2844 } while (0);
2845
2846 #if WITH_PROFILE_MODEL_P
2847   if (PROFILE_MODEL_P (current_cpu))
2848     {
2849       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2850       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2851       m32rx_model_profile_insn (current_cpu, abuf);
2852     }
2853 #endif
2854
2855   return new_pc;
2856 #undef OPRND
2857 }
2858
2859 /* Perform trap: trap #$uimm4.  */
2860 CIA
2861 SEM_FN_NAME (m32rx,trap) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2862 {
2863   insn_t insn = SEM_INSN (sem_arg);
2864 #define OPRND(f) par_exec->operands.fmt_47_trap.f
2865   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2866   CIA new_pc = CPU (h_pc) + 2;
2867   int taken_p = 0;
2868   EXTRACT_FMT_47_TRAP_VARS /* f-op1 f-r1 f-op2 f-uimm4 */
2869   EXTRACT_FMT_47_TRAP_CODE
2870
2871 do_trap (current_cpu, OPRND (uimm4));
2872
2873 #if WITH_PROFILE_MODEL_P
2874   if (PROFILE_MODEL_P (current_cpu))
2875     {
2876       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
2877     }
2878 #endif
2879
2880   return new_pc;
2881 #undef OPRND
2882 }
2883
2884 /* Perform unlock: unlock $src1,@$src2.  */
2885 CIA
2886 SEM_FN_NAME (m32rx,unlock) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2887 {
2888   insn_t insn = SEM_INSN (sem_arg);
2889 #define OPRND(f) par_exec->operands.fmt_17_cmp.f
2890   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2891   CIA new_pc = CPU (h_pc) + 2;
2892   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2893   EXTRACT_FMT_17_CMP_CODE
2894
2895 do_unlock (current_cpu, OPRND (src1), OPRND (src2));
2896
2897 #if WITH_PROFILE_MODEL_P
2898   if (PROFILE_MODEL_P (current_cpu))
2899     {
2900       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2901       m32rx_model_profile_insn (current_cpu, abuf);
2902     }
2903 #endif
2904
2905   return new_pc;
2906 #undef OPRND
2907 }
2908
2909 /* Perform satb: satb $dr,$src2.  */
2910 CIA
2911 SEM_FN_NAME (m32rx,satb) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2912 {
2913   insn_t insn = SEM_INSN (sem_arg);
2914 #define OPRND(f) par_exec->operands.fmt_48_satb.f
2915   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2916   CIA new_pc = CPU (h_pc) + 4;
2917   EXTRACT_FMT_48_SATB_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
2918   EXTRACT_FMT_48_SATB_CODE
2919
2920   CPU (h_gr[f_r1]) = (GESI (OPRND (src2), 127)) ? (127) : (LESI (OPRND (src2), -128)) ? (-128) : (OPRND (src2));
2921   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2922
2923 #if WITH_PROFILE_MODEL_P
2924   if (PROFILE_MODEL_P (current_cpu))
2925     {
2926       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2927       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2928       m32rx_model_profile_insn (current_cpu, abuf);
2929     }
2930 #endif
2931
2932   return new_pc;
2933 #undef OPRND
2934 }
2935
2936 /* Perform sath: sath $dr,$src2.  */
2937 CIA
2938 SEM_FN_NAME (m32rx,sath) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2939 {
2940   insn_t insn = SEM_INSN (sem_arg);
2941 #define OPRND(f) par_exec->operands.fmt_48_satb.f
2942   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2943   CIA new_pc = CPU (h_pc) + 4;
2944   EXTRACT_FMT_48_SATB_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
2945   EXTRACT_FMT_48_SATB_CODE
2946
2947   CPU (h_gr[f_r1]) = (GESI (OPRND (src2), 32767)) ? (32767) : (LESI (OPRND (src2), -32768)) ? (-32768) : (OPRND (src2));
2948   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2949
2950 #if WITH_PROFILE_MODEL_P
2951   if (PROFILE_MODEL_P (current_cpu))
2952     {
2953       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2954       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2955       m32rx_model_profile_insn (current_cpu, abuf);
2956     }
2957 #endif
2958
2959   return new_pc;
2960 #undef OPRND
2961 }
2962
2963 /* Perform sat: sat $dr,$src2.  */
2964 CIA
2965 SEM_FN_NAME (m32rx,sat) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2966 {
2967   insn_t insn = SEM_INSN (sem_arg);
2968 #define OPRND(f) par_exec->operands.fmt_49_sat.f
2969   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2970   CIA new_pc = CPU (h_pc) + 4;
2971   EXTRACT_FMT_49_SAT_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
2972   EXTRACT_FMT_49_SAT_CODE
2973
2974   CPU (h_gr[f_r1]) = (OPRND (condbit)) ? ((LTSI (OPRND (src2), 0)) ? (2147483647) : (0x80000000)) : (OPRND (src2));
2975   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2976
2977 #if WITH_PROFILE_MODEL_P
2978   if (PROFILE_MODEL_P (current_cpu))
2979     {
2980       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2981       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2982       m32rx_model_profile_insn (current_cpu, abuf);
2983     }
2984 #endif
2985
2986   return new_pc;
2987 #undef OPRND
2988 }
2989
2990 /* Perform pcmpbz: pcmpbz $src2.  */
2991 CIA
2992 SEM_FN_NAME (m32rx,pcmpbz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2993 {
2994   insn_t insn = SEM_INSN (sem_arg);
2995 #define OPRND(f) par_exec->operands.fmt_20_cmpz.f
2996   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2997   CIA new_pc = CPU (h_pc) + 2;
2998   EXTRACT_FMT_20_CMPZ_VARS /* f-op1 f-r1 f-op2 f-r2 */
2999   EXTRACT_FMT_20_CMPZ_CODE
3000
3001   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);
3002   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
3003
3004 #if WITH_PROFILE_MODEL_P
3005   if (PROFILE_MODEL_P (current_cpu))
3006     {
3007       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3008       m32rx_model_profile_insn (current_cpu, abuf);
3009     }
3010 #endif
3011
3012   return new_pc;
3013 #undef OPRND
3014 }
3015
3016 /* Perform sadd: sadd.  */
3017 CIA
3018 SEM_FN_NAME (m32rx,sadd) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3019 {
3020   insn_t insn = SEM_INSN (sem_arg);
3021 #define OPRND(f) par_exec->operands.fmt_50_sadd.f
3022   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3023   CIA new_pc = CPU (h_pc) + 2;
3024   EXTRACT_FMT_50_SADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
3025   EXTRACT_FMT_50_SADD_CODE
3026
3027 m32rx_h_accums_set (current_cpu, 0, ADDDI (SRADI (OPRND (h_accums_1), 16), OPRND (h_accums_0)));
3028   TRACE_RESULT (current_cpu, "h-accums-0", 'D', m32rx_h_accums_get (current_cpu, 0));
3029
3030 #if WITH_PROFILE_MODEL_P
3031   if (PROFILE_MODEL_P (current_cpu))
3032     {
3033       m32rx_model_profile_insn (current_cpu, abuf);
3034     }
3035 #endif
3036
3037   return new_pc;
3038 #undef OPRND
3039 }
3040
3041 /* Perform macwu1: macwu1 $src1,$src2.  */
3042 CIA
3043 SEM_FN_NAME (m32rx,macwu1) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3044 {
3045   insn_t insn = SEM_INSN (sem_arg);
3046 #define OPRND(f) par_exec->operands.fmt_51_macwu1.f
3047   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3048   CIA new_pc = CPU (h_pc) + 2;
3049   EXTRACT_FMT_51_MACWU1_VARS /* f-op1 f-r1 f-op2 f-r2 */
3050   EXTRACT_FMT_51_MACWU1_CODE
3051
3052 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));
3053   TRACE_RESULT (current_cpu, "h-accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3054
3055 #if WITH_PROFILE_MODEL_P
3056   if (PROFILE_MODEL_P (current_cpu))
3057     {
3058       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3059       m32rx_model_profile_insn (current_cpu, abuf);
3060     }
3061 #endif
3062
3063   return new_pc;
3064 #undef OPRND
3065 }
3066
3067 /* Perform msblo: msblo $src1,$src2.  */
3068 CIA
3069 SEM_FN_NAME (m32rx,msblo) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3070 {
3071   insn_t insn = SEM_INSN (sem_arg);
3072 #define OPRND(f) par_exec->operands.fmt_52_msblo.f
3073   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3074   CIA new_pc = CPU (h_pc) + 2;
3075   EXTRACT_FMT_52_MSBLO_VARS /* f-op1 f-r1 f-op2 f-r2 */
3076   EXTRACT_FMT_52_MSBLO_CODE
3077
3078   CPU (h_accum) = SRADI (SLLDI (SUBDI (OPRND (accum), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (OPRND (src1))), EXTHIDI (TRUNCSIHI (OPRND (src2)))), 32), 16)), 8), 8);
3079   TRACE_RESULT (current_cpu, "accum", 'D', CPU (h_accum));
3080
3081 #if WITH_PROFILE_MODEL_P
3082   if (PROFILE_MODEL_P (current_cpu))
3083     {
3084       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3085       m32rx_model_profile_insn (current_cpu, abuf);
3086     }
3087 #endif
3088
3089   return new_pc;
3090 #undef OPRND
3091 }
3092
3093 /* Perform mulwu1: mulwu1 $src1,$src2.  */
3094 CIA
3095 SEM_FN_NAME (m32rx,mulwu1) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3096 {
3097   insn_t insn = SEM_INSN (sem_arg);
3098 #define OPRND(f) par_exec->operands.fmt_17_cmp.f
3099   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3100   CIA new_pc = CPU (h_pc) + 2;
3101   EXTRACT_FMT_17_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
3102   EXTRACT_FMT_17_CMP_CODE
3103
3104 m32rx_h_accums_set (current_cpu, 1, SRADI (SLLDI (MULDI (EXTSIDI (OPRND (src1)), EXTSIDI (ANDSI (OPRND (src2), 65535))), 16), 16));
3105   TRACE_RESULT (current_cpu, "h-accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3106
3107 #if WITH_PROFILE_MODEL_P
3108   if (PROFILE_MODEL_P (current_cpu))
3109     {
3110       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3111       m32rx_model_profile_insn (current_cpu, abuf);
3112     }
3113 #endif
3114
3115   return new_pc;
3116 #undef OPRND
3117 }
3118
3119 /* Perform machl1: machl1 $src1,$src2.  */
3120 CIA
3121 SEM_FN_NAME (m32rx,machl1) (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_51_macwu1.f
3125   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3126   CIA new_pc = CPU (h_pc) + 2;
3127   EXTRACT_FMT_51_MACWU1_VARS /* f-op1 f-r1 f-op2 f-r2 */
3128   EXTRACT_FMT_51_MACWU1_CODE
3129
3130 m32rx_h_accums_set (current_cpu, 1, SRADI (SLLDI (ADDDI (OPRND (h_accums_1), SRADI (SLLDI (MULDI (EXTSIDI (SRASI (OPRND (src1), 16)), EXTHIDI (TRUNCSIHI (OPRND (src2)))), 32), 16)), 8), 8));
3131   TRACE_RESULT (current_cpu, "h-accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3132
3133 #if WITH_PROFILE_MODEL_P
3134   if (PROFILE_MODEL_P (current_cpu))
3135     {
3136       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3137       m32rx_model_profile_insn (current_cpu, abuf);
3138     }
3139 #endif
3140
3141   return new_pc;
3142 #undef OPRND
3143 }
3144
3145 /* Perform sc: sc.  */
3146 CIA
3147 SEM_FN_NAME (m32rx,sc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3148 {
3149   insn_t insn = SEM_INSN (sem_arg);
3150 #define OPRND(f) par_exec->operands.fmt_53_sc.f
3151   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3152   CIA new_pc = CPU (h_pc) + 2;
3153   EXTRACT_FMT_53_SC_VARS /* f-op1 f-r1 f-op2 f-r2 */
3154   EXTRACT_FMT_53_SC_CODE
3155
3156 if (OPRND (condbit)) {
3157   CPU (h_abort) = 1;
3158   TRACE_RESULT (current_cpu, "abort-parallel-execution", 'x', CPU (h_abort));
3159 }
3160
3161 #if WITH_PROFILE_MODEL_P
3162   if (PROFILE_MODEL_P (current_cpu))
3163     {
3164       m32rx_model_profile_insn (current_cpu, abuf);
3165     }
3166 #endif
3167
3168   return new_pc;
3169 #undef OPRND
3170 }
3171
3172 /* Perform snc: snc.  */
3173 CIA
3174 SEM_FN_NAME (m32rx,snc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3175 {
3176   insn_t insn = SEM_INSN (sem_arg);
3177 #define OPRND(f) par_exec->operands.fmt_53_sc.f
3178   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3179   CIA new_pc = CPU (h_pc) + 2;
3180   EXTRACT_FMT_53_SC_VARS /* f-op1 f-r1 f-op2 f-r2 */
3181   EXTRACT_FMT_53_SC_CODE
3182
3183 if (NOTBI (OPRND (condbit))) {
3184   CPU (h_abort) = 1;
3185   TRACE_RESULT (current_cpu, "abort-parallel-execution", 'x', CPU (h_abort));
3186 }
3187
3188 #if WITH_PROFILE_MODEL_P
3189   if (PROFILE_MODEL_P (current_cpu))
3190     {
3191       m32rx_model_profile_insn (current_cpu, abuf);
3192     }
3193 #endif
3194
3195   return new_pc;
3196 #undef OPRND
3197 }
3198
3199 CIA
3200 SEM_FN_NAME (m32rx,illegal) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3201 {
3202   sim_engine_illegal_insn (current_cpu, NULL_CIA /*FIXME*/);
3203   return 0;
3204 }
3205
3206 #endif /* ! defined (SCACHE_P) || (defined (SCACHE_P) && WITH_SCACHE) */