Coverage Report

Created: 2026-10-02 09:53

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/binutils-gdb/opcodes/m10300-dis.c
Line
Count
Source
1
/* Disassemble MN10300 instructions.
2
   Copyright (C) 1996-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 "opcode/mn10300.h"
24
#include "disassemble.h"
25
#include "opintl.h"
26
27
6.77k
#define HAVE_AM33_2 (info->mach == AM33_2)
28
5.56k
#define HAVE_AM33   (info->mach == AM33 || HAVE_AM33_2)
29
110
#define HAVE_AM30   (info->mach == AM30)
30
31
static void
32
disassemble (bfd_vma memaddr,
33
       struct disassemble_info *info,
34
       unsigned long insn,
35
       unsigned int size)
36
305k
{
37
305k
  struct mn10300_opcode *op = (struct mn10300_opcode *) mn10300_opcodes;
38
305k
  const struct mn10300_operand *operand;
39
305k
  bfd_byte buffer[4];
40
305k
  unsigned long extension = 0;
41
305k
  int status, match = 0;
42
43
  /* Find the opcode.  */
44
92.0M
  while (op->name)
45
92.0M
    {
46
92.0M
      int mysize, extra_shift;
47
48
92.0M
      if (op->format == FMT_S0)
49
3.69M
  mysize = 1;
50
88.3M
      else if (op->format == FMT_S1
51
84.4M
         || op->format == FMT_D0)
52
18.0M
  mysize = 2;
53
70.2M
      else if (op->format == FMT_S2
54
68.3M
         || op->format == FMT_D1)
55
9.54M
  mysize = 3;
56
60.7M
      else if (op->format == FMT_S4)
57
98.0k
  mysize = 5;
58
60.6M
      else if (op->format == FMT_D2)
59
6.41M
  mysize = 4;
60
54.1M
      else if (op->format == FMT_D3)
61
196k
  mysize = 5;
62
53.9M
      else if (op->format == FMT_D4)
63
7.90M
  mysize = 6;
64
46.0M
      else if (op->format == FMT_D6)
65
12.2M
  mysize = 3;
66
33.8M
      else if (op->format == FMT_D7 || op->format == FMT_D10)
67
16.2M
  mysize = 4;
68
17.6M
      else if (op->format == FMT_D8)
69
8.17M
  mysize = 6;
70
9.47M
      else if (op->format == FMT_D9)
71
9.23M
  mysize = 7;
72
244k
      else
73
244k
  mysize = 7;
74
75
92.0M
      if ((op->mask & insn) == op->opcode
76
333k
    && size == (unsigned int) mysize
77
301k
    && (op->machine == 0
78
8.57k
        || (op->machine == AM33_2 && HAVE_AM33_2)
79
6.68k
        || (op->machine == AM33 && HAVE_AM33)
80
2.27k
        || (op->machine == AM30 && HAVE_AM30)))
81
299k
  {
82
299k
    const unsigned char *opindex_ptr;
83
299k
    unsigned int nocomma;
84
299k
    int paren = 0;
85
86
299k
    if (op->format == FMT_D1 || op->format == FMT_S1)
87
39.6k
      extra_shift = 8;
88
259k
    else if (op->format == FMT_D2 || op->format == FMT_D4
89
254k
       || op->format == FMT_S2 || op->format == FMT_S4
90
220k
       || op->format == FMT_S6 || op->format == FMT_D5)
91
39.9k
      extra_shift = 16;
92
219k
    else if (op->format == FMT_D7
93
218k
       || op->format == FMT_D8
94
217k
       || op->format == FMT_D9)
95
2.67k
      extra_shift = 8;
96
217k
    else
97
217k
      extra_shift = 0;
98
99
299k
    if (size == 1 || size == 2)
100
253k
      extension = 0;
101
102
45.7k
    else if (size == 3
103
35.0k
       && (op->format == FMT_D1
104
33.5k
           || op->opcode == 0xdf0000
105
32.7k
           || op->opcode == 0xde0000))
106
2.78k
      extension = 0;
107
108
42.9k
    else if (size == 3
109
32.2k
       && op->format == FMT_D6)
110
1.01k
      extension = 0;
111
112
41.9k
    else if (size == 3)
113
31.2k
      {
114
31.2k
        insn &= 0xff0000;
115
31.2k
        status = (*info->read_memory_func) (memaddr + 1, buffer, 2, info);
116
31.2k
        if (status != 0)
117
0
    {
118
0
      (*info->memory_error_func) (status, memaddr, info);
119
0
      return;
120
0
    }
121
122
31.2k
        insn |= bfd_getl16 (buffer);
123
31.2k
        extension = 0;
124
31.2k
      }
125
10.6k
    else if (size == 4
126
5.16k
       && (op->opcode == 0xfaf80000
127
3.70k
           || op->opcode == 0xfaf00000
128
3.45k
           || op->opcode == 0xfaf40000))
129
1.91k
      extension = 0;
130
131
8.78k
    else if (size == 4
132
3.25k
       && (op->format == FMT_D7
133
1.98k
           || op->format == FMT_D10))
134
1.73k
      extension = 0;
135
136
7.04k
    else if (size == 4)
137
1.51k
      {
138
1.51k
        insn &= 0xffff0000;
139
1.51k
        status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
140
1.51k
        if (status != 0)
141
0
    {
142
0
      (*info->memory_error_func) (status, memaddr, info);
143
0
      return;
144
0
    }
145
146
1.51k
        insn |= bfd_getl16 (buffer);
147
1.51k
        extension = 0;
148
1.51k
      }
149
5.52k
    else if (size == 5 && op->opcode == 0xdc000000)
150
514
      {
151
514
        unsigned long temp = 0;
152
153
514
        status = (*info->read_memory_func) (memaddr + 1, buffer, 4, info);
154
514
        if (status != 0)
155
2
    {
156
2
      (*info->memory_error_func) (status, memaddr, info);
157
2
      return;
158
2
    }
159
512
        temp |= bfd_getl32 (buffer);
160
161
512
        insn &= 0xff000000;
162
512
        insn |= (temp & 0xffffff00) >> 8;
163
512
        extension = temp & 0xff;
164
512
      }
165
5.01k
    else if (size == 5 && op->format == FMT_D3)
166
82
      {
167
82
        status = (*info->read_memory_func) (memaddr + 2, buffer, 2, info);
168
82
        if (status != 0)
169
0
    {
170
0
      (*info->memory_error_func) (status, memaddr, info);
171
0
      return;
172
0
    }
173
82
        insn &= 0xffff0000;
174
82
        insn |= bfd_getl16 (buffer);
175
176
82
        status = (*info->read_memory_func) (memaddr + 4, buffer, 1, info);
177
82
        if (status != 0)
178
0
    {
179
0
      (*info->memory_error_func) (status, memaddr, info);
180
0
      return;
181
0
    }
182
82
        extension = *(unsigned char *) buffer;
183
82
      }
184
4.93k
    else if (size == 5)
185
551
      {
186
551
        unsigned long temp = 0;
187
188
551
        status = (*info->read_memory_func) (memaddr + 1, buffer, 2, info);
189
551
        if (status != 0)
190
0
    {
191
0
      (*info->memory_error_func) (status, memaddr, info);
192
0
      return;
193
0
    }
194
551
        temp |= bfd_getl16 (buffer);
195
196
551
        insn &= 0xff0000ff;
197
551
        insn |= temp << 8;
198
199
551
        status = (*info->read_memory_func) (memaddr + 4, buffer, 1, info);
200
551
        if (status != 0)
201
2
    {
202
2
      (*info->memory_error_func) (status, memaddr, info);
203
2
      return;
204
2
    }
205
549
        extension = *(unsigned char *) buffer;
206
549
      }
207
4.38k
    else if (size == 6 && op->format == FMT_D8)
208
656
      {
209
656
        insn &= 0xffffff00;
210
656
        status = (*info->read_memory_func) (memaddr + 5, buffer, 1, info);
211
656
        if (status != 0)
212
4
    {
213
4
      (*info->memory_error_func) (status, memaddr, info);
214
4
      return;
215
4
    }
216
652
        insn |= *(unsigned char *) buffer;
217
218
652
        status = (*info->read_memory_func) (memaddr + 3, buffer, 2, info);
219
652
        if (status != 0)
220
0
    {
221
0
      (*info->memory_error_func) (status, memaddr, info);
222
0
      return;
223
0
    }
224
652
        extension = bfd_getl16 (buffer);
225
652
      }
226
3.72k
    else if (size == 6)
227
2.11k
      {
228
2.11k
        unsigned long temp = 0;
229
230
2.11k
        status = (*info->read_memory_func) (memaddr + 2, buffer, 4, info);
231
2.11k
        if (status != 0)
232
4
    {
233
4
      (*info->memory_error_func) (status, memaddr, info);
234
4
      return;
235
4
    }
236
2.10k
        temp |= bfd_getl32 (buffer);
237
238
2.10k
        insn &= 0xffff0000;
239
2.10k
        insn |= (temp >> 16) & 0xffff;
240
2.10k
        extension = temp & 0xffff;
241
2.10k
      }
242
1.61k
    else if (size == 7 && op->format == FMT_D9)
243
745
      {
244
745
        insn &= 0xffffff00;
245
745
        status = (*info->read_memory_func) (memaddr + 3, buffer, 4, info);
246
745
        if (status != 0)
247
3
    {
248
3
      (*info->memory_error_func) (status, memaddr, info);
249
3
      return;
250
3
    }
251
742
        extension = bfd_getl32 (buffer);
252
742
        insn |= (extension & 0xff000000) >> 24;
253
742
        extension &= 0xffffff;
254
742
      }
255
868
    else if (size == 7 && op->opcode == 0xdd000000)
256
594
      {
257
594
        unsigned long temp = 0;
258
259
594
        status = (*info->read_memory_func) (memaddr + 1, buffer, 4, info);
260
594
        if (status != 0)
261
8
    {
262
8
      (*info->memory_error_func) (status, memaddr, info);
263
8
      return;
264
8
    }
265
586
        temp |= bfd_getl32 (buffer);
266
267
586
        insn &= 0xff000000;
268
586
        insn |= (temp >> 8) & 0xffffff;
269
586
        extension = (temp & 0xff) << 16;
270
271
586
        status = (*info->read_memory_func) (memaddr + 5, buffer, 2, info);
272
586
        if (status != 0)
273
5
    {
274
5
      (*info->memory_error_func) (status, memaddr, info);
275
5
      return;
276
5
    }
277
581
        extension |= bfd_getb16 (buffer);
278
581
      }
279
274
    else if (size == 7)
280
274
      {
281
274
        unsigned long temp = 0;
282
283
274
        status = (*info->read_memory_func) (memaddr + 2, buffer, 4, info);
284
274
        if (status != 0)
285
2
    {
286
2
      (*info->memory_error_func) (status, memaddr, info);
287
2
      return;
288
2
    }
289
272
        temp |= bfd_getl32 (buffer);
290
291
272
        insn &= 0xffff0000;
292
272
        insn |= (temp >> 16) & 0xffff;
293
272
        extension = (temp & 0xffff) << 8;
294
295
272
        status = (*info->read_memory_func) (memaddr + 6, buffer, 1, info);
296
272
        if (status != 0)
297
1
    {
298
1
      (*info->memory_error_func) (status, memaddr, info);
299
1
      return;
300
1
    }
301
271
        extension |= *(unsigned char *) buffer;
302
271
      }
303
304
299k
    match = 1;
305
299k
    (*info->fprintf_func) (info->stream, "%s\t", op->name);
306
307
    /* Now print the operands.  */
308
299k
    for (opindex_ptr = op->operands, nocomma = 1;
309
897k
         *opindex_ptr != 0;
310
598k
         opindex_ptr++)
311
598k
      {
312
598k
        unsigned long value;
313
314
598k
        operand = &mn10300_operands[*opindex_ptr];
315
316
        /* If this operand is a PLUS (autoincrement), then do not emit
317
     a comma before emitting the plus.  */
318
598k
        if ((operand->flags & MN10300_OPERAND_PLUS) != 0)
319
432
    nocomma = 1;
320
321
598k
        if ((operand->flags & MN10300_OPERAND_DREG) != 0
322
374k
      || (operand->flags & MN10300_OPERAND_AREG) != 0
323
278k
      || (operand->flags & MN10300_OPERAND_RREG) != 0
324
273k
      || (operand->flags & MN10300_OPERAND_XRREG) != 0)
325
326k
    value = ((insn >> (operand->shift + extra_shift))
326
326k
       & ((1 << operand->bits) - 1));
327
271k
        else if ((operand->flags & MN10300_OPERAND_SPLIT) != 0)
328
4.21k
    {
329
4.21k
      unsigned long temp;
330
331
4.21k
      value = insn & ((1 << operand->bits) - 1);
332
4.21k
      value <<= (32 - operand->bits);
333
4.21k
      temp = extension >> operand->shift;
334
4.21k
      temp &= ((1 << (32 - operand->bits)) - 1);
335
4.21k
      value |= temp;
336
4.21k
      value = ((value ^ (((unsigned long) 1) << 31))
337
4.21k
         - (((unsigned long) 1) << 31));
338
4.21k
    }
339
267k
        else if ((operand->flags & MN10300_OPERAND_24BIT) != 0)
340
652
    {
341
652
      unsigned long temp;
342
343
652
      value = insn & ((1 << operand->bits) - 1);
344
652
      value <<= (24 - operand->bits);
345
652
      temp = extension >> operand->shift;
346
652
      temp &= ((1 << (24 - operand->bits)) - 1);
347
652
      value |= temp;
348
652
      if ((operand->flags & MN10300_OPERAND_SIGNED) != 0)
349
411
        value = ((value & 0xffffff) ^ 0x800000) - 0x800000;
350
652
    }
351
267k
        else if ((operand->flags & (MN10300_OPERAND_FSREG
352
267k
            | MN10300_OPERAND_FDREG)))
353
1.51k
    {
354
      /* See m10300-opc.c just before #define FSM0 for an
355
         explanation of these variables.  Note that
356
         FMT-implied shifts are not taken into account for
357
         FP registers.  */
358
1.51k
      unsigned long mask_low, mask_high;
359
1.51k
      int shl_low, shr_high, shl_high;
360
361
1.51k
      switch (operand->bits)
362
1.51k
        {
363
1.42k
        case 5:
364
          /* Handle regular FP registers.  */
365
1.42k
          if (operand->shift >= 0)
366
1.13k
      {
367
        /* This is an `m' register.  */
368
1.13k
        shl_low = operand->shift;
369
1.13k
        shl_high = 8 + (8 & shl_low) + (shl_low & 4) / 4;
370
1.13k
      }
371
288
          else
372
288
      {
373
        /* This is an `n' register.  */
374
288
        shl_low = -operand->shift;
375
288
        shl_high = shl_low / 4;
376
288
      }
377
1.42k
          mask_low = 0x0f;
378
1.42k
          mask_high = 0x10;
379
1.42k
          shr_high = 4;
380
1.42k
          break;
381
382
90
        case 3:
383
          /* Handle accumulators.  */
384
90
          shl_low = -operand->shift;
385
90
          shl_high = 0;
386
90
          mask_low = 0x03;
387
90
          mask_high = 0x04;
388
90
          shr_high = 2;
389
90
          break;
390
391
0
        default:
392
0
          abort ();
393
1.51k
        }
394
1.51k
      value = ((((insn >> shl_high) << shr_high) & mask_high)
395
1.51k
         | ((insn >> shl_low) & mask_low));
396
1.51k
    }
397
265k
        else if ((operand->flags & MN10300_OPERAND_EXTENDED) != 0)
398
2.06k
    value = ((extension >> (operand->shift))
399
2.06k
       & ((1 << operand->bits) - 1));
400
401
263k
        else
402
263k
    value = ((insn >> (operand->shift))
403
263k
       & ((1 << operand->bits) - 1));
404
405
598k
        if ((operand->flags & MN10300_OPERAND_SIGNED) != 0
406
      /* These are properly extended by the code above.  */
407
28.6k
      && ((operand->flags & MN10300_OPERAND_24BIT) == 0))
408
28.2k
    value = ((value ^ (((unsigned long) 1) << (operand->bits - 1)))
409
28.2k
       - (((unsigned long) 1) << (operand->bits - 1)));
410
411
598k
        if (!nocomma
412
257k
      && (!paren
413
96.8k
          || ((operand->flags & MN10300_OPERAND_PAREN) == 0)))
414
176k
    (*info->fprintf_func) (info->stream, ",");
415
416
598k
        nocomma = 0;
417
418
598k
        if ((operand->flags & MN10300_OPERAND_DREG) != 0)
419
224k
    (*info->fprintf_func) (info->stream, "d%d", (int) value);
420
421
374k
        else if ((operand->flags & MN10300_OPERAND_AREG) != 0)
422
95.4k
    (*info->fprintf_func) (info->stream, "a%d", (int) value);
423
424
278k
        else if ((operand->flags & MN10300_OPERAND_SP) != 0)
425
17.8k
    (*info->fprintf_func) (info->stream, "sp");
426
427
260k
        else if ((operand->flags & MN10300_OPERAND_PSW) != 0)
428
508
    (*info->fprintf_func) (info->stream, "psw");
429
430
260k
        else if ((operand->flags & MN10300_OPERAND_MDR) != 0)
431
394
    (*info->fprintf_func) (info->stream, "mdr");
432
433
260k
        else if ((operand->flags & MN10300_OPERAND_RREG) != 0)
434
5.75k
    {
435
5.75k
      if (value < 8)
436
3.88k
        (*info->fprintf_func) (info->stream, "r%d", (int) value);
437
1.86k
      else if (value < 12)
438
615
        (*info->fprintf_func) (info->stream, "a%d", (int) value - 8);
439
1.25k
      else
440
1.25k
        (*info->fprintf_func) (info->stream, "d%d", (int) value - 12);
441
5.75k
    }
442
443
254k
        else if ((operand->flags & MN10300_OPERAND_XRREG) != 0)
444
1.08k
    {
445
1.08k
      if (value == 0)
446
518
        (*info->fprintf_func) (info->stream, "sp");
447
570
      else
448
570
        (*info->fprintf_func) (info->stream, "xr%d", (int) value);
449
1.08k
    }
450
451
253k
        else if ((operand->flags & MN10300_OPERAND_FSREG) != 0)
452
865
    (*info->fprintf_func) (info->stream, "fs%d", (int) value);
453
454
252k
        else if ((operand->flags & MN10300_OPERAND_FDREG) != 0)
455
649
    (*info->fprintf_func) (info->stream, "fd%d", (int) value);
456
457
251k
        else if ((operand->flags & MN10300_OPERAND_FPCR) != 0)
458
629
    (*info->fprintf_func) (info->stream, "fpcr");
459
460
251k
        else if ((operand->flags & MN10300_OPERAND_USP) != 0)
461
158
    (*info->fprintf_func) (info->stream, "usp");
462
463
250k
        else if ((operand->flags & MN10300_OPERAND_SSP) != 0)
464
335
    (*info->fprintf_func) (info->stream, "ssp");
465
466
250k
        else if ((operand->flags & MN10300_OPERAND_MSP) != 0)
467
180
    (*info->fprintf_func) (info->stream, "msp");
468
469
250k
        else if ((operand->flags & MN10300_OPERAND_PC) != 0)
470
269
    (*info->fprintf_func) (info->stream, "pc");
471
472
250k
        else if ((operand->flags & MN10300_OPERAND_EPSW) != 0)
473
556
    (*info->fprintf_func) (info->stream, "epsw");
474
475
249k
        else if ((operand->flags & MN10300_OPERAND_PLUS) != 0)
476
432
    (*info->fprintf_func) (info->stream, "+");
477
478
249k
        else if ((operand->flags & MN10300_OPERAND_PAREN) != 0)
479
161k
    {
480
161k
      if (paren)
481
80.8k
        (*info->fprintf_func) (info->stream, ")");
482
80.8k
      else
483
80.8k
        {
484
80.8k
          (*info->fprintf_func) (info->stream, "(");
485
80.8k
          nocomma = 1;
486
80.8k
        }
487
161k
      paren = !paren;
488
161k
    }
489
490
87.4k
        else if ((operand->flags & MN10300_OPERAND_PCREL) != 0)
491
8.68k
    (*info->print_address_func) ((long) value + memaddr, info);
492
493
78.7k
        else if ((operand->flags & MN10300_OPERAND_MEMADDR) != 0)
494
23.8k
    (*info->print_address_func) (value, info);
495
496
54.8k
        else if ((operand->flags & MN10300_OPERAND_REG_LIST) != 0)
497
6.41k
    {
498
6.41k
      int comma = 0;
499
500
6.41k
      (*info->fprintf_func) (info->stream, "[");
501
6.41k
      if (value & 0x80)
502
2.55k
        {
503
2.55k
          (*info->fprintf_func) (info->stream, "d2");
504
2.55k
          comma = 1;
505
2.55k
        }
506
507
6.41k
      if (value & 0x40)
508
3.02k
        {
509
3.02k
          if (comma)
510
2.20k
      (*info->fprintf_func) (info->stream, ",");
511
3.02k
          (*info->fprintf_func) (info->stream, "d3");
512
3.02k
          comma = 1;
513
3.02k
        }
514
515
6.41k
      if (value & 0x20)
516
1.77k
        {
517
1.77k
          if (comma)
518
1.11k
      (*info->fprintf_func) (info->stream, ",");
519
1.77k
          (*info->fprintf_func) (info->stream, "a2");
520
1.77k
          comma = 1;
521
1.77k
        }
522
523
6.41k
      if (value & 0x10)
524
1.77k
        {
525
1.77k
          if (comma)
526
1.46k
      (*info->fprintf_func) (info->stream, ",");
527
1.77k
          (*info->fprintf_func) (info->stream, "a3");
528
1.77k
          comma = 1;
529
1.77k
        }
530
531
6.41k
      if (value & 0x08)
532
3.81k
        {
533
3.81k
          if (comma)
534
2.90k
      (*info->fprintf_func) (info->stream, ",");
535
3.81k
          (*info->fprintf_func) (info->stream, "other");
536
3.81k
          comma = 1;
537
3.81k
        }
538
539
6.41k
      if (value & 0x04)
540
3.42k
        {
541
3.42k
          if (comma)
542
3.07k
      (*info->fprintf_func) (info->stream, ",");
543
3.42k
          (*info->fprintf_func) (info->stream, "exreg0");
544
3.42k
          comma = 1;
545
3.42k
        }
546
6.41k
      if (value & 0x02)
547
3.40k
        {
548
3.40k
          if (comma)
549
3.17k
      (*info->fprintf_func) (info->stream, ",");
550
3.40k
          (*info->fprintf_func) (info->stream, "exreg1");
551
3.40k
          comma = 1;
552
3.40k
        }
553
6.41k
      if (value & 0x01)
554
2.94k
        {
555
2.94k
          if (comma)
556
2.83k
      (*info->fprintf_func) (info->stream, ",");
557
2.94k
          (*info->fprintf_func) (info->stream, "exother");
558
2.94k
          comma = 1;
559
2.94k
        }
560
6.41k
      (*info->fprintf_func) (info->stream, "]");
561
6.41k
    }
562
563
48.4k
        else
564
48.4k
    (*info->fprintf_func) (info->stream, "%ld", (long) value);
565
598k
      }
566
    /* All done. */
567
299k
    break;
568
299k
  }
569
91.7M
      op++;
570
91.7M
    }
571
572
304k
  if (!match)
573
    /* xgettext:c-format */
574
5.58k
    (*info->fprintf_func) (info->stream, _("unknown\t0x%04lx"), insn);
575
304k
}
576
577
int
578
print_insn_mn10300 (bfd_vma memaddr, struct disassemble_info *info)
579
305k
{
580
305k
  int status;
581
305k
  bfd_byte buffer[4];
582
305k
  unsigned long insn;
583
305k
  unsigned int consume;
584
585
  /* First figure out how big the opcode is.  */
586
305k
  status = (*info->read_memory_func) (memaddr, buffer, 1, info);
587
305k
  if (status != 0)
588
1
    {
589
1
      (*info->memory_error_func) (status, memaddr, info);
590
1
      return -1;
591
1
    }
592
305k
  insn = *(unsigned char *) buffer;
593
594
  /* These are one byte insns.  */
595
305k
  if ((insn & 0xf3) == 0x00
596
235k
      || (insn & 0xf0) == 0x10
597
224k
      || (insn & 0xfc) == 0x3c
598
220k
      || (insn & 0xf3) == 0x41
599
217k
      || (insn & 0xf3) == 0x40
600
213k
      || (insn & 0xfc) == 0x50
601
211k
      || (insn & 0xfc) == 0x54
602
209k
      || (insn & 0xf0) == 0x60
603
191k
      || (insn & 0xf0) == 0x70
604
175k
      || ((insn & 0xf0) == 0x80
605
12.7k
    && (insn & 0x0c) >> 2 != (insn & 0x03))
606
167k
      || ((insn & 0xf0) == 0x90
607
8.72k
    && (insn & 0x0c) >> 2 != (insn & 0x03))
608
161k
      || ((insn & 0xf0) == 0xa0
609
7.86k
    && (insn & 0x0c) >> 2 != (insn & 0x03))
610
155k
      || ((insn & 0xf0) == 0xb0
611
7.89k
    && (insn & 0x0c) >> 2 != (insn & 0x03))
612
149k
      || (insn & 0xff) == 0xcb
613
148k
      || (insn & 0xfc) == 0xd0
614
147k
      || (insn & 0xfc) == 0xd4
615
145k
      || (insn & 0xfc) == 0xd8
616
142k
      || (insn & 0xf0) == 0xe0
617
130k
      || (insn & 0xff) == 0xff)
618
207k
    {
619
207k
      consume = 1;
620
207k
    }
621
622
  /* These are two byte insns.  */
623
97.4k
  else if ((insn & 0xf0) == 0x80
624
92.4k
     || (insn & 0xf0) == 0x90
625
89.6k
     || (insn & 0xf0) == 0xa0
626
87.4k
     || (insn & 0xf0) == 0xb0
627
86.0k
     || (insn & 0xfc) == 0x20
628
82.6k
     || (insn & 0xfc) == 0x28
629
78.9k
     || (insn & 0xf3) == 0x43
630
76.0k
     || (insn & 0xf3) == 0x42
631
73.3k
     || (insn & 0xfc) == 0x58
632
71.4k
     || (insn & 0xfc) == 0x5c
633
68.8k
     || ((insn & 0xf0) == 0xc0
634
11.3k
         && (insn & 0xff) != 0xcb
635
11.3k
         && (insn & 0xff) != 0xcc
636
10.1k
         && (insn & 0xff) != 0xcd)
637
59.2k
     || (insn & 0xff) == 0xf0
638
56.1k
     || (insn & 0xff) == 0xf1
639
54.9k
     || (insn & 0xff) == 0xf2
640
54.0k
     || (insn & 0xff) == 0xf3
641
52.8k
     || (insn & 0xff) == 0xf4
642
52.1k
     || (insn & 0xff) == 0xf5
643
51.2k
     || (insn & 0xff) == 0xf6)
644
46.8k
    {
645
46.8k
      status = (*info->read_memory_func) (memaddr, buffer, 2, info);
646
46.8k
      if (status != 0)
647
48
  {
648
48
    (*info->memory_error_func) (status, memaddr, info);
649
48
    return -1;
650
48
  }
651
46.8k
      insn = bfd_getb16 (buffer);
652
46.8k
      consume = 2;
653
46.8k
    }
654
655
  /* These are three byte insns.  */
656
50.6k
  else if ((insn & 0xff) == 0xf8
657
49.0k
     || (insn & 0xff) == 0xcc
658
47.8k
     || (insn & 0xff) == 0xf9
659
45.4k
     || (insn & 0xf3) == 0x01
660
39.8k
     || (insn & 0xf3) == 0x02
661
35.8k
     || (insn & 0xf3) == 0x03
662
31.3k
     || (insn & 0xfc) == 0x24
663
27.2k
     || (insn & 0xfc) == 0x2c
664
24.7k
     || (insn & 0xfc) == 0x30
665
21.4k
     || (insn & 0xfc) == 0x34
666
18.5k
     || (insn & 0xfc) == 0x38
667
15.3k
     || (insn & 0xff) == 0xde
668
14.7k
     || (insn & 0xff) == 0xdf
669
14.0k
     || (insn & 0xff) == 0xf9
670
14.0k
     || (insn & 0xff) == 0xcc)
671
36.5k
    {
672
36.5k
      status = (*info->read_memory_func) (memaddr, buffer, 2, info);
673
36.5k
      if (status != 0)
674
81
  {
675
81
    (*info->memory_error_func) (status, memaddr, info);
676
81
    return -1;
677
81
  }
678
36.4k
      insn = bfd_getb16 (buffer);
679
36.4k
      insn <<= 8;
680
36.4k
      status = (*info->read_memory_func) (memaddr + 2, buffer, 1, info);
681
36.4k
      if (status != 0)
682
41
  {
683
41
    (*info->memory_error_func) (status, memaddr, info);
684
41
    return -1;
685
41
  }
686
36.4k
      insn |= *(unsigned char *) buffer;
687
36.4k
      consume = 3;
688
36.4k
    }
689
690
  /* These are four byte insns.  */
691
14.0k
  else if ((insn & 0xff) == 0xfa
692
10.9k
     || (insn & 0xff) == 0xf7
693
9.78k
     || (insn & 0xff) == 0xfb)
694
6.98k
    {
695
6.98k
      status = (*info->read_memory_func) (memaddr, buffer, 4, info);
696
6.98k
      if (status != 0)
697
21
  {
698
21
    (*info->memory_error_func) (status, memaddr, info);
699
21
    return -1;
700
21
  }
701
6.96k
      insn = bfd_getb32 (buffer);
702
6.96k
      consume = 4;
703
6.96k
    }
704
705
  /* These are five byte insns.  */
706
7.07k
  else if ((insn & 0xff) == 0xcd
707
6.51k
     || (insn & 0xff) == 0xdc)
708
1.06k
    {
709
1.06k
      status = (*info->read_memory_func) (memaddr, buffer, 4, info);
710
1.06k
      if (status != 0)
711
3
  {
712
3
    (*info->memory_error_func) (status, memaddr, info);
713
3
    return -1;
714
3
  }
715
1.06k
      insn = bfd_getb32 (buffer);
716
1.06k
      consume = 5;
717
1.06k
    }
718
719
  /* These are six byte insns.  */
720
6.00k
  else if ((insn & 0xff) == 0xfd
721
4.13k
     || (insn & 0xff) == 0xfc)
722
3.46k
    {
723
3.46k
      status = (*info->read_memory_func) (memaddr, buffer, 4, info);
724
3.46k
      if (status != 0)
725
27
  {
726
27
    (*info->memory_error_func) (status, memaddr, info);
727
27
    return -1;
728
27
  }
729
730
3.43k
      insn = bfd_getb32 (buffer);
731
3.43k
      consume = 6;
732
3.43k
    }
733
734
  /* Else its a seven byte insns (in theory).  */
735
2.53k
  else
736
2.53k
    {
737
2.53k
      status = (*info->read_memory_func) (memaddr, buffer, 4, info);
738
2.53k
      if (status != 0)
739
9
  {
740
9
    (*info->memory_error_func) (status, memaddr, info);
741
9
    return -1;
742
9
  }
743
744
2.53k
      insn = bfd_getb32 (buffer);
745
2.53k
      consume = 7;
746
      /* Handle the 5-byte extended instruction codes.  */
747
2.53k
      if ((insn & 0xfff80000) == 0xfe800000)
748
124
  consume = 5;
749
2.53k
    }
750
751
305k
  disassemble (memaddr, info, insn, consume);
752
753
305k
  return consume;
754
305k
}