1 //===-- X86DisassemblerDecoderInternal.h - Disassembler decoder -*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file is part of the X86 Disassembler. 10 // It contains the public interface of the instruction decoder. 11 // Documentation for the disassembler can be found in X86Disassembler.h. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_LIB_TARGET_X86_DISASSEMBLER_X86DISASSEMBLERDECODER_H 16 #define LLVM_LIB_TARGET_X86_DISASSEMBLER_X86DISASSEMBLERDECODER_H 17 18 #include "llvm/ADT/ArrayRef.h" 19 #include "llvm/Support/X86DisassemblerDecoderCommon.h" 20 21 namespace llvm { 22 namespace X86Disassembler { 23 // Helper macros 24 #define bitFromOffset0(val) ((val) & 0x1) 25 #define bitFromOffset1(val) (((val) >> 1) & 0x1) 26 #define bitFromOffset2(val) (((val) >> 2) & 0x1) 27 #define bitFromOffset3(val) (((val) >> 3) & 0x1) 28 #define bitFromOffset4(val) (((val) >> 4) & 0x1) 29 #define bitFromOffset5(val) (((val) >> 5) & 0x1) 30 #define bitFromOffset6(val) (((val) >> 6) & 0x1) 31 #define bitFromOffset7(val) (((val) >> 7) & 0x1) 32 #define twoBitsFromOffset0(val) ((val) & 0x3) 33 #define twoBitsFromOffset6(val) (((val) >> 6) & 0x3) 34 #define threeBitsFromOffset0(val) ((val) & 0x7) 35 #define threeBitsFromOffset3(val) (((val) >> 3) & 0x7) 36 #define fourBitsFromOffset0(val) ((val) & 0xf) 37 #define fourBitsFromOffset3(val) (((val) >> 3) & 0xf) 38 #define fiveBitsFromOffset0(val) ((val) & 0x1f) 39 #define invertedBitFromOffset2(val) (((~(val)) >> 2) & 0x1) 40 #define invertedBitFromOffset3(val) (((~(val)) >> 3) & 0x1) 41 #define invertedBitFromOffset4(val) (((~(val)) >> 4) & 0x1) 42 #define invertedBitFromOffset5(val) (((~(val)) >> 5) & 0x1) 43 #define invertedBitFromOffset6(val) (((~(val)) >> 6) & 0x1) 44 #define invertedBitFromOffset7(val) (((~(val)) >> 7) & 0x1) 45 #define invertedFourBitsFromOffset3(val) (((~(val)) >> 3) & 0xf) 46 // MOD/RM 47 #define modFromModRM(modRM) twoBitsFromOffset6(modRM) 48 #define regFromModRM(modRM) threeBitsFromOffset3(modRM) 49 #define rmFromModRM(modRM) threeBitsFromOffset0(modRM) 50 // SIB 51 #define scaleFromSIB(sib) twoBitsFromOffset6(sib) 52 #define indexFromSIB(sib) threeBitsFromOffset3(sib) 53 #define baseFromSIB(sib) threeBitsFromOffset0(sib) 54 // REX 55 #define wFromREX(rex) bitFromOffset3(rex) 56 #define rFromREX(rex) bitFromOffset2(rex) 57 #define xFromREX(rex) bitFromOffset1(rex) 58 #define bFromREX(rex) bitFromOffset0(rex) 59 // REX2 60 #define mFromREX2(rex2) bitFromOffset7(rex2) 61 #define r2FromREX2(rex2) bitFromOffset6(rex2) 62 #define x2FromREX2(rex2) bitFromOffset5(rex2) 63 #define b2FromREX2(rex2) bitFromOffset4(rex2) 64 #define wFromREX2(rex2) bitFromOffset3(rex2) 65 #define rFromREX2(rex2) bitFromOffset2(rex2) 66 #define xFromREX2(rex2) bitFromOffset1(rex2) 67 #define bFromREX2(rex2) bitFromOffset0(rex2) 68 // XOP 69 #define rFromXOP2of3(xop) invertedBitFromOffset7(xop) 70 #define xFromXOP2of3(xop) invertedBitFromOffset6(xop) 71 #define bFromXOP2of3(xop) invertedBitFromOffset5(xop) 72 #define mmmmmFromXOP2of3(xop) fiveBitsFromOffset0(xop) 73 #define wFromXOP3of3(xop) bitFromOffset7(xop) 74 #define vvvvFromXOP3of3(xop) invertedFourBitsFromOffset3(xop) 75 #define lFromXOP3of3(xop) bitFromOffset2(xop) 76 #define ppFromXOP3of3(xop) twoBitsFromOffset0(xop) 77 // VEX2 78 #define rFromVEX2of2(vex) invertedBitFromOffset7(vex) 79 #define vvvvFromVEX2of2(vex) invertedFourBitsFromOffset3(vex) 80 #define lFromVEX2of2(vex) bitFromOffset2(vex) 81 #define ppFromVEX2of2(vex) twoBitsFromOffset0(vex) 82 // VEX3 83 #define rFromVEX2of3(vex) invertedBitFromOffset7(vex) 84 #define xFromVEX2of3(vex) invertedBitFromOffset6(vex) 85 #define bFromVEX2of3(vex) invertedBitFromOffset5(vex) 86 #define mmmmmFromVEX2of3(vex) fiveBitsFromOffset0(vex) 87 #define wFromVEX3of3(vex) bitFromOffset7(vex) 88 #define vvvvFromVEX3of3(vex) invertedFourBitsFromOffset3(vex) 89 #define lFromVEX3of3(vex) bitFromOffset2(vex) 90 #define ppFromVEX3of3(vex) twoBitsFromOffset0(vex) 91 // EVEX 92 #define rFromEVEX2of4(evex) invertedBitFromOffset7(evex) 93 #define xFromEVEX2of4(evex) invertedBitFromOffset6(evex) 94 #define bFromEVEX2of4(evex) invertedBitFromOffset5(evex) 95 #define r2FromEVEX2of4(evex) invertedBitFromOffset4(evex) 96 #define b2FromEVEX2of4(evex) bitFromOffset3(evex) 97 #define mmmFromEVEX2of4(evex) threeBitsFromOffset0(evex) 98 #define wFromEVEX3of4(evex) bitFromOffset7(evex) 99 #define vvvvFromEVEX3of4(evex) invertedFourBitsFromOffset3(evex) 100 #define x2FromEVEX3of4(evex) invertedBitFromOffset2(evex) 101 #define ppFromEVEX3of4(evex) twoBitsFromOffset0(evex) 102 #define oszcFromEVEX3of4(evex) fourBitsFromOffset3(evex) 103 #define zFromEVEX4of4(evex) bitFromOffset7(evex) 104 #define l2FromEVEX4of4(evex) bitFromOffset6(evex) 105 #define lFromEVEX4of4(evex) bitFromOffset5(evex) 106 #define bFromEVEX4of4(evex) bitFromOffset4(evex) 107 #define v2FromEVEX4of4(evex) invertedBitFromOffset3(evex) 108 #define aaaFromEVEX4of4(evex) threeBitsFromOffset0(evex) 109 #define nfFromEVEX4of4(evex) bitFromOffset2(evex) 110 #define scFromEVEX4of4(evex) fourBitsFromOffset0(evex) 111 112 // These enums represent Intel registers for use by the decoder. 113 #define REGS_8BIT \ 114 ENTRY(AL) \ 115 ENTRY(CL) \ 116 ENTRY(DL) \ 117 ENTRY(BL) \ 118 ENTRY(AH) \ 119 ENTRY(CH) \ 120 ENTRY(DH) \ 121 ENTRY(BH) \ 122 ENTRY(R8B) \ 123 ENTRY(R9B) \ 124 ENTRY(R10B) \ 125 ENTRY(R11B) \ 126 ENTRY(R12B) \ 127 ENTRY(R13B) \ 128 ENTRY(R14B) \ 129 ENTRY(R15B) \ 130 ENTRY(R16B) \ 131 ENTRY(R17B) \ 132 ENTRY(R18B) \ 133 ENTRY(R19B) \ 134 ENTRY(R20B) \ 135 ENTRY(R21B) \ 136 ENTRY(R22B) \ 137 ENTRY(R23B) \ 138 ENTRY(R24B) \ 139 ENTRY(R25B) \ 140 ENTRY(R26B) \ 141 ENTRY(R27B) \ 142 ENTRY(R28B) \ 143 ENTRY(R29B) \ 144 ENTRY(R30B) \ 145 ENTRY(R31B) \ 146 ENTRY(SPL) \ 147 ENTRY(BPL) \ 148 ENTRY(SIL) \ 149 ENTRY(DIL) 150 151 #define EA_BASES_16BIT \ 152 ENTRY(BX_SI) \ 153 ENTRY(BX_DI) \ 154 ENTRY(BP_SI) \ 155 ENTRY(BP_DI) \ 156 ENTRY(SI) \ 157 ENTRY(DI) \ 158 ENTRY(BP) \ 159 ENTRY(BX) \ 160 ENTRY(R8W) \ 161 ENTRY(R9W) \ 162 ENTRY(R10W) \ 163 ENTRY(R11W) \ 164 ENTRY(R12W) \ 165 ENTRY(R13W) \ 166 ENTRY(R14W) \ 167 ENTRY(R15W) \ 168 ENTRY(R16W) \ 169 ENTRY(R17W) \ 170 ENTRY(R18W) \ 171 ENTRY(R19W) \ 172 ENTRY(R20W) \ 173 ENTRY(R21W) \ 174 ENTRY(R22W) \ 175 ENTRY(R23W) \ 176 ENTRY(R24W) \ 177 ENTRY(R25W) \ 178 ENTRY(R26W) \ 179 ENTRY(R27W) \ 180 ENTRY(R28W) \ 181 ENTRY(R29W) \ 182 ENTRY(R30W) \ 183 ENTRY(R31W) 184 185 #define REGS_16BIT \ 186 ENTRY(AX) \ 187 ENTRY(CX) \ 188 ENTRY(DX) \ 189 ENTRY(BX) \ 190 ENTRY(SP) \ 191 ENTRY(BP) \ 192 ENTRY(SI) \ 193 ENTRY(DI) \ 194 ENTRY(R8W) \ 195 ENTRY(R9W) \ 196 ENTRY(R10W) \ 197 ENTRY(R11W) \ 198 ENTRY(R12W) \ 199 ENTRY(R13W) \ 200 ENTRY(R14W) \ 201 ENTRY(R15W) \ 202 ENTRY(R16W) \ 203 ENTRY(R17W) \ 204 ENTRY(R18W) \ 205 ENTRY(R19W) \ 206 ENTRY(R20W) \ 207 ENTRY(R21W) \ 208 ENTRY(R22W) \ 209 ENTRY(R23W) \ 210 ENTRY(R24W) \ 211 ENTRY(R25W) \ 212 ENTRY(R26W) \ 213 ENTRY(R27W) \ 214 ENTRY(R28W) \ 215 ENTRY(R29W) \ 216 ENTRY(R30W) \ 217 ENTRY(R31W) 218 219 #define EA_BASES_32BIT \ 220 ENTRY(EAX) \ 221 ENTRY(ECX) \ 222 ENTRY(EDX) \ 223 ENTRY(EBX) \ 224 ENTRY(sib) \ 225 ENTRY(EBP) \ 226 ENTRY(ESI) \ 227 ENTRY(EDI) \ 228 ENTRY(R8D) \ 229 ENTRY(R9D) \ 230 ENTRY(R10D) \ 231 ENTRY(R11D) \ 232 ENTRY(R12D) \ 233 ENTRY(R13D) \ 234 ENTRY(R14D) \ 235 ENTRY(R15D) \ 236 ENTRY(R16D) \ 237 ENTRY(R17D) \ 238 ENTRY(R18D) \ 239 ENTRY(R19D) \ 240 ENTRY(R20D) \ 241 ENTRY(R21D) \ 242 ENTRY(R22D) \ 243 ENTRY(R23D) \ 244 ENTRY(R24D) \ 245 ENTRY(R25D) \ 246 ENTRY(R26D) \ 247 ENTRY(R27D) \ 248 ENTRY(R28D) \ 249 ENTRY(R29D) \ 250 ENTRY(R30D) \ 251 ENTRY(R31D) 252 253 #define REGS_32BIT \ 254 ENTRY(EAX) \ 255 ENTRY(ECX) \ 256 ENTRY(EDX) \ 257 ENTRY(EBX) \ 258 ENTRY(ESP) \ 259 ENTRY(EBP) \ 260 ENTRY(ESI) \ 261 ENTRY(EDI) \ 262 ENTRY(R8D) \ 263 ENTRY(R9D) \ 264 ENTRY(R10D) \ 265 ENTRY(R11D) \ 266 ENTRY(R12D) \ 267 ENTRY(R13D) \ 268 ENTRY(R14D) \ 269 ENTRY(R15D) \ 270 ENTRY(R16D) \ 271 ENTRY(R17D) \ 272 ENTRY(R18D) \ 273 ENTRY(R19D) \ 274 ENTRY(R20D) \ 275 ENTRY(R21D) \ 276 ENTRY(R22D) \ 277 ENTRY(R23D) \ 278 ENTRY(R24D) \ 279 ENTRY(R25D) \ 280 ENTRY(R26D) \ 281 ENTRY(R27D) \ 282 ENTRY(R28D) \ 283 ENTRY(R29D) \ 284 ENTRY(R30D) \ 285 ENTRY(R31D) 286 287 #define EA_BASES_64BIT \ 288 ENTRY(RAX) \ 289 ENTRY(RCX) \ 290 ENTRY(RDX) \ 291 ENTRY(RBX) \ 292 ENTRY(sib64) \ 293 ENTRY(RBP) \ 294 ENTRY(RSI) \ 295 ENTRY(RDI) \ 296 ENTRY(R8) \ 297 ENTRY(R9) \ 298 ENTRY(R10) \ 299 ENTRY(R11) \ 300 ENTRY(R12) \ 301 ENTRY(R13) \ 302 ENTRY(R14) \ 303 ENTRY(R15) \ 304 ENTRY(R16) \ 305 ENTRY(R17) \ 306 ENTRY(R18) \ 307 ENTRY(R19) \ 308 ENTRY(R20) \ 309 ENTRY(R21) \ 310 ENTRY(R22) \ 311 ENTRY(R23) \ 312 ENTRY(R24) \ 313 ENTRY(R25) \ 314 ENTRY(R26) \ 315 ENTRY(R27) \ 316 ENTRY(R28) \ 317 ENTRY(R29) \ 318 ENTRY(R30) \ 319 ENTRY(R31) 320 321 #define REGS_64BIT \ 322 ENTRY(RAX) \ 323 ENTRY(RCX) \ 324 ENTRY(RDX) \ 325 ENTRY(RBX) \ 326 ENTRY(RSP) \ 327 ENTRY(RBP) \ 328 ENTRY(RSI) \ 329 ENTRY(RDI) \ 330 ENTRY(R8) \ 331 ENTRY(R9) \ 332 ENTRY(R10) \ 333 ENTRY(R11) \ 334 ENTRY(R12) \ 335 ENTRY(R13) \ 336 ENTRY(R14) \ 337 ENTRY(R15) \ 338 ENTRY(R16) \ 339 ENTRY(R17) \ 340 ENTRY(R18) \ 341 ENTRY(R19) \ 342 ENTRY(R20) \ 343 ENTRY(R21) \ 344 ENTRY(R22) \ 345 ENTRY(R23) \ 346 ENTRY(R24) \ 347 ENTRY(R25) \ 348 ENTRY(R26) \ 349 ENTRY(R27) \ 350 ENTRY(R28) \ 351 ENTRY(R29) \ 352 ENTRY(R30) \ 353 ENTRY(R31) 354 355 #define REGS_MMX \ 356 ENTRY(MM0) \ 357 ENTRY(MM1) \ 358 ENTRY(MM2) \ 359 ENTRY(MM3) \ 360 ENTRY(MM4) \ 361 ENTRY(MM5) \ 362 ENTRY(MM6) \ 363 ENTRY(MM7) 364 365 #define REGS_XMM \ 366 ENTRY(XMM0) \ 367 ENTRY(XMM1) \ 368 ENTRY(XMM2) \ 369 ENTRY(XMM3) \ 370 ENTRY(XMM4) \ 371 ENTRY(XMM5) \ 372 ENTRY(XMM6) \ 373 ENTRY(XMM7) \ 374 ENTRY(XMM8) \ 375 ENTRY(XMM9) \ 376 ENTRY(XMM10) \ 377 ENTRY(XMM11) \ 378 ENTRY(XMM12) \ 379 ENTRY(XMM13) \ 380 ENTRY(XMM14) \ 381 ENTRY(XMM15) \ 382 ENTRY(XMM16) \ 383 ENTRY(XMM17) \ 384 ENTRY(XMM18) \ 385 ENTRY(XMM19) \ 386 ENTRY(XMM20) \ 387 ENTRY(XMM21) \ 388 ENTRY(XMM22) \ 389 ENTRY(XMM23) \ 390 ENTRY(XMM24) \ 391 ENTRY(XMM25) \ 392 ENTRY(XMM26) \ 393 ENTRY(XMM27) \ 394 ENTRY(XMM28) \ 395 ENTRY(XMM29) \ 396 ENTRY(XMM30) \ 397 ENTRY(XMM31) 398 399 #define REGS_YMM \ 400 ENTRY(YMM0) \ 401 ENTRY(YMM1) \ 402 ENTRY(YMM2) \ 403 ENTRY(YMM3) \ 404 ENTRY(YMM4) \ 405 ENTRY(YMM5) \ 406 ENTRY(YMM6) \ 407 ENTRY(YMM7) \ 408 ENTRY(YMM8) \ 409 ENTRY(YMM9) \ 410 ENTRY(YMM10) \ 411 ENTRY(YMM11) \ 412 ENTRY(YMM12) \ 413 ENTRY(YMM13) \ 414 ENTRY(YMM14) \ 415 ENTRY(YMM15) \ 416 ENTRY(YMM16) \ 417 ENTRY(YMM17) \ 418 ENTRY(YMM18) \ 419 ENTRY(YMM19) \ 420 ENTRY(YMM20) \ 421 ENTRY(YMM21) \ 422 ENTRY(YMM22) \ 423 ENTRY(YMM23) \ 424 ENTRY(YMM24) \ 425 ENTRY(YMM25) \ 426 ENTRY(YMM26) \ 427 ENTRY(YMM27) \ 428 ENTRY(YMM28) \ 429 ENTRY(YMM29) \ 430 ENTRY(YMM30) \ 431 ENTRY(YMM31) 432 433 #define REGS_ZMM \ 434 ENTRY(ZMM0) \ 435 ENTRY(ZMM1) \ 436 ENTRY(ZMM2) \ 437 ENTRY(ZMM3) \ 438 ENTRY(ZMM4) \ 439 ENTRY(ZMM5) \ 440 ENTRY(ZMM6) \ 441 ENTRY(ZMM7) \ 442 ENTRY(ZMM8) \ 443 ENTRY(ZMM9) \ 444 ENTRY(ZMM10) \ 445 ENTRY(ZMM11) \ 446 ENTRY(ZMM12) \ 447 ENTRY(ZMM13) \ 448 ENTRY(ZMM14) \ 449 ENTRY(ZMM15) \ 450 ENTRY(ZMM16) \ 451 ENTRY(ZMM17) \ 452 ENTRY(ZMM18) \ 453 ENTRY(ZMM19) \ 454 ENTRY(ZMM20) \ 455 ENTRY(ZMM21) \ 456 ENTRY(ZMM22) \ 457 ENTRY(ZMM23) \ 458 ENTRY(ZMM24) \ 459 ENTRY(ZMM25) \ 460 ENTRY(ZMM26) \ 461 ENTRY(ZMM27) \ 462 ENTRY(ZMM28) \ 463 ENTRY(ZMM29) \ 464 ENTRY(ZMM30) \ 465 ENTRY(ZMM31) 466 467 #define REGS_MASKS \ 468 ENTRY(K0) \ 469 ENTRY(K1) \ 470 ENTRY(K2) \ 471 ENTRY(K3) \ 472 ENTRY(K4) \ 473 ENTRY(K5) \ 474 ENTRY(K6) \ 475 ENTRY(K7) 476 477 #define REGS_MASK_PAIRS \ 478 ENTRY(K0_K1) \ 479 ENTRY(K2_K3) \ 480 ENTRY(K4_K5) \ 481 ENTRY(K6_K7) 482 483 #define REGS_SEGMENT \ 484 ENTRY(ES) \ 485 ENTRY(CS) \ 486 ENTRY(SS) \ 487 ENTRY(DS) \ 488 ENTRY(FS) \ 489 ENTRY(GS) 490 491 #define REGS_DEBUG \ 492 ENTRY(DR0) \ 493 ENTRY(DR1) \ 494 ENTRY(DR2) \ 495 ENTRY(DR3) \ 496 ENTRY(DR4) \ 497 ENTRY(DR5) \ 498 ENTRY(DR6) \ 499 ENTRY(DR7) \ 500 ENTRY(DR8) \ 501 ENTRY(DR9) \ 502 ENTRY(DR10) \ 503 ENTRY(DR11) \ 504 ENTRY(DR12) \ 505 ENTRY(DR13) \ 506 ENTRY(DR14) \ 507 ENTRY(DR15) 508 509 #define REGS_CONTROL \ 510 ENTRY(CR0) \ 511 ENTRY(CR1) \ 512 ENTRY(CR2) \ 513 ENTRY(CR3) \ 514 ENTRY(CR4) \ 515 ENTRY(CR5) \ 516 ENTRY(CR6) \ 517 ENTRY(CR7) \ 518 ENTRY(CR8) \ 519 ENTRY(CR9) \ 520 ENTRY(CR10) \ 521 ENTRY(CR11) \ 522 ENTRY(CR12) \ 523 ENTRY(CR13) \ 524 ENTRY(CR14) \ 525 ENTRY(CR15) 526 527 #undef REGS_TMM 528 #define REGS_TMM \ 529 ENTRY(TMM0) \ 530 ENTRY(TMM1) \ 531 ENTRY(TMM2) \ 532 ENTRY(TMM3) \ 533 ENTRY(TMM4) \ 534 ENTRY(TMM5) \ 535 ENTRY(TMM6) \ 536 ENTRY(TMM7) 537 538 #define ALL_EA_BASES \ 539 EA_BASES_16BIT \ 540 EA_BASES_32BIT \ 541 EA_BASES_64BIT 542 543 #define ALL_SIB_BASES \ 544 REGS_32BIT \ 545 REGS_64BIT 546 547 #define ALL_REGS \ 548 REGS_8BIT \ 549 REGS_16BIT \ 550 REGS_32BIT \ 551 REGS_64BIT \ 552 REGS_MMX \ 553 REGS_XMM \ 554 REGS_YMM \ 555 REGS_ZMM \ 556 REGS_MASKS \ 557 REGS_MASK_PAIRS \ 558 REGS_SEGMENT \ 559 REGS_DEBUG \ 560 REGS_CONTROL \ 561 REGS_TMM \ 562 ENTRY(RIP) 563 564 /// All possible values of the base field for effective-address 565 /// computations, a.k.a. the Mod and R/M fields of the ModR/M byte. 566 /// We distinguish between bases (EA_BASE_*) and registers that just happen 567 /// to be referred to when Mod == 0b11 (EA_REG_*). 568 enum EABase { 569 // clang-format off 570 EA_BASE_NONE, 571 #define ENTRY(x) EA_BASE_##x, 572 ALL_EA_BASES 573 #undef ENTRY 574 #define ENTRY(x) EA_REG_##x, 575 ALL_REGS 576 #undef ENTRY 577 EA_max 578 // clang-format on 579 }; 580 581 /// All possible values of the SIB index field. 582 /// borrows entries from ALL_EA_BASES with the special case that 583 /// sib is synonymous with NONE. 584 /// Vector SIB: index can be XMM or YMM. 585 enum SIBIndex { 586 // clang-format off 587 SIB_INDEX_NONE, 588 #define ENTRY(x) SIB_INDEX_##x, 589 ALL_EA_BASES 590 REGS_XMM 591 REGS_YMM 592 REGS_ZMM 593 #undef ENTRY 594 SIB_INDEX_max 595 // clang-format on 596 }; 597 598 /// All possible values of the SIB base field. 599 enum SIBBase { 600 // clang-format off 601 SIB_BASE_NONE, 602 #define ENTRY(x) SIB_BASE_##x, 603 ALL_SIB_BASES 604 #undef ENTRY 605 SIB_BASE_max 606 // clang-format on 607 }; 608 609 /// Possible displacement types for effective-address computations. 610 enum EADisplacement { EA_DISP_NONE, EA_DISP_8, EA_DISP_16, EA_DISP_32 }; 611 612 /// All possible values of the reg field in the ModR/M byte. 613 // clang-format off 614 enum Reg { 615 #define ENTRY(x) MODRM_REG_##x, 616 ALL_REGS 617 #undef ENTRY 618 MODRM_REG_max 619 }; 620 // clang-format on 621 622 /// All possible segment overrides. 623 enum SegmentOverride { 624 SEG_OVERRIDE_NONE, 625 SEG_OVERRIDE_CS, 626 SEG_OVERRIDE_SS, 627 SEG_OVERRIDE_DS, 628 SEG_OVERRIDE_ES, 629 SEG_OVERRIDE_FS, 630 SEG_OVERRIDE_GS, 631 SEG_OVERRIDE_max 632 }; 633 634 /// Possible values for the VEX.m-mmmm field 635 enum VEXLeadingOpcodeByte { 636 VEX_LOB_0F = 0x1, 637 VEX_LOB_0F38 = 0x2, 638 VEX_LOB_0F3A = 0x3, 639 VEX_LOB_MAP4 = 0x4, 640 VEX_LOB_MAP5 = 0x5, 641 VEX_LOB_MAP6 = 0x6, 642 VEX_LOB_MAP7 = 0x7 643 }; 644 645 enum XOPMapSelect { 646 XOP_MAP_SELECT_8 = 0x8, 647 XOP_MAP_SELECT_9 = 0x9, 648 XOP_MAP_SELECT_A = 0xA 649 }; 650 651 /// Possible values for the VEX.pp/EVEX.pp field 652 enum VEXPrefixCode { 653 VEX_PREFIX_NONE = 0x0, 654 VEX_PREFIX_66 = 0x1, 655 VEX_PREFIX_F3 = 0x2, 656 VEX_PREFIX_F2 = 0x3 657 }; 658 659 enum VectorExtensionType { 660 TYPE_NO_VEX_XOP = 0x0, 661 TYPE_VEX_2B = 0x1, 662 TYPE_VEX_3B = 0x2, 663 TYPE_EVEX = 0x3, 664 TYPE_XOP = 0x4 665 }; 666 667 /// The specification for how to extract and interpret a full instruction and 668 /// its operands. 669 struct InstructionSpecifier { 670 uint16_t operands; 671 }; 672 673 /// The x86 internal instruction, which is produced by the decoder. 674 struct InternalInstruction { 675 // Opaque value passed to the reader 676 llvm::ArrayRef<uint8_t> bytes; 677 // The address of the next byte to read via the reader 678 uint64_t readerCursor; 679 680 // General instruction information 681 682 // The mode to disassemble for (64-bit, protected, real) 683 DisassemblerMode mode; 684 // The start of the instruction, usable with the reader 685 uint64_t startLocation; 686 // The length of the instruction, in bytes 687 size_t length; 688 689 // Prefix state 690 691 // The possible mandatory prefix 692 uint8_t mandatoryPrefix; 693 // The value of the vector extension prefix(EVEX/VEX/XOP), if present 694 uint8_t vectorExtensionPrefix[4]; 695 // The type of the vector extension prefix 696 VectorExtensionType vectorExtensionType; 697 // The value of the REX2 prefix, if present 698 uint8_t rex2ExtensionPrefix[2]; 699 // The value of the REX prefix, if present 700 uint8_t rexPrefix; 701 // The segment override type 702 SegmentOverride segmentOverride; 703 // 1 if the prefix byte, 0xf2 or 0xf3 is xacquire or xrelease 704 bool xAcquireRelease; 705 706 // Address-size override 707 bool hasAdSize; 708 // Operand-size override 709 bool hasOpSize; 710 // Lock prefix 711 bool hasLockPrefix; 712 // The repeat prefix if any 713 uint8_t repeatPrefix; 714 715 // Sizes of various critical pieces of data, in bytes 716 uint8_t registerSize; 717 uint8_t addressSize; 718 uint8_t displacementSize; 719 uint8_t immediateSize; 720 721 // Offsets from the start of the instruction to the pieces of data, which is 722 // needed to find relocation entries for adding symbolic operands. 723 uint8_t displacementOffset; 724 uint8_t immediateOffset; 725 726 // opcode state 727 728 // The last byte of the opcode, not counting any ModR/M extension 729 uint8_t opcode; 730 731 // decode state 732 733 // The type of opcode, used for indexing into the array of decode tables 734 OpcodeType opcodeType; 735 // The instruction ID, extracted from the decode table 736 uint16_t instructionID; 737 // The specifier for the instruction, from the instruction info table 738 const InstructionSpecifier *spec; 739 740 // state for additional bytes, consumed during operand decode. Pattern: 741 // consumed___ indicates that the byte was already consumed and does not 742 // need to be consumed again. 743 744 // The VEX.vvvv field, which contains a third register operand for some AVX 745 // instructions. 746 Reg vvvv; 747 748 // The writemask for AVX-512 instructions which is contained in EVEX.aaa 749 Reg writemask; 750 751 // The ModR/M byte, which contains most register operands and some portion of 752 // all memory operands. 753 bool consumedModRM; 754 uint8_t modRM; 755 756 // The SIB byte, used for more complex 32- or 64-bit memory operands 757 uint8_t sib; 758 759 // The displacement, used for memory operands 760 int32_t displacement; 761 762 // Immediates. There can be three in some cases 763 uint8_t numImmediatesConsumed; 764 uint8_t numImmediatesTranslated; 765 uint64_t immediates[3]; 766 767 // A register or immediate operand encoded into the opcode 768 Reg opcodeRegister; 769 770 // Portions of the ModR/M byte 771 772 // These fields determine the allowable values for the ModR/M fields, which 773 // depend on operand and address widths. 774 EABase eaRegBase; 775 Reg regBase; 776 777 // The Mod and R/M fields can encode a base for an effective address, or a 778 // register. These are separated into two fields here. 779 EABase eaBase; 780 EADisplacement eaDisplacement; 781 // The reg field always encodes a register 782 Reg reg; 783 784 // SIB state 785 SIBIndex sibIndexBase; 786 SIBIndex sibIndex; 787 uint8_t sibScale; 788 SIBBase sibBase; 789 790 // Embedded rounding control. 791 uint8_t RC; 792 793 ArrayRef<OperandSpecifier> operands; 794 }; 795 796 } // namespace X86Disassembler 797 } // namespace llvm 798 799 #endif 800