Commit | Line | Data |
---|---|---|
190659a2 | 1 | /* Simulator instruction semantics for m32rb. |
2ddc0492 | 2 | |
190659a2 | 3 | THIS FILE IS MACHINE GENERATED WITH CGEN. |
e0bd6e18 | 4 | |
2ddc0492 DE |
5 | Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc. |
6 | ||
7 | This file is part of the GNU Simulators. | |
8 | ||
9 | This program is free software; you can redistribute it and/or modify | |
10 | it under the terms of the GNU General Public License as published by | |
11 | the Free Software Foundation; either version 2, or (at your option) | |
12 | any later version. | |
13 | ||
14 | This program is distributed in the hope that it will be useful, | |
15 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 | GNU General Public License for more details. | |
18 | ||
19 | You should have received a copy of the GNU General Public License along | |
20 | with this program; if not, write to the Free Software Foundation, Inc., | |
21 | 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
22 | ||
23 | */ | |
24 | ||
25 | #ifdef DEFINE_LABELS | |
26 | #undef DEFINE_LABELS | |
27 | ||
2ddc0492 DE |
28 | /* The labels have the case they have because the enum of insn types |
29 | is all uppercase and in the non-stdc case the insn symbol is built | |
a8981d67 DE |
30 | into the enum name. */ |
31 | ||
32 | static struct { | |
33 | int index; | |
34 | void *label; | |
35 | } labels[] = { | |
190659a2 DE |
36 | { M32RB_XINSN_ILLEGAL, && case_sem_INSN_ILLEGAL }, |
37 | { M32RB_XINSN_ADD, && case_sem_INSN_ADD }, | |
38 | { M32RB_XINSN_ADD3, && case_sem_INSN_ADD3 }, | |
39 | { M32RB_XINSN_AND, && case_sem_INSN_AND }, | |
40 | { M32RB_XINSN_AND3, && case_sem_INSN_AND3 }, | |
41 | { M32RB_XINSN_OR, && case_sem_INSN_OR }, | |
42 | { M32RB_XINSN_OR3, && case_sem_INSN_OR3 }, | |
43 | { M32RB_XINSN_XOR, && case_sem_INSN_XOR }, | |
44 | { M32RB_XINSN_XOR3, && case_sem_INSN_XOR3 }, | |
45 | { M32RB_XINSN_ADDI, && case_sem_INSN_ADDI }, | |
46 | { M32RB_XINSN_ADDV, && case_sem_INSN_ADDV }, | |
47 | { M32RB_XINSN_ADDV3, && case_sem_INSN_ADDV3 }, | |
48 | { M32RB_XINSN_ADDX, && case_sem_INSN_ADDX }, | |
49 | { M32RB_XINSN_BC8, && case_sem_INSN_BC8 }, | |
50 | { M32RB_XINSN_BC24, && case_sem_INSN_BC24 }, | |
51 | { M32RB_XINSN_BEQ, && case_sem_INSN_BEQ }, | |
52 | { M32RB_XINSN_BEQZ, && case_sem_INSN_BEQZ }, | |
53 | { M32RB_XINSN_BGEZ, && case_sem_INSN_BGEZ }, | |
54 | { M32RB_XINSN_BGTZ, && case_sem_INSN_BGTZ }, | |
55 | { M32RB_XINSN_BLEZ, && case_sem_INSN_BLEZ }, | |
56 | { M32RB_XINSN_BLTZ, && case_sem_INSN_BLTZ }, | |
57 | { M32RB_XINSN_BNEZ, && case_sem_INSN_BNEZ }, | |
58 | { M32RB_XINSN_BL8, && case_sem_INSN_BL8 }, | |
59 | { M32RB_XINSN_BL24, && case_sem_INSN_BL24 }, | |
60 | { M32RB_XINSN_BNC8, && case_sem_INSN_BNC8 }, | |
61 | { M32RB_XINSN_BNC24, && case_sem_INSN_BNC24 }, | |
62 | { M32RB_XINSN_BNE, && case_sem_INSN_BNE }, | |
63 | { M32RB_XINSN_BRA8, && case_sem_INSN_BRA8 }, | |
64 | { M32RB_XINSN_BRA24, && case_sem_INSN_BRA24 }, | |
65 | { M32RB_XINSN_CMP, && case_sem_INSN_CMP }, | |
66 | { M32RB_XINSN_CMPI, && case_sem_INSN_CMPI }, | |
67 | { M32RB_XINSN_CMPU, && case_sem_INSN_CMPU }, | |
68 | { M32RB_XINSN_CMPUI, && case_sem_INSN_CMPUI }, | |
69 | { M32RB_XINSN_DIV, && case_sem_INSN_DIV }, | |
70 | { M32RB_XINSN_DIVU, && case_sem_INSN_DIVU }, | |
71 | { M32RB_XINSN_REM, && case_sem_INSN_REM }, | |
72 | { M32RB_XINSN_REMU, && case_sem_INSN_REMU }, | |
73 | { M32RB_XINSN_JL, && case_sem_INSN_JL }, | |
74 | { M32RB_XINSN_JMP, && case_sem_INSN_JMP }, | |
75 | { M32RB_XINSN_LD, && case_sem_INSN_LD }, | |
76 | { M32RB_XINSN_LD_D, && case_sem_INSN_LD_D }, | |
77 | { M32RB_XINSN_LDB, && case_sem_INSN_LDB }, | |
78 | { M32RB_XINSN_LDB_D, && case_sem_INSN_LDB_D }, | |
79 | { M32RB_XINSN_LDH, && case_sem_INSN_LDH }, | |
80 | { M32RB_XINSN_LDH_D, && case_sem_INSN_LDH_D }, | |
81 | { M32RB_XINSN_LDUB, && case_sem_INSN_LDUB }, | |
82 | { M32RB_XINSN_LDUB_D, && case_sem_INSN_LDUB_D }, | |
83 | { M32RB_XINSN_LDUH, && case_sem_INSN_LDUH }, | |
84 | { M32RB_XINSN_LDUH_D, && case_sem_INSN_LDUH_D }, | |
85 | { M32RB_XINSN_LD_PLUS, && case_sem_INSN_LD_PLUS }, | |
86 | { M32RB_XINSN_LD24, && case_sem_INSN_LD24 }, | |
87 | { M32RB_XINSN_LDI8, && case_sem_INSN_LDI8 }, | |
88 | { M32RB_XINSN_LDI16, && case_sem_INSN_LDI16 }, | |
89 | { M32RB_XINSN_LOCK, && case_sem_INSN_LOCK }, | |
90 | { M32RB_XINSN_MACHI, && case_sem_INSN_MACHI }, | |
91 | { M32RB_XINSN_MACLO, && case_sem_INSN_MACLO }, | |
92 | { M32RB_XINSN_MACWHI, && case_sem_INSN_MACWHI }, | |
93 | { M32RB_XINSN_MACWLO, && case_sem_INSN_MACWLO }, | |
94 | { M32RB_XINSN_MUL, && case_sem_INSN_MUL }, | |
95 | { M32RB_XINSN_MULHI, && case_sem_INSN_MULHI }, | |
96 | { M32RB_XINSN_MULLO, && case_sem_INSN_MULLO }, | |
97 | { M32RB_XINSN_MULWHI, && case_sem_INSN_MULWHI }, | |
98 | { M32RB_XINSN_MULWLO, && case_sem_INSN_MULWLO }, | |
99 | { M32RB_XINSN_MV, && case_sem_INSN_MV }, | |
100 | { M32RB_XINSN_MVFACHI, && case_sem_INSN_MVFACHI }, | |
101 | { M32RB_XINSN_MVFACLO, && case_sem_INSN_MVFACLO }, | |
102 | { M32RB_XINSN_MVFACMI, && case_sem_INSN_MVFACMI }, | |
103 | { M32RB_XINSN_MVFC, && case_sem_INSN_MVFC }, | |
104 | { M32RB_XINSN_MVTACHI, && case_sem_INSN_MVTACHI }, | |
105 | { M32RB_XINSN_MVTACLO, && case_sem_INSN_MVTACLO }, | |
106 | { M32RB_XINSN_MVTC, && case_sem_INSN_MVTC }, | |
107 | { M32RB_XINSN_NEG, && case_sem_INSN_NEG }, | |
108 | { M32RB_XINSN_NOP, && case_sem_INSN_NOP }, | |
109 | { M32RB_XINSN_NOT, && case_sem_INSN_NOT }, | |
110 | { M32RB_XINSN_RAC, && case_sem_INSN_RAC }, | |
111 | { M32RB_XINSN_RACH, && case_sem_INSN_RACH }, | |
112 | { M32RB_XINSN_RTE, && case_sem_INSN_RTE }, | |
113 | { M32RB_XINSN_SETH, && case_sem_INSN_SETH }, | |
114 | { M32RB_XINSN_SLL, && case_sem_INSN_SLL }, | |
115 | { M32RB_XINSN_SLL3, && case_sem_INSN_SLL3 }, | |
116 | { M32RB_XINSN_SLLI, && case_sem_INSN_SLLI }, | |
117 | { M32RB_XINSN_SRA, && case_sem_INSN_SRA }, | |
118 | { M32RB_XINSN_SRA3, && case_sem_INSN_SRA3 }, | |
119 | { M32RB_XINSN_SRAI, && case_sem_INSN_SRAI }, | |
120 | { M32RB_XINSN_SRL, && case_sem_INSN_SRL }, | |
121 | { M32RB_XINSN_SRL3, && case_sem_INSN_SRL3 }, | |
122 | { M32RB_XINSN_SRLI, && case_sem_INSN_SRLI }, | |
123 | { M32RB_XINSN_ST, && case_sem_INSN_ST }, | |
124 | { M32RB_XINSN_ST_D, && case_sem_INSN_ST_D }, | |
125 | { M32RB_XINSN_STB, && case_sem_INSN_STB }, | |
126 | { M32RB_XINSN_STB_D, && case_sem_INSN_STB_D }, | |
127 | { M32RB_XINSN_STH, && case_sem_INSN_STH }, | |
128 | { M32RB_XINSN_STH_D, && case_sem_INSN_STH_D }, | |
129 | { M32RB_XINSN_ST_PLUS, && case_sem_INSN_ST_PLUS }, | |
130 | { M32RB_XINSN_ST_MINUS, && case_sem_INSN_ST_MINUS }, | |
131 | { M32RB_XINSN_SUB, && case_sem_INSN_SUB }, | |
132 | { M32RB_XINSN_SUBV, && case_sem_INSN_SUBV }, | |
133 | { M32RB_XINSN_SUBX, && case_sem_INSN_SUBX }, | |
134 | { M32RB_XINSN_TRAP, && case_sem_INSN_TRAP }, | |
135 | { M32RB_XINSN_UNLOCK, && case_sem_INSN_UNLOCK }, | |
a8981d67 | 136 | { 0, 0 } |
2ddc0492 | 137 | }; |
2ddc0492 DE |
138 | int i; |
139 | ||
a8981d67 DE |
140 | for (i = 0; labels[i].label != 0; ++i) |
141 | CPU_IDESC (current_cpu) [labels[i].index].sem_fast_lab = labels[i].label; | |
2ddc0492 DE |
142 | |
143 | #endif /* DEFINE_LABELS */ | |
144 | ||
145 | #ifdef DEFINE_SWITCH | |
146 | #undef DEFINE_SWITCH | |
147 | ||
148 | /* If hyper-fast [well not unnecessarily slow] execution is selected, turn | |
149 | off frills like tracing and profiling. */ | |
150 | /* FIXME: A better way would be to have TRACE_RESULT check for something | |
151 | that can cause it to be optimized out. */ | |
152 | ||
153 | #if FAST_P | |
154 | #undef TRACE_RESULT | |
155 | #define TRACE_RESULT(cpu, name, type, val) | |
156 | #endif | |
157 | ||
158 | #undef GET_ATTR | |
a8981d67 | 159 | #define GET_ATTR(cpu, num, attr) CGEN_INSN_ATTR (abuf->idesc->opcode, CGEN_INSN_##attr) |
2ddc0492 DE |
160 | |
161 | { | |
162 | SEM_ARG sem_arg = sc; | |
163 | ARGBUF *abuf = SEM_ARGBUF (sem_arg); | |
e0bd6e18 | 164 | CIA new_pc; |
2ddc0492 DE |
165 | |
166 | SWITCH (sem, sem_arg->semantic.sem_case) | |
167 | { | |
168 | ||
169 | CASE (sem, INSN_ILLEGAL) : | |
170 | { | |
171 | sim_engine_halt (CPU_STATE (current_cpu), current_cpu, NULL, NULL_CIA/*FIXME*/, | |
172 | sim_stopped, SIM_SIGILL); | |
173 | BREAK (sem); | |
174 | } | |
175 | ||
176 | CASE (sem, INSN_ADD) : /* add $dr,$sr */ | |
177 | { | |
970a8fd6 | 178 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 179 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 180 | |
190659a2 DE |
181 | { |
182 | SI opval = ADDSI (* FLD (f_r1), * FLD (f_r2)); | |
183 | * FLD (f_r1) = opval; | |
184 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
185 | } | |
e0bd6e18 | 186 | |
2ddc0492 DE |
187 | #undef FLD |
188 | } | |
189 | BREAK (sem); | |
190 | ||
970a8fd6 | 191 | CASE (sem, INSN_ADD3) : /* add3 $dr,$sr,$hash$slo16 */ |
2ddc0492 | 192 | { |
970a8fd6 | 193 | #define FLD(f) abuf->fields.fmt_add3.f |
02310b01 | 194 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 195 | |
190659a2 DE |
196 | { |
197 | SI opval = ADDSI (* FLD (f_r2), FLD (f_simm16)); | |
198 | * FLD (f_r1) = opval; | |
199 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
200 | } | |
e0bd6e18 | 201 | |
2ddc0492 DE |
202 | #undef FLD |
203 | } | |
204 | BREAK (sem); | |
205 | ||
206 | CASE (sem, INSN_AND) : /* and $dr,$sr */ | |
207 | { | |
970a8fd6 | 208 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 209 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 210 | |
190659a2 DE |
211 | { |
212 | SI opval = ANDSI (* FLD (f_r1), * FLD (f_r2)); | |
213 | * FLD (f_r1) = opval; | |
214 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
215 | } | |
e0bd6e18 | 216 | |
2ddc0492 DE |
217 | #undef FLD |
218 | } | |
219 | BREAK (sem); | |
220 | ||
970a8fd6 | 221 | CASE (sem, INSN_AND3) : /* and3 $dr,$sr,$uimm16 */ |
2ddc0492 | 222 | { |
970a8fd6 | 223 | #define FLD(f) abuf->fields.fmt_and3.f |
02310b01 | 224 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 225 | |
190659a2 DE |
226 | { |
227 | SI opval = ANDSI (* FLD (f_r2), FLD (f_uimm16)); | |
228 | * FLD (f_r1) = opval; | |
229 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
230 | } | |
e0bd6e18 | 231 | |
2ddc0492 DE |
232 | #undef FLD |
233 | } | |
234 | BREAK (sem); | |
235 | ||
236 | CASE (sem, INSN_OR) : /* or $dr,$sr */ | |
237 | { | |
970a8fd6 | 238 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 239 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 240 | |
190659a2 DE |
241 | { |
242 | SI opval = ORSI (* FLD (f_r1), * FLD (f_r2)); | |
243 | * FLD (f_r1) = opval; | |
244 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
245 | } | |
e0bd6e18 | 246 | |
2ddc0492 DE |
247 | #undef FLD |
248 | } | |
249 | BREAK (sem); | |
250 | ||
970a8fd6 | 251 | CASE (sem, INSN_OR3) : /* or3 $dr,$sr,$hash$ulo16 */ |
2ddc0492 | 252 | { |
970a8fd6 | 253 | #define FLD(f) abuf->fields.fmt_or3.f |
02310b01 | 254 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 255 | |
190659a2 DE |
256 | { |
257 | SI opval = ORSI (* FLD (f_r2), FLD (f_uimm16)); | |
258 | * FLD (f_r1) = opval; | |
259 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
260 | } | |
e0bd6e18 | 261 | |
2ddc0492 DE |
262 | #undef FLD |
263 | } | |
264 | BREAK (sem); | |
265 | ||
266 | CASE (sem, INSN_XOR) : /* xor $dr,$sr */ | |
267 | { | |
970a8fd6 | 268 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 269 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 270 | |
190659a2 DE |
271 | { |
272 | SI opval = XORSI (* FLD (f_r1), * FLD (f_r2)); | |
273 | * FLD (f_r1) = opval; | |
274 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
275 | } | |
e0bd6e18 | 276 | |
2ddc0492 DE |
277 | #undef FLD |
278 | } | |
279 | BREAK (sem); | |
280 | ||
970a8fd6 | 281 | CASE (sem, INSN_XOR3) : /* xor3 $dr,$sr,$uimm16 */ |
2ddc0492 | 282 | { |
970a8fd6 | 283 | #define FLD(f) abuf->fields.fmt_and3.f |
02310b01 | 284 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 285 | |
190659a2 DE |
286 | { |
287 | SI opval = XORSI (* FLD (f_r2), FLD (f_uimm16)); | |
288 | * FLD (f_r1) = opval; | |
289 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
290 | } | |
e0bd6e18 | 291 | |
2ddc0492 DE |
292 | #undef FLD |
293 | } | |
294 | BREAK (sem); | |
295 | ||
970a8fd6 | 296 | CASE (sem, INSN_ADDI) : /* addi $dr,$simm8 */ |
2ddc0492 | 297 | { |
970a8fd6 | 298 | #define FLD(f) abuf->fields.fmt_addi.f |
02310b01 | 299 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 300 | |
190659a2 DE |
301 | { |
302 | SI opval = ADDSI (* FLD (f_r1), FLD (f_simm8)); | |
303 | * FLD (f_r1) = opval; | |
304 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
305 | } | |
e0bd6e18 | 306 | |
2ddc0492 DE |
307 | #undef FLD |
308 | } | |
309 | BREAK (sem); | |
310 | ||
311 | CASE (sem, INSN_ADDV) : /* addv $dr,$sr */ | |
312 | { | |
970a8fd6 | 313 | #define FLD(f) abuf->fields.fmt_addv.f |
02310b01 | 314 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 315 | |
2ddc0492 | 316 | do { |
a040908c | 317 | UBI temp1;SI temp0; |
2ddc0492 DE |
318 | temp0 = ADDSI (* FLD (f_r1), * FLD (f_r2)); |
319 | temp1 = ADDOFSI (* FLD (f_r1), * FLD (f_r2), 0); | |
190659a2 DE |
320 | { |
321 | SI opval = temp0; | |
322 | * FLD (f_r1) = opval; | |
323 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
324 | } | |
325 | { | |
326 | UBI opval = temp1; | |
327 | CPU (h_cond) = opval; | |
328 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
329 | } | |
2ddc0492 | 330 | } while (0); |
e0bd6e18 | 331 | |
2ddc0492 DE |
332 | #undef FLD |
333 | } | |
334 | BREAK (sem); | |
335 | ||
970a8fd6 | 336 | CASE (sem, INSN_ADDV3) : /* addv3 $dr,$sr,$simm16 */ |
2ddc0492 | 337 | { |
970a8fd6 | 338 | #define FLD(f) abuf->fields.fmt_addv3.f |
02310b01 | 339 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 340 | |
2ddc0492 | 341 | do { |
a040908c | 342 | UBI temp1;SI temp0; |
2ddc0492 DE |
343 | temp0 = ADDSI (* FLD (f_r2), FLD (f_simm16)); |
344 | temp1 = ADDOFSI (* FLD (f_r2), FLD (f_simm16), 0); | |
190659a2 DE |
345 | { |
346 | SI opval = temp0; | |
347 | * FLD (f_r1) = opval; | |
348 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
349 | } | |
350 | { | |
351 | UBI opval = temp1; | |
352 | CPU (h_cond) = opval; | |
353 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
354 | } | |
2ddc0492 | 355 | } while (0); |
e0bd6e18 | 356 | |
2ddc0492 DE |
357 | #undef FLD |
358 | } | |
359 | BREAK (sem); | |
360 | ||
361 | CASE (sem, INSN_ADDX) : /* addx $dr,$sr */ | |
362 | { | |
970a8fd6 | 363 | #define FLD(f) abuf->fields.fmt_addx.f |
02310b01 | 364 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 365 | |
2ddc0492 | 366 | do { |
a040908c | 367 | UBI temp1;SI temp0; |
2ddc0492 DE |
368 | temp0 = ADDCSI (* FLD (f_r1), * FLD (f_r2), CPU (h_cond)); |
369 | temp1 = ADDCFSI (* FLD (f_r1), * FLD (f_r2), CPU (h_cond)); | |
190659a2 DE |
370 | { |
371 | SI opval = temp0; | |
372 | * FLD (f_r1) = opval; | |
373 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
374 | } | |
375 | { | |
376 | UBI opval = temp1; | |
377 | CPU (h_cond) = opval; | |
378 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
379 | } | |
2ddc0492 | 380 | } while (0); |
e0bd6e18 | 381 | |
2ddc0492 DE |
382 | #undef FLD |
383 | } | |
384 | BREAK (sem); | |
385 | ||
a8981d67 | 386 | CASE (sem, INSN_BC8) : /* bc.s $disp8 */ |
2ddc0492 | 387 | { |
970a8fd6 | 388 | #define FLD(f) abuf->fields.fmt_bc8.f |
02310b01 | 389 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 390 | |
2ddc0492 | 391 | if (CPU (h_cond)) { |
190659a2 DE |
392 | { |
393 | USI opval = FLD (f_disp8); | |
394 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
395 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
396 | } | |
2ddc0492 | 397 | } |
e0bd6e18 | 398 | |
2ddc0492 DE |
399 | #undef FLD |
400 | } | |
401 | BREAK (sem); | |
402 | ||
a8981d67 | 403 | CASE (sem, INSN_BC24) : /* bc.l $disp24 */ |
2ddc0492 | 404 | { |
970a8fd6 | 405 | #define FLD(f) abuf->fields.fmt_bc24.f |
02310b01 | 406 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 407 | |
2ddc0492 | 408 | if (CPU (h_cond)) { |
190659a2 DE |
409 | { |
410 | USI opval = FLD (f_disp24); | |
411 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
412 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
413 | } | |
2ddc0492 | 414 | } |
e0bd6e18 | 415 | |
2ddc0492 DE |
416 | #undef FLD |
417 | } | |
418 | BREAK (sem); | |
419 | ||
420 | CASE (sem, INSN_BEQ) : /* beq $src1,$src2,$disp16 */ | |
421 | { | |
970a8fd6 | 422 | #define FLD(f) abuf->fields.fmt_beq.f |
02310b01 | 423 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 424 | |
2ddc0492 | 425 | if (EQSI (* FLD (f_r1), * FLD (f_r2))) { |
190659a2 DE |
426 | { |
427 | USI opval = FLD (f_disp16); | |
428 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
429 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
430 | } | |
2ddc0492 | 431 | } |
e0bd6e18 | 432 | |
2ddc0492 DE |
433 | #undef FLD |
434 | } | |
435 | BREAK (sem); | |
436 | ||
437 | CASE (sem, INSN_BEQZ) : /* beqz $src2,$disp16 */ | |
438 | { | |
970a8fd6 | 439 | #define FLD(f) abuf->fields.fmt_beqz.f |
02310b01 | 440 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 441 | |
2ddc0492 | 442 | if (EQSI (* FLD (f_r2), 0)) { |
190659a2 DE |
443 | { |
444 | USI opval = FLD (f_disp16); | |
445 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
446 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
447 | } | |
2ddc0492 | 448 | } |
e0bd6e18 | 449 | |
2ddc0492 DE |
450 | #undef FLD |
451 | } | |
452 | BREAK (sem); | |
453 | ||
454 | CASE (sem, INSN_BGEZ) : /* bgez $src2,$disp16 */ | |
455 | { | |
970a8fd6 | 456 | #define FLD(f) abuf->fields.fmt_beqz.f |
02310b01 | 457 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 458 | |
2ddc0492 | 459 | if (GESI (* FLD (f_r2), 0)) { |
190659a2 DE |
460 | { |
461 | USI opval = FLD (f_disp16); | |
462 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
463 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
464 | } | |
2ddc0492 | 465 | } |
e0bd6e18 | 466 | |
2ddc0492 DE |
467 | #undef FLD |
468 | } | |
469 | BREAK (sem); | |
470 | ||
471 | CASE (sem, INSN_BGTZ) : /* bgtz $src2,$disp16 */ | |
472 | { | |
970a8fd6 | 473 | #define FLD(f) abuf->fields.fmt_beqz.f |
02310b01 | 474 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 475 | |
2ddc0492 | 476 | if (GTSI (* FLD (f_r2), 0)) { |
190659a2 DE |
477 | { |
478 | USI opval = FLD (f_disp16); | |
479 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
480 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
481 | } | |
2ddc0492 | 482 | } |
e0bd6e18 | 483 | |
2ddc0492 DE |
484 | #undef FLD |
485 | } | |
486 | BREAK (sem); | |
487 | ||
488 | CASE (sem, INSN_BLEZ) : /* blez $src2,$disp16 */ | |
489 | { | |
970a8fd6 | 490 | #define FLD(f) abuf->fields.fmt_beqz.f |
02310b01 | 491 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 492 | |
2ddc0492 | 493 | if (LESI (* FLD (f_r2), 0)) { |
190659a2 DE |
494 | { |
495 | USI opval = FLD (f_disp16); | |
496 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
497 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
498 | } | |
2ddc0492 | 499 | } |
e0bd6e18 | 500 | |
2ddc0492 DE |
501 | #undef FLD |
502 | } | |
503 | BREAK (sem); | |
504 | ||
505 | CASE (sem, INSN_BLTZ) : /* bltz $src2,$disp16 */ | |
506 | { | |
970a8fd6 | 507 | #define FLD(f) abuf->fields.fmt_beqz.f |
02310b01 | 508 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 509 | |
2ddc0492 | 510 | if (LTSI (* FLD (f_r2), 0)) { |
190659a2 DE |
511 | { |
512 | USI opval = FLD (f_disp16); | |
513 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
514 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
515 | } | |
2ddc0492 | 516 | } |
e0bd6e18 | 517 | |
2ddc0492 DE |
518 | #undef FLD |
519 | } | |
520 | BREAK (sem); | |
521 | ||
522 | CASE (sem, INSN_BNEZ) : /* bnez $src2,$disp16 */ | |
523 | { | |
970a8fd6 | 524 | #define FLD(f) abuf->fields.fmt_beqz.f |
02310b01 | 525 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 526 | |
2ddc0492 | 527 | if (NESI (* FLD (f_r2), 0)) { |
190659a2 DE |
528 | { |
529 | USI opval = FLD (f_disp16); | |
530 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
531 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
532 | } | |
2ddc0492 | 533 | } |
e0bd6e18 | 534 | |
2ddc0492 DE |
535 | #undef FLD |
536 | } | |
537 | BREAK (sem); | |
538 | ||
a8981d67 | 539 | CASE (sem, INSN_BL8) : /* bl.s $disp8 */ |
2ddc0492 | 540 | { |
970a8fd6 | 541 | #define FLD(f) abuf->fields.fmt_bl8.f |
02310b01 | 542 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 543 | |
2ddc0492 | 544 | do { |
190659a2 DE |
545 | { |
546 | SI opval = ADDSI (ANDSI (CPU (h_pc), -4), 4); | |
547 | CPU (h_gr[((HOSTUINT) 14)]) = opval; | |
548 | TRACE_RESULT (current_cpu, "gr-14", 'x', opval); | |
549 | } | |
550 | { | |
551 | USI opval = FLD (f_disp8); | |
552 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
553 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
554 | } | |
2ddc0492 | 555 | } while (0); |
e0bd6e18 | 556 | |
2ddc0492 DE |
557 | #undef FLD |
558 | } | |
559 | BREAK (sem); | |
560 | ||
a8981d67 | 561 | CASE (sem, INSN_BL24) : /* bl.l $disp24 */ |
2ddc0492 | 562 | { |
970a8fd6 | 563 | #define FLD(f) abuf->fields.fmt_bl24.f |
02310b01 | 564 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 565 | |
2ddc0492 | 566 | do { |
190659a2 DE |
567 | { |
568 | SI opval = ADDSI (CPU (h_pc), 4); | |
569 | CPU (h_gr[((HOSTUINT) 14)]) = opval; | |
570 | TRACE_RESULT (current_cpu, "gr-14", 'x', opval); | |
571 | } | |
572 | { | |
573 | USI opval = FLD (f_disp24); | |
574 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
575 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
576 | } | |
2ddc0492 | 577 | } while (0); |
e0bd6e18 | 578 | |
2ddc0492 DE |
579 | #undef FLD |
580 | } | |
581 | BREAK (sem); | |
582 | ||
a8981d67 | 583 | CASE (sem, INSN_BNC8) : /* bnc.s $disp8 */ |
2ddc0492 | 584 | { |
970a8fd6 | 585 | #define FLD(f) abuf->fields.fmt_bc8.f |
02310b01 | 586 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 587 | |
2ddc0492 | 588 | if (NOTBI (CPU (h_cond))) { |
190659a2 DE |
589 | { |
590 | USI opval = FLD (f_disp8); | |
591 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
592 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
593 | } | |
2ddc0492 | 594 | } |
e0bd6e18 | 595 | |
2ddc0492 DE |
596 | #undef FLD |
597 | } | |
598 | BREAK (sem); | |
599 | ||
a8981d67 | 600 | CASE (sem, INSN_BNC24) : /* bnc.l $disp24 */ |
2ddc0492 | 601 | { |
970a8fd6 | 602 | #define FLD(f) abuf->fields.fmt_bc24.f |
02310b01 | 603 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 604 | |
2ddc0492 | 605 | if (NOTBI (CPU (h_cond))) { |
190659a2 DE |
606 | { |
607 | USI opval = FLD (f_disp24); | |
608 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
609 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
610 | } | |
2ddc0492 | 611 | } |
e0bd6e18 | 612 | |
2ddc0492 DE |
613 | #undef FLD |
614 | } | |
615 | BREAK (sem); | |
616 | ||
617 | CASE (sem, INSN_BNE) : /* bne $src1,$src2,$disp16 */ | |
618 | { | |
970a8fd6 | 619 | #define FLD(f) abuf->fields.fmt_beq.f |
02310b01 | 620 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 621 | |
2ddc0492 | 622 | if (NESI (* FLD (f_r1), * FLD (f_r2))) { |
190659a2 DE |
623 | { |
624 | USI opval = FLD (f_disp16); | |
625 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
626 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
627 | } | |
2ddc0492 | 628 | } |
e0bd6e18 | 629 | |
2ddc0492 DE |
630 | #undef FLD |
631 | } | |
632 | BREAK (sem); | |
633 | ||
a8981d67 | 634 | CASE (sem, INSN_BRA8) : /* bra.s $disp8 */ |
2ddc0492 | 635 | { |
970a8fd6 | 636 | #define FLD(f) abuf->fields.fmt_bra8.f |
02310b01 | 637 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 638 | |
190659a2 DE |
639 | { |
640 | USI opval = FLD (f_disp8); | |
641 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
642 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
643 | } | |
e0bd6e18 | 644 | |
2ddc0492 DE |
645 | #undef FLD |
646 | } | |
647 | BREAK (sem); | |
648 | ||
a8981d67 | 649 | CASE (sem, INSN_BRA24) : /* bra.l $disp24 */ |
2ddc0492 | 650 | { |
970a8fd6 | 651 | #define FLD(f) abuf->fields.fmt_bra24.f |
02310b01 | 652 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 653 | |
190659a2 DE |
654 | { |
655 | USI opval = FLD (f_disp24); | |
656 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_CACHE (sem_arg, opval)); | |
657 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
658 | } | |
e0bd6e18 | 659 | |
2ddc0492 DE |
660 | #undef FLD |
661 | } | |
662 | BREAK (sem); | |
663 | ||
664 | CASE (sem, INSN_CMP) : /* cmp $src1,$src2 */ | |
665 | { | |
970a8fd6 | 666 | #define FLD(f) abuf->fields.fmt_cmp.f |
02310b01 | 667 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 668 | |
190659a2 DE |
669 | { |
670 | UBI opval = LTSI (* FLD (f_r1), * FLD (f_r2)); | |
671 | CPU (h_cond) = opval; | |
672 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
673 | } | |
e0bd6e18 | 674 | |
2ddc0492 DE |
675 | #undef FLD |
676 | } | |
677 | BREAK (sem); | |
678 | ||
970a8fd6 | 679 | CASE (sem, INSN_CMPI) : /* cmpi $src2,$simm16 */ |
2ddc0492 | 680 | { |
970a8fd6 | 681 | #define FLD(f) abuf->fields.fmt_cmpi.f |
02310b01 | 682 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 683 | |
190659a2 DE |
684 | { |
685 | UBI opval = LTSI (* FLD (f_r2), FLD (f_simm16)); | |
686 | CPU (h_cond) = opval; | |
687 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
688 | } | |
e0bd6e18 | 689 | |
2ddc0492 DE |
690 | #undef FLD |
691 | } | |
692 | BREAK (sem); | |
693 | ||
694 | CASE (sem, INSN_CMPU) : /* cmpu $src1,$src2 */ | |
695 | { | |
970a8fd6 | 696 | #define FLD(f) abuf->fields.fmt_cmp.f |
02310b01 | 697 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 698 | |
190659a2 DE |
699 | { |
700 | UBI opval = LTUSI (* FLD (f_r1), * FLD (f_r2)); | |
701 | CPU (h_cond) = opval; | |
702 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
703 | } | |
e0bd6e18 | 704 | |
2ddc0492 DE |
705 | #undef FLD |
706 | } | |
707 | BREAK (sem); | |
708 | ||
970a8fd6 | 709 | CASE (sem, INSN_CMPUI) : /* cmpui $src2,$simm16 */ |
2ddc0492 | 710 | { |
970a8fd6 | 711 | #define FLD(f) abuf->fields.fmt_cmpi.f |
02310b01 | 712 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 713 | |
190659a2 DE |
714 | { |
715 | UBI opval = LTUSI (* FLD (f_r2), FLD (f_simm16)); | |
716 | CPU (h_cond) = opval; | |
717 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
718 | } | |
e0bd6e18 | 719 | |
2ddc0492 DE |
720 | #undef FLD |
721 | } | |
722 | BREAK (sem); | |
723 | ||
724 | CASE (sem, INSN_DIV) : /* div $dr,$sr */ | |
725 | { | |
970a8fd6 | 726 | #define FLD(f) abuf->fields.fmt_div.f |
02310b01 | 727 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 728 | |
2ddc0492 | 729 | if (NESI (* FLD (f_r2), 0)) { |
190659a2 DE |
730 | { |
731 | SI opval = DIVSI (* FLD (f_r1), * FLD (f_r2)); | |
732 | * FLD (f_r1) = opval; | |
733 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
734 | } | |
2ddc0492 | 735 | } |
e0bd6e18 | 736 | |
2ddc0492 DE |
737 | #undef FLD |
738 | } | |
739 | BREAK (sem); | |
740 | ||
741 | CASE (sem, INSN_DIVU) : /* divu $dr,$sr */ | |
742 | { | |
970a8fd6 | 743 | #define FLD(f) abuf->fields.fmt_div.f |
02310b01 | 744 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 745 | |
2ddc0492 | 746 | if (NESI (* FLD (f_r2), 0)) { |
190659a2 DE |
747 | { |
748 | SI opval = UDIVSI (* FLD (f_r1), * FLD (f_r2)); | |
749 | * FLD (f_r1) = opval; | |
750 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
751 | } | |
2ddc0492 | 752 | } |
e0bd6e18 | 753 | |
2ddc0492 DE |
754 | #undef FLD |
755 | } | |
756 | BREAK (sem); | |
757 | ||
758 | CASE (sem, INSN_REM) : /* rem $dr,$sr */ | |
759 | { | |
970a8fd6 | 760 | #define FLD(f) abuf->fields.fmt_div.f |
02310b01 | 761 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 762 | |
2ddc0492 | 763 | if (NESI (* FLD (f_r2), 0)) { |
190659a2 DE |
764 | { |
765 | SI opval = MODSI (* FLD (f_r1), * FLD (f_r2)); | |
766 | * FLD (f_r1) = opval; | |
767 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
768 | } | |
2ddc0492 | 769 | } |
e0bd6e18 | 770 | |
2ddc0492 DE |
771 | #undef FLD |
772 | } | |
773 | BREAK (sem); | |
774 | ||
775 | CASE (sem, INSN_REMU) : /* remu $dr,$sr */ | |
776 | { | |
970a8fd6 | 777 | #define FLD(f) abuf->fields.fmt_div.f |
02310b01 | 778 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 779 | |
2ddc0492 | 780 | if (NESI (* FLD (f_r2), 0)) { |
190659a2 DE |
781 | { |
782 | SI opval = UMODSI (* FLD (f_r1), * FLD (f_r2)); | |
783 | * FLD (f_r1) = opval; | |
784 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
785 | } | |
2ddc0492 | 786 | } |
e0bd6e18 | 787 | |
2ddc0492 DE |
788 | #undef FLD |
789 | } | |
790 | BREAK (sem); | |
791 | ||
792 | CASE (sem, INSN_JL) : /* jl $sr */ | |
793 | { | |
970a8fd6 | 794 | #define FLD(f) abuf->fields.fmt_jl.f |
02310b01 | 795 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 796 | |
2ddc0492 | 797 | do { |
a040908c | 798 | USI temp1;SI temp0; |
2ddc0492 | 799 | temp0 = ADDSI (ANDSI (CPU (h_pc), -4), 4); |
a040908c | 800 | temp1 = ANDSI (* FLD (f_r2), -4); |
190659a2 DE |
801 | { |
802 | SI opval = temp0; | |
803 | CPU (h_gr[((HOSTUINT) 14)]) = opval; | |
804 | TRACE_RESULT (current_cpu, "gr-14", 'x', opval); | |
805 | } | |
806 | { | |
807 | USI opval = temp1; | |
808 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, opval)); | |
809 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
810 | } | |
2ddc0492 | 811 | } while (0); |
e0bd6e18 | 812 | |
2ddc0492 DE |
813 | #undef FLD |
814 | } | |
815 | BREAK (sem); | |
816 | ||
817 | CASE (sem, INSN_JMP) : /* jmp $sr */ | |
818 | { | |
970a8fd6 | 819 | #define FLD(f) abuf->fields.fmt_jmp.f |
02310b01 | 820 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 821 | |
190659a2 DE |
822 | { |
823 | USI opval = ANDSI (* FLD (f_r2), -4); | |
824 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, opval)); | |
825 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
826 | } | |
e0bd6e18 | 827 | |
2ddc0492 DE |
828 | #undef FLD |
829 | } | |
830 | BREAK (sem); | |
831 | ||
832 | CASE (sem, INSN_LD) : /* ld $dr,@$sr */ | |
833 | { | |
970a8fd6 | 834 | #define FLD(f) abuf->fields.fmt_ld.f |
02310b01 | 835 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 836 | |
190659a2 DE |
837 | { |
838 | SI opval = GETMEMSI (current_cpu, * FLD (f_r2)); | |
839 | * FLD (f_r1) = opval; | |
840 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
841 | } | |
e0bd6e18 | 842 | |
2ddc0492 DE |
843 | #undef FLD |
844 | } | |
845 | BREAK (sem); | |
846 | ||
847 | CASE (sem, INSN_LD_D) : /* ld $dr,@($slo16,$sr) */ | |
848 | { | |
970a8fd6 | 849 | #define FLD(f) abuf->fields.fmt_ld_d.f |
02310b01 | 850 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 851 | |
190659a2 DE |
852 | { |
853 | SI opval = GETMEMSI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16))); | |
854 | * FLD (f_r1) = opval; | |
855 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
856 | } | |
e0bd6e18 | 857 | |
2ddc0492 DE |
858 | #undef FLD |
859 | } | |
860 | BREAK (sem); | |
861 | ||
862 | CASE (sem, INSN_LDB) : /* ldb $dr,@$sr */ | |
863 | { | |
970a8fd6 | 864 | #define FLD(f) abuf->fields.fmt_ldb.f |
02310b01 | 865 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 866 | |
190659a2 DE |
867 | { |
868 | SI opval = EXTQISI (GETMEMQI (current_cpu, * FLD (f_r2))); | |
869 | * FLD (f_r1) = opval; | |
870 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
871 | } | |
e0bd6e18 | 872 | |
2ddc0492 DE |
873 | #undef FLD |
874 | } | |
875 | BREAK (sem); | |
876 | ||
877 | CASE (sem, INSN_LDB_D) : /* ldb $dr,@($slo16,$sr) */ | |
878 | { | |
970a8fd6 | 879 | #define FLD(f) abuf->fields.fmt_ldb_d.f |
02310b01 | 880 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 881 | |
190659a2 DE |
882 | { |
883 | SI opval = EXTQISI (GETMEMQI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)))); | |
884 | * FLD (f_r1) = opval; | |
885 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
886 | } | |
e0bd6e18 | 887 | |
2ddc0492 DE |
888 | #undef FLD |
889 | } | |
890 | BREAK (sem); | |
891 | ||
892 | CASE (sem, INSN_LDH) : /* ldh $dr,@$sr */ | |
893 | { | |
970a8fd6 | 894 | #define FLD(f) abuf->fields.fmt_ldh.f |
02310b01 | 895 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 896 | |
190659a2 DE |
897 | { |
898 | SI opval = EXTHISI (GETMEMHI (current_cpu, * FLD (f_r2))); | |
899 | * FLD (f_r1) = opval; | |
900 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
901 | } | |
e0bd6e18 | 902 | |
2ddc0492 DE |
903 | #undef FLD |
904 | } | |
905 | BREAK (sem); | |
906 | ||
907 | CASE (sem, INSN_LDH_D) : /* ldh $dr,@($slo16,$sr) */ | |
908 | { | |
970a8fd6 | 909 | #define FLD(f) abuf->fields.fmt_ldh_d.f |
02310b01 | 910 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 911 | |
190659a2 DE |
912 | { |
913 | SI opval = EXTHISI (GETMEMHI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)))); | |
914 | * FLD (f_r1) = opval; | |
915 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
916 | } | |
e0bd6e18 | 917 | |
2ddc0492 DE |
918 | #undef FLD |
919 | } | |
920 | BREAK (sem); | |
921 | ||
922 | CASE (sem, INSN_LDUB) : /* ldub $dr,@$sr */ | |
923 | { | |
970a8fd6 | 924 | #define FLD(f) abuf->fields.fmt_ldb.f |
02310b01 | 925 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 926 | |
190659a2 DE |
927 | { |
928 | SI opval = ZEXTQISI (GETMEMQI (current_cpu, * FLD (f_r2))); | |
929 | * FLD (f_r1) = opval; | |
930 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
931 | } | |
e0bd6e18 | 932 | |
2ddc0492 DE |
933 | #undef FLD |
934 | } | |
935 | BREAK (sem); | |
936 | ||
937 | CASE (sem, INSN_LDUB_D) : /* ldub $dr,@($slo16,$sr) */ | |
938 | { | |
970a8fd6 | 939 | #define FLD(f) abuf->fields.fmt_ldb_d.f |
02310b01 | 940 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 941 | |
190659a2 DE |
942 | { |
943 | SI opval = ZEXTQISI (GETMEMQI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)))); | |
944 | * FLD (f_r1) = opval; | |
945 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
946 | } | |
e0bd6e18 | 947 | |
2ddc0492 DE |
948 | #undef FLD |
949 | } | |
950 | BREAK (sem); | |
951 | ||
952 | CASE (sem, INSN_LDUH) : /* lduh $dr,@$sr */ | |
953 | { | |
970a8fd6 | 954 | #define FLD(f) abuf->fields.fmt_ldh.f |
02310b01 | 955 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 956 | |
190659a2 DE |
957 | { |
958 | SI opval = ZEXTHISI (GETMEMHI (current_cpu, * FLD (f_r2))); | |
959 | * FLD (f_r1) = opval; | |
960 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
961 | } | |
e0bd6e18 | 962 | |
2ddc0492 DE |
963 | #undef FLD |
964 | } | |
965 | BREAK (sem); | |
966 | ||
967 | CASE (sem, INSN_LDUH_D) : /* lduh $dr,@($slo16,$sr) */ | |
968 | { | |
970a8fd6 | 969 | #define FLD(f) abuf->fields.fmt_ldh_d.f |
02310b01 | 970 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 971 | |
190659a2 DE |
972 | { |
973 | SI opval = ZEXTHISI (GETMEMHI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)))); | |
974 | * FLD (f_r1) = opval; | |
975 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
976 | } | |
e0bd6e18 | 977 | |
2ddc0492 DE |
978 | #undef FLD |
979 | } | |
980 | BREAK (sem); | |
981 | ||
982 | CASE (sem, INSN_LD_PLUS) : /* ld $dr,@$sr+ */ | |
983 | { | |
970a8fd6 | 984 | #define FLD(f) abuf->fields.fmt_ld_plus.f |
02310b01 | 985 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 986 | |
2ddc0492 DE |
987 | do { |
988 | SI temp1;SI temp0; | |
989 | temp0 = GETMEMSI (current_cpu, * FLD (f_r2)); | |
990 | temp1 = ADDSI (* FLD (f_r2), 4); | |
190659a2 DE |
991 | { |
992 | SI opval = temp0; | |
993 | * FLD (f_r1) = opval; | |
994 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
995 | } | |
996 | { | |
997 | SI opval = temp1; | |
998 | * FLD (f_r2) = opval; | |
999 | TRACE_RESULT (current_cpu, "sr", 'x', opval); | |
1000 | } | |
2ddc0492 | 1001 | } while (0); |
e0bd6e18 | 1002 | |
2ddc0492 DE |
1003 | #undef FLD |
1004 | } | |
1005 | BREAK (sem); | |
1006 | ||
970a8fd6 | 1007 | CASE (sem, INSN_LD24) : /* ld24 $dr,$uimm24 */ |
2ddc0492 | 1008 | { |
970a8fd6 | 1009 | #define FLD(f) abuf->fields.fmt_ld24.f |
02310b01 | 1010 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1011 | |
190659a2 DE |
1012 | { |
1013 | SI opval = FLD (f_uimm24); | |
1014 | * FLD (f_r1) = opval; | |
1015 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1016 | } | |
e0bd6e18 | 1017 | |
2ddc0492 DE |
1018 | #undef FLD |
1019 | } | |
1020 | BREAK (sem); | |
1021 | ||
a8981d67 | 1022 | CASE (sem, INSN_LDI8) : /* ldi8 $dr,$simm8 */ |
2ddc0492 | 1023 | { |
970a8fd6 | 1024 | #define FLD(f) abuf->fields.fmt_ldi8.f |
02310b01 | 1025 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1026 | |
190659a2 DE |
1027 | { |
1028 | SI opval = FLD (f_simm8); | |
1029 | * FLD (f_r1) = opval; | |
1030 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1031 | } | |
e0bd6e18 | 1032 | |
2ddc0492 DE |
1033 | #undef FLD |
1034 | } | |
1035 | BREAK (sem); | |
1036 | ||
a8981d67 | 1037 | CASE (sem, INSN_LDI16) : /* ldi16 $dr,$hash$slo16 */ |
2ddc0492 | 1038 | { |
970a8fd6 | 1039 | #define FLD(f) abuf->fields.fmt_ldi16.f |
02310b01 | 1040 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1041 | |
190659a2 DE |
1042 | { |
1043 | SI opval = FLD (f_simm16); | |
1044 | * FLD (f_r1) = opval; | |
1045 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1046 | } | |
e0bd6e18 | 1047 | |
2ddc0492 DE |
1048 | #undef FLD |
1049 | } | |
1050 | BREAK (sem); | |
1051 | ||
1052 | CASE (sem, INSN_LOCK) : /* lock $dr,@$sr */ | |
1053 | { | |
970a8fd6 | 1054 | #define FLD(f) abuf->fields.fmt_lock.f |
02310b01 | 1055 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1056 | |
cab58155 | 1057 | do { |
190659a2 DE |
1058 | { |
1059 | UBI opval = 1; | |
1060 | CPU (h_lock) = opval; | |
1061 | TRACE_RESULT (current_cpu, "lock-0", 'x', opval); | |
1062 | } | |
1063 | { | |
1064 | SI opval = GETMEMSI (current_cpu, * FLD (f_r2)); | |
1065 | * FLD (f_r1) = opval; | |
1066 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1067 | } | |
cab58155 | 1068 | } while (0); |
e0bd6e18 | 1069 | |
2ddc0492 DE |
1070 | #undef FLD |
1071 | } | |
1072 | BREAK (sem); | |
1073 | ||
1074 | CASE (sem, INSN_MACHI) : /* machi $src1,$src2 */ | |
1075 | { | |
970a8fd6 | 1076 | #define FLD(f) abuf->fields.fmt_machi.f |
02310b01 | 1077 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1078 | |
190659a2 DE |
1079 | { |
1080 | DI opval = SRADI (SLLDI (ADDDI (m32rb_h_accum_get (current_cpu), MULDI (EXTSIDI (ANDSI (* FLD (f_r1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2), 16))))), 8), 8); | |
1081 | m32rb_h_accum_set (current_cpu, opval); | |
1082 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1083 | } | |
e0bd6e18 | 1084 | |
2ddc0492 DE |
1085 | #undef FLD |
1086 | } | |
1087 | BREAK (sem); | |
1088 | ||
1089 | CASE (sem, INSN_MACLO) : /* maclo $src1,$src2 */ | |
1090 | { | |
970a8fd6 | 1091 | #define FLD(f) abuf->fields.fmt_machi.f |
02310b01 | 1092 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1093 | |
190659a2 DE |
1094 | { |
1095 | DI opval = SRADI (SLLDI (ADDDI (m32rb_h_accum_get (current_cpu), MULDI (EXTSIDI (SLLSI (* FLD (f_r1), 16)), EXTHIDI (TRUNCSIHI (* FLD (f_r2))))), 8), 8); | |
1096 | m32rb_h_accum_set (current_cpu, opval); | |
1097 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1098 | } | |
e0bd6e18 | 1099 | |
2ddc0492 DE |
1100 | #undef FLD |
1101 | } | |
1102 | BREAK (sem); | |
1103 | ||
1104 | CASE (sem, INSN_MACWHI) : /* macwhi $src1,$src2 */ | |
1105 | { | |
970a8fd6 | 1106 | #define FLD(f) abuf->fields.fmt_machi.f |
02310b01 | 1107 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1108 | |
190659a2 DE |
1109 | { |
1110 | DI opval = SRADI (SLLDI (ADDDI (m32rb_h_accum_get (current_cpu), MULDI (EXTSIDI (* FLD (f_r1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2), 16))))), 8), 8); | |
1111 | m32rb_h_accum_set (current_cpu, opval); | |
1112 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1113 | } | |
e0bd6e18 | 1114 | |
2ddc0492 DE |
1115 | #undef FLD |
1116 | } | |
1117 | BREAK (sem); | |
1118 | ||
1119 | CASE (sem, INSN_MACWLO) : /* macwlo $src1,$src2 */ | |
1120 | { | |
970a8fd6 | 1121 | #define FLD(f) abuf->fields.fmt_machi.f |
02310b01 | 1122 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1123 | |
190659a2 DE |
1124 | { |
1125 | DI opval = SRADI (SLLDI (ADDDI (m32rb_h_accum_get (current_cpu), MULDI (EXTSIDI (* FLD (f_r1)), EXTHIDI (TRUNCSIHI (* FLD (f_r2))))), 8), 8); | |
1126 | m32rb_h_accum_set (current_cpu, opval); | |
1127 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1128 | } | |
e0bd6e18 | 1129 | |
2ddc0492 DE |
1130 | #undef FLD |
1131 | } | |
1132 | BREAK (sem); | |
1133 | ||
1134 | CASE (sem, INSN_MUL) : /* mul $dr,$sr */ | |
1135 | { | |
970a8fd6 | 1136 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 1137 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1138 | |
190659a2 DE |
1139 | { |
1140 | SI opval = MULSI (* FLD (f_r1), * FLD (f_r2)); | |
1141 | * FLD (f_r1) = opval; | |
1142 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1143 | } | |
e0bd6e18 | 1144 | |
2ddc0492 DE |
1145 | #undef FLD |
1146 | } | |
1147 | BREAK (sem); | |
1148 | ||
1149 | CASE (sem, INSN_MULHI) : /* mulhi $src1,$src2 */ | |
1150 | { | |
970a8fd6 | 1151 | #define FLD(f) abuf->fields.fmt_mulhi.f |
02310b01 | 1152 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1153 | |
190659a2 DE |
1154 | { |
1155 | DI opval = SRADI (SLLDI (MULDI (EXTSIDI (ANDSI (* FLD (f_r1), 0xffff0000)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2), 16)))), 16), 16); | |
1156 | m32rb_h_accum_set (current_cpu, opval); | |
1157 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1158 | } | |
e0bd6e18 | 1159 | |
2ddc0492 DE |
1160 | #undef FLD |
1161 | } | |
1162 | BREAK (sem); | |
1163 | ||
1164 | CASE (sem, INSN_MULLO) : /* mullo $src1,$src2 */ | |
1165 | { | |
970a8fd6 | 1166 | #define FLD(f) abuf->fields.fmt_mulhi.f |
02310b01 | 1167 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1168 | |
190659a2 DE |
1169 | { |
1170 | DI opval = SRADI (SLLDI (MULDI (EXTSIDI (SLLSI (* FLD (f_r1), 16)), EXTHIDI (TRUNCSIHI (* FLD (f_r2)))), 16), 16); | |
1171 | m32rb_h_accum_set (current_cpu, opval); | |
1172 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1173 | } | |
e0bd6e18 | 1174 | |
2ddc0492 DE |
1175 | #undef FLD |
1176 | } | |
1177 | BREAK (sem); | |
1178 | ||
1179 | CASE (sem, INSN_MULWHI) : /* mulwhi $src1,$src2 */ | |
1180 | { | |
970a8fd6 | 1181 | #define FLD(f) abuf->fields.fmt_mulhi.f |
02310b01 | 1182 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1183 | |
190659a2 DE |
1184 | { |
1185 | DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (f_r1)), EXTHIDI (TRUNCSIHI (SRASI (* FLD (f_r2), 16)))), 8), 8); | |
1186 | m32rb_h_accum_set (current_cpu, opval); | |
1187 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1188 | } | |
e0bd6e18 | 1189 | |
2ddc0492 DE |
1190 | #undef FLD |
1191 | } | |
1192 | BREAK (sem); | |
1193 | ||
1194 | CASE (sem, INSN_MULWLO) : /* mulwlo $src1,$src2 */ | |
1195 | { | |
970a8fd6 | 1196 | #define FLD(f) abuf->fields.fmt_mulhi.f |
02310b01 | 1197 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1198 | |
190659a2 DE |
1199 | { |
1200 | DI opval = SRADI (SLLDI (MULDI (EXTSIDI (* FLD (f_r1)), EXTHIDI (TRUNCSIHI (* FLD (f_r2)))), 8), 8); | |
1201 | m32rb_h_accum_set (current_cpu, opval); | |
1202 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1203 | } | |
e0bd6e18 | 1204 | |
2ddc0492 DE |
1205 | #undef FLD |
1206 | } | |
1207 | BREAK (sem); | |
1208 | ||
1209 | CASE (sem, INSN_MV) : /* mv $dr,$sr */ | |
1210 | { | |
970a8fd6 | 1211 | #define FLD(f) abuf->fields.fmt_mv.f |
02310b01 | 1212 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1213 | |
190659a2 DE |
1214 | { |
1215 | SI opval = * FLD (f_r2); | |
1216 | * FLD (f_r1) = opval; | |
1217 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1218 | } | |
e0bd6e18 | 1219 | |
2ddc0492 DE |
1220 | #undef FLD |
1221 | } | |
1222 | BREAK (sem); | |
1223 | ||
1224 | CASE (sem, INSN_MVFACHI) : /* mvfachi $dr */ | |
1225 | { | |
970a8fd6 | 1226 | #define FLD(f) abuf->fields.fmt_mvfachi.f |
02310b01 | 1227 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1228 | |
190659a2 DE |
1229 | { |
1230 | SI opval = TRUNCDISI (SRADI (m32rb_h_accum_get (current_cpu), 32)); | |
1231 | * FLD (f_r1) = opval; | |
1232 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1233 | } | |
e0bd6e18 | 1234 | |
2ddc0492 DE |
1235 | #undef FLD |
1236 | } | |
1237 | BREAK (sem); | |
1238 | ||
1239 | CASE (sem, INSN_MVFACLO) : /* mvfaclo $dr */ | |
1240 | { | |
970a8fd6 | 1241 | #define FLD(f) abuf->fields.fmt_mvfachi.f |
02310b01 | 1242 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1243 | |
190659a2 DE |
1244 | { |
1245 | SI opval = TRUNCDISI (m32rb_h_accum_get (current_cpu)); | |
1246 | * FLD (f_r1) = opval; | |
1247 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1248 | } | |
e0bd6e18 | 1249 | |
2ddc0492 DE |
1250 | #undef FLD |
1251 | } | |
1252 | BREAK (sem); | |
1253 | ||
1254 | CASE (sem, INSN_MVFACMI) : /* mvfacmi $dr */ | |
1255 | { | |
970a8fd6 | 1256 | #define FLD(f) abuf->fields.fmt_mvfachi.f |
02310b01 | 1257 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1258 | |
190659a2 DE |
1259 | { |
1260 | SI opval = TRUNCDISI (SRADI (m32rb_h_accum_get (current_cpu), 16)); | |
1261 | * FLD (f_r1) = opval; | |
1262 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1263 | } | |
e0bd6e18 | 1264 | |
2ddc0492 DE |
1265 | #undef FLD |
1266 | } | |
1267 | BREAK (sem); | |
1268 | ||
1269 | CASE (sem, INSN_MVFC) : /* mvfc $dr,$scr */ | |
1270 | { | |
970a8fd6 | 1271 | #define FLD(f) abuf->fields.fmt_mvfc.f |
02310b01 | 1272 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1273 | |
190659a2 DE |
1274 | { |
1275 | SI opval = m32rb_h_cr_get (current_cpu, FLD (f_r2)); | |
1276 | * FLD (f_r1) = opval; | |
1277 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1278 | } | |
e0bd6e18 | 1279 | |
2ddc0492 DE |
1280 | #undef FLD |
1281 | } | |
1282 | BREAK (sem); | |
1283 | ||
1284 | CASE (sem, INSN_MVTACHI) : /* mvtachi $src1 */ | |
1285 | { | |
970a8fd6 | 1286 | #define FLD(f) abuf->fields.fmt_mvtachi.f |
02310b01 | 1287 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1288 | |
190659a2 DE |
1289 | { |
1290 | DI opval = ORDI (ANDDI (m32rb_h_accum_get (current_cpu), MAKEDI (0, 0xffffffff)), SLLDI (EXTSIDI (* FLD (f_r1)), 32)); | |
1291 | m32rb_h_accum_set (current_cpu, opval); | |
1292 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1293 | } | |
e0bd6e18 | 1294 | |
2ddc0492 DE |
1295 | #undef FLD |
1296 | } | |
1297 | BREAK (sem); | |
1298 | ||
1299 | CASE (sem, INSN_MVTACLO) : /* mvtaclo $src1 */ | |
1300 | { | |
970a8fd6 | 1301 | #define FLD(f) abuf->fields.fmt_mvtachi.f |
02310b01 | 1302 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1303 | |
190659a2 DE |
1304 | { |
1305 | DI opval = ORDI (ANDDI (m32rb_h_accum_get (current_cpu), MAKEDI (0xffffffff, 0)), ZEXTSIDI (* FLD (f_r1))); | |
1306 | m32rb_h_accum_set (current_cpu, opval); | |
1307 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1308 | } | |
e0bd6e18 | 1309 | |
2ddc0492 DE |
1310 | #undef FLD |
1311 | } | |
1312 | BREAK (sem); | |
1313 | ||
1314 | CASE (sem, INSN_MVTC) : /* mvtc $sr,$dcr */ | |
1315 | { | |
970a8fd6 | 1316 | #define FLD(f) abuf->fields.fmt_mvtc.f |
02310b01 | 1317 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1318 | |
190659a2 DE |
1319 | { |
1320 | USI opval = * FLD (f_r2); | |
1321 | m32rb_h_cr_set (current_cpu, FLD (f_r1), opval); | |
1322 | TRACE_RESULT (current_cpu, "dcr", 'x', opval); | |
1323 | } | |
e0bd6e18 | 1324 | |
2ddc0492 DE |
1325 | #undef FLD |
1326 | } | |
1327 | BREAK (sem); | |
1328 | ||
1329 | CASE (sem, INSN_NEG) : /* neg $dr,$sr */ | |
1330 | { | |
970a8fd6 | 1331 | #define FLD(f) abuf->fields.fmt_mv.f |
02310b01 | 1332 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1333 | |
190659a2 DE |
1334 | { |
1335 | SI opval = NEGSI (* FLD (f_r2)); | |
1336 | * FLD (f_r1) = opval; | |
1337 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1338 | } | |
e0bd6e18 | 1339 | |
2ddc0492 DE |
1340 | #undef FLD |
1341 | } | |
1342 | BREAK (sem); | |
1343 | ||
1344 | CASE (sem, INSN_NOP) : /* nop */ | |
1345 | { | |
970a8fd6 | 1346 | #define FLD(f) abuf->fields.fmt_nop.f |
02310b01 | 1347 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1348 | |
2ddc0492 | 1349 | PROFILE_COUNT_FILLNOPS (current_cpu, abuf->addr); |
e0bd6e18 | 1350 | |
2ddc0492 DE |
1351 | #undef FLD |
1352 | } | |
1353 | BREAK (sem); | |
1354 | ||
1355 | CASE (sem, INSN_NOT) : /* not $dr,$sr */ | |
1356 | { | |
970a8fd6 | 1357 | #define FLD(f) abuf->fields.fmt_mv.f |
02310b01 | 1358 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1359 | |
190659a2 DE |
1360 | { |
1361 | SI opval = INVSI (* FLD (f_r2)); | |
1362 | * FLD (f_r1) = opval; | |
1363 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1364 | } | |
e0bd6e18 | 1365 | |
2ddc0492 DE |
1366 | #undef FLD |
1367 | } | |
1368 | BREAK (sem); | |
1369 | ||
1370 | CASE (sem, INSN_RAC) : /* rac */ | |
1371 | { | |
970a8fd6 | 1372 | #define FLD(f) abuf->fields.fmt_rac.f |
02310b01 | 1373 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1374 | |
2ddc0492 DE |
1375 | do { |
1376 | DI tmp_tmp1; | |
190659a2 | 1377 | tmp_tmp1 = SLLDI (m32rb_h_accum_get (current_cpu), 1); |
e0bd6e18 | 1378 | tmp_tmp1 = ADDDI (tmp_tmp1, MAKEDI (0, 32768)); |
190659a2 DE |
1379 | { |
1380 | DI opval = (GTDI (tmp_tmp1, MAKEDI (32767, 0xffff0000))) ? (MAKEDI (32767, 0xffff0000)) : (LTDI (tmp_tmp1, MAKEDI (0xffff8000, 0))) ? (MAKEDI (0xffff8000, 0)) : (ANDDI (tmp_tmp1, MAKEDI (0xffffffff, 0xffff0000))); | |
1381 | m32rb_h_accum_set (current_cpu, opval); | |
1382 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1383 | } | |
2ddc0492 | 1384 | } while (0); |
e0bd6e18 | 1385 | |
2ddc0492 DE |
1386 | #undef FLD |
1387 | } | |
1388 | BREAK (sem); | |
1389 | ||
1390 | CASE (sem, INSN_RACH) : /* rach */ | |
1391 | { | |
970a8fd6 | 1392 | #define FLD(f) abuf->fields.fmt_rac.f |
02310b01 | 1393 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1394 | |
2ddc0492 DE |
1395 | do { |
1396 | DI tmp_tmp1; | |
190659a2 | 1397 | tmp_tmp1 = ANDDI (m32rb_h_accum_get (current_cpu), MAKEDI (16777215, 0xffffffff)); |
a040908c | 1398 | if (ANDIF (GEDI (tmp_tmp1, MAKEDI (16383, 0x80000000)), LEDI (tmp_tmp1, MAKEDI (8388607, 0xffffffff)))) { |
2ddc0492 DE |
1399 | tmp_tmp1 = MAKEDI (16383, 0x80000000); |
1400 | } else { | |
a040908c | 1401 | if (ANDIF (GEDI (tmp_tmp1, MAKEDI (8388608, 0)), LEDI (tmp_tmp1, MAKEDI (16760832, 0)))) { |
2ddc0492 DE |
1402 | tmp_tmp1 = MAKEDI (16760832, 0); |
1403 | } else { | |
190659a2 | 1404 | tmp_tmp1 = ANDDI (ADDDI (m32rb_h_accum_get (current_cpu), MAKEDI (0, 1073741824)), MAKEDI (0xffffffff, 0x80000000)); |
2ddc0492 DE |
1405 | } |
1406 | } | |
1407 | tmp_tmp1 = SLLDI (tmp_tmp1, 1); | |
190659a2 DE |
1408 | { |
1409 | DI opval = SRADI (SLLDI (tmp_tmp1, 7), 7); | |
1410 | m32rb_h_accum_set (current_cpu, opval); | |
1411 | TRACE_RESULT (current_cpu, "accum", 'D', opval); | |
1412 | } | |
2ddc0492 | 1413 | } while (0); |
e0bd6e18 | 1414 | |
2ddc0492 DE |
1415 | #undef FLD |
1416 | } | |
1417 | BREAK (sem); | |
1418 | ||
1419 | CASE (sem, INSN_RTE) : /* rte */ | |
1420 | { | |
970a8fd6 | 1421 | #define FLD(f) abuf->fields.fmt_rte.f |
02310b01 | 1422 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1423 | |
2ddc0492 | 1424 | do { |
190659a2 DE |
1425 | { |
1426 | UBI opval = CPU (h_bsm); | |
1427 | CPU (h_sm) = opval; | |
1428 | TRACE_RESULT (current_cpu, "sm-0", 'x', opval); | |
1429 | } | |
1430 | { | |
1431 | UBI opval = CPU (h_bie); | |
1432 | CPU (h_ie) = opval; | |
1433 | TRACE_RESULT (current_cpu, "ie-0", 'x', opval); | |
1434 | } | |
1435 | { | |
1436 | UBI opval = CPU (h_bcond); | |
1437 | CPU (h_cond) = opval; | |
1438 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
1439 | } | |
1440 | { | |
1441 | USI opval = ANDSI (CPU (h_bpc), -4); | |
1442 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, opval)); | |
1443 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
1444 | } | |
2ddc0492 | 1445 | } while (0); |
e0bd6e18 | 1446 | |
2ddc0492 DE |
1447 | #undef FLD |
1448 | } | |
1449 | BREAK (sem); | |
1450 | ||
970a8fd6 | 1451 | CASE (sem, INSN_SETH) : /* seth $dr,$hash$hi16 */ |
2ddc0492 | 1452 | { |
970a8fd6 | 1453 | #define FLD(f) abuf->fields.fmt_seth.f |
02310b01 | 1454 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1455 | |
190659a2 DE |
1456 | { |
1457 | SI opval = SLLSI (FLD (f_hi16), 16); | |
1458 | * FLD (f_r1) = opval; | |
1459 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1460 | } | |
e0bd6e18 | 1461 | |
2ddc0492 DE |
1462 | #undef FLD |
1463 | } | |
1464 | BREAK (sem); | |
1465 | ||
1466 | CASE (sem, INSN_SLL) : /* sll $dr,$sr */ | |
1467 | { | |
970a8fd6 | 1468 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 1469 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1470 | |
190659a2 DE |
1471 | { |
1472 | SI opval = SLLSI (* FLD (f_r1), ANDSI (* FLD (f_r2), 31)); | |
1473 | * FLD (f_r1) = opval; | |
1474 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1475 | } | |
e0bd6e18 | 1476 | |
2ddc0492 DE |
1477 | #undef FLD |
1478 | } | |
1479 | BREAK (sem); | |
1480 | ||
970a8fd6 | 1481 | CASE (sem, INSN_SLL3) : /* sll3 $dr,$sr,$simm16 */ |
2ddc0492 | 1482 | { |
970a8fd6 | 1483 | #define FLD(f) abuf->fields.fmt_sll3.f |
02310b01 | 1484 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1485 | |
190659a2 DE |
1486 | { |
1487 | SI opval = SLLSI (* FLD (f_r2), ANDSI (FLD (f_simm16), 31)); | |
1488 | * FLD (f_r1) = opval; | |
1489 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1490 | } | |
e0bd6e18 | 1491 | |
2ddc0492 DE |
1492 | #undef FLD |
1493 | } | |
1494 | BREAK (sem); | |
1495 | ||
970a8fd6 | 1496 | CASE (sem, INSN_SLLI) : /* slli $dr,$uimm5 */ |
2ddc0492 | 1497 | { |
970a8fd6 | 1498 | #define FLD(f) abuf->fields.fmt_slli.f |
02310b01 | 1499 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1500 | |
190659a2 DE |
1501 | { |
1502 | SI opval = SLLSI (* FLD (f_r1), FLD (f_uimm5)); | |
1503 | * FLD (f_r1) = opval; | |
1504 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1505 | } | |
e0bd6e18 | 1506 | |
2ddc0492 DE |
1507 | #undef FLD |
1508 | } | |
1509 | BREAK (sem); | |
1510 | ||
1511 | CASE (sem, INSN_SRA) : /* sra $dr,$sr */ | |
1512 | { | |
970a8fd6 | 1513 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 1514 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1515 | |
190659a2 DE |
1516 | { |
1517 | SI opval = SRASI (* FLD (f_r1), ANDSI (* FLD (f_r2), 31)); | |
1518 | * FLD (f_r1) = opval; | |
1519 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1520 | } | |
e0bd6e18 | 1521 | |
2ddc0492 DE |
1522 | #undef FLD |
1523 | } | |
1524 | BREAK (sem); | |
1525 | ||
970a8fd6 | 1526 | CASE (sem, INSN_SRA3) : /* sra3 $dr,$sr,$simm16 */ |
2ddc0492 | 1527 | { |
970a8fd6 | 1528 | #define FLD(f) abuf->fields.fmt_sll3.f |
02310b01 | 1529 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1530 | |
190659a2 DE |
1531 | { |
1532 | SI opval = SRASI (* FLD (f_r2), ANDSI (FLD (f_simm16), 31)); | |
1533 | * FLD (f_r1) = opval; | |
1534 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1535 | } | |
e0bd6e18 | 1536 | |
2ddc0492 DE |
1537 | #undef FLD |
1538 | } | |
1539 | BREAK (sem); | |
1540 | ||
970a8fd6 | 1541 | CASE (sem, INSN_SRAI) : /* srai $dr,$uimm5 */ |
2ddc0492 | 1542 | { |
970a8fd6 | 1543 | #define FLD(f) abuf->fields.fmt_slli.f |
02310b01 | 1544 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1545 | |
190659a2 DE |
1546 | { |
1547 | SI opval = SRASI (* FLD (f_r1), FLD (f_uimm5)); | |
1548 | * FLD (f_r1) = opval; | |
1549 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1550 | } | |
e0bd6e18 | 1551 | |
2ddc0492 DE |
1552 | #undef FLD |
1553 | } | |
1554 | BREAK (sem); | |
1555 | ||
1556 | CASE (sem, INSN_SRL) : /* srl $dr,$sr */ | |
1557 | { | |
970a8fd6 | 1558 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 1559 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1560 | |
190659a2 DE |
1561 | { |
1562 | SI opval = SRLSI (* FLD (f_r1), ANDSI (* FLD (f_r2), 31)); | |
1563 | * FLD (f_r1) = opval; | |
1564 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1565 | } | |
e0bd6e18 | 1566 | |
2ddc0492 DE |
1567 | #undef FLD |
1568 | } | |
1569 | BREAK (sem); | |
1570 | ||
970a8fd6 | 1571 | CASE (sem, INSN_SRL3) : /* srl3 $dr,$sr,$simm16 */ |
2ddc0492 | 1572 | { |
970a8fd6 | 1573 | #define FLD(f) abuf->fields.fmt_sll3.f |
02310b01 | 1574 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1575 | |
190659a2 DE |
1576 | { |
1577 | SI opval = SRLSI (* FLD (f_r2), ANDSI (FLD (f_simm16), 31)); | |
1578 | * FLD (f_r1) = opval; | |
1579 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1580 | } | |
e0bd6e18 | 1581 | |
2ddc0492 DE |
1582 | #undef FLD |
1583 | } | |
1584 | BREAK (sem); | |
1585 | ||
970a8fd6 | 1586 | CASE (sem, INSN_SRLI) : /* srli $dr,$uimm5 */ |
2ddc0492 | 1587 | { |
970a8fd6 | 1588 | #define FLD(f) abuf->fields.fmt_slli.f |
02310b01 | 1589 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1590 | |
190659a2 DE |
1591 | { |
1592 | SI opval = SRLSI (* FLD (f_r1), FLD (f_uimm5)); | |
1593 | * FLD (f_r1) = opval; | |
1594 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1595 | } | |
e0bd6e18 | 1596 | |
2ddc0492 DE |
1597 | #undef FLD |
1598 | } | |
1599 | BREAK (sem); | |
1600 | ||
1601 | CASE (sem, INSN_ST) : /* st $src1,@$src2 */ | |
1602 | { | |
970a8fd6 | 1603 | #define FLD(f) abuf->fields.fmt_st.f |
02310b01 | 1604 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1605 | |
190659a2 DE |
1606 | { |
1607 | SI opval = * FLD (f_r1); | |
1608 | SETMEMSI (current_cpu, * FLD (f_r2), opval); | |
1609 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1610 | } | |
e0bd6e18 | 1611 | |
2ddc0492 DE |
1612 | #undef FLD |
1613 | } | |
1614 | BREAK (sem); | |
1615 | ||
1616 | CASE (sem, INSN_ST_D) : /* st $src1,@($slo16,$src2) */ | |
1617 | { | |
970a8fd6 | 1618 | #define FLD(f) abuf->fields.fmt_st_d.f |
02310b01 | 1619 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1620 | |
190659a2 DE |
1621 | { |
1622 | SI opval = * FLD (f_r1); | |
1623 | SETMEMSI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)), opval); | |
1624 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1625 | } | |
e0bd6e18 | 1626 | |
2ddc0492 DE |
1627 | #undef FLD |
1628 | } | |
1629 | BREAK (sem); | |
1630 | ||
1631 | CASE (sem, INSN_STB) : /* stb $src1,@$src2 */ | |
1632 | { | |
970a8fd6 | 1633 | #define FLD(f) abuf->fields.fmt_stb.f |
02310b01 | 1634 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1635 | |
190659a2 DE |
1636 | { |
1637 | QI opval = * FLD (f_r1); | |
1638 | SETMEMQI (current_cpu, * FLD (f_r2), opval); | |
1639 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1640 | } | |
e0bd6e18 | 1641 | |
2ddc0492 DE |
1642 | #undef FLD |
1643 | } | |
1644 | BREAK (sem); | |
1645 | ||
1646 | CASE (sem, INSN_STB_D) : /* stb $src1,@($slo16,$src2) */ | |
1647 | { | |
970a8fd6 | 1648 | #define FLD(f) abuf->fields.fmt_stb_d.f |
02310b01 | 1649 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1650 | |
190659a2 DE |
1651 | { |
1652 | QI opval = * FLD (f_r1); | |
1653 | SETMEMQI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)), opval); | |
1654 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1655 | } | |
e0bd6e18 | 1656 | |
2ddc0492 DE |
1657 | #undef FLD |
1658 | } | |
1659 | BREAK (sem); | |
1660 | ||
1661 | CASE (sem, INSN_STH) : /* sth $src1,@$src2 */ | |
1662 | { | |
970a8fd6 | 1663 | #define FLD(f) abuf->fields.fmt_sth.f |
02310b01 | 1664 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1665 | |
190659a2 DE |
1666 | { |
1667 | HI opval = * FLD (f_r1); | |
1668 | SETMEMHI (current_cpu, * FLD (f_r2), opval); | |
1669 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1670 | } | |
e0bd6e18 | 1671 | |
2ddc0492 DE |
1672 | #undef FLD |
1673 | } | |
1674 | BREAK (sem); | |
1675 | ||
1676 | CASE (sem, INSN_STH_D) : /* sth $src1,@($slo16,$src2) */ | |
1677 | { | |
970a8fd6 | 1678 | #define FLD(f) abuf->fields.fmt_sth_d.f |
02310b01 | 1679 | new_pc = SEM_NEXT_PC (sem_arg, 4); |
e0bd6e18 | 1680 | |
190659a2 DE |
1681 | { |
1682 | HI opval = * FLD (f_r1); | |
1683 | SETMEMHI (current_cpu, ADDSI (* FLD (f_r2), FLD (f_simm16)), opval); | |
1684 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1685 | } | |
e0bd6e18 | 1686 | |
2ddc0492 DE |
1687 | #undef FLD |
1688 | } | |
1689 | BREAK (sem); | |
1690 | ||
1691 | CASE (sem, INSN_ST_PLUS) : /* st $src1,@+$src2 */ | |
1692 | { | |
970a8fd6 | 1693 | #define FLD(f) abuf->fields.fmt_st_plus.f |
02310b01 | 1694 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1695 | |
2ddc0492 | 1696 | do { |
02310b01 DE |
1697 | SI tmp_new_src2; |
1698 | tmp_new_src2 = ADDSI (* FLD (f_r2), 4); | |
190659a2 DE |
1699 | { |
1700 | SI opval = * FLD (f_r1); | |
1701 | SETMEMSI (current_cpu, tmp_new_src2, opval); | |
1702 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1703 | } | |
1704 | { | |
1705 | SI opval = tmp_new_src2; | |
1706 | * FLD (f_r2) = opval; | |
1707 | TRACE_RESULT (current_cpu, "src2", 'x', opval); | |
1708 | } | |
2ddc0492 | 1709 | } while (0); |
e0bd6e18 | 1710 | |
2ddc0492 DE |
1711 | #undef FLD |
1712 | } | |
1713 | BREAK (sem); | |
1714 | ||
1715 | CASE (sem, INSN_ST_MINUS) : /* st $src1,@-$src2 */ | |
1716 | { | |
970a8fd6 | 1717 | #define FLD(f) abuf->fields.fmt_st_plus.f |
02310b01 | 1718 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1719 | |
2ddc0492 | 1720 | do { |
02310b01 DE |
1721 | SI tmp_new_src2; |
1722 | tmp_new_src2 = SUBSI (* FLD (f_r2), 4); | |
190659a2 DE |
1723 | { |
1724 | SI opval = * FLD (f_r1); | |
1725 | SETMEMSI (current_cpu, tmp_new_src2, opval); | |
1726 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1727 | } | |
1728 | { | |
1729 | SI opval = tmp_new_src2; | |
1730 | * FLD (f_r2) = opval; | |
1731 | TRACE_RESULT (current_cpu, "src2", 'x', opval); | |
1732 | } | |
2ddc0492 | 1733 | } while (0); |
e0bd6e18 | 1734 | |
2ddc0492 DE |
1735 | #undef FLD |
1736 | } | |
1737 | BREAK (sem); | |
1738 | ||
1739 | CASE (sem, INSN_SUB) : /* sub $dr,$sr */ | |
1740 | { | |
970a8fd6 | 1741 | #define FLD(f) abuf->fields.fmt_add.f |
02310b01 | 1742 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1743 | |
190659a2 DE |
1744 | { |
1745 | SI opval = SUBSI (* FLD (f_r1), * FLD (f_r2)); | |
1746 | * FLD (f_r1) = opval; | |
1747 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1748 | } | |
e0bd6e18 | 1749 | |
2ddc0492 DE |
1750 | #undef FLD |
1751 | } | |
1752 | BREAK (sem); | |
1753 | ||
1754 | CASE (sem, INSN_SUBV) : /* subv $dr,$sr */ | |
1755 | { | |
970a8fd6 | 1756 | #define FLD(f) abuf->fields.fmt_addv.f |
02310b01 | 1757 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1758 | |
2ddc0492 | 1759 | do { |
a040908c | 1760 | UBI temp1;SI temp0; |
2ddc0492 DE |
1761 | temp0 = SUBSI (* FLD (f_r1), * FLD (f_r2)); |
1762 | temp1 = SUBOFSI (* FLD (f_r1), * FLD (f_r2), 0); | |
190659a2 DE |
1763 | { |
1764 | SI opval = temp0; | |
1765 | * FLD (f_r1) = opval; | |
1766 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1767 | } | |
1768 | { | |
1769 | UBI opval = temp1; | |
1770 | CPU (h_cond) = opval; | |
1771 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
1772 | } | |
2ddc0492 | 1773 | } while (0); |
e0bd6e18 | 1774 | |
2ddc0492 DE |
1775 | #undef FLD |
1776 | } | |
1777 | BREAK (sem); | |
1778 | ||
1779 | CASE (sem, INSN_SUBX) : /* subx $dr,$sr */ | |
1780 | { | |
970a8fd6 | 1781 | #define FLD(f) abuf->fields.fmt_addx.f |
02310b01 | 1782 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1783 | |
2ddc0492 | 1784 | do { |
a040908c | 1785 | UBI temp1;SI temp0; |
2ddc0492 DE |
1786 | temp0 = SUBCSI (* FLD (f_r1), * FLD (f_r2), CPU (h_cond)); |
1787 | temp1 = SUBCFSI (* FLD (f_r1), * FLD (f_r2), CPU (h_cond)); | |
190659a2 DE |
1788 | { |
1789 | SI opval = temp0; | |
1790 | * FLD (f_r1) = opval; | |
1791 | TRACE_RESULT (current_cpu, "dr", 'x', opval); | |
1792 | } | |
1793 | { | |
1794 | UBI opval = temp1; | |
1795 | CPU (h_cond) = opval; | |
1796 | TRACE_RESULT (current_cpu, "condbit", 'x', opval); | |
1797 | } | |
2ddc0492 | 1798 | } while (0); |
e0bd6e18 | 1799 | |
2ddc0492 DE |
1800 | #undef FLD |
1801 | } | |
1802 | BREAK (sem); | |
1803 | ||
970a8fd6 | 1804 | CASE (sem, INSN_TRAP) : /* trap $uimm4 */ |
2ddc0492 | 1805 | { |
970a8fd6 | 1806 | #define FLD(f) abuf->fields.fmt_trap.f |
02310b01 | 1807 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1808 | |
cab58155 | 1809 | do { |
190659a2 DE |
1810 | { |
1811 | USI opval = ADDSI (CPU (h_pc), 4); | |
1812 | m32rb_h_cr_set (current_cpu, ((HOSTUINT) 6), opval); | |
1813 | TRACE_RESULT (current_cpu, "cr-6", 'x', opval); | |
1814 | } | |
1815 | { | |
1816 | USI opval = ANDSI (SLLSI (m32rb_h_cr_get (current_cpu, ((HOSTUINT) 0)), 8), 65408); | |
1817 | m32rb_h_cr_set (current_cpu, ((HOSTUINT) 0), opval); | |
1818 | TRACE_RESULT (current_cpu, "cr-0", 'x', opval); | |
1819 | } | |
1820 | { | |
1821 | SI opval = m32r_trap (current_cpu, CPU (h_pc), FLD (f_uimm4)); | |
1822 | BRANCH_NEW_PC (new_pc, SEM_BRANCH_VIA_ADDR (sem_arg, opval)); | |
1823 | TRACE_RESULT (current_cpu, "pc", 'x', opval); | |
1824 | } | |
cab58155 | 1825 | } while (0); |
e0bd6e18 | 1826 | |
2ddc0492 DE |
1827 | #undef FLD |
1828 | } | |
1829 | BREAK (sem); | |
1830 | ||
1831 | CASE (sem, INSN_UNLOCK) : /* unlock $src1,@$src2 */ | |
1832 | { | |
970a8fd6 | 1833 | #define FLD(f) abuf->fields.fmt_unlock.f |
02310b01 | 1834 | new_pc = SEM_NEXT_PC (sem_arg, 2); |
e0bd6e18 | 1835 | |
cab58155 DE |
1836 | do { |
1837 | if (CPU (h_lock)) { | |
190659a2 DE |
1838 | { |
1839 | SI opval = * FLD (f_r1); | |
1840 | SETMEMSI (current_cpu, * FLD (f_r2), opval); | |
1841 | TRACE_RESULT (current_cpu, "memory", 'x', opval); | |
1842 | } | |
1843 | } | |
1844 | { | |
1845 | UBI opval = 0; | |
1846 | CPU (h_lock) = opval; | |
1847 | TRACE_RESULT (current_cpu, "lock-0", 'x', opval); | |
1848 | } | |
cab58155 | 1849 | } while (0); |
e0bd6e18 | 1850 | |
2ddc0492 DE |
1851 | #undef FLD |
1852 | } | |
1853 | BREAK (sem); | |
1854 | ||
1855 | ||
1856 | } | |
1857 | ENDSWITCH (sem) /* End of semantic switch. */ | |
1858 | ||
1859 | PC = new_pc; | |
1860 | } | |
1861 | ||
1862 | #endif /* DEFINE_SWITCH */ |