464283744d98d7d14d9cfa41a3c5ed06afe80572
[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 = SEM_NEXT_PC (sem_arg, 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 = SEM_NEXT_PC (sem_arg, 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 = SEM_NEXT_PC (sem_arg, 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 = SEM_NEXT_PC (sem_arg, 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 = SEM_NEXT_PC (sem_arg, 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 = SEM_NEXT_PC (sem_arg, 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 = SEM_NEXT_PC (sem_arg, 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 = SEM_NEXT_PC (sem_arg, 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 = SEM_NEXT_PC (sem_arg, 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_5_addv.f
287   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
288   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
289   EXTRACT_FMT_5_ADDV_VARS /* f-op1 f-r1 f-op2 f-r2 */
290   EXTRACT_FMT_5_ADDV_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_6_addv3.f
321   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
322   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
323   EXTRACT_FMT_6_ADDV3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
324   EXTRACT_FMT_6_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_7_addx.f
355   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
356   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
357   EXTRACT_FMT_7_ADDX_VARS /* f-op1 f-r1 f-op2 f-r2 */
358   EXTRACT_FMT_7_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_8_bc8.f
389   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
390   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
391   int taken_p = 0;
392   EXTRACT_FMT_8_BC8_VARS /* f-op1 f-r1 f-disp8 */
393   EXTRACT_FMT_8_BC8_CODE
394
395 if (OPRND (condbit)) {
396   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
397   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
398 }
399
400 #if WITH_PROFILE_MODEL_P
401   if (PROFILE_MODEL_P (current_cpu))
402     {
403       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
404     }
405 #endif
406
407   return new_pc;
408 #undef OPRND
409 }
410
411 /* Perform bc24: bc $disp24.  */
412 CIA
413 SEM_FN_NAME (m32rx,bc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
414 {
415   insn_t insn = SEM_INSN (sem_arg);
416 #define OPRND(f) par_exec->operands.fmt_9_bc24.f
417   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
418   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
419   int taken_p = 0;
420   EXTRACT_FMT_9_BC24_VARS /* f-op1 f-r1 f-disp24 */
421   EXTRACT_FMT_9_BC24_CODE
422
423 if (OPRND (condbit)) {
424   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
425   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
426 }
427
428 #if WITH_PROFILE_MODEL_P
429   if (PROFILE_MODEL_P (current_cpu))
430     {
431       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
432     }
433 #endif
434
435   return new_pc;
436 #undef OPRND
437 }
438
439 /* Perform beq: beq $src1,$src2,$disp16.  */
440 CIA
441 SEM_FN_NAME (m32rx,beq) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
442 {
443   insn_t insn = SEM_INSN (sem_arg);
444 #define OPRND(f) par_exec->operands.fmt_10_beq.f
445   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
446   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
447   int taken_p = 0;
448   EXTRACT_FMT_10_BEQ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
449   EXTRACT_FMT_10_BEQ_CODE
450
451 if (EQSI (OPRND (src1), OPRND (src2))) {
452   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
453   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
454 }
455
456 #if WITH_PROFILE_MODEL_P
457   if (PROFILE_MODEL_P (current_cpu))
458     {
459       m32rx_model_mark_get_h_gr (current_cpu, abuf);
460       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
461     }
462 #endif
463
464   return new_pc;
465 #undef OPRND
466 }
467
468 /* Perform beqz: beqz $src2,$disp16.  */
469 CIA
470 SEM_FN_NAME (m32rx,beqz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
471 {
472   insn_t insn = SEM_INSN (sem_arg);
473 #define OPRND(f) par_exec->operands.fmt_11_beqz.f
474   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
475   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
476   int taken_p = 0;
477   EXTRACT_FMT_11_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
478   EXTRACT_FMT_11_BEQZ_CODE
479
480 if (EQSI (OPRND (src2), 0)) {
481   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
482   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
483 }
484
485 #if WITH_PROFILE_MODEL_P
486   if (PROFILE_MODEL_P (current_cpu))
487     {
488       m32rx_model_mark_get_h_gr (current_cpu, abuf);
489       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
490     }
491 #endif
492
493   return new_pc;
494 #undef OPRND
495 }
496
497 /* Perform bgez: bgez $src2,$disp16.  */
498 CIA
499 SEM_FN_NAME (m32rx,bgez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
500 {
501   insn_t insn = SEM_INSN (sem_arg);
502 #define OPRND(f) par_exec->operands.fmt_11_beqz.f
503   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
504   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
505   int taken_p = 0;
506   EXTRACT_FMT_11_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
507   EXTRACT_FMT_11_BEQZ_CODE
508
509 if (GESI (OPRND (src2), 0)) {
510   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
511   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
512 }
513
514 #if WITH_PROFILE_MODEL_P
515   if (PROFILE_MODEL_P (current_cpu))
516     {
517       m32rx_model_mark_get_h_gr (current_cpu, abuf);
518       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
519     }
520 #endif
521
522   return new_pc;
523 #undef OPRND
524 }
525
526 /* Perform bgtz: bgtz $src2,$disp16.  */
527 CIA
528 SEM_FN_NAME (m32rx,bgtz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
529 {
530   insn_t insn = SEM_INSN (sem_arg);
531 #define OPRND(f) par_exec->operands.fmt_11_beqz.f
532   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
533   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
534   int taken_p = 0;
535   EXTRACT_FMT_11_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
536   EXTRACT_FMT_11_BEQZ_CODE
537
538 if (GTSI (OPRND (src2), 0)) {
539   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
540   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
541 }
542
543 #if WITH_PROFILE_MODEL_P
544   if (PROFILE_MODEL_P (current_cpu))
545     {
546       m32rx_model_mark_get_h_gr (current_cpu, abuf);
547       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
548     }
549 #endif
550
551   return new_pc;
552 #undef OPRND
553 }
554
555 /* Perform blez: blez $src2,$disp16.  */
556 CIA
557 SEM_FN_NAME (m32rx,blez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
558 {
559   insn_t insn = SEM_INSN (sem_arg);
560 #define OPRND(f) par_exec->operands.fmt_11_beqz.f
561   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
562   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
563   int taken_p = 0;
564   EXTRACT_FMT_11_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
565   EXTRACT_FMT_11_BEQZ_CODE
566
567 if (LESI (OPRND (src2), 0)) {
568   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
569   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
570 }
571
572 #if WITH_PROFILE_MODEL_P
573   if (PROFILE_MODEL_P (current_cpu))
574     {
575       m32rx_model_mark_get_h_gr (current_cpu, abuf);
576       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
577     }
578 #endif
579
580   return new_pc;
581 #undef OPRND
582 }
583
584 /* Perform bltz: bltz $src2,$disp16.  */
585 CIA
586 SEM_FN_NAME (m32rx,bltz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
587 {
588   insn_t insn = SEM_INSN (sem_arg);
589 #define OPRND(f) par_exec->operands.fmt_11_beqz.f
590   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
591   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
592   int taken_p = 0;
593   EXTRACT_FMT_11_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
594   EXTRACT_FMT_11_BEQZ_CODE
595
596 if (LTSI (OPRND (src2), 0)) {
597   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
598   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
599 }
600
601 #if WITH_PROFILE_MODEL_P
602   if (PROFILE_MODEL_P (current_cpu))
603     {
604       m32rx_model_mark_get_h_gr (current_cpu, abuf);
605       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
606     }
607 #endif
608
609   return new_pc;
610 #undef OPRND
611 }
612
613 /* Perform bnez: bnez $src2,$disp16.  */
614 CIA
615 SEM_FN_NAME (m32rx,bnez) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
616 {
617   insn_t insn = SEM_INSN (sem_arg);
618 #define OPRND(f) par_exec->operands.fmt_11_beqz.f
619   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
620   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
621   int taken_p = 0;
622   EXTRACT_FMT_11_BEQZ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
623   EXTRACT_FMT_11_BEQZ_CODE
624
625 if (NESI (OPRND (src2), 0)) {
626   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
627   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
628 }
629
630 #if WITH_PROFILE_MODEL_P
631   if (PROFILE_MODEL_P (current_cpu))
632     {
633       m32rx_model_mark_get_h_gr (current_cpu, abuf);
634       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
635     }
636 #endif
637
638   return new_pc;
639 #undef OPRND
640 }
641
642 /* Perform bl8: bl $disp8.  */
643 CIA
644 SEM_FN_NAME (m32rx,bl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
645 {
646   insn_t insn = SEM_INSN (sem_arg);
647 #define OPRND(f) par_exec->operands.fmt_12_bl8.f
648   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
649   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
650   int taken_p = 0;
651   EXTRACT_FMT_12_BL8_VARS /* f-op1 f-r1 f-disp8 */
652   EXTRACT_FMT_12_BL8_CODE
653
654 do {
655   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
656   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
657   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
658   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
659 } while (0);
660
661 #if WITH_PROFILE_MODEL_P
662   if (PROFILE_MODEL_P (current_cpu))
663     {
664       m32rx_model_mark_set_h_gr (current_cpu, abuf);
665       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
666     }
667 #endif
668
669   return new_pc;
670 #undef OPRND
671 }
672
673 /* Perform bl24: bl $disp24.  */
674 CIA
675 SEM_FN_NAME (m32rx,bl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
676 {
677   insn_t insn = SEM_INSN (sem_arg);
678 #define OPRND(f) par_exec->operands.fmt_13_bl24.f
679   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
680   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
681   int taken_p = 0;
682   EXTRACT_FMT_13_BL24_VARS /* f-op1 f-r1 f-disp24 */
683   EXTRACT_FMT_13_BL24_CODE
684
685 do {
686   CPU (h_gr[14]) = ADDSI (OPRND (pc), 4);
687   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
688   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
689   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
690 } while (0);
691
692 #if WITH_PROFILE_MODEL_P
693   if (PROFILE_MODEL_P (current_cpu))
694     {
695       m32rx_model_mark_set_h_gr (current_cpu, abuf);
696       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
697     }
698 #endif
699
700   return new_pc;
701 #undef OPRND
702 }
703
704 /* Perform bcl8: bcl $disp8.  */
705 CIA
706 SEM_FN_NAME (m32rx,bcl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
707 {
708   insn_t insn = SEM_INSN (sem_arg);
709 #define OPRND(f) par_exec->operands.fmt_14_bcl8.f
710   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
711   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
712   int taken_p = 0;
713   EXTRACT_FMT_14_BCL8_VARS /* f-op1 f-r1 f-disp8 */
714   EXTRACT_FMT_14_BCL8_CODE
715
716 if (OPRND (condbit)) {
717 do {
718   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
719   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
720   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
721   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
722 } while (0);
723 }
724
725 #if WITH_PROFILE_MODEL_P
726   if (PROFILE_MODEL_P (current_cpu))
727     {
728       m32rx_model_mark_set_h_gr (current_cpu, abuf);
729       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
730     }
731 #endif
732
733   return new_pc;
734 #undef OPRND
735 }
736
737 /* Perform bcl24: bcl $disp24.  */
738 CIA
739 SEM_FN_NAME (m32rx,bcl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
740 {
741   insn_t insn = SEM_INSN (sem_arg);
742 #define OPRND(f) par_exec->operands.fmt_15_bcl24.f
743   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
744   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
745   int taken_p = 0;
746   EXTRACT_FMT_15_BCL24_VARS /* f-op1 f-r1 f-disp24 */
747   EXTRACT_FMT_15_BCL24_CODE
748
749 if (OPRND (condbit)) {
750 do {
751   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
752   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
753   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
754   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
755 } while (0);
756 }
757
758 #if WITH_PROFILE_MODEL_P
759   if (PROFILE_MODEL_P (current_cpu))
760     {
761       m32rx_model_mark_set_h_gr (current_cpu, abuf);
762       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
763     }
764 #endif
765
766   return new_pc;
767 #undef OPRND
768 }
769
770 /* Perform bnc8: bnc $disp8.  */
771 CIA
772 SEM_FN_NAME (m32rx,bnc8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
773 {
774   insn_t insn = SEM_INSN (sem_arg);
775 #define OPRND(f) par_exec->operands.fmt_8_bc8.f
776   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
777   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
778   int taken_p = 0;
779   EXTRACT_FMT_8_BC8_VARS /* f-op1 f-r1 f-disp8 */
780   EXTRACT_FMT_8_BC8_CODE
781
782 if (NOTBI (OPRND (condbit))) {
783   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
784   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
785 }
786
787 #if WITH_PROFILE_MODEL_P
788   if (PROFILE_MODEL_P (current_cpu))
789     {
790       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
791     }
792 #endif
793
794   return new_pc;
795 #undef OPRND
796 }
797
798 /* Perform bnc24: bnc $disp24.  */
799 CIA
800 SEM_FN_NAME (m32rx,bnc24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
801 {
802   insn_t insn = SEM_INSN (sem_arg);
803 #define OPRND(f) par_exec->operands.fmt_9_bc24.f
804   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
805   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
806   int taken_p = 0;
807   EXTRACT_FMT_9_BC24_VARS /* f-op1 f-r1 f-disp24 */
808   EXTRACT_FMT_9_BC24_CODE
809
810 if (NOTBI (OPRND (condbit))) {
811   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
812   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
813 }
814
815 #if WITH_PROFILE_MODEL_P
816   if (PROFILE_MODEL_P (current_cpu))
817     {
818       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
819     }
820 #endif
821
822   return new_pc;
823 #undef OPRND
824 }
825
826 /* Perform bne: bne $src1,$src2,$disp16.  */
827 CIA
828 SEM_FN_NAME (m32rx,bne) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
829 {
830   insn_t insn = SEM_INSN (sem_arg);
831 #define OPRND(f) par_exec->operands.fmt_10_beq.f
832   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
833   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
834   int taken_p = 0;
835   EXTRACT_FMT_10_BEQ_VARS /* f-op1 f-r1 f-op2 f-r2 f-disp16 */
836   EXTRACT_FMT_10_BEQ_CODE
837
838 if (NESI (OPRND (src1), OPRND (src2))) {
839   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp16)));
840   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
841 }
842
843 #if WITH_PROFILE_MODEL_P
844   if (PROFILE_MODEL_P (current_cpu))
845     {
846       m32rx_model_mark_get_h_gr (current_cpu, abuf);
847       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
848     }
849 #endif
850
851   return new_pc;
852 #undef OPRND
853 }
854
855 /* Perform bra8: bra $disp8.  */
856 CIA
857 SEM_FN_NAME (m32rx,bra8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
858 {
859   insn_t insn = SEM_INSN (sem_arg);
860 #define OPRND(f) par_exec->operands.fmt_16_bra8.f
861   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
862   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
863   int taken_p = 0;
864   EXTRACT_FMT_16_BRA8_VARS /* f-op1 f-r1 f-disp8 */
865   EXTRACT_FMT_16_BRA8_CODE
866
867   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
868   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
869
870 #if WITH_PROFILE_MODEL_P
871   if (PROFILE_MODEL_P (current_cpu))
872     {
873       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
874     }
875 #endif
876
877   return new_pc;
878 #undef OPRND
879 }
880
881 /* Perform bra24: bra $disp24.  */
882 CIA
883 SEM_FN_NAME (m32rx,bra24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
884 {
885   insn_t insn = SEM_INSN (sem_arg);
886 #define OPRND(f) par_exec->operands.fmt_17_bra24.f
887   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
888   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
889   int taken_p = 0;
890   EXTRACT_FMT_17_BRA24_VARS /* f-op1 f-r1 f-disp24 */
891   EXTRACT_FMT_17_BRA24_CODE
892
893   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
894   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
895
896 #if WITH_PROFILE_MODEL_P
897   if (PROFILE_MODEL_P (current_cpu))
898     {
899       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
900     }
901 #endif
902
903   return new_pc;
904 #undef OPRND
905 }
906
907 /* Perform bncl8: bncl $disp8.  */
908 CIA
909 SEM_FN_NAME (m32rx,bncl8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
910 {
911   insn_t insn = SEM_INSN (sem_arg);
912 #define OPRND(f) par_exec->operands.fmt_14_bcl8.f
913   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
914   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
915   int taken_p = 0;
916   EXTRACT_FMT_14_BCL8_VARS /* f-op1 f-r1 f-disp8 */
917   EXTRACT_FMT_14_BCL8_CODE
918
919 if (NOTBI (OPRND (condbit))) {
920 do {
921   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
922   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
923   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp8)));
924   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
925 } while (0);
926 }
927
928 #if WITH_PROFILE_MODEL_P
929   if (PROFILE_MODEL_P (current_cpu))
930     {
931       m32rx_model_mark_set_h_gr (current_cpu, abuf);
932       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
933     }
934 #endif
935
936   return new_pc;
937 #undef OPRND
938 }
939
940 /* Perform bncl24: bncl $disp24.  */
941 CIA
942 SEM_FN_NAME (m32rx,bncl24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
943 {
944   insn_t insn = SEM_INSN (sem_arg);
945 #define OPRND(f) par_exec->operands.fmt_15_bcl24.f
946   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
947   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
948   int taken_p = 0;
949   EXTRACT_FMT_15_BCL24_VARS /* f-op1 f-r1 f-disp24 */
950   EXTRACT_FMT_15_BCL24_CODE
951
952 if (NOTBI (OPRND (condbit))) {
953 do {
954   CPU (h_gr[14]) = ADDSI (ANDSI (OPRND (pc), -4), 4);
955   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
956   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, OPRND (disp24)));
957   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
958 } while (0);
959 }
960
961 #if WITH_PROFILE_MODEL_P
962   if (PROFILE_MODEL_P (current_cpu))
963     {
964       m32rx_model_mark_set_h_gr (current_cpu, abuf);
965       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
966     }
967 #endif
968
969   return new_pc;
970 #undef OPRND
971 }
972
973 /* Perform cmp: cmp $src1,$src2.  */
974 CIA
975 SEM_FN_NAME (m32rx,cmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
976 {
977   insn_t insn = SEM_INSN (sem_arg);
978 #define OPRND(f) par_exec->operands.fmt_18_cmp.f
979   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
980   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
981   EXTRACT_FMT_18_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
982   EXTRACT_FMT_18_CMP_CODE
983
984   CPU (h_cond) = LTSI (OPRND (src1), OPRND (src2));
985   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
986
987 #if WITH_PROFILE_MODEL_P
988   if (PROFILE_MODEL_P (current_cpu))
989     {
990       m32rx_model_mark_get_h_gr (current_cpu, abuf);
991       m32rx_model_profile_insn (current_cpu, abuf);
992     }
993 #endif
994
995   return new_pc;
996 #undef OPRND
997 }
998
999 /* Perform cmpi: cmpi $src2,#$simm16.  */
1000 CIA
1001 SEM_FN_NAME (m32rx,cmpi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1002 {
1003   insn_t insn = SEM_INSN (sem_arg);
1004 #define OPRND(f) par_exec->operands.fmt_19_cmpi.f
1005   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1006   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1007   EXTRACT_FMT_19_CMPI_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1008   EXTRACT_FMT_19_CMPI_CODE
1009
1010   CPU (h_cond) = LTSI (OPRND (src2), OPRND (simm16));
1011   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1012
1013 #if WITH_PROFILE_MODEL_P
1014   if (PROFILE_MODEL_P (current_cpu))
1015     {
1016       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1017       m32rx_model_profile_insn (current_cpu, abuf);
1018     }
1019 #endif
1020
1021   return new_pc;
1022 #undef OPRND
1023 }
1024
1025 /* Perform cmpu: cmpu $src1,$src2.  */
1026 CIA
1027 SEM_FN_NAME (m32rx,cmpu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1028 {
1029   insn_t insn = SEM_INSN (sem_arg);
1030 #define OPRND(f) par_exec->operands.fmt_18_cmp.f
1031   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1032   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1033   EXTRACT_FMT_18_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1034   EXTRACT_FMT_18_CMP_CODE
1035
1036   CPU (h_cond) = LTUSI (OPRND (src1), OPRND (src2));
1037   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1038
1039 #if WITH_PROFILE_MODEL_P
1040   if (PROFILE_MODEL_P (current_cpu))
1041     {
1042       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1043       m32rx_model_profile_insn (current_cpu, abuf);
1044     }
1045 #endif
1046
1047   return new_pc;
1048 #undef OPRND
1049 }
1050
1051 /* Perform cmpui: cmpui $src2,#$uimm16.  */
1052 CIA
1053 SEM_FN_NAME (m32rx,cmpui) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1054 {
1055   insn_t insn = SEM_INSN (sem_arg);
1056 #define OPRND(f) par_exec->operands.fmt_20_cmpui.f
1057   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1058   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1059   EXTRACT_FMT_20_CMPUI_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
1060   EXTRACT_FMT_20_CMPUI_CODE
1061
1062   CPU (h_cond) = LTUSI (OPRND (src2), OPRND (uimm16));
1063   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1064
1065 #if WITH_PROFILE_MODEL_P
1066   if (PROFILE_MODEL_P (current_cpu))
1067     {
1068       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1069       m32rx_model_profile_insn (current_cpu, abuf);
1070     }
1071 #endif
1072
1073   return new_pc;
1074 #undef OPRND
1075 }
1076
1077 /* Perform cmpeq: cmpeq $src1,$src2.  */
1078 CIA
1079 SEM_FN_NAME (m32rx,cmpeq) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1080 {
1081   insn_t insn = SEM_INSN (sem_arg);
1082 #define OPRND(f) par_exec->operands.fmt_18_cmp.f
1083   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1084   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1085   EXTRACT_FMT_18_CMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1086   EXTRACT_FMT_18_CMP_CODE
1087
1088   CPU (h_cond) = EQSI (OPRND (src1), OPRND (src2));
1089   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1090
1091 #if WITH_PROFILE_MODEL_P
1092   if (PROFILE_MODEL_P (current_cpu))
1093     {
1094       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1095       m32rx_model_profile_insn (current_cpu, abuf);
1096     }
1097 #endif
1098
1099   return new_pc;
1100 #undef OPRND
1101 }
1102
1103 /* Perform cmpz: cmpz $src2.  */
1104 CIA
1105 SEM_FN_NAME (m32rx,cmpz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1106 {
1107   insn_t insn = SEM_INSN (sem_arg);
1108 #define OPRND(f) par_exec->operands.fmt_21_cmpz.f
1109   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1110   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1111   EXTRACT_FMT_21_CMPZ_VARS /* f-op1 f-r1 f-op2 f-r2 */
1112   EXTRACT_FMT_21_CMPZ_CODE
1113
1114   CPU (h_cond) = EQSI (OPRND (src2), 0);
1115   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
1116
1117 #if WITH_PROFILE_MODEL_P
1118   if (PROFILE_MODEL_P (current_cpu))
1119     {
1120       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1121       m32rx_model_profile_insn (current_cpu, abuf);
1122     }
1123 #endif
1124
1125   return new_pc;
1126 #undef OPRND
1127 }
1128
1129 /* Perform div: div $dr,$sr.  */
1130 CIA
1131 SEM_FN_NAME (m32rx,div) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1132 {
1133   insn_t insn = SEM_INSN (sem_arg);
1134 #define OPRND(f) par_exec->operands.fmt_22_div.f
1135   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1136   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1137   EXTRACT_FMT_22_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1138   EXTRACT_FMT_22_DIV_CODE
1139
1140 if (NESI (OPRND (sr), 0)) {
1141   CPU (h_gr[f_r1]) = DIVSI (OPRND (dr), OPRND (sr));
1142   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1143 }
1144
1145 #if WITH_PROFILE_MODEL_P
1146   if (PROFILE_MODEL_P (current_cpu))
1147     {
1148       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1149       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1150       m32rx_model_profile_insn (current_cpu, abuf);
1151     }
1152 #endif
1153
1154   return new_pc;
1155 #undef OPRND
1156 }
1157
1158 /* Perform divu: divu $dr,$sr.  */
1159 CIA
1160 SEM_FN_NAME (m32rx,divu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1161 {
1162   insn_t insn = SEM_INSN (sem_arg);
1163 #define OPRND(f) par_exec->operands.fmt_22_div.f
1164   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1165   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1166   EXTRACT_FMT_22_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1167   EXTRACT_FMT_22_DIV_CODE
1168
1169 if (NESI (OPRND (sr), 0)) {
1170   CPU (h_gr[f_r1]) = UDIVSI (OPRND (dr), OPRND (sr));
1171   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1172 }
1173
1174 #if WITH_PROFILE_MODEL_P
1175   if (PROFILE_MODEL_P (current_cpu))
1176     {
1177       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1178       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1179       m32rx_model_profile_insn (current_cpu, abuf);
1180     }
1181 #endif
1182
1183   return new_pc;
1184 #undef OPRND
1185 }
1186
1187 /* Perform rem: rem $dr,$sr.  */
1188 CIA
1189 SEM_FN_NAME (m32rx,rem) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1190 {
1191   insn_t insn = SEM_INSN (sem_arg);
1192 #define OPRND(f) par_exec->operands.fmt_22_div.f
1193   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1194   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1195   EXTRACT_FMT_22_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1196   EXTRACT_FMT_22_DIV_CODE
1197
1198 if (NESI (OPRND (sr), 0)) {
1199   CPU (h_gr[f_r1]) = MODSI (OPRND (dr), OPRND (sr));
1200   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1201 }
1202
1203 #if WITH_PROFILE_MODEL_P
1204   if (PROFILE_MODEL_P (current_cpu))
1205     {
1206       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1207       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1208       m32rx_model_profile_insn (current_cpu, abuf);
1209     }
1210 #endif
1211
1212   return new_pc;
1213 #undef OPRND
1214 }
1215
1216 /* Perform remu: remu $dr,$sr.  */
1217 CIA
1218 SEM_FN_NAME (m32rx,remu) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1219 {
1220   insn_t insn = SEM_INSN (sem_arg);
1221 #define OPRND(f) par_exec->operands.fmt_22_div.f
1222   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1223   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1224   EXTRACT_FMT_22_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1225   EXTRACT_FMT_22_DIV_CODE
1226
1227 if (NESI (OPRND (sr), 0)) {
1228   CPU (h_gr[f_r1]) = UMODSI (OPRND (dr), OPRND (sr));
1229   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1230 }
1231
1232 #if WITH_PROFILE_MODEL_P
1233   if (PROFILE_MODEL_P (current_cpu))
1234     {
1235       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1236       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1237       m32rx_model_profile_insn (current_cpu, abuf);
1238     }
1239 #endif
1240
1241   return new_pc;
1242 #undef OPRND
1243 }
1244
1245 /* Perform divh: divh $dr,$sr.  */
1246 CIA
1247 SEM_FN_NAME (m32rx,divh) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1248 {
1249   insn_t insn = SEM_INSN (sem_arg);
1250 #define OPRND(f) par_exec->operands.fmt_22_div.f
1251   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1252   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1253   EXTRACT_FMT_22_DIV_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1254   EXTRACT_FMT_22_DIV_CODE
1255
1256 if (NESI (OPRND (sr), 0)) {
1257   CPU (h_gr[f_r1]) = DIVSI (EXTHISI (TRUNCSIHI (OPRND (dr))), OPRND (sr));
1258   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1259 }
1260
1261 #if WITH_PROFILE_MODEL_P
1262   if (PROFILE_MODEL_P (current_cpu))
1263     {
1264       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1265       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1266       m32rx_model_profile_insn (current_cpu, abuf);
1267     }
1268 #endif
1269
1270   return new_pc;
1271 #undef OPRND
1272 }
1273
1274 /* Perform jc: jc $sr.  */
1275 CIA
1276 SEM_FN_NAME (m32rx,jc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1277 {
1278   insn_t insn = SEM_INSN (sem_arg);
1279 #define OPRND(f) par_exec->operands.fmt_23_jc.f
1280   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1281   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1282   int taken_p = 0;
1283   EXTRACT_FMT_23_JC_VARS /* f-op1 f-r1 f-op2 f-r2 */
1284   EXTRACT_FMT_23_JC_CODE
1285
1286 if (OPRND (condbit)) {
1287   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, ANDSI (OPRND (sr), -4)));
1288   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
1289 }
1290
1291 #if WITH_PROFILE_MODEL_P
1292   if (PROFILE_MODEL_P (current_cpu))
1293     {
1294       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1295       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1296     }
1297 #endif
1298
1299   return new_pc;
1300 #undef OPRND
1301 }
1302
1303 /* Perform jnc: jnc $sr.  */
1304 CIA
1305 SEM_FN_NAME (m32rx,jnc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1306 {
1307   insn_t insn = SEM_INSN (sem_arg);
1308 #define OPRND(f) par_exec->operands.fmt_23_jc.f
1309   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1310   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1311   int taken_p = 0;
1312   EXTRACT_FMT_23_JC_VARS /* f-op1 f-r1 f-op2 f-r2 */
1313   EXTRACT_FMT_23_JC_CODE
1314
1315 if (NOTBI (OPRND (condbit))) {
1316   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, ANDSI (OPRND (sr), -4)));
1317   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
1318 }
1319
1320 #if WITH_PROFILE_MODEL_P
1321   if (PROFILE_MODEL_P (current_cpu))
1322     {
1323       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1324       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1325     }
1326 #endif
1327
1328   return new_pc;
1329 #undef OPRND
1330 }
1331
1332 /* Perform jl: jl $sr.  */
1333 CIA
1334 SEM_FN_NAME (m32rx,jl) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1335 {
1336   insn_t insn = SEM_INSN (sem_arg);
1337 #define OPRND(f) par_exec->operands.fmt_24_jl.f
1338   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1339   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1340   int taken_p = 0;
1341   EXTRACT_FMT_24_JL_VARS /* f-op1 f-r1 f-op2 f-r2 */
1342   EXTRACT_FMT_24_JL_CODE
1343
1344 do {
1345   SI temp1;SI temp0;
1346   temp0 = ADDSI (ANDSI (OPRND (pc), -4), 4);
1347   temp1 = OPRND (sr);
1348   CPU (h_gr[14]) = temp0;
1349   TRACE_RESULT (current_cpu, "h-gr-14", 'x', CPU (h_gr[14]));
1350   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, temp1));
1351   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
1352 } while (0);
1353
1354 #if WITH_PROFILE_MODEL_P
1355   if (PROFILE_MODEL_P (current_cpu))
1356     {
1357       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1358       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1359       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
1360     }
1361 #endif
1362
1363   return new_pc;
1364 #undef OPRND
1365 }
1366
1367 /* Perform jmp: jmp $sr.  */
1368 CIA
1369 SEM_FN_NAME (m32rx,jmp) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1370 {
1371   insn_t insn = SEM_INSN (sem_arg);
1372 #define OPRND(f) par_exec->operands.fmt_25_jmp.f
1373   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1374   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1375   int taken_p = 0;
1376   EXTRACT_FMT_25_JMP_VARS /* f-op1 f-r1 f-op2 f-r2 */
1377   EXTRACT_FMT_25_JMP_CODE
1378
1379   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, OPRND (sr)));
1380   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
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_profile_cti_insn (current_cpu, abuf, taken_p);
1387     }
1388 #endif
1389
1390   return new_pc;
1391 #undef OPRND
1392 }
1393
1394 /* Perform ld: ld $dr,@$sr.  */
1395 CIA
1396 SEM_FN_NAME (m32rx,ld) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1397 {
1398   insn_t insn = SEM_INSN (sem_arg);
1399 #define OPRND(f) par_exec->operands.fmt_26_ld.f
1400   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1401   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1402   EXTRACT_FMT_26_LD_VARS /* f-op1 f-r1 f-op2 f-r2 */
1403   EXTRACT_FMT_26_LD_CODE
1404
1405   CPU (h_gr[f_r1]) = OPRND (h_memory_sr);
1406   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1407
1408 #if WITH_PROFILE_MODEL_P
1409   if (PROFILE_MODEL_P (current_cpu))
1410     {
1411       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1412       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1413       m32rx_model_profile_insn (current_cpu, abuf);
1414     }
1415 #endif
1416
1417   return new_pc;
1418 #undef OPRND
1419 }
1420
1421 /* Perform ld-d: ld $dr,@($slo16,$sr).  */
1422 CIA
1423 SEM_FN_NAME (m32rx,ld_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1424 {
1425   insn_t insn = SEM_INSN (sem_arg);
1426 #define OPRND(f) par_exec->operands.fmt_27_ld_d.f
1427   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1428   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1429   EXTRACT_FMT_27_LD_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1430   EXTRACT_FMT_27_LD_D_CODE
1431
1432   CPU (h_gr[f_r1]) = OPRND (h_memory_add_WI_sr_slo16);
1433   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1434
1435 #if WITH_PROFILE_MODEL_P
1436   if (PROFILE_MODEL_P (current_cpu))
1437     {
1438       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1439       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1440       m32rx_model_profile_insn (current_cpu, abuf);
1441     }
1442 #endif
1443
1444   return new_pc;
1445 #undef OPRND
1446 }
1447
1448 /* Perform ldb: ldb $dr,@$sr.  */
1449 CIA
1450 SEM_FN_NAME (m32rx,ldb) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1451 {
1452   insn_t insn = SEM_INSN (sem_arg);
1453 #define OPRND(f) par_exec->operands.fmt_28_ldb.f
1454   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1455   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1456   EXTRACT_FMT_28_LDB_VARS /* f-op1 f-r1 f-op2 f-r2 */
1457   EXTRACT_FMT_28_LDB_CODE
1458
1459   CPU (h_gr[f_r1]) = EXTQISI (OPRND (h_memory_sr));
1460   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1461
1462 #if WITH_PROFILE_MODEL_P
1463   if (PROFILE_MODEL_P (current_cpu))
1464     {
1465       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1466       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1467       m32rx_model_profile_insn (current_cpu, abuf);
1468     }
1469 #endif
1470
1471   return new_pc;
1472 #undef OPRND
1473 }
1474
1475 /* Perform ldb-d: ldb $dr,@($slo16,$sr).  */
1476 CIA
1477 SEM_FN_NAME (m32rx,ldb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1478 {
1479   insn_t insn = SEM_INSN (sem_arg);
1480 #define OPRND(f) par_exec->operands.fmt_29_ldb_d.f
1481   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1482   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1483   EXTRACT_FMT_29_LDB_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1484   EXTRACT_FMT_29_LDB_D_CODE
1485
1486   CPU (h_gr[f_r1]) = EXTQISI (OPRND (h_memory_add_WI_sr_slo16));
1487   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1488
1489 #if WITH_PROFILE_MODEL_P
1490   if (PROFILE_MODEL_P (current_cpu))
1491     {
1492       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1493       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1494       m32rx_model_profile_insn (current_cpu, abuf);
1495     }
1496 #endif
1497
1498   return new_pc;
1499 #undef OPRND
1500 }
1501
1502 /* Perform ldh: ldh $dr,@$sr.  */
1503 CIA
1504 SEM_FN_NAME (m32rx,ldh) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1505 {
1506   insn_t insn = SEM_INSN (sem_arg);
1507 #define OPRND(f) par_exec->operands.fmt_30_ldh.f
1508   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1509   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1510   EXTRACT_FMT_30_LDH_VARS /* f-op1 f-r1 f-op2 f-r2 */
1511   EXTRACT_FMT_30_LDH_CODE
1512
1513   CPU (h_gr[f_r1]) = EXTHISI (OPRND (h_memory_sr));
1514   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1515
1516 #if WITH_PROFILE_MODEL_P
1517   if (PROFILE_MODEL_P (current_cpu))
1518     {
1519       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1520       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1521       m32rx_model_profile_insn (current_cpu, abuf);
1522     }
1523 #endif
1524
1525   return new_pc;
1526 #undef OPRND
1527 }
1528
1529 /* Perform ldh-d: ldh $dr,@($slo16,$sr).  */
1530 CIA
1531 SEM_FN_NAME (m32rx,ldh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1532 {
1533   insn_t insn = SEM_INSN (sem_arg);
1534 #define OPRND(f) par_exec->operands.fmt_31_ldh_d.f
1535   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1536   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1537   EXTRACT_FMT_31_LDH_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1538   EXTRACT_FMT_31_LDH_D_CODE
1539
1540   CPU (h_gr[f_r1]) = EXTHISI (OPRND (h_memory_add_WI_sr_slo16));
1541   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1542
1543 #if WITH_PROFILE_MODEL_P
1544   if (PROFILE_MODEL_P (current_cpu))
1545     {
1546       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1547       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1548       m32rx_model_profile_insn (current_cpu, abuf);
1549     }
1550 #endif
1551
1552   return new_pc;
1553 #undef OPRND
1554 }
1555
1556 /* Perform ldub: ldub $dr,@$sr.  */
1557 CIA
1558 SEM_FN_NAME (m32rx,ldub) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1559 {
1560   insn_t insn = SEM_INSN (sem_arg);
1561 #define OPRND(f) par_exec->operands.fmt_28_ldb.f
1562   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1563   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1564   EXTRACT_FMT_28_LDB_VARS /* f-op1 f-r1 f-op2 f-r2 */
1565   EXTRACT_FMT_28_LDB_CODE
1566
1567   CPU (h_gr[f_r1]) = ZEXTQISI (OPRND (h_memory_sr));
1568   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1569
1570 #if WITH_PROFILE_MODEL_P
1571   if (PROFILE_MODEL_P (current_cpu))
1572     {
1573       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1574       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1575       m32rx_model_profile_insn (current_cpu, abuf);
1576     }
1577 #endif
1578
1579   return new_pc;
1580 #undef OPRND
1581 }
1582
1583 /* Perform ldub-d: ldub $dr,@($slo16,$sr).  */
1584 CIA
1585 SEM_FN_NAME (m32rx,ldub_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1586 {
1587   insn_t insn = SEM_INSN (sem_arg);
1588 #define OPRND(f) par_exec->operands.fmt_29_ldb_d.f
1589   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1590   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1591   EXTRACT_FMT_29_LDB_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1592   EXTRACT_FMT_29_LDB_D_CODE
1593
1594   CPU (h_gr[f_r1]) = ZEXTQISI (OPRND (h_memory_add_WI_sr_slo16));
1595   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1596
1597 #if WITH_PROFILE_MODEL_P
1598   if (PROFILE_MODEL_P (current_cpu))
1599     {
1600       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1601       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1602       m32rx_model_profile_insn (current_cpu, abuf);
1603     }
1604 #endif
1605
1606   return new_pc;
1607 #undef OPRND
1608 }
1609
1610 /* Perform lduh: lduh $dr,@$sr.  */
1611 CIA
1612 SEM_FN_NAME (m32rx,lduh) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1613 {
1614   insn_t insn = SEM_INSN (sem_arg);
1615 #define OPRND(f) par_exec->operands.fmt_30_ldh.f
1616   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1617   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1618   EXTRACT_FMT_30_LDH_VARS /* f-op1 f-r1 f-op2 f-r2 */
1619   EXTRACT_FMT_30_LDH_CODE
1620
1621   CPU (h_gr[f_r1]) = ZEXTHISI (OPRND (h_memory_sr));
1622   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1623
1624 #if WITH_PROFILE_MODEL_P
1625   if (PROFILE_MODEL_P (current_cpu))
1626     {
1627       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1628       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1629       m32rx_model_profile_insn (current_cpu, abuf);
1630     }
1631 #endif
1632
1633   return new_pc;
1634 #undef OPRND
1635 }
1636
1637 /* Perform lduh-d: lduh $dr,@($slo16,$sr).  */
1638 CIA
1639 SEM_FN_NAME (m32rx,lduh_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1640 {
1641   insn_t insn = SEM_INSN (sem_arg);
1642 #define OPRND(f) par_exec->operands.fmt_31_ldh_d.f
1643   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1644   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1645   EXTRACT_FMT_31_LDH_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1646   EXTRACT_FMT_31_LDH_D_CODE
1647
1648   CPU (h_gr[f_r1]) = ZEXTHISI (OPRND (h_memory_add_WI_sr_slo16));
1649   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1650
1651 #if WITH_PROFILE_MODEL_P
1652   if (PROFILE_MODEL_P (current_cpu))
1653     {
1654       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1655       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1656       m32rx_model_profile_insn (current_cpu, abuf);
1657     }
1658 #endif
1659
1660   return new_pc;
1661 #undef OPRND
1662 }
1663
1664 /* Perform ld-plus: ld $dr,@$sr+.  */
1665 CIA
1666 SEM_FN_NAME (m32rx,ld_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1667 {
1668   insn_t insn = SEM_INSN (sem_arg);
1669 #define OPRND(f) par_exec->operands.fmt_32_ld_plus.f
1670   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1671   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1672   EXTRACT_FMT_32_LD_PLUS_VARS /* f-op1 f-r1 f-op2 f-r2 */
1673   EXTRACT_FMT_32_LD_PLUS_CODE
1674
1675 do {
1676   SI temp1;SI temp0;
1677   temp0 = OPRND (h_memory_sr);
1678   temp1 = ADDSI (OPRND (sr), 4);
1679   CPU (h_gr[f_r1]) = temp0;
1680   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1681   CPU (h_gr[f_r2]) = temp1;
1682   TRACE_RESULT (current_cpu, "sr", 'x', CPU (h_gr[f_r2]));
1683 } while (0);
1684
1685 #if WITH_PROFILE_MODEL_P
1686   if (PROFILE_MODEL_P (current_cpu))
1687     {
1688       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1689       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1690       m32rx_model_profile_insn (current_cpu, abuf);
1691     }
1692 #endif
1693
1694   return new_pc;
1695 #undef OPRND
1696 }
1697
1698 /* Perform ld24: ld24 $dr,#$uimm24.  */
1699 CIA
1700 SEM_FN_NAME (m32rx,ld24) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1701 {
1702   insn_t insn = SEM_INSN (sem_arg);
1703 #define OPRND(f) par_exec->operands.fmt_33_ld24.f
1704   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1705   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1706   EXTRACT_FMT_33_LD24_VARS /* f-op1 f-r1 f-uimm24 */
1707   EXTRACT_FMT_33_LD24_CODE
1708
1709   CPU (h_gr[f_r1]) = OPRND (uimm24);
1710   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1711
1712 #if WITH_PROFILE_MODEL_P
1713   if (PROFILE_MODEL_P (current_cpu))
1714     {
1715       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1716       m32rx_model_profile_insn (current_cpu, abuf);
1717     }
1718 #endif
1719
1720   return new_pc;
1721 #undef OPRND
1722 }
1723
1724 /* Perform ldi8: ldi $dr,#$simm8.  */
1725 CIA
1726 SEM_FN_NAME (m32rx,ldi8) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1727 {
1728   insn_t insn = SEM_INSN (sem_arg);
1729 #define OPRND(f) par_exec->operands.fmt_34_ldi8.f
1730   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1731   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1732   EXTRACT_FMT_34_LDI8_VARS /* f-op1 f-r1 f-simm8 */
1733   EXTRACT_FMT_34_LDI8_CODE
1734
1735   CPU (h_gr[f_r1]) = OPRND (simm8);
1736   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1737
1738 #if WITH_PROFILE_MODEL_P
1739   if (PROFILE_MODEL_P (current_cpu))
1740     {
1741       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1742       m32rx_model_profile_insn (current_cpu, abuf);
1743     }
1744 #endif
1745
1746   return new_pc;
1747 #undef OPRND
1748 }
1749
1750 /* Perform ldi16: ldi $dr,$slo16.  */
1751 CIA
1752 SEM_FN_NAME (m32rx,ldi16) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1753 {
1754   insn_t insn = SEM_INSN (sem_arg);
1755 #define OPRND(f) par_exec->operands.fmt_35_ldi16.f
1756   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1757   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
1758   EXTRACT_FMT_35_LDI16_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
1759   EXTRACT_FMT_35_LDI16_CODE
1760
1761   CPU (h_gr[f_r1]) = OPRND (slo16);
1762   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1763
1764 #if WITH_PROFILE_MODEL_P
1765   if (PROFILE_MODEL_P (current_cpu))
1766     {
1767       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1768       m32rx_model_profile_insn (current_cpu, abuf);
1769     }
1770 #endif
1771
1772   return new_pc;
1773 #undef OPRND
1774 }
1775
1776 /* Perform lock: lock $dr,@$sr.  */
1777 CIA
1778 SEM_FN_NAME (m32rx,lock) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1779 {
1780   insn_t insn = SEM_INSN (sem_arg);
1781 #define OPRND(f) par_exec->operands.fmt_36_lock.f
1782   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1783   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1784   EXTRACT_FMT_36_LOCK_VARS /* f-op1 f-r1 f-op2 f-r2 */
1785   EXTRACT_FMT_36_LOCK_CODE
1786
1787 do {
1788   CPU (h_lock) = 1;
1789   TRACE_RESULT (current_cpu, "h-lock-0", 'x', CPU (h_lock));
1790   CPU (h_gr[f_r1]) = OPRND (h_memory_sr);
1791   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1792 } while (0);
1793
1794 #if WITH_PROFILE_MODEL_P
1795   if (PROFILE_MODEL_P (current_cpu))
1796     {
1797       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1798       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1799       m32rx_model_profile_insn (current_cpu, abuf);
1800     }
1801 #endif
1802
1803   return new_pc;
1804 #undef OPRND
1805 }
1806
1807 /* Perform machi-a: machi $src1,$src2,$acc.  */
1808 CIA
1809 SEM_FN_NAME (m32rx,machi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1810 {
1811   insn_t insn = SEM_INSN (sem_arg);
1812 #define OPRND(f) par_exec->operands.fmt_37_machi_a.f
1813   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1814   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1815   EXTRACT_FMT_37_MACHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
1816   EXTRACT_FMT_37_MACHI_A_CODE
1817
1818 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));
1819   TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
1820
1821 #if WITH_PROFILE_MODEL_P
1822   if (PROFILE_MODEL_P (current_cpu))
1823     {
1824       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1825       m32rx_model_profile_insn (current_cpu, abuf);
1826     }
1827 #endif
1828
1829   return new_pc;
1830 #undef OPRND
1831 }
1832
1833 /* Perform maclo-a: maclo $src1,$src2,$acc.  */
1834 CIA
1835 SEM_FN_NAME (m32rx,maclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1836 {
1837   insn_t insn = SEM_INSN (sem_arg);
1838 #define OPRND(f) par_exec->operands.fmt_37_machi_a.f
1839   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1840   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1841   EXTRACT_FMT_37_MACHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
1842   EXTRACT_FMT_37_MACHI_A_CODE
1843
1844 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));
1845   TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
1846
1847 #if WITH_PROFILE_MODEL_P
1848   if (PROFILE_MODEL_P (current_cpu))
1849     {
1850       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1851       m32rx_model_profile_insn (current_cpu, abuf);
1852     }
1853 #endif
1854
1855   return new_pc;
1856 #undef OPRND
1857 }
1858
1859 /* Perform mul: mul $dr,$sr.  */
1860 CIA
1861 SEM_FN_NAME (m32rx,mul) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1862 {
1863   insn_t insn = SEM_INSN (sem_arg);
1864 #define OPRND(f) par_exec->operands.fmt_0_add.f
1865   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1866   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1867   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
1868   EXTRACT_FMT_0_ADD_CODE
1869
1870   CPU (h_gr[f_r1]) = MULSI (OPRND (dr), OPRND (sr));
1871   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1872
1873 #if WITH_PROFILE_MODEL_P
1874   if (PROFILE_MODEL_P (current_cpu))
1875     {
1876       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1877       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1878       m32rx_model_profile_insn (current_cpu, abuf);
1879     }
1880 #endif
1881
1882   return new_pc;
1883 #undef OPRND
1884 }
1885
1886 /* Perform mulhi-a: mulhi $src1,$src2,$acc.  */
1887 CIA
1888 SEM_FN_NAME (m32rx,mulhi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1889 {
1890   insn_t insn = SEM_INSN (sem_arg);
1891 #define OPRND(f) par_exec->operands.fmt_38_mulhi_a.f
1892   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1893   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1894   EXTRACT_FMT_38_MULHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
1895   EXTRACT_FMT_38_MULHI_A_CODE
1896
1897 m32rx_h_accums_set (current_cpu, f_acc, SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (OPRND (src1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (OPRND (src2), 16)))), 16), 16));
1898   TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
1899
1900 #if WITH_PROFILE_MODEL_P
1901   if (PROFILE_MODEL_P (current_cpu))
1902     {
1903       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1904       m32rx_model_profile_insn (current_cpu, abuf);
1905     }
1906 #endif
1907
1908   return new_pc;
1909 #undef OPRND
1910 }
1911
1912 /* Perform mullo-a: mullo $src1,$src2,$acc.  */
1913 CIA
1914 SEM_FN_NAME (m32rx,mullo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1915 {
1916   insn_t insn = SEM_INSN (sem_arg);
1917 #define OPRND(f) par_exec->operands.fmt_38_mulhi_a.f
1918   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1919   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1920   EXTRACT_FMT_38_MULHI_A_VARS /* f-op1 f-r1 f-acc f-op23 f-r2 */
1921   EXTRACT_FMT_38_MULHI_A_CODE
1922
1923 m32rx_h_accums_set (current_cpu, f_acc, SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (OPRND (src1), 16)), EXTHIDI (TRUNCSIHI (OPRND (src2)))), 16), 16));
1924   TRACE_RESULT (current_cpu, "acc", 'D', m32rx_h_accums_get (current_cpu, f_acc));
1925
1926 #if WITH_PROFILE_MODEL_P
1927   if (PROFILE_MODEL_P (current_cpu))
1928     {
1929       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1930       m32rx_model_profile_insn (current_cpu, abuf);
1931     }
1932 #endif
1933
1934   return new_pc;
1935 #undef OPRND
1936 }
1937
1938 /* Perform mv: mv $dr,$sr.  */
1939 CIA
1940 SEM_FN_NAME (m32rx,mv) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1941 {
1942   insn_t insn = SEM_INSN (sem_arg);
1943 #define OPRND(f) par_exec->operands.fmt_39_mv.f
1944   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1945   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1946   EXTRACT_FMT_39_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
1947   EXTRACT_FMT_39_MV_CODE
1948
1949   CPU (h_gr[f_r1]) = OPRND (sr);
1950   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1951
1952 #if WITH_PROFILE_MODEL_P
1953   if (PROFILE_MODEL_P (current_cpu))
1954     {
1955       m32rx_model_mark_get_h_gr (current_cpu, abuf);
1956       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1957       m32rx_model_profile_insn (current_cpu, abuf);
1958     }
1959 #endif
1960
1961   return new_pc;
1962 #undef OPRND
1963 }
1964
1965 /* Perform mvfachi-a: mvfachi $dr,$accs.  */
1966 CIA
1967 SEM_FN_NAME (m32rx,mvfachi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1968 {
1969   insn_t insn = SEM_INSN (sem_arg);
1970 #define OPRND(f) par_exec->operands.fmt_40_mvfachi_a.f
1971   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1972   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1973   EXTRACT_FMT_40_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
1974   EXTRACT_FMT_40_MVFACHI_A_CODE
1975
1976   CPU (h_gr[f_r1]) = TRUNCDISI (SRADI (OPRND (accs), 32));
1977   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
1978
1979 #if WITH_PROFILE_MODEL_P
1980   if (PROFILE_MODEL_P (current_cpu))
1981     {
1982       m32rx_model_mark_set_h_gr (current_cpu, abuf);
1983       m32rx_model_profile_insn (current_cpu, abuf);
1984     }
1985 #endif
1986
1987   return new_pc;
1988 #undef OPRND
1989 }
1990
1991 /* Perform mvfaclo-a: mvfaclo $dr,$accs.  */
1992 CIA
1993 SEM_FN_NAME (m32rx,mvfaclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
1994 {
1995   insn_t insn = SEM_INSN (sem_arg);
1996 #define OPRND(f) par_exec->operands.fmt_40_mvfachi_a.f
1997   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
1998   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
1999   EXTRACT_FMT_40_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2000   EXTRACT_FMT_40_MVFACHI_A_CODE
2001
2002   CPU (h_gr[f_r1]) = TRUNCDISI (OPRND (accs));
2003   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2004
2005 #if WITH_PROFILE_MODEL_P
2006   if (PROFILE_MODEL_P (current_cpu))
2007     {
2008       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2009       m32rx_model_profile_insn (current_cpu, abuf);
2010     }
2011 #endif
2012
2013   return new_pc;
2014 #undef OPRND
2015 }
2016
2017 /* Perform mvfacmi-a: mvfacmi $dr,$accs.  */
2018 CIA
2019 SEM_FN_NAME (m32rx,mvfacmi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2020 {
2021   insn_t insn = SEM_INSN (sem_arg);
2022 #define OPRND(f) par_exec->operands.fmt_40_mvfachi_a.f
2023   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2024   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2025   EXTRACT_FMT_40_MVFACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2026   EXTRACT_FMT_40_MVFACHI_A_CODE
2027
2028   CPU (h_gr[f_r1]) = TRUNCDISI (SRADI (OPRND (accs), 16));
2029   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2030
2031 #if WITH_PROFILE_MODEL_P
2032   if (PROFILE_MODEL_P (current_cpu))
2033     {
2034       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2035       m32rx_model_profile_insn (current_cpu, abuf);
2036     }
2037 #endif
2038
2039   return new_pc;
2040 #undef OPRND
2041 }
2042
2043 /* Perform mvfc: mvfc $dr,$scr.  */
2044 CIA
2045 SEM_FN_NAME (m32rx,mvfc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2046 {
2047   insn_t insn = SEM_INSN (sem_arg);
2048 #define OPRND(f) par_exec->operands.fmt_41_mvfc.f
2049   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2050   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2051   EXTRACT_FMT_41_MVFC_VARS /* f-op1 f-r1 f-op2 f-r2 */
2052   EXTRACT_FMT_41_MVFC_CODE
2053
2054   CPU (h_gr[f_r1]) = OPRND (scr);
2055   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2056
2057 #if WITH_PROFILE_MODEL_P
2058   if (PROFILE_MODEL_P (current_cpu))
2059     {
2060       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2061       m32rx_model_profile_insn (current_cpu, abuf);
2062     }
2063 #endif
2064
2065   return new_pc;
2066 #undef OPRND
2067 }
2068
2069 /* Perform mvtachi-a: mvtachi $src1,$accs.  */
2070 CIA
2071 SEM_FN_NAME (m32rx,mvtachi_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2072 {
2073   insn_t insn = SEM_INSN (sem_arg);
2074 #define OPRND(f) par_exec->operands.fmt_42_mvtachi_a.f
2075   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2076   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2077   EXTRACT_FMT_42_MVTACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2078   EXTRACT_FMT_42_MVTACHI_A_CODE
2079
2080 m32rx_h_accums_set (current_cpu, f_accs, ORDI (ANDDI (OPRND (accs), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (OPRND (src1)), 32)));
2081   TRACE_RESULT (current_cpu, "accs", 'D', m32rx_h_accums_get (current_cpu, f_accs));
2082
2083 #if WITH_PROFILE_MODEL_P
2084   if (PROFILE_MODEL_P (current_cpu))
2085     {
2086       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2087       m32rx_model_profile_insn (current_cpu, abuf);
2088     }
2089 #endif
2090
2091   return new_pc;
2092 #undef OPRND
2093 }
2094
2095 /* Perform mvtaclo-a: mvtaclo $src1,$accs.  */
2096 CIA
2097 SEM_FN_NAME (m32rx,mvtaclo_a) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2098 {
2099   insn_t insn = SEM_INSN (sem_arg);
2100 #define OPRND(f) par_exec->operands.fmt_42_mvtachi_a.f
2101   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2102   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2103   EXTRACT_FMT_42_MVTACHI_A_VARS /* f-op1 f-r1 f-op2 f-accs f-op3 */
2104   EXTRACT_FMT_42_MVTACHI_A_CODE
2105
2106 m32rx_h_accums_set (current_cpu, f_accs, ORDI (ANDDI (OPRND (accs), MAKEDI (0xffffffff, 0)), ZEXTSIDI (OPRND (src1))));
2107   TRACE_RESULT (current_cpu, "accs", 'D', m32rx_h_accums_get (current_cpu, f_accs));
2108
2109 #if WITH_PROFILE_MODEL_P
2110   if (PROFILE_MODEL_P (current_cpu))
2111     {
2112       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2113       m32rx_model_profile_insn (current_cpu, abuf);
2114     }
2115 #endif
2116
2117   return new_pc;
2118 #undef OPRND
2119 }
2120
2121 /* Perform mvtc: mvtc $sr,$dcr.  */
2122 CIA
2123 SEM_FN_NAME (m32rx,mvtc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2124 {
2125   insn_t insn = SEM_INSN (sem_arg);
2126 #define OPRND(f) par_exec->operands.fmt_43_mvtc.f
2127   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2128   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2129   EXTRACT_FMT_43_MVTC_VARS /* f-op1 f-r1 f-op2 f-r2 */
2130   EXTRACT_FMT_43_MVTC_CODE
2131
2132 m32rx_h_cr_set (current_cpu, f_r1, OPRND (sr));
2133   TRACE_RESULT (current_cpu, "dcr", 'x', m32rx_h_cr_get (current_cpu, f_r1));
2134
2135 #if WITH_PROFILE_MODEL_P
2136   if (PROFILE_MODEL_P (current_cpu))
2137     {
2138       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2139       m32rx_model_profile_insn (current_cpu, abuf);
2140     }
2141 #endif
2142
2143   return new_pc;
2144 #undef OPRND
2145 }
2146
2147 /* Perform neg: neg $dr,$sr.  */
2148 CIA
2149 SEM_FN_NAME (m32rx,neg) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2150 {
2151   insn_t insn = SEM_INSN (sem_arg);
2152 #define OPRND(f) par_exec->operands.fmt_39_mv.f
2153   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2154   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2155   EXTRACT_FMT_39_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
2156   EXTRACT_FMT_39_MV_CODE
2157
2158   CPU (h_gr[f_r1]) = NEGSI (OPRND (sr));
2159   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2160
2161 #if WITH_PROFILE_MODEL_P
2162   if (PROFILE_MODEL_P (current_cpu))
2163     {
2164       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2165       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2166       m32rx_model_profile_insn (current_cpu, abuf);
2167     }
2168 #endif
2169
2170   return new_pc;
2171 #undef OPRND
2172 }
2173
2174 /* Perform nop: nop.  */
2175 CIA
2176 SEM_FN_NAME (m32rx,nop) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2177 {
2178   insn_t insn = SEM_INSN (sem_arg);
2179 #define OPRND(f) par_exec->operands.fmt_44_nop.f
2180   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2181   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2182   EXTRACT_FMT_44_NOP_VARS /* f-op1 f-r1 f-op2 f-r2 */
2183   EXTRACT_FMT_44_NOP_CODE
2184
2185 PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr);
2186
2187 #if WITH_PROFILE_MODEL_P
2188   if (PROFILE_MODEL_P (current_cpu))
2189     {
2190       m32rx_model_profile_insn (current_cpu, abuf);
2191     }
2192 #endif
2193
2194   return new_pc;
2195 #undef OPRND
2196 }
2197
2198 /* Perform not: not $dr,$sr.  */
2199 CIA
2200 SEM_FN_NAME (m32rx,not) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2201 {
2202   insn_t insn = SEM_INSN (sem_arg);
2203 #define OPRND(f) par_exec->operands.fmt_39_mv.f
2204   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2205   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2206   EXTRACT_FMT_39_MV_VARS /* f-op1 f-r1 f-op2 f-r2 */
2207   EXTRACT_FMT_39_MV_CODE
2208
2209   CPU (h_gr[f_r1]) = INVSI (OPRND (sr));
2210   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2211
2212 #if WITH_PROFILE_MODEL_P
2213   if (PROFILE_MODEL_P (current_cpu))
2214     {
2215       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2216       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2217       m32rx_model_profile_insn (current_cpu, abuf);
2218     }
2219 #endif
2220
2221   return new_pc;
2222 #undef OPRND
2223 }
2224
2225 /* Perform rac-dsi: rac $accd,$accs,#$imm1.  */
2226 CIA
2227 SEM_FN_NAME (m32rx,rac_dsi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2228 {
2229   insn_t insn = SEM_INSN (sem_arg);
2230 #define OPRND(f) par_exec->operands.fmt_45_rac_dsi.f
2231   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2232   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2233   EXTRACT_FMT_45_RAC_DSI_VARS /* f-op1 f-accd f-bits67 f-op2 f-accs f-bit14 f-imm1 */
2234   EXTRACT_FMT_45_RAC_DSI_CODE
2235
2236 do {
2237   DI tmp_tmp1;
2238   tmp_tmp1 = SLLDI (OPRND (accs), OPRND (imm1));
2239   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768));
2240 m32rx_h_accums_set (current_cpu, f_accd, (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000))));
2241   TRACE_RESULT (current_cpu, "accd", 'D', m32rx_h_accums_get (current_cpu, f_accd));
2242 } while (0);
2243
2244 #if WITH_PROFILE_MODEL_P
2245   if (PROFILE_MODEL_P (current_cpu))
2246     {
2247       m32rx_model_profile_insn (current_cpu, abuf);
2248     }
2249 #endif
2250
2251   return new_pc;
2252 #undef OPRND
2253 }
2254
2255 /* Perform rach-dsi: rach $accd,$accs,#$imm1.  */
2256 CIA
2257 SEM_FN_NAME (m32rx,rach_dsi) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2258 {
2259   insn_t insn = SEM_INSN (sem_arg);
2260 #define OPRND(f) par_exec->operands.fmt_45_rac_dsi.f
2261   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2262   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2263   EXTRACT_FMT_45_RAC_DSI_VARS /* f-op1 f-accd f-bits67 f-op2 f-accs f-bit14 f-imm1 */
2264   EXTRACT_FMT_45_RAC_DSI_CODE
2265
2266 do {
2267   DI tmp_tmp1;
2268   tmp_tmp1 = SLLDI (OPRND (accs), OPRND (imm1));
2269   tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 0x80000000));
2270 m32rx_h_accums_set (current_cpu, f_accd, (GTDI (tmp_tmp1, MAKEDI (32767, 0))) ? (MAKEDI (32767, 0)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0))));
2271   TRACE_RESULT (current_cpu, "accd", 'D', m32rx_h_accums_get (current_cpu, f_accd));
2272 } while (0);
2273
2274 #if WITH_PROFILE_MODEL_P
2275   if (PROFILE_MODEL_P (current_cpu))
2276     {
2277       m32rx_model_profile_insn (current_cpu, abuf);
2278     }
2279 #endif
2280
2281   return new_pc;
2282 #undef OPRND
2283 }
2284
2285 /* Perform rte: rte.  */
2286 CIA
2287 SEM_FN_NAME (m32rx,rte) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2288 {
2289   insn_t insn = SEM_INSN (sem_arg);
2290 #define OPRND(f) par_exec->operands.fmt_46_rte.f
2291   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2292   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2293   int taken_p = 0;
2294   EXTRACT_FMT_46_RTE_VARS /* f-op1 f-r1 f-op2 f-r2 */
2295   EXTRACT_FMT_46_RTE_CODE
2296
2297 do {
2298   CPU (h_sm) = OPRND (h_bsm_0);
2299   TRACE_RESULT (current_cpu, "h-sm-0", 'x', CPU (h_sm));
2300   CPU (h_ie) = OPRND (h_bie_0);
2301   TRACE_RESULT (current_cpu, "h-ie-0", 'x', CPU (h_ie));
2302   CPU (h_cond) = OPRND (h_bcond_0);
2303   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
2304   BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, OPRND (h_bpc_0)));
2305   TRACE_RESULT (current_cpu, "pc", 'x', CPU (h_pc));
2306 } while (0);
2307
2308 #if WITH_PROFILE_MODEL_P
2309   if (PROFILE_MODEL_P (current_cpu))
2310     {
2311       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
2312     }
2313 #endif
2314
2315   return new_pc;
2316 #undef OPRND
2317 }
2318
2319 /* Perform seth: seth $dr,#$hi16.  */
2320 CIA
2321 SEM_FN_NAME (m32rx,seth) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2322 {
2323   insn_t insn = SEM_INSN (sem_arg);
2324 #define OPRND(f) par_exec->operands.fmt_47_seth.f
2325   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2326   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2327   EXTRACT_FMT_47_SETH_VARS /* f-op1 f-r1 f-op2 f-r2 f-hi16 */
2328   EXTRACT_FMT_47_SETH_CODE
2329
2330   CPU (h_gr[f_r1]) = SLLSI (OPRND (hi16), 16);
2331   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2332
2333 #if WITH_PROFILE_MODEL_P
2334   if (PROFILE_MODEL_P (current_cpu))
2335     {
2336       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2337       m32rx_model_profile_insn (current_cpu, abuf);
2338     }
2339 #endif
2340
2341   return new_pc;
2342 #undef OPRND
2343 }
2344
2345 /* Perform sll: sll $dr,$sr.  */
2346 CIA
2347 SEM_FN_NAME (m32rx,sll) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2348 {
2349   insn_t insn = SEM_INSN (sem_arg);
2350 #define OPRND(f) par_exec->operands.fmt_0_add.f
2351   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2352   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2353   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2354   EXTRACT_FMT_0_ADD_CODE
2355
2356   CPU (h_gr[f_r1]) = SLLSI (OPRND (dr), ANDSI (OPRND (sr), 31));
2357   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2358
2359 #if WITH_PROFILE_MODEL_P
2360   if (PROFILE_MODEL_P (current_cpu))
2361     {
2362       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2363       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2364       m32rx_model_profile_insn (current_cpu, abuf);
2365     }
2366 #endif
2367
2368   return new_pc;
2369 #undef OPRND
2370 }
2371
2372 /* Perform sll3: sll3 $dr,$sr,#$simm16.  */
2373 CIA
2374 SEM_FN_NAME (m32rx,sll3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2375 {
2376   insn_t insn = SEM_INSN (sem_arg);
2377 #define OPRND(f) par_exec->operands.fmt_48_sll3.f
2378   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2379   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2380   EXTRACT_FMT_48_SLL3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2381   EXTRACT_FMT_48_SLL3_CODE
2382
2383   CPU (h_gr[f_r1]) = SLLSI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2384   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2385
2386 #if WITH_PROFILE_MODEL_P
2387   if (PROFILE_MODEL_P (current_cpu))
2388     {
2389       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2390       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2391       m32rx_model_profile_insn (current_cpu, abuf);
2392     }
2393 #endif
2394
2395   return new_pc;
2396 #undef OPRND
2397 }
2398
2399 /* Perform slli: slli $dr,#$uimm5.  */
2400 CIA
2401 SEM_FN_NAME (m32rx,slli) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2402 {
2403   insn_t insn = SEM_INSN (sem_arg);
2404 #define OPRND(f) par_exec->operands.fmt_49_slli.f
2405   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2406   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2407   EXTRACT_FMT_49_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2408   EXTRACT_FMT_49_SLLI_CODE
2409
2410   CPU (h_gr[f_r1]) = SLLSI (OPRND (dr), OPRND (uimm5));
2411   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2412
2413 #if WITH_PROFILE_MODEL_P
2414   if (PROFILE_MODEL_P (current_cpu))
2415     {
2416       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2417       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2418       m32rx_model_profile_insn (current_cpu, abuf);
2419     }
2420 #endif
2421
2422   return new_pc;
2423 #undef OPRND
2424 }
2425
2426 /* Perform sra: sra $dr,$sr.  */
2427 CIA
2428 SEM_FN_NAME (m32rx,sra) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2429 {
2430   insn_t insn = SEM_INSN (sem_arg);
2431 #define OPRND(f) par_exec->operands.fmt_0_add.f
2432   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2433   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2434   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2435   EXTRACT_FMT_0_ADD_CODE
2436
2437   CPU (h_gr[f_r1]) = SRASI (OPRND (dr), ANDSI (OPRND (sr), 31));
2438   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2439
2440 #if WITH_PROFILE_MODEL_P
2441   if (PROFILE_MODEL_P (current_cpu))
2442     {
2443       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2444       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2445       m32rx_model_profile_insn (current_cpu, abuf);
2446     }
2447 #endif
2448
2449   return new_pc;
2450 #undef OPRND
2451 }
2452
2453 /* Perform sra3: sra3 $dr,$sr,#$simm16.  */
2454 CIA
2455 SEM_FN_NAME (m32rx,sra3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2456 {
2457   insn_t insn = SEM_INSN (sem_arg);
2458 #define OPRND(f) par_exec->operands.fmt_48_sll3.f
2459   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2460   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2461   EXTRACT_FMT_48_SLL3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2462   EXTRACT_FMT_48_SLL3_CODE
2463
2464   CPU (h_gr[f_r1]) = SRASI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2465   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2466
2467 #if WITH_PROFILE_MODEL_P
2468   if (PROFILE_MODEL_P (current_cpu))
2469     {
2470       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2471       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2472       m32rx_model_profile_insn (current_cpu, abuf);
2473     }
2474 #endif
2475
2476   return new_pc;
2477 #undef OPRND
2478 }
2479
2480 /* Perform srai: srai $dr,#$uimm5.  */
2481 CIA
2482 SEM_FN_NAME (m32rx,srai) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2483 {
2484   insn_t insn = SEM_INSN (sem_arg);
2485 #define OPRND(f) par_exec->operands.fmt_49_slli.f
2486   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2487   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2488   EXTRACT_FMT_49_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2489   EXTRACT_FMT_49_SLLI_CODE
2490
2491   CPU (h_gr[f_r1]) = SRASI (OPRND (dr), OPRND (uimm5));
2492   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2493
2494 #if WITH_PROFILE_MODEL_P
2495   if (PROFILE_MODEL_P (current_cpu))
2496     {
2497       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2498       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2499       m32rx_model_profile_insn (current_cpu, abuf);
2500     }
2501 #endif
2502
2503   return new_pc;
2504 #undef OPRND
2505 }
2506
2507 /* Perform srl: srl $dr,$sr.  */
2508 CIA
2509 SEM_FN_NAME (m32rx,srl) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2510 {
2511   insn_t insn = SEM_INSN (sem_arg);
2512 #define OPRND(f) par_exec->operands.fmt_0_add.f
2513   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2514   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2515   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2516   EXTRACT_FMT_0_ADD_CODE
2517
2518   CPU (h_gr[f_r1]) = SRLSI (OPRND (dr), ANDSI (OPRND (sr), 31));
2519   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2520
2521 #if WITH_PROFILE_MODEL_P
2522   if (PROFILE_MODEL_P (current_cpu))
2523     {
2524       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2525       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2526       m32rx_model_profile_insn (current_cpu, abuf);
2527     }
2528 #endif
2529
2530   return new_pc;
2531 #undef OPRND
2532 }
2533
2534 /* Perform srl3: srl3 $dr,$sr,#$simm16.  */
2535 CIA
2536 SEM_FN_NAME (m32rx,srl3) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2537 {
2538   insn_t insn = SEM_INSN (sem_arg);
2539 #define OPRND(f) par_exec->operands.fmt_48_sll3.f
2540   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2541   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2542   EXTRACT_FMT_48_SLL3_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2543   EXTRACT_FMT_48_SLL3_CODE
2544
2545   CPU (h_gr[f_r1]) = SRLSI (OPRND (sr), ANDSI (OPRND (simm16), 31));
2546   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2547
2548 #if WITH_PROFILE_MODEL_P
2549   if (PROFILE_MODEL_P (current_cpu))
2550     {
2551       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2552       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2553       m32rx_model_profile_insn (current_cpu, abuf);
2554     }
2555 #endif
2556
2557   return new_pc;
2558 #undef OPRND
2559 }
2560
2561 /* Perform srli: srli $dr,#$uimm5.  */
2562 CIA
2563 SEM_FN_NAME (m32rx,srli) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2564 {
2565   insn_t insn = SEM_INSN (sem_arg);
2566 #define OPRND(f) par_exec->operands.fmt_49_slli.f
2567   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2568   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2569   EXTRACT_FMT_49_SLLI_VARS /* f-op1 f-r1 f-shift-op2 f-uimm5 */
2570   EXTRACT_FMT_49_SLLI_CODE
2571
2572   CPU (h_gr[f_r1]) = SRLSI (OPRND (dr), OPRND (uimm5));
2573   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2574
2575 #if WITH_PROFILE_MODEL_P
2576   if (PROFILE_MODEL_P (current_cpu))
2577     {
2578       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2579       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2580       m32rx_model_profile_insn (current_cpu, abuf);
2581     }
2582 #endif
2583
2584   return new_pc;
2585 #undef OPRND
2586 }
2587
2588 /* Perform st: st $src1,@$src2.  */
2589 CIA
2590 SEM_FN_NAME (m32rx,st) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2591 {
2592   insn_t insn = SEM_INSN (sem_arg);
2593 #define OPRND(f) par_exec->operands.fmt_50_st.f
2594   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2595   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2596   EXTRACT_FMT_50_ST_VARS /* f-op1 f-r1 f-op2 f-r2 */
2597   EXTRACT_FMT_50_ST_CODE
2598
2599 SETMEMSI (current_cpu, OPRND (src2), OPRND (src1));
2600   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMSI (current_cpu, OPRND (src2)));
2601
2602 #if WITH_PROFILE_MODEL_P
2603   if (PROFILE_MODEL_P (current_cpu))
2604     {
2605       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2606       m32rx_model_profile_insn (current_cpu, abuf);
2607     }
2608 #endif
2609
2610   return new_pc;
2611 #undef OPRND
2612 }
2613
2614 /* Perform st-d: st $src1,@($slo16,$src2).  */
2615 CIA
2616 SEM_FN_NAME (m32rx,st_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2617 {
2618   insn_t insn = SEM_INSN (sem_arg);
2619 #define OPRND(f) par_exec->operands.fmt_51_st_d.f
2620   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2621   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2622   EXTRACT_FMT_51_ST_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2623   EXTRACT_FMT_51_ST_D_CODE
2624
2625 SETMEMSI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
2626   TRACE_RESULT (current_cpu, "h-memory-add-WI-src2-slo16", 'x', GETMEMSI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
2627
2628 #if WITH_PROFILE_MODEL_P
2629   if (PROFILE_MODEL_P (current_cpu))
2630     {
2631       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2632       m32rx_model_profile_insn (current_cpu, abuf);
2633     }
2634 #endif
2635
2636   return new_pc;
2637 #undef OPRND
2638 }
2639
2640 /* Perform stb: stb $src1,@$src2.  */
2641 CIA
2642 SEM_FN_NAME (m32rx,stb) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2643 {
2644   insn_t insn = SEM_INSN (sem_arg);
2645 #define OPRND(f) par_exec->operands.fmt_52_stb.f
2646   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2647   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2648   EXTRACT_FMT_52_STB_VARS /* f-op1 f-r1 f-op2 f-r2 */
2649   EXTRACT_FMT_52_STB_CODE
2650
2651 SETMEMQI (current_cpu, OPRND (src2), OPRND (src1));
2652   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMQI (current_cpu, OPRND (src2)));
2653
2654 #if WITH_PROFILE_MODEL_P
2655   if (PROFILE_MODEL_P (current_cpu))
2656     {
2657       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2658       m32rx_model_profile_insn (current_cpu, abuf);
2659     }
2660 #endif
2661
2662   return new_pc;
2663 #undef OPRND
2664 }
2665
2666 /* Perform stb-d: stb $src1,@($slo16,$src2).  */
2667 CIA
2668 SEM_FN_NAME (m32rx,stb_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2669 {
2670   insn_t insn = SEM_INSN (sem_arg);
2671 #define OPRND(f) par_exec->operands.fmt_53_stb_d.f
2672   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2673   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2674   EXTRACT_FMT_53_STB_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2675   EXTRACT_FMT_53_STB_D_CODE
2676
2677 SETMEMQI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
2678   TRACE_RESULT (current_cpu, "h-memory-add-WI-src2-slo16", 'x', GETMEMQI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
2679
2680 #if WITH_PROFILE_MODEL_P
2681   if (PROFILE_MODEL_P (current_cpu))
2682     {
2683       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2684       m32rx_model_profile_insn (current_cpu, abuf);
2685     }
2686 #endif
2687
2688   return new_pc;
2689 #undef OPRND
2690 }
2691
2692 /* Perform sth: sth $src1,@$src2.  */
2693 CIA
2694 SEM_FN_NAME (m32rx,sth) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2695 {
2696   insn_t insn = SEM_INSN (sem_arg);
2697 #define OPRND(f) par_exec->operands.fmt_54_sth.f
2698   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2699   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2700   EXTRACT_FMT_54_STH_VARS /* f-op1 f-r1 f-op2 f-r2 */
2701   EXTRACT_FMT_54_STH_CODE
2702
2703 SETMEMHI (current_cpu, OPRND (src2), OPRND (src1));
2704   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMHI (current_cpu, OPRND (src2)));
2705
2706 #if WITH_PROFILE_MODEL_P
2707   if (PROFILE_MODEL_P (current_cpu))
2708     {
2709       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2710       m32rx_model_profile_insn (current_cpu, abuf);
2711     }
2712 #endif
2713
2714   return new_pc;
2715 #undef OPRND
2716 }
2717
2718 /* Perform sth-d: sth $src1,@($slo16,$src2).  */
2719 CIA
2720 SEM_FN_NAME (m32rx,sth_d) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2721 {
2722   insn_t insn = SEM_INSN (sem_arg);
2723 #define OPRND(f) par_exec->operands.fmt_55_sth_d.f
2724   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2725   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2726   EXTRACT_FMT_55_STH_D_VARS /* f-op1 f-r1 f-op2 f-r2 f-simm16 */
2727   EXTRACT_FMT_55_STH_D_CODE
2728
2729 SETMEMHI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16)), OPRND (src1));
2730   TRACE_RESULT (current_cpu, "h-memory-add-WI-src2-slo16", 'x', GETMEMHI (current_cpu, ADDSI (OPRND (src2), OPRND (slo16))));
2731
2732 #if WITH_PROFILE_MODEL_P
2733   if (PROFILE_MODEL_P (current_cpu))
2734     {
2735       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2736       m32rx_model_profile_insn (current_cpu, abuf);
2737     }
2738 #endif
2739
2740   return new_pc;
2741 #undef OPRND
2742 }
2743
2744 /* Perform st-plus: st $src1,@+$src2.  */
2745 CIA
2746 SEM_FN_NAME (m32rx,st_plus) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2747 {
2748   insn_t insn = SEM_INSN (sem_arg);
2749 #define OPRND(f) par_exec->operands.fmt_56_st_plus.f
2750   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2751   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2752   EXTRACT_FMT_56_ST_PLUS_VARS /* f-op1 f-r1 f-op2 f-r2 */
2753   EXTRACT_FMT_56_ST_PLUS_CODE
2754
2755 do {
2756   SI tmp_new_src2;
2757   tmp_new_src2 = ADDSI (OPRND (src2), 4);
2758 SETMEMSI (current_cpu, tmp_new_src2, OPRND (src1));
2759   TRACE_RESULT (current_cpu, "h-memory-new-src2", 'x', GETMEMSI (current_cpu, tmp_new_src2));
2760   CPU (h_gr[f_r2]) = tmp_new_src2;
2761   TRACE_RESULT (current_cpu, "src2", 'x', CPU (h_gr[f_r2]));
2762 } while (0);
2763
2764 #if WITH_PROFILE_MODEL_P
2765   if (PROFILE_MODEL_P (current_cpu))
2766     {
2767       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2768       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2769       m32rx_model_profile_insn (current_cpu, abuf);
2770     }
2771 #endif
2772
2773   return new_pc;
2774 #undef OPRND
2775 }
2776
2777 /* Perform st-minus: st $src1,@-$src2.  */
2778 CIA
2779 SEM_FN_NAME (m32rx,st_minus) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2780 {
2781   insn_t insn = SEM_INSN (sem_arg);
2782 #define OPRND(f) par_exec->operands.fmt_56_st_plus.f
2783   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2784   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2785   EXTRACT_FMT_56_ST_PLUS_VARS /* f-op1 f-r1 f-op2 f-r2 */
2786   EXTRACT_FMT_56_ST_PLUS_CODE
2787
2788 do {
2789   SI tmp_new_src2;
2790   tmp_new_src2 = SUBSI (OPRND (src2), 4);
2791 SETMEMSI (current_cpu, tmp_new_src2, OPRND (src1));
2792   TRACE_RESULT (current_cpu, "h-memory-new-src2", 'x', GETMEMSI (current_cpu, tmp_new_src2));
2793   CPU (h_gr[f_r2]) = tmp_new_src2;
2794   TRACE_RESULT (current_cpu, "src2", 'x', CPU (h_gr[f_r2]));
2795 } while (0);
2796
2797 #if WITH_PROFILE_MODEL_P
2798   if (PROFILE_MODEL_P (current_cpu))
2799     {
2800       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2801       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2802       m32rx_model_profile_insn (current_cpu, abuf);
2803     }
2804 #endif
2805
2806   return new_pc;
2807 #undef OPRND
2808 }
2809
2810 /* Perform sub: sub $dr,$sr.  */
2811 CIA
2812 SEM_FN_NAME (m32rx,sub) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2813 {
2814   insn_t insn = SEM_INSN (sem_arg);
2815 #define OPRND(f) par_exec->operands.fmt_0_add.f
2816   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2817   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2818   EXTRACT_FMT_0_ADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
2819   EXTRACT_FMT_0_ADD_CODE
2820
2821   CPU (h_gr[f_r1]) = SUBSI (OPRND (dr), OPRND (sr));
2822   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2823
2824 #if WITH_PROFILE_MODEL_P
2825   if (PROFILE_MODEL_P (current_cpu))
2826     {
2827       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2828       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2829       m32rx_model_profile_insn (current_cpu, abuf);
2830     }
2831 #endif
2832
2833   return new_pc;
2834 #undef OPRND
2835 }
2836
2837 /* Perform subv: subv $dr,$sr.  */
2838 CIA
2839 SEM_FN_NAME (m32rx,subv) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2840 {
2841   insn_t insn = SEM_INSN (sem_arg);
2842 #define OPRND(f) par_exec->operands.fmt_5_addv.f
2843   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2844   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2845   EXTRACT_FMT_5_ADDV_VARS /* f-op1 f-r1 f-op2 f-r2 */
2846   EXTRACT_FMT_5_ADDV_CODE
2847
2848 do {
2849   BI temp1;SI temp0;
2850   temp0 = SUBSI (OPRND (dr), OPRND (sr));
2851   temp1 = SUBOFSI (OPRND (dr), OPRND (sr), 0);
2852   CPU (h_gr[f_r1]) = temp0;
2853   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2854   CPU (h_cond) = temp1;
2855   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
2856 } while (0);
2857
2858 #if WITH_PROFILE_MODEL_P
2859   if (PROFILE_MODEL_P (current_cpu))
2860     {
2861       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2862       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2863       m32rx_model_profile_insn (current_cpu, abuf);
2864     }
2865 #endif
2866
2867   return new_pc;
2868 #undef OPRND
2869 }
2870
2871 /* Perform subx: subx $dr,$sr.  */
2872 CIA
2873 SEM_FN_NAME (m32rx,subx) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2874 {
2875   insn_t insn = SEM_INSN (sem_arg);
2876 #define OPRND(f) par_exec->operands.fmt_7_addx.f
2877   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2878   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2879   EXTRACT_FMT_7_ADDX_VARS /* f-op1 f-r1 f-op2 f-r2 */
2880   EXTRACT_FMT_7_ADDX_CODE
2881
2882 do {
2883   BI temp1;SI temp0;
2884   temp0 = SUBCSI (OPRND (dr), OPRND (sr), OPRND (condbit));
2885   temp1 = SUBCFSI (OPRND (dr), OPRND (sr), OPRND (condbit));
2886   CPU (h_gr[f_r1]) = temp0;
2887   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2888   CPU (h_cond) = temp1;
2889   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
2890 } while (0);
2891
2892 #if WITH_PROFILE_MODEL_P
2893   if (PROFILE_MODEL_P (current_cpu))
2894     {
2895       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2896       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2897       m32rx_model_profile_insn (current_cpu, abuf);
2898     }
2899 #endif
2900
2901   return new_pc;
2902 #undef OPRND
2903 }
2904
2905 /* Perform trap: trap #$uimm4.  */
2906 CIA
2907 SEM_FN_NAME (m32rx,trap) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2908 {
2909   insn_t insn = SEM_INSN (sem_arg);
2910 #define OPRND(f) par_exec->operands.fmt_57_trap.f
2911   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2912   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2913   int taken_p = 0;
2914   EXTRACT_FMT_57_TRAP_VARS /* f-op1 f-r1 f-op2 f-uimm4 */
2915   EXTRACT_FMT_57_TRAP_CODE
2916
2917 do {
2918 m32rx_h_cr_set (current_cpu, 6, ADDSI (OPRND (pc), 4));
2919   TRACE_RESULT (current_cpu, "h-cr-6", 'x', m32rx_h_cr_get (current_cpu, 6));
2920 m32rx_h_cr_set (current_cpu, 0, ANDSI (SRLSI (OPRND (h_cr_0), 8), 33488896));
2921   TRACE_RESULT (current_cpu, "h-cr-0", 'x', m32rx_h_cr_get (current_cpu, 0));
2922 do_trap (current_cpu, OPRND (uimm4));
2923 ; /*clobber*/
2924 } while (0);
2925
2926 #if WITH_PROFILE_MODEL_P
2927   if (PROFILE_MODEL_P (current_cpu))
2928     {
2929       m32rx_model_profile_cti_insn (current_cpu, abuf, taken_p);
2930     }
2931 #endif
2932
2933   return new_pc;
2934 #undef OPRND
2935 }
2936
2937 /* Perform unlock: unlock $src1,@$src2.  */
2938 CIA
2939 SEM_FN_NAME (m32rx,unlock) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2940 {
2941   insn_t insn = SEM_INSN (sem_arg);
2942 #define OPRND(f) par_exec->operands.fmt_58_unlock.f
2943   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2944   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
2945   EXTRACT_FMT_58_UNLOCK_VARS /* f-op1 f-r1 f-op2 f-r2 */
2946   EXTRACT_FMT_58_UNLOCK_CODE
2947
2948 do {
2949 if (OPRND (h_lock_0)) {
2950 SETMEMSI (current_cpu, OPRND (src2), OPRND (src1));
2951   TRACE_RESULT (current_cpu, "h-memory-src2", 'x', GETMEMSI (current_cpu, OPRND (src2)));
2952 }
2953   CPU (h_lock) = 0;
2954   TRACE_RESULT (current_cpu, "h-lock-0", 'x', CPU (h_lock));
2955 } while (0);
2956
2957 #if WITH_PROFILE_MODEL_P
2958   if (PROFILE_MODEL_P (current_cpu))
2959     {
2960       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2961       m32rx_model_profile_insn (current_cpu, abuf);
2962     }
2963 #endif
2964
2965   return new_pc;
2966 #undef OPRND
2967 }
2968
2969 /* Perform satb: satb $dr,$sr.  */
2970 CIA
2971 SEM_FN_NAME (m32rx,satb) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2972 {
2973   insn_t insn = SEM_INSN (sem_arg);
2974 #define OPRND(f) par_exec->operands.fmt_59_satb.f
2975   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
2976   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
2977   EXTRACT_FMT_59_SATB_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
2978   EXTRACT_FMT_59_SATB_CODE
2979
2980   CPU (h_gr[f_r1]) = (GESI (OPRND (sr), 127)) ? (127) : (LESI (OPRND (sr), -128)) ? (-128) : (OPRND (sr));
2981   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
2982
2983 #if WITH_PROFILE_MODEL_P
2984   if (PROFILE_MODEL_P (current_cpu))
2985     {
2986       m32rx_model_mark_get_h_gr (current_cpu, abuf);
2987       m32rx_model_mark_set_h_gr (current_cpu, abuf);
2988       m32rx_model_profile_insn (current_cpu, abuf);
2989     }
2990 #endif
2991
2992   return new_pc;
2993 #undef OPRND
2994 }
2995
2996 /* Perform sath: sath $dr,$sr.  */
2997 CIA
2998 SEM_FN_NAME (m32rx,sath) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
2999 {
3000   insn_t insn = SEM_INSN (sem_arg);
3001 #define OPRND(f) par_exec->operands.fmt_59_satb.f
3002   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3003   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
3004   EXTRACT_FMT_59_SATB_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
3005   EXTRACT_FMT_59_SATB_CODE
3006
3007   CPU (h_gr[f_r1]) = (GESI (OPRND (sr), 32767)) ? (32767) : (LESI (OPRND (sr), -32768)) ? (-32768) : (OPRND (sr));
3008   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
3009
3010 #if WITH_PROFILE_MODEL_P
3011   if (PROFILE_MODEL_P (current_cpu))
3012     {
3013       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3014       m32rx_model_mark_set_h_gr (current_cpu, abuf);
3015       m32rx_model_profile_insn (current_cpu, abuf);
3016     }
3017 #endif
3018
3019   return new_pc;
3020 #undef OPRND
3021 }
3022
3023 /* Perform sat: sat $dr,$sr.  */
3024 CIA
3025 SEM_FN_NAME (m32rx,sat) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3026 {
3027   insn_t insn = SEM_INSN (sem_arg);
3028 #define OPRND(f) par_exec->operands.fmt_60_sat.f
3029   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3030   CIA new_pc = SEM_NEXT_PC (sem_arg, 4);
3031   EXTRACT_FMT_60_SAT_VARS /* f-op1 f-r1 f-op2 f-r2 f-uimm16 */
3032   EXTRACT_FMT_60_SAT_CODE
3033
3034   CPU (h_gr[f_r1]) = (OPRND (condbit)) ? ((LTSI (OPRND (sr), 0)) ? (2147483647) : (0x80000000)) : (OPRND (sr));
3035   TRACE_RESULT (current_cpu, "dr", 'x', CPU (h_gr[f_r1]));
3036
3037 #if WITH_PROFILE_MODEL_P
3038   if (PROFILE_MODEL_P (current_cpu))
3039     {
3040       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3041       m32rx_model_mark_set_h_gr (current_cpu, abuf);
3042       m32rx_model_profile_insn (current_cpu, abuf);
3043     }
3044 #endif
3045
3046   return new_pc;
3047 #undef OPRND
3048 }
3049
3050 /* Perform pcmpbz: pcmpbz $src2.  */
3051 CIA
3052 SEM_FN_NAME (m32rx,pcmpbz) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3053 {
3054   insn_t insn = SEM_INSN (sem_arg);
3055 #define OPRND(f) par_exec->operands.fmt_21_cmpz.f
3056   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3057   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3058   EXTRACT_FMT_21_CMPZ_VARS /* f-op1 f-r1 f-op2 f-r2 */
3059   EXTRACT_FMT_21_CMPZ_CODE
3060
3061   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);
3062   TRACE_RESULT (current_cpu, "condbit", 'x', CPU (h_cond));
3063
3064 #if WITH_PROFILE_MODEL_P
3065   if (PROFILE_MODEL_P (current_cpu))
3066     {
3067       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3068       m32rx_model_profile_insn (current_cpu, abuf);
3069     }
3070 #endif
3071
3072   return new_pc;
3073 #undef OPRND
3074 }
3075
3076 /* Perform sadd: sadd.  */
3077 CIA
3078 SEM_FN_NAME (m32rx,sadd) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3079 {
3080   insn_t insn = SEM_INSN (sem_arg);
3081 #define OPRND(f) par_exec->operands.fmt_61_sadd.f
3082   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3083   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3084   EXTRACT_FMT_61_SADD_VARS /* f-op1 f-r1 f-op2 f-r2 */
3085   EXTRACT_FMT_61_SADD_CODE
3086
3087 m32rx_h_accums_set (current_cpu, 0, ADDDI (SRADI (OPRND (h_accums_1), 16), OPRND (h_accums_0)));
3088   TRACE_RESULT (current_cpu, "h-accums-0", 'D', m32rx_h_accums_get (current_cpu, 0));
3089
3090 #if WITH_PROFILE_MODEL_P
3091   if (PROFILE_MODEL_P (current_cpu))
3092     {
3093       m32rx_model_profile_insn (current_cpu, abuf);
3094     }
3095 #endif
3096
3097   return new_pc;
3098 #undef OPRND
3099 }
3100
3101 /* Perform macwu1: macwu1 $src1,$src2.  */
3102 CIA
3103 SEM_FN_NAME (m32rx,macwu1) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3104 {
3105   insn_t insn = SEM_INSN (sem_arg);
3106 #define OPRND(f) par_exec->operands.fmt_62_macwu1.f
3107   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3108   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3109   EXTRACT_FMT_62_MACWU1_VARS /* f-op1 f-r1 f-op2 f-r2 */
3110   EXTRACT_FMT_62_MACWU1_CODE
3111
3112 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));
3113   TRACE_RESULT (current_cpu, "h-accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3114
3115 #if WITH_PROFILE_MODEL_P
3116   if (PROFILE_MODEL_P (current_cpu))
3117     {
3118       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3119       m32rx_model_profile_insn (current_cpu, abuf);
3120     }
3121 #endif
3122
3123   return new_pc;
3124 #undef OPRND
3125 }
3126
3127 /* Perform msblo: msblo $src1,$src2.  */
3128 CIA
3129 SEM_FN_NAME (m32rx,msblo) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3130 {
3131   insn_t insn = SEM_INSN (sem_arg);
3132 #define OPRND(f) par_exec->operands.fmt_63_msblo.f
3133   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3134   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3135   EXTRACT_FMT_63_MSBLO_VARS /* f-op1 f-r1 f-op2 f-r2 */
3136   EXTRACT_FMT_63_MSBLO_CODE
3137
3138   CPU (h_accum) = SRADI (SLLDI (SUBDI (OPRND (accum), SRADI (SLLDI (MULDI (EXTHIDI (TRUNCSIHI (OPRND (src1))), EXTHIDI (TRUNCSIHI (OPRND (src2)))), 32), 16)), 8), 8);
3139   TRACE_RESULT (current_cpu, "accum", 'D', CPU (h_accum));
3140
3141 #if WITH_PROFILE_MODEL_P
3142   if (PROFILE_MODEL_P (current_cpu))
3143     {
3144       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3145       m32rx_model_profile_insn (current_cpu, abuf);
3146     }
3147 #endif
3148
3149   return new_pc;
3150 #undef OPRND
3151 }
3152
3153 /* Perform mulwu1: mulwu1 $src1,$src2.  */
3154 CIA
3155 SEM_FN_NAME (m32rx,mulwu1) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3156 {
3157   insn_t insn = SEM_INSN (sem_arg);
3158 #define OPRND(f) par_exec->operands.fmt_64_mulwu1.f
3159   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3160   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3161   EXTRACT_FMT_64_MULWU1_VARS /* f-op1 f-r1 f-op2 f-r2 */
3162   EXTRACT_FMT_64_MULWU1_CODE
3163
3164 m32rx_h_accums_set (current_cpu, 1, SRADI (SLLDI (MULDI (EXTSIDI (OPRND (src1)), EXTSIDI (ANDSI (OPRND (src2), 65535))), 16), 16));
3165   TRACE_RESULT (current_cpu, "h-accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3166
3167 #if WITH_PROFILE_MODEL_P
3168   if (PROFILE_MODEL_P (current_cpu))
3169     {
3170       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3171       m32rx_model_profile_insn (current_cpu, abuf);
3172     }
3173 #endif
3174
3175   return new_pc;
3176 #undef OPRND
3177 }
3178
3179 /* Perform maclh1: maclh1 $src1,$src2.  */
3180 CIA
3181 SEM_FN_NAME (m32rx,maclh1) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3182 {
3183   insn_t insn = SEM_INSN (sem_arg);
3184 #define OPRND(f) par_exec->operands.fmt_62_macwu1.f
3185   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3186   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3187   EXTRACT_FMT_62_MACWU1_VARS /* f-op1 f-r1 f-op2 f-r2 */
3188   EXTRACT_FMT_62_MACWU1_CODE
3189
3190 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));
3191   TRACE_RESULT (current_cpu, "h-accums-1", 'D', m32rx_h_accums_get (current_cpu, 1));
3192
3193 #if WITH_PROFILE_MODEL_P
3194   if (PROFILE_MODEL_P (current_cpu))
3195     {
3196       m32rx_model_mark_get_h_gr (current_cpu, abuf);
3197       m32rx_model_profile_insn (current_cpu, abuf);
3198     }
3199 #endif
3200
3201   return new_pc;
3202 #undef OPRND
3203 }
3204
3205 /* Perform sc: sc.  */
3206 CIA
3207 SEM_FN_NAME (m32rx,sc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3208 {
3209   insn_t insn = SEM_INSN (sem_arg);
3210 #define OPRND(f) par_exec->operands.fmt_65_sc.f
3211   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3212   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3213   EXTRACT_FMT_65_SC_VARS /* f-op1 f-r1 f-op2 f-r2 */
3214   EXTRACT_FMT_65_SC_CODE
3215
3216 if (OPRND (condbit)) {
3217 BRANCH_NEW_PC (new_pc, NEW_PC_SKIP);
3218 }
3219
3220 #if WITH_PROFILE_MODEL_P
3221   if (PROFILE_MODEL_P (current_cpu))
3222     {
3223       m32rx_model_profile_insn (current_cpu, abuf);
3224     }
3225 #endif
3226
3227   return new_pc;
3228 #undef OPRND
3229 }
3230
3231 /* Perform snc: snc.  */
3232 CIA
3233 SEM_FN_NAME (m32rx,snc) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3234 {
3235   insn_t insn = SEM_INSN (sem_arg);
3236 #define OPRND(f) par_exec->operands.fmt_65_sc.f
3237   ARGBUF *abuf = SEM_ARGBUF (sem_arg);
3238   CIA new_pc = SEM_NEXT_PC (sem_arg, 2);
3239   EXTRACT_FMT_65_SC_VARS /* f-op1 f-r1 f-op2 f-r2 */
3240   EXTRACT_FMT_65_SC_CODE
3241
3242 if (NOTBI (OPRND (condbit))) {
3243 BRANCH_NEW_PC (new_pc, NEW_PC_SKIP);
3244 }
3245
3246 #if WITH_PROFILE_MODEL_P
3247   if (PROFILE_MODEL_P (current_cpu))
3248     {
3249       m32rx_model_profile_insn (current_cpu, abuf);
3250     }
3251 #endif
3252
3253   return new_pc;
3254 #undef OPRND
3255 }
3256
3257 CIA
3258 SEM_FN_NAME (m32rx,illegal) (SIM_CPU *current_cpu, SEM_ARG sem_arg, PAREXEC *par_exec)
3259 {
3260   sim_engine_illegal_insn (current_cpu, NULL_CIA /*FIXME*/);
3261   return 0;
3262 }
3263
3264 #endif /* ! defined (SCACHE_P) || (defined (SCACHE_P) && WITH_SCACHE) */