Coverage Report

Created: 2026-07-25 10:20

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