Coverage Report

Created: 2025-10-28 07:02

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/capstonenext/arch/X86/X86Disassembler.c
Line
Count
Source
1
//===-- X86Disassembler.cpp - Disassembler for x86 and x86_64 -------------===//
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 X86 Disassembler.
11
// It contains code to translate the data produced by the decoder into
12
//  MCInsts.
13
//
14
// The X86 disassembler is a table-driven disassembler for the 16-, 32-, and
15
// 64-bit X86 instruction sets.  The main decode sequence for an assembly
16
// instruction in this disassembler is:
17
//
18
// 1. Read the prefix bytes and determine the attributes of the instruction.
19
//    These attributes, recorded in enum attributeBits
20
//    (X86DisassemblerDecoderCommon.h), form a bitmask.  The table CONTEXTS_SYM
21
//    provides a mapping from bitmasks to contexts, which are represented by
22
//    enum InstructionContext (ibid.).
23
//
24
// 2. Read the opcode, and determine what kind of opcode it is.  The
25
//    disassembler distinguishes four kinds of opcodes, which are enumerated in
26
//    OpcodeType (X86DisassemblerDecoderCommon.h): one-byte (0xnn), two-byte
27
//    (0x0f 0xnn), three-byte-38 (0x0f 0x38 0xnn), or three-byte-3a
28
//    (0x0f 0x3a 0xnn).  Mandatory prefixes are treated as part of the context.
29
//
30
// 3. Depending on the opcode type, look in one of four ClassDecision structures
31
//    (X86DisassemblerDecoderCommon.h).  Use the opcode class to determine which
32
//    OpcodeDecision (ibid.) to look the opcode in.  Look up the opcode, to get
33
//    a ModRMDecision (ibid.).
34
//
35
// 4. Some instructions, such as escape opcodes or extended opcodes, or even
36
//    instructions that have ModRM*Reg / ModRM*Mem forms in LLVM, need the
37
//    ModR/M byte to complete decode.  The ModRMDecision's type is an entry from
38
//    ModRMDecisionType (X86DisassemblerDecoderCommon.h) that indicates if the
39
//    ModR/M byte is required and how to interpret it.
40
//
41
// 5. After resolving the ModRMDecision, the disassembler has a unique ID
42
//    of type InstrUID (X86DisassemblerDecoderCommon.h).  Looking this ID up in
43
//    INSTRUCTIONS_SYM yields the name of the instruction and the encodings and
44
//    meanings of its operands.
45
//
46
// 6. For each operand, its encoding is an entry from OperandEncoding
47
//    (X86DisassemblerDecoderCommon.h) and its type is an entry from
48
//    OperandType (ibid.).  The encoding indicates how to read it from the
49
//    instruction; the type indicates how to interpret the value once it has
50
//    been read.  For example, a register operand could be stored in the R/M
51
//    field of the ModR/M byte, the REG field of the ModR/M byte, or added to
52
//    the main opcode.  This is orthogonal from its meaning (an GPR or an XMM
53
//    register, for instance).  Given this information, the operands can be
54
//    extracted and interpreted.
55
//
56
// 7. As the last step, the disassembler translates the instruction information
57
//    and operands into a format understandable by the client - in this case, an
58
//    MCInst for use by the MC infrastructure.
59
//
60
// The disassembler is broken broadly into two parts: the table emitter that
61
// emits the instruction decode tables discussed above during compilation, and
62
// the disassembler itself.  The table emitter is documented in more detail in
63
// utils/TableGen/X86DisassemblerEmitter.h.
64
//
65
// X86Disassembler.cpp contains the code responsible for step 7, and for
66
//   invoking the decoder to execute steps 1-6.
67
// X86DisassemblerDecoderCommon.h contains the definitions needed by both the
68
//   table emitter and the disassembler.
69
// X86DisassemblerDecoder.h contains the public interface of the decoder,
70
//   factored out into C for possible use by other projects.
71
// X86DisassemblerDecoder.c contains the source code of the decoder, which is
72
//   responsible for steps 1-6.
73
//
74
//===----------------------------------------------------------------------===//
75
76
/* Capstone Disassembly Engine */
77
/* By Nguyen Anh Quynh <aquynh@gmail.com>, 2013-2019 */
78
79
#ifdef CAPSTONE_HAS_X86
80
81
#ifdef _MSC_VER
82
// disable MSVC's warning on strncpy()
83
#pragma warning(disable : 4996)
84
// disable MSVC's warning on strncpy()
85
#pragma warning(disable : 28719)
86
#endif
87
88
#include <capstone/platform.h>
89
90
#if defined(CAPSTONE_HAS_OSXKERNEL)
91
#include <Availability.h>
92
#endif
93
94
#include <string.h>
95
96
#include "../../cs_priv.h"
97
98
#include "X86BaseInfo.h"
99
#include "X86Disassembler.h"
100
#include "X86DisassemblerDecoderCommon.h"
101
#include "X86DisassemblerDecoder.h"
102
#include "../../MCInst.h"
103
#include "../../utils.h"
104
#include "X86Mapping.h"
105
106
#define GET_REGINFO_ENUM
107
#define GET_REGINFO_MC_DESC
108
#include "X86GenRegisterInfo.inc"
109
110
#define GET_INSTRINFO_ENUM
111
#ifdef CAPSTONE_X86_REDUCE
112
#include "X86GenInstrInfo_reduce.inc"
113
#else
114
#include "X86GenInstrInfo.inc"
115
#endif
116
117
// Fill-ins to make the compiler happy.  These constants are never actually
118
//   assigned; they are just filler to make an automatically-generated switch
119
//   statement work.
120
enum {
121
  X86_BX_SI = 500,
122
  X86_BX_DI = 501,
123
  X86_BP_SI = 502,
124
  X86_BP_DI = 503,
125
  X86_sib = 504,
126
  X86_sib64 = 505
127
};
128
129
//
130
// Private code that translates from struct InternalInstructions to MCInsts.
131
//
132
133
/// translateRegister - Translates an internal register to the appropriate LLVM
134
///   register, and appends it as an operand to an MCInst.
135
///
136
/// @param mcInst     - The MCInst to append to.
137
/// @param reg        - The Reg to append.
138
static void translateRegister(MCInst *mcInst, Reg reg)
139
973k
{
140
217M
#define ENTRY(x) X86_##x,
141
973k
  static const uint16_t llvmRegnums[] = { ALL_REGS 0 };
142
973k
#undef ENTRY
143
144
973k
  uint16_t llvmRegnum = llvmRegnums[reg];
145
973k
  MCOperand_CreateReg0(mcInst, llvmRegnum);
146
973k
}
147
148
static const uint8_t segmentRegnums[SEG_OVERRIDE_max] = {
149
  0, // SEG_OVERRIDE_NONE
150
  X86_CS, X86_SS, X86_DS, X86_ES, X86_FS, X86_GS
151
};
152
153
/// translateSrcIndex   - Appends a source index operand to an MCInst.
154
///
155
/// @param mcInst       - The MCInst to append to.
156
/// @param insn         - The internal instruction.
157
static bool translateSrcIndex(MCInst *mcInst, InternalInstruction *insn)
158
54.0k
{
159
54.0k
  unsigned baseRegNo;
160
161
54.0k
  if (insn->mode == MODE_64BIT)
162
21.7k
    baseRegNo = insn->hasAdSize ? X86_ESI : X86_RSI;
163
32.2k
  else if (insn->mode == MODE_32BIT)
164
15.7k
    baseRegNo = insn->hasAdSize ? X86_SI : X86_ESI;
165
16.4k
  else {
166
    // assert(insn->mode == MODE_16BIT);
167
16.4k
    baseRegNo = insn->hasAdSize ? X86_ESI : X86_SI;
168
16.4k
  }
169
170
54.0k
  MCOperand_CreateReg0(mcInst, baseRegNo);
171
172
54.0k
  MCOperand_CreateReg0(mcInst, segmentRegnums[insn->segmentOverride]);
173
174
54.0k
  return false;
175
54.0k
}
176
177
/// translateDstIndex   - Appends a destination index operand to an MCInst.
178
///
179
/// @param mcInst       - The MCInst to append to.
180
/// @param insn         - The internal instruction.
181
static bool translateDstIndex(MCInst *mcInst, InternalInstruction *insn)
182
70.9k
{
183
70.9k
  unsigned baseRegNo;
184
185
70.9k
  if (insn->mode == MODE_64BIT)
186
28.5k
    baseRegNo = insn->hasAdSize ? X86_EDI : X86_RDI;
187
42.3k
  else if (insn->mode == MODE_32BIT)
188
20.3k
    baseRegNo = insn->hasAdSize ? X86_DI : X86_EDI;
189
22.0k
  else {
190
    // assert(insn->mode == MODE_16BIT);
191
22.0k
    baseRegNo = insn->hasAdSize ? X86_EDI : X86_DI;
192
22.0k
  }
193
194
70.9k
  MCOperand_CreateReg0(mcInst, baseRegNo);
195
196
70.9k
  return false;
197
70.9k
}
198
199
/// translateImmediate  - Appends an immediate operand to an MCInst.
200
///
201
/// @param mcInst       - The MCInst to append to.
202
/// @param immediate    - The immediate value to append.
203
/// @param operand      - The operand, as stored in the descriptor table.
204
/// @param insn         - The internal instruction.
205
static void translateImmediate(MCInst *mcInst, uint64_t immediate,
206
             const OperandSpecifier *operand,
207
             InternalInstruction *insn)
208
372k
{
209
372k
  OperandType type;
210
211
372k
  type = (OperandType)operand->type;
212
372k
  if (type == TYPE_REL) {
213
    //isBranch = true;
214
    //pcrel = insn->startLocation + insn->immediateOffset + insn->immediateSize;
215
76.5k
    switch (operand->encoding) {
216
0
    default:
217
0
      break;
218
3.99k
    case ENCODING_Iv:
219
3.99k
      switch (insn->displacementSize) {
220
0
      default:
221
0
        break;
222
0
      case 1:
223
0
        if (immediate & 0x80)
224
0
          immediate |= ~(0xffull);
225
0
        break;
226
1.41k
      case 2:
227
1.41k
        if (immediate & 0x8000)
228
801
          immediate |= ~(0xffffull);
229
1.41k
        break;
230
2.57k
      case 4:
231
2.57k
        if (immediate & 0x80000000)
232
1.26k
          immediate |= ~(0xffffffffull);
233
2.57k
        break;
234
0
      case 8:
235
0
        break;
236
3.99k
      }
237
3.99k
      break;
238
68.8k
    case ENCODING_IB:
239
68.8k
      if (immediate & 0x80)
240
23.9k
        immediate |= ~(0xffull);
241
68.8k
      break;
242
1.93k
    case ENCODING_IW:
243
1.93k
      if (immediate & 0x8000)
244
1.10k
        immediate |= ~(0xffffull);
245
1.93k
      break;
246
1.82k
    case ENCODING_ID:
247
1.82k
      if (immediate & 0x80000000)
248
913
        immediate |= ~(0xffffffffull);
249
1.82k
      break;
250
76.5k
    }
251
76.5k
  } // By default sign-extend all X86 immediates based on their encoding.
252
296k
  else if (type == TYPE_IMM) {
253
152k
    switch (operand->encoding) {
254
41.8k
    default:
255
41.8k
      break;
256
90.2k
    case ENCODING_IB:
257
90.2k
      if (immediate & 0x80)
258
29.9k
        immediate |= ~(0xffull);
259
90.2k
      break;
260
14.7k
    case ENCODING_IW:
261
14.7k
      if (immediate & 0x8000)
262
7.94k
        immediate |= ~(0xffffull);
263
14.7k
      break;
264
4.31k
    case ENCODING_ID:
265
4.31k
      if (immediate & 0x80000000)
266
2.03k
        immediate |= ~(0xffffffffull);
267
4.31k
      break;
268
982
    case ENCODING_IO:
269
982
      break;
270
152k
    }
271
152k
  } else if (type == TYPE_IMM3) {
272
20.8k
#ifndef CAPSTONE_X86_REDUCE
273
    // Check for immediates that printSSECC can't handle.
274
20.8k
    if (immediate >= 8) {
275
13.4k
      unsigned NewOpc = 0;
276
277
13.4k
      switch (MCInst_getOpcode(mcInst)) {
278
0
      default:
279
0
        break; // never reach
280
471
      case X86_CMPPDrmi:
281
471
        NewOpc = X86_CMPPDrmi_alt;
282
471
        break;
283
421
      case X86_CMPPDrri:
284
421
        NewOpc = X86_CMPPDrri_alt;
285
421
        break;
286
1.44k
      case X86_CMPPSrmi:
287
1.44k
        NewOpc = X86_CMPPSrmi_alt;
288
1.44k
        break;
289
1.02k
      case X86_CMPPSrri:
290
1.02k
        NewOpc = X86_CMPPSrri_alt;
291
1.02k
        break;
292
1.31k
      case X86_CMPSDrm:
293
1.31k
        NewOpc = X86_CMPSDrm_alt;
294
1.31k
        break;
295
621
      case X86_CMPSDrr:
296
621
        NewOpc = X86_CMPSDrr_alt;
297
621
        break;
298
918
      case X86_CMPSSrm:
299
918
        NewOpc = X86_CMPSSrm_alt;
300
918
        break;
301
694
      case X86_CMPSSrr:
302
694
        NewOpc = X86_CMPSSrr_alt;
303
694
        break;
304
746
      case X86_VPCOMBri:
305
746
        NewOpc = X86_VPCOMBri_alt;
306
746
        break;
307
174
      case X86_VPCOMBmi:
308
174
        NewOpc = X86_VPCOMBmi_alt;
309
174
        break;
310
553
      case X86_VPCOMWri:
311
553
        NewOpc = X86_VPCOMWri_alt;
312
553
        break;
313
149
      case X86_VPCOMWmi:
314
149
        NewOpc = X86_VPCOMWmi_alt;
315
149
        break;
316
556
      case X86_VPCOMDri:
317
556
        NewOpc = X86_VPCOMDri_alt;
318
556
        break;
319
382
      case X86_VPCOMDmi:
320
382
        NewOpc = X86_VPCOMDmi_alt;
321
382
        break;
322
413
      case X86_VPCOMQri:
323
413
        NewOpc = X86_VPCOMQri_alt;
324
413
        break;
325
416
      case X86_VPCOMQmi:
326
416
        NewOpc = X86_VPCOMQmi_alt;
327
416
        break;
328
156
      case X86_VPCOMUBri:
329
156
        NewOpc = X86_VPCOMUBri_alt;
330
156
        break;
331
447
      case X86_VPCOMUBmi:
332
447
        NewOpc = X86_VPCOMUBmi_alt;
333
447
        break;
334
445
      case X86_VPCOMUWri:
335
445
        NewOpc = X86_VPCOMUWri_alt;
336
445
        break;
337
178
      case X86_VPCOMUWmi:
338
178
        NewOpc = X86_VPCOMUWmi_alt;
339
178
        break;
340
689
      case X86_VPCOMUDri:
341
689
        NewOpc = X86_VPCOMUDri_alt;
342
689
        break;
343
369
      case X86_VPCOMUDmi:
344
369
        NewOpc = X86_VPCOMUDmi_alt;
345
369
        break;
346
533
      case X86_VPCOMUQri:
347
533
        NewOpc = X86_VPCOMUQri_alt;
348
533
        break;
349
314
      case X86_VPCOMUQmi:
350
314
        NewOpc = X86_VPCOMUQmi_alt;
351
314
        break;
352
13.4k
      }
353
354
      // Switch opcode to the one that doesn't get special printing.
355
13.4k
      if (NewOpc != 0) {
356
13.4k
        MCInst_setOpcode(mcInst, NewOpc);
357
13.4k
      }
358
13.4k
    }
359
20.8k
#endif
360
123k
  } else if (type == TYPE_IMM5) {
361
30.5k
#ifndef CAPSTONE_X86_REDUCE
362
    // Check for immediates that printAVXCC can't handle.
363
30.5k
    if (immediate >= 32) {
364
24.5k
      unsigned NewOpc = 0;
365
366
24.5k
      switch (MCInst_getOpcode(mcInst)) {
367
6.84k
      default:
368
6.84k
        break; // unexpected opcode
369
6.84k
      case X86_VCMPPDrmi:
370
427
        NewOpc = X86_VCMPPDrmi_alt;
371
427
        break;
372
567
      case X86_VCMPPDrri:
373
567
        NewOpc = X86_VCMPPDrri_alt;
374
567
        break;
375
795
      case X86_VCMPPSrmi:
376
795
        NewOpc = X86_VCMPPSrmi_alt;
377
795
        break;
378
460
      case X86_VCMPPSrri:
379
460
        NewOpc = X86_VCMPPSrri_alt;
380
460
        break;
381
609
      case X86_VCMPSDrm:
382
609
        NewOpc = X86_VCMPSDrm_alt;
383
609
        break;
384
465
      case X86_VCMPSDrr:
385
465
        NewOpc = X86_VCMPSDrr_alt;
386
465
        break;
387
910
      case X86_VCMPSSrm:
388
910
        NewOpc = X86_VCMPSSrm_alt;
389
910
        break;
390
755
      case X86_VCMPSSrr:
391
755
        NewOpc = X86_VCMPSSrr_alt;
392
755
        break;
393
620
      case X86_VCMPPDYrmi:
394
620
        NewOpc = X86_VCMPPDYrmi_alt;
395
620
        break;
396
429
      case X86_VCMPPDYrri:
397
429
        NewOpc = X86_VCMPPDYrri_alt;
398
429
        break;
399
195
      case X86_VCMPPSYrmi:
400
195
        NewOpc = X86_VCMPPSYrmi_alt;
401
195
        break;
402
785
      case X86_VCMPPSYrri:
403
785
        NewOpc = X86_VCMPPSYrri_alt;
404
785
        break;
405
620
      case X86_VCMPPDZrmi:
406
620
        NewOpc = X86_VCMPPDZrmi_alt;
407
620
        break;
408
1.17k
      case X86_VCMPPDZrri:
409
1.17k
        NewOpc = X86_VCMPPDZrri_alt;
410
1.17k
        break;
411
315
      case X86_VCMPPDZrrib:
412
315
        NewOpc = X86_VCMPPDZrrib_alt;
413
315
        break;
414
451
      case X86_VCMPPSZrmi:
415
451
        NewOpc = X86_VCMPPSZrmi_alt;
416
451
        break;
417
543
      case X86_VCMPPSZrri:
418
543
        NewOpc = X86_VCMPPSZrri_alt;
419
543
        break;
420
541
      case X86_VCMPPSZrrib:
421
541
        NewOpc = X86_VCMPPSZrrib_alt;
422
541
        break;
423
393
      case X86_VCMPPDZ128rmi:
424
393
        NewOpc = X86_VCMPPDZ128rmi_alt;
425
393
        break;
426
269
      case X86_VCMPPDZ128rri:
427
269
        NewOpc = X86_VCMPPDZ128rri_alt;
428
269
        break;
429
306
      case X86_VCMPPSZ128rmi:
430
306
        NewOpc = X86_VCMPPSZ128rmi_alt;
431
306
        break;
432
421
      case X86_VCMPPSZ128rri:
433
421
        NewOpc = X86_VCMPPSZ128rri_alt;
434
421
        break;
435
302
      case X86_VCMPPDZ256rmi:
436
302
        NewOpc = X86_VCMPPDZ256rmi_alt;
437
302
        break;
438
721
      case X86_VCMPPDZ256rri:
439
721
        NewOpc = X86_VCMPPDZ256rri_alt;
440
721
        break;
441
308
      case X86_VCMPPSZ256rmi:
442
308
        NewOpc = X86_VCMPPSZ256rmi_alt;
443
308
        break;
444
1.21k
      case X86_VCMPPSZ256rri:
445
1.21k
        NewOpc = X86_VCMPPSZ256rri_alt;
446
1.21k
        break;
447
284
      case X86_VCMPSDZrm_Int:
448
284
        NewOpc = X86_VCMPSDZrmi_alt;
449
284
        break;
450
404
      case X86_VCMPSDZrr_Int:
451
404
        NewOpc = X86_VCMPSDZrri_alt;
452
404
        break;
453
1.01k
      case X86_VCMPSDZrrb_Int:
454
1.01k
        NewOpc = X86_VCMPSDZrrb_alt;
455
1.01k
        break;
456
289
      case X86_VCMPSSZrm_Int:
457
289
        NewOpc = X86_VCMPSSZrmi_alt;
458
289
        break;
459
413
      case X86_VCMPSSZrr_Int:
460
413
        NewOpc = X86_VCMPSSZrri_alt;
461
413
        break;
462
696
      case X86_VCMPSSZrrb_Int:
463
696
        NewOpc = X86_VCMPSSZrrb_alt;
464
696
        break;
465
24.5k
      }
466
467
      // Switch opcode to the one that doesn't get special printing.
468
24.5k
      if (NewOpc != 0) {
469
17.6k
        MCInst_setOpcode(mcInst, NewOpc);
470
17.6k
      }
471
24.5k
    }
472
30.5k
#endif
473
92.4k
  } else if (type == TYPE_AVX512ICC) {
474
24.1k
#ifndef CAPSTONE_X86_REDUCE
475
24.1k
    if (immediate >= 8 || ((immediate & 0x3) == 3)) {
476
15.7k
      unsigned NewOpc = 0;
477
15.7k
      switch (MCInst_getOpcode(mcInst)) {
478
0
      default: // llvm_unreachable("unexpected opcode");
479
389
      case X86_VPCMPBZ128rmi:
480
389
        NewOpc = X86_VPCMPBZ128rmi_alt;
481
389
        break;
482
64
      case X86_VPCMPBZ128rmik:
483
64
        NewOpc = X86_VPCMPBZ128rmik_alt;
484
64
        break;
485
51
      case X86_VPCMPBZ128rri:
486
51
        NewOpc = X86_VPCMPBZ128rri_alt;
487
51
        break;
488
131
      case X86_VPCMPBZ128rrik:
489
131
        NewOpc = X86_VPCMPBZ128rrik_alt;
490
131
        break;
491
63
      case X86_VPCMPBZ256rmi:
492
63
        NewOpc = X86_VPCMPBZ256rmi_alt;
493
63
        break;
494
74
      case X86_VPCMPBZ256rmik:
495
74
        NewOpc = X86_VPCMPBZ256rmik_alt;
496
74
        break;
497
65
      case X86_VPCMPBZ256rri:
498
65
        NewOpc = X86_VPCMPBZ256rri_alt;
499
65
        break;
500
11
      case X86_VPCMPBZ256rrik:
501
11
        NewOpc = X86_VPCMPBZ256rrik_alt;
502
11
        break;
503
656
      case X86_VPCMPBZrmi:
504
656
        NewOpc = X86_VPCMPBZrmi_alt;
505
656
        break;
506
69
      case X86_VPCMPBZrmik:
507
69
        NewOpc = X86_VPCMPBZrmik_alt;
508
69
        break;
509
83
      case X86_VPCMPBZrri:
510
83
        NewOpc = X86_VPCMPBZrri_alt;
511
83
        break;
512
226
      case X86_VPCMPBZrrik:
513
226
        NewOpc = X86_VPCMPBZrrik_alt;
514
226
        break;
515
3
      case X86_VPCMPDZ128rmi:
516
3
        NewOpc = X86_VPCMPDZ128rmi_alt;
517
3
        break;
518
31
      case X86_VPCMPDZ128rmib:
519
31
        NewOpc = X86_VPCMPDZ128rmib_alt;
520
31
        break;
521
228
      case X86_VPCMPDZ128rmibk:
522
228
        NewOpc = X86_VPCMPDZ128rmibk_alt;
523
228
        break;
524
183
      case X86_VPCMPDZ128rmik:
525
183
        NewOpc = X86_VPCMPDZ128rmik_alt;
526
183
        break;
527
6
      case X86_VPCMPDZ128rri:
528
6
        NewOpc = X86_VPCMPDZ128rri_alt;
529
6
        break;
530
196
      case X86_VPCMPDZ128rrik:
531
196
        NewOpc = X86_VPCMPDZ128rrik_alt;
532
196
        break;
533
40
      case X86_VPCMPDZ256rmi:
534
40
        NewOpc = X86_VPCMPDZ256rmi_alt;
535
40
        break;
536
56
      case X86_VPCMPDZ256rmib:
537
56
        NewOpc = X86_VPCMPDZ256rmib_alt;
538
56
        break;
539
159
      case X86_VPCMPDZ256rmibk:
540
159
        NewOpc = X86_VPCMPDZ256rmibk_alt;
541
159
        break;
542
49
      case X86_VPCMPDZ256rmik:
543
49
        NewOpc = X86_VPCMPDZ256rmik_alt;
544
49
        break;
545
32
      case X86_VPCMPDZ256rri:
546
32
        NewOpc = X86_VPCMPDZ256rri_alt;
547
32
        break;
548
143
      case X86_VPCMPDZ256rrik:
549
143
        NewOpc = X86_VPCMPDZ256rrik_alt;
550
143
        break;
551
185
      case X86_VPCMPDZrmi:
552
185
        NewOpc = X86_VPCMPDZrmi_alt;
553
185
        break;
554
238
      case X86_VPCMPDZrmib:
555
238
        NewOpc = X86_VPCMPDZrmib_alt;
556
238
        break;
557
218
      case X86_VPCMPDZrmibk:
558
218
        NewOpc = X86_VPCMPDZrmibk_alt;
559
218
        break;
560
45
      case X86_VPCMPDZrmik:
561
45
        NewOpc = X86_VPCMPDZrmik_alt;
562
45
        break;
563
203
      case X86_VPCMPDZrri:
564
203
        NewOpc = X86_VPCMPDZrri_alt;
565
203
        break;
566
197
      case X86_VPCMPDZrrik:
567
197
        NewOpc = X86_VPCMPDZrrik_alt;
568
197
        break;
569
21
      case X86_VPCMPQZ128rmi:
570
21
        NewOpc = X86_VPCMPQZ128rmi_alt;
571
21
        break;
572
628
      case X86_VPCMPQZ128rmib:
573
628
        NewOpc = X86_VPCMPQZ128rmib_alt;
574
628
        break;
575
59
      case X86_VPCMPQZ128rmibk:
576
59
        NewOpc = X86_VPCMPQZ128rmibk_alt;
577
59
        break;
578
80
      case X86_VPCMPQZ128rmik:
579
80
        NewOpc = X86_VPCMPQZ128rmik_alt;
580
80
        break;
581
165
      case X86_VPCMPQZ128rri:
582
165
        NewOpc = X86_VPCMPQZ128rri_alt;
583
165
        break;
584
155
      case X86_VPCMPQZ128rrik:
585
155
        NewOpc = X86_VPCMPQZ128rrik_alt;
586
155
        break;
587
130
      case X86_VPCMPQZ256rmi:
588
130
        NewOpc = X86_VPCMPQZ256rmi_alt;
589
130
        break;
590
21
      case X86_VPCMPQZ256rmib:
591
21
        NewOpc = X86_VPCMPQZ256rmib_alt;
592
21
        break;
593
171
      case X86_VPCMPQZ256rmibk:
594
171
        NewOpc = X86_VPCMPQZ256rmibk_alt;
595
171
        break;
596
82
      case X86_VPCMPQZ256rmik:
597
82
        NewOpc = X86_VPCMPQZ256rmik_alt;
598
82
        break;
599
362
      case X86_VPCMPQZ256rri:
600
362
        NewOpc = X86_VPCMPQZ256rri_alt;
601
362
        break;
602
62
      case X86_VPCMPQZ256rrik:
603
62
        NewOpc = X86_VPCMPQZ256rrik_alt;
604
62
        break;
605
67
      case X86_VPCMPQZrmi:
606
67
        NewOpc = X86_VPCMPQZrmi_alt;
607
67
        break;
608
66
      case X86_VPCMPQZrmib:
609
66
        NewOpc = X86_VPCMPQZrmib_alt;
610
66
        break;
611
183
      case X86_VPCMPQZrmibk:
612
183
        NewOpc = X86_VPCMPQZrmibk_alt;
613
183
        break;
614
176
      case X86_VPCMPQZrmik:
615
176
        NewOpc = X86_VPCMPQZrmik_alt;
616
176
        break;
617
212
      case X86_VPCMPQZrri:
618
212
        NewOpc = X86_VPCMPQZrri_alt;
619
212
        break;
620
29
      case X86_VPCMPQZrrik:
621
29
        NewOpc = X86_VPCMPQZrrik_alt;
622
29
        break;
623
2
      case X86_VPCMPUBZ128rmi:
624
2
        NewOpc = X86_VPCMPUBZ128rmi_alt;
625
2
        break;
626
80
      case X86_VPCMPUBZ128rmik:
627
80
        NewOpc = X86_VPCMPUBZ128rmik_alt;
628
80
        break;
629
15
      case X86_VPCMPUBZ128rri:
630
15
        NewOpc = X86_VPCMPUBZ128rri_alt;
631
15
        break;
632
47
      case X86_VPCMPUBZ128rrik:
633
47
        NewOpc = X86_VPCMPUBZ128rrik_alt;
634
47
        break;
635
24
      case X86_VPCMPUBZ256rmi:
636
24
        NewOpc = X86_VPCMPUBZ256rmi_alt;
637
24
        break;
638
53
      case X86_VPCMPUBZ256rmik:
639
53
        NewOpc = X86_VPCMPUBZ256rmik_alt;
640
53
        break;
641
198
      case X86_VPCMPUBZ256rri:
642
198
        NewOpc = X86_VPCMPUBZ256rri_alt;
643
198
        break;
644
26
      case X86_VPCMPUBZ256rrik:
645
26
        NewOpc = X86_VPCMPUBZ256rrik_alt;
646
26
        break;
647
31
      case X86_VPCMPUBZrmi:
648
31
        NewOpc = X86_VPCMPUBZrmi_alt;
649
31
        break;
650
260
      case X86_VPCMPUBZrmik:
651
260
        NewOpc = X86_VPCMPUBZrmik_alt;
652
260
        break;
653
182
      case X86_VPCMPUBZrri:
654
182
        NewOpc = X86_VPCMPUBZrri_alt;
655
182
        break;
656
200
      case X86_VPCMPUBZrrik:
657
200
        NewOpc = X86_VPCMPUBZrrik_alt;
658
200
        break;
659
5
      case X86_VPCMPUDZ128rmi:
660
5
        NewOpc = X86_VPCMPUDZ128rmi_alt;
661
5
        break;
662
151
      case X86_VPCMPUDZ128rmib:
663
151
        NewOpc = X86_VPCMPUDZ128rmib_alt;
664
151
        break;
665
62
      case X86_VPCMPUDZ128rmibk:
666
62
        NewOpc = X86_VPCMPUDZ128rmibk_alt;
667
62
        break;
668
97
      case X86_VPCMPUDZ128rmik:
669
97
        NewOpc = X86_VPCMPUDZ128rmik_alt;
670
97
        break;
671
53
      case X86_VPCMPUDZ128rri:
672
53
        NewOpc = X86_VPCMPUDZ128rri_alt;
673
53
        break;
674
43
      case X86_VPCMPUDZ128rrik:
675
43
        NewOpc = X86_VPCMPUDZ128rrik_alt;
676
43
        break;
677
31
      case X86_VPCMPUDZ256rmi:
678
31
        NewOpc = X86_VPCMPUDZ256rmi_alt;
679
31
        break;
680
247
      case X86_VPCMPUDZ256rmib:
681
247
        NewOpc = X86_VPCMPUDZ256rmib_alt;
682
247
        break;
683
151
      case X86_VPCMPUDZ256rmibk:
684
151
        NewOpc = X86_VPCMPUDZ256rmibk_alt;
685
151
        break;
686
171
      case X86_VPCMPUDZ256rmik:
687
171
        NewOpc = X86_VPCMPUDZ256rmik_alt;
688
171
        break;
689
178
      case X86_VPCMPUDZ256rri:
690
178
        NewOpc = X86_VPCMPUDZ256rri_alt;
691
178
        break;
692
57
      case X86_VPCMPUDZ256rrik:
693
57
        NewOpc = X86_VPCMPUDZ256rrik_alt;
694
57
        break;
695
131
      case X86_VPCMPUDZrmi:
696
131
        NewOpc = X86_VPCMPUDZrmi_alt;
697
131
        break;
698
325
      case X86_VPCMPUDZrmib:
699
325
        NewOpc = X86_VPCMPUDZrmib_alt;
700
325
        break;
701
232
      case X86_VPCMPUDZrmibk:
702
232
        NewOpc = X86_VPCMPUDZrmibk_alt;
703
232
        break;
704
176
      case X86_VPCMPUDZrmik:
705
176
        NewOpc = X86_VPCMPUDZrmik_alt;
706
176
        break;
707
215
      case X86_VPCMPUDZrri:
708
215
        NewOpc = X86_VPCMPUDZrri_alt;
709
215
        break;
710
197
      case X86_VPCMPUDZrrik:
711
197
        NewOpc = X86_VPCMPUDZrrik_alt;
712
197
        break;
713
169
      case X86_VPCMPUQZ128rmi:
714
169
        NewOpc = X86_VPCMPUQZ128rmi_alt;
715
169
        break;
716
112
      case X86_VPCMPUQZ128rmib:
717
112
        NewOpc = X86_VPCMPUQZ128rmib_alt;
718
112
        break;
719
372
      case X86_VPCMPUQZ128rmibk:
720
372
        NewOpc = X86_VPCMPUQZ128rmibk_alt;
721
372
        break;
722
33
      case X86_VPCMPUQZ128rmik:
723
33
        NewOpc = X86_VPCMPUQZ128rmik_alt;
724
33
        break;
725
102
      case X86_VPCMPUQZ128rri:
726
102
        NewOpc = X86_VPCMPUQZ128rri_alt;
727
102
        break;
728
60
      case X86_VPCMPUQZ128rrik:
729
60
        NewOpc = X86_VPCMPUQZ128rrik_alt;
730
60
        break;
731
12
      case X86_VPCMPUQZ256rmi:
732
12
        NewOpc = X86_VPCMPUQZ256rmi_alt;
733
12
        break;
734
133
      case X86_VPCMPUQZ256rmib:
735
133
        NewOpc = X86_VPCMPUQZ256rmib_alt;
736
133
        break;
737
187
      case X86_VPCMPUQZ256rmibk:
738
187
        NewOpc = X86_VPCMPUQZ256rmibk_alt;
739
187
        break;
740
229
      case X86_VPCMPUQZ256rmik:
741
229
        NewOpc = X86_VPCMPUQZ256rmik_alt;
742
229
        break;
743
286
      case X86_VPCMPUQZ256rri:
744
286
        NewOpc = X86_VPCMPUQZ256rri_alt;
745
286
        break;
746
155
      case X86_VPCMPUQZ256rrik:
747
155
        NewOpc = X86_VPCMPUQZ256rrik_alt;
748
155
        break;
749
48
      case X86_VPCMPUQZrmi:
750
48
        NewOpc = X86_VPCMPUQZrmi_alt;
751
48
        break;
752
212
      case X86_VPCMPUQZrmib:
753
212
        NewOpc = X86_VPCMPUQZrmib_alt;
754
212
        break;
755
84
      case X86_VPCMPUQZrmibk:
756
84
        NewOpc = X86_VPCMPUQZrmibk_alt;
757
84
        break;
758
111
      case X86_VPCMPUQZrmik:
759
111
        NewOpc = X86_VPCMPUQZrmik_alt;
760
111
        break;
761
335
      case X86_VPCMPUQZrri:
762
335
        NewOpc = X86_VPCMPUQZrri_alt;
763
335
        break;
764
186
      case X86_VPCMPUQZrrik:
765
186
        NewOpc = X86_VPCMPUQZrrik_alt;
766
186
        break;
767
17
      case X86_VPCMPUWZ128rmi:
768
17
        NewOpc = X86_VPCMPUWZ128rmi_alt;
769
17
        break;
770
149
      case X86_VPCMPUWZ128rmik:
771
149
        NewOpc = X86_VPCMPUWZ128rmik_alt;
772
149
        break;
773
73
      case X86_VPCMPUWZ128rri:
774
73
        NewOpc = X86_VPCMPUWZ128rri_alt;
775
73
        break;
776
305
      case X86_VPCMPUWZ128rrik:
777
305
        NewOpc = X86_VPCMPUWZ128rrik_alt;
778
305
        break;
779
64
      case X86_VPCMPUWZ256rmi:
780
64
        NewOpc = X86_VPCMPUWZ256rmi_alt;
781
64
        break;
782
36
      case X86_VPCMPUWZ256rmik:
783
36
        NewOpc = X86_VPCMPUWZ256rmik_alt;
784
36
        break;
785
49
      case X86_VPCMPUWZ256rri:
786
49
        NewOpc = X86_VPCMPUWZ256rri_alt;
787
49
        break;
788
75
      case X86_VPCMPUWZ256rrik:
789
75
        NewOpc = X86_VPCMPUWZ256rrik_alt;
790
75
        break;
791
90
      case X86_VPCMPUWZrmi:
792
90
        NewOpc = X86_VPCMPUWZrmi_alt;
793
90
        break;
794
57
      case X86_VPCMPUWZrmik:
795
57
        NewOpc = X86_VPCMPUWZrmik_alt;
796
57
        break;
797
152
      case X86_VPCMPUWZrri:
798
152
        NewOpc = X86_VPCMPUWZrri_alt;
799
152
        break;
800
233
      case X86_VPCMPUWZrrik:
801
233
        NewOpc = X86_VPCMPUWZrrik_alt;
802
233
        break;
803
31
      case X86_VPCMPWZ128rmi:
804
31
        NewOpc = X86_VPCMPWZ128rmi_alt;
805
31
        break;
806
176
      case X86_VPCMPWZ128rmik:
807
176
        NewOpc = X86_VPCMPWZ128rmik_alt;
808
176
        break;
809
145
      case X86_VPCMPWZ128rri:
810
145
        NewOpc = X86_VPCMPWZ128rri_alt;
811
145
        break;
812
47
      case X86_VPCMPWZ128rrik:
813
47
        NewOpc = X86_VPCMPWZ128rrik_alt;
814
47
        break;
815
56
      case X86_VPCMPWZ256rmi:
816
56
        NewOpc = X86_VPCMPWZ256rmi_alt;
817
56
        break;
818
98
      case X86_VPCMPWZ256rmik:
819
98
        NewOpc = X86_VPCMPWZ256rmik_alt;
820
98
        break;
821
242
      case X86_VPCMPWZ256rri:
822
242
        NewOpc = X86_VPCMPWZ256rri_alt;
823
242
        break;
824
174
      case X86_VPCMPWZ256rrik:
825
174
        NewOpc = X86_VPCMPWZ256rrik_alt;
826
174
        break;
827
66
      case X86_VPCMPWZrmi:
828
66
        NewOpc = X86_VPCMPWZrmi_alt;
829
66
        break;
830
170
      case X86_VPCMPWZrmik:
831
170
        NewOpc = X86_VPCMPWZrmik_alt;
832
170
        break;
833
57
      case X86_VPCMPWZrri:
834
57
        NewOpc = X86_VPCMPWZrri_alt;
835
57
        break;
836
4
      case X86_VPCMPWZrrik:
837
4
        NewOpc = X86_VPCMPWZrrik_alt;
838
4
        break;
839
15.7k
      }
840
841
      // Switch opcode to the one that doesn't get special printing.
842
15.7k
      if (NewOpc != 0) {
843
15.7k
        MCInst_setOpcode(mcInst, NewOpc);
844
15.7k
      }
845
15.7k
    }
846
24.1k
#endif
847
24.1k
  }
848
849
372k
  switch (type) {
850
1.46k
  case TYPE_XMM:
851
1.46k
    MCOperand_CreateReg0(mcInst,
852
1.46k
             X86_XMM0 + ((uint32_t)immediate >> 4));
853
1.46k
    return;
854
2.01k
  case TYPE_YMM:
855
2.01k
    MCOperand_CreateReg0(mcInst,
856
2.01k
             X86_YMM0 + ((uint32_t)immediate >> 4));
857
2.01k
    return;
858
0
  case TYPE_ZMM:
859
0
    MCOperand_CreateReg0(mcInst,
860
0
             X86_ZMM0 + ((uint32_t)immediate >> 4));
861
0
    return;
862
369k
  default:
863
    // operand is 64 bits wide.  Do nothing.
864
369k
    break;
865
372k
  }
866
867
369k
  MCOperand_CreateImm0(mcInst, immediate);
868
869
369k
  if (type == TYPE_MOFFS) {
870
14.2k
    MCOperand_CreateReg0(mcInst,
871
14.2k
             segmentRegnums[insn->segmentOverride]);
872
14.2k
  }
873
369k
}
874
875
/// translateRMRegister - Translates a register stored in the R/M field of the
876
///   ModR/M byte to its LLVM equivalent and appends it to an MCInst.
877
/// @param mcInst       - The MCInst to append to.
878
/// @param insn         - The internal instruction to extract the R/M field
879
///                       from.
880
/// @return             - 0 on success; -1 otherwise
881
static bool translateRMRegister(MCInst *mcInst, InternalInstruction *insn)
882
272k
{
883
272k
  if (insn->eaBase == EA_BASE_sib || insn->eaBase == EA_BASE_sib64) {
884
    //debug("A R/M register operand may not have a SIB byte");
885
0
    return true;
886
0
  }
887
888
272k
  switch (insn->eaBase) {
889
0
  case EA_BASE_NONE:
890
    //debug("EA_BASE_NONE for ModR/M base");
891
0
    return true;
892
0
#define ENTRY(x) case EA_BASE_##x:
893
0
    ALL_EA_BASES
894
0
#undef ENTRY
895
    //debug("A R/M register operand may not have a base; "
896
    //      "the operand must be a register.");
897
0
    return true;
898
0
#define ENTRY(x) \
899
272k
  case EA_REG_##x: \
900
272k
    MCOperand_CreateReg0(mcInst, X86_##x); \
901
272k
    break;
902
0
    ALL_REGS
903
0
#undef ENTRY
904
0
  default:
905
    //debug("Unexpected EA base register");
906
0
    return true;
907
272k
  }
908
909
272k
  return false;
910
272k
}
911
912
/// translateRMMemory - Translates a memory operand stored in the Mod and R/M
913
///   fields of an internal instruction (and possibly its SIB byte) to a memory
914
///   operand in LLVM's format, and appends it to an MCInst.
915
///
916
/// @param mcInst       - The MCInst to append to.
917
/// @param insn         - The instruction to extract Mod, R/M, and SIB fields
918
///                       from.
919
/// @return             - 0 on success; nonzero otherwise
920
static bool translateRMMemory(MCInst *mcInst, InternalInstruction *insn)
921
531k
{
922
  // Addresses in an MCInst are represented as five operands:
923
  //   1. basereg       (register)  The R/M base, or (if there is a SIB) the
924
  //                                SIB base
925
  //   2. scaleamount   (immediate) 1, or (if there is a SIB) the specified
926
  //                                scale amount
927
  //   3. indexreg      (register)  x86_registerNONE, or (if there is a SIB)
928
  //                                the index (which is multiplied by the
929
  //                                scale amount)
930
  //   4. displacement  (immediate) 0, or the displacement if there is one
931
  //   5. segmentreg    (register)  x86_registerNONE for now, but could be set
932
  //                                if we have segment overrides
933
531k
  int scaleAmount, indexReg;
934
935
531k
  if (insn->eaBase == EA_BASE_sib || insn->eaBase == EA_BASE_sib64) {
936
38.7k
    if (insn->sibBase != SIB_BASE_NONE) {
937
36.1k
      switch (insn->sibBase) {
938
0
#define ENTRY(x) \
939
36.1k
  case SIB_BASE_##x: \
940
36.1k
    MCOperand_CreateReg0(mcInst, X86_##x); \
941
36.1k
    break;
942
0
        ALL_SIB_BASES
943
0
#undef ENTRY
944
0
      default:
945
        //debug("Unexpected sibBase");
946
0
        return true;
947
36.1k
      }
948
36.1k
    } else {
949
2.58k
      MCOperand_CreateReg0(mcInst, 0);
950
2.58k
    }
951
952
38.7k
    if (insn->sibIndex != SIB_INDEX_NONE) {
953
32.1k
      switch (insn->sibIndex) {
954
0
      default:
955
        //debug("Unexpected sibIndex");
956
0
        return true;
957
0
#define ENTRY(x) \
958
32.1k
  case SIB_INDEX_##x: \
959
32.1k
    indexReg = X86_##x; \
960
32.1k
    break;
961
0
        EA_BASES_32BIT
962
215
        EA_BASES_64BIT
963
258
        REGS_XMM
964
109
        REGS_YMM
965
32.1k
        REGS_ZMM
966
32.1k
#undef ENTRY
967
32.1k
      }
968
32.1k
    } else {
969
      // Use EIZ/RIZ for a few ambiguous cases where the SIB byte is present,
970
      // but no index is used and modrm alone should have been enough.
971
      // -No base register in 32-bit mode. In 64-bit mode this is used to
972
      //  avoid rip-relative addressing.
973
      // -Any base register used other than ESP/RSP/R12D/R12. Using these as a
974
      //  base always requires a SIB byte.
975
      // -A scale other than 1 is used.
976
6.66k
      if (insn->sibScale != 1 ||
977
4.49k
          (insn->sibBase == SIB_BASE_NONE &&
978
1.02k
           insn->mode != MODE_64BIT) ||
979
4.07k
          (insn->sibBase != SIB_BASE_NONE &&
980
3.46k
           insn->sibBase != SIB_BASE_ESP &&
981
2.69k
           insn->sibBase != SIB_BASE_RSP &&
982
2.08k
           insn->sibBase != SIB_BASE_R12D &&
983
3.83k
           insn->sibBase != SIB_BASE_R12)) {
984
3.83k
        indexReg = insn->addressSize == 4 ? X86_EIZ :
985
3.83k
                    X86_RIZ;
986
3.83k
      } else
987
2.82k
        indexReg = 0;
988
6.66k
    }
989
990
38.7k
    scaleAmount = insn->sibScale;
991
492k
  } else {
992
492k
    switch (insn->eaBase) {
993
11.5k
    case EA_BASE_NONE:
994
11.5k
      if (insn->eaDisplacement == EA_DISP_NONE) {
995
        //debug("EA_BASE_NONE and EA_DISP_NONE for ModR/M base");
996
0
        return true;
997
0
      }
998
11.5k
      if (insn->mode == MODE_64BIT) {
999
2.47k
        if (insn->prefix3 ==
1000
2.47k
            0x67) // address-size prefix overrides RIP relative addressing
1001
412
          MCOperand_CreateReg0(mcInst, X86_EIP);
1002
2.06k
        else
1003
          // Section 2.2.1.6
1004
2.06k
          MCOperand_CreateReg0(
1005
2.06k
            mcInst, insn->addressSize == 4 ?
1006
0
                X86_EIP :
1007
2.06k
                X86_RIP);
1008
9.07k
      } else {
1009
9.07k
        MCOperand_CreateReg0(mcInst, 0);
1010
9.07k
      }
1011
1012
11.5k
      indexReg = 0;
1013
11.5k
      break;
1014
52.2k
    case EA_BASE_BX_SI:
1015
52.2k
      MCOperand_CreateReg0(mcInst, X86_BX);
1016
52.2k
      indexReg = X86_SI;
1017
52.2k
      break;
1018
25.6k
    case EA_BASE_BX_DI:
1019
25.6k
      MCOperand_CreateReg0(mcInst, X86_BX);
1020
25.6k
      indexReg = X86_DI;
1021
25.6k
      break;
1022
19.0k
    case EA_BASE_BP_SI:
1023
19.0k
      MCOperand_CreateReg0(mcInst, X86_BP);
1024
19.0k
      indexReg = X86_SI;
1025
19.0k
      break;
1026
17.0k
    case EA_BASE_BP_DI:
1027
17.0k
      MCOperand_CreateReg0(mcInst, X86_BP);
1028
17.0k
      indexReg = X86_DI;
1029
17.0k
      break;
1030
367k
    default:
1031
367k
      indexReg = 0;
1032
367k
      switch (insn->eaBase) {
1033
0
      default:
1034
        //debug("Unexpected eaBase");
1035
0
        return true;
1036
        // Here, we will use the fill-ins defined above.  However,
1037
        //   BX_SI, BX_DI, BP_SI, and BP_DI are all handled above and
1038
        //   sib and sib64 were handled in the top-level if, so they're only
1039
        //   placeholders to keep the compiler happy.
1040
0
#define ENTRY(x) \
1041
367k
  case EA_BASE_##x: \
1042
367k
    MCOperand_CreateReg0(mcInst, X86_##x); \
1043
367k
    break;
1044
0
        ALL_EA_BASES
1045
0
#undef ENTRY
1046
11.8k
#define ENTRY(x) case EA_REG_##x:
1047
3.94k
        ALL_REGS
1048
0
#undef ENTRY
1049
        //debug("A R/M memory operand may not be a register; "
1050
        //      "the base field must be a base.");
1051
0
        return true;
1052
367k
      }
1053
492k
    }
1054
1055
492k
    scaleAmount = 1;
1056
492k
  }
1057
1058
531k
  MCOperand_CreateImm0(mcInst, scaleAmount);
1059
531k
  MCOperand_CreateReg0(mcInst, indexReg);
1060
531k
  MCOperand_CreateImm0(mcInst, insn->displacement);
1061
1062
531k
  MCOperand_CreateReg0(mcInst, segmentRegnums[insn->segmentOverride]);
1063
1064
531k
  return false;
1065
531k
}
1066
1067
/// translateRM - Translates an operand stored in the R/M (and possibly SIB)
1068
///   byte of an instruction to LLVM form, and appends it to an MCInst.
1069
///
1070
/// @param mcInst       - The MCInst to append to.
1071
/// @param operand      - The operand, as stored in the descriptor table.
1072
/// @param insn         - The instruction to extract Mod, R/M, and SIB fields
1073
///                       from.
1074
/// @return             - 0 on success; nonzero otherwise
1075
static bool translateRM(MCInst *mcInst, const OperandSpecifier *operand,
1076
      InternalInstruction *insn)
1077
803k
{
1078
803k
  switch (operand->type) {
1079
0
  default:
1080
    //debug("Unexpected type for a R/M operand");
1081
0
    return true;
1082
83.8k
  case TYPE_R8:
1083
84.8k
  case TYPE_R16:
1084
86.9k
  case TYPE_R32:
1085
104k
  case TYPE_R64:
1086
186k
  case TYPE_Rv:
1087
191k
  case TYPE_MM64:
1088
225k
  case TYPE_XMM:
1089
244k
  case TYPE_YMM:
1090
267k
  case TYPE_ZMM:
1091
270k
  case TYPE_VK:
1092
270k
  case TYPE_DEBUGREG:
1093
270k
  case TYPE_CONTROLREG:
1094
272k
  case TYPE_BNDR:
1095
272k
    return translateRMRegister(mcInst, insn);
1096
520k
  case TYPE_M:
1097
524k
  case TYPE_MVSIBX:
1098
527k
  case TYPE_MVSIBY:
1099
531k
  case TYPE_MVSIBZ:
1100
531k
    return translateRMMemory(mcInst, insn);
1101
803k
  }
1102
803k
}
1103
1104
/// translateFPRegister - Translates a stack position on the FPU stack to its
1105
///   LLVM form, and appends it to an MCInst.
1106
///
1107
/// @param mcInst       - The MCInst to append to.
1108
/// @param stackPos     - The stack position to translate.
1109
static void translateFPRegister(MCInst *mcInst, uint8_t stackPos)
1110
5.51k
{
1111
5.51k
  MCOperand_CreateReg0(mcInst, X86_ST0 + stackPos);
1112
5.51k
}
1113
1114
/// translateMaskRegister - Translates a 3-bit mask register number to
1115
///   LLVM form, and appends it to an MCInst.
1116
///
1117
/// @param mcInst       - The MCInst to append to.
1118
/// @param maskRegNum   - Number of mask register from 0 to 7.
1119
/// @return             - false on success; true otherwise.
1120
static bool translateMaskRegister(MCInst *mcInst, uint8_t maskRegNum)
1121
84.4k
{
1122
84.4k
  if (maskRegNum >= 8) {
1123
    // debug("Invalid mask register number");
1124
0
    return true;
1125
0
  }
1126
1127
84.4k
  MCOperand_CreateReg0(mcInst, X86_K0 + maskRegNum);
1128
1129
84.4k
  return false;
1130
84.4k
}
1131
1132
/// translateOperand - Translates an operand stored in an internal instruction
1133
///   to LLVM's format and appends it to an MCInst.
1134
///
1135
/// @param mcInst       - The MCInst to append to.
1136
/// @param operand      - The operand, as stored in the descriptor table.
1137
/// @param insn         - The internal instruction.
1138
/// @return             - false on success; true otherwise.
1139
static bool translateOperand(MCInst *mcInst, const OperandSpecifier *operand,
1140
           InternalInstruction *insn)
1141
2.66M
{
1142
2.66M
  switch (operand->encoding) {
1143
683k
  case ENCODING_REG:
1144
683k
    translateRegister(mcInst, insn->reg);
1145
683k
    return false;
1146
84.4k
  case ENCODING_WRITEMASK:
1147
84.4k
    return translateMaskRegister(mcInst, insn->writemask);
1148
5.10M
CASE_ENCODING_RM:
1149
5.10M
CASE_ENCODING_VSIB:
1150
803k
    return translateRM(mcInst, operand, insn);
1151
288k
  case ENCODING_IB:
1152
305k
  case ENCODING_IW:
1153
311k
  case ENCODING_ID:
1154
312k
  case ENCODING_IO:
1155
358k
  case ENCODING_Iv:
1156
372k
  case ENCODING_Ia:
1157
372k
    translateImmediate(
1158
372k
      mcInst,
1159
372k
      insn->immediates[insn->numImmediatesTranslated++],
1160
372k
      operand, insn);
1161
372k
    return false;
1162
6.12k
  case ENCODING_IRC:
1163
6.12k
    MCOperand_CreateImm0(mcInst, insn->RC);
1164
6.12k
    return false;
1165
54.0k
  case ENCODING_SI:
1166
54.0k
    return translateSrcIndex(mcInst, insn);
1167
70.9k
  case ENCODING_DI:
1168
70.9k
    return translateDstIndex(mcInst, insn);
1169
14.1k
  case ENCODING_RB:
1170
14.1k
  case ENCODING_RW:
1171
14.1k
  case ENCODING_RD:
1172
35.1k
  case ENCODING_RO:
1173
174k
  case ENCODING_Rv:
1174
174k
    translateRegister(mcInst, insn->opcodeRegister);
1175
174k
    return false;
1176
5.51k
  case ENCODING_FP:
1177
5.51k
    translateFPRegister(mcInst, insn->modRM & 7);
1178
5.51k
    return false;
1179
115k
  case ENCODING_VVVV:
1180
115k
    translateRegister(mcInst, insn->vvvv);
1181
115k
    return false;
1182
292k
  case ENCODING_DUP:
1183
292k
    return translateOperand(
1184
292k
      mcInst, &insn->operands[operand->type - TYPE_DUP0],
1185
292k
      insn);
1186
0
  default:
1187
    //debug("Unhandled operand encoding during translation");
1188
0
    return true;
1189
2.66M
  }
1190
2.66M
}
1191
1192
static bool translateInstruction(MCInst *mcInst, InternalInstruction *insn)
1193
1.27M
{
1194
1.27M
  int index;
1195
1196
1.27M
  if (!insn->spec) {
1197
    //debug("Instruction has no specification");
1198
0
    return true;
1199
0
  }
1200
1201
1.27M
  MCInst_clear(mcInst);
1202
1.27M
  MCInst_setOpcode(mcInst, insn->instructionID);
1203
1204
  // If when reading the prefix bytes we determined the overlapping 0xf2 or 0xf3
1205
  // prefix bytes should be disassembled as xrelease and xacquire then set the
1206
  // opcode to those instead of the rep and repne opcodes.
1207
1.27M
#ifndef CAPSTONE_X86_REDUCE
1208
1.27M
  if (insn->xAcquireRelease) {
1209
7.51k
    if (MCInst_getOpcode(mcInst) == X86_REP_PREFIX)
1210
0
      MCInst_setOpcode(mcInst, X86_XRELEASE_PREFIX);
1211
7.51k
    else if (MCInst_getOpcode(mcInst) == X86_REPNE_PREFIX)
1212
0
      MCInst_setOpcode(mcInst, X86_XACQUIRE_PREFIX);
1213
7.51k
  }
1214
1.27M
#endif
1215
1216
1.27M
  insn->numImmediatesTranslated = 0;
1217
1218
8.90M
  for (index = 0; index < X86_MAX_OPERANDS; ++index) {
1219
7.63M
    if (insn->operands[index].encoding != ENCODING_NONE) {
1220
2.37M
      if (translateOperand(mcInst, &insn->operands[index],
1221
2.37M
               insn)) {
1222
0
        return true;
1223
0
      }
1224
2.37M
    }
1225
7.63M
  }
1226
1227
1.27M
  return false;
1228
1.27M
}
1229
1230
static int reader(const struct reader_info *info, uint8_t *byte,
1231
      uint64_t address)
1232
6.19M
{
1233
6.19M
  if (address - info->offset >= info->size)
1234
    // out of buffer range
1235
7.28k
    return -1;
1236
1237
6.18M
  *byte = info->code[address - info->offset];
1238
1239
6.18M
  return 0;
1240
6.19M
}
1241
1242
// copy x86 detail information from internal structure to public structure
1243
static void update_pub_insn(cs_insn *pub, InternalInstruction *inter)
1244
1.27M
{
1245
1.27M
  if (inter->vectorExtensionType != 0) {
1246
156k
    memcpy(pub->detail->x86.opcode, inter->vectorExtensionPrefix,
1247
156k
           sizeof(pub->detail->x86.opcode));
1248
1.11M
  } else {
1249
1.11M
    if (inter->twoByteEscape) {
1250
79.6k
      if (inter->threeByteEscape) {
1251
0
        pub->detail->x86.opcode[0] =
1252
0
          inter->twoByteEscape;
1253
0
        pub->detail->x86.opcode[1] =
1254
0
          inter->threeByteEscape;
1255
0
        pub->detail->x86.opcode[2] = inter->opcode;
1256
79.6k
      } else {
1257
79.6k
        pub->detail->x86.opcode[0] =
1258
79.6k
          inter->twoByteEscape;
1259
79.6k
        pub->detail->x86.opcode[1] = inter->opcode;
1260
79.6k
      }
1261
1.03M
    } else {
1262
1.03M
      pub->detail->x86.opcode[0] = inter->opcode;
1263
1.03M
    }
1264
1.11M
  }
1265
1266
1.27M
  pub->detail->x86.rex = inter->rexPrefix;
1267
1268
1.27M
  pub->detail->x86.addr_size = inter->addressSize;
1269
1270
1.27M
  pub->detail->x86.modrm = inter->orgModRM;
1271
1.27M
  pub->detail->x86.encoding.modrm_offset = inter->modRMOffset;
1272
1273
1.27M
  pub->detail->x86.sib = inter->sib;
1274
1.27M
  pub->detail->x86.sib_index = x86_map_sib_index(inter->sibIndex);
1275
1.27M
  pub->detail->x86.sib_scale = inter->sibScale;
1276
1.27M
  pub->detail->x86.sib_base = x86_map_sib_base(inter->sibBase);
1277
1278
1.27M
  pub->detail->x86.disp = inter->displacement;
1279
1.27M
  if (inter->consumedDisplacement) {
1280
181k
    pub->detail->x86.encoding.disp_offset =
1281
181k
      inter->displacementOffset;
1282
181k
    pub->detail->x86.encoding.disp_size = inter->displacementSize;
1283
181k
  }
1284
1285
1.27M
  pub->detail->x86.encoding.imm_offset = inter->immediateOffset;
1286
1.27M
  if (pub->detail->x86.encoding.imm_size == 0 &&
1287
1.27M
      inter->immediateOffset != 0)
1288
349k
    pub->detail->x86.encoding.imm_size = inter->immediateSize;
1289
1.27M
}
1290
1291
void X86_init(MCRegisterInfo *MRI)
1292
22.6k
{
1293
  // InitMCRegisterInfo(), X86GenRegisterInfo.inc
1294
  // RI->InitMCRegisterInfo(X86RegDesc, 277,
1295
  //                        RA, PC,
1296
  //                        X86MCRegisterClasses, 86,
1297
  //                        X86RegUnitRoots, 162, X86RegDiffLists, X86LaneMaskLists, X86RegStrings,
1298
  //                        X86RegClassStrings,
1299
  //                        X86SubRegIdxLists, 9,
1300
  //                        X86SubRegIdxRanges, X86RegEncodingTable);
1301
  /*
1302
     InitMCRegisterInfo(X86RegDesc, 234,
1303
     RA, PC,
1304
     X86MCRegisterClasses, 79,
1305
     X86RegUnitRoots, 119, X86RegDiffLists, X86RegStrings,
1306
     X86SubRegIdxLists, 7,
1307
     X86SubRegIdxRanges, X86RegEncodingTable);
1308
  */
1309
1310
22.6k
  MCRegisterInfo_InitMCRegisterInfo(MRI, X86RegDesc, 277, 0, 0,
1311
22.6k
            X86MCRegisterClasses, 86, 0, 0,
1312
22.6k
            X86RegDiffLists, 0, X86SubRegIdxLists,
1313
22.6k
            9, 0);
1314
22.6k
}
1315
1316
// Public interface for the disassembler
1317
bool X86_getInstruction(csh ud, const uint8_t *code, size_t code_len,
1318
      MCInst *instr, uint16_t *size, uint64_t address,
1319
      void *_info)
1320
1.28M
{
1321
1.28M
  cs_struct *handle = (cs_struct *)(uintptr_t)ud;
1322
1.28M
  InternalInstruction insn = { 0 };
1323
1.28M
  struct reader_info info;
1324
1.28M
  int ret;
1325
1.28M
  bool result;
1326
1327
1.28M
  info.code = code;
1328
1.28M
  info.size = code_len;
1329
1.28M
  info.offset = address;
1330
1331
1.28M
  if (instr->flat_insn->detail) {
1332
    // instr->flat_insn->detail initialization: 3 alternatives
1333
1334
    // 1. The whole structure, this is how it's done in other arch disassemblers
1335
    // Probably overkill since cs_detail is huge because of the 36 operands of ARM
1336
1337
    //memset(instr->flat_insn->detail, 0, sizeof(cs_detail));
1338
1339
    // 2. Only the part relevant to x86
1340
1.28M
    memset(instr->flat_insn->detail, 0,
1341
1.28M
           offsetof(cs_detail, x86) + sizeof(cs_x86));
1342
1343
    // 3. The relevant part except for x86.operands
1344
    // sizeof(cs_x86) is 0x1c0, sizeof(x86.operands) is 0x180
1345
    // marginally faster, should be okay since x86.op_count is set to 0
1346
1347
    //memset(instr->flat_insn->detail, 0, offsetof(cs_detail, x86)+offsetof(cs_x86, operands));
1348
1.28M
  }
1349
1350
1.28M
  if (handle->mode & CS_MODE_16)
1351
394k
    ret = decodeInstruction(&insn, reader, &info, address,
1352
394k
          MODE_16BIT);
1353
887k
  else if (handle->mode & CS_MODE_32)
1354
411k
    ret = decodeInstruction(&insn, reader, &info, address,
1355
411k
          MODE_32BIT);
1356
476k
  else
1357
476k
    ret = decodeInstruction(&insn, reader, &info, address,
1358
476k
          MODE_64BIT);
1359
1360
1.28M
  if (ret) {
1361
    // *size = (uint16_t)(insn.readerCursor - address);
1362
9.06k
    return false;
1363
1.27M
  } else {
1364
1.27M
    *size = (uint16_t)insn.length;
1365
1366
1.27M
    result = (!translateInstruction(instr, &insn)) ? true : false;
1367
1.27M
    if (result) {
1368
1.27M
      unsigned Flags = X86_IP_NO_PREFIX;
1369
1.27M
      instr->imm_size = insn.immSize;
1370
1371
      // copy all prefixes
1372
1.27M
      instr->x86_prefix[0] = insn.prefix0;
1373
1.27M
      instr->x86_prefix[1] = insn.prefix1;
1374
1.27M
      instr->x86_prefix[2] = insn.prefix2;
1375
1.27M
      instr->x86_prefix[3] = insn.prefix3;
1376
1.27M
      instr->xAcquireRelease = insn.xAcquireRelease;
1377
1378
1.27M
      if (handle->detail_opt) {
1379
1.27M
        update_pub_insn(instr->flat_insn, &insn);
1380
1.27M
      }
1381
1382
1.27M
      if (insn.hasAdSize)
1383
12.2k
        Flags |= X86_IP_HAS_AD_SIZE;
1384
1385
1.27M
      if (!insn.mandatoryPrefix) {
1386
1.24M
        if (insn.hasOpSize)
1387
31.7k
          Flags |= X86_IP_HAS_OP_SIZE;
1388
1389
1.24M
        if (insn.repeatPrefix == 0xf2)
1390
37.8k
          Flags |= X86_IP_HAS_REPEAT_NE;
1391
1.21M
        else if (insn.repeatPrefix == 0xf3 &&
1392
           // It should not be 'pause' f3 90
1393
34.4k
           insn.opcode != 0x90)
1394
33.8k
          Flags |= X86_IP_HAS_REPEAT;
1395
1.24M
        if (insn.hasLockPrefix)
1396
67.6k
          Flags |= X86_IP_HAS_LOCK;
1397
1.24M
      }
1398
1399
1.27M
      instr->flags = Flags;
1400
1.27M
    }
1401
1402
1.27M
    return result;
1403
1.27M
  }
1404
1.28M
}
1405
1406
#endif