Coverage Report

Created: 2023-12-08 06:05

/src/capstonenext/arch/Mips/MipsDisassembler.c
Line
Count
Source (jump to first uncovered line)
1
//===- MipsDisassembler.cpp - Disassembler for Mips -------------*- C++ -*-===//
2
//
3
//                     The LLVM Compiler Infrastructure
4
//
5
// This file is distributed under the University of Illinois Open Source
6
// License. See LICENSE.TXT for details.
7
//
8
//===----------------------------------------------------------------------===//
9
//
10
// This file is part of the Mips Disassembler.
11
//
12
//===----------------------------------------------------------------------===//
13
14
/* Capstone Disassembly Engine */
15
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2015 */
16
17
#ifdef CAPSTONE_HAS_MIPS
18
19
#include <stdio.h>
20
#include <string.h>
21
22
#include "capstone/platform.h"
23
24
#include "MipsDisassembler.h"
25
26
#include "../../utils.h"
27
28
#include "../../MCRegisterInfo.h"
29
#include "../../SStream.h"
30
31
#include "../../MathExtras.h"
32
33
//#include "Mips.h"
34
//#include "MipsRegisterInfo.h"
35
//#include "MipsSubtarget.h"
36
#include "../../MCFixedLenDisassembler.h"
37
#include "../../MCInst.h"
38
//#include "llvm/MC/MCSubtargetInfo.h"
39
#include "../../MCRegisterInfo.h"
40
#include "../../MCDisassembler.h"
41
42
// Forward declare these because the autogenerated code will reference them.
43
// Definitions are further down.
44
static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst,
45
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
46
47
static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst *Inst,
48
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
49
50
static DecodeStatus DecodeGPRMM16RegisterClass(MCInst *Inst,
51
    unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
52
53
static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst *Inst,
54
    unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
55
56
static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst *Inst,
57
    unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder);
58
59
static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst,
60
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
61
62
static DecodeStatus DecodePtrRegisterClass(MCInst *Inst,
63
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
64
65
static DecodeStatus DecodeDSPRRegisterClass(MCInst *Inst,
66
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
67
68
static DecodeStatus DecodeFGR64RegisterClass(MCInst *Inst,
69
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
70
71
static DecodeStatus DecodeFGR32RegisterClass(MCInst *Inst,
72
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
73
74
static DecodeStatus DecodeCCRRegisterClass(MCInst *Inst,
75
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
76
77
static DecodeStatus DecodeFCCRegisterClass(MCInst *Inst,
78
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
79
80
static DecodeStatus DecodeCCRegisterClass(MCInst *Inst,
81
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
82
83
static DecodeStatus DecodeFGRCCRegisterClass(MCInst *Inst,
84
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
85
86
static DecodeStatus DecodeHWRegsRegisterClass(MCInst *Inst,
87
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
88
89
static DecodeStatus DecodeAFGR64RegisterClass(MCInst *Inst,
90
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
91
92
static DecodeStatus DecodeACC64DSPRegisterClass(MCInst *Inst,
93
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
94
95
static DecodeStatus DecodeHI32DSPRegisterClass(MCInst *Inst,
96
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
97
98
static DecodeStatus DecodeLO32DSPRegisterClass(MCInst *Inst,
99
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
100
101
static DecodeStatus DecodeMSA128BRegisterClass(MCInst *Inst,
102
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
103
104
static DecodeStatus DecodeMSA128HRegisterClass(MCInst *Inst,
105
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
106
107
static DecodeStatus DecodeMSA128WRegisterClass(MCInst *Inst,
108
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
109
110
static DecodeStatus DecodeMSA128DRegisterClass(MCInst *Inst,
111
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
112
113
static DecodeStatus DecodeMSACtrlRegisterClass(MCInst *Inst,
114
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
115
116
static DecodeStatus DecodeCOP2RegisterClass(MCInst *Inst,
117
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder);
118
119
static DecodeStatus DecodeBranchTarget(MCInst *Inst,
120
    unsigned Offset, uint64_t Address, const MCRegisterInfo *Decoder);
121
122
static DecodeStatus DecodeJumpTarget(MCInst *Inst,
123
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
124
125
static DecodeStatus DecodeBranchTarget21(MCInst *Inst,
126
    unsigned Offset, uint64_t Address, const MCRegisterInfo *Decoder);
127
128
static DecodeStatus DecodeBranchTarget26(MCInst *Inst,
129
    unsigned Offset, uint64_t Address, const MCRegisterInfo *Decoder);
130
131
// DecodeBranchTarget7MM - Decode microMIPS branch offset, which is
132
// shifted left by 1 bit.
133
static DecodeStatus DecodeBranchTarget7MM(MCInst *Inst,
134
    unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder);
135
136
// DecodeBranchTarget10MM - Decode microMIPS branch offset, which is
137
// shifted left by 1 bit.
138
static DecodeStatus DecodeBranchTarget10MM(MCInst *Inst,
139
    unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder);
140
141
// DecodeBranchTargetMM - Decode microMIPS branch offset, which is
142
// shifted left by 1 bit.
143
static DecodeStatus DecodeBranchTargetMM(MCInst *Inst,
144
    unsigned Offset, uint64_t Address, const MCRegisterInfo *Decoder);
145
146
// DecodeJumpTargetMM - Decode microMIPS jump target, which is
147
// shifted left by 1 bit.
148
static DecodeStatus DecodeJumpTargetMM(MCInst *Inst,
149
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
150
151
static DecodeStatus DecodeMem(MCInst *Inst,
152
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
153
154
static DecodeStatus DecodeCacheOp(MCInst *Inst,
155
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
156
157
static DecodeStatus DecodeCacheOpR6(MCInst *Inst,
158
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
159
160
static DecodeStatus DecodeCacheOpMM(MCInst *Inst,
161
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
162
163
static DecodeStatus DecodeSyncI(MCInst *Inst,
164
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
165
166
static DecodeStatus DecodeMSA128Mem(MCInst *Inst,
167
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
168
169
static DecodeStatus DecodeMemMMImm4(MCInst *Inst,
170
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
171
172
static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst *Inst,
173
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
174
175
static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst *Inst,
176
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
177
178
static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst *Inst,
179
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
180
181
static DecodeStatus DecodeMemMMImm12(MCInst *Inst,
182
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
183
184
static DecodeStatus DecodeMemMMImm16(MCInst *Inst,
185
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
186
187
static DecodeStatus DecodeFMem(MCInst *Inst, unsigned Insn,
188
    uint64_t Address, const MCRegisterInfo *Decoder);
189
190
static DecodeStatus DecodeFMem2(MCInst *Inst, unsigned Insn,
191
    uint64_t Address, MCRegisterInfo *Decoder);
192
193
static DecodeStatus DecodeFMem3(MCInst *Inst, unsigned Insn,
194
    uint64_t Address, MCRegisterInfo *Decoder);
195
196
static DecodeStatus DecodeFMemCop2R6(MCInst *Inst, unsigned Insn,
197
    uint64_t Address, MCRegisterInfo *Decoder);
198
199
static DecodeStatus DecodeSpecial3LlSc(MCInst *Inst,
200
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
201
202
static DecodeStatus DecodeAddiur2Simm7(MCInst *Inst,
203
    unsigned Value, uint64_t Address, MCRegisterInfo *Decoder);
204
205
static DecodeStatus DecodeUImm6Lsl2(MCInst *Inst,
206
    unsigned Value, uint64_t Address, MCRegisterInfo *Decoder);
207
208
static DecodeStatus DecodeLiSimm7(MCInst *Inst,
209
    unsigned Value, uint64_t Address, MCRegisterInfo *Decoder);
210
211
static DecodeStatus DecodeSimm4(MCInst *Inst,
212
    unsigned Value, uint64_t Address, MCRegisterInfo *Decoder);
213
214
static DecodeStatus DecodeSimm16(MCInst *Inst,
215
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
216
217
// Decode the immediate field of an LSA instruction which
218
// is off by one.
219
static DecodeStatus DecodeLSAImm(MCInst *Inst,
220
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
221
222
static DecodeStatus DecodeInsSize(MCInst *Inst,
223
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
224
225
static DecodeStatus DecodeExtSize(MCInst *Inst,
226
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
227
228
static DecodeStatus DecodeSimm19Lsl2(MCInst *Inst,
229
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
230
231
static DecodeStatus DecodeSimm18Lsl3(MCInst *Inst,
232
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder);
233
234
static DecodeStatus DecodeSimm9SP(MCInst *Inst,
235
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
236
237
static DecodeStatus DecodeANDI16Imm(MCInst *Inst,
238
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
239
240
static DecodeStatus DecodeUImm5lsl2(MCInst *Inst,
241
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
242
243
static DecodeStatus DecodeSimm23Lsl2(MCInst *Inst,
244
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder);
245
246
/// INSVE_[BHWD] have an implicit operand that the generated decoder doesn't
247
/// handle.
248
static DecodeStatus DecodeINSVE_DF_4(MCInst *MI,
249
    uint32_t insn, uint64_t Address, const MCRegisterInfo *Decoder);
250
251
static DecodeStatus DecodeAddiGroupBranch_4(MCInst *MI,
252
    uint32_t insn, uint64_t Address, const MCRegisterInfo *Decoder);
253
254
static DecodeStatus DecodeDaddiGroupBranch_4(MCInst *MI,
255
    uint32_t insn, uint64_t Address, const MCRegisterInfo *Decoder);
256
257
static DecodeStatus DecodeBlezlGroupBranch_4(MCInst *MI,
258
    uint32_t insn, uint64_t Address, const MCRegisterInfo *Decoder);
259
260
static DecodeStatus DecodeBgtzlGroupBranch_4(MCInst *MI,
261
    uint32_t insn, uint64_t Address, const MCRegisterInfo *Decoder);
262
263
static DecodeStatus DecodeBgtzGroupBranch_4(MCInst *MI,
264
    uint32_t insn, uint64_t Address, const MCRegisterInfo *Decoder);
265
266
static DecodeStatus DecodeBlezGroupBranch_4(MCInst *MI,
267
    uint32_t insn, uint64_t Address, const MCRegisterInfo *Decoder);
268
269
static DecodeStatus DecodeRegListOperand(MCInst *Inst,
270
    uint32_t insn, uint64_t Address, const MCRegisterInfo *Decoder);
271
272
static DecodeStatus DecodeRegListOperand16(MCInst *Inst,
273
    uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
274
275
static DecodeStatus DecodeMovePRegPair(MCInst *Inst,
276
    uint32_t insn, uint64_t Address, MCRegisterInfo *Decoder);
277
278
#define GET_SUBTARGETINFO_ENUM
279
#include "MipsGenSubtargetInfo.inc"
280
281
// Hacky: enable all features for disassembler
282
static uint64_t getFeatureBits(int mode)
283
241k
{
284
241k
  uint64_t Bits = (uint64_t)-1; // include every features at first
285
286
  // By default we do not support Mips1
287
241k
  Bits &= ~Mips_FeatureMips1;
288
289
  // No MicroMips
290
241k
  Bits &= ~Mips_FeatureMicroMips;
291
292
  // ref: MipsGenDisassemblerTables.inc::checkDecoderPredicate()
293
  // some features are mutually execlusive
294
241k
  if (mode & CS_MODE_16) {
295
    //Bits &= ~Mips_FeatureMips32r2;
296
    //Bits &= ~Mips_FeatureMips32;
297
    //Bits &= ~Mips_FeatureFPIdx;
298
    //Bits &= ~Mips_FeatureBitCount;
299
    //Bits &= ~Mips_FeatureSwap;
300
    //Bits &= ~Mips_FeatureSEInReg;
301
    //Bits &= ~Mips_FeatureMips64r2;
302
    //Bits &= ~Mips_FeatureFP64Bit;
303
241k
  } else if (mode & CS_MODE_32) {
304
48.8k
    Bits &= ~Mips_FeatureMips16;
305
48.8k
    Bits &= ~Mips_FeatureFP64Bit;
306
48.8k
    Bits &= ~Mips_FeatureMips64r2;
307
48.8k
    Bits &= ~Mips_FeatureMips32r6;
308
48.8k
    Bits &= ~Mips_FeatureMips64r6;
309
192k
  } else if (mode & CS_MODE_64) {
310
120k
    Bits &= ~Mips_FeatureMips16;
311
120k
    Bits &= ~Mips_FeatureMips64r6;
312
120k
    Bits &= ~Mips_FeatureMips32r6;
313
120k
  } else if (mode & CS_MODE_MIPS32R6) {
314
71.6k
    Bits |= Mips_FeatureMips32r6;
315
71.6k
    Bits &= ~Mips_FeatureMips16;
316
71.6k
    Bits &= ~Mips_FeatureFP64Bit;
317
71.6k
    Bits &= ~Mips_FeatureMips64r6;
318
71.6k
    Bits &= ~Mips_FeatureMips64r2;
319
71.6k
  }
320
321
241k
  if (mode & CS_MODE_MICRO) {
322
52.4k
    Bits |= Mips_FeatureMicroMips;
323
52.4k
    Bits &= ~Mips_FeatureMips4_32r2;
324
52.4k
    Bits &= ~Mips_FeatureMips2;
325
52.4k
  }
326
327
241k
  return Bits;
328
241k
}
329
330
#include "MipsGenDisassemblerTables.inc"
331
332
#define GET_REGINFO_ENUM
333
#include "MipsGenRegisterInfo.inc"
334
335
#define GET_REGINFO_MC_DESC
336
#include "MipsGenRegisterInfo.inc"
337
338
#define GET_INSTRINFO_ENUM
339
#include "MipsGenInstrInfo.inc"
340
341
void Mips_init(MCRegisterInfo *MRI)
342
5.73k
{
343
  // InitMCRegisterInfo(MipsRegDesc, 394, RA, PC,
344
  //    MipsMCRegisterClasses, 62,
345
  //    MipsRegUnitRoots,
346
  //    273,
347
  //    MipsRegDiffLists,
348
  //    MipsLaneMaskLists,
349
  //    MipsRegStrings,
350
  //    MipsRegClassStrings,
351
  //    MipsSubRegIdxLists,
352
  //    12,
353
  //    MipsSubRegIdxRanges,
354
  //    MipsRegEncodingTable);
355
356
357
5.73k
  MCRegisterInfo_InitMCRegisterInfo(MRI, MipsRegDesc, 394,
358
5.73k
      0, 0,
359
5.73k
      MipsMCRegisterClasses, 62,
360
5.73k
      0, 0,
361
5.73k
      MipsRegDiffLists,
362
5.73k
      0,
363
5.73k
      MipsSubRegIdxLists, 12,
364
5.73k
      0);
365
5.73k
}
366
367
/// Read two bytes from the ArrayRef and return 16 bit halfword sorted
368
/// according to the given endianess.
369
static void readInstruction16(unsigned char *code, uint32_t *insn,
370
    bool isBigEndian)
371
37.4k
{
372
  // We want to read exactly 2 Bytes of data.
373
37.4k
  if (isBigEndian)
374
15.2k
    *insn = (code[0] << 8) | code[1];
375
22.2k
  else
376
22.2k
    *insn = (code[1] << 8) | code[0];
377
37.4k
}
378
379
/// readInstruction - read four bytes from the MemoryObject
380
/// and return 32 bit word sorted according to the given endianess
381
static void readInstruction32(unsigned char *code, uint32_t *insn, bool isBigEndian, bool isMicroMips)
382
134k
{
383
  // High 16 bits of a 32-bit microMIPS instruction (where the opcode is)
384
  // always precede the low 16 bits in the instruction stream (that is, they
385
  // are placed at lower addresses in the instruction stream).
386
  //
387
  // microMIPS byte ordering:
388
  //   Big-endian:    0 | 1 | 2 | 3
389
  //   Little-endian: 1 | 0 | 3 | 2
390
391
  // We want to read exactly 4 Bytes of data.
392
134k
  if (isBigEndian) {
393
    // Encoded as a big-endian 32-bit word in the stream.
394
75.1k
    *insn =
395
75.1k
      (code[3] << 0) | (code[2] << 8) | (code[1] << 16) | ((uint32_t) code[0] << 24);
396
75.1k
  } else {
397
59.2k
    if (isMicroMips) {
398
9.14k
      *insn = (code[2] << 0) | (code[3] << 8) | (code[0] << 16) |
399
9.14k
        ((uint32_t) code[1] << 24);
400
50.0k
    } else {
401
50.0k
      *insn = (code[0] << 0) | (code[1] << 8) | (code[2] << 16) |
402
50.0k
        ((uint32_t) code[3] << 24);
403
50.0k
    }
404
59.2k
  }
405
134k
}
406
407
static DecodeStatus MipsDisassembler_getInstruction(int mode, MCInst *instr,
408
    const uint8_t *code, size_t code_len,
409
    uint16_t *Size,
410
    uint64_t Address, bool isBigEndian, MCRegisterInfo *MRI)
411
158k
{
412
158k
  uint32_t Insn;
413
158k
  DecodeStatus Result;
414
415
158k
  if (instr->flat_insn->detail) {
416
158k
    memset(instr->flat_insn->detail, 0, offsetof(cs_detail, mips)+sizeof(cs_mips));
417
158k
  }
418
419
158k
  if (mode & CS_MODE_MICRO) {
420
37.7k
    if (code_len < 2)
421
      // not enough data
422
249
      return MCDisassembler_Fail;
423
424
37.4k
    readInstruction16((unsigned char*)code, &Insn, isBigEndian);
425
426
    // Calling the auto-generated decoder function.
427
37.4k
    Result = decodeInstruction(DecoderTableMicroMips16, instr, Insn, Address, MRI, mode);
428
37.4k
    if (Result != MCDisassembler_Fail) {
429
22.3k
      *Size = 2;
430
22.3k
      return Result;
431
22.3k
    }
432
433
15.1k
    if (code_len < 4)
434
      // not enough data
435
187
      return MCDisassembler_Fail;
436
437
14.9k
    readInstruction32((unsigned char*)code, &Insn, isBigEndian, true);
438
439
    //DEBUG(dbgs() << "Trying MicroMips32 table (32-bit instructions):\n");
440
    // Calling the auto-generated decoder function.
441
14.9k
    Result = decodeInstruction(DecoderTableMicroMips32, instr, Insn, Address, MRI, mode);
442
14.9k
    if (Result != MCDisassembler_Fail) {
443
14.7k
      *Size = 4;
444
14.7k
      return Result;
445
14.7k
    }
446
194
    return MCDisassembler_Fail;
447
14.9k
  }
448
449
120k
  if (code_len < 4)
450
    // not enough data
451
1.55k
    return MCDisassembler_Fail;
452
453
119k
  readInstruction32((unsigned char*)code, &Insn, isBigEndian, false);
454
455
119k
  if ((mode & CS_MODE_MIPS2) && ((mode & CS_MODE_MIPS3) == 0)) {
456
    // DEBUG(dbgs() << "Trying COP3_ table (32-bit opcodes):\n");
457
0
    Result = decodeInstruction(DecoderTableCOP3_32, instr, Insn, Address, MRI, mode);
458
0
    if (Result != MCDisassembler_Fail) {
459
0
      *Size = 4;
460
0
      return Result;
461
0
    }
462
0
  }
463
464
119k
  if ((mode & CS_MODE_MIPS32R6) && (mode & CS_MODE_MIPS64)) {
465
    // DEBUG(dbgs() << "Trying Mips32r6_64r6 (GPR64) table (32-bit opcodes):\n");
466
0
    Result = decodeInstruction(DecoderTableMips32r6_64r6_GP6432, instr, Insn,
467
0
        Address, MRI, mode);
468
0
    if (Result != MCDisassembler_Fail) {
469
0
      *Size = 4;
470
0
      return Result;
471
0
    }
472
0
  }
473
474
119k
  if (mode & CS_MODE_MIPS32R6) {
475
    // DEBUG(dbgs() << "Trying Mips32r6_64r6 table (32-bit opcodes):\n");
476
32.3k
    Result = decodeInstruction(DecoderTableMips32r6_64r632, instr, Insn,
477
32.3k
        Address, MRI, mode);
478
32.3k
    if (Result != MCDisassembler_Fail) {
479
14.7k
      *Size = 4;
480
14.7k
      return Result;
481
14.7k
    }
482
32.3k
  }
483
484
104k
  if (mode & CS_MODE_MIPS64) {
485
    // DEBUG(dbgs() << "Trying Mips64 (GPR64) table (32-bit opcodes):\n");
486
68.9k
    Result = decodeInstruction(DecoderTableMips6432, instr, Insn,
487
68.9k
        Address, MRI, mode);
488
68.9k
    if (Result != MCDisassembler_Fail) {
489
17.1k
      *Size = 4;
490
17.1k
      return Result;
491
17.1k
    }
492
68.9k
  }
493
494
  // DEBUG(dbgs() << "Trying Mips table (32-bit opcodes):\n");
495
  // Calling the auto-generated decoder function.
496
87.5k
  Result = decodeInstruction(DecoderTableMips32, instr, Insn, Address, MRI, mode);
497
87.5k
  if (Result != MCDisassembler_Fail) {
498
86.3k
    *Size = 4;
499
86.3k
    return Result;
500
86.3k
  }
501
502
1.21k
  return MCDisassembler_Fail;
503
87.5k
}
504
505
bool Mips_getInstruction(csh ud, const uint8_t *code, size_t code_len, MCInst *instr,
506
    uint16_t *size, uint64_t address, void *info)
507
158k
{
508
158k
  cs_struct *handle = (cs_struct *)(uintptr_t)ud;
509
510
158k
  DecodeStatus status = MipsDisassembler_getInstruction(handle->mode, instr,
511
158k
      code, code_len,
512
158k
      size,
513
158k
      address, MODE_IS_BIG_ENDIAN(handle->mode), (MCRegisterInfo *)info);
514
515
158k
  return status == MCDisassembler_Success;
516
158k
}
517
518
static unsigned getReg(const MCRegisterInfo *MRI, unsigned RC, unsigned RegNo)
519
279k
{
520
279k
  const MCRegisterClass *rc = MCRegisterInfo_getRegClass(MRI, RC);
521
279k
  return rc->RegsBegin[RegNo];
522
279k
}
523
524
static DecodeStatus DecodeINSVE_DF_4(MCInst *MI, uint32_t insn,
525
    uint64_t Address, const MCRegisterInfo *Decoder)
526
876
{
527
876
  typedef DecodeStatus (*DecodeFN)(MCInst *, unsigned, uint64_t, const MCRegisterInfo *);
528
  // The size of the n field depends on the element size
529
  // The register class also depends on this.
530
876
  uint32_t tmp = fieldFromInstruction(insn, 17, 5);
531
876
  unsigned NSize = 0;
532
876
  DecodeFN RegDecoder = NULL;
533
534
876
  if ((tmp & 0x18) == 0x00) { // INSVE_B
535
198
    NSize = 4;
536
198
    RegDecoder = DecodeMSA128BRegisterClass;
537
678
  } else if ((tmp & 0x1c) == 0x10) { // INSVE_H
538
230
    NSize = 3;
539
230
    RegDecoder = DecodeMSA128HRegisterClass;
540
448
  } else if ((tmp & 0x1e) == 0x18) { // INSVE_W
541
255
    NSize = 2;
542
255
    RegDecoder = DecodeMSA128WRegisterClass;
543
255
  } else if ((tmp & 0x1f) == 0x1c) { // INSVE_D
544
193
    NSize = 1;
545
193
    RegDecoder = DecodeMSA128DRegisterClass;
546
193
  } //else llvm_unreachable("Invalid encoding");
547
548
  //assert(NSize != 0 && RegDecoder != nullptr);
549
876
  if (NSize == 0 || RegDecoder == NULL)
550
0
    return MCDisassembler_Fail;
551
552
  // $wd
553
876
  tmp = fieldFromInstruction(insn, 6, 5);
554
876
  if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler_Fail)
555
0
    return MCDisassembler_Fail;
556
557
  // $wd_in
558
876
  if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler_Fail)
559
0
    return MCDisassembler_Fail;
560
561
  // $n
562
876
  tmp = fieldFromInstruction(insn, 16, NSize);
563
876
  MCOperand_CreateImm0(MI, tmp);
564
565
  // $ws
566
876
  tmp = fieldFromInstruction(insn, 11, 5);
567
876
  if (RegDecoder(MI, tmp, Address, Decoder) == MCDisassembler_Fail)
568
0
    return MCDisassembler_Fail;
569
570
  // $n2
571
876
  MCOperand_CreateImm0(MI, 0);
572
573
876
  return MCDisassembler_Success;
574
876
}
575
576
static DecodeStatus DecodeAddiGroupBranch_4(MCInst *MI, uint32_t insn,
577
    uint64_t Address, const MCRegisterInfo *Decoder)
578
1.52k
{
579
  // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
580
  // (otherwise we would have matched the ADDI instruction from the earlier
581
  // ISA's instead).
582
  //
583
  // We have:
584
  //    0b001000 sssss ttttt iiiiiiiiiiiiiiii
585
  //      BOVC if rs >= rt
586
  //      BEQZALC if rs == 0 && rt != 0
587
  //      BEQC if rs < rt && rs != 0
588
589
1.52k
  uint32_t Rs = fieldFromInstruction(insn, 21, 5);
590
1.52k
  uint32_t Rt = fieldFromInstruction(insn, 16, 5);
591
1.52k
  uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
592
1.52k
  bool HasRs = false;
593
594
1.52k
  if (Rs >= Rt) {
595
593
    MCInst_setOpcode(MI, Mips_BOVC);
596
593
    HasRs = true;
597
932
  } else if (Rs != 0 && Rs < Rt) {
598
518
    MCInst_setOpcode(MI, Mips_BEQC);
599
518
    HasRs = true;
600
518
  } else
601
414
    MCInst_setOpcode(MI, Mips_BEQZALC);
602
603
1.52k
  if (HasRs)
604
1.11k
    MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
605
606
1.52k
  MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
607
1.52k
  MCOperand_CreateImm0(MI, Imm);
608
609
1.52k
  return MCDisassembler_Success;
610
1.52k
}
611
612
static DecodeStatus DecodeDaddiGroupBranch_4(MCInst *MI, uint32_t insn,
613
    uint64_t Address, const MCRegisterInfo *Decoder)
614
1.78k
{
615
  // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
616
  // (otherwise we would have matched the ADDI instruction from the earlier
617
  // ISA's instead).
618
  //
619
  // We have:
620
  //    0b011000 sssss ttttt iiiiiiiiiiiiiiii
621
  //      BNVC if rs >= rt
622
  //      BNEZALC if rs == 0 && rt != 0
623
  //      BNEC if rs < rt && rs != 0
624
625
1.78k
  uint32_t Rs = fieldFromInstruction(insn, 21, 5);
626
1.78k
  uint32_t Rt = fieldFromInstruction(insn, 16, 5);
627
1.78k
  uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
628
1.78k
  bool HasRs = false;
629
630
1.78k
  if (Rs >= Rt) {
631
1.03k
    MCInst_setOpcode(MI, Mips_BNVC);
632
1.03k
    HasRs = true;
633
1.03k
  } else if (Rs != 0 && Rs < Rt) {
634
333
    MCInst_setOpcode(MI, Mips_BNEC);
635
333
    HasRs = true;
636
333
  } else
637
415
    MCInst_setOpcode(MI, Mips_BNEZALC);
638
639
1.78k
  if (HasRs)
640
1.37k
    MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
641
642
1.78k
  MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
643
1.78k
  MCOperand_CreateImm0(MI, Imm);
644
645
1.78k
  return MCDisassembler_Success;
646
1.78k
}
647
648
static DecodeStatus DecodeBlezlGroupBranch_4(MCInst *MI, uint32_t insn,
649
    uint64_t Address, const MCRegisterInfo *Decoder)
650
1.24k
{
651
  // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
652
  // (otherwise we would have matched the BLEZL instruction from the earlier
653
  // ISA's instead).
654
  //
655
  // We have:
656
  //    0b010110 sssss ttttt iiiiiiiiiiiiiiii
657
  //      Invalid if rs == 0
658
  //      BLEZC   if rs == 0  && rt != 0
659
  //      BGEZC   if rs == rt && rt != 0
660
  //      BGEC    if rs != rt && rs != 0  && rt != 0
661
662
1.24k
  uint32_t Rs = fieldFromInstruction(insn, 21, 5);
663
1.24k
  uint32_t Rt = fieldFromInstruction(insn, 16, 5);
664
1.24k
  uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
665
1.24k
  bool HasRs = false;
666
667
1.24k
  if (Rt == 0)
668
3
    return MCDisassembler_Fail;
669
1.24k
  else if (Rs == 0)
670
112
    MCInst_setOpcode(MI, Mips_BLEZC);
671
1.13k
  else if (Rs == Rt)
672
394
    MCInst_setOpcode(MI, Mips_BGEZC);
673
737
  else {
674
737
    HasRs = true;
675
737
    MCInst_setOpcode(MI, Mips_BGEC);
676
737
  }
677
678
1.24k
  if (HasRs)
679
737
    MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
680
681
1.24k
  MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
682
683
1.24k
  MCOperand_CreateImm0(MI, Imm);
684
685
1.24k
  return MCDisassembler_Success;
686
1.24k
}
687
688
static DecodeStatus DecodeBgtzlGroupBranch_4(MCInst *MI, uint32_t insn,
689
    uint64_t Address, const MCRegisterInfo *Decoder)
690
842
{
691
  // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
692
  // (otherwise we would have matched the BGTZL instruction from the earlier
693
  // ISA's instead).
694
  //
695
  // We have:
696
  //    0b010111 sssss ttttt iiiiiiiiiiiiiiii
697
  //      Invalid if rs == 0
698
  //      BGTZC   if rs == 0  && rt != 0
699
  //      BLTZC   if rs == rt && rt != 0
700
  //      BLTC    if rs != rt && rs != 0  && rt != 0
701
702
842
  bool HasRs = false;
703
704
842
  uint32_t Rs = fieldFromInstruction(insn, 21, 5);
705
842
  uint32_t Rt = fieldFromInstruction(insn, 16, 5);
706
842
  uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
707
708
842
  if (Rt == 0)
709
3
    return MCDisassembler_Fail;
710
839
  else if (Rs == 0)
711
166
    MCInst_setOpcode(MI, Mips_BGTZC);
712
673
  else if (Rs == Rt)
713
104
    MCInst_setOpcode(MI, Mips_BLTZC);
714
569
  else {
715
569
    MCInst_setOpcode(MI, Mips_BLTC);
716
569
    HasRs = true;
717
569
  }
718
719
839
  if (HasRs)
720
569
    MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
721
722
839
  MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
723
839
  MCOperand_CreateImm0(MI, Imm);
724
725
839
  return MCDisassembler_Success;
726
842
}
727
728
static DecodeStatus DecodeBgtzGroupBranch_4(MCInst *MI, uint32_t insn,
729
    uint64_t Address, const MCRegisterInfo *Decoder)
730
1.43k
{
731
  // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
732
  // (otherwise we would have matched the BGTZ instruction from the earlier
733
  // ISA's instead).
734
  //
735
  // We have:
736
  //    0b000111 sssss ttttt iiiiiiiiiiiiiiii
737
  //      BGTZ    if rt == 0
738
  //      BGTZALC if rs == 0 && rt != 0
739
  //      BLTZALC if rs != 0 && rs == rt
740
  //      BLTUC   if rs != 0 && rs != rt
741
742
1.43k
  uint32_t Rs = fieldFromInstruction(insn, 21, 5);
743
1.43k
  uint32_t Rt = fieldFromInstruction(insn, 16, 5);
744
1.43k
  uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
745
1.43k
  bool HasRs = false;
746
1.43k
  bool HasRt = false;
747
748
1.43k
  if (Rt == 0) {
749
444
    MCInst_setOpcode(MI, Mips_BGTZ);
750
444
    HasRs = true;
751
993
  } else if (Rs == 0) {
752
423
    MCInst_setOpcode(MI, Mips_BGTZALC);
753
423
    HasRt = true;
754
570
  } else if (Rs == Rt) {
755
80
    MCInst_setOpcode(MI, Mips_BLTZALC);
756
80
    HasRs = true;
757
490
  } else {
758
490
    MCInst_setOpcode(MI, Mips_BLTUC);
759
490
    HasRs = true;
760
490
    HasRt = true;
761
490
  }
762
763
1.43k
  if (HasRs)
764
1.01k
    MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
765
766
1.43k
  if (HasRt)
767
913
    MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
768
769
1.43k
  MCOperand_CreateImm0(MI, Imm);
770
771
1.43k
  return MCDisassembler_Success;
772
1.43k
}
773
774
static DecodeStatus DecodeBlezGroupBranch_4(MCInst *MI, uint32_t insn,
775
    uint64_t Address, const MCRegisterInfo *Decoder)
776
2.87k
{
777
  // If we are called then we can assume that MIPS32r6/MIPS64r6 is enabled
778
  // (otherwise we would have matched the BLEZL instruction from the earlier
779
  // ISA's instead).
780
  //
781
  // We have:
782
  //    0b000110 sssss ttttt iiiiiiiiiiiiiiii
783
  //      Invalid   if rs == 0
784
  //      BLEZALC   if rs == 0  && rt != 0
785
  //      BGEZALC   if rs == rt && rt != 0
786
  //      BGEUC     if rs != rt && rs != 0  && rt != 0
787
788
2.87k
  uint32_t Rs = fieldFromInstruction(insn, 21, 5);
789
2.87k
  uint32_t Rt = fieldFromInstruction(insn, 16, 5);
790
2.87k
  uint32_t Imm = (uint32_t)SignExtend64(fieldFromInstruction(insn, 0, 16), 16) * 4;
791
2.87k
  bool HasRs = false;
792
793
2.87k
  if (Rt == 0)
794
404
    return MCDisassembler_Fail;
795
2.47k
  else if (Rs == 0)
796
625
    MCInst_setOpcode(MI, Mips_BLEZALC);
797
1.84k
  else if (Rs == Rt)
798
107
    MCInst_setOpcode(MI, Mips_BGEZALC);
799
1.73k
  else {
800
1.73k
    HasRs = true;
801
1.73k
    MCInst_setOpcode(MI, Mips_BGEUC);
802
1.73k
  }
803
804
2.47k
  if (HasRs)
805
1.73k
    MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rs));
806
807
2.47k
  MCOperand_CreateReg0(MI, getReg(Decoder, Mips_GPR32RegClassID, Rt));
808
809
2.47k
  MCOperand_CreateImm0(MI, Imm);
810
811
2.47k
  return MCDisassembler_Success;
812
2.87k
}
813
814
static DecodeStatus DecodeCPU16RegsRegisterClass(MCInst *Inst,
815
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
816
0
{
817
0
  return MCDisassembler_Fail;
818
0
}
819
820
static DecodeStatus DecodeGPR64RegisterClass(MCInst *Inst,
821
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
822
17.6k
{
823
17.6k
  unsigned Reg;
824
825
17.6k
  if (RegNo > 31)
826
0
    return MCDisassembler_Fail;
827
828
17.6k
  Reg = getReg(Decoder, Mips_GPR64RegClassID, RegNo);
829
17.6k
  MCOperand_CreateReg0(Inst, Reg);
830
17.6k
  return MCDisassembler_Success;
831
17.6k
}
832
833
static DecodeStatus DecodeGPRMM16RegisterClass(MCInst *Inst,
834
    unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
835
23.2k
{
836
23.2k
  unsigned Reg;
837
838
23.2k
  if (RegNo > 7)
839
0
    return MCDisassembler_Fail;
840
841
23.2k
  Reg = getReg(Decoder, Mips_GPRMM16RegClassID, RegNo);
842
23.2k
  MCOperand_CreateReg0(Inst, Reg);
843
23.2k
  return MCDisassembler_Success;
844
23.2k
}
845
846
static DecodeStatus DecodeGPRMM16ZeroRegisterClass(MCInst *Inst,
847
    unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
848
1.90k
{
849
1.90k
  unsigned Reg;
850
851
1.90k
  if (RegNo > 7)
852
0
    return MCDisassembler_Fail;
853
854
1.90k
  Reg = getReg(Decoder, Mips_GPRMM16ZeroRegClassID, RegNo);
855
1.90k
  MCOperand_CreateReg0(Inst, Reg);
856
1.90k
  return MCDisassembler_Success;
857
1.90k
}
858
859
static DecodeStatus DecodeGPRMM16MovePRegisterClass(MCInst *Inst,
860
    unsigned RegNo, uint64_t Address, MCRegisterInfo *Decoder)
861
1.12k
{
862
1.12k
  unsigned Reg;
863
864
1.12k
  if (RegNo > 7)
865
0
    return MCDisassembler_Fail;
866
867
1.12k
  Reg = getReg(Decoder, Mips_GPRMM16MovePRegClassID, RegNo);
868
1.12k
  MCOperand_CreateReg0(Inst, Reg);
869
1.12k
  return MCDisassembler_Success;
870
1.12k
}
871
872
static DecodeStatus DecodeGPR32RegisterClass(MCInst *Inst,
873
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
874
104k
{
875
104k
  unsigned Reg;
876
877
104k
  if (RegNo > 31)
878
0
    return MCDisassembler_Fail;
879
880
104k
  Reg = getReg(Decoder, Mips_GPR32RegClassID, RegNo);
881
104k
  MCOperand_CreateReg0(Inst, Reg);
882
104k
  return MCDisassembler_Success;
883
104k
}
884
885
static DecodeStatus DecodePtrRegisterClass(MCInst *Inst,
886
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
887
2.54k
{
888
  // if (static_cast<const MipsDisassembler *>(Decoder)->isGP64())
889
2.54k
  if (Inst->csh->mode & CS_MODE_MIPS64)
890
844
    return DecodeGPR64RegisterClass(Inst, RegNo, Address, Decoder);
891
892
1.69k
  return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
893
2.54k
}
894
895
static DecodeStatus DecodeDSPRRegisterClass(MCInst *Inst,
896
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
897
3.21k
{
898
3.21k
  return DecodeGPR32RegisterClass(Inst, RegNo, Address, Decoder);
899
3.21k
}
900
901
static DecodeStatus DecodeFGR64RegisterClass(MCInst *Inst,
902
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
903
4.21k
{
904
4.21k
  unsigned Reg;
905
906
4.21k
  if (RegNo > 31)
907
0
    return MCDisassembler_Fail;
908
909
4.21k
  Reg = getReg(Decoder, Mips_FGR64RegClassID, RegNo);
910
4.21k
  MCOperand_CreateReg0(Inst, Reg);
911
4.21k
  return MCDisassembler_Success;
912
4.21k
}
913
914
static DecodeStatus DecodeFGR32RegisterClass(MCInst *Inst,
915
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
916
5.20k
{
917
5.20k
  unsigned Reg;
918
919
5.20k
  if (RegNo > 31)
920
0
    return MCDisassembler_Fail;
921
922
5.20k
  Reg = getReg(Decoder, Mips_FGR32RegClassID, RegNo);
923
5.20k
  MCOperand_CreateReg0(Inst, Reg);
924
5.20k
  return MCDisassembler_Success;
925
5.20k
}
926
927
static DecodeStatus DecodeCCRRegisterClass(MCInst *Inst,
928
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
929
443
{
930
443
  unsigned Reg;
931
932
443
  if (RegNo > 31)
933
0
    return MCDisassembler_Fail;
934
935
443
  Reg = getReg(Decoder, Mips_CCRRegClassID, RegNo);
936
443
  MCOperand_CreateReg0(Inst, Reg);
937
443
  return MCDisassembler_Success;
938
443
}
939
940
static DecodeStatus DecodeFCCRegisterClass(MCInst *Inst,
941
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
942
2.37k
{
943
2.37k
  unsigned Reg;
944
945
2.37k
  if (RegNo > 7)
946
0
    return MCDisassembler_Fail;
947
948
2.37k
  Reg = getReg(Decoder, Mips_FCCRegClassID, RegNo);
949
2.37k
  MCOperand_CreateReg0(Inst, Reg);
950
2.37k
  return MCDisassembler_Success;
951
2.37k
}
952
953
static DecodeStatus DecodeCCRegisterClass(MCInst *Inst,
954
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
955
4.27k
{
956
4.27k
  unsigned Reg;
957
958
4.27k
  if (RegNo > 7)
959
0
    return MCDisassembler_Fail;
960
961
4.27k
  Reg = getReg(Decoder, Mips_CCRegClassID, RegNo);
962
4.27k
  MCOperand_CreateReg0(Inst, Reg);
963
4.27k
  return MCDisassembler_Success;
964
4.27k
}
965
966
static DecodeStatus DecodeFGRCCRegisterClass(MCInst *Inst,
967
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
968
247
{
969
247
  unsigned Reg;
970
971
247
  if (RegNo > 31)
972
0
    return MCDisassembler_Fail;
973
974
247
  Reg = getReg(Decoder, Mips_FGRCCRegClassID, RegNo);
975
247
  MCOperand_CreateReg0(Inst, Reg);
976
247
  return MCDisassembler_Success;
977
247
}
978
979
static DecodeStatus DecodeMem(MCInst *Inst,
980
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
981
13.4k
{
982
13.4k
  int Offset = SignExtend32(Insn & 0xffff, 16);
983
13.4k
  unsigned Reg = fieldFromInstruction(Insn, 16, 5);
984
13.4k
  unsigned Base = fieldFromInstruction(Insn, 21, 5);
985
13.4k
  int opcode = MCInst_getOpcode(Inst);
986
987
13.4k
  Reg = getReg(Decoder, Mips_GPR32RegClassID, Reg);
988
13.4k
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
989
990
13.4k
  if (opcode == Mips_SC || opcode == Mips_SCD) {
991
2.62k
    MCOperand_CreateReg0(Inst, Reg);
992
2.62k
  }
993
994
13.4k
  MCOperand_CreateReg0(Inst, Reg);
995
13.4k
  MCOperand_CreateReg0(Inst, Base);
996
13.4k
  MCOperand_CreateImm0(Inst, Offset);
997
998
13.4k
  return MCDisassembler_Success;
999
13.4k
}
1000
1001
static DecodeStatus DecodeCacheOp(MCInst *Inst,
1002
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1003
1.37k
{
1004
1.37k
  int Offset = SignExtend32(Insn & 0xffff, 16);
1005
1.37k
  unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1006
1.37k
  unsigned Base = fieldFromInstruction(Insn, 21, 5);
1007
1008
1.37k
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1009
1010
1.37k
  MCOperand_CreateReg0(Inst, Base);
1011
1.37k
  MCOperand_CreateImm0(Inst, Offset);
1012
1.37k
  MCOperand_CreateImm0(Inst, Hint);
1013
1014
1.37k
  return MCDisassembler_Success;
1015
1.37k
}
1016
1017
static DecodeStatus DecodeCacheOpMM(MCInst *Inst,
1018
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1019
435
{
1020
435
  int Offset = SignExtend32(Insn & 0xfff, 12);
1021
435
  unsigned Base = fieldFromInstruction(Insn, 16, 5);
1022
435
  unsigned Hint = fieldFromInstruction(Insn, 21, 5);
1023
1024
435
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1025
1026
435
  MCOperand_CreateReg0(Inst, Base);
1027
435
  MCOperand_CreateImm0(Inst, Offset);
1028
435
  MCOperand_CreateImm0(Inst, Hint);
1029
1030
435
  return MCDisassembler_Success;
1031
435
}
1032
1033
static DecodeStatus DecodeCacheOpR6(MCInst *Inst,
1034
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1035
139
{
1036
139
  int Offset = fieldFromInstruction(Insn, 7, 9);
1037
139
  unsigned Hint = fieldFromInstruction(Insn, 16, 5);
1038
139
  unsigned Base = fieldFromInstruction(Insn, 21, 5);
1039
1040
139
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1041
1042
139
  MCOperand_CreateReg0(Inst, Base);
1043
139
  MCOperand_CreateImm0(Inst, Offset);
1044
139
  MCOperand_CreateImm0(Inst, Hint);
1045
1046
139
  return MCDisassembler_Success;
1047
139
}
1048
1049
static DecodeStatus DecodeSyncI(MCInst *Inst,
1050
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1051
299
{
1052
299
  int Offset = SignExtend32(Insn & 0xffff, 16);
1053
299
  unsigned Base = fieldFromInstruction(Insn, 21, 5);
1054
1055
299
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1056
1057
299
  MCOperand_CreateReg0(Inst, Base);
1058
299
  MCOperand_CreateImm0(Inst, Offset);
1059
1060
299
  return MCDisassembler_Success;
1061
299
}
1062
1063
static DecodeStatus DecodeMSA128Mem(MCInst *Inst, unsigned Insn,
1064
    uint64_t Address, const MCRegisterInfo *Decoder)
1065
2.36k
{
1066
2.36k
  int Offset = SignExtend32(fieldFromInstruction(Insn, 16, 10), 10);
1067
2.36k
  unsigned Reg = fieldFromInstruction(Insn, 6, 5);
1068
2.36k
  unsigned Base = fieldFromInstruction(Insn, 11, 5);
1069
1070
2.36k
  Reg = getReg(Decoder, Mips_MSA128BRegClassID, Reg);
1071
2.36k
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1072
1073
2.36k
  MCOperand_CreateReg0(Inst, Reg);
1074
2.36k
  MCOperand_CreateReg0(Inst, Base);
1075
  // MCOperand_CreateImm0(Inst, Offset);
1076
1077
  // The immediate field of an LD/ST instruction is scaled which means it must
1078
  // be multiplied (when decoding) by the size (in bytes) of the instructions'
1079
  // data format.
1080
  // .b - 1 byte
1081
  // .h - 2 bytes
1082
  // .w - 4 bytes
1083
  // .d - 8 bytes
1084
2.36k
  switch(MCInst_getOpcode(Inst)) {
1085
0
    default:
1086
      //assert (0 && "Unexpected instruction");
1087
0
      return MCDisassembler_Fail;
1088
0
      break;
1089
325
    case Mips_LD_B:
1090
909
    case Mips_ST_B:
1091
909
      MCOperand_CreateImm0(Inst, Offset);
1092
909
      break;
1093
121
    case Mips_LD_H:
1094
431
    case Mips_ST_H:
1095
431
      MCOperand_CreateImm0(Inst, Offset * 2);
1096
431
      break;
1097
163
    case Mips_LD_W:
1098
387
    case Mips_ST_W:
1099
387
      MCOperand_CreateImm0(Inst, Offset * 4);
1100
387
      break;
1101
349
    case Mips_LD_D:
1102
642
    case Mips_ST_D:
1103
642
      MCOperand_CreateImm0(Inst, Offset * 8);
1104
642
      break;
1105
2.36k
  }
1106
1107
2.36k
  return MCDisassembler_Success;
1108
2.36k
}
1109
1110
static DecodeStatus DecodeMemMMImm4(MCInst *Inst,
1111
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1112
5.53k
{
1113
5.53k
  unsigned Offset = Insn & 0xf;
1114
5.53k
  unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1115
5.53k
  unsigned Base = fieldFromInstruction(Insn, 4, 3);
1116
1117
5.53k
  switch (MCInst_getOpcode(Inst)) {
1118
1.05k
    case Mips_LBU16_MM:
1119
2.24k
    case Mips_LHU16_MM:
1120
3.63k
    case Mips_LW16_MM:
1121
3.63k
      if (DecodeGPRMM16RegisterClass(Inst, Reg, Address, Decoder)
1122
3.63k
          == MCDisassembler_Fail)
1123
0
        return MCDisassembler_Fail;
1124
3.63k
      break;
1125
3.63k
    case Mips_SB16_MM:
1126
1.11k
    case Mips_SH16_MM:
1127
1.90k
    case Mips_SW16_MM:
1128
1.90k
      if (DecodeGPRMM16ZeroRegisterClass(Inst, Reg, Address, Decoder)
1129
1.90k
          == MCDisassembler_Fail)
1130
0
        return MCDisassembler_Fail;
1131
1.90k
      break;
1132
5.53k
  }
1133
1134
5.53k
  if (DecodeGPRMM16RegisterClass(Inst, Base, Address, Decoder)
1135
5.53k
      == MCDisassembler_Fail)
1136
0
    return MCDisassembler_Fail;
1137
1138
5.53k
  switch (MCInst_getOpcode(Inst)) {
1139
1.05k
    case Mips_LBU16_MM:
1140
1.05k
      if (Offset == 0xf)
1141
146
        MCOperand_CreateImm0(Inst, -1);
1142
908
      else
1143
908
        MCOperand_CreateImm0(Inst, Offset);
1144
1.05k
      break;
1145
635
    case Mips_SB16_MM:
1146
635
      MCOperand_CreateImm0(Inst, Offset);
1147
635
      break;
1148
1.19k
    case Mips_LHU16_MM:
1149
1.67k
    case Mips_SH16_MM:
1150
1.67k
      MCOperand_CreateImm0(Inst, Offset << 1);
1151
1.67k
      break;
1152
1.39k
    case Mips_LW16_MM:
1153
2.17k
    case Mips_SW16_MM:
1154
2.17k
      MCOperand_CreateImm0(Inst, Offset << 2);
1155
2.17k
      break;
1156
5.53k
  }
1157
1158
5.53k
  return MCDisassembler_Success;
1159
5.53k
}
1160
1161
static DecodeStatus DecodeMemMMSPImm5Lsl2(MCInst *Inst,
1162
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1163
588
{
1164
588
  unsigned Offset = Insn & 0x1F;
1165
588
  unsigned Reg = fieldFromInstruction(Insn, 5, 5);
1166
1167
588
  Reg = getReg(Decoder, Mips_GPR32RegClassID, Reg);
1168
1169
588
  MCOperand_CreateReg0(Inst, Reg);
1170
588
  MCOperand_CreateReg0(Inst, Mips_SP);
1171
588
  MCOperand_CreateImm0(Inst, Offset << 2);
1172
1173
588
  return MCDisassembler_Success;
1174
588
}
1175
1176
static DecodeStatus DecodeMemMMGPImm7Lsl2(MCInst *Inst,
1177
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1178
575
{
1179
575
  unsigned Offset = Insn & 0x7F;
1180
575
  unsigned Reg = fieldFromInstruction(Insn, 7, 3);
1181
1182
575
  Reg = getReg(Decoder, Mips_GPR32RegClassID, Reg);
1183
1184
575
  MCOperand_CreateReg0(Inst, Reg);
1185
575
  MCOperand_CreateReg0(Inst, Mips_GP);
1186
575
  MCOperand_CreateImm0(Inst, Offset << 2);
1187
1188
575
  return MCDisassembler_Success;
1189
575
}
1190
1191
static DecodeStatus DecodeMemMMReglistImm4Lsl2(MCInst *Inst,
1192
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1193
1.21k
{
1194
1.21k
  int Offset = SignExtend32(Insn & 0xf, 4);
1195
1196
1.21k
  if (DecodeRegListOperand16(Inst, Insn, Address, Decoder) == MCDisassembler_Fail)
1197
0
    return MCDisassembler_Fail;
1198
1199
1.21k
  MCOperand_CreateReg0(Inst, Mips_SP);
1200
1.21k
  MCOperand_CreateImm0(Inst, Offset * 4);
1201
1202
1.21k
  return MCDisassembler_Success;
1203
1.21k
}
1204
1205
static DecodeStatus DecodeMemMMImm12(MCInst *Inst,
1206
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1207
1.55k
{
1208
1.55k
  int Offset = SignExtend32(Insn & 0x0fff, 12);
1209
1.55k
  unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1210
1.55k
  unsigned Base = fieldFromInstruction(Insn, 16, 5);
1211
1212
1.55k
  Reg = getReg(Decoder, Mips_GPR32RegClassID, Reg);
1213
1.55k
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1214
1215
1.55k
  switch (MCInst_getOpcode(Inst)) {
1216
330
    case Mips_SWM32_MM:
1217
456
    case Mips_LWM32_MM:
1218
456
      if (DecodeRegListOperand(Inst, Insn, Address, Decoder)
1219
456
          == MCDisassembler_Fail)
1220
3
        return MCDisassembler_Fail;
1221
453
      MCOperand_CreateReg0(Inst, Base);
1222
453
      MCOperand_CreateImm0(Inst, Offset);
1223
453
      break;
1224
88
    case Mips_SC_MM:
1225
88
      MCOperand_CreateReg0(Inst, Reg);
1226
      // fallthrough
1227
1.10k
    default:
1228
1.10k
      MCOperand_CreateReg0(Inst, Reg);
1229
1.10k
      if (MCInst_getOpcode(Inst) == Mips_LWP_MM || MCInst_getOpcode(Inst) == Mips_SWP_MM)
1230
410
        MCOperand_CreateReg0(Inst, Reg + 1);
1231
1232
1.10k
      MCOperand_CreateReg0(Inst, Base);
1233
1.10k
      MCOperand_CreateImm0(Inst, Offset);
1234
1.55k
  }
1235
1236
1.55k
  return MCDisassembler_Success;
1237
1.55k
}
1238
1239
static DecodeStatus DecodeMemMMImm16(MCInst *Inst,
1240
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1241
3.84k
{
1242
3.84k
  int Offset = SignExtend32(Insn & 0xffff, 16);
1243
3.84k
  unsigned Reg = fieldFromInstruction(Insn, 21, 5);
1244
3.84k
  unsigned Base = fieldFromInstruction(Insn, 16, 5);
1245
1246
3.84k
  Reg = getReg(Decoder, Mips_GPR32RegClassID, Reg);
1247
3.84k
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1248
1249
3.84k
  MCOperand_CreateReg0(Inst, Reg);
1250
3.84k
  MCOperand_CreateReg0(Inst, Base);
1251
3.84k
  MCOperand_CreateImm0(Inst, Offset);
1252
1253
3.84k
  return MCDisassembler_Success;
1254
3.84k
}
1255
1256
static DecodeStatus DecodeFMem(MCInst *Inst,
1257
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1258
3.33k
{
1259
3.33k
  int Offset = SignExtend32(Insn & 0xffff, 16);
1260
3.33k
  unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1261
3.33k
  unsigned Base = fieldFromInstruction(Insn, 21, 5);
1262
1263
3.33k
  Reg = getReg(Decoder, Mips_FGR64RegClassID, Reg);
1264
3.33k
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1265
1266
3.33k
  MCOperand_CreateReg0(Inst, Reg);
1267
3.33k
  MCOperand_CreateReg0(Inst, Base);
1268
3.33k
  MCOperand_CreateImm0(Inst, Offset);
1269
1270
3.33k
  return MCDisassembler_Success;
1271
3.33k
}
1272
1273
static DecodeStatus DecodeFMem2(MCInst *Inst,
1274
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1275
1.29k
{
1276
1.29k
  int Offset = SignExtend32(Insn & 0xffff, 16);
1277
1.29k
  unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1278
1.29k
  unsigned Base = fieldFromInstruction(Insn, 21, 5);
1279
1280
1.29k
  Reg = getReg(Decoder, Mips_COP2RegClassID, Reg);
1281
1.29k
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1282
1283
1.29k
  MCOperand_CreateReg0(Inst, Reg);
1284
1.29k
  MCOperand_CreateReg0(Inst, Base);
1285
1.29k
  MCOperand_CreateImm0(Inst, Offset);
1286
1287
1.29k
  return MCDisassembler_Success;
1288
1.29k
}
1289
1290
static DecodeStatus DecodeFMem3(MCInst *Inst,
1291
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1292
0
{
1293
0
  int Offset = SignExtend32(Insn & 0xffff, 16);
1294
0
  unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1295
0
  unsigned Base = fieldFromInstruction(Insn, 21, 5);
1296
1297
0
  Reg = getReg(Decoder, Mips_COP3RegClassID, Reg);
1298
0
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1299
1300
0
  MCOperand_CreateReg0(Inst, Reg);
1301
0
  MCOperand_CreateReg0(Inst, Base);
1302
0
  MCOperand_CreateImm0(Inst, Offset);
1303
1304
0
  return MCDisassembler_Success;
1305
0
}
1306
1307
static DecodeStatus DecodeFMemCop2R6(MCInst *Inst,
1308
    unsigned Insn, uint64_t Address, MCRegisterInfo *Decoder)
1309
737
{
1310
737
  int Offset = SignExtend32(Insn & 0x07ff, 11);
1311
737
  unsigned Reg = fieldFromInstruction(Insn, 16, 5);
1312
737
  unsigned Base = fieldFromInstruction(Insn, 11, 5);
1313
1314
737
  Reg = getReg(Decoder, Mips_COP2RegClassID, Reg);
1315
737
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1316
1317
737
  MCOperand_CreateReg0(Inst, Reg);
1318
737
  MCOperand_CreateReg0(Inst, Base);
1319
737
  MCOperand_CreateImm0(Inst, Offset);
1320
1321
737
  return MCDisassembler_Success;
1322
737
}
1323
1324
static DecodeStatus DecodeSpecial3LlSc(MCInst *Inst,
1325
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1326
420
{
1327
420
  int64_t Offset = SignExtend64((Insn >> 7) & 0x1ff, 9);
1328
420
  unsigned Rt = fieldFromInstruction(Insn, 16, 5);
1329
420
  unsigned Base = fieldFromInstruction(Insn, 21, 5);
1330
1331
420
  Rt = getReg(Decoder, Mips_GPR32RegClassID, Rt);
1332
420
  Base = getReg(Decoder, Mips_GPR32RegClassID, Base);
1333
1334
420
  if (MCInst_getOpcode(Inst) == Mips_SC_R6 ||
1335
420
      MCInst_getOpcode(Inst) == Mips_SCD_R6) {
1336
365
    MCOperand_CreateReg0(Inst, Rt);
1337
365
  }
1338
1339
420
  MCOperand_CreateReg0(Inst, Rt);
1340
420
  MCOperand_CreateReg0(Inst, Base);
1341
420
  MCOperand_CreateImm0(Inst, Offset);
1342
1343
420
  return MCDisassembler_Success;
1344
420
}
1345
1346
static DecodeStatus DecodeHWRegsRegisterClass(MCInst *Inst,
1347
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1348
173
{
1349
  // Currently only hardware register 29 is supported.
1350
173
  if (RegNo != 29)
1351
15
    return  MCDisassembler_Fail;
1352
1353
158
  MCOperand_CreateReg0(Inst, Mips_HWR29);
1354
1355
158
  return MCDisassembler_Success;
1356
173
}
1357
1358
static DecodeStatus DecodeAFGR64RegisterClass(MCInst *Inst,
1359
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1360
2.86k
{
1361
2.86k
  unsigned Reg;
1362
1363
2.86k
  if (RegNo > 30 || RegNo % 2)
1364
48
    return MCDisassembler_Fail;
1365
1366
2.81k
  Reg = getReg(Decoder, Mips_AFGR64RegClassID, RegNo /2);
1367
2.81k
  MCOperand_CreateReg0(Inst, Reg);
1368
1369
2.81k
  return MCDisassembler_Success;
1370
2.86k
}
1371
1372
static DecodeStatus DecodeACC64DSPRegisterClass(MCInst *Inst,
1373
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1374
1.63k
{
1375
1.63k
  unsigned Reg;
1376
1377
1.63k
  if (RegNo >= 4)
1378
0
    return MCDisassembler_Fail;
1379
1380
1.63k
  Reg = getReg(Decoder, Mips_ACC64DSPRegClassID, RegNo);
1381
1.63k
  MCOperand_CreateReg0(Inst, Reg);
1382
1.63k
  return MCDisassembler_Success;
1383
1.63k
}
1384
1385
static DecodeStatus DecodeHI32DSPRegisterClass(MCInst *Inst,
1386
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1387
94
{
1388
94
  unsigned Reg;
1389
1390
94
  if (RegNo >= 4)
1391
0
    return MCDisassembler_Fail;
1392
1393
94
  Reg = getReg(Decoder, Mips_HI32DSPRegClassID, RegNo);
1394
94
  MCOperand_CreateReg0(Inst, Reg);
1395
1396
94
  return MCDisassembler_Success;
1397
94
}
1398
1399
static DecodeStatus DecodeLO32DSPRegisterClass(MCInst *Inst,
1400
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1401
259
{
1402
259
  unsigned Reg;
1403
1404
259
  if (RegNo >= 4)
1405
0
    return MCDisassembler_Fail;
1406
1407
259
  Reg = getReg(Decoder, Mips_LO32DSPRegClassID, RegNo);
1408
259
  MCOperand_CreateReg0(Inst, Reg);
1409
1410
259
  return MCDisassembler_Success;
1411
259
}
1412
1413
static DecodeStatus DecodeMSA128BRegisterClass(MCInst *Inst,
1414
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1415
8.90k
{
1416
8.90k
  unsigned Reg;
1417
1418
8.90k
  if (RegNo > 31)
1419
0
    return MCDisassembler_Fail;
1420
1421
8.90k
  Reg = getReg(Decoder, Mips_MSA128BRegClassID, RegNo);
1422
8.90k
  MCOperand_CreateReg0(Inst, Reg);
1423
1424
8.90k
  return MCDisassembler_Success;
1425
8.90k
}
1426
1427
static DecodeStatus DecodeMSA128HRegisterClass(MCInst *Inst,
1428
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1429
7.91k
{
1430
7.91k
  unsigned Reg;
1431
1432
7.91k
  if (RegNo > 31)
1433
0
    return MCDisassembler_Fail;
1434
1435
7.91k
  Reg = getReg(Decoder, Mips_MSA128HRegClassID, RegNo);
1436
7.91k
  MCOperand_CreateReg0(Inst, Reg);
1437
1438
7.91k
  return MCDisassembler_Success;
1439
7.91k
}
1440
1441
static DecodeStatus DecodeMSA128WRegisterClass(MCInst *Inst,
1442
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1443
9.08k
{
1444
9.08k
  unsigned Reg;
1445
1446
9.08k
  if (RegNo > 31)
1447
0
    return MCDisassembler_Fail;
1448
1449
9.08k
  Reg = getReg(Decoder, Mips_MSA128WRegClassID, RegNo);
1450
9.08k
  MCOperand_CreateReg0(Inst, Reg);
1451
1452
9.08k
  return MCDisassembler_Success;
1453
9.08k
}
1454
1455
static DecodeStatus DecodeMSA128DRegisterClass(MCInst *Inst,
1456
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1457
10.6k
{
1458
10.6k
  unsigned Reg;
1459
1460
10.6k
  if (RegNo > 31)
1461
0
    return MCDisassembler_Fail;
1462
1463
10.6k
  Reg = getReg(Decoder, Mips_MSA128DRegClassID, RegNo);
1464
10.6k
  MCOperand_CreateReg0(Inst, Reg);
1465
1466
10.6k
  return MCDisassembler_Success;
1467
10.6k
}
1468
1469
static DecodeStatus DecodeMSACtrlRegisterClass(MCInst *Inst,
1470
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1471
82
{
1472
82
  unsigned Reg;
1473
1474
82
  if (RegNo > 7)
1475
6
    return MCDisassembler_Fail;
1476
1477
76
  Reg = getReg(Decoder, Mips_MSACtrlRegClassID, RegNo);
1478
76
  MCOperand_CreateReg0(Inst, Reg);
1479
1480
76
  return MCDisassembler_Success;
1481
82
}
1482
1483
static DecodeStatus DecodeCOP2RegisterClass(MCInst *Inst,
1484
    unsigned RegNo, uint64_t Address, const MCRegisterInfo *Decoder)
1485
162
{
1486
162
  unsigned Reg;
1487
1488
162
  if (RegNo > 31)
1489
0
    return MCDisassembler_Fail;
1490
1491
162
  Reg = getReg(Decoder, Mips_COP2RegClassID, RegNo);
1492
162
  MCOperand_CreateReg0(Inst, Reg);
1493
1494
162
  return MCDisassembler_Success;
1495
162
}
1496
1497
static DecodeStatus DecodeBranchTarget(MCInst *Inst,
1498
    unsigned Offset, uint64_t Address, const MCRegisterInfo *Decoder)
1499
20.7k
{
1500
20.7k
  uint64_t TargetAddress = (SignExtend32(Offset, 16) * 4) + Address + 4;
1501
20.7k
  MCOperand_CreateImm0(Inst, TargetAddress);
1502
1503
20.7k
  return MCDisassembler_Success;
1504
20.7k
}
1505
1506
static DecodeStatus DecodeJumpTarget(MCInst *Inst,
1507
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1508
4.36k
{
1509
4.36k
  uint64_t TargetAddress = (fieldFromInstruction(Insn, 0, 26) << 2) | ((Address + 4) & ~0x0FFFFFFF);
1510
4.36k
  MCOperand_CreateImm0(Inst, TargetAddress);
1511
1512
4.36k
  return MCDisassembler_Success;
1513
4.36k
}
1514
1515
static DecodeStatus DecodeBranchTarget21(MCInst *Inst,
1516
    unsigned Offset, uint64_t Address, const MCRegisterInfo *Decoder)
1517
785
{
1518
785
  int32_t BranchOffset = SignExtend32(Offset, 21) * 4;
1519
1520
785
  MCOperand_CreateImm0(Inst, BranchOffset);
1521
1522
785
  return MCDisassembler_Success;
1523
785
}
1524
1525
static DecodeStatus DecodeBranchTarget26(MCInst *Inst,
1526
    unsigned Offset, uint64_t Address, const MCRegisterInfo *Decoder)
1527
651
{
1528
651
  int32_t BranchOffset = SignExtend32(Offset, 26) * 4;
1529
1530
651
  MCOperand_CreateImm0(Inst, BranchOffset);
1531
651
  return MCDisassembler_Success;
1532
651
}
1533
1534
static DecodeStatus DecodeBranchTarget7MM(MCInst *Inst,
1535
    unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder)
1536
944
{
1537
944
  int32_t BranchOffset = SignExtend32(Offset, 7) * 2;
1538
944
  MCOperand_CreateImm0(Inst, BranchOffset);
1539
944
  return MCDisassembler_Success;
1540
944
}
1541
1542
static DecodeStatus DecodeBranchTarget10MM(MCInst *Inst,
1543
    unsigned Offset, uint64_t Address, MCRegisterInfo *Decoder)
1544
706
{
1545
706
  int32_t BranchOffset = SignExtend32(Offset, 10) * 2;
1546
706
  MCOperand_CreateImm0(Inst, BranchOffset);
1547
706
  return MCDisassembler_Success;
1548
706
}
1549
1550
static DecodeStatus DecodeBranchTargetMM(MCInst *Inst,
1551
    unsigned Offset, uint64_t Address, const MCRegisterInfo *Decoder)
1552
1.09k
{
1553
1.09k
  int32_t BranchOffset = SignExtend32(Offset, 16) * 2;
1554
1.09k
  MCOperand_CreateImm0(Inst, BranchOffset);
1555
1556
1.09k
  return MCDisassembler_Success;
1557
1.09k
}
1558
1559
static DecodeStatus DecodeJumpTargetMM(MCInst *Inst,
1560
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1561
740
{
1562
740
  unsigned JumpOffset = fieldFromInstruction(Insn, 0, 26) << 1;
1563
740
  MCOperand_CreateImm0(Inst, JumpOffset);
1564
1565
740
  return MCDisassembler_Success;
1566
740
}
1567
1568
static DecodeStatus DecodeAddiur2Simm7(MCInst *Inst,
1569
    unsigned Value, uint64_t Address, MCRegisterInfo *Decoder)
1570
1.38k
{
1571
1.38k
  if (Value == 0)
1572
175
    MCOperand_CreateImm0(Inst, 1);
1573
1.20k
  else if (Value == 0x7)
1574
524
    MCOperand_CreateImm0(Inst, -1);
1575
684
  else
1576
684
    MCOperand_CreateImm0(Inst, Value << 2);
1577
1578
1.38k
  return MCDisassembler_Success;
1579
1.38k
}
1580
1581
static DecodeStatus DecodeUImm6Lsl2(MCInst *Inst,
1582
    unsigned Value, uint64_t Address, MCRegisterInfo *Decoder)
1583
638
{
1584
638
  MCOperand_CreateImm0(Inst, Value << 2);
1585
1586
638
  return MCDisassembler_Success;
1587
638
}
1588
1589
static DecodeStatus DecodeLiSimm7(MCInst *Inst,
1590
    unsigned Value, uint64_t Address, MCRegisterInfo *Decoder)
1591
2.24k
{
1592
2.24k
  if (Value == 0x7F)
1593
428
    MCOperand_CreateImm0(Inst, -1);
1594
1.82k
  else
1595
1.82k
    MCOperand_CreateImm0(Inst, Value);
1596
1597
2.24k
  return MCDisassembler_Success;
1598
2.24k
}
1599
1600
static DecodeStatus DecodeSimm4(MCInst *Inst,
1601
    unsigned Value, uint64_t Address, MCRegisterInfo *Decoder)
1602
698
{
1603
698
  MCOperand_CreateImm0(Inst, SignExtend32(Value, 4));
1604
1605
698
  return MCDisassembler_Success;
1606
698
}
1607
1608
static DecodeStatus DecodeSimm16(MCInst *Inst,
1609
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1610
7.65k
{
1611
7.65k
  MCOperand_CreateImm0(Inst, SignExtend32(Insn, 16));
1612
1613
7.65k
  return MCDisassembler_Success;
1614
7.65k
}
1615
1616
static DecodeStatus DecodeLSAImm(MCInst *Inst,
1617
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1618
431
{
1619
  // We add one to the immediate field as it was encoded as 'imm - 1'.
1620
431
  MCOperand_CreateImm0(Inst, Insn + 1);
1621
1622
431
  return MCDisassembler_Success;
1623
431
}
1624
1625
static DecodeStatus DecodeInsSize(MCInst *Inst,
1626
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1627
1.58k
{
1628
  // First we need to grab the pos(lsb) from MCInst.
1629
1.58k
  int Pos = (int)MCOperand_getImm(MCInst_getOperand(Inst, 2));
1630
1.58k
  int Size = (int) Insn - Pos + 1;
1631
1.58k
  MCOperand_CreateImm0(Inst, SignExtend32(Size, 16));
1632
1633
1.58k
  return MCDisassembler_Success;
1634
1.58k
}
1635
1636
static DecodeStatus DecodeExtSize(MCInst *Inst,
1637
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1638
688
{
1639
688
  int Size = (int)Insn  + 1;
1640
1641
688
  MCOperand_CreateImm0(Inst, SignExtend32(Size, 16));
1642
1643
688
  return MCDisassembler_Success;
1644
688
}
1645
1646
static DecodeStatus DecodeSimm19Lsl2(MCInst *Inst,
1647
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1648
400
{
1649
400
  MCOperand_CreateImm0(Inst, SignExtend32(Insn, 19) * 4);
1650
1651
400
  return MCDisassembler_Success;
1652
400
}
1653
1654
static DecodeStatus DecodeSimm18Lsl3(MCInst *Inst,
1655
    unsigned Insn, uint64_t Address, const MCRegisterInfo *Decoder)
1656
0
{
1657
0
  MCOperand_CreateImm0(Inst, SignExtend32(Insn, 18) * 8);
1658
1659
0
  return MCDisassembler_Success;
1660
0
}
1661
1662
static DecodeStatus DecodeSimm9SP(MCInst *Inst, unsigned Insn,
1663
    uint64_t Address, MCRegisterInfo *Decoder)
1664
1.48k
{
1665
1.48k
  int32_t DecodedValue;
1666
1667
1.48k
  switch (Insn) {
1668
98
    case 0: DecodedValue = 256; break;
1669
431
    case 1: DecodedValue = 257; break;
1670
183
    case 510: DecodedValue = -258; break;
1671
90
    case 511: DecodedValue = -257; break;
1672
681
    default: DecodedValue = SignExtend32(Insn, 9); break;
1673
1.48k
  }
1674
1.48k
  MCOperand_CreateImm0(Inst, DecodedValue * 4);
1675
1676
1.48k
  return MCDisassembler_Success;
1677
1.48k
}
1678
1679
static DecodeStatus DecodeANDI16Imm(MCInst *Inst, unsigned Insn,
1680
    uint64_t Address, MCRegisterInfo *Decoder)
1681
742
{
1682
  // Insn must be >= 0, since it is unsigned that condition is always true.
1683
  // assert(Insn < 16);
1684
742
  int32_t DecodedValues[] = {128, 1, 2, 3, 4, 7, 8, 15, 16, 31, 32, 63, 64,
1685
742
    255, 32768, 65535};
1686
1687
742
  if (Insn >= 16)
1688
0
    return MCDisassembler_Fail;
1689
1690
742
  MCOperand_CreateImm0(Inst, DecodedValues[Insn]);
1691
1692
742
  return MCDisassembler_Success;
1693
742
}
1694
1695
static DecodeStatus DecodeUImm5lsl2(MCInst *Inst, unsigned Insn,
1696
    uint64_t Address, MCRegisterInfo *Decoder)
1697
112
{
1698
112
  MCOperand_CreateImm0(Inst, Insn << 2);
1699
1700
112
  return MCDisassembler_Success;
1701
112
}
1702
1703
static DecodeStatus DecodeRegListOperand(MCInst *Inst, unsigned Insn,
1704
    uint64_t Address, const MCRegisterInfo *Decoder)
1705
456
{
1706
456
  unsigned Regs[] = {Mips_S0, Mips_S1, Mips_S2, Mips_S3, Mips_S4, Mips_S5,
1707
456
    Mips_S6, Mips_FP};
1708
456
  unsigned RegNum;
1709
456
  unsigned int i;
1710
1711
456
  unsigned RegLst = fieldFromInstruction(Insn, 21, 5);
1712
  // Empty register lists are not allowed.
1713
456
  if (RegLst == 0)
1714
3
    return MCDisassembler_Fail;
1715
1716
453
  RegNum = RegLst & 0xf;
1717
3.36k
  for (i = 0; i < MIN(RegNum, ARR_SIZE(Regs)); i++)
1718
2.91k
    MCOperand_CreateReg0(Inst, Regs[i]);
1719
1720
453
  if (RegLst & 0x10)
1721
99
    MCOperand_CreateReg0(Inst, Mips_RA);
1722
1723
453
  return MCDisassembler_Success;
1724
456
}
1725
1726
static DecodeStatus DecodeRegListOperand16(MCInst *Inst, unsigned Insn,
1727
    uint64_t Address, MCRegisterInfo *Decoder)
1728
1.21k
{
1729
1.21k
  unsigned Regs[] = {Mips_S0, Mips_S1, Mips_S2, Mips_S3};
1730
1.21k
  unsigned RegLst = fieldFromInstruction(Insn, 4, 2);
1731
1.21k
  unsigned RegNum = RegLst & 0x3;
1732
1.21k
  unsigned int i;
1733
1734
3.75k
  for (i = 0; i <= RegNum; i++)
1735
2.53k
    MCOperand_CreateReg0(Inst, Regs[i]);
1736
1737
1.21k
  MCOperand_CreateReg0(Inst, Mips_RA);
1738
1739
1.21k
  return MCDisassembler_Success;
1740
1.21k
}
1741
1742
static DecodeStatus DecodeMovePRegPair(MCInst *Inst, unsigned Insn,
1743
    uint64_t Address, MCRegisterInfo *Decoder)
1744
562
{
1745
562
  unsigned RegPair = fieldFromInstruction(Insn, 7, 3);
1746
1747
562
  switch (RegPair) {
1748
0
    default:
1749
0
      return MCDisassembler_Fail;
1750
562
    case 0:
1751
562
      MCOperand_CreateReg0(Inst, Mips_A1);
1752
562
      MCOperand_CreateReg0(Inst, Mips_A2);
1753
562
      break;
1754
0
    case 1:
1755
0
      MCOperand_CreateReg0(Inst, Mips_A1);
1756
0
      MCOperand_CreateReg0(Inst, Mips_A3);
1757
0
      break;
1758
0
    case 2:
1759
0
      MCOperand_CreateReg0(Inst, Mips_A2);
1760
0
      MCOperand_CreateReg0(Inst, Mips_A3);
1761
0
      break;
1762
0
    case 3:
1763
0
      MCOperand_CreateReg0(Inst, Mips_A0);
1764
0
      MCOperand_CreateReg0(Inst, Mips_S5);
1765
0
      break;
1766
0
    case 4:
1767
0
      MCOperand_CreateReg0(Inst, Mips_A0);
1768
0
      MCOperand_CreateReg0(Inst, Mips_S6);
1769
0
      break;
1770
0
    case 5:
1771
0
      MCOperand_CreateReg0(Inst, Mips_A0);
1772
0
      MCOperand_CreateReg0(Inst, Mips_A1);
1773
0
      break;
1774
0
    case 6:
1775
0
      MCOperand_CreateReg0(Inst, Mips_A0);
1776
0
      MCOperand_CreateReg0(Inst, Mips_A2);
1777
0
      break;
1778
0
    case 7:
1779
0
      MCOperand_CreateReg0(Inst, Mips_A0);
1780
0
      MCOperand_CreateReg0(Inst, Mips_A3);
1781
0
      break;
1782
562
  }
1783
1784
562
  return MCDisassembler_Success;
1785
562
}
1786
1787
static DecodeStatus DecodeSimm23Lsl2(MCInst *Inst, unsigned Insn,
1788
    uint64_t Address, MCRegisterInfo *Decoder)
1789
786
{
1790
786
  MCOperand_CreateImm0(Inst, SignExtend32(Insn, 23) * 4);
1791
786
  return MCDisassembler_Success;
1792
786
}
1793
1794
#endif