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