ubsan: ns32k: left shift cannot be represented in type 'int'
[deliverable/binutils-gdb.git] / opcodes / s12z-opc.c
CommitLineData
ef1ad42b
JD
1/* s12z-decode.c -- Freescale S12Z disassembly
2 Copyright (C) 2018 Free Software Foundation, Inc.
3
4 This file is part of the GNU opcodes library.
5
6 This library is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3, or (at your option)
9 any later version.
10
11 It is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
14 License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA. */
20
21#include "sysdep.h"
22#include <stdio.h>
23#include <stdint.h>
24#include <stdbool.h>
25#include <assert.h>
26
27#include "opcode/s12z.h"
28
29#include "bfd.h"
30
31#include "s12z-opc.h"
32
33
34typedef int (* insn_bytes_f) (struct mem_read_abstraction_base *);
35
36typedef void (*operands_f) (struct mem_read_abstraction_base *,
37 int *n_operands, struct operand **operand);
38
e5a557ac
JD
39typedef enum optr (*discriminator_f) (struct mem_read_abstraction_base *,
40 enum optr hint);
ef1ad42b
JD
41
42enum OPR_MODE
43 {
44 OPR_IMMe4,
45 OPR_REG,
46 OPR_OFXYS,
47 OPR_XY_PRE_INC,
48 OPR_XY_POST_INC,
49 OPR_XY_PRE_DEC,
50 OPR_XY_POST_DEC,
51 OPR_S_PRE_DEC,
52 OPR_S_POST_INC,
53 OPR_REG_DIRECT,
54 OPR_REG_INDIRECT,
55 OPR_IDX_DIRECT,
56 OPR_IDX_INDIRECT,
57 OPR_EXT1,
58 OPR_IDX2_REG,
59 OPR_IDX3_DIRECT,
60 OPR_IDX3_INDIRECT,
61
62 OPR_EXT18,
63 OPR_IDX3_DIRECT_REG,
64 OPR_EXT3_DIRECT,
65 OPR_EXT3_INDIRECT
66 };
67
68struct opr_pb
69{
70 uint8_t mask;
71 uint8_t value;
72 int n_operands;
73 enum OPR_MODE mode;
74};
75
76static const struct opr_pb opr_pb[] = {
77 {0xF0, 0x70, 1, OPR_IMMe4},
78 {0xF8, 0xB8, 1, OPR_REG},
79 {0xC0, 0x40, 1, OPR_OFXYS},
80 {0xEF, 0xE3, 1, OPR_XY_PRE_INC},
81 {0xEF, 0xE7, 1, OPR_XY_POST_INC},
82 {0xEF, 0xC3, 1, OPR_XY_PRE_DEC},
83 {0xEF, 0xC7, 1, OPR_XY_POST_DEC},
84 {0xFF, 0xFB, 1, OPR_S_PRE_DEC},
85 {0xFF, 0xFF, 1, OPR_S_POST_INC},
86 {0xC8, 0x88, 1, OPR_REG_DIRECT},
87 {0xE8, 0xC8, 1, OPR_REG_INDIRECT},
88
89 {0xCE, 0xC0, 2, OPR_IDX_DIRECT},
90 {0xCE, 0xC4, 2, OPR_IDX_INDIRECT},
91 {0xC0, 0x00, 2, OPR_EXT1},
92
93 {0xC8, 0x80, 3, OPR_IDX2_REG},
94 {0xFA, 0xF8, 3, OPR_EXT18},
95
96 {0xCF, 0xC2, 4, OPR_IDX3_DIRECT},
97 {0xCF, 0xC6, 4, OPR_IDX3_INDIRECT},
98
99 {0xF8, 0xE8, 4, OPR_IDX3_DIRECT_REG},
100 {0xFF, 0xFA, 4, OPR_EXT3_DIRECT},
101 {0xFF, 0xFE, 4, OPR_EXT3_INDIRECT},
102};
103
104/* Return the number of bytes in a OPR operand, including the XB postbyte.
105 It does not include any preceeding opcodes. */
106static int
107x_opr_n_bytes (struct mem_read_abstraction_base *mra, int offset)
108{
109 bfd_byte xb;
110 int status = mra->read (mra, offset, 1, &xb);
111 if (status < 0)
112 return status;
113
114 size_t i;
115 for (i = 0; i < sizeof (opr_pb) / sizeof (opr_pb[0]); ++i)
116 {
117 const struct opr_pb *pb = opr_pb + i;
118 if ((xb & pb->mask) == pb->value)
119 {
120 return pb->n_operands;
121 }
122 }
123
124 return 1;
125}
126
127static int
128opr_n_bytes_p1 (struct mem_read_abstraction_base *mra)
129{
130 return 1 + x_opr_n_bytes (mra, 0);
131}
132
133static int
134opr_n_bytes2 (struct mem_read_abstraction_base *mra)
135{
136 int s = x_opr_n_bytes (mra, 0);
137 s += x_opr_n_bytes (mra, s);
138 return s + 1;
139}
140
141enum BB_MODE
142 {
143 BB_REG_REG_REG,
144 BB_REG_REG_IMM,
145 BB_REG_OPR_REG,
146 BB_OPR_REG_REG,
147 BB_REG_OPR_IMM,
148 BB_OPR_REG_IMM
149 };
150
151struct opr_bb
152{
153 uint8_t mask;
154 uint8_t value;
155 int n_operands;
156 bool opr;
157 enum BB_MODE mode;
158};
159
160static const struct opr_bb bb_modes[] =
161 {
162 {0x60, 0x00, 2, false, BB_REG_REG_REG},
163 {0x60, 0x20, 3, false, BB_REG_REG_IMM},
164 {0x70, 0x40, 2, true, BB_REG_OPR_REG},
165 {0x70, 0x50, 2, true, BB_OPR_REG_REG},
166 {0x70, 0x60, 3, true, BB_REG_OPR_IMM},
167 {0x70, 0x70, 3, true, BB_OPR_REG_IMM}
168 };
169
170static int
171bfextins_n_bytes (struct mem_read_abstraction_base *mra)
172{
173 bfd_byte bb;
174 int status = mra->read (mra, 0, 1, &bb);
175 if (status < 0)
176 return status;
177
178 size_t i;
179 const struct opr_bb *bbs = 0;
180 for (i = 0; i < sizeof (bb_modes) / sizeof (bb_modes[0]); ++i)
181 {
182 bbs = bb_modes + i;
183 if ((bb & bbs->mask) == bbs->value)
184 {
185 break;
186 }
187 }
188
189 int n = bbs->n_operands;
190 if (bbs->opr)
191 n += x_opr_n_bytes (mra, n - 1);
192
193 return n;
194}
195
196static int
197single (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED)
198{
199 return 1;
200}
201
202static int
203two (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED)
204{
205 return 2;
206}
207
208static int
209three (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED)
210{
211 return 3;
212}
213
214static int
215four (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED)
216{
217 return 4;
218}
219
220static int
221five (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED)
222{
223 return 5;
224}
225
226static int
227pcrel_15bit (struct mem_read_abstraction_base *mra)
228{
229 bfd_byte byte;
230 int status = mra->read (mra, 0, 1, &byte);
231 if (status < 0)
232 return status;
233 return (byte & 0x80) ? 3 : 2;
234}
235
236
237\f
238static int
239xysp_reg_from_postbyte (uint8_t postbyte)
240{
241 int reg = -1;
242 switch ((postbyte & 0x30) >> 4)
243 {
244 case 0:
245 reg = REG_X;
246 break;
247 case 1:
248 reg = REG_Y;
249 break;
250 case 2:
251 reg = REG_S;
252 break;
253 default:
254 reg = REG_P;
255 }
256 return reg;
257}
258
e7c22a69
AM
259static struct operand *
260create_immediate_operand (int value)
ef1ad42b
JD
261{
262 struct immediate_operand *op = malloc (sizeof (*op));
263
264 ((struct operand *)op)->cl = OPND_CL_IMMEDIATE;
265 op->value = value;
266 ((struct operand *)op)->osize = -1;
267
268 return (struct operand *) op;
269}
270
e7c22a69
AM
271static struct operand *
272create_bitfield_operand (int width, int offset)
ef1ad42b
JD
273{
274 struct bitfield_operand *op = malloc (sizeof (*op));
275
276 ((struct operand *)op)->cl = OPND_CL_BIT_FIELD;
277 op->width = width;
278 op->offset = offset;
279 ((struct operand *)op)->osize = -1;
280
281 return (struct operand *) op;
282}
283
284static struct operand *
285create_register_operand_with_size (int reg, short osize)
286{
287 struct register_operand *op = malloc (sizeof (*op));
288
289 ((struct operand *)op)->cl = OPND_CL_REGISTER;
290 op->reg = reg;
291 ((struct operand *)op)->osize = osize;
292
293 return (struct operand *) op;
294}
295
296static struct operand *
297create_register_operand (int reg)
298{
299 return create_register_operand_with_size (reg, -1);
300}
301
e7c22a69
AM
302static struct operand *
303create_register_all_operand (void)
ef1ad42b
JD
304{
305 struct register_operand *op = malloc (sizeof (*op));
306
307 ((struct operand *)op)->cl = OPND_CL_REGISTER_ALL;
308 ((struct operand *)op)->osize = -1;
309
310 return (struct operand *) op;
311}
312
e7c22a69
AM
313static struct operand *
314create_register_all16_operand (void)
ef1ad42b
JD
315{
316 struct register_operand *op = malloc (sizeof (*op));
317
318 ((struct operand *)op)->cl = OPND_CL_REGISTER_ALL16;
319 ((struct operand *)op)->osize = -1;
320
321 return (struct operand *) op;
322}
323
324
325static struct operand *
326create_simple_memory_operand (bfd_vma addr, bfd_vma base, bool relative)
327{
328 struct simple_memory_operand *op = malloc (sizeof (*op));
329
330 ((struct operand *)op)->cl = OPND_CL_SIMPLE_MEMORY;
331 op->addr = addr;
332 op->base = base;
333 op->relative = relative;
334 ((struct operand *)op)->osize = -1;
335
336 assert (relative || base == 0);
337
338 return (struct operand *) op;
339}
340
341static struct operand *
342create_memory_operand (bool indirect, int base, int n_regs, int reg0, int reg1)
343{
344 struct memory_operand *op = malloc (sizeof (*op));
345
346 ((struct operand *)op)->cl = OPND_CL_MEMORY;
347 op->indirect = indirect;
348 op->base_offset = base;
349 op->mutation = OPND_RM_NONE;
350 op->n_regs = n_regs;
351 op->regs[0] = reg0;
352 op->regs[1] = reg1;
353 ((struct operand *)op)->osize = -1;
354
355 return (struct operand *) op;
356}
357
358static struct operand *
359create_memory_auto_operand (enum op_reg_mutation mutation, int reg)
360{
361 struct memory_operand *op = malloc (sizeof (*op));
362
363 ((struct operand *)op)->cl = OPND_CL_MEMORY;
364 op->indirect = false;
365 op->base_offset = 0;
366 op->mutation = mutation;
367 op->n_regs = 1;
368 op->regs[0] = reg;
369 op->regs[1] = -1;
370 ((struct operand *)op)->osize = -1;
371
372 return (struct operand *) op;
373}
374
375\f
376
377static void
e7c22a69
AM
378z_ext24_decode (struct mem_read_abstraction_base *mra, int *n_operands,
379 struct operand **operand)
ef1ad42b
JD
380{
381 uint8_t buffer[3];
382 int status = mra->read (mra, 0, 3, buffer);
383 if (status < 0)
384 return;
385
386 int i;
387 uint32_t addr = 0;
388 for (i = 0; i < 3; ++i)
389 {
390 addr <<= 8;
391 addr |= buffer[i];
392 }
393
394 operand[(*n_operands)++] = create_simple_memory_operand (addr, 0, false);
395}
396
397
398static uint32_t
e7c22a69
AM
399z_decode_signed_value (struct mem_read_abstraction_base *mra, int offset,
400 short size)
ef1ad42b
JD
401{
402 assert (size >0);
403 assert (size <= 4);
404 bfd_byte buffer[4];
405 if (0 > mra->read (mra, offset, size, buffer))
406 {
407 return 0;
408 }
409
410 int i;
411 uint32_t value = 0;
412 for (i = 0; i < size; ++i)
413 {
414 value |= buffer[i] << (8 * (size - i - 1));
415 }
416
417 if (buffer[0] & 0x80)
418 {
419 /* Deal with negative values */
420 value -= 0x1UL << (size * 8);
421 }
422 return value;
423}
424
425static uint32_t
426decode_signed_value (struct mem_read_abstraction_base *mra, short size)
427{
428 return z_decode_signed_value (mra, 0, size);
429}
430
431static void
432x_imm1 (struct mem_read_abstraction_base *mra,
433 int offset,
434 int *n_operands, struct operand **operand)
435{
436 bfd_byte byte;
437 int status = mra->read (mra, offset, 1, &byte);
438 if (status < 0)
439 return;
440
441 operand[(*n_operands)++] = create_immediate_operand (byte);
442}
443
444/* An eight bit immediate operand. */
445static void
446imm1_decode (struct mem_read_abstraction_base *mra,
e7c22a69 447 int *n_operands, struct operand **operand)
ef1ad42b
JD
448{
449 x_imm1 (mra, 0, n_operands, operand);
450}
451
452static void
453trap_decode (struct mem_read_abstraction_base *mra,
454 int *n_operands, struct operand **operand)
455{
456 x_imm1 (mra, -1, n_operands, operand);
457}
458
459
460static struct operand *
461x_opr_decode_with_size (struct mem_read_abstraction_base *mra, int offset,
462 short osize)
463{
464 bfd_byte postbyte;
465 int status = mra->read (mra, offset, 1, &postbyte);
466 if (status < 0)
467 return NULL;
468 offset++;
469
470 enum OPR_MODE mode = -1;
471 size_t i;
472 for (i = 0; i < sizeof (opr_pb) / sizeof (opr_pb[0]); ++i)
473 {
474 const struct opr_pb *pb = opr_pb + i;
475 if ((postbyte & pb->mask) == pb->value)
476 {
477 mode = pb->mode;
478 break;
479 }
480 }
481
482 struct operand *operand = NULL;
483 switch (mode)
484 {
485 case OPR_IMMe4:
486 {
487 int n;
488 uint8_t x = (postbyte & 0x0F);
489 if (x == 0)
490 n = -1;
491 else
492 n = x;
493
e7c22a69 494 operand = create_immediate_operand (n);
ef1ad42b
JD
495 break;
496 }
497 case OPR_REG:
498 {
499 uint8_t x = (postbyte & 0x07);
e7c22a69 500 operand = create_register_operand (x);
ef1ad42b
JD
501 break;
502 }
503 case OPR_OFXYS:
504 {
e7c22a69 505 operand = create_memory_operand (false, postbyte & 0x0F, 1,
ef1ad42b
JD
506 xysp_reg_from_postbyte (postbyte), -1);
507 break;
508 }
509 case OPR_REG_DIRECT:
510 {
e7c22a69 511 operand = create_memory_operand (false, 0, 2, postbyte & 0x07,
ef1ad42b
JD
512 xysp_reg_from_postbyte (postbyte));
513 break;
514 }
515 case OPR_REG_INDIRECT:
516 {
e7c22a69 517 operand = create_memory_operand (true, 0, 2, postbyte & 0x07,
ef1ad42b
JD
518 (postbyte & 0x10) ? REG_Y : REG_X);
519 break;
520 }
521
522 case OPR_IDX_INDIRECT:
523 {
524 uint8_t x1;
525 mra->read (mra, offset, 1, &x1);
526 int idx = x1;
527
528 if (postbyte & 0x01)
529 {
530 /* Deal with negative values */
531 idx -= 0x1UL << 8;
532 }
533
e7c22a69 534 operand = create_memory_operand (true, idx, 1,
ef1ad42b
JD
535 xysp_reg_from_postbyte (postbyte), -1);
536 break;
537 }
538
539 case OPR_IDX3_DIRECT:
540 {
541 uint8_t x[3];
542 mra->read (mra, offset, 3, x);
543 int idx = x[0] << 16 | x[1] << 8 | x[2];
544
545 if (x[0] & 0x80)
546 {
547 /* Deal with negative values */
548 idx -= 0x1UL << 24;
549 }
550
e7c22a69 551 operand = create_memory_operand (false, idx, 1,
ef1ad42b
JD
552 xysp_reg_from_postbyte (postbyte), -1);
553 break;
554 }
555
556 case OPR_IDX3_DIRECT_REG:
557 {
558 uint8_t x[3];
559 mra->read (mra, offset, 3, x);
560 int idx = x[0] << 16 | x[1] << 8 | x[2];
561
562 if (x[0] & 0x80)
563 {
564 /* Deal with negative values */
565 idx -= 0x1UL << 24;
566 }
567
e7c22a69 568 operand = create_memory_operand (false, idx, 1, postbyte & 0x07, -1);
ef1ad42b
JD
569 break;
570 }
571
572 case OPR_IDX3_INDIRECT:
573 {
574 uint8_t x[3];
575 mra->read (mra, offset, 3, x);
576 int idx = x[0] << 16 | x[1] << 8 | x[2];
577
578 if (x[0] & 0x80)
579 {
580 /* Deal with negative values */
581 idx -= 0x1UL << 24;
582 }
583
584 operand = create_memory_operand (true, idx, 1,
585 xysp_reg_from_postbyte (postbyte), -1);
586 break;
587 }
588
589 case OPR_IDX_DIRECT:
590 {
591 uint8_t x1;
592 mra->read (mra, offset, 1, &x1);
593 int idx = x1;
594
595 if (postbyte & 0x01)
596 {
597 /* Deal with negative values */
598 idx -= 0x1UL << 8;
599 }
600
e7c22a69 601 operand = create_memory_operand (false, idx, 1,
ef1ad42b
JD
602 xysp_reg_from_postbyte (postbyte), -1);
603 break;
604 }
605
606 case OPR_IDX2_REG:
607 {
608 uint8_t x[2];
609 mra->read (mra, offset, 2, x);
610 uint32_t idx = x[1] | x[0] << 8 ;
611 idx |= (postbyte & 0x30) << 12;
612
e7c22a69 613 operand = create_memory_operand (false, idx, 1, postbyte & 0x07, -1);
ef1ad42b
JD
614 break;
615 }
616
617 case OPR_XY_PRE_INC:
618 {
619 operand = create_memory_auto_operand (OPND_RM_PRE_INC,
620 (postbyte & 0x10) ? REG_Y: REG_X);
621 break;
622 }
623 case OPR_XY_POST_INC:
624 {
625 operand = create_memory_auto_operand (OPND_RM_POST_INC,
626 (postbyte & 0x10) ? REG_Y: REG_X);
627 break;
628 }
629 case OPR_XY_PRE_DEC:
630 {
631 operand = create_memory_auto_operand (OPND_RM_PRE_DEC,
632 (postbyte & 0x10) ? REG_Y: REG_X);
633 break;
634 }
635 case OPR_XY_POST_DEC:
636 {
637 operand = create_memory_auto_operand (OPND_RM_POST_DEC,
638 (postbyte & 0x10) ? REG_Y: REG_X);
639 break;
640 }
641 case OPR_S_PRE_DEC:
642 {
643 operand = create_memory_auto_operand (OPND_RM_PRE_DEC, REG_S);
644 break;
645 }
646 case OPR_S_POST_INC:
647 {
648 operand = create_memory_auto_operand (OPND_RM_POST_INC, REG_S);
649 break;
650 }
651
652 case OPR_EXT18:
653 {
654 const size_t size = 2;
655 bfd_byte buffer[4];
656 status = mra->read (mra, offset, size, buffer);
657 if (status < 0)
658 operand = NULL;
659
660 uint32_t ext18 = 0;
661 for (i = 0; i < size; ++i)
662 {
663 ext18 <<= 8;
664 ext18 |= buffer[i];
665 }
666
667 ext18 |= (postbyte & 0x01) << 16;
668 ext18 |= (postbyte & 0x04) << 15;
669
670 operand = create_simple_memory_operand (ext18, 0, false);
671 break;
672 }
673
674 case OPR_EXT1:
675 {
676 uint8_t x1 = 0;
677 mra->read (mra, offset, 1, &x1);
678 int16_t addr;
679 addr = x1;
680 addr |= (postbyte & 0x3f) << 8;
681
682 operand = create_simple_memory_operand (addr, 0, false);
683 break;
684 }
685
686 case OPR_EXT3_DIRECT:
687 {
688 const size_t size = 3;
689 bfd_byte buffer[4];
690 status = mra->read (mra, offset, size, buffer);
691 if (status < 0)
692 operand = NULL;
693
694 uint32_t ext24 = 0;
695 for (i = 0; i < size; ++i)
696 {
697 ext24 |= buffer[i] << (8 * (size - i - 1));
698 }
699
700 operand = create_simple_memory_operand (ext24, 0, false);
701 break;
702 }
703
704 case OPR_EXT3_INDIRECT:
705 {
706 const size_t size = 3;
707 bfd_byte buffer[4];
708 status = mra->read (mra, offset, size, buffer);
709 if (status < 0)
710 operand = NULL;
711
712 uint32_t ext24 = 0;
713 for (i = 0; i < size; ++i)
714 {
715 ext24 |= buffer[i] << (8 * (size - i - 1));
716 }
717
e7c22a69 718 operand = create_memory_operand (true, ext24, 0, -1, -1);
ef1ad42b
JD
719 break;
720 }
721
722 default:
723 printf ("Unknown OPR mode #0x%x (%d)", postbyte, mode);
724 abort ();
725 }
726
727 operand->osize = osize;
728
729 return operand;
730}
731
732static struct operand *
733x_opr_decode (struct mem_read_abstraction_base *mra, int offset)
734{
735 return x_opr_decode_with_size (mra, offset, -1);
736}
737
738static void
739z_opr_decode (struct mem_read_abstraction_base *mra,
740 int *n_operands, struct operand **operand)
741{
742 operand[(*n_operands)++] = x_opr_decode (mra, 0);
743}
744
745static void
746z_opr_decode2 (struct mem_read_abstraction_base *mra,
747 int *n_operands, struct operand **operand)
748{
749 int n = x_opr_n_bytes (mra, 0);
750
751 operand[(*n_operands)++] = x_opr_decode (mra, 0);
752 operand[(*n_operands)++] = x_opr_decode (mra, n);
753}
754
755static void
756imm1234 (struct mem_read_abstraction_base *mra, int base,
757 int *n_operands, struct operand **operand)
758{
759 bfd_byte opcode;
760 int status = mra->read (mra, -1, 1, &opcode);
761 if (status < 0)
762 return;
763
764 opcode -= base;
765
766 int size = registers[opcode & 0xF].bytes;
767
768 uint32_t imm = decode_signed_value (mra, size);
769
770 operand[(*n_operands)++] = create_immediate_operand (imm);
771}
772
773
774/* Special case of LD and CMP with register S and IMM operand */
775static void
776reg_s_imm (struct mem_read_abstraction_base *mra, int *n_operands,
777 struct operand **operand)
778{
779 operand[(*n_operands)++] = create_register_operand (REG_S);
780
781 uint32_t imm = decode_signed_value (mra, 3);
782 operand[(*n_operands)++] = create_immediate_operand (imm);
783}
784
785/* Special case of LD, CMP and ST with register S and OPR operand */
786static void
787reg_s_opr (struct mem_read_abstraction_base *mra, int *n_operands,
788 struct operand **operand)
789{
790 operand[(*n_operands)++] = create_register_operand (REG_S);
791 operand[(*n_operands)++] = x_opr_decode (mra, 0);
792}
793
794static void
795z_imm1234_8base (struct mem_read_abstraction_base *mra, int *n_operands,
796 struct operand **operand)
797{
798 imm1234 (mra, 8, n_operands, operand);
799}
800
801static void
802z_imm1234_0base (struct mem_read_abstraction_base *mra, int *n_operands,
803 struct operand **operand)
804{
805 imm1234 (mra, 0, n_operands, operand);
806}
807
808
809static void
810z_tfr (struct mem_read_abstraction_base *mra, int *n_operands,
811 struct operand **operand)
812{
813 bfd_byte byte;
814 int status = mra->read (mra, 0, 1, &byte);
815 if (status < 0)
816 return;
817
818 operand[(*n_operands)++] = create_register_operand (byte >> 4);
819 operand[(*n_operands)++] = create_register_operand (byte & 0x0F);
820}
821
822static void
823z_reg (struct mem_read_abstraction_base *mra, int *n_operands,
824 struct operand **operand)
825{
826 bfd_byte byte;
827 int status = mra->read (mra, -1, 1, &byte);
828 if (status < 0)
829 return;
830
831 operand[(*n_operands)++] = create_register_operand (byte & 0x07);
832}
833
834
835static void
836reg_xy (struct mem_read_abstraction_base *mra,
837 int *n_operands, struct operand **operand)
838{
839 bfd_byte byte;
840 int status = mra->read (mra, -1, 1, &byte);
841 if (status < 0)
842 return;
843
844 operand[(*n_operands)++] =
845 create_register_operand ((byte & 0x01) ? REG_Y : REG_X);
846}
847
848static void
849lea_reg_xys_opr (struct mem_read_abstraction_base *mra,
850 int *n_operands, struct operand **operand)
851{
852 bfd_byte byte;
853 int status = mra->read (mra, -1, 1, &byte);
854 if (status < 0)
855 return;
856
857 int reg_xys = -1;
858 switch (byte & 0x03)
859 {
860 case 0x00:
861 reg_xys = REG_X;
862 break;
863 case 0x01:
864 reg_xys = REG_Y;
865 break;
866 case 0x02:
867 reg_xys = REG_S;
868 break;
869 }
870
871 operand[(*n_operands)++] = create_register_operand (reg_xys);
872 operand[(*n_operands)++] = x_opr_decode (mra, 0);
873}
874
875static void
876lea_reg_xys (struct mem_read_abstraction_base *mra,
877 int *n_operands, struct operand **operand)
878{
879 bfd_byte byte;
880 int status = mra->read (mra, -1, 1, &byte);
881 if (status < 0)
882 return;
883
884 int reg_n = -1;
885 switch (byte & 0x03)
886 {
887 case 0x00:
888 reg_n = REG_X;
889 break;
890 case 0x01:
891 reg_n = REG_Y;
892 break;
893 case 0x02:
894 reg_n = REG_S;
895 break;
896 }
897
898 status = mra->read (mra, 0, 1, &byte);
899 if (status < 0)
900 return;
901
902 operand[(*n_operands)++] = create_register_operand (reg_n);
903 operand[(*n_operands)++] = create_memory_operand (false, (int8_t) byte,
904 1, reg_n, -1);
905}
906
907
908/* PC Relative offsets of size 15 or 7 bits */
909static void
910rel_15_7 (struct mem_read_abstraction_base *mra, int offset,
911 int *n_operands, struct operand **operands)
912{
913 bfd_byte upper;
914 int status = mra->read (mra, offset - 1, 1, &upper);
915 if (status < 0)
916 return;
917
918 bool rel_size = (upper & 0x80);
919
920 int16_t addr = upper;
921 if (rel_size)
922 {
923 /* 15 bits. Get the next byte */
924 bfd_byte lower;
925 status = mra->read (mra, offset, 1, &lower);
926 if (status < 0)
927 return;
928
929 addr <<= 8;
930 addr |= lower;
931 addr &= 0x7FFF;
932
933 bool negative = (addr & 0x4000);
934 addr &= 0x3FFF;
935 if (negative)
936 addr = addr - 0x4000;
937 }
938 else
939 {
940 /* 7 bits. */
941 bool negative = (addr & 0x40);
942 addr &= 0x3F;
943 if (negative)
944 addr = addr - 0x40;
945 }
946
947 operands[(*n_operands)++] =
948 create_simple_memory_operand (addr, mra->posn (mra) - 1, true);
949}
950
951
952/* PC Relative offsets of size 15 or 7 bits */
953static void
954decode_rel_15_7 (struct mem_read_abstraction_base *mra,
955 int *n_operands, struct operand **operand)
956{
957 rel_15_7 (mra, 1, n_operands, operand);
958}
959
960static int shift_n_bytes (struct mem_read_abstraction_base *);
961static int mov_imm_opr_n_bytes (struct mem_read_abstraction_base *);
962static int loop_prim_n_bytes (struct mem_read_abstraction_base *);
963static int bm_rel_n_bytes (struct mem_read_abstraction_base *);
964static int mul_n_bytes (struct mem_read_abstraction_base *);
965static int bm_n_bytes (struct mem_read_abstraction_base *);
966
967static void psh_pul_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand);
968static void shift_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand);
969static void mul_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand);
970static void bm_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand);
971static void bm_rel_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand);
972static void mov_imm_opr (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operand);
973static void loop_primitive_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operands);
974static void bit_field_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operands);
975static void exg_sex_decode (struct mem_read_abstraction_base *mra, int *n_operands, struct operand **operands);
976
977
e5a557ac
JD
978static enum optr shift_discrim (struct mem_read_abstraction_base *mra, enum optr hint);
979static enum optr psh_pul_discrim (struct mem_read_abstraction_base *mra, enum optr hint);
980static enum optr mul_discrim (struct mem_read_abstraction_base *mra, enum optr hint);
981static enum optr loop_primitive_discrim (struct mem_read_abstraction_base *mra, enum optr hint);
982static enum optr bit_field_discrim (struct mem_read_abstraction_base *mra, enum optr hint);
983static enum optr exg_sex_discrim (struct mem_read_abstraction_base *mra, enum optr hint);
ef1ad42b
JD
984
985
986static void
987cmp_xy (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED,
988 int *n_operands, struct operand **operand)
989{
990 operand[(*n_operands)++] = create_register_operand (REG_X);
991 operand[(*n_operands)++] = create_register_operand (REG_Y);
992}
993
994static void
995sub_d6_x_y (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED,
996 int *n_operands, struct operand **operand)
997{
998 operand[(*n_operands)++] = create_register_operand (REG_D6);
999 operand[(*n_operands)++] = create_register_operand (REG_X);
1000 operand[(*n_operands)++] = create_register_operand (REG_Y);
1001}
1002
1003static void
1004sub_d6_y_x (struct mem_read_abstraction_base *mra ATTRIBUTE_UNUSED,
1005 int *n_operands, struct operand **operand)
1006{
1007 operand[(*n_operands)++] = create_register_operand (REG_D6);
1008 operand[(*n_operands)++] = create_register_operand (REG_Y);
1009 operand[(*n_operands)++] = create_register_operand (REG_X);
1010}
1011
e7c22a69
AM
1012static void
1013ld_18bit_decode (struct mem_read_abstraction_base *mra, int *n_operands,
1014 struct operand **operand);
ef1ad42b 1015
e5a557ac
JD
1016static enum optr
1017mul_discrim (struct mem_read_abstraction_base *mra, enum optr hint)
ef1ad42b
JD
1018{
1019 uint8_t mb;
1020 int status = mra->read (mra, 0, 1, &mb);
1021 if (status < 0)
1022 return OP_INVALID;
1023
1024 bool signed_op = (mb & 0x80);
1025
1026 switch (hint)
1027 {
1028 case OPBASE_mul:
1029 return signed_op ? OP_muls : OP_mulu;
1030 break;
1031 case OPBASE_div:
1032 return signed_op ? OP_divs : OP_divu;
1033 break;
1034 case OPBASE_mod:
1035 return signed_op ? OP_mods : OP_modu;
1036 break;
1037 case OPBASE_mac:
1038 return signed_op ? OP_macs : OP_macu;
1039 break;
1040 case OPBASE_qmul:
1041 return signed_op ? OP_qmuls : OP_qmulu;
1042 break;
1043 default:
1044 abort ();
1045 }
1046
1047 return OP_INVALID;
1048}
1049
1050struct opcode
1051{
1052 /* The operation that this opcode performs. */
e5a557ac 1053 enum optr operator;
ef1ad42b
JD
1054
1055 /* The size of this operation. May be -1 if it is implied
1056 in the operands or if size is not applicable. */
1057 short osize;
1058
1059 /* Some operations need this function to work out which operation
1060 is intended. */
1061 discriminator_f discriminator;
1062
1063 /* A function returning the number of bytes in this instruction. */
1064 insn_bytes_f insn_bytes;
1065
1066 operands_f operands;
1067 operands_f operands2;
1068};
1069
1070static const struct opcode page2[] =
1071 {
1072 [0x00] = {OP_ld, -1, 0, opr_n_bytes_p1, reg_s_opr, 0},
1073 [0x01] = {OP_st, -1, 0, opr_n_bytes_p1, reg_s_opr, 0},
1074 [0x02] = {OP_cmp, -1, 0, opr_n_bytes_p1, reg_s_opr, 0},
1075 [0x03] = {OP_ld, -1, 0, four, reg_s_imm, 0},
1076 [0x04] = {OP_cmp, -1, 0, four, reg_s_imm, 0},
1077 [0x05] = {OP_stop, -1, 0, single, 0, 0},
1078 [0x06] = {OP_wai, -1, 0, single, 0, 0},
1079 [0x07] = {OP_sys, -1, 0, single, 0, 0},
1080 [0x08] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0}, /* BFEXT / BFINS */
1081 [0x09] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0},
1082 [0x0a] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0},
1083 [0x0b] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0},
1084 [0x0c] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0},
1085 [0x0d] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0},
1086 [0x0e] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0},
1087 [0x0f] = {0xFFFF, -1, bit_field_discrim, bfextins_n_bytes, bit_field_decode, 0},
1088 [0x10] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1089 [0x11] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1090 [0x12] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1091 [0x13] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1092 [0x14] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1093 [0x15] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1094 [0x16] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1095 [0x17] = {OP_minu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1096 [0x18] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1097 [0x19] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1098 [0x1a] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1099 [0x1b] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1100 [0x1c] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1101 [0x1d] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1102 [0x1e] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1103 [0x1f] = {OP_maxu, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1104 [0x20] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1105 [0x21] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1106 [0x22] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1107 [0x23] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1108 [0x24] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1109 [0x25] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1110 [0x26] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1111 [0x27] = {OP_mins, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1112 [0x28] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1113 [0x29] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1114 [0x2a] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1115 [0x2b] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1116 [0x2c] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1117 [0x2d] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1118 [0x2e] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1119 [0x2f] = {OP_maxs, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1120 [0x30] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1121 [0x31] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1122 [0x32] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1123 [0x33] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1124 [0x34] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1125 [0x35] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1126 [0x36] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1127 [0x37] = {OPBASE_div, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1128 [0x38] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1129 [0x39] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1130 [0x3a] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1131 [0x3b] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1132 [0x3c] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1133 [0x3d] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1134 [0x3e] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1135 [0x3f] = {OPBASE_mod, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1136 [0x40] = {OP_abs, -1, 0, single, z_reg, 0},
1137 [0x41] = {OP_abs, -1, 0, single, z_reg, 0},
1138 [0x42] = {OP_abs, -1, 0, single, z_reg, 0},
1139 [0x43] = {OP_abs, -1, 0, single, z_reg, 0},
1140 [0x44] = {OP_abs, -1, 0, single, z_reg, 0},
1141 [0x45] = {OP_abs, -1, 0, single, z_reg, 0},
1142 [0x46] = {OP_abs, -1, 0, single, z_reg, 0},
1143 [0x47] = {OP_abs, -1, 0, single, z_reg, 0},
1144 [0x48] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1145 [0x49] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1146 [0x4a] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1147 [0x4b] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1148 [0x4c] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1149 [0x4d] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1150 [0x4e] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1151 [0x4f] = {OPBASE_mac, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1152 [0x50] = {OP_adc, -1, 0, three, z_reg, z_imm1234_0base},
1153 [0x51] = {OP_adc, -1, 0, three, z_reg, z_imm1234_0base},
1154 [0x52] = {OP_adc, -1, 0, three, z_reg, z_imm1234_0base},
1155 [0x53] = {OP_adc, -1, 0, three, z_reg, z_imm1234_0base},
1156 [0x54] = {OP_adc, -1, 0, two, z_reg, z_imm1234_0base},
1157 [0x55] = {OP_adc, -1, 0, two, z_reg, z_imm1234_0base},
1158 [0x56] = {OP_adc, -1, 0, five, z_reg, z_imm1234_0base},
1159 [0x57] = {OP_adc, -1, 0, five, z_reg, z_imm1234_0base},
1160 [0x58] = {OP_bit, -1, 0, three, z_reg, z_imm1234_8base},
1161 [0x59] = {OP_bit, -1, 0, three, z_reg, z_imm1234_8base},
1162 [0x5a] = {OP_bit, -1, 0, three, z_reg, z_imm1234_8base},
1163 [0x5b] = {OP_bit, -1, 0, three, z_reg, z_imm1234_8base},
1164 [0x5c] = {OP_bit, -1, 0, two, z_reg, z_imm1234_8base},
1165 [0x5d] = {OP_bit, -1, 0, two, z_reg, z_imm1234_8base},
1166 [0x5e] = {OP_bit, -1, 0, five, z_reg, z_imm1234_8base},
1167 [0x5f] = {OP_bit, -1, 0, five, z_reg, z_imm1234_8base},
1168 [0x60] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1169 [0x61] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1170 [0x62] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1171 [0x63] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1172 [0x64] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1173 [0x65] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1174 [0x66] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1175 [0x67] = {OP_adc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1176 [0x68] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1177 [0x69] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1178 [0x6a] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1179 [0x6b] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1180 [0x6c] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1181 [0x6d] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1182 [0x6e] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1183 [0x6f] = {OP_bit, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1184 [0x70] = {OP_sbc, -1, 0, three, z_reg, z_imm1234_0base},
1185 [0x71] = {OP_sbc, -1, 0, three, z_reg, z_imm1234_0base},
1186 [0x72] = {OP_sbc, -1, 0, three, z_reg, z_imm1234_0base},
1187 [0x73] = {OP_sbc, -1, 0, three, z_reg, z_imm1234_0base},
1188 [0x74] = {OP_sbc, -1, 0, two, z_reg, z_imm1234_0base},
1189 [0x75] = {OP_sbc, -1, 0, two, z_reg, z_imm1234_0base},
1190 [0x76] = {OP_sbc, -1, 0, five, z_reg, z_imm1234_0base},
1191 [0x77] = {OP_sbc, -1, 0, five, z_reg, z_imm1234_0base},
1192 [0x78] = {OP_eor, -1, 0, three, z_reg, z_imm1234_8base},
1193 [0x79] = {OP_eor, -1, 0, three, z_reg, z_imm1234_8base},
1194 [0x7a] = {OP_eor, -1, 0, three, z_reg, z_imm1234_8base},
1195 [0x7b] = {OP_eor, -1, 0, three, z_reg, z_imm1234_8base},
1196 [0x7c] = {OP_eor, -1, 0, two, z_reg, z_imm1234_8base},
1197 [0x7d] = {OP_eor, -1, 0, two, z_reg, z_imm1234_8base},
1198 [0x7e] = {OP_eor, -1, 0, five, z_reg, z_imm1234_8base},
1199 [0x7f] = {OP_eor, -1, 0, five, z_reg, z_imm1234_8base},
1200 [0x80] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1201 [0x81] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1202 [0x82] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1203 [0x83] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1204 [0x84] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1205 [0x85] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1206 [0x86] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1207 [0x87] = {OP_sbc, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1208 [0x88] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1209 [0x89] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1210 [0x8a] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1211 [0x8b] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1212 [0x8c] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1213 [0x8d] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1214 [0x8e] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1215 [0x8f] = {OP_eor, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1216 [0x90] = {OP_rti, -1, 0, single, 0, 0},
1217 [0x91] = {OP_clb, -1, 0, two, z_tfr, 0},
1218 [0x92] = {OP_trap, -1, 0, single, trap_decode, 0},
1219 [0x93] = {OP_trap, -1, 0, single, trap_decode, 0},
1220 [0x94] = {OP_trap, -1, 0, single, trap_decode, 0},
1221 [0x95] = {OP_trap, -1, 0, single, trap_decode, 0},
1222 [0x96] = {OP_trap, -1, 0, single, trap_decode, 0},
1223 [0x97] = {OP_trap, -1, 0, single, trap_decode, 0},
1224 [0x98] = {OP_trap, -1, 0, single, trap_decode, 0},
1225 [0x99] = {OP_trap, -1, 0, single, trap_decode, 0},
1226 [0x9a] = {OP_trap, -1, 0, single, trap_decode, 0},
1227 [0x9b] = {OP_trap, -1, 0, single, trap_decode, 0},
1228 [0x9c] = {OP_trap, -1, 0, single, trap_decode, 0},
1229 [0x9d] = {OP_trap, -1, 0, single, trap_decode, 0},
1230 [0x9e] = {OP_trap, -1, 0, single, trap_decode, 0},
1231 [0x9f] = {OP_trap, -1, 0, single, trap_decode, 0},
1232 [0xa0] = {OP_sat, -1, 0, single, z_reg, 0},
1233 [0xa1] = {OP_sat, -1, 0, single, z_reg, 0},
1234 [0xa2] = {OP_sat, -1, 0, single, z_reg, 0},
1235 [0xa3] = {OP_sat, -1, 0, single, z_reg, 0},
1236 [0xa4] = {OP_sat, -1, 0, single, z_reg, 0},
1237 [0xa5] = {OP_sat, -1, 0, single, z_reg, 0},
1238 [0xa6] = {OP_sat, -1, 0, single, z_reg, 0},
1239 [0xa7] = {OP_sat, -1, 0, single, z_reg, 0},
1240 [0xa8] = {OP_trap, -1, 0, single, trap_decode, 0},
1241 [0xa9] = {OP_trap, -1, 0, single, trap_decode, 0},
1242 [0xaa] = {OP_trap, -1, 0, single, trap_decode, 0},
1243 [0xab] = {OP_trap, -1, 0, single, trap_decode, 0},
1244 [0xac] = {OP_trap, -1, 0, single, trap_decode, 0},
1245 [0xad] = {OP_trap, -1, 0, single, trap_decode, 0},
1246 [0xae] = {OP_trap, -1, 0, single, trap_decode, 0},
1247 [0xaf] = {OP_trap, -1, 0, single, trap_decode, 0},
1248 [0xb0] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1249 [0xb1] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1250 [0xb2] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1251 [0xb3] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1252 [0xb4] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1253 [0xb5] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1254 [0xb6] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1255 [0xb7] = {OPBASE_qmul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1256 [0xb8] = {OP_trap, -1, 0, single, trap_decode, 0},
1257 [0xb9] = {OP_trap, -1, 0, single, trap_decode, 0},
1258 [0xba] = {OP_trap, -1, 0, single, trap_decode, 0},
1259 [0xbb] = {OP_trap, -1, 0, single, trap_decode, 0},
1260 [0xbc] = {OP_trap, -1, 0, single, trap_decode, 0},
1261 [0xbd] = {OP_trap, -1, 0, single, trap_decode, 0},
1262 [0xbe] = {OP_trap, -1, 0, single, trap_decode, 0},
1263 [0xbf] = {OP_trap, -1, 0, single, trap_decode, 0},
1264 [0xc0] = {OP_trap, -1, 0, single, trap_decode, 0},
1265 [0xc1] = {OP_trap, -1, 0, single, trap_decode, 0},
1266 [0xc2] = {OP_trap, -1, 0, single, trap_decode, 0},
1267 [0xc3] = {OP_trap, -1, 0, single, trap_decode, 0},
1268 [0xc4] = {OP_trap, -1, 0, single, trap_decode, 0},
1269 [0xc5] = {OP_trap, -1, 0, single, trap_decode, 0},
1270 [0xc6] = {OP_trap, -1, 0, single, trap_decode, 0},
1271 [0xc7] = {OP_trap, -1, 0, single, trap_decode, 0},
1272 [0xc8] = {OP_trap, -1, 0, single, trap_decode, 0},
1273 [0xc9] = {OP_trap, -1, 0, single, trap_decode, 0},
1274 [0xca] = {OP_trap, -1, 0, single, trap_decode, 0},
1275 [0xcb] = {OP_trap, -1, 0, single, trap_decode, 0},
1276 [0xcc] = {OP_trap, -1, 0, single, trap_decode, 0},
1277 [0xcd] = {OP_trap, -1, 0, single, trap_decode, 0},
1278 [0xce] = {OP_trap, -1, 0, single, trap_decode, 0},
1279 [0xcf] = {OP_trap, -1, 0, single, trap_decode, 0},
1280 [0xd0] = {OP_trap, -1, 0, single, trap_decode, 0},
1281 [0xd1] = {OP_trap, -1, 0, single, trap_decode, 0},
1282 [0xd2] = {OP_trap, -1, 0, single, trap_decode, 0},
1283 [0xd3] = {OP_trap, -1, 0, single, trap_decode, 0},
1284 [0xd4] = {OP_trap, -1, 0, single, trap_decode, 0},
1285 [0xd5] = {OP_trap, -1, 0, single, trap_decode, 0},
1286 [0xd6] = {OP_trap, -1, 0, single, trap_decode, 0},
1287 [0xd7] = {OP_trap, -1, 0, single, trap_decode, 0},
1288 [0xd8] = {OP_trap, -1, 0, single, trap_decode, 0},
1289 [0xd9] = {OP_trap, -1, 0, single, trap_decode, 0},
1290 [0xda] = {OP_trap, -1, 0, single, trap_decode, 0},
1291 [0xdb] = {OP_trap, -1, 0, single, trap_decode, 0},
1292 [0xdc] = {OP_trap, -1, 0, single, trap_decode, 0},
1293 [0xdd] = {OP_trap, -1, 0, single, trap_decode, 0},
1294 [0xde] = {OP_trap, -1, 0, single, trap_decode, 0},
1295 [0xdf] = {OP_trap, -1, 0, single, trap_decode, 0},
1296 [0xe0] = {OP_trap, -1, 0, single, trap_decode, 0},
1297 [0xe1] = {OP_trap, -1, 0, single, trap_decode, 0},
1298 [0xe2] = {OP_trap, -1, 0, single, trap_decode, 0},
1299 [0xe3] = {OP_trap, -1, 0, single, trap_decode, 0},
1300 [0xe4] = {OP_trap, -1, 0, single, trap_decode, 0},
1301 [0xe5] = {OP_trap, -1, 0, single, trap_decode, 0},
1302 [0xe6] = {OP_trap, -1, 0, single, trap_decode, 0},
1303 [0xe7] = {OP_trap, -1, 0, single, trap_decode, 0},
1304 [0xe8] = {OP_trap, -1, 0, single, trap_decode, 0},
1305 [0xe9] = {OP_trap, -1, 0, single, trap_decode, 0},
1306 [0xea] = {OP_trap, -1, 0, single, trap_decode, 0},
1307 [0xeb] = {OP_trap, -1, 0, single, trap_decode, 0},
1308 [0xec] = {OP_trap, -1, 0, single, trap_decode, 0},
1309 [0xed] = {OP_trap, -1, 0, single, trap_decode, 0},
1310 [0xee] = {OP_trap, -1, 0, single, trap_decode, 0},
1311 [0xef] = {OP_trap, -1, 0, single, trap_decode, 0},
1312 [0xf0] = {OP_trap, -1, 0, single, trap_decode, 0},
1313 [0xf1] = {OP_trap, -1, 0, single, trap_decode, 0},
1314 [0xf2] = {OP_trap, -1, 0, single, trap_decode, 0},
1315 [0xf3] = {OP_trap, -1, 0, single, trap_decode, 0},
1316 [0xf4] = {OP_trap, -1, 0, single, trap_decode, 0},
1317 [0xf5] = {OP_trap, -1, 0, single, trap_decode, 0},
1318 [0xf6] = {OP_trap, -1, 0, single, trap_decode, 0},
1319 [0xf7] = {OP_trap, -1, 0, single, trap_decode, 0},
1320 [0xf8] = {OP_trap, -1, 0, single, trap_decode, 0},
1321 [0xf9] = {OP_trap, -1, 0, single, trap_decode, 0},
1322 [0xfa] = {OP_trap, -1, 0, single, trap_decode, 0},
1323 [0xfb] = {OP_trap, -1, 0, single, trap_decode, 0},
1324 [0xfc] = {OP_trap, -1, 0, single, trap_decode, 0},
1325 [0xfd] = {OP_trap, -1, 0, single, trap_decode, 0},
1326 [0xfe] = {OP_trap, -1, 0, single, trap_decode, 0},
1327 [0xff] = {OP_trap, -1, 0, single, trap_decode, 0},
1328 };
1329
1330static const struct opcode page1[] =
1331 {
1332 [0x00] = {OP_bgnd, -1, 0, single, 0, 0},
1333 [0x01] = {OP_nop, -1, 0, single, 0, 0},
1334 [0x02] = {OP_brclr, -1, 0, bm_rel_n_bytes, bm_rel_decode, 0},
1335 [0x03] = {OP_brset, -1, 0, bm_rel_n_bytes, bm_rel_decode, 0},
1336 [0x04] = {0xFFFF, -1, psh_pul_discrim, two, psh_pul_decode, 0}, /* psh/pul */
1337 [0x05] = {OP_rts, -1, 0, single, 0, 0},
1338 [0x06] = {OP_lea, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1339 [0x07] = {OP_lea, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1340 [0x08] = {OP_lea, -1, 0, opr_n_bytes_p1, lea_reg_xys_opr, 0},
1341 [0x09] = {OP_lea, -1, 0, opr_n_bytes_p1, lea_reg_xys_opr, 0},
1342 [0x0a] = {OP_lea, -1, 0, opr_n_bytes_p1, lea_reg_xys_opr, 0},
1343 [0x0b] = {0xFFFF, -1, loop_primitive_discrim, loop_prim_n_bytes, loop_primitive_decode, 0}, /* Loop primitives TBcc / DBcc */
1344 [0x0c] = {OP_mov, 0, 0, mov_imm_opr_n_bytes, mov_imm_opr, 0},
1345 [0x0d] = {OP_mov, 1, 0, mov_imm_opr_n_bytes, mov_imm_opr, 0},
1346 [0x0e] = {OP_mov, 2, 0, mov_imm_opr_n_bytes, mov_imm_opr, 0},
1347 [0x0f] = {OP_mov, 3, 0, mov_imm_opr_n_bytes, mov_imm_opr, 0},
1348 [0x10] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0}, /* lsr/lsl/asl/asr/rol/ror */
1349 [0x11] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0},
1350 [0x12] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0},
1351 [0x13] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0},
1352 [0x14] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0},
1353 [0x15] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0},
1354 [0x16] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0},
1355 [0x17] = {0xFFFF, -1, shift_discrim, shift_n_bytes, shift_decode, 0},
1356 [0x18] = {OP_lea, -1, 0, two, lea_reg_xys, NULL},
1357 [0x19] = {OP_lea, -1, 0, two, lea_reg_xys, NULL},
1358 [0x1a] = {OP_lea, -1, 0, two, lea_reg_xys, NULL},
1359 /* 0x1b PG2 */
1360 [0x1c] = {OP_mov, 0, 0, opr_n_bytes2, z_opr_decode2, 0},
1361 [0x1d] = {OP_mov, 1, 0, opr_n_bytes2, z_opr_decode2, 0},
1362 [0x1e] = {OP_mov, 2, 0, opr_n_bytes2, z_opr_decode2, 0},
1363 [0x1f] = {OP_mov, 3, 0, opr_n_bytes2, z_opr_decode2, 0},
1364 [0x20] = {OP_bra, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1365 [0x21] = {OP_bsr, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1366 [0x22] = {OP_bhi, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1367 [0x23] = {OP_bls, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1368 [0x24] = {OP_bcc, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1369 [0x25] = {OP_bcs, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1370 [0x26] = {OP_bne, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1371 [0x27] = {OP_beq, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1372 [0x28] = {OP_bvc, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1373 [0x29] = {OP_bvs, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1374 [0x2a] = {OP_bpl, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1375 [0x2b] = {OP_bmi, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1376 [0x2c] = {OP_bge, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1377 [0x2d] = {OP_blt, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1378 [0x2e] = {OP_bgt, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1379 [0x2f] = {OP_ble, -1, 0, pcrel_15bit, decode_rel_15_7, 0},
1380 [0x30] = {OP_inc, -1, 0, single, z_reg, 0},
1381 [0x31] = {OP_inc, -1, 0, single, z_reg, 0},
1382 [0x32] = {OP_inc, -1, 0, single, z_reg, 0},
1383 [0x33] = {OP_inc, -1, 0, single, z_reg, 0},
1384 [0x34] = {OP_inc, -1, 0, single, z_reg, 0},
1385 [0x35] = {OP_inc, -1, 0, single, z_reg, 0},
1386 [0x36] = {OP_inc, -1, 0, single, z_reg, 0},
1387 [0x37] = {OP_inc, -1, 0, single, z_reg, 0},
1388 [0x38] = {OP_clr, -1, 0, single, z_reg, 0},
1389 [0x39] = {OP_clr, -1, 0, single, z_reg, 0},
1390 [0x3a] = {OP_clr, -1, 0, single, z_reg, 0},
1391 [0x3b] = {OP_clr, -1, 0, single, z_reg, 0},
1392 [0x3c] = {OP_clr, -1, 0, single, z_reg, 0},
1393 [0x3d] = {OP_clr, -1, 0, single, z_reg, 0},
1394 [0x3e] = {OP_clr, -1, 0, single, z_reg, 0},
1395 [0x3f] = {OP_clr, -1, 0, single, z_reg, 0},
1396 [0x40] = {OP_dec, -1, 0, single, z_reg, 0},
1397 [0x41] = {OP_dec, -1, 0, single, z_reg, 0},
1398 [0x42] = {OP_dec, -1, 0, single, z_reg, 0},
1399 [0x43] = {OP_dec, -1, 0, single, z_reg, 0},
1400 [0x44] = {OP_dec, -1, 0, single, z_reg, 0},
1401 [0x45] = {OP_dec, -1, 0, single, z_reg, 0},
1402 [0x46] = {OP_dec, -1, 0, single, z_reg, 0},
1403 [0x47] = {OP_dec, -1, 0, single, z_reg, 0},
1404 [0x48] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1405 [0x49] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1406 [0x4a] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1407 [0x4b] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1408 [0x4c] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1409 [0x4d] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1410 [0x4e] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1411 [0x4f] = {OPBASE_mul, -1, mul_discrim, mul_n_bytes, mul_decode, 0},
1412 [0x50] = {OP_add, -1, 0, three, z_reg, z_imm1234_0base},
1413 [0x51] = {OP_add, -1, 0, three, z_reg, z_imm1234_0base},
1414 [0x52] = {OP_add, -1, 0, three, z_reg, z_imm1234_0base},
1415 [0x53] = {OP_add, -1, 0, three, z_reg, z_imm1234_0base},
1416 [0x54] = {OP_add, -1, 0, two, z_reg, z_imm1234_0base},
1417 [0x55] = {OP_add, -1, 0, two, z_reg, z_imm1234_0base},
1418 [0x56] = {OP_add, -1, 0, five, z_reg, z_imm1234_0base},
1419 [0x57] = {OP_add, -1, 0, five, z_reg, z_imm1234_0base},
1420 [0x58] = {OP_and, -1, 0, three, z_reg, z_imm1234_8base},
1421 [0x59] = {OP_and, -1, 0, three, z_reg, z_imm1234_8base},
1422 [0x5a] = {OP_and, -1, 0, three, z_reg, z_imm1234_8base},
1423 [0x5b] = {OP_and, -1, 0, three, z_reg, z_imm1234_8base},
1424 [0x5c] = {OP_and, -1, 0, two, z_reg, z_imm1234_8base},
1425 [0x5d] = {OP_and, -1, 0, two, z_reg, z_imm1234_8base},
1426 [0x5e] = {OP_and, -1, 0, five, z_reg, z_imm1234_8base},
1427 [0x5f] = {OP_and, -1, 0, five, z_reg, z_imm1234_8base},
1428 [0x60] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1429 [0x61] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1430 [0x62] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1431 [0x63] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1432 [0x64] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1433 [0x65] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1434 [0x66] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1435 [0x67] = {OP_add, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1436 [0x68] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1437 [0x69] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1438 [0x6a] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1439 [0x6b] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1440 [0x6c] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1441 [0x6d] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1442 [0x6e] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1443 [0x6f] = {OP_and, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1444 [0x70] = {OP_sub, -1, 0, three, z_reg, z_imm1234_0base},
1445 [0x71] = {OP_sub, -1, 0, three, z_reg, z_imm1234_0base},
1446 [0x72] = {OP_sub, -1, 0, three, z_reg, z_imm1234_0base},
1447 [0x73] = {OP_sub, -1, 0, three, z_reg, z_imm1234_0base},
1448 [0x74] = {OP_sub, -1, 0, two, z_reg, z_imm1234_0base},
1449 [0x75] = {OP_sub, -1, 0, two, z_reg, z_imm1234_0base},
1450 [0x76] = {OP_sub, -1, 0, five, z_reg, z_imm1234_0base},
1451 [0x77] = {OP_sub, -1, 0, five, z_reg, z_imm1234_0base},
1452 [0x78] = {OP_or, -1, 0, three, z_reg, z_imm1234_8base},
1453 [0x79] = {OP_or, -1, 0, three, z_reg, z_imm1234_8base},
1454 [0x7a] = {OP_or, -1, 0, three, z_reg, z_imm1234_8base},
1455 [0x7b] = {OP_or, -1, 0, three, z_reg, z_imm1234_8base},
1456 [0x7c] = {OP_or, -1, 0, two, z_reg, z_imm1234_8base},
1457 [0x7d] = {OP_or, -1, 0, two, z_reg, z_imm1234_8base},
1458 [0x7e] = {OP_or, -1, 0, five, z_reg, z_imm1234_8base},
1459 [0x7f] = {OP_or, -1, 0, five, z_reg, z_imm1234_8base},
1460 [0x80] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1461 [0x81] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1462 [0x82] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1463 [0x83] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1464 [0x84] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1465 [0x85] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1466 [0x86] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1467 [0x87] = {OP_sub, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1468 [0x88] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1469 [0x89] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1470 [0x8a] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1471 [0x8b] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1472 [0x8c] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1473 [0x8d] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1474 [0x8e] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1475 [0x8f] = {OP_or, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1476 [0x90] = {OP_ld, -1, 0, three, z_reg, z_imm1234_0base},
1477 [0x91] = {OP_ld, -1, 0, three, z_reg, z_imm1234_0base},
1478 [0x92] = {OP_ld, -1, 0, three, z_reg, z_imm1234_0base},
1479 [0x93] = {OP_ld, -1, 0, three, z_reg, z_imm1234_0base},
1480 [0x94] = {OP_ld, -1, 0, two, z_reg, z_imm1234_0base},
1481 [0x95] = {OP_ld, -1, 0, two, z_reg, z_imm1234_0base},
1482 [0x96] = {OP_ld, -1, 0, five, z_reg, z_imm1234_0base},
1483 [0x97] = {OP_ld, -1, 0, five, z_reg, z_imm1234_0base},
1484 [0x98] = {OP_ld, -1, 0, four, reg_xy, z_imm1234_0base},
1485 [0x99] = {OP_ld, -1, 0, four, reg_xy, z_imm1234_0base},
1486 [0x9a] = {OP_clr, -1, 0, single, reg_xy, 0},
1487 [0x9b] = {OP_clr, -1, 0, single, reg_xy, 0},
1488 [0x9c] = {OP_inc, 0, 0, opr_n_bytes_p1, z_opr_decode, 0},
1489 [0x9d] = {OP_inc, 1, 0, opr_n_bytes_p1, z_opr_decode, 0},
1490 [0x9e] = {OP_tfr, -1, 0, two, z_tfr, NULL},
1491 [0x9f] = {OP_inc, 3, 0, opr_n_bytes_p1, z_opr_decode, 0},
1492 [0xa0] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1493 [0xa1] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1494 [0xa2] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1495 [0xa3] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1496 [0xa4] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1497 [0xa5] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1498 [0xa6] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1499 [0xa7] = {OP_ld, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1500 [0xa8] = {OP_ld, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode},
1501 [0xa9] = {OP_ld, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode},
1502 [0xaa] = {OP_jmp, -1, 0, opr_n_bytes_p1, z_opr_decode, 0},
1503 [0xab] = {OP_jsr, -1, 0, opr_n_bytes_p1, z_opr_decode, 0},
1504 [0xac] = {OP_dec, 0, 0, opr_n_bytes_p1, z_opr_decode, 0},
1505 [0xad] = {OP_dec, 1, 0, opr_n_bytes_p1, z_opr_decode, 0},
1506 [0xae] = {0xFFFF, -1, exg_sex_discrim, two, exg_sex_decode, 0}, /* EXG / SEX */
1507 [0xaf] = {OP_dec, 3, 0, opr_n_bytes_p1, 0, z_opr_decode},
1508 [0xb0] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode},
1509 [0xb1] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode},
1510 [0xb2] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode},
1511 [0xb3] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode},
1512 [0xb4] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode},
1513 [0xb5] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode},
1514 [0xb6] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode},
1515 [0xb7] = {OP_ld, -1, 0, four, z_reg, z_ext24_decode},
1516 [0xb8] = {OP_ld, -1, 0, four, reg_xy, z_ext24_decode},
1517 [0xb9] = {OP_ld, -1, 0, four, reg_xy, z_ext24_decode},
1518 [0xba] = {OP_jmp, -1, 0, four, z_ext24_decode, 0},
1519 [0xbb] = {OP_jsr, -1, 0, four, z_ext24_decode, 0},
1520 [0xbc] = {OP_clr, 0, 0, opr_n_bytes_p1, z_opr_decode, 0},
1521 [0xbd] = {OP_clr, 1, 0, opr_n_bytes_p1, z_opr_decode, 0},
1522 [0xbe] = {OP_clr, 2, 0, opr_n_bytes_p1, z_opr_decode, 0},
1523 [0xbf] = {OP_clr, 3, 0, opr_n_bytes_p1, z_opr_decode, 0},
1524 [0xc0] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1525 [0xc1] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1526 [0xc2] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1527 [0xc3] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1528 [0xc4] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1529 [0xc5] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1530 [0xc6] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1531 [0xc7] = {OP_st, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1532 [0xc8] = {OP_st, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode},
1533 [0xc9] = {OP_st, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode},
1534 [0xca] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode},
1535 [0xcb] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode},
1536 [0xcc] = {OP_com, 0, 0, opr_n_bytes_p1, NULL, z_opr_decode},
1537 [0xcd] = {OP_com, 1, 0, opr_n_bytes_p1, NULL, z_opr_decode},
1538 [0xce] = {OP_andcc, -1, 0, two, imm1_decode, 0},
1539 [0xcf] = {OP_com, 3, 0, opr_n_bytes_p1, NULL, z_opr_decode},
1540 [0xd0] = {OP_st, -1, 0, four, z_reg, z_ext24_decode},
1541 [0xd1] = {OP_st, -1, 0, four, z_reg, z_ext24_decode},
1542 [0xd2] = {OP_st, -1, 0, four, z_reg, z_ext24_decode},
1543 [0xd3] = {OP_st, -1, 0, four, z_reg, z_ext24_decode},
1544 [0xd4] = {OP_st, -1, 0, four, z_reg, z_ext24_decode},
1545 [0xd5] = {OP_st, -1, 0, four, z_reg, z_ext24_decode},
1546 [0xd6] = {OP_st, -1, 0, four, z_reg, z_ext24_decode},
1547 [0xd7] = {OP_st, -1, 0, four, z_reg, z_ext24_decode},
1548 [0xd8] = {OP_st, -1, 0, four, reg_xy, z_ext24_decode},
1549 [0xd9] = {OP_st, -1, 0, four, reg_xy, z_ext24_decode},
1550 [0xda] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode},
1551 [0xdb] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode},
1552 [0xdc] = {OP_neg, 0, 0, opr_n_bytes_p1, NULL, z_opr_decode},
1553 [0xdd] = {OP_neg, 1, 0, opr_n_bytes_p1, NULL, z_opr_decode},
1554 [0xde] = {OP_orcc, -1, 0, two, imm1_decode, 0},
1555 [0xdf] = {OP_neg, 3, 0, opr_n_bytes_p1, NULL, z_opr_decode},
1556 [0xe0] = {OP_cmp, -1, 0, three, z_reg, z_imm1234_0base},
1557 [0xe1] = {OP_cmp, -1, 0, three, z_reg, z_imm1234_0base},
1558 [0xe2] = {OP_cmp, -1, 0, three, z_reg, z_imm1234_0base},
1559 [0xe3] = {OP_cmp, -1, 0, three, z_reg, z_imm1234_0base},
1560 [0xe4] = {OP_cmp, -1, 0, two, z_reg, z_imm1234_0base},
1561 [0xe5] = {OP_cmp, -1, 0, two, z_reg, z_imm1234_0base},
1562 [0xe6] = {OP_cmp, -1, 0, five, z_reg, z_imm1234_0base},
1563 [0xe7] = {OP_cmp, -1, 0, five, z_reg, z_imm1234_0base},
1564 [0xe8] = {OP_cmp, -1, 0, four, reg_xy, z_imm1234_0base},
1565 [0xe9] = {OP_cmp, -1, 0, four, reg_xy, z_imm1234_0base},
1566 [0xea] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode},
1567 [0xeb] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode},
1568 [0xec] = {OP_bclr, -1, 0, bm_n_bytes, bm_decode, 0},
1569 [0xed] = {OP_bset, -1, 0, bm_n_bytes, bm_decode, 0},
1570 [0xee] = {OP_btgl, -1, 0, bm_n_bytes, bm_decode, 0},
1571 [0xef] = {OP_INVALID, -1, 0, NULL, NULL, NULL}, /* SPARE */
1572 [0xf0] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1573 [0xf1] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1574 [0xf2] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1575 [0xf3] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1576 [0xf4] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1577 [0xf5] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1578 [0xf6] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1579 [0xf7] = {OP_cmp, -1, 0, opr_n_bytes_p1, z_reg, z_opr_decode},
1580 [0xf8] = {OP_cmp, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode},
1581 [0xf9] = {OP_cmp, -1, 0, opr_n_bytes_p1, reg_xy, z_opr_decode},
1582 [0xfa] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode},
1583 [0xfb] = {OP_ld, -1, 0, three, reg_xy, ld_18bit_decode},
1584 [0xfc] = {OP_cmp, -1, 0, single, cmp_xy, 0},
1585 [0xfd] = {OP_sub, -1, 0, single, sub_d6_x_y, 0},
1586 [0xfe] = {OP_sub, -1, 0, single, sub_d6_y_x, 0},
1587 [0xff] = {OP_swi, -1, 0, single, 0, 0}
1588 };
1589
1590static const int oprregs1[] =
1591 {
1592 REG_D3, REG_D2, REG_D1, REG_D0, REG_CCL, REG_CCH
1593 };
1594
1595static const int oprregs2[] =
1596 {
1597 REG_Y, REG_X, REG_D7, REG_D6, REG_D5, REG_D4
1598 };
1599
1600
1601\f
1602
1603enum MUL_MODE
1604 {
1605 MUL_REG_REG,
1606 MUL_REG_OPR,
1607 MUL_REG_IMM,
1608 MUL_OPR_OPR
1609 };
1610
1611struct mb
1612{
1613 uint8_t mask;
1614 uint8_t value;
1615 enum MUL_MODE mode;
1616};
1617
1618static const struct mb mul_table[] = {
1619 {0x40, 0x00, MUL_REG_REG},
1620
1621 {0x47, 0x40, MUL_REG_OPR},
1622 {0x47, 0x41, MUL_REG_OPR},
1623 {0x47, 0x43, MUL_REG_OPR},
1624
1625 {0x47, 0x44, MUL_REG_IMM},
1626 {0x47, 0x45, MUL_REG_IMM},
1627 {0x47, 0x47, MUL_REG_IMM},
1628
1629 {0x43, 0x42, MUL_OPR_OPR},
1630};
1631
1632
1633static void
1634mul_decode (struct mem_read_abstraction_base *mra,
1635 int *n_operands, struct operand **operand)
1636{
1637 uint8_t mb;
1638 int status = mra->read (mra, 0, 1, &mb);
1639 if (status < 0)
1640 return;
1641
1642 uint8_t byte;
1643 status = mra->read (mra, -1, 1, &byte);
1644 if (status < 0)
1645 return;
1646
1647 enum MUL_MODE mode = -1;
1648 size_t i;
1649 for (i = 0; i < sizeof (mul_table) / sizeof (mul_table[0]); ++i)
1650 {
1651 const struct mb *mm = mul_table + i;
1652 if ((mb & mm->mask) == mm->value)
1653 {
1654 mode = mm->mode;
1655 break;
1656 }
1657 }
1658 operand[(*n_operands)++] = create_register_operand (byte & 0x07);
1659
1660 switch (mode)
1661 {
1662 case MUL_REG_IMM:
1663 {
1664 int size = (mb & 0x3);
1665 operand[(*n_operands)++] =
1666 create_register_operand_with_size ((mb & 0x38) >> 3, size);
1667 uint32_t imm = z_decode_signed_value (mra, 1, size + 1);
1668 operand[(*n_operands)++] = create_immediate_operand (imm);
1669 }
1670 break;
1671 case MUL_REG_REG:
1672 operand[(*n_operands)++] = create_register_operand ((mb & 0x38) >> 3);
1673 operand[(*n_operands)++] = create_register_operand (mb & 0x07);
1674 break;
1675 case MUL_REG_OPR:
1676 operand[(*n_operands)++] = create_register_operand ((mb & 0x38) >> 3);
1677 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1, mb & 0x3);
1678 break;
1679 case MUL_OPR_OPR:
1680 {
1681 int first = x_opr_n_bytes (mra, 1);
1682 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1,
1683 (mb & 0x30) >> 4);
1684 operand[(*n_operands)++] = x_opr_decode_with_size (mra, first + 1,
1685 (mb & 0x0c) >> 2);
1686 break;
1687 }
1688 }
1689}
1690
1691
1692static int
1693mul_n_bytes (struct mem_read_abstraction_base *mra)
1694{
1695 int nx = 2;
1696 uint8_t mb;
1697 int status = mra->read (mra, 0, 1, &mb);
1698 if (status < 0)
1699 return 0;
1700
1701 enum MUL_MODE mode = -1;
1702 size_t i;
1703 for (i = 0; i < sizeof (mul_table) / sizeof (mul_table[0]); ++i)
1704 {
1705 const struct mb *mm = mul_table + i;
1706 if ((mb & mm->mask) == mm->value)
1707 {
1708 mode = mm->mode;
1709 break;
1710 }
1711 }
1712
1713 int size = (mb & 0x3) + 1;
1714
1715 switch (mode)
1716 {
1717 case MUL_REG_IMM:
1718 nx += size;
1719 break;
1720 case MUL_REG_REG:
1721 break;
1722 case MUL_REG_OPR:
1723 nx += x_opr_n_bytes (mra, 1);
1724 break;
1725 case MUL_OPR_OPR:
1726 {
1727 int first = x_opr_n_bytes (mra, nx - 1);
1728 nx += first;
1729 int second = x_opr_n_bytes (mra, nx - 1);
1730 nx += second;
1731 }
1732 break;
1733 }
1734
1735 return nx;
1736}
1737
1738\f
1739/* The NXP documentation is vague about BM_RESERVED0 and BM_RESERVED1,
1740 and contains obvious typos.
1741 However the Freescale tools and experiments with the chip itself
1742 seem to indicate that they behave like BM_REG_IMM and BM_OPR_REG
1743 respectively. */
1744
1745enum BM_MODE
1746{
1747 BM_REG_IMM,
1748 BM_RESERVED0,
1749 BM_OPR_B,
1750 BM_OPR_W,
1751 BM_OPR_L,
1752 BM_OPR_REG,
1753 BM_RESERVED1
1754};
1755
1756struct bm
1757{
1758 uint8_t mask;
1759 uint8_t value;
1760 enum BM_MODE mode;
1761};
1762
1763static const struct bm bm_table[] = {
1764 { 0xC6, 0x04, BM_REG_IMM},
1765 { 0x84, 0x00, BM_REG_IMM},
1766 { 0x06, 0x06, BM_REG_IMM},
1767 { 0xC6, 0x44, BM_RESERVED0},
1768 // 00
1769 { 0x8F, 0x80, BM_OPR_B},
1770 { 0x8E, 0x82, BM_OPR_W},
1771 { 0x8C, 0x88, BM_OPR_L},
1772
1773 { 0x83, 0x81, BM_OPR_REG},
1774 { 0x87, 0x84, BM_RESERVED1},
1775};
1776
1777static void
1778bm_decode (struct mem_read_abstraction_base *mra,
1779 int *n_operands, struct operand **operand)
1780{
1781 uint8_t bm;
1782 int status = mra->read (mra, 0, 1, &bm);
1783 if (status < 0)
1784 return;
1785
1786 size_t i;
1787 enum BM_MODE mode = -1;
1788 for (i = 0; i < sizeof (bm_table) / sizeof (bm_table[0]); ++i)
1789 {
1790 const struct bm *bme = bm_table + i;
1791 if ((bm & bme->mask) == bme->value)
1792 {
1793 mode = bme->mode;
1794 break;
1795 }
1796 }
1797
1798 switch (mode)
1799 {
1800 case BM_REG_IMM:
1801 case BM_RESERVED0:
1802 operand[(*n_operands)++] = create_register_operand (bm & 0x07);
1803 break;
1804 case BM_OPR_B:
1805 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1, 0);
1806 break;
1807 case BM_OPR_W:
1808 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1, 1);
1809 break;
1810 case BM_OPR_L:
1811 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1, 3);
1812 break;
1813 case BM_OPR_REG:
1814 case BM_RESERVED1:
1815 {
1816 uint8_t xb;
1817 mra->read (mra, 1, 1, &xb);
1818 /* Don't emit a size suffix for register operands */
1819 if ((xb & 0xF8) != 0xB8)
1820 operand[(*n_operands)++] =
1821 x_opr_decode_with_size (mra, 1, (bm & 0x0c) >> 2);
1822 else
1823 operand[(*n_operands)++] = x_opr_decode (mra, 1);
1824 }
1825 break;
1826 }
1827
1828 uint8_t imm = 0;
1829 switch (mode)
1830 {
1831 case BM_REG_IMM:
a679f24e 1832 case BM_RESERVED0:
ef1ad42b
JD
1833 imm = (bm & 0x38) >> 3;
1834 operand[(*n_operands)++] = create_immediate_operand (imm);
1835 break;
1836 case BM_OPR_L:
1837 imm |= (bm & 0x03) << 3;
1838 /* fallthrough */
1839 case BM_OPR_W:
1840 imm |= (bm & 0x01) << 3;
1841 /* fallthrough */
1842 case BM_OPR_B:
1843 imm |= (bm & 0x70) >> 4;
1844 operand[(*n_operands)++] = create_immediate_operand (imm);
1845 break;
1846 case BM_OPR_REG:
1847 case BM_RESERVED1:
1848 operand[(*n_operands)++] = create_register_operand ((bm & 0x70) >> 4);
1849 break;
ef1ad42b
JD
1850 }
1851}
1852
1853
1854static void
1855bm_rel_decode (struct mem_read_abstraction_base *mra,
1856 int *n_operands, struct operand **operand)
1857{
1858 uint8_t bm;
1859 int status = mra->read (mra, 0, 1, &bm);
1860 if (status < 0)
1861 return;
1862
1863 size_t i;
1864 enum BM_MODE mode = -1;
1865 for (i = 0; i < sizeof (bm_table) / sizeof (bm_table[0]); ++i)
1866 {
1867 const struct bm *bme = bm_table + i;
1868 if ((bm & bme->mask) == bme->value)
1869 {
1870 mode = bme->mode;
1871 break;
1872 }
1873 }
1874
1875 int n = 1;
1876 switch (mode)
1877 {
1878 case BM_REG_IMM:
1879 case BM_RESERVED0:
1880 operand[(*n_operands)++] = create_register_operand (bm & 0x07);
1881 break;
1882 case BM_OPR_B:
1883 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1, 0);
1884 n = 1 + x_opr_n_bytes (mra, 1);
1885 break;
1886 case BM_OPR_W:
1887 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1, 1);
1888 n = 1 + x_opr_n_bytes (mra, 1);
1889 break;
1890 case BM_OPR_L:
1891 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1, 3);
1892 n = 1 + x_opr_n_bytes (mra, 1);
1893 break;
1894 case BM_OPR_REG:
1895 case BM_RESERVED1:
1896 {
1897 uint8_t xb;
1898 mra->read (mra, +1, 1, &xb);
1899 /* Don't emit a size suffix for register operands */
1900 if ((xb & 0xF8) != 0xB8)
1901 {
1902 short os = (bm & 0x0c) >> 2;
1903 operand[(*n_operands)++] = x_opr_decode_with_size (mra, 1, os);
1904 }
1905 else
1906 operand[(*n_operands)++] = x_opr_decode (mra, 1);
1907
1908 }
1909 break;
1910 }
1911
1912 int imm = 0;
1913 switch (mode)
1914 {
1915 case BM_OPR_L:
1916 imm |= (bm & 0x02) << 3;
1917 /* fall through */
1918 case BM_OPR_W:
1919 imm |= (bm & 0x01) << 3;
1920 /* fall through */
1921 case BM_OPR_B:
1922 imm |= (bm & 0x70) >> 4;
1923 operand[(*n_operands)++] = create_immediate_operand (imm);
1924 break;
1925 case BM_RESERVED0:
1926 imm = (bm & 0x38) >> 3;
1927 operand[(*n_operands)++] = create_immediate_operand (imm);
1928 break;
1929 case BM_REG_IMM:
1930 imm = (bm & 0xF8) >> 3;
1931 operand[(*n_operands)++] = create_immediate_operand (imm);
1932 break;
1933 case BM_OPR_REG:
1934 case BM_RESERVED1:
1935 operand[(*n_operands)++] = create_register_operand ((bm & 0x70) >> 4);
1936 n += x_opr_n_bytes (mra, 1);
1937 break;
1938 }
1939
1940 rel_15_7 (mra, n + 1, n_operands, operand);
1941}
1942
1943static int
1944bm_n_bytes (struct mem_read_abstraction_base *mra)
1945{
1946 uint8_t bm;
1947 int status = mra->read (mra, 0, 1, &bm);
1948 if (status < 0)
1949 return status;
1950
1951 size_t i;
1952 enum BM_MODE mode = -1;
1953 for (i = 0; i < sizeof (bm_table) / sizeof (bm_table[0]); ++i)
1954 {
1955 const struct bm *bme = bm_table + i;
1956 if ((bm & bme->mask) == bme->value)
1957 {
1958 mode = bme->mode;
1959 break;
1960 }
1961 }
1962
1963 int n = 2;
1964 switch (mode)
1965 {
1966 case BM_REG_IMM:
1967 case BM_RESERVED0:
1968 break;
1969
1970 case BM_OPR_B:
1971 case BM_OPR_W:
1972 case BM_OPR_L:
1973 n += x_opr_n_bytes (mra, 1);
1974 break;
1975 case BM_OPR_REG:
1976 case BM_RESERVED1:
1977 n += x_opr_n_bytes (mra, 1);
1978 break;
1979 }
1980
1981 return n;
1982}
1983
1984static int
1985bm_rel_n_bytes (struct mem_read_abstraction_base *mra)
1986{
1987 int n = 1 + bm_n_bytes (mra);
1988
1989 bfd_byte rb;
1990 int status = mra->read (mra, n - 2, 1, &rb);
1991 if (status != 0)
1992 return status;
1993
1994 if (rb & 0x80)
1995 n++;
1996
1997 return n;
1998}
1999
2000
2001\f
2002
2003
2004/* shift direction */
2005enum SB_DIR
2006 {
2007 SB_LEFT,
2008 SB_RIGHT
2009 };
2010
2011enum SB_TYPE
2012 {
2013 SB_ARITHMETIC,
2014 SB_LOGICAL
2015 };
2016
2017
2018enum SB_MODE
2019 {
2020 SB_REG_REG_N_EFF,
2021 SB_REG_REG_N,
2022 SB_REG_OPR_EFF,
2023 SB_ROT,
2024 SB_REG_OPR_OPR,
2025 SB_OPR_N
2026 };
2027
2028struct sb
2029{
2030 uint8_t mask;
2031 uint8_t value;
2032 enum SB_MODE mode;
2033};
2034
2035static const struct sb sb_table[] = {
2036 {0x30, 0x00, SB_REG_REG_N_EFF},
2037 {0x30, 0x10, SB_REG_REG_N},
2038 {0x34, 0x20, SB_REG_OPR_EFF},
2039 {0x34, 0x24, SB_ROT},
2040 {0x34, 0x30, SB_REG_OPR_OPR},
2041 {0x34, 0x34, SB_OPR_N},
2042};
2043
2044static int
2045shift_n_bytes (struct mem_read_abstraction_base *mra)
2046{
2047 bfd_byte sb;
2048 int status = mra->read (mra, 0, 1, &sb);
2049 if (status != 0)
2050 return status;
2051
2052 size_t i;
2053 enum SB_MODE mode = -1;
2054 for (i = 0; i < sizeof (sb_table) / sizeof (sb_table[0]); ++i)
2055 {
2056 const struct sb *sbe = sb_table + i;
2057 if ((sb & sbe->mask) == sbe->value)
2058 mode = sbe->mode;
2059 }
2060
2061 switch (mode)
2062 {
2063 case SB_REG_REG_N_EFF:
2064 return 2;
2065 break;
2066 case SB_REG_OPR_EFF:
2067 case SB_ROT:
2068 return 2 + x_opr_n_bytes (mra, 1);
2069 break;
2070 case SB_REG_OPR_OPR:
2071 {
2072 int opr1 = x_opr_n_bytes (mra, 1);
2073 int opr2 = 0;
2074 if ((sb & 0x30) != 0x20)
2075 opr2 = x_opr_n_bytes (mra, opr1 + 1);
2076 return 2 + opr1 + opr2;
2077 }
2078 break;
2079 default:
2080 return 3;
2081 }
2082
2083 /* not reached */
2084 return -1;
2085}
2086\f
2087
2088static int
2089
2090mov_imm_opr_n_bytes (struct mem_read_abstraction_base *mra)
2091{
2092 bfd_byte byte;
2093 int status = mra->read (mra, -1, 1, &byte);
2094 if (status < 0)
2095 return status;
2096
2097 int size = byte - 0x0c + 1;
2098
2099 return size + x_opr_n_bytes (mra, size) + 1;
2100}
2101
2102static void
2103mov_imm_opr (struct mem_read_abstraction_base *mra,
2104 int *n_operands, struct operand **operand)
2105{
2106 bfd_byte byte;
2107 int status = mra->read (mra, -1, 1, &byte);
2108 if (status < 0)
2109 return ;
2110
2111 int size = byte - 0x0c + 1;
2112 uint32_t imm = decode_signed_value (mra, size);
2113
2114 operand[(*n_operands)++] = create_immediate_operand (imm);
2115 operand[(*n_operands)++] = x_opr_decode (mra, size);
2116}
2117
2118\f
2119
2120static void
2121ld_18bit_decode (struct mem_read_abstraction_base *mra,
2122 int *n_operands, struct operand **operand)
2123{
2124 size_t size = 3;
2125 bfd_byte buffer[3];
2126 int status = mra->read (mra, 0, 2, buffer + 1);
2127 if (status < 0)
2128 return ;
2129
2130 status = mra->read (mra, -1, 1, buffer);
2131 if (status < 0)
2132 return ;
2133
2134 buffer[0] = (buffer[0] & 0x30) >> 4;
2135
2136 size_t i;
2137 uint32_t imm = 0;
2138 for (i = 0; i < size; ++i)
2139 {
2140 imm |= buffer[i] << (8 * (size - i - 1));
2141 }
2142
2143 operand[(*n_operands)++] = create_immediate_operand (imm);
2144}
2145
2146\f
2147
2148/* Loop Primitives */
2149
2150enum LP_MODE {
2151 LP_REG,
2152 LP_XY,
2153 LP_OPR
2154};
2155
2156struct lp
2157{
2158 uint8_t mask;
2159 uint8_t value;
2160 enum LP_MODE mode;
2161};
2162
2163static const struct lp lp_mode[] = {
2164 {0x08, 0x00, LP_REG},
2165 {0x0C, 0x08, LP_XY},
2166 {0x0C, 0x0C, LP_OPR},
2167};
2168
2169
2170static int
2171loop_prim_n_bytes (struct mem_read_abstraction_base *mra)
2172{
2173 int mx = 0;
2174 uint8_t lb;
2175 mra->read (mra, mx++, 1, &lb);
2176
2177 enum LP_MODE mode = -1;
2178 size_t i;
2179 for (i = 0; i < sizeof (lp_mode) / sizeof (lp_mode[0]); ++i)
2180 {
2181 const struct lp *pb = lp_mode + i;
2182 if ((lb & pb->mask) == pb->value)
2183 {
2184 mode = pb->mode;
2185 break;
2186 }
2187 }
2188
2189 if (mode == LP_OPR)
2190 {
2191 mx += x_opr_n_bytes (mra, mx) ;
2192 }
2193
2194 uint8_t rb;
2195 mra->read (mra, mx++, 1, &rb);
2196 if (rb & 0x80)
2197 mx++;
2198
2199 return mx + 1;
2200}
2201
2202
2203\f
2204
e5a557ac 2205static enum optr
0a6aef6b
AM
2206exg_sex_discrim (struct mem_read_abstraction_base *mra,
2207 enum optr hint ATTRIBUTE_UNUSED)
ef1ad42b
JD
2208{
2209 uint8_t eb;
2210 int status = mra->read (mra, 0, 1, &eb);
0a6aef6b 2211 enum optr operator = OP_INVALID;
ef1ad42b 2212 if (status < 0)
0a6aef6b 2213 return operator;
ef1ad42b
JD
2214
2215 struct operand *op0 = create_register_operand ((eb & 0xf0) >> 4);
2216 struct operand *op1 = create_register_operand (eb & 0xf);
2217
66a66a17 2218 int reg0 = ((struct register_operand *) op0)->reg;
66a66a17 2219 int reg1 = ((struct register_operand *) op1)->reg;
0a6aef6b
AM
2220 if (reg0 >= 0 && reg0 < S12Z_N_REGISTERS
2221 && reg1 >= 0 && reg1 < S12Z_N_REGISTERS)
2222 {
2223 const struct reg *r0 = registers + reg0;
2224 const struct reg *r1 = registers + reg1;
ef1ad42b 2225
0a6aef6b
AM
2226 operator = r0->bytes < r1->bytes ? OP_sex : OP_exg;
2227 }
ef1ad42b
JD
2228
2229 free (op0);
2230 free (op1);
0a6aef6b 2231
ef1ad42b
JD
2232 return operator;
2233}
2234
2235
2236static void
2237exg_sex_decode (struct mem_read_abstraction_base *mra,
2238 int *n_operands, struct operand **operands)
2239{
2240 uint8_t eb;
2241 int status = mra->read (mra, 0, 1, &eb);
2242 if (status < 0)
2243 return;
2244
2245 /* Ship out the operands. */
2246 operands[(*n_operands)++] = create_register_operand ((eb & 0xf0) >> 4);
2247 operands[(*n_operands)++] = create_register_operand (eb & 0xf);
2248}
2249
e5a557ac 2250static enum optr
ef1ad42b 2251loop_primitive_discrim (struct mem_read_abstraction_base *mra,
e5a557ac 2252 enum optr hint ATTRIBUTE_UNUSED)
ef1ad42b
JD
2253{
2254 uint8_t lb;
2255 int status = mra->read (mra, 0, 1, &lb);
2256 if (status < 0)
2257 return OP_INVALID;
2258
e5a557ac 2259 enum optr opbase = (lb & 0x80) ? OP_dbNE : OP_tbNE;
ef1ad42b
JD
2260 return opbase + ((lb & 0x70) >> 4);
2261}
2262
2263static void
2264loop_primitive_decode (struct mem_read_abstraction_base *mra,
e7c22a69 2265 int *n_operands, struct operand **operands)
ef1ad42b
JD
2266{
2267 int offs = 1;
2268 uint8_t lb;
2269 int status = mra->read (mra, 0, 1, &lb);
2270 if (status < 0)
2271 return ;
2272
2273 enum LP_MODE mode = -1;
2274 size_t i;
2275 for (i = 0; i < sizeof (lp_mode) / sizeof (lp_mode[0]); ++i)
2276 {
2277 const struct lp *pb = lp_mode + i;
2278 if ((lb & pb->mask) == pb->value)
2279 {
2280 mode = pb->mode;
2281 break;
2282 }
2283 }
2284
2285 switch (mode)
2286 {
2287 case LP_REG:
2288 operands[(*n_operands)++] = create_register_operand (lb & 0x07);
2289 break;
2290 case LP_XY:
2291 operands[(*n_operands)++] =
2292 create_register_operand ((lb & 0x01) + REG_X);
2293 break;
2294 case LP_OPR:
2295 offs += x_opr_n_bytes (mra, 1);
2296 operands[(*n_operands)++] = x_opr_decode_with_size (mra, 1, lb & 0x03);
2297 break;
2298 }
2299
2300 rel_15_7 (mra, offs + 1, n_operands, operands);
2301}
2302
2303
e5a557ac 2304static enum optr
e7c22a69
AM
2305shift_discrim (struct mem_read_abstraction_base *mra,
2306 enum optr hint ATTRIBUTE_UNUSED)
ef1ad42b
JD
2307{
2308 size_t i;
2309 uint8_t sb;
2310 int status = mra->read (mra, 0, 1, &sb);
2311 if (status < 0)
4a90ce95 2312 return OP_INVALID;
ef1ad42b
JD
2313
2314 enum SB_DIR dir = (sb & 0x40) ? SB_LEFT : SB_RIGHT;
2315 enum SB_TYPE type = (sb & 0x80) ? SB_ARITHMETIC : SB_LOGICAL;
2316 enum SB_MODE mode = -1;
2317 for (i = 0; i < sizeof (sb_table) / sizeof (sb_table[0]); ++i)
2318 {
2319 const struct sb *sbe = sb_table + i;
2320 if ((sb & sbe->mask) == sbe->value)
2321 mode = sbe->mode;
2322 }
2323
2324 if (mode == SB_ROT)
2325 return (dir == SB_LEFT) ? OP_rol : OP_ror;
2326
2327 if (type == SB_LOGICAL)
2328 return (dir == SB_LEFT) ? OP_lsl : OP_lsr;
2329
2330 return (dir == SB_LEFT) ? OP_asl : OP_asr;
2331}
2332
2333
2334static void
e7c22a69
AM
2335shift_decode (struct mem_read_abstraction_base *mra, int *n_operands,
2336 struct operand **operands)
ef1ad42b
JD
2337{
2338 size_t i;
2339
2340 uint8_t byte;
2341 int status = mra->read (mra, -1, 1, &byte);
2342 if (status < 0)
2343 return ;
2344
2345 uint8_t sb;
2346 status = mra->read (mra, 0, 1, &sb);
2347 if (status < 0)
2348 return ;
2349
2350 enum SB_MODE mode = -1;
2351 for (i = 0; i < sizeof (sb_table) / sizeof (sb_table[0]); ++i)
2352 {
2353 const struct sb *sbe = sb_table + i;
2354 if ((sb & sbe->mask) == sbe->value)
2355 mode = sbe->mode;
2356 }
2357
2358 short osize = -1;
2359 switch (mode)
2360 {
2361 case SB_REG_OPR_EFF:
2362 case SB_ROT:
2363 case SB_REG_OPR_OPR:
2364 osize = sb & 0x03;
2365 break;
2366 case SB_OPR_N:
2367 {
2368 uint8_t xb;
2369 mra->read (mra, 1, 1, &xb);
2370 /* The size suffix is not printed if the OPR operand refers
2371 directly to a register, because the size is implied by the
2372 size of that register. */
2373 if ((xb & 0xF8) != 0xB8)
2374 osize = sb & 0x03;
2375 }
2376 break;
2377 default:
2378 break;
2379 };
2380
2381 /* Destination register */
2382 switch (mode)
2383 {
2384 case SB_REG_REG_N_EFF:
2385 case SB_REG_REG_N:
2386 operands[(*n_operands)++] = create_register_operand (byte & 0x07);
2387 break;
2388 case SB_REG_OPR_EFF:
2389 case SB_REG_OPR_OPR:
2390 operands[(*n_operands)++] = create_register_operand (byte & 0x07);
2391 break;
2392
2393 case SB_ROT:
2394 operands[(*n_operands)++] = x_opr_decode_with_size (mra, 1, osize);
2395 break;
2396
2397 default:
2398 break;
2399 }
2400
2401 /* Source register */
2402 switch (mode)
2403 {
2404 case SB_REG_REG_N_EFF:
2405 case SB_REG_REG_N:
2406 operands[(*n_operands)++] =
2407 create_register_operand_with_size (sb & 0x07, osize);
2408 break;
2409
2410 case SB_REG_OPR_OPR:
2411 operands[(*n_operands)++] = x_opr_decode_with_size (mra, 1, osize);
2412 break;
2413
2414 default:
2415 break;
2416 }
2417
2418 /* 3rd arg */
2419 switch (mode)
2420 {
2421 case SB_REG_OPR_EFF:
2422 case SB_OPR_N:
2423 operands[(*n_operands)++] = x_opr_decode_with_size (mra, 1, osize);
2424 break;
2425
2426 case SB_REG_REG_N:
2427 {
e7c22a69
AM
2428 uint8_t xb;
2429 mra->read (mra, 1, 1, &xb);
2430
2431 /* This case is slightly unusual.
2432 If XB matches the binary pattern 0111XXXX, then instead of
2433 interpreting this as a general OPR postbyte in the IMMe4 mode,
2434 the XB byte is interpreted in s special way. */
2435 if ((xb & 0xF0) == 0x70)
2436 {
2437 if (byte & 0x10)
2438 {
2439 int shift = ((sb & 0x08) >> 3) | ((xb & 0x0f) << 1);
2440 operands[(*n_operands)++] = create_immediate_operand (shift);
2441 }
2442 else
2443 {
2444 /* This should not happen. */
2445 abort ();
2446 }
2447 }
2448 else
2449 {
2450 operands[(*n_operands)++] = x_opr_decode (mra, 1);
2451 }
ef1ad42b
JD
2452 }
2453 break;
2454 case SB_REG_OPR_OPR:
2455 {
2456 uint8_t xb;
2457 int n = x_opr_n_bytes (mra, 1);
2458 mra->read (mra, 1 + n, 1, &xb);
2459
2460 if ((xb & 0xF0) == 0x70)
2461 {
2462 int imm = xb & 0x0F;
2463 imm <<= 1;
2464 imm |= (sb & 0x08) >> 3;
2465 operands[(*n_operands)++] = create_immediate_operand (imm);
2466 }
2467 else
2468 {
2469 operands[(*n_operands)++] = x_opr_decode (mra, 1 + n);
2470 }
2471 }
2472 break;
2473 default:
2474 break;
2475 }
2476
2477 switch (mode)
2478 {
2479 case SB_REG_REG_N_EFF:
2480 case SB_REG_OPR_EFF:
2481 case SB_OPR_N:
2482 {
e7c22a69
AM
2483 int imm = (sb & 0x08) ? 2 : 1;
2484 operands[(*n_operands)++] = create_immediate_operand (imm);
ef1ad42b
JD
2485 }
2486 break;
2487
2488 default:
2489 break;
2490 }
2491}
2492
e5a557ac 2493static enum optr
ef1ad42b 2494psh_pul_discrim (struct mem_read_abstraction_base *mra,
e5a557ac 2495 enum optr hint ATTRIBUTE_UNUSED)
ef1ad42b
JD
2496{
2497 uint8_t byte;
2498 int status = mra->read (mra, 0, 1, &byte);
2499 if (status != 0)
2500 return OP_INVALID;
2501
2502 return (byte & 0x80) ? OP_pull: OP_push;
2503}
2504
2505
2506static void
2507psh_pul_decode (struct mem_read_abstraction_base *mra,
2508 int *n_operands, struct operand **operand)
2509{
2510 uint8_t byte;
2511 int status = mra->read (mra, 0, 1, &byte);
2512 if (status != 0)
2513 return;
2514 int bit;
2515 if (byte & 0x40)
2516 {
2517 if ((byte & 0x3F) == 0)
e7c22a69 2518 operand[(*n_operands)++] = create_register_all16_operand ();
ef1ad42b
JD
2519 else
2520 for (bit = 5; bit >= 0; --bit)
2521 {
2522 if (byte & (0x1 << bit))
2523 {
2524 operand[(*n_operands)++] = create_register_operand (oprregs2[bit]);
2525 }
2526 }
2527 }
2528 else
2529 {
2530 if ((byte & 0x3F) == 0)
e7c22a69 2531 operand[(*n_operands)++] = create_register_all_operand ();
ef1ad42b
JD
2532 else
2533 for (bit = 5; bit >= 0; --bit)
2534 {
2535 if (byte & (0x1 << bit))
2536 {
2537 operand[(*n_operands)++] = create_register_operand (oprregs1[bit]);
2538 }
2539 }
2540 }
2541}
2542
e5a557ac 2543static enum optr
e7c22a69
AM
2544bit_field_discrim (struct mem_read_abstraction_base *mra,
2545 enum optr hint ATTRIBUTE_UNUSED)
ef1ad42b
JD
2546{
2547 int status;
2548 bfd_byte bb;
2549 status = mra->read (mra, 0, 1, &bb);
2550 if (status != 0)
2551 return OP_INVALID;
2552
2553 return (bb & 0x80) ? OP_bfins : OP_bfext;
2554}
2555
2556static void
2557bit_field_decode (struct mem_read_abstraction_base *mra,
2558 int *n_operands, struct operand **operands)
2559{
2560 int status;
2561
2562 bfd_byte byte2;
2563 status = mra->read (mra, -1, 1, &byte2);
2564 if (status != 0)
2565 return;
2566
2567 bfd_byte bb;
2568 status = mra->read (mra, 0, 1, &bb);
2569 if (status != 0)
2570 return;
2571
2572 enum BB_MODE mode = -1;
2573 size_t i;
2574 const struct opr_bb *bbs = 0;
2575 for (i = 0; i < sizeof (bb_modes) / sizeof (bb_modes[0]); ++i)
2576 {
2577 bbs = bb_modes + i;
2578 if ((bb & bbs->mask) == bbs->value)
e7c22a69
AM
2579 {
2580 mode = bbs->mode;
2581 break;
2582 }
ef1ad42b
JD
2583 }
2584 int reg1 = byte2 & 0x07;
2585 /* First operand */
2586 switch (mode)
2587 {
2588 case BB_REG_REG_REG:
2589 case BB_REG_REG_IMM:
2590 case BB_REG_OPR_REG:
2591 case BB_REG_OPR_IMM:
2592 operands[(*n_operands)++] = create_register_operand (reg1);
2593 break;
2594 case BB_OPR_REG_REG:
2595 operands[(*n_operands)++] = x_opr_decode_with_size (mra, 1,
2596 (bb >> 2) & 0x03);
2597 break;
2598 case BB_OPR_REG_IMM:
2599 operands[(*n_operands)++] = x_opr_decode_with_size (mra, 2,
2600 (bb >> 2) & 0x03);
2601 break;
2602 }
2603
2604 /* Second operand */
2605 switch (mode)
2606 {
2607 case BB_REG_REG_REG:
2608 case BB_REG_REG_IMM:
2609 {
e7c22a69
AM
2610 int reg_src = (bb >> 2) & 0x07;
2611 operands[(*n_operands)++] = create_register_operand (reg_src);
ef1ad42b
JD
2612 }
2613 break;
2614 case BB_OPR_REG_REG:
2615 case BB_OPR_REG_IMM:
2616 {
e7c22a69
AM
2617 int reg_src = (byte2 & 0x07);
2618 operands[(*n_operands)++] = create_register_operand (reg_src);
ef1ad42b
JD
2619 }
2620 break;
2621 case BB_REG_OPR_REG:
2622 operands[(*n_operands)++] = x_opr_decode_with_size (mra, 1,
2623 (bb >> 2) & 0x03);
2624 break;
2625 case BB_REG_OPR_IMM:
2626 operands[(*n_operands)++] = x_opr_decode_with_size (mra, 2,
2627 (bb >> 2) & 0x03);
2628 break;
2629 }
2630
2631 /* Third operand */
2632 switch (mode)
2633 {
2634 case BB_REG_REG_REG:
2635 case BB_OPR_REG_REG:
2636 case BB_REG_OPR_REG:
2637 {
e7c22a69 2638 int reg_parm = bb & 0x03;
ef1ad42b
JD
2639 operands[(*n_operands)++] = create_register_operand (reg_parm);
2640 }
2641 break;
2642 case BB_REG_REG_IMM:
2643 case BB_OPR_REG_IMM:
2644 case BB_REG_OPR_IMM:
2645 {
e7c22a69
AM
2646 bfd_byte i1;
2647 mra->read (mra, 1, 1, &i1);
2648 int offset = i1 & 0x1f;
2649 int width = bb & 0x03;
2650 width <<= 3;
2651 width |= i1 >> 5;
2652 operands[(*n_operands)++] = create_bitfield_operand (width, offset);
ef1ad42b
JD
2653 }
2654 break;
2655 }
2656}
2657
2658
2659/* Decode the next instruction at MRA, according to OPC.
2660 The operation to be performed is returned.
2661 The number of operands, will be placed in N_OPERANDS.
2662 The operands themselved into OPERANDS. */
e5a557ac 2663static enum optr
ef1ad42b
JD
2664decode_operation (const struct opcode *opc,
2665 struct mem_read_abstraction_base *mra,
2666 int *n_operands, struct operand **operands)
2667{
e5a557ac 2668 enum optr op = opc->operator;
ef1ad42b
JD
2669 if (opc->discriminator)
2670 op = opc->discriminator (mra, opc->operator);
2671
2672 if (opc->operands)
2673 opc->operands (mra, n_operands, operands);
2674
2675 if (opc->operands2)
2676 opc->operands2 (mra, n_operands, operands);
2677
2678 return op;
2679}
2680
2681int
e5a557ac 2682decode_s12z (enum optr *myoperator, short *osize,
ef1ad42b
JD
2683 int *n_operands, struct operand **operands,
2684 struct mem_read_abstraction_base *mra)
2685{
2686 int n_bytes = 0;
2687 bfd_byte byte;
2688
2689 int status = mra->read (mra, 0, 1, &byte);
2690 if (status != 0)
2691 return status;
2692
2693 mra->advance (mra);
2694
2695 const struct opcode *opc = page1 + byte;
2696 if (byte == PAGE2_PREBYTE)
2697 {
2698 /* Opcodes in page2 have an additional byte */
2699 n_bytes++;
2700
2701 bfd_byte byte2;
2702 mra->read (mra, 0, 1, &byte2);
2703 mra->advance (mra);
2704 opc = page2 + byte2;
2705 }
2706 *myoperator = decode_operation (opc, mra, n_operands, operands);
2707 *osize = opc->osize;
2708
2709 /* Return the number of bytes in the instruction. */
2710 n_bytes += (opc && opc->insn_bytes) ? opc->insn_bytes (mra) : 0;
2711
2712 return n_bytes;
2713}
2714
This page took 0.192831 seconds and 4 git commands to generate.