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 "X86RecognizableInstr.h" 18 #include "X86DisassemblerShared.h" 19 #include "X86ModRMFilters.h" 20 #include "llvm/Support/ErrorHandling.h" 21 #include <string> 22 23 using namespace llvm; 24 25 #define MRM_MAPPING \ 26 MAP(C0, 32) \ 27 MAP(C1, 33) \ 28 MAP(C2, 34) \ 29 MAP(C3, 35) \ 30 MAP(C4, 36) \ 31 MAP(C8, 37) \ 32 MAP(C9, 38) \ 33 MAP(CA, 39) \ 34 MAP(CB, 40) \ 35 MAP(D0, 41) \ 36 MAP(D1, 42) \ 37 MAP(D4, 43) \ 38 MAP(D5, 44) \ 39 MAP(D6, 45) \ 40 MAP(D8, 46) \ 41 MAP(D9, 47) \ 42 MAP(DA, 48) \ 43 MAP(DB, 49) \ 44 MAP(DC, 50) \ 45 MAP(DD, 51) \ 46 MAP(DE, 52) \ 47 MAP(DF, 53) \ 48 MAP(E0, 54) \ 49 MAP(E1, 55) \ 50 MAP(E2, 56) \ 51 MAP(E3, 57) \ 52 MAP(E4, 58) \ 53 MAP(E5, 59) \ 54 MAP(E8, 60) \ 55 MAP(E9, 61) \ 56 MAP(EA, 62) \ 57 MAP(EB, 63) \ 58 MAP(EC, 64) \ 59 MAP(ED, 65) \ 60 MAP(EE, 66) \ 61 MAP(F0, 67) \ 62 MAP(F1, 68) \ 63 MAP(F2, 69) \ 64 MAP(F3, 70) \ 65 MAP(F4, 71) \ 66 MAP(F5, 72) \ 67 MAP(F6, 73) \ 68 MAP(F7, 74) \ 69 MAP(F8, 75) \ 70 MAP(F9, 76) \ 71 MAP(FA, 77) \ 72 MAP(FB, 78) \ 73 MAP(FC, 79) \ 74 MAP(FD, 80) \ 75 MAP(FE, 81) \ 76 MAP(FF, 82) 77 78 // A clone of X86 since we can't depend on something that is generated. 79 namespace X86Local { 80 enum { 81 Pseudo = 0, 82 RawFrm = 1, 83 AddRegFrm = 2, 84 MRMDestReg = 3, 85 MRMDestMem = 4, 86 MRMSrcReg = 5, 87 MRMSrcMem = 6, 88 RawFrmMemOffs = 7, 89 RawFrmSrc = 8, 90 RawFrmDst = 9, 91 RawFrmDstSrc = 10, 92 RawFrmImm8 = 11, 93 RawFrmImm16 = 12, 94 MRMXr = 14, MRMXm = 15, 95 MRM0r = 16, MRM1r = 17, MRM2r = 18, MRM3r = 19, 96 MRM4r = 20, MRM5r = 21, MRM6r = 22, MRM7r = 23, 97 MRM0m = 24, MRM1m = 25, MRM2m = 26, MRM3m = 27, 98 MRM4m = 28, MRM5m = 29, MRM6m = 30, MRM7m = 31, 99 #define MAP(from, to) MRM_##from = to, 100 MRM_MAPPING 101 #undef MAP 102 lastMRM 103 }; 104 105 enum { 106 OB = 0, TB = 1, T8 = 2, TA = 3, XOP8 = 4, XOP9 = 5, XOPA = 6 107 }; 108 109 enum { 110 PS = 1, PD = 2, XS = 3, XD = 4 111 }; 112 113 enum { 114 VEX = 1, XOP = 2, EVEX = 3 115 }; 116 117 enum { 118 OpSize16 = 1, OpSize32 = 2 119 }; 120 } 121 122 using namespace X86Disassembler; 123 124 /// isRegFormat - Indicates whether a particular form requires the Mod field of 125 /// the ModR/M byte to be 0b11. 126 /// 127 /// @param form - The form of the instruction. 128 /// @return - true if the form implies that Mod must be 0b11, false 129 /// otherwise. 130 static bool isRegFormat(uint8_t form) { 131 return (form == X86Local::MRMDestReg || 132 form == X86Local::MRMSrcReg || 133 form == X86Local::MRMXr || 134 (form >= X86Local::MRM0r && form <= X86Local::MRM7r)); 135 } 136 137 /// byteFromBitsInit - Extracts a value at most 8 bits in width from a BitsInit. 138 /// Useful for switch statements and the like. 139 /// 140 /// @param init - A reference to the BitsInit to be decoded. 141 /// @return - The field, with the first bit in the BitsInit as the lowest 142 /// order bit. 143 static uint8_t byteFromBitsInit(BitsInit &init) { 144 int width = init.getNumBits(); 145 146 assert(width <= 8 && "Field is too large for uint8_t!"); 147 148 int index; 149 uint8_t mask = 0x01; 150 151 uint8_t ret = 0; 152 153 for (index = 0; index < width; index++) { 154 if (static_cast<BitInit*>(init.getBit(index))->getValue()) 155 ret |= mask; 156 157 mask <<= 1; 158 } 159 160 return ret; 161 } 162 163 /// byteFromRec - Extract a value at most 8 bits in with from a Record given the 164 /// name of the field. 165 /// 166 /// @param rec - The record from which to extract the value. 167 /// @param name - The name of the field in the record. 168 /// @return - The field, as translated by byteFromBitsInit(). 169 static uint8_t byteFromRec(const Record* rec, const std::string &name) { 170 BitsInit* bits = rec->getValueAsBitsInit(name); 171 return byteFromBitsInit(*bits); 172 } 173 174 RecognizableInstr::RecognizableInstr(DisassemblerTables &tables, 175 const CodeGenInstruction &insn, 176 InstrUID uid) { 177 UID = uid; 178 179 Rec = insn.TheDef; 180 Name = Rec->getName(); 181 Spec = &tables.specForUID(UID); 182 183 if (!Rec->isSubClassOf("X86Inst")) { 184 ShouldBeEmitted = false; 185 return; 186 } 187 188 OpPrefix = byteFromRec(Rec, "OpPrefixBits"); 189 OpMap = byteFromRec(Rec, "OpMapBits"); 190 Opcode = byteFromRec(Rec, "Opcode"); 191 Form = byteFromRec(Rec, "FormBits"); 192 Encoding = byteFromRec(Rec, "OpEncBits"); 193 194 OpSize = byteFromRec(Rec, "OpSizeBits"); 195 HasAdSizePrefix = Rec->getValueAsBit("hasAdSizePrefix"); 196 HasREX_WPrefix = Rec->getValueAsBit("hasREX_WPrefix"); 197 HasVEX_4V = Rec->getValueAsBit("hasVEX_4V"); 198 HasVEX_4VOp3 = Rec->getValueAsBit("hasVEX_4VOp3"); 199 HasVEX_WPrefix = Rec->getValueAsBit("hasVEX_WPrefix"); 200 HasMemOp4Prefix = Rec->getValueAsBit("hasMemOp4Prefix"); 201 IgnoresVEX_L = Rec->getValueAsBit("ignoresVEX_L"); 202 HasEVEX_L2Prefix = Rec->getValueAsBit("hasEVEX_L2"); 203 HasEVEX_K = Rec->getValueAsBit("hasEVEX_K"); 204 HasEVEX_KZ = Rec->getValueAsBit("hasEVEX_Z"); 205 HasEVEX_B = Rec->getValueAsBit("hasEVEX_B"); 206 IsCodeGenOnly = Rec->getValueAsBit("isCodeGenOnly"); 207 ForceDisassemble = Rec->getValueAsBit("ForceDisassemble"); 208 209 Name = Rec->getName(); 210 AsmString = Rec->getValueAsString("AsmString"); 211 212 Operands = &insn.Operands.OperandList; 213 214 HasVEX_LPrefix = Rec->getValueAsBit("hasVEX_L"); 215 216 // Check for 64-bit inst which does not require REX 217 Is32Bit = false; 218 Is64Bit = false; 219 // FIXME: Is there some better way to check for In64BitMode? 220 std::vector<Record*> Predicates = Rec->getValueAsListOfDefs("Predicates"); 221 for (unsigned i = 0, e = Predicates.size(); i != e; ++i) { 222 if (Predicates[i]->getName().find("Not64Bit") != Name.npos || 223 Predicates[i]->getName().find("In32Bit") != Name.npos) { 224 Is32Bit = true; 225 break; 226 } 227 if (Predicates[i]->getName().find("In64Bit") != Name.npos) { 228 Is64Bit = true; 229 break; 230 } 231 } 232 233 if (Form == X86Local::Pseudo || (IsCodeGenOnly && !ForceDisassemble)) { 234 ShouldBeEmitted = false; 235 return; 236 } 237 238 // Special case since there is no attribute class for 64-bit and VEX 239 if (Name == "VMASKMOVDQU64") { 240 ShouldBeEmitted = false; 241 return; 242 } 243 244 ShouldBeEmitted = true; 245 } 246 247 void RecognizableInstr::processInstr(DisassemblerTables &tables, 248 const CodeGenInstruction &insn, 249 InstrUID uid) 250 { 251 // Ignore "asm parser only" instructions. 252 if (insn.TheDef->getValueAsBit("isAsmParserOnly")) 253 return; 254 255 RecognizableInstr recogInstr(tables, insn, uid); 256 257 if (recogInstr.shouldBeEmitted()) { 258 recogInstr.emitInstructionSpecifier(); 259 recogInstr.emitDecodePath(tables); 260 } 261 } 262 263 #define EVEX_KB(n) (HasEVEX_KZ && HasEVEX_B ? n##_KZ_B : \ 264 (HasEVEX_K && HasEVEX_B ? n##_K_B : \ 265 (HasEVEX_KZ ? n##_KZ : \ 266 (HasEVEX_K? n##_K : (HasEVEX_B ? n##_B : n))))) 267 268 InstructionContext RecognizableInstr::insnContext() const { 269 InstructionContext insnContext; 270 271 if (Encoding == X86Local::EVEX) { 272 if (HasVEX_LPrefix && HasEVEX_L2Prefix) { 273 errs() << "Don't support VEX.L if EVEX_L2 is enabled: " << Name << "\n"; 274 llvm_unreachable("Don't support VEX.L if EVEX_L2 is enabled"); 275 } 276 // VEX_L & VEX_W 277 if (HasVEX_LPrefix && HasVEX_WPrefix) { 278 if (OpPrefix == X86Local::PD) 279 insnContext = EVEX_KB(IC_EVEX_L_W_OPSIZE); 280 else if (OpPrefix == X86Local::XS) 281 insnContext = EVEX_KB(IC_EVEX_L_W_XS); 282 else if (OpPrefix == X86Local::XD) 283 insnContext = EVEX_KB(IC_EVEX_L_W_XD); 284 else if (OpPrefix == X86Local::PS) 285 insnContext = EVEX_KB(IC_EVEX_L_W); 286 else { 287 errs() << "Instruction does not use a prefix: " << Name << "\n"; 288 llvm_unreachable("Invalid prefix"); 289 } 290 } else if (HasVEX_LPrefix) { 291 // VEX_L 292 if (OpPrefix == X86Local::PD) 293 insnContext = EVEX_KB(IC_EVEX_L_OPSIZE); 294 else if (OpPrefix == X86Local::XS) 295 insnContext = EVEX_KB(IC_EVEX_L_XS); 296 else if (OpPrefix == X86Local::XD) 297 insnContext = EVEX_KB(IC_EVEX_L_XD); 298 else if (OpPrefix == X86Local::PS) 299 insnContext = EVEX_KB(IC_EVEX_L); 300 else { 301 errs() << "Instruction does not use a prefix: " << Name << "\n"; 302 llvm_unreachable("Invalid prefix"); 303 } 304 } 305 else if (HasEVEX_L2Prefix && HasVEX_WPrefix) { 306 // EVEX_L2 & VEX_W 307 if (OpPrefix == X86Local::PD) 308 insnContext = EVEX_KB(IC_EVEX_L2_W_OPSIZE); 309 else if (OpPrefix == X86Local::XS) 310 insnContext = EVEX_KB(IC_EVEX_L2_W_XS); 311 else if (OpPrefix == X86Local::XD) 312 insnContext = EVEX_KB(IC_EVEX_L2_W_XD); 313 else if (OpPrefix == X86Local::PS) 314 insnContext = EVEX_KB(IC_EVEX_L2_W); 315 else { 316 errs() << "Instruction does not use a prefix: " << Name << "\n"; 317 llvm_unreachable("Invalid prefix"); 318 } 319 } else if (HasEVEX_L2Prefix) { 320 // EVEX_L2 321 if (OpPrefix == X86Local::PD) 322 insnContext = EVEX_KB(IC_EVEX_L2_OPSIZE); 323 else if (OpPrefix == X86Local::XD) 324 insnContext = EVEX_KB(IC_EVEX_L2_XD); 325 else if (OpPrefix == X86Local::XS) 326 insnContext = EVEX_KB(IC_EVEX_L2_XS); 327 else if (OpPrefix == X86Local::PS) 328 insnContext = EVEX_KB(IC_EVEX_L2); 329 else { 330 errs() << "Instruction does not use a prefix: " << Name << "\n"; 331 llvm_unreachable("Invalid prefix"); 332 } 333 } 334 else if (HasVEX_WPrefix) { 335 // VEX_W 336 if (OpPrefix == X86Local::PD) 337 insnContext = EVEX_KB(IC_EVEX_W_OPSIZE); 338 else if (OpPrefix == X86Local::XS) 339 insnContext = EVEX_KB(IC_EVEX_W_XS); 340 else if (OpPrefix == X86Local::XD) 341 insnContext = EVEX_KB(IC_EVEX_W_XD); 342 else if (OpPrefix == X86Local::PS) 343 insnContext = EVEX_KB(IC_EVEX_W); 344 else { 345 errs() << "Instruction does not use a prefix: " << Name << "\n"; 346 llvm_unreachable("Invalid prefix"); 347 } 348 } 349 // No L, no W 350 else if (OpPrefix == X86Local::PD) 351 insnContext = EVEX_KB(IC_EVEX_OPSIZE); 352 else if (OpPrefix == X86Local::XD) 353 insnContext = EVEX_KB(IC_EVEX_XD); 354 else if (OpPrefix == X86Local::XS) 355 insnContext = EVEX_KB(IC_EVEX_XS); 356 else 357 insnContext = EVEX_KB(IC_EVEX); 358 /// eof EVEX 359 } else if (Encoding == X86Local::VEX || Encoding == X86Local::XOP) { 360 if (HasVEX_LPrefix && HasVEX_WPrefix) { 361 if (OpPrefix == X86Local::PD) 362 insnContext = IC_VEX_L_W_OPSIZE; 363 else if (OpPrefix == X86Local::XS) 364 insnContext = IC_VEX_L_W_XS; 365 else if (OpPrefix == X86Local::XD) 366 insnContext = IC_VEX_L_W_XD; 367 else if (OpPrefix == X86Local::PS) 368 insnContext = IC_VEX_L_W; 369 else { 370 errs() << "Instruction does not use a prefix: " << Name << "\n"; 371 llvm_unreachable("Invalid prefix"); 372 } 373 } else if (OpPrefix == X86Local::PD && HasVEX_LPrefix) 374 insnContext = IC_VEX_L_OPSIZE; 375 else if (OpPrefix == X86Local::PD && HasVEX_WPrefix) 376 insnContext = IC_VEX_W_OPSIZE; 377 else if (OpPrefix == X86Local::PD) 378 insnContext = IC_VEX_OPSIZE; 379 else if (HasVEX_LPrefix && OpPrefix == X86Local::XS) 380 insnContext = IC_VEX_L_XS; 381 else if (HasVEX_LPrefix && OpPrefix == X86Local::XD) 382 insnContext = IC_VEX_L_XD; 383 else if (HasVEX_WPrefix && OpPrefix == X86Local::XS) 384 insnContext = IC_VEX_W_XS; 385 else if (HasVEX_WPrefix && OpPrefix == X86Local::XD) 386 insnContext = IC_VEX_W_XD; 387 else if (HasVEX_WPrefix && OpPrefix == X86Local::PS) 388 insnContext = IC_VEX_W; 389 else if (HasVEX_LPrefix && OpPrefix == X86Local::PS) 390 insnContext = IC_VEX_L; 391 else if (OpPrefix == X86Local::XD) 392 insnContext = IC_VEX_XD; 393 else if (OpPrefix == X86Local::XS) 394 insnContext = IC_VEX_XS; 395 else if (OpPrefix == X86Local::PS) 396 insnContext = IC_VEX; 397 else { 398 errs() << "Instruction does not use a prefix: " << Name << "\n"; 399 llvm_unreachable("Invalid prefix"); 400 } 401 } else if (Is64Bit || HasREX_WPrefix) { 402 if (HasREX_WPrefix && (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD)) 403 insnContext = IC_64BIT_REXW_OPSIZE; 404 else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XD) 405 insnContext = IC_64BIT_XD_OPSIZE; 406 else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XS) 407 insnContext = IC_64BIT_XS_OPSIZE; 408 else if (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD) 409 insnContext = IC_64BIT_OPSIZE; 410 else if (HasAdSizePrefix) 411 insnContext = IC_64BIT_ADSIZE; 412 else if (HasREX_WPrefix && OpPrefix == X86Local::XS) 413 insnContext = IC_64BIT_REXW_XS; 414 else if (HasREX_WPrefix && OpPrefix == X86Local::XD) 415 insnContext = IC_64BIT_REXW_XD; 416 else if (OpPrefix == X86Local::XD) 417 insnContext = IC_64BIT_XD; 418 else if (OpPrefix == X86Local::XS) 419 insnContext = IC_64BIT_XS; 420 else if (HasREX_WPrefix) 421 insnContext = IC_64BIT_REXW; 422 else 423 insnContext = IC_64BIT; 424 } else { 425 if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XD) 426 insnContext = IC_XD_OPSIZE; 427 else if (OpSize == X86Local::OpSize16 && OpPrefix == X86Local::XS) 428 insnContext = IC_XS_OPSIZE; 429 else if (OpSize == X86Local::OpSize16 || OpPrefix == X86Local::PD) 430 insnContext = IC_OPSIZE; 431 else if (HasAdSizePrefix) 432 insnContext = IC_ADSIZE; 433 else if (OpPrefix == X86Local::XD) 434 insnContext = IC_XD; 435 else if (OpPrefix == X86Local::XS) 436 insnContext = IC_XS; 437 else 438 insnContext = IC; 439 } 440 441 return insnContext; 442 } 443 444 void RecognizableInstr::handleOperand(bool optional, unsigned &operandIndex, 445 unsigned &physicalOperandIndex, 446 unsigned &numPhysicalOperands, 447 const unsigned *operandMapping, 448 OperandEncoding (*encodingFromString) 449 (const std::string&, 450 uint8_t OpSize)) { 451 if (optional) { 452 if (physicalOperandIndex >= numPhysicalOperands) 453 return; 454 } else { 455 assert(physicalOperandIndex < numPhysicalOperands); 456 } 457 458 while (operandMapping[operandIndex] != operandIndex) { 459 Spec->operands[operandIndex].encoding = ENCODING_DUP; 460 Spec->operands[operandIndex].type = 461 (OperandType)(TYPE_DUP0 + operandMapping[operandIndex]); 462 ++operandIndex; 463 } 464 465 const std::string &typeName = (*Operands)[operandIndex].Rec->getName(); 466 467 Spec->operands[operandIndex].encoding = encodingFromString(typeName, 468 OpSize); 469 Spec->operands[operandIndex].type = typeFromString(typeName, 470 HasREX_WPrefix, OpSize); 471 472 ++operandIndex; 473 ++physicalOperandIndex; 474 } 475 476 void RecognizableInstr::emitInstructionSpecifier() { 477 Spec->name = Name; 478 479 Spec->insnContext = insnContext(); 480 481 const std::vector<CGIOperandList::OperandInfo> &OperandList = *Operands; 482 483 unsigned numOperands = OperandList.size(); 484 unsigned numPhysicalOperands = 0; 485 486 // operandMapping maps from operands in OperandList to their originals. 487 // If operandMapping[i] != i, then the entry is a duplicate. 488 unsigned operandMapping[X86_MAX_OPERANDS]; 489 assert(numOperands <= X86_MAX_OPERANDS && "X86_MAX_OPERANDS is not large enough"); 490 491 for (unsigned operandIndex = 0; operandIndex < numOperands; ++operandIndex) { 492 if (OperandList[operandIndex].Constraints.size()) { 493 const CGIOperandList::ConstraintInfo &Constraint = 494 OperandList[operandIndex].Constraints[0]; 495 if (Constraint.isTied()) { 496 operandMapping[operandIndex] = operandIndex; 497 operandMapping[Constraint.getTiedOperand()] = operandIndex; 498 } else { 499 ++numPhysicalOperands; 500 operandMapping[operandIndex] = operandIndex; 501 } 502 } else { 503 ++numPhysicalOperands; 504 operandMapping[operandIndex] = operandIndex; 505 } 506 } 507 508 #define HANDLE_OPERAND(class) \ 509 handleOperand(false, \ 510 operandIndex, \ 511 physicalOperandIndex, \ 512 numPhysicalOperands, \ 513 operandMapping, \ 514 class##EncodingFromString); 515 516 #define HANDLE_OPTIONAL(class) \ 517 handleOperand(true, \ 518 operandIndex, \ 519 physicalOperandIndex, \ 520 numPhysicalOperands, \ 521 operandMapping, \ 522 class##EncodingFromString); 523 524 // operandIndex should always be < numOperands 525 unsigned operandIndex = 0; 526 // physicalOperandIndex should always be < numPhysicalOperands 527 unsigned physicalOperandIndex = 0; 528 529 switch (Form) { 530 default: llvm_unreachable("Unhandled form"); 531 case X86Local::RawFrmSrc: 532 HANDLE_OPERAND(relocation); 533 return; 534 case X86Local::RawFrmDst: 535 HANDLE_OPERAND(relocation); 536 return; 537 case X86Local::RawFrmDstSrc: 538 HANDLE_OPERAND(relocation); 539 HANDLE_OPERAND(relocation); 540 return; 541 case X86Local::RawFrm: 542 // Operand 1 (optional) is an address or immediate. 543 // Operand 2 (optional) is an immediate. 544 assert(numPhysicalOperands <= 2 && 545 "Unexpected number of operands for RawFrm"); 546 HANDLE_OPTIONAL(relocation) 547 HANDLE_OPTIONAL(immediate) 548 break; 549 case X86Local::RawFrmMemOffs: 550 // Operand 1 is an address. 551 HANDLE_OPERAND(relocation); 552 break; 553 case X86Local::AddRegFrm: 554 // Operand 1 is added to the opcode. 555 // Operand 2 (optional) is an address. 556 assert(numPhysicalOperands >= 1 && numPhysicalOperands <= 2 && 557 "Unexpected number of operands for AddRegFrm"); 558 HANDLE_OPERAND(opcodeModifier) 559 HANDLE_OPTIONAL(relocation) 560 break; 561 case X86Local::MRMDestReg: 562 // Operand 1 is a register operand in the R/M field. 563 // Operand 2 is a register operand in the Reg/Opcode field. 564 // - In AVX, there is a register operand in the VEX.vvvv field here - 565 // Operand 3 (optional) is an immediate. 566 if (HasVEX_4V) 567 assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 4 && 568 "Unexpected number of operands for MRMDestRegFrm with VEX_4V"); 569 else 570 assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 && 571 "Unexpected number of operands for MRMDestRegFrm"); 572 573 HANDLE_OPERAND(rmRegister) 574 575 if (HasVEX_4V) 576 // FIXME: In AVX, the register below becomes the one encoded 577 // in ModRMVEX and the one above the one in the VEX.VVVV field 578 HANDLE_OPERAND(vvvvRegister) 579 580 HANDLE_OPERAND(roRegister) 581 HANDLE_OPTIONAL(immediate) 582 break; 583 case X86Local::MRMDestMem: 584 // Operand 1 is a memory operand (possibly SIB-extended) 585 // Operand 2 is a register operand in the Reg/Opcode field. 586 // - In AVX, there is a register operand in the VEX.vvvv field here - 587 // Operand 3 (optional) is an immediate. 588 if (HasVEX_4V) 589 assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 4 && 590 "Unexpected number of operands for MRMDestMemFrm with VEX_4V"); 591 else 592 assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 && 593 "Unexpected number of operands for MRMDestMemFrm"); 594 HANDLE_OPERAND(memory) 595 596 if (HasEVEX_K) 597 HANDLE_OPERAND(writemaskRegister) 598 599 if (HasVEX_4V) 600 // FIXME: In AVX, the register below becomes the one encoded 601 // in ModRMVEX and the one above the one in the VEX.VVVV field 602 HANDLE_OPERAND(vvvvRegister) 603 604 HANDLE_OPERAND(roRegister) 605 HANDLE_OPTIONAL(immediate) 606 break; 607 case X86Local::MRMSrcReg: 608 // Operand 1 is a register operand in the Reg/Opcode field. 609 // Operand 2 is a register operand in the R/M field. 610 // - In AVX, there is a register operand in the VEX.vvvv field here - 611 // Operand 3 (optional) is an immediate. 612 // Operand 4 (optional) is an immediate. 613 614 if (HasVEX_4V || HasVEX_4VOp3) 615 assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 5 && 616 "Unexpected number of operands for MRMSrcRegFrm with VEX_4V"); 617 else 618 assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 4 && 619 "Unexpected number of operands for MRMSrcRegFrm"); 620 621 HANDLE_OPERAND(roRegister) 622 623 if (HasEVEX_K) 624 HANDLE_OPERAND(writemaskRegister) 625 626 if (HasVEX_4V) 627 // FIXME: In AVX, the register below becomes the one encoded 628 // in ModRMVEX and the one above the one in the VEX.VVVV field 629 HANDLE_OPERAND(vvvvRegister) 630 631 if (HasMemOp4Prefix) 632 HANDLE_OPERAND(immediate) 633 634 HANDLE_OPERAND(rmRegister) 635 636 if (HasVEX_4VOp3) 637 HANDLE_OPERAND(vvvvRegister) 638 639 if (!HasMemOp4Prefix) 640 HANDLE_OPTIONAL(immediate) 641 HANDLE_OPTIONAL(immediate) // above might be a register in 7:4 642 HANDLE_OPTIONAL(immediate) 643 break; 644 case X86Local::MRMSrcMem: 645 // Operand 1 is a register operand in the Reg/Opcode field. 646 // Operand 2 is a memory operand (possibly SIB-extended) 647 // - In AVX, there is a register operand in the VEX.vvvv field here - 648 // Operand 3 (optional) is an immediate. 649 650 if (HasVEX_4V || HasVEX_4VOp3) 651 assert(numPhysicalOperands >= 3 && numPhysicalOperands <= 5 && 652 "Unexpected number of operands for MRMSrcMemFrm with VEX_4V"); 653 else 654 assert(numPhysicalOperands >= 2 && numPhysicalOperands <= 3 && 655 "Unexpected number of operands for MRMSrcMemFrm"); 656 657 HANDLE_OPERAND(roRegister) 658 659 if (HasEVEX_K) 660 HANDLE_OPERAND(writemaskRegister) 661 662 if (HasVEX_4V) 663 // FIXME: In AVX, the register below becomes the one encoded 664 // in ModRMVEX and the one above the one in the VEX.VVVV field 665 HANDLE_OPERAND(vvvvRegister) 666 667 if (HasMemOp4Prefix) 668 HANDLE_OPERAND(immediate) 669 670 HANDLE_OPERAND(memory) 671 672 if (HasVEX_4VOp3) 673 HANDLE_OPERAND(vvvvRegister) 674 675 if (!HasMemOp4Prefix) 676 HANDLE_OPTIONAL(immediate) 677 HANDLE_OPTIONAL(immediate) // above might be a register in 7:4 678 break; 679 case X86Local::MRMXr: 680 case X86Local::MRM0r: 681 case X86Local::MRM1r: 682 case X86Local::MRM2r: 683 case X86Local::MRM3r: 684 case X86Local::MRM4r: 685 case X86Local::MRM5r: 686 case X86Local::MRM6r: 687 case X86Local::MRM7r: 688 { 689 // Operand 1 is a register operand in the R/M field. 690 // Operand 2 (optional) is an immediate or relocation. 691 // Operand 3 (optional) is an immediate. 692 unsigned kOp = (HasEVEX_K) ? 1:0; 693 unsigned Op4v = (HasVEX_4V) ? 1:0; 694 if (numPhysicalOperands > 3 + kOp + Op4v) 695 llvm_unreachable("Unexpected number of operands for MRMnr"); 696 } 697 if (HasVEX_4V) 698 HANDLE_OPERAND(vvvvRegister) 699 700 if (HasEVEX_K) 701 HANDLE_OPERAND(writemaskRegister) 702 HANDLE_OPTIONAL(rmRegister) 703 HANDLE_OPTIONAL(relocation) 704 HANDLE_OPTIONAL(immediate) 705 break; 706 case X86Local::MRMXm: 707 case X86Local::MRM0m: 708 case X86Local::MRM1m: 709 case X86Local::MRM2m: 710 case X86Local::MRM3m: 711 case X86Local::MRM4m: 712 case X86Local::MRM5m: 713 case X86Local::MRM6m: 714 case X86Local::MRM7m: 715 { 716 // Operand 1 is a memory operand (possibly SIB-extended) 717 // Operand 2 (optional) is an immediate or relocation. 718 unsigned kOp = (HasEVEX_K) ? 1:0; 719 unsigned Op4v = (HasVEX_4V) ? 1:0; 720 if (numPhysicalOperands < 1 + kOp + Op4v || 721 numPhysicalOperands > 2 + kOp + Op4v) 722 llvm_unreachable("Unexpected number of operands for MRMnm"); 723 } 724 if (HasVEX_4V) 725 HANDLE_OPERAND(vvvvRegister) 726 if (HasEVEX_K) 727 HANDLE_OPERAND(writemaskRegister) 728 HANDLE_OPERAND(memory) 729 HANDLE_OPTIONAL(relocation) 730 break; 731 case X86Local::RawFrmImm8: 732 // operand 1 is a 16-bit immediate 733 // operand 2 is an 8-bit immediate 734 assert(numPhysicalOperands == 2 && 735 "Unexpected number of operands for X86Local::RawFrmImm8"); 736 HANDLE_OPERAND(immediate) 737 HANDLE_OPERAND(immediate) 738 break; 739 case X86Local::RawFrmImm16: 740 // operand 1 is a 16-bit immediate 741 // operand 2 is a 16-bit immediate 742 HANDLE_OPERAND(immediate) 743 HANDLE_OPERAND(immediate) 744 break; 745 case X86Local::MRM_F8: 746 if (Opcode == 0xc6) { 747 assert(numPhysicalOperands == 1 && 748 "Unexpected number of operands for X86Local::MRM_F8"); 749 HANDLE_OPERAND(immediate) 750 } else if (Opcode == 0xc7) { 751 assert(numPhysicalOperands == 1 && 752 "Unexpected number of operands for X86Local::MRM_F8"); 753 HANDLE_OPERAND(relocation) 754 } 755 break; 756 case X86Local::MRM_C0: case X86Local::MRM_C1: case X86Local::MRM_C2: 757 case X86Local::MRM_C3: case X86Local::MRM_C4: case X86Local::MRM_C8: 758 case X86Local::MRM_C9: case X86Local::MRM_CA: case X86Local::MRM_CB: 759 case X86Local::MRM_D0: case X86Local::MRM_D1: case X86Local::MRM_D4: 760 case X86Local::MRM_D5: case X86Local::MRM_D6: case X86Local::MRM_D8: 761 case X86Local::MRM_D9: case X86Local::MRM_DA: case X86Local::MRM_DB: 762 case X86Local::MRM_DC: case X86Local::MRM_DD: case X86Local::MRM_DE: 763 case X86Local::MRM_DF: case X86Local::MRM_E0: case X86Local::MRM_E1: 764 case X86Local::MRM_E2: case X86Local::MRM_E3: case X86Local::MRM_E4: 765 case X86Local::MRM_E5: case X86Local::MRM_E8: case X86Local::MRM_E9: 766 case X86Local::MRM_EA: case X86Local::MRM_EB: case X86Local::MRM_EC: 767 case X86Local::MRM_ED: case X86Local::MRM_EE: case X86Local::MRM_F0: 768 case X86Local::MRM_F1: case X86Local::MRM_F2: case X86Local::MRM_F3: 769 case X86Local::MRM_F4: case X86Local::MRM_F5: case X86Local::MRM_F6: 770 case X86Local::MRM_F7: case X86Local::MRM_F9: case X86Local::MRM_FA: 771 case X86Local::MRM_FB: case X86Local::MRM_FC: case X86Local::MRM_FD: 772 case X86Local::MRM_FE: case X86Local::MRM_FF: 773 // Ignored. 774 break; 775 } 776 777 #undef HANDLE_OPERAND 778 #undef HANDLE_OPTIONAL 779 } 780 781 void RecognizableInstr::emitDecodePath(DisassemblerTables &tables) const { 782 // Special cases where the LLVM tables are not complete 783 784 #define MAP(from, to) \ 785 case X86Local::MRM_##from: \ 786 filter = new ExactFilter(0x##from); \ 787 break; 788 789 OpcodeType opcodeType = (OpcodeType)-1; 790 791 ModRMFilter* filter = nullptr; 792 uint8_t opcodeToSet = 0; 793 794 switch (OpMap) { 795 default: llvm_unreachable("Invalid map!"); 796 case X86Local::OB: 797 case X86Local::TB: 798 case X86Local::T8: 799 case X86Local::TA: 800 case X86Local::XOP8: 801 case X86Local::XOP9: 802 case X86Local::XOPA: 803 switch (OpMap) { 804 default: llvm_unreachable("Unexpected map!"); 805 case X86Local::OB: opcodeType = ONEBYTE; break; 806 case X86Local::TB: opcodeType = TWOBYTE; break; 807 case X86Local::T8: opcodeType = THREEBYTE_38; break; 808 case X86Local::TA: opcodeType = THREEBYTE_3A; break; 809 case X86Local::XOP8: opcodeType = XOP8_MAP; break; 810 case X86Local::XOP9: opcodeType = XOP9_MAP; break; 811 case X86Local::XOPA: opcodeType = XOPA_MAP; break; 812 } 813 814 switch (Form) { 815 default: 816 filter = new DumbFilter(); 817 break; 818 case X86Local::MRMDestReg: case X86Local::MRMDestMem: 819 case X86Local::MRMSrcReg: case X86Local::MRMSrcMem: 820 case X86Local::MRMXr: case X86Local::MRMXm: 821 filter = new ModFilter(isRegFormat(Form)); 822 break; 823 case X86Local::MRM0r: case X86Local::MRM1r: 824 case X86Local::MRM2r: case X86Local::MRM3r: 825 case X86Local::MRM4r: case X86Local::MRM5r: 826 case X86Local::MRM6r: case X86Local::MRM7r: 827 filter = new ExtendedFilter(true, Form - X86Local::MRM0r); 828 break; 829 case X86Local::MRM0m: case X86Local::MRM1m: 830 case X86Local::MRM2m: case X86Local::MRM3m: 831 case X86Local::MRM4m: case X86Local::MRM5m: 832 case X86Local::MRM6m: case X86Local::MRM7m: 833 filter = new ExtendedFilter(false, Form - X86Local::MRM0m); 834 break; 835 MRM_MAPPING 836 } // switch (Form) 837 838 opcodeToSet = Opcode; 839 break; 840 } // switch (OpMap) 841 842 assert(opcodeType != (OpcodeType)-1 && 843 "Opcode type not set"); 844 assert(filter && "Filter not set"); 845 846 if (Form == X86Local::AddRegFrm) { 847 assert(((opcodeToSet & 7) == 0) && 848 "ADDREG_FRM opcode not aligned"); 849 850 uint8_t currentOpcode; 851 852 for (currentOpcode = opcodeToSet; 853 currentOpcode < opcodeToSet + 8; 854 ++currentOpcode) 855 tables.setTableFields(opcodeType, 856 insnContext(), 857 currentOpcode, 858 *filter, 859 UID, Is32Bit, IgnoresVEX_L); 860 } else { 861 tables.setTableFields(opcodeType, 862 insnContext(), 863 opcodeToSet, 864 *filter, 865 UID, Is32Bit, IgnoresVEX_L); 866 } 867 868 delete filter; 869 870 #undef MAP 871 } 872 873 #define TYPE(str, type) if (s == str) return type; 874 OperandType RecognizableInstr::typeFromString(const std::string &s, 875 bool hasREX_WPrefix, 876 uint8_t OpSize) { 877 if(hasREX_WPrefix) { 878 // For instructions with a REX_W prefix, a declared 32-bit register encoding 879 // is special. 880 TYPE("GR32", TYPE_R32) 881 } 882 if(OpSize == X86Local::OpSize16) { 883 // For OpSize16 instructions, a declared 16-bit register or 884 // immediate encoding is special. 885 TYPE("GR16", TYPE_Rv) 886 TYPE("i16imm", TYPE_IMMv) 887 } else if(OpSize == X86Local::OpSize32) { 888 // For OpSize32 instructions, a declared 32-bit register or 889 // immediate encoding is special. 890 TYPE("GR32", TYPE_Rv) 891 } 892 TYPE("i16mem", TYPE_Mv) 893 TYPE("i16imm", TYPE_IMM16) 894 TYPE("i16i8imm", TYPE_IMMv) 895 TYPE("GR16", TYPE_R16) 896 TYPE("i32mem", TYPE_Mv) 897 TYPE("i32imm", TYPE_IMMv) 898 TYPE("i32i8imm", TYPE_IMM32) 899 TYPE("u32u8imm", TYPE_IMM32) 900 TYPE("GR32", TYPE_R32) 901 TYPE("GR32orGR64", TYPE_R32) 902 TYPE("i64mem", TYPE_Mv) 903 TYPE("i64i32imm", TYPE_IMM64) 904 TYPE("i64i8imm", TYPE_IMM64) 905 TYPE("GR64", TYPE_R64) 906 TYPE("i8mem", TYPE_M8) 907 TYPE("i8imm", TYPE_IMM8) 908 TYPE("GR8", TYPE_R8) 909 TYPE("VR128", TYPE_XMM128) 910 TYPE("VR128X", TYPE_XMM128) 911 TYPE("f128mem", TYPE_M128) 912 TYPE("f256mem", TYPE_M256) 913 TYPE("f512mem", TYPE_M512) 914 TYPE("FR64", TYPE_XMM64) 915 TYPE("FR64X", TYPE_XMM64) 916 TYPE("f64mem", TYPE_M64FP) 917 TYPE("sdmem", TYPE_M64FP) 918 TYPE("FR32", TYPE_XMM32) 919 TYPE("FR32X", TYPE_XMM32) 920 TYPE("f32mem", TYPE_M32FP) 921 TYPE("ssmem", TYPE_M32FP) 922 TYPE("RST", TYPE_ST) 923 TYPE("i128mem", TYPE_M128) 924 TYPE("i256mem", TYPE_M256) 925 TYPE("i512mem", TYPE_M512) 926 TYPE("i64i32imm_pcrel", TYPE_REL64) 927 TYPE("i16imm_pcrel", TYPE_REL16) 928 TYPE("i32imm_pcrel", TYPE_REL32) 929 TYPE("SSECC", TYPE_IMM3) 930 TYPE("AVXCC", TYPE_IMM5) 931 TYPE("AVX512RC", TYPE_IMM32) 932 TYPE("brtarget", TYPE_RELv) 933 TYPE("uncondbrtarget", TYPE_RELv) 934 TYPE("brtarget8", TYPE_REL8) 935 TYPE("f80mem", TYPE_M80FP) 936 TYPE("lea32mem", TYPE_LEA) 937 TYPE("lea64_32mem", TYPE_LEA) 938 TYPE("lea64mem", TYPE_LEA) 939 TYPE("VR64", TYPE_MM64) 940 TYPE("i64imm", TYPE_IMMv) 941 TYPE("opaque32mem", TYPE_M1616) 942 TYPE("opaque48mem", TYPE_M1632) 943 TYPE("opaque80mem", TYPE_M1664) 944 TYPE("opaque512mem", TYPE_M512) 945 TYPE("SEGMENT_REG", TYPE_SEGMENTREG) 946 TYPE("DEBUG_REG", TYPE_DEBUGREG) 947 TYPE("CONTROL_REG", TYPE_CONTROLREG) 948 TYPE("srcidx8", TYPE_SRCIDX8) 949 TYPE("srcidx16", TYPE_SRCIDX16) 950 TYPE("srcidx32", TYPE_SRCIDX32) 951 TYPE("srcidx64", TYPE_SRCIDX64) 952 TYPE("dstidx8", TYPE_DSTIDX8) 953 TYPE("dstidx16", TYPE_DSTIDX16) 954 TYPE("dstidx32", TYPE_DSTIDX32) 955 TYPE("dstidx64", TYPE_DSTIDX64) 956 TYPE("offset8", TYPE_MOFFS8) 957 TYPE("offset16", TYPE_MOFFS16) 958 TYPE("offset32", TYPE_MOFFS32) 959 TYPE("offset64", TYPE_MOFFS64) 960 TYPE("VR256", TYPE_XMM256) 961 TYPE("VR256X", TYPE_XMM256) 962 TYPE("VR512", TYPE_XMM512) 963 TYPE("VK1", TYPE_VK1) 964 TYPE("VK1WM", TYPE_VK1) 965 TYPE("VK8", TYPE_VK8) 966 TYPE("VK8WM", TYPE_VK8) 967 TYPE("VK16", TYPE_VK16) 968 TYPE("VK16WM", TYPE_VK16) 969 TYPE("GR16_NOAX", TYPE_Rv) 970 TYPE("GR32_NOAX", TYPE_Rv) 971 TYPE("GR64_NOAX", TYPE_R64) 972 TYPE("vx32mem", TYPE_M32) 973 TYPE("vy32mem", TYPE_M32) 974 TYPE("vz32mem", TYPE_M32) 975 TYPE("vx64mem", TYPE_M64) 976 TYPE("vy64mem", TYPE_M64) 977 TYPE("vy64xmem", TYPE_M64) 978 TYPE("vz64mem", TYPE_M64) 979 errs() << "Unhandled type string " << s << "\n"; 980 llvm_unreachable("Unhandled type string"); 981 } 982 #undef TYPE 983 984 #define ENCODING(str, encoding) if (s == str) return encoding; 985 OperandEncoding 986 RecognizableInstr::immediateEncodingFromString(const std::string &s, 987 uint8_t OpSize) { 988 if(OpSize != X86Local::OpSize16) { 989 // For instructions without an OpSize prefix, a declared 16-bit register or 990 // immediate encoding is special. 991 ENCODING("i16imm", ENCODING_IW) 992 } 993 ENCODING("i32i8imm", ENCODING_IB) 994 ENCODING("u32u8imm", ENCODING_IB) 995 ENCODING("SSECC", ENCODING_IB) 996 ENCODING("AVXCC", ENCODING_IB) 997 ENCODING("AVX512RC", ENCODING_IB) 998 ENCODING("i16imm", ENCODING_Iv) 999 ENCODING("i16i8imm", ENCODING_IB) 1000 ENCODING("i32imm", ENCODING_Iv) 1001 ENCODING("i64i32imm", ENCODING_ID) 1002 ENCODING("i64i8imm", ENCODING_IB) 1003 ENCODING("i8imm", ENCODING_IB) 1004 // This is not a typo. Instructions like BLENDVPD put 1005 // register IDs in 8-bit immediates nowadays. 1006 ENCODING("FR32", ENCODING_IB) 1007 ENCODING("FR64", ENCODING_IB) 1008 ENCODING("VR128", ENCODING_IB) 1009 ENCODING("VR256", ENCODING_IB) 1010 ENCODING("FR32X", ENCODING_IB) 1011 ENCODING("FR64X", ENCODING_IB) 1012 ENCODING("VR128X", ENCODING_IB) 1013 ENCODING("VR256X", ENCODING_IB) 1014 ENCODING("VR512", ENCODING_IB) 1015 errs() << "Unhandled immediate encoding " << s << "\n"; 1016 llvm_unreachable("Unhandled immediate encoding"); 1017 } 1018 1019 OperandEncoding 1020 RecognizableInstr::rmRegisterEncodingFromString(const std::string &s, 1021 uint8_t OpSize) { 1022 ENCODING("RST", ENCODING_FP) 1023 ENCODING("GR16", ENCODING_RM) 1024 ENCODING("GR32", ENCODING_RM) 1025 ENCODING("GR32orGR64", ENCODING_RM) 1026 ENCODING("GR64", ENCODING_RM) 1027 ENCODING("GR8", ENCODING_RM) 1028 ENCODING("VR128", ENCODING_RM) 1029 ENCODING("VR128X", ENCODING_RM) 1030 ENCODING("FR64", ENCODING_RM) 1031 ENCODING("FR32", ENCODING_RM) 1032 ENCODING("FR64X", ENCODING_RM) 1033 ENCODING("FR32X", ENCODING_RM) 1034 ENCODING("VR64", ENCODING_RM) 1035 ENCODING("VR256", ENCODING_RM) 1036 ENCODING("VR256X", ENCODING_RM) 1037 ENCODING("VR512", ENCODING_RM) 1038 ENCODING("VK1", ENCODING_RM) 1039 ENCODING("VK8", ENCODING_RM) 1040 ENCODING("VK16", ENCODING_RM) 1041 errs() << "Unhandled R/M register encoding " << s << "\n"; 1042 llvm_unreachable("Unhandled R/M register encoding"); 1043 } 1044 1045 OperandEncoding 1046 RecognizableInstr::roRegisterEncodingFromString(const std::string &s, 1047 uint8_t OpSize) { 1048 ENCODING("GR16", ENCODING_REG) 1049 ENCODING("GR32", ENCODING_REG) 1050 ENCODING("GR32orGR64", ENCODING_REG) 1051 ENCODING("GR64", ENCODING_REG) 1052 ENCODING("GR8", ENCODING_REG) 1053 ENCODING("VR128", ENCODING_REG) 1054 ENCODING("FR64", ENCODING_REG) 1055 ENCODING("FR32", ENCODING_REG) 1056 ENCODING("VR64", ENCODING_REG) 1057 ENCODING("SEGMENT_REG", ENCODING_REG) 1058 ENCODING("DEBUG_REG", ENCODING_REG) 1059 ENCODING("CONTROL_REG", ENCODING_REG) 1060 ENCODING("VR256", ENCODING_REG) 1061 ENCODING("VR256X", ENCODING_REG) 1062 ENCODING("VR128X", ENCODING_REG) 1063 ENCODING("FR64X", ENCODING_REG) 1064 ENCODING("FR32X", ENCODING_REG) 1065 ENCODING("VR512", ENCODING_REG) 1066 ENCODING("VK1", ENCODING_REG) 1067 ENCODING("VK8", ENCODING_REG) 1068 ENCODING("VK16", ENCODING_REG) 1069 ENCODING("VK1WM", ENCODING_REG) 1070 ENCODING("VK8WM", ENCODING_REG) 1071 ENCODING("VK16WM", ENCODING_REG) 1072 errs() << "Unhandled reg/opcode register encoding " << s << "\n"; 1073 llvm_unreachable("Unhandled reg/opcode register encoding"); 1074 } 1075 1076 OperandEncoding 1077 RecognizableInstr::vvvvRegisterEncodingFromString(const std::string &s, 1078 uint8_t OpSize) { 1079 ENCODING("GR32", ENCODING_VVVV) 1080 ENCODING("GR64", ENCODING_VVVV) 1081 ENCODING("FR32", ENCODING_VVVV) 1082 ENCODING("FR64", ENCODING_VVVV) 1083 ENCODING("VR128", ENCODING_VVVV) 1084 ENCODING("VR256", ENCODING_VVVV) 1085 ENCODING("FR32X", ENCODING_VVVV) 1086 ENCODING("FR64X", ENCODING_VVVV) 1087 ENCODING("VR128X", ENCODING_VVVV) 1088 ENCODING("VR256X", ENCODING_VVVV) 1089 ENCODING("VR512", ENCODING_VVVV) 1090 ENCODING("VK1", ENCODING_VVVV) 1091 ENCODING("VK8", ENCODING_VVVV) 1092 ENCODING("VK16", ENCODING_VVVV) 1093 errs() << "Unhandled VEX.vvvv register encoding " << s << "\n"; 1094 llvm_unreachable("Unhandled VEX.vvvv register encoding"); 1095 } 1096 1097 OperandEncoding 1098 RecognizableInstr::writemaskRegisterEncodingFromString(const std::string &s, 1099 uint8_t OpSize) { 1100 ENCODING("VK1WM", ENCODING_WRITEMASK) 1101 ENCODING("VK8WM", ENCODING_WRITEMASK) 1102 ENCODING("VK16WM", ENCODING_WRITEMASK) 1103 errs() << "Unhandled mask register encoding " << s << "\n"; 1104 llvm_unreachable("Unhandled mask register encoding"); 1105 } 1106 1107 OperandEncoding 1108 RecognizableInstr::memoryEncodingFromString(const std::string &s, 1109 uint8_t OpSize) { 1110 ENCODING("i16mem", ENCODING_RM) 1111 ENCODING("i32mem", ENCODING_RM) 1112 ENCODING("i64mem", ENCODING_RM) 1113 ENCODING("i8mem", ENCODING_RM) 1114 ENCODING("ssmem", ENCODING_RM) 1115 ENCODING("sdmem", ENCODING_RM) 1116 ENCODING("f128mem", ENCODING_RM) 1117 ENCODING("f256mem", ENCODING_RM) 1118 ENCODING("f512mem", ENCODING_RM) 1119 ENCODING("f64mem", ENCODING_RM) 1120 ENCODING("f32mem", ENCODING_RM) 1121 ENCODING("i128mem", ENCODING_RM) 1122 ENCODING("i256mem", ENCODING_RM) 1123 ENCODING("i512mem", ENCODING_RM) 1124 ENCODING("f80mem", ENCODING_RM) 1125 ENCODING("lea32mem", ENCODING_RM) 1126 ENCODING("lea64_32mem", ENCODING_RM) 1127 ENCODING("lea64mem", ENCODING_RM) 1128 ENCODING("opaque32mem", ENCODING_RM) 1129 ENCODING("opaque48mem", ENCODING_RM) 1130 ENCODING("opaque80mem", ENCODING_RM) 1131 ENCODING("opaque512mem", ENCODING_RM) 1132 ENCODING("vx32mem", ENCODING_RM) 1133 ENCODING("vy32mem", ENCODING_RM) 1134 ENCODING("vz32mem", ENCODING_RM) 1135 ENCODING("vx64mem", ENCODING_RM) 1136 ENCODING("vy64mem", ENCODING_RM) 1137 ENCODING("vy64xmem", ENCODING_RM) 1138 ENCODING("vz64mem", ENCODING_RM) 1139 errs() << "Unhandled memory encoding " << s << "\n"; 1140 llvm_unreachable("Unhandled memory encoding"); 1141 } 1142 1143 OperandEncoding 1144 RecognizableInstr::relocationEncodingFromString(const std::string &s, 1145 uint8_t OpSize) { 1146 if(OpSize != X86Local::OpSize16) { 1147 // For instructions without an OpSize prefix, a declared 16-bit register or 1148 // immediate encoding is special. 1149 ENCODING("i16imm", ENCODING_IW) 1150 } 1151 ENCODING("i16imm", ENCODING_Iv) 1152 ENCODING("i16i8imm", ENCODING_IB) 1153 ENCODING("i32imm", ENCODING_Iv) 1154 ENCODING("i32i8imm", ENCODING_IB) 1155 ENCODING("i64i32imm", ENCODING_ID) 1156 ENCODING("i64i8imm", ENCODING_IB) 1157 ENCODING("i8imm", ENCODING_IB) 1158 ENCODING("i64i32imm_pcrel", ENCODING_ID) 1159 ENCODING("i16imm_pcrel", ENCODING_IW) 1160 ENCODING("i32imm_pcrel", ENCODING_ID) 1161 ENCODING("brtarget", ENCODING_Iv) 1162 ENCODING("brtarget8", ENCODING_IB) 1163 ENCODING("i64imm", ENCODING_IO) 1164 ENCODING("offset8", ENCODING_Ia) 1165 ENCODING("offset16", ENCODING_Ia) 1166 ENCODING("offset32", ENCODING_Ia) 1167 ENCODING("offset64", ENCODING_Ia) 1168 ENCODING("srcidx8", ENCODING_SI) 1169 ENCODING("srcidx16", ENCODING_SI) 1170 ENCODING("srcidx32", ENCODING_SI) 1171 ENCODING("srcidx64", ENCODING_SI) 1172 ENCODING("dstidx8", ENCODING_DI) 1173 ENCODING("dstidx16", ENCODING_DI) 1174 ENCODING("dstidx32", ENCODING_DI) 1175 ENCODING("dstidx64", ENCODING_DI) 1176 errs() << "Unhandled relocation encoding " << s << "\n"; 1177 llvm_unreachable("Unhandled relocation encoding"); 1178 } 1179 1180 OperandEncoding 1181 RecognizableInstr::opcodeModifierEncodingFromString(const std::string &s, 1182 uint8_t OpSize) { 1183 ENCODING("GR32", ENCODING_Rv) 1184 ENCODING("GR64", ENCODING_RO) 1185 ENCODING("GR16", ENCODING_Rv) 1186 ENCODING("GR8", ENCODING_RB) 1187 ENCODING("GR16_NOAX", ENCODING_Rv) 1188 ENCODING("GR32_NOAX", ENCODING_Rv) 1189 ENCODING("GR64_NOAX", ENCODING_RO) 1190 errs() << "Unhandled opcode modifier encoding " << s << "\n"; 1191 llvm_unreachable("Unhandled opcode modifier encoding"); 1192 } 1193 #undef ENCODING 1194