X86RecognizableInstr.cpp revision 201360
1//===- X86RecognizableInstr.cpp - Disassembler instruction spec --*- 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 X86 Disassembler Emitter. 11// It contains the implementation of a single recognizable instruction. 12// Documentation for the disassembler emitter in general can be found in 13// X86DisasemblerEmitter.h. 14// 15//===----------------------------------------------------------------------===// 16 17#include "X86DisassemblerShared.h" 18#include "X86RecognizableInstr.h" 19#include "X86ModRMFilters.h" 20 21#include "llvm/Support/ErrorHandling.h" 22 23#include <string> 24 25using namespace llvm; 26 27// A clone of X86 since we can't depend on something that is generated. 28namespace X86Local { 29 enum { 30 Pseudo = 0, 31 RawFrm = 1, 32 AddRegFrm = 2, 33 MRMDestReg = 3, 34 MRMDestMem = 4, 35 MRMSrcReg = 5, 36 MRMSrcMem = 6, 37 MRM0r = 16, MRM1r = 17, MRM2r = 18, MRM3r = 19, 38 MRM4r = 20, MRM5r = 21, MRM6r = 22, MRM7r = 23, 39 MRM0m = 24, MRM1m = 25, MRM2m = 26, MRM3m = 27, 40 MRM4m = 28, MRM5m = 29, MRM6m = 30, MRM7m = 31, 41 MRMInitReg = 32 42 }; 43 44 enum { 45 TB = 1, 46 REP = 2, 47 D8 = 3, D9 = 4, DA = 5, DB = 6, 48 DC = 7, DD = 8, DE = 9, DF = 10, 49 XD = 11, XS = 12, 50 T8 = 13, TA = 14 51 }; 52} 53 54#define ONE_BYTE_EXTENSION_TABLES \ 55 EXTENSION_TABLE(80) \ 56 EXTENSION_TABLE(81) \ 57 EXTENSION_TABLE(82) \ 58 EXTENSION_TABLE(83) \ 59 EXTENSION_TABLE(8f) \ 60 EXTENSION_TABLE(c0) \ 61 EXTENSION_TABLE(c1) \ 62 EXTENSION_TABLE(c6) \ 63 EXTENSION_TABLE(c7) \ 64 EXTENSION_TABLE(d0) \ 65 EXTENSION_TABLE(d1) \ 66 EXTENSION_TABLE(d2) \ 67 EXTENSION_TABLE(d3) \ 68 EXTENSION_TABLE(f6) \ 69 EXTENSION_TABLE(f7) \ 70 EXTENSION_TABLE(fe) \ 71 EXTENSION_TABLE(ff) 72 73#define TWO_BYTE_EXTENSION_TABLES \ 74 EXTENSION_TABLE(00) \ 75 EXTENSION_TABLE(01) \ 76 EXTENSION_TABLE(18) \ 77 EXTENSION_TABLE(71) \ 78 EXTENSION_TABLE(72) \ 79 EXTENSION_TABLE(73) \ 80 EXTENSION_TABLE(ae) \ 81 EXTENSION_TABLE(b9) \ 82 EXTENSION_TABLE(ba) \ 83 EXTENSION_TABLE(c7) 84 85#define TWO_BYTE_FULL_EXTENSION_TABLES \ 86 EXTENSION_TABLE(01) 87 88 89using namespace X86Disassembler; 90 91/// needsModRMForDecode - Indicates whether a particular instruction requires a 92/// ModR/M byte for the instruction to be properly decoded. For example, a 93/// MRMDestReg instruction needs the Mod field in the ModR/M byte to be set to 94/// 0b11. 95/// 96/// @param form - The form of the instruction. 97/// @return - true if the form implies that a ModR/M byte is required, false 98/// otherwise. 99static bool needsModRMForDecode(uint8_t form) { 100 if (form == X86Local::MRMDestReg || 101 form == X86Local::MRMDestMem || 102 form == X86Local::MRMSrcReg || 103 form == X86Local::MRMSrcMem || 104 (form >= X86Local::MRM0r && form <= X86Local::MRM7r) || 105 (form >= X86Local::MRM0m && form <= X86Local::MRM7m)) 106 return true; 107 else 108 return false; 109} 110 111/// isRegFormat - Indicates whether a particular form requires the Mod field of 112/// the ModR/M byte to be 0b11. 113/// 114/// @param form - The form of the instruction. 115/// @return - true if the form implies that Mod must be 0b11, false 116/// otherwise. 117static bool isRegFormat(uint8_t form) { 118 if (form == X86Local::MRMDestReg || 119 form == X86Local::MRMSrcReg || 120 (form >= X86Local::MRM0r && form <= X86Local::MRM7r)) 121 return true; 122 else 123 return false; 124} 125 126/// byteFromBitsInit - Extracts a value at most 8 bits in width from a BitsInit. 127/// Useful for switch statements and the like. 128/// 129/// @param init - A reference to the BitsInit to be decoded. 130/// @return - The field, with the first bit in the BitsInit as the lowest 131/// order bit. 132static uint8_t byteFromBitsInit(BitsInit &init) { 133 int width = init.getNumBits(); 134 135 assert(width <= 8 && "Field is too large for uint8_t!"); 136 137 int index; 138 uint8_t mask = 0x01; 139 140 uint8_t ret = 0; 141 142 for (index = 0; index < width; index++) { 143 if (static_cast<BitInit*>(init.getBit(index))->getValue()) 144 ret |= mask; 145 146 mask <<= 1; 147 } 148 149 return ret; 150} 151 152/// byteFromRec - Extract a value at most 8 bits in with from a Record given the 153/// name of the field. 154/// 155/// @param rec - The record from which to extract the value. 156/// @param name - The name of the field in the record. 157/// @return - The field, as translated by byteFromBitsInit(). 158static uint8_t byteFromRec(const Record* rec, const std::string &name) { 159 BitsInit* bits = rec->getValueAsBitsInit(name); 160 return byteFromBitsInit(*bits); 161} 162 163RecognizableInstr::RecognizableInstr(DisassemblerTables &tables, 164 const CodeGenInstruction &insn, 165 InstrUID uid) { 166 UID = uid; 167 168 Rec = insn.TheDef; 169 Name = Rec->getName(); 170 Spec = &tables.specForUID(UID); 171 172 if (!Rec->isSubClassOf("X86Inst")) { 173 ShouldBeEmitted = false; 174 return; 175 } 176 177 Prefix = byteFromRec(Rec, "Prefix"); 178 Opcode = byteFromRec(Rec, "Opcode"); 179 Form = byteFromRec(Rec, "FormBits"); 180 SegOvr = byteFromRec(Rec, "SegOvrBits"); 181 182 HasOpSizePrefix = Rec->getValueAsBit("hasOpSizePrefix"); 183 HasREX_WPrefix = Rec->getValueAsBit("hasREX_WPrefix"); 184 HasLockPrefix = Rec->getValueAsBit("hasLockPrefix"); 185 IsCodeGenOnly = Rec->getValueAsBit("isCodeGenOnly"); 186 187 Name = Rec->getName(); 188 AsmString = Rec->getValueAsString("AsmString"); 189 190 Operands = &insn.OperandList; 191 192 IsSSE = HasOpSizePrefix && (Name.find("16") == Name.npos); 193 HasFROperands = false; 194 195 ShouldBeEmitted = true; 196} 197 198void RecognizableInstr::processInstr(DisassemblerTables &tables, 199 const CodeGenInstruction &insn, 200 InstrUID uid) 201{ 202 RecognizableInstr recogInstr(tables, insn, uid); 203 204 recogInstr.emitInstructionSpecifier(tables); 205 206 if (recogInstr.shouldBeEmitted()) 207 recogInstr.emitDecodePath(tables); 208} 209 210InstructionContext RecognizableInstr::insnContext() const { 211 InstructionContext insnContext; 212 213 if (Name.find("64") != Name.npos || HasREX_WPrefix) { 214 if (HasREX_WPrefix && HasOpSizePrefix) 215 insnContext = IC_64BIT_REXW_OPSIZE; 216 else if (HasOpSizePrefix) 217 insnContext = IC_64BIT_OPSIZE; 218 else if (HasREX_WPrefix && Prefix == X86Local::XS) 219 insnContext = IC_64BIT_REXW_XS; 220 else if (HasREX_WPrefix && Prefix == X86Local::XD) 221 insnContext = IC_64BIT_REXW_XD; 222 else if (Prefix == X86Local::XD) 223 insnContext = IC_64BIT_XD; 224 else if (Prefix == X86Local::XS) 225 insnContext = IC_64BIT_XS; 226 else if (HasREX_WPrefix) 227 insnContext = IC_64BIT_REXW; 228 else 229 insnContext = IC_64BIT; 230 } else { 231 if (HasOpSizePrefix) 232 insnContext = IC_OPSIZE; 233 else if (Prefix == X86Local::XD) 234 insnContext = IC_XD; 235 else if (Prefix == X86Local::XS) 236 insnContext = IC_XS; 237 else 238 insnContext = IC; 239 } 240 241 return insnContext; 242} 243 244RecognizableInstr::filter_ret RecognizableInstr::filter() const { 245 // Filter out intrinsics 246 247 if (!Rec->isSubClassOf("X86Inst")) 248 return FILTER_STRONG; 249 250 if (Form == X86Local::Pseudo || 251 IsCodeGenOnly) 252 return FILTER_STRONG; 253 254 // Filter out instructions with a LOCK prefix; 255 // prefer forms that do not have the prefix 256 if (HasLockPrefix) 257 return FILTER_WEAK; 258 259 // Filter out artificial instructions 260 261 if (Name.find("TAILJMP") != Name.npos || 262 Name.find("_Int") != Name.npos || 263 Name.find("_int") != Name.npos || 264 Name.find("Int_") != Name.npos || 265 Name.find("_NOREX") != Name.npos || 266 Name.find("EH_RETURN") != Name.npos || 267 Name.find("V_SET") != Name.npos || 268 Name.find("LOCK_") != Name.npos || 269 Name.find("WIN") != Name.npos) 270 return FILTER_STRONG; 271 272 // Special cases. 273 274 if (Name.find("PCMPISTRI") != Name.npos && Name != "PCMPISTRI") 275 return FILTER_WEAK; 276 if (Name.find("PCMPESTRI") != Name.npos && Name != "PCMPESTRI") 277 return FILTER_WEAK; 278 279 if (Name.find("MOV") != Name.npos && Name.find("r0") != Name.npos) 280 return FILTER_WEAK; 281 if (Name.find("MOVZ") != Name.npos && Name.find("MOVZX") == Name.npos) 282 return FILTER_WEAK; 283 if (Name.find("Fs") != Name.npos) 284 return FILTER_WEAK; 285 if (Name == "MOVLPDrr" || 286 Name == "MOVLPSrr" || 287 Name == "PUSHFQ" || 288 Name == "BSF16rr" || 289 Name == "BSF16rm" || 290 Name == "BSR16rr" || 291 Name == "BSR16rm" || 292 Name == "MOVSX16rm8" || 293 Name == "MOVSX16rr8" || 294 Name == "MOVZX16rm8" || 295 Name == "MOVZX16rr8" || 296 Name == "PUSH32i16" || 297 Name == "PUSH64i16" || 298 Name == "MOVPQI2QImr" || 299 Name == "MOVSDmr" || 300 Name == "MOVSDrm" || 301 Name == "MOVSSmr" || 302 Name == "MOVSSrm" || 303 Name == "MMX_MOVD64rrv164" || 304 Name == "CRC32m16" || 305 Name == "MOV64ri64i32" || 306 Name == "CRC32r16") 307 return FILTER_WEAK; 308 309 // Filter out instructions with segment override prefixes. 310 // They're too messy to handle now and we'll special case them if needed. 311 312 if (SegOvr) 313 return FILTER_STRONG; 314 315 // Filter out instructions that can't be printed. 316 317 if (AsmString.size() == 0) 318 return FILTER_STRONG; 319 320 // Filter out instructions with subreg operands. 321 322 if (AsmString.find("subreg") != AsmString.npos) 323 return FILTER_STRONG; 324 325 assert(Form != X86Local::MRMInitReg && 326 "FORMAT_MRMINITREG instruction not skipped"); 327 328 if (HasFROperands && Name.find("MOV") != Name.npos && 329 ((Name.find("2") != Name.npos && Name.find("32") == Name.npos) || 330 (Name.find("to") != Name.npos))) 331 return FILTER_WEAK; 332 333 return FILTER_NORMAL; 334} 335 336void RecognizableInstr::handleOperand( 337 bool optional, 338 unsigned &operandIndex, 339 unsigned &physicalOperandIndex, 340 unsigned &numPhysicalOperands, 341 unsigned *operandMapping, 342 OperandEncoding (*encodingFromString)(const std::string&, bool hasOpSizePrefix)) { 343 if (optional) { 344 if (physicalOperandIndex >= numPhysicalOperands) 345 return; 346 } else { 347 assert(physicalOperandIndex < numPhysicalOperands); 348 } 349 350 while (operandMapping[operandIndex] != operandIndex) { 351 Spec->operands[operandIndex].encoding = ENCODING_DUP; 352 Spec->operands[operandIndex].type = 353 (OperandType)(TYPE_DUP0 + operandMapping[operandIndex]); 354 ++operandIndex; 355 } 356 357 const std::string &typeName = (*Operands)[operandIndex].Rec->getName(); 358 359 Spec->operands[operandIndex].encoding = encodingFromString(typeName, 360 HasOpSizePrefix); 361 Spec->operands[operandIndex].type = typeFromString(typeName, 362 IsSSE, 363 HasREX_WPrefix, 364 HasOpSizePrefix); 365 366 ++operandIndex; 367 ++physicalOperandIndex; 368} 369 370void RecognizableInstr::emitInstructionSpecifier(DisassemblerTables &tables) { 371 Spec->name = Name; 372 373 if (!Rec->isSubClassOf("X86Inst")) 374 return; 375 376 switch (filter()) { 377 case FILTER_WEAK: 378 Spec->filtered = true; 379 break; 380 case FILTER_STRONG: 381 ShouldBeEmitted = false; 382 return; 383 case FILTER_NORMAL: 384 break; 385 } 386 387 Spec->insnContext = insnContext(); 388 389 const std::vector<CodeGenInstruction::OperandInfo> &OperandList = *Operands; 390 391 unsigned operandIndex; 392 unsigned numOperands = OperandList.size(); 393 unsigned numPhysicalOperands = 0; 394 395 // operandMapping maps from operands in OperandList to their originals. 396 // If operandMapping[i] != i, then the entry is a duplicate. 397 unsigned operandMapping[X86_MAX_OPERANDS]; 398 399 bool hasFROperands = false; 400 401 assert(numOperands < X86_MAX_OPERANDS && "X86_MAX_OPERANDS is not large enough"); 402 403 for (operandIndex = 0; operandIndex < numOperands; ++operandIndex) { 404 if (OperandList[operandIndex].Constraints.size()) { 405 const std::string &constraint = OperandList[operandIndex].Constraints[0]; 406 std::string::size_type tiedToPos; 407 408 if ((tiedToPos = constraint.find(" << 16) | (1 << TOI::TIED_TO))")) != 409 constraint.npos) { 410 tiedToPos--; 411 operandMapping[operandIndex] = constraint[tiedToPos] - '0'; 412 } else { 413 ++numPhysicalOperands; 414 operandMapping[operandIndex] = operandIndex; 415 } 416 } else { 417 ++numPhysicalOperands; 418 operandMapping[operandIndex] = operandIndex; 419 } 420 421 const std::string &recName = OperandList[operandIndex].Rec->getName(); 422 423 if (recName.find("FR") != recName.npos) 424 hasFROperands = true; 425 } 426 427 if (hasFROperands && Name.find("MOV") != Name.npos && 428 ((Name.find("2") != Name.npos && Name.find("32") == Name.npos) || 429 (Name.find("to") != Name.npos))) 430 ShouldBeEmitted = false; 431 432 if (!ShouldBeEmitted) 433 return; 434 435#define HANDLE_OPERAND(class) \ 436 handleOperand(false, \ 437 operandIndex, \ 438 physicalOperandIndex, \ 439 numPhysicalOperands, \ 440 operandMapping, \ 441 class##EncodingFromString); 442 443#define HANDLE_OPTIONAL(class) \ 444 handleOperand(true, \ 445 operandIndex, \ 446 physicalOperandIndex, \ 447 numPhysicalOperands, \ 448 operandMapping, \ 449 class##EncodingFromString); 450 451 // operandIndex should always be < numOperands 452 operandIndex = 0; 453 // physicalOperandIndex should always be < numPhysicalOperands 454 unsigned physicalOperandIndex = 0; 455 456 switch (Form) { 457 case X86Local::RawFrm: 458 // Operand 1 (optional) is an address or immediate. 459 // Operand 2 (optional) is an immediate. 460 assert(numPhysicalOperands <= 2 && 461 "Unexpected number of operands for RawFrm"); 462 HANDLE_OPTIONAL(relocation) 463 HANDLE_OPTIONAL(immediate) 464 break; 465 case X86Local::AddRegFrm: 466 // Operand 1 is added to the opcode. 467 // Operand 2 (optional) is an address. 468 assert(numPhysicalOperands >= 1 && numPhysicalOperands <= 2 && 469 "Unexpected number of operands for AddRegFrm"); 470 HANDLE_OPERAND(opcodeModifier) 471 HANDLE_OPTIONAL(relocation) 472 break; 473 case X86Local::MRMDestReg: 474 // Operand 1 is a register operand in the R/M field. 475 // Operand 2 is a register operand in the Reg/Opcode field. 476 // Operand 3 (optional) is an immediate. 477 assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 && 478 "Unexpected number of operands for MRMDestRegFrm"); 479 HANDLE_OPERAND(rmRegister) 480 HANDLE_OPERAND(roRegister) 481 HANDLE_OPTIONAL(immediate) 482 break; 483 case X86Local::MRMDestMem: 484 // Operand 1 is a memory operand (possibly SIB-extended) 485 // Operand 2 is a register operand in the Reg/Opcode field. 486 // Operand 3 (optional) is an immediate. 487 assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 && 488 "Unexpected number of operands for MRMDestMemFrm"); 489 HANDLE_OPERAND(memory) 490 HANDLE_OPERAND(roRegister) 491 HANDLE_OPTIONAL(immediate) 492 break; 493 case X86Local::MRMSrcReg: 494 // Operand 1 is a register operand in the Reg/Opcode field. 495 // Operand 2 is a register operand in the R/M field. 496 // Operand 3 (optional) is an immediate. 497 assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 && 498 "Unexpected number of operands for MRMSrcRegFrm"); 499 HANDLE_OPERAND(roRegister) 500 HANDLE_OPERAND(rmRegister) 501 HANDLE_OPTIONAL(immediate) 502 break; 503 case X86Local::MRMSrcMem: 504 // Operand 1 is a register operand in the Reg/Opcode field. 505 // Operand 2 is a memory operand (possibly SIB-extended) 506 // Operand 3 (optional) is an immediate. 507 assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 && 508 "Unexpected number of operands for MRMSrcMemFrm"); 509 HANDLE_OPERAND(roRegister) 510 HANDLE_OPERAND(memory) 511 HANDLE_OPTIONAL(immediate) 512 break; 513 case X86Local::MRM0r: 514 case X86Local::MRM1r: 515 case X86Local::MRM2r: 516 case X86Local::MRM3r: 517 case X86Local::MRM4r: 518 case X86Local::MRM5r: 519 case X86Local::MRM6r: 520 case X86Local::MRM7r: 521 // Operand 1 is a register operand in the R/M field. 522 // Operand 2 (optional) is an immediate or relocation. 523 assert(numPhysicalOperands <= 2 && 524 "Unexpected number of operands for MRMnRFrm"); 525 HANDLE_OPTIONAL(rmRegister) 526 HANDLE_OPTIONAL(relocation) 527 break; 528 case X86Local::MRM0m: 529 case X86Local::MRM1m: 530 case X86Local::MRM2m: 531 case X86Local::MRM3m: 532 case X86Local::MRM4m: 533 case X86Local::MRM5m: 534 case X86Local::MRM6m: 535 case X86Local::MRM7m: 536 // Operand 1 is a memory operand (possibly SIB-extended) 537 // Operand 2 (optional) is an immediate or relocation. 538 assert(numPhysicalOperands >= 1 && numPhysicalOperands <= 2 && 539 "Unexpected number of operands for MRMnMFrm"); 540 HANDLE_OPERAND(memory) 541 HANDLE_OPTIONAL(relocation) 542 break; 543 case X86Local::MRMInitReg: 544 // Ignored. 545 break; 546 } 547 548 #undef HANDLE_OPERAND 549 #undef HANDLE_OPTIONAL 550} 551 552void RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const { 553 // Special cases where the LLVM tables are not complete 554 555#define EXACTCASE(class, name, lastbyte) \ 556 if (Name == name) { \ 557 tables.setTableFields(class, \ 558 insnContext(), \ 559 Opcode, \ 560 ExactFilter(lastbyte), \ 561 UID); \ 562 Spec->modifierBase = Opcode; \ 563 return; \ 564 } 565 566 EXACTCASE(TWOBYTE, "MONITOR", 0xc8) 567 EXACTCASE(TWOBYTE, "MWAIT", 0xc9) 568 EXACTCASE(TWOBYTE, "SWPGS", 0xf8) 569 EXACTCASE(TWOBYTE, "INVEPT", 0x80) 570 EXACTCASE(TWOBYTE, "INVVPID", 0x81) 571 EXACTCASE(TWOBYTE, "VMCALL", 0xc1) 572 EXACTCASE(TWOBYTE, "VMLAUNCH", 0xc2) 573 EXACTCASE(TWOBYTE, "VMRESUME", 0xc3) 574 EXACTCASE(TWOBYTE, "VMXOFF", 0xc4) 575 576 if (Name == "INVLPG") { 577 tables.setTableFields(TWOBYTE, 578 insnContext(), 579 Opcode, 580 ExtendedFilter(false, 7), 581 UID); 582 Spec->modifierBase = Opcode; 583 return; 584 } 585 586 OpcodeType opcodeType = (OpcodeType)-1; 587 588 ModRMFilter* filter = NULL; 589 uint8_t opcodeToSet = 0; 590 591 switch (Prefix) { 592 // Extended two-byte opcodes can start with f2 0f, f3 0f, or 0f 593 case X86Local::XD: 594 case X86Local::XS: 595 case X86Local::TB: 596 opcodeType = TWOBYTE; 597 598 switch (Opcode) { 599#define EXTENSION_TABLE(n) case 0x##n: 600 TWO_BYTE_EXTENSION_TABLES 601#undef EXTENSION_TABLE 602 switch (Form) { 603 default: 604 llvm_unreachable("Unhandled two-byte extended opcode"); 605 case X86Local::MRM0r: 606 case X86Local::MRM1r: 607 case X86Local::MRM2r: 608 case X86Local::MRM3r: 609 case X86Local::MRM4r: 610 case X86Local::MRM5r: 611 case X86Local::MRM6r: 612 case X86Local::MRM7r: 613 filter = new ExtendedFilter(true, Form - X86Local::MRM0r); 614 break; 615 case X86Local::MRM0m: 616 case X86Local::MRM1m: 617 case X86Local::MRM2m: 618 case X86Local::MRM3m: 619 case X86Local::MRM4m: 620 case X86Local::MRM5m: 621 case X86Local::MRM6m: 622 case X86Local::MRM7m: 623 filter = new ExtendedFilter(false, Form - X86Local::MRM0m); 624 break; 625 } // switch (Form) 626 break; 627 default: 628 if (needsModRMForDecode(Form)) 629 filter = new ModFilter(isRegFormat(Form)); 630 else 631 filter = new DumbFilter(); 632 633 break; 634 } // switch (opcode) 635 opcodeToSet = Opcode; 636 break; 637 case X86Local::T8: 638 opcodeType = THREEBYTE_38; 639 if (needsModRMForDecode(Form)) 640 filter = new ModFilter(isRegFormat(Form)); 641 else 642 filter = new DumbFilter(); 643 opcodeToSet = Opcode; 644 break; 645 case X86Local::TA: 646 opcodeType = THREEBYTE_3A; 647 if (needsModRMForDecode(Form)) 648 filter = new ModFilter(isRegFormat(Form)); 649 else 650 filter = new DumbFilter(); 651 opcodeToSet = Opcode; 652 break; 653 case X86Local::D8: 654 case X86Local::D9: 655 case X86Local::DA: 656 case X86Local::DB: 657 case X86Local::DC: 658 case X86Local::DD: 659 case X86Local::DE: 660 case X86Local::DF: 661 assert(Opcode >= 0xc0 && "Unexpected opcode for an escape opcode"); 662 opcodeType = ONEBYTE; 663 if (Form == X86Local::AddRegFrm) { 664 Spec->modifierType = MODIFIER_MODRM; 665 Spec->modifierBase = Opcode; 666 filter = new AddRegEscapeFilter(Opcode); 667 } else { 668 filter = new EscapeFilter(true, Opcode); 669 } 670 opcodeToSet = 0xd8 + (Prefix - X86Local::D8); 671 break; 672 default: 673 opcodeType = ONEBYTE; 674 switch (Opcode) { 675#define EXTENSION_TABLE(n) case 0x##n: 676 ONE_BYTE_EXTENSION_TABLES 677#undef EXTENSION_TABLE 678 switch (Form) { 679 default: 680 llvm_unreachable("Fell through the cracks of a single-byte " 681 "extended opcode"); 682 case X86Local::MRM0r: 683 case X86Local::MRM1r: 684 case X86Local::MRM2r: 685 case X86Local::MRM3r: 686 case X86Local::MRM4r: 687 case X86Local::MRM5r: 688 case X86Local::MRM6r: 689 case X86Local::MRM7r: 690 filter = new ExtendedFilter(true, Form - X86Local::MRM0r); 691 break; 692 case X86Local::MRM0m: 693 case X86Local::MRM1m: 694 case X86Local::MRM2m: 695 case X86Local::MRM3m: 696 case X86Local::MRM4m: 697 case X86Local::MRM5m: 698 case X86Local::MRM6m: 699 case X86Local::MRM7m: 700 filter = new ExtendedFilter(false, Form - X86Local::MRM0m); 701 break; 702 } // switch (Form) 703 break; 704 case 0xd8: 705 case 0xd9: 706 case 0xda: 707 case 0xdb: 708 case 0xdc: 709 case 0xdd: 710 case 0xde: 711 case 0xdf: 712 filter = new EscapeFilter(false, Form - X86Local::MRM0m); 713 break; 714 default: 715 if (needsModRMForDecode(Form)) 716 filter = new ModFilter(isRegFormat(Form)); 717 else 718 filter = new DumbFilter(); 719 break; 720 } // switch (Opcode) 721 opcodeToSet = Opcode; 722 } // switch (Prefix) 723 724 assert(opcodeType != (OpcodeType)-1 && 725 "Opcode type not set"); 726 assert(filter && "Filter not set"); 727 728 if (Form == X86Local::AddRegFrm) { 729 if(Spec->modifierType != MODIFIER_MODRM) { 730 assert(opcodeToSet < 0xf9 && 731 "Not enough room for all ADDREG_FRM operands"); 732 733 uint8_t currentOpcode; 734 735 for (currentOpcode = opcodeToSet; 736 currentOpcode < opcodeToSet + 8; 737 ++currentOpcode) 738 tables.setTableFields(opcodeType, 739 insnContext(), 740 currentOpcode, 741 *filter, 742 UID); 743 744 Spec->modifierType = MODIFIER_OPCODE; 745 Spec->modifierBase = opcodeToSet; 746 } else { 747 // modifierBase was set where MODIFIER_MODRM was set 748 tables.setTableFields(opcodeType, 749 insnContext(), 750 opcodeToSet, 751 *filter, 752 UID); 753 } 754 } else { 755 tables.setTableFields(opcodeType, 756 insnContext(), 757 opcodeToSet, 758 *filter, 759 UID); 760 761 Spec->modifierType = MODIFIER_NONE; 762 Spec->modifierBase = opcodeToSet; 763 } 764 765 delete filter; 766} 767 768#define TYPE(str, type) if (s == str) return type; 769OperandType RecognizableInstr::typeFromString(const std::string &s, 770 bool isSSE, 771 bool hasREX_WPrefix, 772 bool hasOpSizePrefix) { 773 if (isSSE) { 774 // For SSE instructions, we ignore the OpSize prefix and force operand 775 // sizes. 776 TYPE("GR16", TYPE_R16) 777 TYPE("GR32", TYPE_R32) 778 TYPE("GR64", TYPE_R64) 779 } 780 if(hasREX_WPrefix) { 781 // For instructions with a REX_W prefix, a declared 32-bit register encoding 782 // is special. 783 TYPE("GR32", TYPE_R32) 784 } 785 if(!hasOpSizePrefix) { 786 // For instructions without an OpSize prefix, a declared 16-bit register or 787 // immediate encoding is special. 788 TYPE("GR16", TYPE_R16) 789 TYPE("i16imm", TYPE_IMM16) 790 } 791 TYPE("i16mem", TYPE_Mv) 792 TYPE("i16imm", TYPE_IMMv) 793 TYPE("i16i8imm", TYPE_IMMv) 794 TYPE("GR16", TYPE_Rv) 795 TYPE("i32mem", TYPE_Mv) 796 TYPE("i32imm", TYPE_IMMv) 797 TYPE("i32i8imm", TYPE_IMM32) 798 TYPE("GR32", TYPE_Rv) 799 TYPE("i64mem", TYPE_Mv) 800 TYPE("i64i32imm", TYPE_IMM64) 801 TYPE("i64i8imm", TYPE_IMM64) 802 TYPE("GR64", TYPE_R64) 803 TYPE("i8mem", TYPE_M8) 804 TYPE("i8imm", TYPE_IMM8) 805 TYPE("GR8", TYPE_R8) 806 TYPE("VR128", TYPE_XMM128) 807 TYPE("f128mem", TYPE_M128) 808 TYPE("FR64", TYPE_XMM64) 809 TYPE("f64mem", TYPE_M64FP) 810 TYPE("FR32", TYPE_XMM32) 811 TYPE("f32mem", TYPE_M32FP) 812 TYPE("RST", TYPE_ST) 813 TYPE("i128mem", TYPE_M128) 814 TYPE("i64i32imm_pcrel", TYPE_REL64) 815 TYPE("i32imm_pcrel", TYPE_REL32) 816 TYPE("SSECC", TYPE_IMM8) 817 TYPE("brtarget", TYPE_RELv) 818 TYPE("brtarget8", TYPE_REL8) 819 TYPE("f80mem", TYPE_M80FP) 820 TYPE("lea32mem", TYPE_LEA) 821 TYPE("lea64_32mem", TYPE_LEA) 822 TYPE("lea64mem", TYPE_LEA) 823 TYPE("VR64", TYPE_MM64) 824 TYPE("i64imm", TYPE_IMMv) 825 TYPE("opaque32mem", TYPE_M1616) 826 TYPE("opaque48mem", TYPE_M1632) 827 TYPE("opaque80mem", TYPE_M1664) 828 TYPE("opaque512mem", TYPE_M512) 829 TYPE("SEGMENT_REG", TYPE_SEGMENTREG) 830 TYPE("DEBUG_REG", TYPE_DEBUGREG) 831 TYPE("CONTROL_REG_32", TYPE_CR32) 832 TYPE("CONTROL_REG_64", TYPE_CR64) 833 TYPE("offset8", TYPE_MOFFS8) 834 TYPE("offset16", TYPE_MOFFS16) 835 TYPE("offset32", TYPE_MOFFS32) 836 TYPE("offset64", TYPE_MOFFS64) 837 errs() << "Unhandled type string " << s << "\n"; 838 llvm_unreachable("Unhandled type string"); 839} 840#undef TYPE 841 842#define ENCODING(str, encoding) if (s == str) return encoding; 843OperandEncoding RecognizableInstr::immediateEncodingFromString 844 (const std::string &s, 845 bool hasOpSizePrefix) { 846 if(!hasOpSizePrefix) { 847 // For instructions without an OpSize prefix, a declared 16-bit register or 848 // immediate encoding is special. 849 ENCODING("i16imm", ENCODING_IW) 850 } 851 ENCODING("i32i8imm", ENCODING_IB) 852 ENCODING("SSECC", ENCODING_IB) 853 ENCODING("i16imm", ENCODING_Iv) 854 ENCODING("i16i8imm", ENCODING_IB) 855 ENCODING("i32imm", ENCODING_Iv) 856 ENCODING("i64i32imm", ENCODING_ID) 857 ENCODING("i64i8imm", ENCODING_IB) 858 ENCODING("i8imm", ENCODING_IB) 859 errs() << "Unhandled immediate encoding " << s << "\n"; 860 llvm_unreachable("Unhandled immediate encoding"); 861} 862 863OperandEncoding RecognizableInstr::rmRegisterEncodingFromString 864 (const std::string &s, 865 bool hasOpSizePrefix) { 866 ENCODING("GR16", ENCODING_RM) 867 ENCODING("GR32", ENCODING_RM) 868 ENCODING("GR64", ENCODING_RM) 869 ENCODING("GR8", ENCODING_RM) 870 ENCODING("VR128", ENCODING_RM) 871 ENCODING("FR64", ENCODING_RM) 872 ENCODING("FR32", ENCODING_RM) 873 ENCODING("VR64", ENCODING_RM) 874 errs() << "Unhandled R/M register encoding " << s << "\n"; 875 llvm_unreachable("Unhandled R/M register encoding"); 876} 877 878OperandEncoding RecognizableInstr::roRegisterEncodingFromString 879 (const std::string &s, 880 bool hasOpSizePrefix) { 881 ENCODING("GR16", ENCODING_REG) 882 ENCODING("GR32", ENCODING_REG) 883 ENCODING("GR64", ENCODING_REG) 884 ENCODING("GR8", ENCODING_REG) 885 ENCODING("VR128", ENCODING_REG) 886 ENCODING("FR64", ENCODING_REG) 887 ENCODING("FR32", ENCODING_REG) 888 ENCODING("VR64", ENCODING_REG) 889 ENCODING("SEGMENT_REG", ENCODING_REG) 890 ENCODING("DEBUG_REG", ENCODING_REG) 891 ENCODING("CONTROL_REG_32", ENCODING_REG) 892 ENCODING("CONTROL_REG_64", ENCODING_REG) 893 errs() << "Unhandled reg/opcode register encoding " << s << "\n"; 894 llvm_unreachable("Unhandled reg/opcode register encoding"); 895} 896 897OperandEncoding RecognizableInstr::memoryEncodingFromString 898 (const std::string &s, 899 bool hasOpSizePrefix) { 900 ENCODING("i16mem", ENCODING_RM) 901 ENCODING("i32mem", ENCODING_RM) 902 ENCODING("i64mem", ENCODING_RM) 903 ENCODING("i8mem", ENCODING_RM) 904 ENCODING("f128mem", ENCODING_RM) 905 ENCODING("f64mem", ENCODING_RM) 906 ENCODING("f32mem", ENCODING_RM) 907 ENCODING("i128mem", ENCODING_RM) 908 ENCODING("f80mem", ENCODING_RM) 909 ENCODING("lea32mem", ENCODING_RM) 910 ENCODING("lea64_32mem", ENCODING_RM) 911 ENCODING("lea64mem", ENCODING_RM) 912 ENCODING("opaque32mem", ENCODING_RM) 913 ENCODING("opaque48mem", ENCODING_RM) 914 ENCODING("opaque80mem", ENCODING_RM) 915 ENCODING("opaque512mem", ENCODING_RM) 916 errs() << "Unhandled memory encoding " << s << "\n"; 917 llvm_unreachable("Unhandled memory encoding"); 918} 919 920OperandEncoding RecognizableInstr::relocationEncodingFromString 921 (const std::string &s, 922 bool hasOpSizePrefix) { 923 if(!hasOpSizePrefix) { 924 // For instructions without an OpSize prefix, a declared 16-bit register or 925 // immediate encoding is special. 926 ENCODING("i16imm", ENCODING_IW) 927 } 928 ENCODING("i16imm", ENCODING_Iv) 929 ENCODING("i16i8imm", ENCODING_IB) 930 ENCODING("i32imm", ENCODING_Iv) 931 ENCODING("i32i8imm", ENCODING_IB) 932 ENCODING("i64i32imm", ENCODING_ID) 933 ENCODING("i64i8imm", ENCODING_IB) 934 ENCODING("i8imm", ENCODING_IB) 935 ENCODING("i64i32imm_pcrel", ENCODING_ID) 936 ENCODING("i32imm_pcrel", ENCODING_ID) 937 ENCODING("brtarget", ENCODING_Iv) 938 ENCODING("brtarget8", ENCODING_IB) 939 ENCODING("i64imm", ENCODING_IO) 940 ENCODING("offset8", ENCODING_Ia) 941 ENCODING("offset16", ENCODING_Ia) 942 ENCODING("offset32", ENCODING_Ia) 943 ENCODING("offset64", ENCODING_Ia) 944 errs() << "Unhandled relocation encoding " << s << "\n"; 945 llvm_unreachable("Unhandled relocation encoding"); 946} 947 948OperandEncoding RecognizableInstr::opcodeModifierEncodingFromString 949 (const std::string &s, 950 bool hasOpSizePrefix) { 951 ENCODING("RST", ENCODING_I) 952 ENCODING("GR32", ENCODING_Rv) 953 ENCODING("GR64", ENCODING_RO) 954 ENCODING("GR16", ENCODING_Rv) 955 ENCODING("GR8", ENCODING_RB) 956 errs() << "Unhandled opcode modifier encoding " << s << "\n"; 957 llvm_unreachable("Unhandled opcode modifier encoding"); 958} 959#undef ENCODING 960