]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/mn10300/simops.c
* config/tc-mn10200.c (mn10200_insert_operand): Don't
[thirdparty/binutils-gdb.git] / sim / mn10300 / simops.c
CommitLineData
05ccbdfd
JL
1#include "config.h"
2
3#include <signal.h>
4#ifdef HAVE_UNISTD_H
5#include <unistd.h>
6#endif
7#include "mn10300_sim.h"
8#include "simops.h"
9#include "sys/syscall.h"
10#include "bfd.h"
11#include <errno.h>
12#include <sys/stat.h>
13#include <sys/times.h>
14#include <sys/time.h>
15
9f4a551e
JL
16#define REG0(X) ((X) & 0x3)
17#define REG1(X) (((X) & 0xc) >> 2)
95d18eb7 18#define REG0_4(X) (((X) & 0x30) >> 4)
9f4a551e
JL
19#define REG0_8(X) (((X) & 0x300) >> 8)
20#define REG1_8(X) (((X) & 0xc00) >> 10)
2e8f4133 21#define REG0_16(X) (((X) & 0x30000) >> 16)
9f4a551e 22#define REG1_16(X) (((X) & 0xc0000) >> 18)
05ccbdfd 23\f
707641f6 24/* mov imm8, dn */
d2523010
JL
25void OP_8000 (insn, extension)
26 unsigned long insn, extension;
05ccbdfd 27{
9f4a551e 28 State.regs[REG_D0 + REG0_8 (insn)] = SEXT8 (insn & 0xff);
05ccbdfd
JL
29}
30
707641f6 31/* mov dm, dn */
d2523010
JL
32void OP_80 (insn, extension)
33 unsigned long insn, extension;
05ccbdfd 34{
9f4a551e 35 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
05ccbdfd
JL
36}
37
707641f6 38/* mov dm, an */
d2523010
JL
39void OP_F1E0 (insn, extension)
40 unsigned long insn, extension;
05ccbdfd 41{
9f4a551e 42 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_D0 + REG1 (insn)];
05ccbdfd
JL
43}
44
707641f6 45/* mov am, dn */
d2523010
JL
46void OP_F1D0 (insn, extension)
47 unsigned long insn, extension;
05ccbdfd 48{
9f4a551e 49 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
05ccbdfd
JL
50}
51
707641f6 52/* mov imm8, an */
d2523010
JL
53void OP_9000 (insn, extension)
54 unsigned long insn, extension;
05ccbdfd 55{
9f4a551e 56 State.regs[REG_A0 + REG0_8 (insn)] = insn & 0xff;
05ccbdfd
JL
57}
58
707641f6 59/* mov am, an */
d2523010
JL
60void OP_90 (insn, extension)
61 unsigned long insn, extension;
05ccbdfd 62{
9f4a551e 63 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_A0 + REG1 (insn)];
05ccbdfd
JL
64}
65
1f3bea21 66/* mov sp, an */
d2523010
JL
67void OP_3C (insn, extension)
68 unsigned long insn, extension;
05ccbdfd 69{
9f4a551e 70 State.regs[REG_A0 + REG0 (insn)] = State.regs[REG_SP];
05ccbdfd
JL
71}
72
1f3bea21 73/* mov am, sp */
d2523010
JL
74void OP_F2F0 (insn, extension)
75 unsigned long insn, extension;
05ccbdfd 76{
9f4a551e 77 State.regs[REG_SP] = State.regs[REG_A0 + REG1 (insn)];
05ccbdfd
JL
78}
79
707641f6 80/* mov psw, dn */
d2523010
JL
81void OP_F2E4 (insn, extension)
82 unsigned long insn, extension;
05ccbdfd 83{
9f4a551e 84 State.regs[REG_D0 + REG0 (insn)] = PSW;
05ccbdfd
JL
85}
86
707641f6 87/* mov dm, psw */
d2523010
JL
88void OP_F2F3 (insn, extension)
89 unsigned long insn, extension;
05ccbdfd 90{
9f4a551e 91 PSW = State.regs[REG_D0 + REG1 (insn)];
05ccbdfd
JL
92}
93
707641f6 94/* mov mdr, dn */
d2523010
JL
95void OP_F2E0 (insn, extension)
96 unsigned long insn, extension;
05ccbdfd 97{
9f4a551e 98 State.regs[REG_D0 + REG0 (insn)] = State.regs[REG_MDR];
05ccbdfd
JL
99}
100
707641f6 101/* mov dm, mdr */
d2523010
JL
102void OP_F2F2 (insn, extension)
103 unsigned long insn, extension;
05ccbdfd 104{
9f4a551e 105 State.regs[REG_MDR] = State.regs[REG_D0 + REG1 (insn)];
05ccbdfd
JL
106}
107
2e35551c 108/* mov (am), dn */
d2523010
JL
109void OP_70 (insn, extension)
110 unsigned long insn, extension;
05ccbdfd 111{
9f4a551e
JL
112 State.regs[REG_D0 + REG1 (insn)]
113 = load_mem (State.regs[REG_A0 + REG0 (insn)], 4);
05ccbdfd
JL
114}
115
2e35551c 116/* mov (d8,am), dn */
d2523010
JL
117void OP_F80000 (insn, extension)
118 unsigned long insn, extension;
05ccbdfd 119{
9f4a551e
JL
120 State.regs[REG_D0 + REG1_8 (insn)]
121 = load_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 122 + SEXT8 (insn & 0xff)), 4);
05ccbdfd
JL
123}
124
ecb4b5a3 125/* mov (d16,am), dn */
d2523010
JL
126void OP_FA000000 (insn, extension)
127 unsigned long insn, extension;
05ccbdfd 128{
9f4a551e
JL
129 State.regs[REG_D0 + REG1_16 (insn)]
130 = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3 131 + SEXT16 (insn & 0xffff)), 4);
05ccbdfd
JL
132}
133
de0dce7c 134/* mov (d32,am), dn */
d2523010
JL
135void OP_FC000000 (insn, extension)
136 unsigned long insn, extension;
05ccbdfd 137{
9f4a551e
JL
138 State.regs[REG_D0 + REG1_16 (insn)]
139 = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
7c52bf32 140 + ((insn & 0xffff) << 16) + extension), 4);
05ccbdfd
JL
141}
142
707641f6 143/* mov (d8,sp), dn */
d2523010
JL
144void OP_5800 (insn, extension)
145 unsigned long insn, extension;
05ccbdfd 146{
9f4a551e 147 State.regs[REG_D0 + REG0_8 (insn)]
ecb4b5a3 148 = load_mem (State.regs[REG_SP] + (insn & 0xff), 4);
05ccbdfd
JL
149}
150
ecb4b5a3 151/* mov (d16,sp), dn */
d2523010
JL
152void OP_FAB40000 (insn, extension)
153 unsigned long insn, extension;
05ccbdfd 154{
9f4a551e 155 State.regs[REG_D0 + REG0_16 (insn)]
ecb4b5a3 156 = load_mem (State.regs[REG_SP] + (insn & 0xffff), 4);
05ccbdfd
JL
157}
158
de0dce7c 159/* mov (d32,sp), dn */
d2523010
JL
160void OP_FCB40000 (insn, extension)
161 unsigned long insn, extension;
05ccbdfd 162{
9f4a551e 163 State.regs[REG_D0 + REG0_16 (insn)]
de0dce7c 164 = load_mem (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension), 4);
05ccbdfd
JL
165}
166
f5f13c1d 167/* mov (di,am), dn */
d2523010
JL
168void OP_F300 (insn, extension)
169 unsigned long insn, extension;
05ccbdfd 170{
95d18eb7 171 State.regs[REG_D0 + REG0_4 (insn)]
9f4a551e
JL
172 = load_mem ((State.regs[REG_A0 + REG0 (insn)]
173 + State.regs[REG_D0 + REG1 (insn)]), 4);
05ccbdfd
JL
174}
175
707641f6 176/* mov (abs16), dn */
d2523010
JL
177void OP_300000 (insn, extension)
178 unsigned long insn, extension;
05ccbdfd 179{
9f4a551e 180 State.regs[REG_D0 + REG0_16 (insn)] = load_mem ((insn & 0xffff), 4);
05ccbdfd
JL
181}
182
de0dce7c 183/* mov (abs32), dn */
d2523010
JL
184void OP_FCA40000 (insn, extension)
185 unsigned long insn, extension;
05ccbdfd 186{
9f4a551e 187 State.regs[REG_D0 + REG0_16 (insn)]
de0dce7c 188 = load_mem ((((insn & 0xffff) << 16) + extension), 4);
05ccbdfd
JL
189}
190
707641f6 191/* mov (am), an */
d2523010
JL
192void OP_F000 (insn, extension)
193 unsigned long insn, extension;
05ccbdfd 194{
9f4a551e
JL
195 State.regs[REG_A0 + REG1 (insn)]
196 = load_mem (State.regs[REG_A0 + REG0 (insn)], 4);
05ccbdfd
JL
197}
198
2e35551c 199/* mov (d8,am), an */
d2523010
JL
200void OP_F82000 (insn, extension)
201 unsigned long insn, extension;
05ccbdfd 202{
9f4a551e
JL
203 State.regs[REG_A0 + REG1_8 (insn)]
204 = load_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 205 + SEXT8 (insn & 0xff)), 4);
05ccbdfd
JL
206}
207
ecb4b5a3 208/* mov (d16,am), an */
d2523010
JL
209void OP_FA200000 (insn, extension)
210 unsigned long insn, extension;
05ccbdfd 211{
9f4a551e
JL
212 State.regs[REG_A0 + REG1_16 (insn)]
213 = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3 214 + SEXT16 (insn & 0xffff)), 4);
05ccbdfd
JL
215}
216
de0dce7c 217/* mov (d32,am), an */
d2523010
JL
218void OP_FC200000 (insn, extension)
219 unsigned long insn, extension;
05ccbdfd 220{
9f4a551e
JL
221 State.regs[REG_A0 + REG1_16 (insn)]
222 = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 223 + ((insn & 0xffff) << 16) + extension), 4);
05ccbdfd
JL
224}
225
707641f6 226/* mov (d8,sp), an */
d2523010
JL
227void OP_5C00 (insn, extension)
228 unsigned long insn, extension;
05ccbdfd 229{
9f4a551e 230 State.regs[REG_A0 + REG0_8 (insn)]
ecb4b5a3 231 = load_mem (State.regs[REG_SP] + (insn & 0xff), 4);
05ccbdfd
JL
232}
233
ecb4b5a3 234/* mov (d16,sp), an */
d2523010
JL
235void OP_FAB00000 (insn, extension)
236 unsigned long insn, extension;
05ccbdfd 237{
9f4a551e 238 State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3 239 = load_mem (State.regs[REG_SP] + (insn & 0xffff), 4);
05ccbdfd
JL
240}
241
de0dce7c 242/* mov (d32,sp), an */
d2523010
JL
243void OP_FCB00000 (insn, extension)
244 unsigned long insn, extension;
05ccbdfd 245{
9f4a551e 246 State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 247 = load_mem (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension), 4);
05ccbdfd
JL
248}
249
de0dce7c 250/* mov (di,am), an */
d2523010
JL
251void OP_F380 (insn, extension)
252 unsigned long insn, extension;
05ccbdfd 253{
95d18eb7 254 State.regs[REG_A0 + REG0_4 (insn)]
9f4a551e
JL
255 = load_mem ((State.regs[REG_A0 + REG0 (insn)]
256 + State.regs[REG_D0 + REG1 (insn)]), 4);
05ccbdfd
JL
257}
258
ecb4b5a3 259/* mov (abs16), an */
d2523010
JL
260void OP_FAA00000 (insn, extension)
261 unsigned long insn, extension;
05ccbdfd 262{
9f4a551e 263 State.regs[REG_A0 + REG0_16 (insn)] = load_mem ((insn & 0xffff), 4);
05ccbdfd
JL
264}
265
de0dce7c 266/* mov (abs32), an */
d2523010
JL
267void OP_FCA00000 (insn, extension)
268 unsigned long insn, extension;
05ccbdfd 269{
9f4a551e 270 State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 271 = load_mem ((((insn & 0xffff) << 16) + extension), 4);
05ccbdfd
JL
272}
273
2e35551c 274/* mov (d8,am), sp */
d2523010
JL
275void OP_F8F000 (insn, extension)
276 unsigned long insn, extension;
05ccbdfd 277{
2e35551c 278 State.regs[REG_SP]
9f4a551e 279 = load_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 280 + SEXT8 (insn & 0xff)), 4);
05ccbdfd
JL
281}
282
707641f6 283/* mov dm, (an) */
d2523010
JL
284void OP_60 (insn, extension)
285 unsigned long insn, extension;
05ccbdfd 286{
9f4a551e
JL
287 store_mem (State.regs[REG_A0 + REG0 (insn)], 4,
288 State.regs[REG_D0 + REG1 (insn)]);
05ccbdfd
JL
289}
290
2e35551c 291/* mov dm, (d8,an) */
d2523010
JL
292void OP_F81000 (insn, extension)
293 unsigned long insn, extension;
05ccbdfd 294{
9f4a551e 295 store_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 296 + SEXT8 (insn & 0xff)), 4,
9f4a551e 297 State.regs[REG_D0 + REG1_8 (insn)]);
05ccbdfd
JL
298}
299
ecb4b5a3 300/* mov dm (d16,an) */
d2523010
JL
301void OP_FA100000 (insn, extension)
302 unsigned long insn, extension;
05ccbdfd 303{
9f4a551e 304 store_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3 305 + SEXT16 (insn & 0xffff)), 4,
9f4a551e 306 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
307}
308
de0dce7c 309/* mov dm (d32,an) */
d2523010
JL
310void OP_FC100000 (insn, extension)
311 unsigned long insn, extension;
05ccbdfd 312{
9f4a551e 313 store_mem ((State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 314 + ((insn & 0xffff) << 16) + extension), 4,
9f4a551e 315 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
316}
317
707641f6 318/* mov dm, (d8,sp) */
d2523010
JL
319void OP_4200 (insn, extension)
320 unsigned long insn, extension;
05ccbdfd 321{
ecb4b5a3 322 store_mem (State.regs[REG_SP] + (insn & 0xff), 4,
9f4a551e 323 State.regs[REG_D0 + REG1_8 (insn)]);
05ccbdfd
JL
324}
325
ecb4b5a3 326/* mov dm, (d16,sp) */
d2523010
JL
327void OP_FA910000 (insn, extension)
328 unsigned long insn, extension;
05ccbdfd 329{
ecb4b5a3 330 store_mem (State.regs[REG_SP] + (insn & 0xffff), 4,
9f4a551e 331 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
332}
333
de0dce7c 334/* mov dm, (d32,sp) */
d2523010
JL
335void OP_FC910000 (insn, extension)
336 unsigned long insn, extension;
05ccbdfd 337{
de0dce7c 338 store_mem (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension), 4,
9f4a551e 339 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
340}
341
f5f13c1d 342/* mov dm, (di,an) */
d2523010
JL
343void OP_F340 (insn, extension)
344 unsigned long insn, extension;
05ccbdfd 345{
9f4a551e
JL
346 store_mem ((State.regs[REG_A0 + REG0 (insn)]
347 + State.regs[REG_D0 + REG1 (insn)]), 4,
95d18eb7 348 State.regs[REG_D0 + REG0_4 (insn)]);
05ccbdfd
JL
349}
350
707641f6 351/* mov dm, (abs16) */
d2523010
JL
352void OP_10000 (insn, extension)
353 unsigned long insn, extension;
05ccbdfd 354{
9f4a551e 355 store_mem ((insn & 0xffff), 4, State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
356}
357
de0dce7c 358/* mov dm, (abs32) */
d2523010
JL
359void OP_FC810000 (insn, extension)
360 unsigned long insn, extension;
05ccbdfd 361{
9f4a551e 362 store_mem ((((insn & 0xffff) << 16) + extension), 4, State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
363}
364
707641f6 365/* mov am, (an) */
d2523010
JL
366void OP_F010 (insn, extension)
367 unsigned long insn, extension;
05ccbdfd 368{
9f4a551e
JL
369 store_mem (State.regs[REG_A0 + REG0 (insn)], 4,
370 State.regs[REG_A0 + REG1 (insn)]);
05ccbdfd
JL
371}
372
2e35551c 373/* mov am, (d8,an) */
d2523010
JL
374void OP_F83000 (insn, extension)
375 unsigned long insn, extension;
05ccbdfd 376{
9f4a551e 377 store_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 378 + SEXT8 (insn & 0xff)), 4,
9f4a551e 379 State.regs[REG_A0 + REG1_8 (insn)]);
05ccbdfd
JL
380}
381
de0dce7c 382/* mov am, (d16,an) */
d2523010
JL
383void OP_FA300000 (insn, extension)
384 unsigned long insn, extension;
05ccbdfd 385{
9f4a551e 386 store_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3 387 + SEXT16 (insn & 0xffff)), 4,
9f4a551e 388 State.regs[REG_A0 + REG1_16 (insn)]);
05ccbdfd
JL
389}
390
de0dce7c 391/* mov am, (d32,an) */
d2523010
JL
392void OP_FC300000 (insn, extension)
393 unsigned long insn, extension;
05ccbdfd 394{
9f4a551e 395 store_mem ((State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 396 + ((insn & 0xffff) << 16) + extension), 4,
9f4a551e 397 State.regs[REG_A0 + REG1_16 (insn)]);
05ccbdfd
JL
398}
399
707641f6 400/* mov am, (d8,sp) */
d2523010
JL
401void OP_4300 (insn, extension)
402 unsigned long insn, extension;
05ccbdfd 403{
ecb4b5a3 404 store_mem (State.regs[REG_SP] + (insn & 0xff), 4,
9f4a551e 405 State.regs[REG_A0 + REG1_8 (insn)]);
05ccbdfd
JL
406}
407
ecb4b5a3 408/* mov am, (d16,sp) */
d2523010
JL
409void OP_FA900000 (insn, extension)
410 unsigned long insn, extension;
05ccbdfd 411{
ecb4b5a3 412 store_mem (State.regs[REG_SP] + (insn & 0xffff), 4,
9f4a551e 413 State.regs[REG_A0 + REG1_16 (insn)]);
05ccbdfd
JL
414}
415
de0dce7c 416/* mov am, (d32,sp) */
d2523010
JL
417void OP_FC900000 (insn, extension)
418 unsigned long insn, extension;
05ccbdfd 419{
de0dce7c 420 store_mem (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension), 4,
9f4a551e 421 State.regs[REG_A0 + REG1_16 (insn)]);
05ccbdfd
JL
422}
423
f5f13c1d 424/* mov am, (di,an) */
d2523010
JL
425void OP_F3C0 (insn, extension)
426 unsigned long insn, extension;
05ccbdfd 427{
9f4a551e
JL
428 store_mem ((State.regs[REG_A0 + REG0 (insn)]
429 + State.regs[REG_D0 + REG1 (insn)]), 4,
95d18eb7 430 State.regs[REG_A0 + REG0_4 (insn)]);
05ccbdfd
JL
431}
432
ecb4b5a3 433/* mov am, (abs16) */
d2523010
JL
434void OP_FA800000 (insn, extension)
435 unsigned long insn, extension;
05ccbdfd 436{
9f4a551e 437 store_mem ((insn & 0xffff), 4, State.regs[REG_A0 + REG1_16 (insn)]);
05ccbdfd
JL
438}
439
de0dce7c 440/* mov am, (abs32) */
d2523010
JL
441void OP_FC800000 (insn, extension)
442 unsigned long insn, extension;
05ccbdfd 443{
9f4a551e 444 store_mem ((((insn & 0xffff) << 16) + extension), 4, State.regs[REG_A0 + REG1_16 (insn)]);
05ccbdfd
JL
445}
446
2e35551c 447/* mov sp, (d8,an) */
d2523010
JL
448void OP_F8F400 (insn, extension)
449 unsigned long insn, extension;
05ccbdfd 450{
9f4a551e 451 store_mem (State.regs[REG_A0 + REG0_8 (insn)] + SEXT8 (insn & 0xff),
2e35551c 452 4, State.regs[REG_SP]);
05ccbdfd
JL
453}
454
707641f6 455/* mov imm16, dn */
d2523010
JL
456void OP_2C0000 (insn, extension)
457 unsigned long insn, extension;
05ccbdfd 458{
707641f6
JL
459 unsigned long value;
460
461 value = SEXT16 (insn & 0xffff);
9f4a551e 462 State.regs[REG_D0 + REG0_16 (insn)] = value;
05ccbdfd
JL
463}
464
de0dce7c 465/* mov imm32,dn */
d2523010
JL
466void OP_FCCC0000 (insn, extension)
467 unsigned long insn, extension;
05ccbdfd 468{
de0dce7c
JL
469 unsigned long value;
470
7c52bf32 471 value = ((insn & 0xffff) << 16) + extension;
9f4a551e 472 State.regs[REG_D0 + REG0_16 (insn)] = value;
05ccbdfd
JL
473}
474
707641f6 475/* mov imm16, an */
d2523010
JL
476void OP_240000 (insn, extension)
477 unsigned long insn, extension;
05ccbdfd 478{
707641f6
JL
479 unsigned long value;
480
481 value = insn & 0xffff;
9f4a551e 482 State.regs[REG_A0 + REG0_16 (insn)] = value;
05ccbdfd
JL
483}
484
de0dce7c 485/* mov imm32, an */
d2523010
JL
486void OP_FCDC0000 (insn, extension)
487 unsigned long insn, extension;
05ccbdfd 488{
73e65298
JL
489 unsigned long value;
490
7c52bf32 491 value = ((insn & 0xffff) << 16) + extension;
9f4a551e 492 State.regs[REG_A0 + REG0_16 (insn)] = value;
05ccbdfd
JL
493}
494
707641f6 495/* movbu (am), dn */
d2523010
JL
496void OP_F040 (insn, extension)
497 unsigned long insn, extension;
05ccbdfd 498{
9f4a551e
JL
499 State.regs[REG_D0 + REG1 (insn)]
500 = load_mem (State.regs[REG_A0 + REG0 (insn)], 1);
05ccbdfd
JL
501}
502
2e35551c 503/* movbu (d8,am), dn */
d2523010
JL
504void OP_F84000 (insn, extension)
505 unsigned long insn, extension;
05ccbdfd 506{
9f4a551e
JL
507 State.regs[REG_D0 + REG1_8 (insn)]
508 = load_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 509 + SEXT8 (insn & 0xff)), 1);
05ccbdfd
JL
510}
511
ecb4b5a3 512/* movbu (d16,am), dn */
d2523010
JL
513void OP_FA400000 (insn, extension)
514 unsigned long insn, extension;
05ccbdfd 515{
9f4a551e
JL
516 State.regs[REG_D0 + REG1_16 (insn)]
517 = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3 518 + SEXT16 (insn & 0xffff)), 1);
05ccbdfd
JL
519}
520
de0dce7c 521/* movbu (d32,am), dn */
d2523010
JL
522void OP_FC400000 (insn, extension)
523 unsigned long insn, extension;
05ccbdfd 524{
9f4a551e
JL
525 State.regs[REG_D0 + REG1_16 (insn)]
526 = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 527 + ((insn & 0xffff) << 16) + extension), 1);
05ccbdfd
JL
528}
529
2e35551c 530/* movbu (d8,sp), dn */
d2523010
JL
531void OP_F8B800 (insn, extension)
532 unsigned long insn, extension;
05ccbdfd 533{
9f4a551e 534 State.regs[REG_D0 + REG0_8 (insn)]
ecb4b5a3 535 = load_mem ((State.regs[REG_SP] + (insn & 0xff)), 1);
05ccbdfd
JL
536}
537
ecb4b5a3 538/* movbu (d16,sp), dn */
d2523010
JL
539void OP_FAB80000 (insn, extension)
540 unsigned long insn, extension;
05ccbdfd 541{
9f4a551e 542 State.regs[REG_D0 + REG0_16 (insn)]
ecb4b5a3 543 = load_mem ((State.regs[REG_SP] + (insn & 0xffff)), 1);
05ccbdfd
JL
544}
545
de0dce7c 546/* movbu (d32,sp), dn */
d2523010
JL
547void OP_FCB80000 (insn, extension)
548 unsigned long insn, extension;
05ccbdfd 549{
9f4a551e 550 State.regs[REG_D0 + REG0_16 (insn)]
de0dce7c 551 = load_mem (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension), 1);
05ccbdfd
JL
552}
553
f5f13c1d 554/* movbu (di,am), dn */
d2523010
JL
555void OP_F400 (insn, extension)
556 unsigned long insn, extension;
05ccbdfd 557{
95d18eb7 558 State.regs[REG_D0 + REG0_4 (insn)]
9f4a551e
JL
559 = load_mem ((State.regs[REG_A0 + REG0 (insn)]
560 + State.regs[REG_D0 + REG1 (insn)]), 1);
05ccbdfd
JL
561}
562
707641f6 563/* movbu (abs16), dn */
d2523010
JL
564void OP_340000 (insn, extension)
565 unsigned long insn, extension;
05ccbdfd 566{
9f4a551e 567 State.regs[REG_D0 + REG0_16 (insn)] = load_mem ((insn & 0xffff), 1);
05ccbdfd
JL
568}
569
de0dce7c 570/* movbu (abs32), dn */
d2523010
JL
571void OP_FCA80000 (insn, extension)
572 unsigned long insn, extension;
05ccbdfd 573{
9f4a551e 574 State.regs[REG_D0 + REG0_16 (insn)]
de0dce7c 575 = load_mem ((((insn & 0xffff) << 16) + extension), 1);
05ccbdfd
JL
576}
577
707641f6 578/* movbu dm, (an) */
d2523010
JL
579void OP_F050 (insn, extension)
580 unsigned long insn, extension;
05ccbdfd 581{
9f4a551e
JL
582 store_mem (State.regs[REG_A0 + REG0 (insn)], 1,
583 State.regs[REG_D0 + REG1 (insn)]);
05ccbdfd
JL
584}
585
2e35551c 586/* movbu dm, (d8,an) */
d2523010
JL
587void OP_F85000 (insn, extension)
588 unsigned long insn, extension;
05ccbdfd 589{
9f4a551e 590 store_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 591 + SEXT8 (insn & 0xff)), 1,
9f4a551e 592 State.regs[REG_D0 + REG1_8 (insn)]);
05ccbdfd
JL
593}
594
ecb4b5a3 595/* movbu dm, (d16,an) */
d2523010
JL
596void OP_FA500000 (insn, extension)
597 unsigned long insn, extension;
05ccbdfd 598{
9f4a551e 599 store_mem ((State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 600 + SEXT16 (insn & 0xffff)), 1,
9f4a551e 601 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
602}
603
de0dce7c 604/* movbu dm, (d32,an) */
d2523010
JL
605void OP_FC500000 (insn, extension)
606 unsigned long insn, extension;
05ccbdfd 607{
9f4a551e 608 store_mem ((State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 609 + ((insn & 0xffff) << 16) + extension), 1,
9f4a551e 610 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
611}
612
2e35551c 613/* movbu dm, (d8,sp) */
d2523010
JL
614void OP_F89200 (insn, extension)
615 unsigned long insn, extension;
05ccbdfd 616{
ecb4b5a3 617 store_mem (State.regs[REG_SP] + (insn & 0xff), 1,
9f4a551e 618 State.regs[REG_D0 + REG1_8 (insn)]);
05ccbdfd
JL
619}
620
ecb4b5a3 621/* movbu dm, (d16,sp) */
d2523010
JL
622void OP_FA920000 (insn, extension)
623 unsigned long insn, extension;
05ccbdfd 624{
ecb4b5a3 625 store_mem (State.regs[REG_SP] + (insn & 0xffff), 2,
9f4a551e 626 State.regs[REG_D0 + REG1_8 (insn)]);
05ccbdfd
JL
627}
628
de0dce7c 629/* movbu dm (d32,sp) */
d2523010
JL
630void OP_FC920000 (insn, extension)
631 unsigned long insn, extension;
05ccbdfd 632{
de0dce7c 633 store_mem (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension), 2,
9f4a551e 634 State.regs[REG_D0 + REG1_8 (insn)]);
05ccbdfd
JL
635}
636
f5f13c1d 637/* movbu dm, (di,an) */
d2523010
JL
638void OP_F440 (insn, extension)
639 unsigned long insn, extension;
05ccbdfd 640{
9f4a551e
JL
641 store_mem ((State.regs[REG_A0 + REG0 (insn)]
642 + State.regs[REG_D0 + REG1 (insn)]), 1,
95d18eb7 643 State.regs[REG_D0 + REG0_4 (insn)]);
05ccbdfd
JL
644}
645
707641f6 646/* movbu dm, (abs16) */
d2523010
JL
647void OP_20000 (insn, extension)
648 unsigned long insn, extension;
05ccbdfd 649{
9f4a551e 650 store_mem ((insn & 0xffff), 1, State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
651}
652
de0dce7c 653/* movbu dm, (abs32) */
d2523010
JL
654void OP_FC820000 (insn, extension)
655 unsigned long insn, extension;
05ccbdfd 656{
9f4a551e 657 store_mem ((((insn & 0xffff) << 16) + extension), 1, State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
658}
659
707641f6 660/* movhu (am), dn */
d2523010
JL
661void OP_F060 (insn, extension)
662 unsigned long insn, extension;
05ccbdfd 663{
9f4a551e
JL
664 State.regs[REG_D0 + REG1 (insn)]
665 = load_mem (State.regs[REG_A0 + REG0 (insn)], 2);
05ccbdfd
JL
666}
667
2e35551c 668/* movhu (d8,am), dn */
d2523010
JL
669void OP_F86000 (insn, extension)
670 unsigned long insn, extension;
05ccbdfd 671{
9f4a551e
JL
672 State.regs[REG_D0 + REG1_8 (insn)]
673 = load_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 674 + SEXT8 (insn & 0xff)), 2);
05ccbdfd
JL
675}
676
ecb4b5a3 677/* movhu (d16,am), dn */
d2523010
JL
678void OP_FA600000 (insn, extension)
679 unsigned long insn, extension;
05ccbdfd 680{
9f4a551e
JL
681 State.regs[REG_D0 + REG1_16 (insn)]
682 = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3 683 + SEXT16 (insn & 0xffff)), 2);
05ccbdfd
JL
684}
685
de0dce7c 686/* movhu (d32,am), dn */
d2523010
JL
687void OP_FC600000 (insn, extension)
688 unsigned long insn, extension;
05ccbdfd 689{
9f4a551e
JL
690 State.regs[REG_D0 + REG1_16 (insn)]
691 = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 692 + ((insn & 0xffff) << 16) + extension), 2);
05ccbdfd
JL
693}
694
2e35551c 695/* movhu (d8,sp) dn */
d2523010
JL
696void OP_F8BC00 (insn, extension)
697 unsigned long insn, extension;
05ccbdfd 698{
9f4a551e 699 State.regs[REG_D0 + REG0_8 (insn)]
ecb4b5a3 700 = load_mem ((State.regs[REG_SP] + (insn & 0xff)), 2);
05ccbdfd
JL
701}
702
ecb4b5a3 703/* movhu (d16,sp), dn */
d2523010
JL
704void OP_FABC0000 (insn, extension)
705 unsigned long insn, extension;
05ccbdfd 706{
9f4a551e 707 State.regs[REG_D0 + REG0_16 (insn)]
ecb4b5a3 708 = load_mem ((State.regs[REG_SP] + (insn & 0xffff)), 2);
05ccbdfd
JL
709}
710
de0dce7c 711/* movhu (d32,sp), dn */
d2523010
JL
712void OP_FCBC0000 (insn, extension)
713 unsigned long insn, extension;
05ccbdfd 714{
9f4a551e 715 State.regs[REG_D0 + REG0_16 (insn)]
de0dce7c 716 = load_mem (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension), 2);
05ccbdfd
JL
717}
718
f5f13c1d 719/* movhu (di,am), dn */
d2523010
JL
720void OP_F480 (insn, extension)
721 unsigned long insn, extension;
05ccbdfd 722{
95d18eb7 723 State.regs[REG_D0 + REG0_4 (insn)]
9f4a551e
JL
724 = load_mem ((State.regs[REG_A0 + REG0 (insn)]
725 + State.regs[REG_D0 + REG1 (insn)]), 2);
05ccbdfd
JL
726}
727
707641f6 728/* movhu (abs16), dn */
d2523010
JL
729void OP_380000 (insn, extension)
730 unsigned long insn, extension;
05ccbdfd 731{
9f4a551e 732 State.regs[REG_D0 + REG0_16 (insn)] = load_mem ((insn & 0xffff), 2);
05ccbdfd
JL
733}
734
de0dce7c 735/* movhu (abs32), dn */
d2523010
JL
736void OP_FCAC0000 (insn, extension)
737 unsigned long insn, extension;
05ccbdfd 738{
9f4a551e 739 State.regs[REG_D0 + REG0_16 (insn)]
de0dce7c 740 = load_mem ((((insn & 0xffff) << 16) + extension), 2);
05ccbdfd
JL
741}
742
707641f6 743/* movhu dm, (an) */
d2523010
JL
744void OP_F070 (insn, extension)
745 unsigned long insn, extension;
05ccbdfd 746{
9f4a551e
JL
747 store_mem (State.regs[REG_A0 + REG0 (insn)], 2,
748 State.regs[REG_D0 + REG1 (insn)]);
05ccbdfd
JL
749}
750
2e35551c 751/* movhu dm, (d8,an) */
d2523010
JL
752void OP_F87000 (insn, extension)
753 unsigned long insn, extension;
05ccbdfd 754{
9f4a551e 755 store_mem ((State.regs[REG_A0 + REG0_8 (insn)]
2e35551c 756 + SEXT8 (insn & 0xff)), 2,
9f4a551e 757 State.regs[REG_D0 + REG1_8 (insn)]);
05ccbdfd
JL
758}
759
ecb4b5a3 760/* movhu dm, (d16,an) */
d2523010
JL
761void OP_FA700000 (insn, extension)
762 unsigned long insn, extension;
05ccbdfd 763{
9f4a551e 764 store_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3 765 + SEXT16 (insn & 0xffff)), 2,
9f4a551e 766 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
767}
768
de0dce7c 769/* movhu dm, (d32,an) */
d2523010
JL
770void OP_FC700000 (insn, extension)
771 unsigned long insn, extension;
05ccbdfd 772{
9f4a551e 773 store_mem ((State.regs[REG_A0 + REG0_16 (insn)]
de0dce7c 774 + ((insn & 0xffff) << 16) + extension), 2,
9f4a551e 775 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
776}
777
2e35551c 778/* movhu dm,(d8,sp) */
d2523010
JL
779void OP_F89300 (insn, extension)
780 unsigned long insn, extension;
05ccbdfd 781{
ecb4b5a3 782 store_mem (State.regs[REG_SP] + (insn & 0xff), 2,
9f4a551e 783 State.regs[REG_D0 + REG1_8 (insn)]);
05ccbdfd
JL
784}
785
ecb4b5a3 786/* movhu dm,(d16,sp) */
d2523010
JL
787void OP_FA930000 (insn, extension)
788 unsigned long insn, extension;
05ccbdfd 789{
ecb4b5a3 790 store_mem (State.regs[REG_SP] + (insn & 0xffff), 2,
9f4a551e 791 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
792}
793
de0dce7c 794/* movhu dm,(d32,sp) */
d2523010
JL
795void OP_FC930000 (insn, extension)
796 unsigned long insn, extension;
05ccbdfd 797{
de0dce7c 798 store_mem (State.regs[REG_SP] + (((insn & 0xffff) << 16) + extension), 2,
9f4a551e 799 State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
800}
801
f5f13c1d 802/* movhu dm, (di,an) */
d2523010
JL
803void OP_F4C0 (insn, extension)
804 unsigned long insn, extension;
05ccbdfd 805{
9f4a551e
JL
806 store_mem ((State.regs[REG_A0 + REG0 (insn)]
807 + State.regs[REG_D0 + REG1 (insn)]), 2,
95d18eb7 808 State.regs[REG_D0 + REG0_4 (insn)]);
05ccbdfd
JL
809}
810
707641f6 811/* movhu dm, (abs16) */
d2523010
JL
812void OP_30000 (insn, extension)
813 unsigned long insn, extension;
05ccbdfd 814{
9f4a551e 815 store_mem ((insn & 0xffff), 2, State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
816}
817
de0dce7c 818/* movhu dm, (abs32) */
d2523010
JL
819void OP_FC830000 (insn, extension)
820 unsigned long insn, extension;
05ccbdfd 821{
9f4a551e 822 store_mem ((((insn & 0xffff) << 16) + extension), 2, State.regs[REG_D0 + REG1_16 (insn)]);
05ccbdfd
JL
823}
824
707641f6 825/* ext dn */
d2523010
JL
826void OP_F2D0 (insn, extension)
827 unsigned long insn, extension;
05ccbdfd 828{
9f4a551e 829 if (State.regs[REG_D0 + REG0 (insn)] & 0x80000000)
707641f6
JL
830 State.regs[REG_MDR] = -1;
831 else
832 State.regs[REG_MDR] = 0;
05ccbdfd
JL
833}
834
707641f6 835/* extb dn */
d2523010
JL
836void OP_10 (insn, extension)
837 unsigned long insn, extension;
05ccbdfd 838{
9f4a551e 839 State.regs[REG_D0 + REG0 (insn)] = SEXT8 (State.regs[REG_D0 + REG0 (insn)]);
05ccbdfd
JL
840}
841
707641f6 842/* extbu dn */
d2523010
JL
843void OP_14 (insn, extension)
844 unsigned long insn, extension;
05ccbdfd 845{
9f4a551e 846 State.regs[REG_D0 + REG0 (insn)] &= 0xff;
05ccbdfd
JL
847}
848
707641f6 849/* exth dn */
d2523010
JL
850void OP_18 (insn, extension)
851 unsigned long insn, extension;
05ccbdfd 852{
9f4a551e
JL
853 State.regs[REG_D0 + REG0 (insn)]
854 = SEXT16 (State.regs[REG_D0 + REG0 (insn)]);
05ccbdfd
JL
855}
856
707641f6 857/* exthu dn */
d2523010
JL
858void OP_1C (insn, extension)
859 unsigned long insn, extension;
05ccbdfd 860{
9f4a551e 861 State.regs[REG_D0 + REG0 (insn)] &= 0xffff;
05ccbdfd
JL
862}
863
1f3bea21 864/* movm (sp), reg_list */
d2523010
JL
865void OP_CE00 (insn, extension)
866 unsigned long insn, extension;
05ccbdfd 867{
1f3bea21
JL
868 unsigned long sp = State.regs[REG_SP];
869 unsigned long mask;
870
871 mask = insn & 0xff;
872
873 if (mask & 0x8)
874 {
875 sp += 4;
876 State.regs[REG_LAR] = load_mem (sp, 4);
877 sp += 4;
878 State.regs[REG_LIR] = load_mem (sp, 4);
879 sp += 4;
880 State.regs[REG_MDR] = load_mem (sp, 4);
881 sp += 4;
882 State.regs[REG_A0 + 1] = load_mem (sp, 4);
883 sp += 4;
884 State.regs[REG_A0] = load_mem (sp, 4);
885 sp += 4;
886 State.regs[REG_D0 + 1] = load_mem (sp, 4);
887 sp += 4;
888 State.regs[REG_D0] = load_mem (sp, 4);
889 sp += 4;
890 }
891
892 if (mask & 0x10)
893 {
894 State.regs[REG_A0 + 3] = load_mem (sp, 4);
895 sp += 4;
896 }
897
898 if (mask & 0x20)
899 {
900 State.regs[REG_A0 + 2] = load_mem (sp, 4);
901 sp += 4;
902 }
903
904 if (mask & 0x40)
905 {
906 State.regs[REG_D0 + 3] = load_mem (sp, 4);
907 sp += 4;
908 }
909
910 if (mask & 0x80)
911 {
912 State.regs[REG_D0 + 2] = load_mem (sp, 4);
913 sp += 4;
914 }
915
916 /* And make sure to update the stack pointer. */
917 State.regs[REG_SP] = sp;
918}
919
920/* movm reg_list, (sp) */
d2523010
JL
921void OP_CF00 (insn, extension)
922 unsigned long insn, extension;
05ccbdfd 923{
1f3bea21
JL
924 unsigned long sp = State.regs[REG_SP];
925 unsigned long mask;
926
927 mask = insn & 0xff;
928
929 if (mask & 0x80)
930 {
931 sp -= 4;
6e7a01c1 932 store_mem (sp, 4, State.regs[REG_D0 + 2]);
1f3bea21
JL
933 }
934
935 if (mask & 0x40)
936 {
937 sp -= 4;
6e7a01c1 938 store_mem (sp, 4, State.regs[REG_D0 + 3]);
1f3bea21
JL
939 }
940
941 if (mask & 0x20)
942 {
943 sp -= 4;
6e7a01c1 944 store_mem (sp, 4, State.regs[REG_A0 + 2]);
1f3bea21
JL
945 }
946
947 if (mask & 0x10)
948 {
949 sp -= 4;
6e7a01c1 950 store_mem (sp, 4, State.regs[REG_A0 + 3]);
1f3bea21
JL
951 }
952
953 if (mask & 0x8)
954 {
955 sp -= 4;
6e7a01c1 956 store_mem (sp, 4, State.regs[REG_D0]);
1f3bea21 957 sp -= 4;
6e7a01c1 958 store_mem (sp, 4, State.regs[REG_D0 + 1]);
1f3bea21 959 sp -= 4;
6e7a01c1 960 store_mem (sp, 4, State.regs[REG_A0]);
1f3bea21 961 sp -= 4;
6e7a01c1 962 store_mem (sp, 4, State.regs[REG_A0 + 1]);
1f3bea21 963 sp -= 4;
6e7a01c1 964 store_mem (sp, 4, State.regs[REG_MDR]);
1f3bea21 965 sp -= 4;
6e7a01c1 966 store_mem (sp, 4, State.regs[REG_LIR]);
1f3bea21 967 sp -= 4;
6e7a01c1 968 store_mem (sp, 4, State.regs[REG_LAR]);
1f3bea21
JL
969 sp -= 4;
970 }
971
972 /* And make sure to update the stack pointer. */
973 State.regs[REG_SP] = sp;
05ccbdfd
JL
974}
975
73e65298 976/* clr dn */
d2523010
JL
977void OP_0 (insn, extension)
978 unsigned long insn, extension;
05ccbdfd 979{
9f4a551e 980 State.regs[REG_D0 + REG1 (insn)] = 0;
73e65298
JL
981
982 PSW |= PSW_Z;
983 PSW &= ~(PSW_V | PSW_C | PSW_N);
05ccbdfd
JL
984}
985
de0dce7c 986/* add dm,dn */
d2523010
JL
987void OP_E0 (insn, extension)
988 unsigned long insn, extension;
05ccbdfd 989{
73e65298
JL
990 int z, c, n, v;
991 unsigned long reg1, reg2, value;
992
9f4a551e
JL
993 reg1 = State.regs[REG_D0 + REG1 (insn)];
994 reg2 = State.regs[REG_D0 + REG0 (insn)];
73e65298 995 value = reg1 + reg2;
9f4a551e 996 State.regs[REG_D0 + REG0 (insn)] = value;
73e65298
JL
997
998 z = (value == 0);
999 n = (value & 0x80000000);
1000 c = (reg1 < reg2);
b7b89deb
JL
1001 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1002 && (reg2 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1003
1004 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1005 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1006 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1007}
1008
73e65298 1009/* add dm, an */
d2523010
JL
1010void OP_F160 (insn, extension)
1011 unsigned long insn, extension;
05ccbdfd 1012{
73e65298
JL
1013 int z, c, n, v;
1014 unsigned long reg1, reg2, value;
1015
9f4a551e
JL
1016 reg1 = State.regs[REG_D0 + REG1 (insn)];
1017 reg2 = State.regs[REG_A0 + REG0 (insn)];
73e65298 1018 value = reg1 + reg2;
9f4a551e 1019 State.regs[REG_A0 + REG0 (insn)] = value;
73e65298
JL
1020
1021 z = (value == 0);
1022 n = (value & 0x80000000);
1023 c = (reg1 < reg2);
b7b89deb
JL
1024 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1025 && (reg2 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1026
1027 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1028 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1029 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1030}
1031
de0dce7c 1032/* add am, dn */
d2523010
JL
1033void OP_F150 (insn, extension)
1034 unsigned long insn, extension;
05ccbdfd 1035{
73e65298
JL
1036 int z, c, n, v;
1037 unsigned long reg1, reg2, value;
1038
9f4a551e
JL
1039 reg1 = State.regs[REG_A0 + REG1 (insn)];
1040 reg2 = State.regs[REG_D0 + REG0 (insn)];
73e65298 1041 value = reg1 + reg2;
9f4a551e 1042 State.regs[REG_D0 + REG0 (insn)] = value;
73e65298
JL
1043
1044 z = (value == 0);
1045 n = (value & 0x80000000);
1046 c = (reg1 < reg2);
b7b89deb
JL
1047 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1048 && (reg2 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1049
1050 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1051 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1052 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1053}
1054
73e65298 1055/* add am,an */
d2523010
JL
1056void OP_F170 (insn, extension)
1057 unsigned long insn, extension;
05ccbdfd 1058{
73e65298
JL
1059 int z, c, n, v;
1060 unsigned long reg1, reg2, value;
1061
9f4a551e
JL
1062 reg1 = State.regs[REG_A0 + REG1 (insn)];
1063 reg2 = State.regs[REG_A0 + REG0 (insn)];
73e65298 1064 value = reg1 + reg2;
9f4a551e 1065 State.regs[REG_A0 + REG0 (insn)] = value;
73e65298
JL
1066
1067 z = (value == 0);
1068 n = (value & 0x80000000);
1069 c = (reg1 < reg2);
b7b89deb
JL
1070 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1071 && (reg2 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1072
1073 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1074 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1075 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1076}
1077
73e65298 1078/* add imm8, dn */
d2523010
JL
1079void OP_2800 (insn, extension)
1080 unsigned long insn, extension;
05ccbdfd 1081{
73e65298
JL
1082 int z, c, n, v;
1083 unsigned long reg1, imm, value;
1084
9f4a551e 1085 reg1 = State.regs[REG_D0 + REG0_8 (insn)];
73e65298
JL
1086 imm = SEXT8 (insn & 0xff);
1087 value = reg1 + imm;
9f4a551e 1088 State.regs[REG_D0 + REG0_8 (insn)] = value;
73e65298
JL
1089
1090 z = (value == 0);
1091 n = (value & 0x80000000);
1092 c = (reg1 < imm);
b7b89deb
JL
1093 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1094 && (reg1 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1095
1096 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1097 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1098 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1099}
1100
73e65298 1101/* add imm16, dn */
d2523010
JL
1102void OP_FAC00000 (insn, extension)
1103 unsigned long insn, extension;
05ccbdfd 1104{
73e65298
JL
1105 int z, c, n, v;
1106 unsigned long reg1, imm, value;
1107
9f4a551e 1108 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
73e65298
JL
1109 imm = SEXT16 (insn & 0xffff);
1110 value = reg1 + imm;
9f4a551e 1111 State.regs[REG_D0 + REG0_16 (insn)] = value;
73e65298
JL
1112
1113 z = (value == 0);
1114 n = (value & 0x80000000);
1115 c = (reg1 < imm);
b7b89deb
JL
1116 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1117 && (reg1 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1118
1119 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1120 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1121 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1122}
1123
73e65298 1124/* add imm32,dn */
d2523010
JL
1125void OP_FCC00000 (insn, extension)
1126 unsigned long insn, extension;
05ccbdfd 1127{
73e65298
JL
1128 int z, c, n, v;
1129 unsigned long reg1, imm, value;
1130
9f4a551e 1131 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
7c52bf32 1132 imm = ((insn & 0xffff) << 16) + extension;
73e65298 1133 value = reg1 + imm;
9f4a551e 1134 State.regs[REG_D0 + REG0_16 (insn)] = value;
73e65298
JL
1135
1136 z = (value == 0);
1137 n = (value & 0x80000000);
1138 c = (reg1 < imm);
b7b89deb
JL
1139 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1140 && (reg1 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1141
1142 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1143 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1144 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1145}
1146
73e65298 1147/* add imm8, an */
d2523010
JL
1148void OP_2000 (insn, extension)
1149 unsigned long insn, extension;
05ccbdfd 1150{
73e65298
JL
1151 int z, c, n, v;
1152 unsigned long reg1, imm, value;
1153
9f4a551e 1154 reg1 = State.regs[REG_A0 + REG0_8 (insn)];
6e7a01c1 1155 imm = SEXT8 (insn & 0xff);
73e65298 1156 value = reg1 + imm;
9f4a551e 1157 State.regs[REG_A0 + REG0_8 (insn)] = value;
73e65298
JL
1158
1159 z = (value == 0);
1160 n = (value & 0x80000000);
1161 c = (reg1 < imm);
b7b89deb
JL
1162 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1163 && (reg1 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1164
1165 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1166 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1167 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1168}
1169
73e65298 1170/* add imm16, an */
d2523010
JL
1171void OP_FAD00000 (insn, extension)
1172 unsigned long insn, extension;
05ccbdfd 1173{
73e65298
JL
1174 int z, c, n, v;
1175 unsigned long reg1, imm, value;
1176
9f4a551e 1177 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
6e7a01c1 1178 imm = SEXT16 (insn & 0xffff);
73e65298 1179 value = reg1 + imm;
9f4a551e 1180 State.regs[REG_A0 + REG0_16 (insn)] = value;
73e65298
JL
1181
1182 z = (value == 0);
1183 n = (value & 0x80000000);
1184 c = (reg1 < imm);
b7b89deb
JL
1185 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1186 && (reg1 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1187
1188 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1189 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1190 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1191}
1192
73e65298 1193/* add imm32, an */
d2523010
JL
1194void OP_FCD00000 (insn, extension)
1195 unsigned long insn, extension;
05ccbdfd 1196{
73e65298
JL
1197 int z, c, n, v;
1198 unsigned long reg1, imm, value;
1199
9f4a551e 1200 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
7c52bf32 1201 imm = ((insn & 0xffff) << 16) + extension;
73e65298 1202 value = reg1 + imm;
9f4a551e 1203 State.regs[REG_A0 + REG0_16 (insn)] = value;
73e65298
JL
1204
1205 z = (value == 0);
1206 n = (value & 0x80000000);
1207 c = (reg1 < imm);
b7b89deb
JL
1208 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1209 && (reg1 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1210
1211 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1212 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1213 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1214}
1215
de0dce7c 1216/* add imm8, sp */
d2523010
JL
1217void OP_F8FE00 (insn, extension)
1218 unsigned long insn, extension;
05ccbdfd 1219{
73e65298
JL
1220 unsigned long reg1, imm, value;
1221
1222 reg1 = State.regs[REG_SP];
1223 imm = SEXT8 (insn & 0xff);
1224 value = reg1 + imm;
1225 State.regs[REG_SP] = value;
05ccbdfd
JL
1226}
1227
73e65298 1228/* add imm16,sp */
d2523010
JL
1229void OP_FAFE0000 (insn, extension)
1230 unsigned long insn, extension;
05ccbdfd 1231{
73e65298
JL
1232 unsigned long reg1, imm, value;
1233
1234 reg1 = State.regs[REG_SP];
1235 imm = SEXT16 (insn & 0xffff);
1236 value = reg1 + imm;
1237 State.regs[REG_SP] = value;
05ccbdfd
JL
1238}
1239
de0dce7c 1240/* add imm32, sp */
d2523010
JL
1241void OP_FCFE0000 (insn, extension)
1242 unsigned long insn, extension;
05ccbdfd 1243{
73e65298
JL
1244 unsigned long reg1, imm, value;
1245
1246 reg1 = State.regs[REG_SP];
7c52bf32 1247 imm = ((insn & 0xffff) << 16) + extension;
73e65298
JL
1248 value = reg1 + imm;
1249 State.regs[REG_SP] = value;
05ccbdfd
JL
1250}
1251
de0dce7c 1252/* addc dm,dn */
d2523010
JL
1253void OP_F140 (insn, extension)
1254 unsigned long insn, extension;
05ccbdfd 1255{
73e65298
JL
1256 int z, c, n, v;
1257 unsigned long reg1, reg2, value;
1258
9f4a551e
JL
1259 reg1 = State.regs[REG_D0 + REG1 (insn)];
1260 reg2 = State.regs[REG_D0 + REG0 (insn)];
73e65298 1261 value = reg1 + reg2 + ((PSW & PSW_C) != 0);
9f4a551e 1262 State.regs[REG_D0 + REG0 (insn)] = value;
73e65298
JL
1263
1264 z = (value == 0);
1265 n = (value & 0x80000000);
1266 c = (reg1 < reg2);
b7b89deb
JL
1267 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1268 && (reg2 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1269
1270 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1271 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1272 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1273}
1274
707641f6 1275/* sub dm, dn */
d2523010
JL
1276void OP_F100 (insn, extension)
1277 unsigned long insn, extension;
05ccbdfd 1278{
707641f6
JL
1279 int z, c, n, v;
1280 unsigned long reg1, reg2, value;
1281
9f4a551e
JL
1282 reg1 = State.regs[REG_D0 + REG1 (insn)];
1283 reg2 = State.regs[REG_D0 + REG0 (insn)];
707641f6
JL
1284 value = reg2 - reg1;
1285
1286 z = (value == 0);
1287 n = (value & 0x80000000);
216e6557 1288 c = (reg1 > reg2);
b7b89deb
JL
1289 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1290 && (reg2 & 0x80000000) != (value & 0x80000000));
707641f6
JL
1291
1292 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1293 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1294 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
9f4a551e 1295 State.regs[REG_D0 + REG0 (insn)] = value;
05ccbdfd
JL
1296}
1297
707641f6 1298/* sub dm, an */
d2523010
JL
1299void OP_F120 (insn, extension)
1300 unsigned long insn, extension;
05ccbdfd 1301{
707641f6
JL
1302 int z, c, n, v;
1303 unsigned long reg1, reg2, value;
1304
9f4a551e
JL
1305 reg1 = State.regs[REG_D0 + REG1 (insn)];
1306 reg2 = State.regs[REG_A0 + REG0 (insn)];
707641f6
JL
1307 value = reg2 - reg1;
1308
1309 z = (value == 0);
1310 n = (value & 0x80000000);
216e6557 1311 c = (reg1 > reg2);
b7b89deb
JL
1312 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1313 && (reg2 & 0x80000000) != (value & 0x80000000));
707641f6
JL
1314
1315 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1316 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1317 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
9f4a551e 1318 State.regs[REG_A0 + REG0 (insn)] = value;
05ccbdfd
JL
1319}
1320
707641f6 1321/* sub am, dn */
d2523010
JL
1322void OP_F110 (insn, extension)
1323 unsigned long insn, extension;
05ccbdfd 1324{
707641f6
JL
1325 int z, c, n, v;
1326 unsigned long reg1, reg2, value;
1327
9f4a551e
JL
1328 reg1 = State.regs[REG_A0 + REG1 (insn)];
1329 reg2 = State.regs[REG_D0 + REG0 (insn)];
707641f6
JL
1330 value = reg2 - reg1;
1331
1332 z = (value == 0);
1333 n = (value & 0x80000000);
216e6557 1334 c = (reg1 > reg2);
b7b89deb
JL
1335 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1336 && (reg2 & 0x80000000) != (value & 0x80000000));
707641f6
JL
1337
1338 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1339 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1340 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
9f4a551e 1341 State.regs[REG_D0 + REG0 (insn)] = value;
05ccbdfd
JL
1342}
1343
707641f6 1344/* sub am, an */
d2523010
JL
1345void OP_F130 (insn, extension)
1346 unsigned long insn, extension;
05ccbdfd 1347{
707641f6
JL
1348 int z, c, n, v;
1349 unsigned long reg1, reg2, value;
1350
9f4a551e
JL
1351 reg1 = State.regs[REG_A0 + REG1 (insn)];
1352 reg2 = State.regs[REG_A0 + REG0 (insn)];
707641f6
JL
1353 value = reg2 - reg1;
1354
1355 z = (value == 0);
1356 n = (value & 0x80000000);
216e6557 1357 c = (reg1 > reg2);
b7b89deb
JL
1358 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1359 && (reg2 & 0x80000000) != (value & 0x80000000));
707641f6
JL
1360
1361 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1362 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1363 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
9f4a551e 1364 State.regs[REG_A0 + REG0 (insn)] = value;
05ccbdfd
JL
1365}
1366
de0dce7c 1367/* sub imm32, dn */
d2523010
JL
1368void OP_FCC40000 (insn, extension)
1369 unsigned long insn, extension;
05ccbdfd 1370{
707641f6
JL
1371 int z, c, n, v;
1372 unsigned long reg1, imm, value;
1373
9f4a551e 1374 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
7c52bf32 1375 imm = ((insn & 0xffff) << 16) + extension;
707641f6
JL
1376 value = reg1 - imm;
1377
1378 z = (value == 0);
1379 n = (value & 0x80000000);
1380 c = (reg1 < imm);
b7b89deb
JL
1381 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1382 && (reg1 & 0x80000000) != (value & 0x80000000));
707641f6
JL
1383
1384 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1385 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1386 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
9f4a551e 1387 State.regs[REG_D0 + REG0_16 (insn)] = value;
05ccbdfd
JL
1388}
1389
de0dce7c 1390/* sub imm32, an */
d2523010
JL
1391void OP_FCD40000 (insn, extension)
1392 unsigned long insn, extension;
05ccbdfd 1393{
707641f6
JL
1394 int z, c, n, v;
1395 unsigned long reg1, imm, value;
1396
9f4a551e 1397 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
7c52bf32 1398 imm = ((insn & 0xffff) << 16) + extension;
707641f6
JL
1399 value = reg1 - imm;
1400
1401 z = (value == 0);
1402 n = (value & 0x80000000);
1403 c = (reg1 < imm);
b7b89deb
JL
1404 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1405 && (reg1 & 0x80000000) != (value & 0x80000000));
707641f6
JL
1406
1407 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1408 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1409 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
9f4a551e 1410 State.regs[REG_A0 + REG0_16 (insn)] = value;
05ccbdfd
JL
1411}
1412
de0dce7c 1413/* subc dm, dn */
d2523010
JL
1414void OP_F180 (insn, extension)
1415 unsigned long insn, extension;
05ccbdfd 1416{
707641f6
JL
1417 int z, c, n, v;
1418 unsigned long reg1, reg2, value;
1419
9f4a551e
JL
1420 reg1 = State.regs[REG_D0 + REG1 (insn)];
1421 reg2 = State.regs[REG_D0 + REG0 (insn)];
707641f6
JL
1422 value = reg2 - reg1 - ((PSW & PSW_C) != 0);
1423
1424 z = (value == 0);
1425 n = (value & 0x80000000);
216e6557 1426 c = (reg1 > reg2);
b7b89deb
JL
1427 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1428 && (reg2 & 0x80000000) != (value & 0x80000000));
707641f6
JL
1429
1430 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1431 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1432 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
9f4a551e 1433 State.regs[REG_D0 + REG0 (insn)] = value;
05ccbdfd
JL
1434}
1435
de0dce7c 1436/* mul dm, dn */
d2523010
JL
1437void OP_F240 (insn, extension)
1438 unsigned long insn, extension;
05ccbdfd 1439{
707641f6
JL
1440 unsigned long long temp;
1441 int n, z;
1442
9f4a551e
JL
1443 temp = (State.regs[REG_D0 + REG0 (insn)]
1444 * State.regs[REG_D0 + REG1 (insn)]);
1445 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
707641f6 1446 State.regs[REG_MDR] = temp & 0xffffffff00000000LL;
9f4a551e
JL
1447 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1448 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
1449 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1450 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1451}
1452
de0dce7c 1453/* mulu dm, dn */
d2523010
JL
1454void OP_F250 (insn, extension)
1455 unsigned long insn, extension;
05ccbdfd 1456{
707641f6
JL
1457 unsigned long long temp;
1458 int n, z;
1459
9f4a551e
JL
1460 temp = (State.regs[REG_D0 + REG0 (insn)]
1461 * State.regs[REG_D0 + REG1 (insn)]);
1462 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
707641f6 1463 State.regs[REG_MDR] = temp & 0xffffffff00000000LL;
9f4a551e
JL
1464 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1465 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
1466 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1467 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1468}
1469
de0dce7c 1470/* div dm, dn */
d2523010
JL
1471void OP_F260 (insn, extension)
1472 unsigned long insn, extension;
05ccbdfd 1473{
707641f6
JL
1474 long long temp;
1475 int n, z;
1476
1477 temp = State.regs[REG_MDR];
1478 temp <<= 32;
9f4a551e
JL
1479 temp |= State.regs[REG_D0 + REG0 (insn)];
1480 State.regs[REG_MDR] = temp % (long)State.regs[REG_D0 + REG1 (insn)];
1481 temp /= (long)State.regs[REG_D0 + REG1 (insn)];
1482 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
707641f6 1483 State.regs[REG_MDR] = temp & 0xffffffff00000000LL;
9f4a551e
JL
1484 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1485 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
1486 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1487 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1488}
1489
de0dce7c 1490/* divu dm, dn */
d2523010
JL
1491void OP_F270 (insn, extension)
1492 unsigned long insn, extension;
05ccbdfd 1493{
707641f6
JL
1494 unsigned long long temp;
1495 int n, z;
1496
1497 temp = State.regs[REG_MDR];
1498 temp <<= 32;
9f4a551e
JL
1499 temp |= State.regs[REG_D0 + REG0 (insn)];
1500 State.regs[REG_MDR] = temp % State.regs[REG_D0 + REG1 (insn)];
1501 temp /= State.regs[REG_D0 + REG1 (insn)];
1502 State.regs[REG_D0 + REG0 (insn)] = temp & 0xffffffff;
707641f6 1503 State.regs[REG_MDR] = temp & 0xffffffff00000000LL;
9f4a551e
JL
1504 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1505 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
1506 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1507 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1508}
1509
73e65298 1510/* inc dn */
d2523010
JL
1511void OP_40 (insn, extension)
1512 unsigned long insn, extension;
05ccbdfd 1513{
61ecca95 1514 int z,n,c,v;
4d8ced6c 1515 unsigned int value, imm, reg1;
61ecca95 1516
9f4a551e 1517 reg1 = State.regs[REG_D0 + REG1 (insn)];
4d8ced6c
JL
1518 imm = 1;
1519 value = reg1 + imm;
9f4a551e 1520 State.regs[REG_D0 + REG1 (insn)] = value;
61ecca95
JL
1521
1522 z = (value == 0);
1523 n = (value & 0x80000000);
4d8ced6c
JL
1524 c = (reg1 < imm);
1525 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1526 && (reg1 & 0x80000000) != (value & 0x80000000));
61ecca95
JL
1527
1528 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1529 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1530 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1531}
1532
73e65298 1533/* inc an */
d2523010
JL
1534void OP_41 (insn, extension)
1535 unsigned long insn, extension;
05ccbdfd 1536{
9f4a551e 1537 State.regs[REG_A0 + REG1 (insn)] += 1;
05ccbdfd
JL
1538}
1539
92284aaa 1540/* inc4 an */
d2523010
JL
1541void OP_50 (insn, extension)
1542 unsigned long insn, extension;
05ccbdfd 1543{
9f4a551e 1544 State.regs[REG_A0 + REG0 (insn)] += 4;
05ccbdfd
JL
1545}
1546
92284aaa 1547/* cmp imm8, dn */
d2523010
JL
1548void OP_A000 (insn, extension)
1549 unsigned long insn, extension;
05ccbdfd 1550{
92284aaa
JL
1551 int z, c, n, v;
1552 unsigned long reg1, imm, value;
1553
9f4a551e 1554 reg1 = State.regs[REG_D0 + REG0_8 (insn)];
92284aaa
JL
1555 imm = SEXT8 (insn & 0xff);
1556 value = reg1 - imm;
1557
1558 z = (value == 0);
1559 n = (value & 0x80000000);
1560 c = (reg1 < imm);
b7b89deb
JL
1561 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1562 && (reg1 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1563
1564 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1565 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1566 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1567}
1568
92284aaa 1569/* cmp dm, dn */
d2523010
JL
1570void OP_A0 (insn, extension)
1571 unsigned long insn, extension;
05ccbdfd 1572{
92284aaa
JL
1573 int z, c, n, v;
1574 unsigned long reg1, reg2, value;
1575
9f4a551e
JL
1576 reg1 = State.regs[REG_D0 + REG1 (insn)];
1577 reg2 = State.regs[REG_D0 + REG0 (insn)];
707641f6 1578 value = reg2 - reg1;
92284aaa
JL
1579
1580 z = (value == 0);
1581 n = (value & 0x80000000);
216e6557 1582 c = (reg1 > reg2);
b7b89deb
JL
1583 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1584 && (reg2 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1585
1586 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1587 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1588 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1589}
1590
92284aaa 1591/* cmp dm, an */
d2523010
JL
1592void OP_F1A0 (insn, extension)
1593 unsigned long insn, extension;
05ccbdfd 1594{
92284aaa
JL
1595 int z, c, n, v;
1596 unsigned long reg1, reg2, value;
1597
9f4a551e
JL
1598 reg1 = State.regs[REG_D0 + REG1 (insn)];
1599 reg2 = State.regs[REG_A0 + REG0 (insn)];
707641f6 1600 value = reg2 - reg1;
92284aaa
JL
1601
1602 z = (value == 0);
1603 n = (value & 0x80000000);
216e6557 1604 c = (reg1 > reg2);
b7b89deb
JL
1605 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1606 && (reg2 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1607
1608 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1609 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1610 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1611}
1612
92284aaa 1613/* cmp am, dn */
d2523010
JL
1614void OP_F190 (insn, extension)
1615 unsigned long insn, extension;
05ccbdfd 1616{
92284aaa
JL
1617 int z, c, n, v;
1618 unsigned long reg1, reg2, value;
1619
9f4a551e
JL
1620 reg1 = State.regs[REG_A0 + REG1 (insn)];
1621 reg2 = State.regs[REG_D0 + REG0 (insn)];
707641f6 1622 value = reg2 - reg1;
92284aaa
JL
1623
1624 z = (value == 0);
1625 n = (value & 0x80000000);
216e6557 1626 c = (reg1 > reg2);
b7b89deb
JL
1627 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1628 && (reg2 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1629
1630 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1631 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1632 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1633}
1634
92284aaa 1635/* cmp imm8, an */
d2523010
JL
1636void OP_B000 (insn, extension)
1637 unsigned long insn, extension;
05ccbdfd 1638{
92284aaa
JL
1639 int z, c, n, v;
1640 unsigned long reg1, imm, value;
1641
9f4a551e 1642 reg1 = State.regs[REG_A0 + REG0_8 (insn)];
92284aaa
JL
1643 imm = insn & 0xff;
1644 value = reg1 - imm;
1645
1646 z = (value == 0);
1647 n = (value & 0x80000000);
1648 c = (reg1 < imm);
b7b89deb
JL
1649 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1650 && (reg1 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1651
1652 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1653 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1654 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1655}
1656
707641f6 1657/* cmp am, an */
d2523010
JL
1658void OP_B0 (insn, extension)
1659 unsigned long insn, extension;
05ccbdfd 1660{
73e65298
JL
1661 int z, c, n, v;
1662 unsigned long reg1, reg2, value;
1663
9f4a551e
JL
1664 reg1 = State.regs[REG_A0 + REG1 (insn)];
1665 reg2 = State.regs[REG_A0 + REG0 (insn)];
707641f6 1666 value = reg2 - reg1;
73e65298
JL
1667
1668 z = (value == 0);
1669 n = (value & 0x80000000);
216e6557 1670 c = (reg1 > reg2);
b7b89deb
JL
1671 v = ((reg2 & 0x80000000) != (reg1 & 0x80000000)
1672 && (reg2 & 0x80000000) != (value & 0x80000000));
73e65298
JL
1673
1674 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1675 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1676 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1677}
1678
707641f6 1679/* cmp imm16, dn */
d2523010
JL
1680void OP_FAC80000 (insn, extension)
1681 unsigned long insn, extension;
05ccbdfd 1682{
92284aaa
JL
1683 int z, c, n, v;
1684 unsigned long reg1, imm, value;
1685
9f4a551e 1686 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
92284aaa
JL
1687 imm = SEXT16 (insn & 0xffff);
1688 value = reg1 - imm;
1689
1690 z = (value == 0);
1691 n = (value & 0x80000000);
1692 c = (reg1 < imm);
b7b89deb
JL
1693 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1694 && (reg1 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1695
1696 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1697 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1698 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1699}
1700
707641f6 1701/* cmp imm32, dn */
d2523010
JL
1702void OP_FCC80000 (insn, extension)
1703 unsigned long insn, extension;
05ccbdfd 1704{
92284aaa
JL
1705 int z, c, n, v;
1706 unsigned long reg1, imm, value;
1707
9f4a551e 1708 reg1 = State.regs[REG_D0 + REG0_16 (insn)];
7c52bf32 1709 imm = ((insn & 0xffff) << 16) + extension;
92284aaa
JL
1710 value = reg1 - imm;
1711
1712 z = (value == 0);
1713 n = (value & 0x80000000);
1714 c = (reg1 < imm);
b7b89deb
JL
1715 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1716 && (reg1 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1717
1718 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1719 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1720 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1721}
1722
707641f6 1723/* cmp imm16, an */
d2523010
JL
1724void OP_FAD80000 (insn, extension)
1725 unsigned long insn, extension;
05ccbdfd 1726{
92284aaa
JL
1727 int z, c, n, v;
1728 unsigned long reg1, imm, value;
1729
9f4a551e 1730 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
92284aaa
JL
1731 imm = insn & 0xffff;
1732 value = reg1 - imm;
1733
1734 z = (value == 0);
1735 n = (value & 0x80000000);
1736 c = (reg1 < imm);
b7b89deb
JL
1737 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1738 && (reg1 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1739
1740 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1741 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1742 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1743}
1744
707641f6 1745/* cmp imm32, an */
d2523010
JL
1746void OP_FCD80000 (insn, extension)
1747 unsigned long insn, extension;
05ccbdfd 1748{
92284aaa
JL
1749 int z, c, n, v;
1750 unsigned long reg1, imm, value;
1751
9f4a551e 1752 reg1 = State.regs[REG_A0 + REG0_16 (insn)];
7c52bf32 1753 imm = ((insn & 0xffff) << 16) + extension;
92284aaa
JL
1754 value = reg1 - imm;
1755
1756 z = (value == 0);
1757 n = (value & 0x80000000);
1758 c = (reg1 < imm);
b7b89deb
JL
1759 v = ((reg1 & 0x80000000) != (imm & 0x80000000)
1760 && (reg1 & 0x80000000) != (value & 0x80000000));
92284aaa
JL
1761
1762 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1763 PSW |= ((z ? PSW_Z : 0) | ( n ? PSW_N : 0)
1764 | (c ? PSW_C : 0) | (v ? PSW_V : 0));
05ccbdfd
JL
1765}
1766
707641f6 1767/* and dm, dn */
d2523010
JL
1768void OP_F200 (insn, extension)
1769 unsigned long insn, extension;
05ccbdfd 1770{
707641f6
JL
1771 int n, z;
1772
9f4a551e
JL
1773 State.regs[REG_D0 + REG0 (insn)] &= State.regs[REG_D0 + REG1 (insn)];
1774 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1775 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
1776 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1777 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1778}
1779
2e35551c 1780/* and imm8, dn */
d2523010
JL
1781void OP_F8E000 (insn, extension)
1782 unsigned long insn, extension;
05ccbdfd 1783{
2e35551c
JL
1784 int n, z;
1785
9f4a551e
JL
1786 State.regs[REG_D0 + REG0_8 (insn)] &= (insn & 0xff);
1787 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
1788 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
2e35551c
JL
1789 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1790 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1791}
1792
ecb4b5a3 1793/* and imm16, dn */
d2523010
JL
1794void OP_FAE00000 (insn, extension)
1795 unsigned long insn, extension;
05ccbdfd 1796{
ecb4b5a3
JL
1797 int n, z;
1798
9f4a551e
JL
1799 State.regs[REG_D0 + REG0_16 (insn)] &= (insn & 0xffff);
1800 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1801 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
ecb4b5a3
JL
1802 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1803 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1804}
1805
de0dce7c 1806/* and imm32, dn */
d2523010
JL
1807void OP_FCE00000 (insn, extension)
1808 unsigned long insn, extension;
05ccbdfd 1809{
de0dce7c
JL
1810 int n, z;
1811
9f4a551e 1812 State.regs[REG_D0 + REG0_16 (insn)]
7c52bf32 1813 &= ((insn & 0xffff) << 16) + extension;
9f4a551e
JL
1814 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1815 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
de0dce7c
JL
1816 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1817 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1818}
1819
ecb4b5a3 1820/* and imm16, psw */
d2523010
JL
1821void OP_FAFC0000 (insn, extension)
1822 unsigned long insn, extension;
05ccbdfd 1823{
ecb4b5a3 1824 PSW &= (insn & 0xffff);
05ccbdfd
JL
1825}
1826
707641f6 1827/* or dm, dn*/
d2523010
JL
1828void OP_F210 (insn, extension)
1829 unsigned long insn, extension;
05ccbdfd 1830{
707641f6
JL
1831 int n, z;
1832
9f4a551e
JL
1833 State.regs[REG_D0 + REG0 (insn)] |= State.regs[REG_D0 + REG1 (insn)];
1834 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1835 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
1836 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1837 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1838}
1839
2e35551c 1840/* or imm8, dn */
d2523010
JL
1841void OP_F8E400 (insn, extension)
1842 unsigned long insn, extension;
05ccbdfd 1843{
2e35551c
JL
1844 int n, z;
1845
9f4a551e
JL
1846 State.regs[REG_D0 + REG0_8 (insn)] |= insn & 0xff;
1847 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
1848 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
2e35551c
JL
1849 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1850 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1851}
1852
ecb4b5a3 1853/* or imm16, dn*/
d2523010
JL
1854void OP_FAE40000 (insn, extension)
1855 unsigned long insn, extension;
05ccbdfd 1856{
ecb4b5a3
JL
1857 int n, z;
1858
9f4a551e
JL
1859 State.regs[REG_D0 + REG0_16 (insn)] |= insn & 0xffff;
1860 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1861 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
ecb4b5a3
JL
1862 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1863 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1864}
1865
de0dce7c 1866/* or imm32, dn */
d2523010
JL
1867void OP_FCE40000 (insn, extension)
1868 unsigned long insn, extension;
05ccbdfd 1869{
de0dce7c
JL
1870 int n, z;
1871
9f4a551e 1872 State.regs[REG_D0 + REG0_16 (insn)]
7c52bf32 1873 |= ((insn & 0xffff) << 16) + extension;
9f4a551e
JL
1874 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1875 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
de0dce7c
JL
1876 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1877 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1878}
1879
ecb4b5a3 1880/* or imm16,psw */
d2523010
JL
1881void OP_FAFD0000 (insn, extension)
1882 unsigned long insn, extension;
05ccbdfd 1883{
ecb4b5a3 1884 PSW |= (insn & 0xffff);
05ccbdfd
JL
1885}
1886
707641f6 1887/* xor dm, dn*/
d2523010
JL
1888void OP_F220 (insn, extension)
1889 unsigned long insn, extension;
05ccbdfd 1890{
707641f6
JL
1891 int n, z;
1892
9f4a551e
JL
1893 State.regs[REG_D0 + REG0 (insn)] ^= State.regs[REG_D0 + REG1 (insn)];
1894 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1895 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
1896 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1897 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1898}
1899
ecb4b5a3 1900/* xor imm16, dn */
d2523010
JL
1901void OP_FAE80000 (insn, extension)
1902 unsigned long insn, extension;
05ccbdfd 1903{
ecb4b5a3
JL
1904 int n, z;
1905
9f4a551e
JL
1906 State.regs[REG_D0 + REG0_16 (insn)] ^= insn & 0xffff;
1907 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1908 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
ecb4b5a3
JL
1909 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1910 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1911}
1912
de0dce7c 1913/* xor imm32, dn */
d2523010
JL
1914void OP_FCE80000 (insn, extension)
1915 unsigned long insn, extension;
05ccbdfd 1916{
de0dce7c
JL
1917 int n, z;
1918
9f4a551e 1919 State.regs[REG_D0 + REG0_16 (insn)]
7c52bf32 1920 ^= ((insn & 0xffff) << 16) + extension;
9f4a551e
JL
1921 z = (State.regs[REG_D0 + REG0_16 (insn)] == 0);
1922 n = (State.regs[REG_D0 + REG0_16 (insn)] & 0x80000000) != 0;
de0dce7c
JL
1923 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1924 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1925}
1926
de0dce7c 1927/* not dn */
d2523010
JL
1928void OP_F230 (insn, extension)
1929 unsigned long insn, extension;
05ccbdfd 1930{
707641f6
JL
1931 int n, z;
1932
9f4a551e
JL
1933 State.regs[REG_D0 + REG0 (insn)] = ~State.regs[REG_D0 + REG0 (insn)];
1934 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
1935 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
1936 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1937 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
1938}
1939
2e35551c 1940/* btst imm8, dn */
d2523010
JL
1941void OP_F8EC00 (insn, extension)
1942 unsigned long insn, extension;
05ccbdfd 1943{
2e35551c
JL
1944 unsigned long temp;
1945 int z, n;
1946
9f4a551e 1947 temp = State.regs[REG_D0 + REG0_8 (insn)];
2e35551c
JL
1948 temp &= (insn & 0xff);
1949 n = (temp & 0x80000000) != 0;
1950 z = (temp == 0);
1951 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1952 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
05ccbdfd
JL
1953}
1954
ecb4b5a3 1955/* btst imm16, dn */
d2523010
JL
1956void OP_FAEC0000 (insn, extension)
1957 unsigned long insn, extension;
05ccbdfd 1958{
ecb4b5a3
JL
1959 unsigned long temp;
1960 int z, n;
1961
9f4a551e 1962 temp = State.regs[REG_D0 + REG0_16 (insn)];
ecb4b5a3
JL
1963 temp &= (insn & 0xffff);
1964 n = (temp & 0x80000000) != 0;
1965 z = (temp == 0);
1966 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1967 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
05ccbdfd
JL
1968}
1969
de0dce7c 1970/* btst imm32, dn */
d2523010
JL
1971void OP_FCEC0000 (insn, extension)
1972 unsigned long insn, extension;
05ccbdfd 1973{
de0dce7c
JL
1974 unsigned long temp;
1975 int z, n;
1976
9f4a551e 1977 temp = State.regs[REG_D0 + REG0_16 (insn)];
7c52bf32 1978 temp &= ((insn & 0xffff) << 16) + extension;
de0dce7c
JL
1979 n = (temp & 0x80000000) != 0;
1980 z = (temp == 0);
1981 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1982 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
05ccbdfd
JL
1983}
1984
de0dce7c 1985/* btst imm8,(abs32) */
d2523010
JL
1986void OP_FE020000 (insn, extension)
1987 unsigned long insn, extension;
05ccbdfd 1988{
de0dce7c
JL
1989 unsigned long temp;
1990 int n, z;
1991
1992 temp = load_mem (((insn & 0xffff) << 16) | (extension >> 8), 1);
1993 temp &= (extension & 0xff);
1994 n = (temp & 0x80000000) != 0;
1995 z = (temp == 0);
1996 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
1997 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
05ccbdfd
JL
1998}
1999
ecb4b5a3 2000/* btst imm8,(d8,an) */
d2523010
JL
2001void OP_FAF80000 (insn, extension)
2002 unsigned long insn, extension;
05ccbdfd 2003{
ecb4b5a3
JL
2004 unsigned long temp;
2005 int n, z;
2006
9f4a551e 2007 temp = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3
JL
2008 + SEXT8 ((insn & 0xff00) >> 8)), 1);
2009 temp &= (insn & 0xff);
2010 n = (temp & 0x80000000) != 0;
2011 z = (temp == 0);
2012 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2013 PSW |= (z ? PSW_Z : 0) | (n ? PSW_N : 0);
05ccbdfd
JL
2014}
2015
707641f6 2016/* bset dm, (an) */
d2523010
JL
2017void OP_F080 (insn, extension)
2018 unsigned long insn, extension;
05ccbdfd 2019{
707641f6
JL
2020 unsigned long temp;
2021 int z;
2022
2023 temp = load_mem (State.regs[REG_A0 + (insn & 3)], 1);
9f4a551e
JL
2024 z = (temp & State.regs[REG_D0 + REG1 (insn)]) == 0;
2025 temp |= State.regs[REG_D0 + REG1 (insn)];
707641f6
JL
2026 store_mem (State.regs[REG_A0 + (insn & 3)], 1, temp);
2027 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2028 PSW |= (z ? PSW_Z : 0);
05ccbdfd
JL
2029}
2030
de0dce7c 2031/* bset imm8, (abs32) */
d2523010
JL
2032void OP_FE000000 (insn, extension)
2033 unsigned long insn, extension;
05ccbdfd 2034{
de0dce7c
JL
2035 unsigned long temp;
2036 int z;
2037
2038 temp = load_mem (((insn & 0xffff) << 16 | (extension >> 8)), 1);
2039 z = (temp & (extension & 0xff)) == 0;
2040 temp |= (extension & 0xff);
2041 store_mem ((((insn & 0xffff) << 16) | (extension >> 8)), 1, temp);
2042 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2043 PSW |= (z ? PSW_Z : 0);
05ccbdfd
JL
2044}
2045
ecb4b5a3 2046/* bset imm8,(d8,an) */
d2523010
JL
2047void OP_FAF00000 (insn, extension)
2048 unsigned long insn, extension;
05ccbdfd 2049{
ecb4b5a3
JL
2050 unsigned long temp;
2051 int z;
2052
9f4a551e 2053 temp = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3
JL
2054 + SEXT8 ((insn & 0xff00) >> 8)), 1);
2055 z = (temp & (insn & 0xff)) == 0;
2056 temp |= (insn & 0xff);
2057 store_mem (State.regs[REG_A0 + ((insn & 30000)>> 16)], 1, temp);
2058 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2059 PSW |= (z ? PSW_Z : 0);
05ccbdfd
JL
2060}
2061
707641f6 2062/* bclr dm, (an) */
d2523010
JL
2063void OP_F090 (insn, extension)
2064 unsigned long insn, extension;
05ccbdfd 2065{
707641f6
JL
2066 unsigned long temp;
2067 int z;
2068
2069 temp = load_mem (State.regs[REG_A0 + (insn & 3)], 1);
9f4a551e
JL
2070 z = (temp & State.regs[REG_D0 + REG1 (insn)]) == 0;
2071 temp = ~temp & State.regs[REG_D0 + REG1 (insn)];
707641f6
JL
2072 store_mem (State.regs[REG_A0 + (insn & 3)], 1, temp);
2073 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2074 PSW |= (z ? PSW_Z : 0);
05ccbdfd
JL
2075}
2076
de0dce7c 2077/* bclr imm8, (abs32) */
d2523010
JL
2078void OP_FE010000 (insn, extension)
2079 unsigned long insn, extension;
05ccbdfd 2080{
de0dce7c
JL
2081 unsigned long temp;
2082 int z;
2083
2084 temp = load_mem (((insn & 0xffff) << 16) | (extension >> 8), 1);
2085 z = (temp & (extension & 0xff)) == 0;
2086 temp = ~temp & (extension & 0xff);
2087 store_mem (((insn & 0xffff) << 16) | (extension >> 8), 1, temp);
2088 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2089 PSW |= (z ? PSW_Z : 0);
05ccbdfd
JL
2090}
2091
ecb4b5a3 2092/* bclr imm8,(d8,an) */
d2523010
JL
2093void OP_FAF40000 (insn, extension)
2094 unsigned long insn, extension;
05ccbdfd 2095{
ecb4b5a3
JL
2096 unsigned long temp;
2097 int z;
2098
9f4a551e 2099 temp = load_mem ((State.regs[REG_A0 + REG0_16 (insn)]
ecb4b5a3
JL
2100 + SEXT8 ((insn & 0xff00) >> 8)), 1);
2101 z = (temp & (insn & 0xff)) == 0;
2102 temp = ~temp & (insn & 0xff);
9f4a551e 2103 store_mem (State.regs[REG_A0 + REG0_16 (insn)], 1, temp);
ecb4b5a3
JL
2104 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2105 PSW |= (z ? PSW_Z : 0);
05ccbdfd
JL
2106}
2107
2e35551c 2108/* asr dm, dn */
d2523010
JL
2109void OP_F2B0 (insn, extension)
2110 unsigned long insn, extension;
05ccbdfd 2111{
707641f6
JL
2112 long temp;
2113 int z, n, c;
2114
9f4a551e 2115 temp = State.regs[REG_D0 + REG0 (insn)];
707641f6 2116 c = temp & 1;
9f4a551e
JL
2117 temp >>= State.regs[REG_D0 + REG1 (insn)];
2118 State.regs[REG_D0 + REG0 (insn)] = temp;
2119 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2120 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
2121 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2122 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
05ccbdfd
JL
2123}
2124
2e35551c 2125/* asr imm8, dn */
d2523010
JL
2126void OP_F8C800 (insn, extension)
2127 unsigned long insn, extension;
05ccbdfd 2128{
2e35551c
JL
2129 long temp;
2130 int z, n, c;
2131
9f4a551e 2132 temp = State.regs[REG_D0 + REG0_8 (insn)];
2e35551c
JL
2133 c = temp & 1;
2134 temp >>= (insn & 0xff);
9f4a551e
JL
2135 State.regs[REG_D0 + REG0_8 (insn)] = temp;
2136 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
2137 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
2e35551c
JL
2138 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2139 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
05ccbdfd
JL
2140}
2141
2e35551c 2142/* lsr dm, dn */
d2523010
JL
2143void OP_F2A0 (insn, extension)
2144 unsigned long insn, extension;
05ccbdfd 2145{
707641f6
JL
2146 int z, n, c;
2147
9f4a551e
JL
2148 c = State.regs[REG_D0 + REG0 (insn)] & 1;
2149 State.regs[REG_D0 + REG0 (insn)]
2150 >>= State.regs[REG_D0 + REG1 (insn)];
2151 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2152 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
2153 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2154 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
05ccbdfd
JL
2155}
2156
2e35551c 2157/* lsr dm, dn */
d2523010
JL
2158void OP_F8C400 (insn, extension)
2159 unsigned long insn, extension;
05ccbdfd 2160{
2e35551c
JL
2161 int z, n, c;
2162
9f4a551e
JL
2163 c = State.regs[REG_D0 + REG0_8 (insn)] & 1;
2164 State.regs[REG_D0 + REG0_8 (insn)] >>= (insn & 0xff);
2165 z = (State.regs[REG_D0 + (REG0 (insn) >> 8)] == 0);
2166 n = (State.regs[REG_D0 + (REG0 (insn) >> 8)] & 0x80000000) != 0;
2e35551c
JL
2167 PSW &= ~(PSW_Z | PSW_N | PSW_C);
2168 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
05ccbdfd
JL
2169}
2170
2e35551c 2171/* asl dm, dn */
d2523010
JL
2172void OP_F290 (insn, extension)
2173 unsigned long insn, extension;
05ccbdfd 2174{
707641f6
JL
2175 int n, z;
2176
9f4a551e
JL
2177 State.regs[REG_D0 + REG0 (insn)]
2178 <<= State.regs[REG_D0 + REG1 (insn)];
2179 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2180 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
2181 PSW &= ~(PSW_Z | PSW_N);
2182 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
2183}
2184
2e35551c 2185/* asl imm8, dn */
d2523010
JL
2186void OP_F8C000 (insn, extension)
2187 unsigned long insn, extension;
05ccbdfd 2188{
2e35551c
JL
2189 int n, z;
2190
9f4a551e
JL
2191 State.regs[REG_D0 + REG0_8 (insn)] <<= (insn & 0xff);
2192 z = (State.regs[REG_D0 + REG0_8 (insn)] == 0);
2193 n = (State.regs[REG_D0 + REG0_8 (insn)] & 0x80000000) != 0;
2e35551c
JL
2194 PSW &= ~(PSW_Z | PSW_N);
2195 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
2196}
2197
707641f6 2198/* asl2 dn */
d2523010
JL
2199void OP_54 (insn, extension)
2200 unsigned long insn, extension;
05ccbdfd 2201{
707641f6
JL
2202 int n, z;
2203
9f4a551e
JL
2204 State.regs[REG_D0 + REG0 (insn)] <<= 2;
2205 z = (State.regs[REG_D0 + REG0 (insn)] == 0);
2206 n = (State.regs[REG_D0 + REG0 (insn)] & 0x80000000) != 0;
707641f6
JL
2207 PSW &= ~(PSW_Z | PSW_N);
2208 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0));
05ccbdfd
JL
2209}
2210
707641f6 2211/* ror dn */
d2523010
JL
2212void OP_F284 (insn, extension)
2213 unsigned long insn, extension;
05ccbdfd 2214{
707641f6
JL
2215 unsigned long value;
2216 int c,n,z;
2217
9f4a551e 2218 value = State.regs[REG_D0 + REG0 (insn)];
7c52bf32 2219 c = (value & 0x1);
707641f6
JL
2220
2221 value >>= 1;
2222 value |= ((PSW & PSW_C) != 0) ? 0x80000000 : 0;
9f4a551e 2223 State.regs[REG_D0 + REG0 (insn)] = value;
707641f6 2224 z = (value == 0);
b7b89deb 2225 n = (value & 0x80000000) != 0;
707641f6
JL
2226 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2227 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
05ccbdfd
JL
2228}
2229
707641f6 2230/* rol dn */
d2523010
JL
2231void OP_F280 (insn, extension)
2232 unsigned long insn, extension;
05ccbdfd 2233{
707641f6
JL
2234 unsigned long value;
2235 int c,n,z;
2236
9f4a551e 2237 value = State.regs[REG_D0 + REG0 (insn)];
7c52bf32 2238 c = (value & 0x80000000) ? 1 : 0;
707641f6
JL
2239
2240 value <<= 1;
2241 value |= ((PSW & PSW_C) != 0);
9f4a551e 2242 State.regs[REG_D0 + REG0 (insn)] = value;
707641f6 2243 z = (value == 0);
b7b89deb 2244 n = (value & 0x80000000) != 0;
707641f6
JL
2245 PSW &= ~(PSW_Z | PSW_N | PSW_C | PSW_V);
2246 PSW |= ((z ? PSW_Z : 0) | (n ? PSW_N : 0) | (c ? PSW_C : 0));
05ccbdfd
JL
2247}
2248
f5f13c1d 2249/* beq label:8 */
d2523010
JL
2250void OP_C800 (insn, extension)
2251 unsigned long insn, extension;
05ccbdfd 2252{
73e65298
JL
2253 /* The dispatching code will add 2 after we return, so
2254 we subtract two here to make things right. */
2255 if (PSW & PSW_Z)
2256 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2257}
2258
f5f13c1d 2259/* bne label:8 */
d2523010
JL
2260void OP_C900 (insn, extension)
2261 unsigned long insn, extension;
05ccbdfd 2262{
73e65298
JL
2263 /* The dispatching code will add 2 after we return, so
2264 we subtract two here to make things right. */
2265 if (!(PSW & PSW_Z))
2266 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2267}
2268
f5f13c1d 2269/* bgt label:8 */
d2523010
JL
2270void OP_C100 (insn, extension)
2271 unsigned long insn, extension;
05ccbdfd 2272{
f5f13c1d
JL
2273 /* The dispatching code will add 2 after we return, so
2274 we subtract two here to make things right. */
2275 if (!((PSW & PSW_Z)
7c52bf32 2276 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))))
f5f13c1d 2277 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2278}
2279
f5f13c1d 2280/* bge label:8 */
d2523010
JL
2281void OP_C200 (insn, extension)
2282 unsigned long insn, extension;
05ccbdfd 2283{
f5f13c1d
JL
2284 /* The dispatching code will add 2 after we return, so
2285 we subtract two here to make things right. */
7c52bf32 2286 if (!(((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
f5f13c1d 2287 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2288}
2289
f5f13c1d 2290/* ble label:8 */
d2523010
JL
2291void OP_C300 (insn, extension)
2292 unsigned long insn, extension;
05ccbdfd 2293{
f5f13c1d
JL
2294 /* The dispatching code will add 2 after we return, so
2295 we subtract two here to make things right. */
2296 if ((PSW & PSW_Z)
7c52bf32 2297 || (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0)))
f5f13c1d 2298 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2299}
2300
f5f13c1d 2301/* blt label:8 */
d2523010
JL
2302void OP_C000 (insn, extension)
2303 unsigned long insn, extension;
05ccbdfd 2304{
f5f13c1d
JL
2305 /* The dispatching code will add 2 after we return, so
2306 we subtract two here to make things right. */
7c52bf32 2307 if (((PSW & PSW_N) != 0) ^ ((PSW & PSW_V) != 0))
f5f13c1d 2308 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2309}
2310
f5f13c1d 2311/* bhi label:8 */
d2523010
JL
2312void OP_C500 (insn, extension)
2313 unsigned long insn, extension;
05ccbdfd 2314{
f5f13c1d
JL
2315 /* The dispatching code will add 2 after we return, so
2316 we subtract two here to make things right. */
2317 if (!(((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0))
2318 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2319}
2320
f5f13c1d 2321/* bcc label:8 */
d2523010
JL
2322void OP_C600 (insn, extension)
2323 unsigned long insn, extension;
05ccbdfd 2324{
f5f13c1d
JL
2325 /* The dispatching code will add 2 after we return, so
2326 we subtract two here to make things right. */
2327 if (!(PSW & PSW_C))
2328 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2329}
2330
f5f13c1d 2331/* bls label:8 */
d2523010
JL
2332void OP_C700 (insn, extension)
2333 unsigned long insn, extension;
05ccbdfd 2334{
f5f13c1d
JL
2335 /* The dispatching code will add 2 after we return, so
2336 we subtract two here to make things right. */
2337 if (((PSW & PSW_C) != 0) || (PSW & PSW_Z) != 0)
2338 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2339}
2340
f5f13c1d 2341/* bcs label:8 */
d2523010
JL
2342void OP_C400 (insn, extension)
2343 unsigned long insn, extension;
05ccbdfd 2344{
f5f13c1d
JL
2345 /* The dispatching code will add 2 after we return, so
2346 we subtract two here to make things right. */
2347 if (PSW & PSW_C)
2348 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2349}
2350
f5f13c1d 2351/* bvc label:8 */
d2523010
JL
2352void OP_F8E800 (insn, extension)
2353 unsigned long insn, extension;
05ccbdfd 2354{
f5f13c1d
JL
2355 /* The dispatching code will add 3 after we return, so
2356 we subtract two here to make things right. */
2357 if (!(PSW & PSW_V))
2358 State.pc += SEXT8 (insn & 0xff) - 3;
05ccbdfd
JL
2359}
2360
f5f13c1d 2361/* bvs label:8 */
d2523010
JL
2362void OP_F8E900 (insn, extension)
2363 unsigned long insn, extension;
05ccbdfd 2364{
f5f13c1d
JL
2365 /* The dispatching code will add 3 after we return, so
2366 we subtract two here to make things right. */
2367 if (PSW & PSW_V)
2368 State.pc += SEXT8 (insn & 0xff) - 3;
05ccbdfd
JL
2369}
2370
f5f13c1d 2371/* bnc label:8 */
d2523010
JL
2372void OP_F8EA00 (insn, extension)
2373 unsigned long insn, extension;
05ccbdfd 2374{
f5f13c1d
JL
2375 /* The dispatching code will add 3 after we return, so
2376 we subtract two here to make things right. */
2377 if (!(PSW & PSW_N))
2378 State.pc += SEXT8 (insn & 0xff) - 3;
05ccbdfd
JL
2379}
2380
f5f13c1d 2381/* bns label:8 */
d2523010
JL
2382void OP_F8EB00 (insn, extension)
2383 unsigned long insn, extension;
05ccbdfd 2384{
f5f13c1d
JL
2385 /* The dispatching code will add 3 after we return, so
2386 we subtract two here to make things right. */
2387 if (PSW & PSW_N)
2388 State.pc += SEXT8 (insn & 0xff) - 3;
05ccbdfd
JL
2389}
2390
f5f13c1d 2391/* bra label:8 */
d2523010
JL
2392void OP_CA00 (insn, extension)
2393 unsigned long insn, extension;
05ccbdfd 2394{
f5f13c1d
JL
2395 /* The dispatching code will add 2 after we return, so
2396 we subtract two here to make things right. */
2397 State.pc += SEXT8 (insn & 0xff) - 2;
05ccbdfd
JL
2398}
2399
2400/* leq */
d2523010
JL
2401void OP_D8 (insn, extension)
2402 unsigned long insn, extension;
05ccbdfd 2403{
f5f13c1d 2404 abort ();
05ccbdfd
JL
2405}
2406
2407/* lne */
d2523010
JL
2408void OP_D9 (insn, extension)
2409 unsigned long insn, extension;
05ccbdfd 2410{
f5f13c1d 2411 abort ();
05ccbdfd
JL
2412}
2413
2414/* lgt */
d2523010
JL
2415void OP_D1 (insn, extension)
2416 unsigned long insn, extension;
05ccbdfd 2417{
f5f13c1d 2418 abort ();
05ccbdfd
JL
2419}
2420
2421/* lge */
d2523010
JL
2422void OP_D2 (insn, extension)
2423 unsigned long insn, extension;
05ccbdfd 2424{
f5f13c1d 2425 abort ();
05ccbdfd
JL
2426}
2427
2428/* lle */
d2523010
JL
2429void OP_D3 (insn, extension)
2430 unsigned long insn, extension;
05ccbdfd 2431{
f5f13c1d 2432 abort ();
05ccbdfd
JL
2433}
2434
2435/* llt */
d2523010
JL
2436void OP_D0 (insn, extension)
2437 unsigned long insn, extension;
05ccbdfd 2438{
f5f13c1d 2439 abort ();
05ccbdfd
JL
2440}
2441
2442/* lhi */
d2523010
JL
2443void OP_D5 (insn, extension)
2444 unsigned long insn, extension;
05ccbdfd 2445{
f5f13c1d 2446 abort ();
05ccbdfd
JL
2447}
2448
2449/* lcc */
d2523010
JL
2450void OP_D6 (insn, extension)
2451 unsigned long insn, extension;
05ccbdfd 2452{
f5f13c1d 2453 abort ();
05ccbdfd
JL
2454}
2455
2456/* lls */
d2523010
JL
2457void OP_D7 (insn, extension)
2458 unsigned long insn, extension;
05ccbdfd 2459{
f5f13c1d 2460 abort ();
05ccbdfd
JL
2461}
2462
2463/* lcs */
d2523010
JL
2464void OP_D4 (insn, extension)
2465 unsigned long insn, extension;
05ccbdfd 2466{
f5f13c1d 2467 abort ();
05ccbdfd
JL
2468}
2469
2470/* lra */
d2523010
JL
2471void OP_DA (insn, extension)
2472 unsigned long insn, extension;
05ccbdfd 2473{
f5f13c1d 2474 abort ();
05ccbdfd
JL
2475}
2476
2477/* setlb */
d2523010
JL
2478void OP_DB (insn, extension)
2479 unsigned long insn, extension;
05ccbdfd 2480{
f5f13c1d 2481 abort ();
05ccbdfd
JL
2482}
2483
707641f6 2484/* jmp (an) */
d2523010
JL
2485void OP_F0F4 (insn, extension)
2486 unsigned long insn, extension;
05ccbdfd 2487{
9f4a551e 2488 State.pc = State.regs[REG_A0 + REG0 (insn)] - 2;
05ccbdfd
JL
2489}
2490
707641f6 2491/* jmp label:16 */
d2523010
JL
2492void OP_CC0000 (insn, extension)
2493 unsigned long insn, extension;
05ccbdfd 2494{
92284aaa 2495 State.pc += SEXT16 (insn & 0xffff) - 3;
05ccbdfd
JL
2496}
2497
707641f6 2498/* jmp label:32 */
d2523010
JL
2499void OP_DC000000 (insn, extension)
2500 unsigned long insn, extension;
05ccbdfd 2501{
7c52bf32 2502 State.pc += (((insn & 0xffffff) << 8) + extension) - 5;
05ccbdfd
JL
2503}
2504
707641f6 2505/* call label:16,reg_list,imm8 */
d2523010
JL
2506void OP_CD000000 (insn, extension)
2507 unsigned long insn, extension;
05ccbdfd 2508{
707641f6
JL
2509 unsigned int next_pc, sp, adjust;
2510 unsigned long mask;
2511
2512 sp = State.regs[REG_SP];
2513 next_pc = State.pc + 2;
2514 State.mem[sp] = next_pc & 0xff;
3bb3fe44
JL
2515 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2516 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2517 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
707641f6
JL
2518
2519 mask = insn & 0xff;
2520
2521 adjust = 0;
2522 if (mask & 0x80)
2523 {
2524 adjust -= 4;
2525 State.regs[REG_D0 + 2] = load_mem (sp + adjust, 4);
2526 }
2527
2528 if (mask & 0x40)
2529 {
2530 adjust -= 4;
2531 State.regs[REG_D0 + 3] = load_mem (sp + adjust, 4);
2532 }
2533
2534 if (mask & 0x20)
2535 {
2536 adjust -= 4;
2537 State.regs[REG_A0 + 2] = load_mem (sp + adjust, 4);
2538 }
2539
2540 if (mask & 0x10)
2541 {
2542 adjust -= 4;
2543 State.regs[REG_A0 + 3] = load_mem (sp + adjust, 4);
2544 }
2545
2546 if (mask & 0x8)
2547 {
2548 adjust -= 4;
2549 State.regs[REG_D0] = load_mem (sp + adjust, 4);
2550 adjust -= 4;
2551 State.regs[REG_D0 + 1] = load_mem (sp + adjust, 4);
2552 adjust -= 4;
2553 State.regs[REG_A0] = load_mem (sp + adjust, 4);
2554 adjust -= 4;
2555 State.regs[REG_A0 + 1] = load_mem (sp + adjust, 4);
2556 adjust -= 4;
2557 State.regs[REG_MDR] = load_mem (sp + adjust, 4);
2558 adjust -= 4;
2559 State.regs[REG_LIR] = load_mem (sp + adjust, 4);
2560 adjust -= 4;
2561 State.regs[REG_LAR] = load_mem (sp + adjust, 4);
2562 adjust -= 4;
2563 }
2564
2565 /* And make sure to update the stack pointer. */
2566 State.regs[REG_SP] -= extension;
2567 State.regs[REG_MDR] = next_pc;
2568 State.pc += SEXT16 ((insn & 0xffff00) >> 8) - 5;
05ccbdfd
JL
2569}
2570
707641f6 2571/* call label:32,reg_list,imm8*/
d2523010
JL
2572void OP_DD000000 (insn, extension)
2573 unsigned long insn, extension;
05ccbdfd 2574{
707641f6
JL
2575 unsigned int next_pc, sp, adjust;
2576 unsigned long mask;
2577
2578 sp = State.regs[REG_SP];
2579 next_pc = State.pc + 2;
2580 State.mem[sp] = next_pc & 0xff;
3bb3fe44
JL
2581 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2582 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2583 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
707641f6
JL
2584
2585 mask = (extension & 0xff00) >> 8;
2586
2587 adjust = 0;
2588 if (mask & 0x80)
2589 {
2590 adjust -= 4;
2591 State.regs[REG_D0 + 2] = load_mem (sp + adjust, 4);
2592 }
2593
2594 if (mask & 0x40)
2595 {
2596 adjust -= 4;
2597 State.regs[REG_D0 + 3] = load_mem (sp + adjust, 4);
2598 }
2599
2600 if (mask & 0x20)
2601 {
2602 adjust -= 4;
2603 State.regs[REG_A0 + 2] = load_mem (sp + adjust, 4);
2604 }
2605
2606 if (mask & 0x10)
2607 {
2608 adjust -= 4;
2609 State.regs[REG_A0 + 3] = load_mem (sp + adjust, 4);
2610 }
2611
2612 if (mask & 0x8)
2613 {
2614 adjust -= 4;
2615 State.regs[REG_D0] = load_mem (sp + adjust, 4);
2616 adjust -= 4;
2617 State.regs[REG_D0 + 1] = load_mem (sp + adjust, 4);
2618 adjust -= 4;
2619 State.regs[REG_A0] = load_mem (sp + adjust, 4);
2620 adjust -= 4;
2621 State.regs[REG_A0 + 1] = load_mem (sp + adjust, 4);
2622 adjust -= 4;
2623 State.regs[REG_MDR] = load_mem (sp + adjust, 4);
2624 adjust -= 4;
2625 State.regs[REG_LIR] = load_mem (sp + adjust, 4);
2626 adjust -= 4;
2627 State.regs[REG_LAR] = load_mem (sp + adjust, 4);
2628 adjust -= 4;
2629 }
2630
2631 /* And make sure to update the stack pointer. */
2632 State.regs[REG_SP] -= (extension & 0xff);
2633 State.regs[REG_MDR] = next_pc;
2634 State.pc += (((insn & 0xffffff) << 8) | ((extension & 0xff0000) >> 16)) - 7;
05ccbdfd
JL
2635}
2636
707641f6 2637/* calls (an) */
d2523010
JL
2638void OP_F0F0 (insn, extension)
2639 unsigned long insn, extension;
05ccbdfd 2640{
92284aaa
JL
2641 unsigned int next_pc, sp;
2642
2643 sp = State.regs[REG_SP];
2644 next_pc = State.pc + 2;
2645 State.mem[sp] = next_pc & 0xff;
3bb3fe44
JL
2646 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2647 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2648 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
92284aaa 2649 State.regs[REG_MDR] = next_pc;
9f4a551e 2650 State.pc = State.regs[REG_A0 + REG0 (insn)] - 2;
05ccbdfd
JL
2651}
2652
707641f6 2653/* calls label:16 */
d2523010
JL
2654void OP_FAFF0000 (insn, extension)
2655 unsigned long insn, extension;
05ccbdfd 2656{
92284aaa
JL
2657 unsigned int next_pc, sp;
2658
2659 sp = State.regs[REG_SP];
2660 next_pc = State.pc + 4;
2661 State.mem[sp] = next_pc & 0xff;
3bb3fe44
JL
2662 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2663 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2664 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
92284aaa
JL
2665 State.regs[REG_MDR] = next_pc;
2666 State.pc += SEXT16 (insn & 0xffff) - 4;
05ccbdfd
JL
2667}
2668
707641f6 2669/* calls label:32 */
d2523010
JL
2670void OP_FCFF0000 (insn, extension)
2671 unsigned long insn, extension;
05ccbdfd 2672{
92284aaa
JL
2673 unsigned int next_pc, sp;
2674
2675 sp = State.regs[REG_SP];
2676 next_pc = State.pc + 6;
2677 State.mem[sp] = next_pc & 0xff;
3bb3fe44
JL
2678 State.mem[sp+1] = (next_pc & 0xff00) >> 8;
2679 State.mem[sp+2] = (next_pc & 0xff0000) >> 16;
2680 State.mem[sp+3] = (next_pc & 0xff000000) >> 24;
92284aaa 2681 State.regs[REG_MDR] = next_pc;
7c52bf32 2682 State.pc += (((insn & 0xffff) << 16) + extension) - 6;
05ccbdfd
JL
2683}
2684
de0dce7c 2685/* ret reg_list, imm8 */
d2523010
JL
2686void OP_DF0000 (insn, extension)
2687 unsigned long insn, extension;
05ccbdfd 2688{
707641f6
JL
2689 unsigned int sp;
2690 unsigned long mask;
2691
2692 State.regs[REG_SP] += insn & 0xff;
707641f6
JL
2693 sp = State.regs[REG_SP];
2694
2695 mask = (insn & 0xff00) >> 8;
2696
2697 if (mask & 0x8)
2698 {
2699 sp += 4;
2700 State.regs[REG_LAR] = load_mem (sp, 4);
2701 sp += 4;
2702 State.regs[REG_LIR] = load_mem (sp, 4);
2703 sp += 4;
2704 State.regs[REG_MDR] = load_mem (sp, 4);
2705 sp += 4;
2706 State.regs[REG_A0 + 1] = load_mem (sp, 4);
2707 sp += 4;
2708 State.regs[REG_A0] = load_mem (sp, 4);
2709 sp += 4;
2710 State.regs[REG_D0 + 1] = load_mem (sp, 4);
2711 sp += 4;
2712 State.regs[REG_D0] = load_mem (sp, 4);
2713 sp += 4;
2714 }
2715
2716 if (mask & 0x10)
2717 {
2718 State.regs[REG_A0 + 3] = load_mem (sp, 4);
2719 sp += 4;
2720 }
2721
2722 if (mask & 0x20)
2723 {
2724 State.regs[REG_A0 + 2] = load_mem (sp, 4);
2725 sp += 4;
2726 }
2727
2728 if (mask & 0x40)
2729 {
2730 State.regs[REG_D0 + 3] = load_mem (sp, 4);
2731 sp += 4;
2732 }
2733
2734 if (mask & 0x80)
2735 {
2736 State.regs[REG_D0 + 2] = load_mem (sp, 4);
2737 sp += 4;
2738 }
16d2e2b6
JL
2739
2740 /* And make sure to update the stack pointer. */
2741 State.regs[REG_SP] = sp;
2742
2743 /* Restore the PC value. */
2744 State.pc = (State.mem[sp] | (State.mem[sp+1] << 8)
2745 | (State.mem[sp+2] << 16) | (State.mem[sp+3] << 24));
2746 State.pc -= 3;
05ccbdfd
JL
2747}
2748
707641f6 2749/* retf reg_list,imm8 */
d2523010
JL
2750void OP_DE0000 (insn, extension)
2751 unsigned long insn, extension;
05ccbdfd 2752{
707641f6
JL
2753 unsigned int sp;
2754 unsigned long mask;
2755
7c52bf32
JL
2756 sp = State.regs[REG_SP] + (insn & 0xff);
2757 State.regs[REG_SP] = sp;
16d2e2b6 2758 State.pc = State.regs[REG_MDR] - 3;
707641f6
JL
2759
2760 sp = State.regs[REG_SP];
2761
2762 mask = (insn & 0xff00) >> 8;
2763
2764 if (mask & 0x8)
2765 {
2766 sp += 4;
2767 State.regs[REG_LAR] = load_mem (sp, 4);
2768 sp += 4;
2769 State.regs[REG_LIR] = load_mem (sp, 4);
2770 sp += 4;
2771 State.regs[REG_MDR] = load_mem (sp, 4);
2772 sp += 4;
2773 State.regs[REG_A0 + 1] = load_mem (sp, 4);
2774 sp += 4;
2775 State.regs[REG_A0] = load_mem (sp, 4);
2776 sp += 4;
2777 State.regs[REG_D0 + 1] = load_mem (sp, 4);
2778 sp += 4;
2779 State.regs[REG_D0] = load_mem (sp, 4);
2780 sp += 4;
2781 }
2782
2783 if (mask & 0x10)
2784 {
2785 State.regs[REG_A0 + 3] = load_mem (sp, 4);
2786 sp += 4;
2787 }
2788
2789 if (mask & 0x20)
2790 {
2791 State.regs[REG_A0 + 2] = load_mem (sp, 4);
2792 sp += 4;
2793 }
2794
2795 if (mask & 0x40)
2796 {
2797 State.regs[REG_D0 + 3] = load_mem (sp, 4);
2798 sp += 4;
2799 }
2800
2801 if (mask & 0x80)
2802 {
2803 State.regs[REG_D0 + 2] = load_mem (sp, 4);
2804 sp += 4;
2805 }
16d2e2b6
JL
2806
2807 /* And make sure to update the stack pointer. */
2808 State.regs[REG_SP] = sp;
05ccbdfd
JL
2809}
2810
2811/* rets */
d2523010
JL
2812void OP_F0FC (insn, extension)
2813 unsigned long insn, extension;
05ccbdfd 2814{
92284aaa
JL
2815 unsigned int sp;
2816
2817 sp = State.regs[REG_SP];
2818 State.pc = (State.mem[sp] | (State.mem[sp+1] << 8)
2819 | (State.mem[sp+2] << 16) | (State.mem[sp+3] << 24));
2820 State.pc -= 2;
05ccbdfd
JL
2821}
2822
2823/* rti */
d2523010
JL
2824void OP_F0FD (insn, extension)
2825 unsigned long insn, extension;
05ccbdfd 2826{
f5f13c1d 2827 abort ();
05ccbdfd
JL
2828}
2829
2830/* trap */
d2523010
JL
2831void OP_F0FE (insn, extension)
2832 unsigned long insn, extension;
05ccbdfd 2833{
3bb3fe44
JL
2834 /* We use this for simulated system calls; we may need to change
2835 it to a reserved instruction if we conflict with uses at
2836 Matsushita. */
2837 int save_errno = errno;
2838 errno = 0;
2839
2840/* Registers passed to trap 0 */
2841
2842/* Function number. */
2843#define FUNC (load_mem (State.regs[REG_SP] + 4, 4))
2844
2845/* Parameters. */
2846#define PARM1 (load_mem (State.regs[REG_SP] + 8, 4))
2847#define PARM2 (load_mem (State.regs[REG_SP] + 12, 4))
2848#define PARM3 (load_mem (State.regs[REG_SP] + 16, 4))
2849
2850/* Registers set by trap 0 */
2851
2852#define RETVAL State.regs[0] /* return value */
2853#define RETERR State.regs[1] /* return error code */
2854
2855/* Turn a pointer in a register into a pointer into real memory. */
2856
2857#define MEMPTR(x) (State.mem + x)
2858
2859 switch (FUNC)
2860 {
2861#if !defined(__GO32__) && !defined(_WIN32)
2862 case SYS_fork:
2863 RETVAL = fork ();
2864 break;
2865 case SYS_execve:
2866 RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2),
2867 (char **)MEMPTR (PARM3));
2868 break;
2869 case SYS_execv:
2870 RETVAL = execve (MEMPTR (PARM1), (char **) MEMPTR (PARM2), NULL);
2871 break;
2872#endif
2873
2874 case SYS_read:
2875 RETVAL = mn10300_callback->read (mn10300_callback, PARM1,
2876 MEMPTR (PARM2), PARM3);
2877 break;
2878 case SYS_write:
2879 if (PARM1 == 1)
2880 RETVAL = (int)mn10300_callback->write_stdout (mn10300_callback,
2881 MEMPTR (PARM2), PARM3);
2882 else
2883 RETVAL = (int)mn10300_callback->write (mn10300_callback, PARM1,
2884 MEMPTR (PARM2), PARM3);
2885 break;
2886 case SYS_lseek:
2887 RETVAL = mn10300_callback->lseek (mn10300_callback, PARM1, PARM2, PARM3);
2888 break;
2889 case SYS_close:
2890 RETVAL = mn10300_callback->close (mn10300_callback, PARM1);
2891 break;
2892 case SYS_open:
2893 RETVAL = mn10300_callback->open (mn10300_callback, MEMPTR (PARM1), PARM2);
2894 break;
2895 case SYS_exit:
2896 /* EXIT - caller can look in PARM1 to work out the
2897 reason */
2898 if (PARM1 == 0xdead || PARM1 == 0x1)
2899 State.exception = SIGABRT;
2900 else
2901 State.exception = SIGQUIT;
2902 break;
2903
2904 case SYS_stat: /* added at hmsi */
2905 /* stat system call */
2906 {
2907 struct stat host_stat;
2908 reg_t buf;
2909
2910 RETVAL = stat (MEMPTR (PARM1), &host_stat);
2911
2912 buf = PARM2;
2913
2914 /* Just wild-assed guesses. */
2915 store_mem (buf, 2, host_stat.st_dev);
2916 store_mem (buf + 2, 2, host_stat.st_ino);
2917 store_mem (buf + 4, 4, host_stat.st_mode);
2918 store_mem (buf + 8, 2, host_stat.st_nlink);
2919 store_mem (buf + 10, 2, host_stat.st_uid);
2920 store_mem (buf + 12, 2, host_stat.st_gid);
2921 store_mem (buf + 14, 2, host_stat.st_rdev);
2922 store_mem (buf + 16, 4, host_stat.st_size);
2923 store_mem (buf + 20, 4, host_stat.st_atime);
2924 store_mem (buf + 28, 4, host_stat.st_mtime);
2925 store_mem (buf + 36, 4, host_stat.st_ctime);
2926 }
2927 break;
2928
2929 case SYS_chown:
2930 RETVAL = chown (MEMPTR (PARM1), PARM2, PARM3);
2931 break;
2932 case SYS_chmod:
2933 RETVAL = chmod (MEMPTR (PARM1), PARM2);
2934 break;
2935 case SYS_time:
2936 RETVAL = time (MEMPTR (PARM1));
2937 break;
2938 case SYS_times:
2939 {
2940 struct tms tms;
2941 RETVAL = times (&tms);
2942 store_mem (PARM1, 4, tms.tms_utime);
2943 store_mem (PARM1 + 4, 4, tms.tms_stime);
2944 store_mem (PARM1 + 8, 4, tms.tms_cutime);
2945 store_mem (PARM1 + 12, 4, tms.tms_cstime);
2946 break;
2947 }
2948 case SYS_gettimeofday:
2949 {
2950 struct timeval t;
2951 struct timezone tz;
2952 RETVAL = gettimeofday (&t, &tz);
2953 store_mem (PARM1, 4, t.tv_sec);
2954 store_mem (PARM1 + 4, 4, t.tv_usec);
2955 store_mem (PARM2, 4, tz.tz_minuteswest);
2956 store_mem (PARM2 + 4, 4, tz.tz_dsttime);
2957 break;
2958 }
2959 case SYS_utime:
2960 /* Cast the second argument to void *, to avoid type mismatch
2961 if a prototype is present. */
2962 RETVAL = utime (MEMPTR (PARM1), (void *) MEMPTR (PARM2));
2963 break;
2964 default:
2965 abort ();
2966 }
2967 RETERR = errno;
2968 errno = save_errno;
05ccbdfd
JL
2969}
2970
2971/* rtm */
d2523010
JL
2972void OP_F0FF (insn, extension)
2973 unsigned long insn, extension;
05ccbdfd 2974{
f5f13c1d 2975 abort ();
05ccbdfd
JL
2976}
2977
2978/* nop */
d2523010
JL
2979void OP_CB (insn, extension)
2980 unsigned long insn, extension;
05ccbdfd
JL
2981{
2982}
2983
2984/* putx */
d2523010
JL
2985void OP_F500 (insn, extension)
2986 unsigned long insn, extension;
05ccbdfd 2987{
5084d8e5 2988 abort ();
05ccbdfd
JL
2989}
2990
2991/* getx */
d2523010
JL
2992void OP_F6F0 (insn, extension)
2993 unsigned long insn, extension;
05ccbdfd 2994{
5084d8e5 2995 abort ();
05ccbdfd
JL
2996}
2997
2998/* mulq */
d2523010
JL
2999void OP_F600 (insn, extension)
3000 unsigned long insn, extension;
05ccbdfd 3001{
5084d8e5 3002 abort ();
05ccbdfd
JL
3003}
3004
3005/* mulq */
d2523010
JL
3006void OP_F90000 (insn, extension)
3007 unsigned long insn, extension;
05ccbdfd 3008{
5084d8e5 3009 abort ();
05ccbdfd
JL
3010}
3011
3012/* mulq */
d2523010
JL
3013void OP_FB000000 (insn, extension)
3014 unsigned long insn, extension;
05ccbdfd 3015{
5084d8e5 3016 abort ();
05ccbdfd
JL
3017}
3018
3019/* mulq */
d2523010
JL
3020void OP_FD000000 (insn, extension)
3021 unsigned long insn, extension;
05ccbdfd 3022{
5084d8e5 3023 abort ();
05ccbdfd
JL
3024}
3025
3026/* mulqu */
d2523010
JL
3027void OP_F610 (insn, extension)
3028 unsigned long insn, extension;
05ccbdfd 3029{
5084d8e5 3030 abort ();
05ccbdfd
JL
3031}
3032
3033/* mulqu */
d2523010
JL
3034void OP_F91400 (insn, extension)
3035 unsigned long insn, extension;
05ccbdfd 3036{
5084d8e5 3037 abort ();
05ccbdfd
JL
3038}
3039
3040/* mulqu */
d2523010
JL
3041void OP_FB140000 (insn, extension)
3042 unsigned long insn, extension;
05ccbdfd 3043{
5084d8e5 3044 abort ();
05ccbdfd
JL
3045}
3046
3047/* mulqu */
d2523010
JL
3048void OP_FD140000 (insn, extension)
3049 unsigned long insn, extension;
05ccbdfd 3050{
5084d8e5 3051 abort ();
05ccbdfd
JL
3052}
3053
3054/* sat16 */
d2523010
JL
3055void OP_F640 (insn, extension)
3056 unsigned long insn, extension;
05ccbdfd 3057{
5084d8e5 3058 abort ();
05ccbdfd
JL
3059}
3060
3061/* sat24 */
d2523010
JL
3062void OP_F650 (insn, extension)
3063 unsigned long insn, extension;
05ccbdfd 3064{
5084d8e5 3065 abort ();
05ccbdfd
JL
3066}
3067
3068/* bsch */
d2523010
JL
3069void OP_F670 (insn, extension)
3070 unsigned long insn, extension;
05ccbdfd 3071{
5084d8e5 3072 abort ();
05ccbdfd 3073}
093e9a32
JL
3074
3075/* breakpoint */
3076void
3077OP_FF (insn, extension)
3078 unsigned long insn, extension;
3079{
3080 State.exception = SIGTRAP;
3081 PC -= 1;
3082}
3083