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