10b57cec5SDimitry Andric //===-- X86MCTargetDesc.cpp - X86 Target Descriptions ---------------------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file provides X86 specific target descriptions. 100b57cec5SDimitry Andric // 110b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 120b57cec5SDimitry Andric 130b57cec5SDimitry Andric #include "X86MCTargetDesc.h" 140b57cec5SDimitry Andric #include "TargetInfo/X86TargetInfo.h" 150b57cec5SDimitry Andric #include "X86ATTInstPrinter.h" 160b57cec5SDimitry Andric #include "X86BaseInfo.h" 170b57cec5SDimitry Andric #include "X86IntelInstPrinter.h" 180b57cec5SDimitry Andric #include "X86MCAsmInfo.h" 19bdd1243dSDimitry Andric #include "X86TargetStreamer.h" 200b57cec5SDimitry Andric #include "llvm/ADT/APInt.h" 210b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/CodeView.h" 220b57cec5SDimitry Andric #include "llvm/MC/MCDwarf.h" 230b57cec5SDimitry Andric #include "llvm/MC/MCInstrAnalysis.h" 240b57cec5SDimitry Andric #include "llvm/MC/MCInstrInfo.h" 250b57cec5SDimitry Andric #include "llvm/MC/MCRegisterInfo.h" 260b57cec5SDimitry Andric #include "llvm/MC/MCStreamer.h" 270b57cec5SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h" 280b57cec5SDimitry Andric #include "llvm/MC/MachineLocation.h" 29349cc55cSDimitry Andric #include "llvm/MC/TargetRegistry.h" 300b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 3106c3fb27SDimitry Andric #include "llvm/TargetParser/Host.h" 3206c3fb27SDimitry Andric #include "llvm/TargetParser/Triple.h" 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric using namespace llvm; 350b57cec5SDimitry Andric 360b57cec5SDimitry Andric #define GET_REGINFO_MC_DESC 370b57cec5SDimitry Andric #include "X86GenRegisterInfo.inc" 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric #define GET_INSTRINFO_MC_DESC 400b57cec5SDimitry Andric #define GET_INSTRINFO_MC_HELPERS 41753f127fSDimitry Andric #define ENABLE_INSTR_PREDICATE_VERIFIER 420b57cec5SDimitry Andric #include "X86GenInstrInfo.inc" 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric #define GET_SUBTARGETINFO_MC_DESC 450b57cec5SDimitry Andric #include "X86GenSubtargetInfo.inc" 460b57cec5SDimitry Andric 470b57cec5SDimitry Andric std::string X86_MC::ParseX86Triple(const Triple &TT) { 480b57cec5SDimitry Andric std::string FS; 49e8d8bef9SDimitry Andric // SSE2 should default to enabled in 64-bit mode, but can be turned off 50e8d8bef9SDimitry Andric // explicitly. 51e8d8bef9SDimitry Andric if (TT.isArch64Bit()) 52e8d8bef9SDimitry Andric FS = "+64bit-mode,-32bit-mode,-16bit-mode,+sse2"; 530b57cec5SDimitry Andric else if (TT.getEnvironment() != Triple::CODE16) 540b57cec5SDimitry Andric FS = "-64bit-mode,+32bit-mode,-16bit-mode"; 550b57cec5SDimitry Andric else 560b57cec5SDimitry Andric FS = "-64bit-mode,-32bit-mode,+16bit-mode"; 570b57cec5SDimitry Andric 580b57cec5SDimitry Andric return FS; 590b57cec5SDimitry Andric } 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric unsigned X86_MC::getDwarfRegFlavour(const Triple &TT, bool isEH) { 620b57cec5SDimitry Andric if (TT.getArch() == Triple::x86_64) 630b57cec5SDimitry Andric return DWARFFlavour::X86_64; 640b57cec5SDimitry Andric 650b57cec5SDimitry Andric if (TT.isOSDarwin()) 660b57cec5SDimitry Andric return isEH ? DWARFFlavour::X86_32_DarwinEH : DWARFFlavour::X86_32_Generic; 670b57cec5SDimitry Andric if (TT.isOSCygMing()) 680b57cec5SDimitry Andric // Unsupported by now, just quick fallback 690b57cec5SDimitry Andric return DWARFFlavour::X86_32_Generic; 700b57cec5SDimitry Andric return DWARFFlavour::X86_32_Generic; 710b57cec5SDimitry Andric } 720b57cec5SDimitry Andric 738bcb0991SDimitry Andric bool X86_MC::hasLockPrefix(const MCInst &MI) { 748bcb0991SDimitry Andric return MI.getFlags() & X86::IP_HAS_LOCK; 758bcb0991SDimitry Andric } 768bcb0991SDimitry Andric 7781ad6265SDimitry Andric static bool isMemOperand(const MCInst &MI, unsigned Op, unsigned RegClassID) { 7881ad6265SDimitry Andric const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg); 7981ad6265SDimitry Andric const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg); 8081ad6265SDimitry Andric const MCRegisterClass &RC = X86MCRegisterClasses[RegClassID]; 8181ad6265SDimitry Andric 8281ad6265SDimitry Andric return (Base.isReg() && Base.getReg() != 0 && RC.contains(Base.getReg())) || 8381ad6265SDimitry Andric (Index.isReg() && Index.getReg() != 0 && RC.contains(Index.getReg())); 8481ad6265SDimitry Andric } 8581ad6265SDimitry Andric 8681ad6265SDimitry Andric bool X86_MC::is16BitMemOperand(const MCInst &MI, unsigned Op, 8781ad6265SDimitry Andric const MCSubtargetInfo &STI) { 8881ad6265SDimitry Andric const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg); 8981ad6265SDimitry Andric const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg); 9081ad6265SDimitry Andric 9181ad6265SDimitry Andric if (STI.hasFeature(X86::Is16Bit) && Base.isReg() && Base.getReg() == 0 && 9281ad6265SDimitry Andric Index.isReg() && Index.getReg() == 0) 9381ad6265SDimitry Andric return true; 9481ad6265SDimitry Andric return isMemOperand(MI, Op, X86::GR16RegClassID); 9581ad6265SDimitry Andric } 9681ad6265SDimitry Andric 9781ad6265SDimitry Andric bool X86_MC::is32BitMemOperand(const MCInst &MI, unsigned Op) { 9881ad6265SDimitry Andric const MCOperand &Base = MI.getOperand(Op + X86::AddrBaseReg); 9981ad6265SDimitry Andric const MCOperand &Index = MI.getOperand(Op + X86::AddrIndexReg); 10081ad6265SDimitry Andric if (Base.isReg() && Base.getReg() == X86::EIP) { 10181ad6265SDimitry Andric assert(Index.isReg() && Index.getReg() == 0 && "Invalid eip-based address"); 10281ad6265SDimitry Andric return true; 10381ad6265SDimitry Andric } 10481ad6265SDimitry Andric if (Index.isReg() && Index.getReg() == X86::EIZ) 10581ad6265SDimitry Andric return true; 10681ad6265SDimitry Andric return isMemOperand(MI, Op, X86::GR32RegClassID); 10781ad6265SDimitry Andric } 10881ad6265SDimitry Andric 10981ad6265SDimitry Andric #ifndef NDEBUG 11081ad6265SDimitry Andric bool X86_MC::is64BitMemOperand(const MCInst &MI, unsigned Op) { 11181ad6265SDimitry Andric return isMemOperand(MI, Op, X86::GR64RegClassID); 11281ad6265SDimitry Andric } 11381ad6265SDimitry Andric #endif 11481ad6265SDimitry Andric 11581ad6265SDimitry Andric bool X86_MC::needsAddressSizeOverride(const MCInst &MI, 11681ad6265SDimitry Andric const MCSubtargetInfo &STI, 11781ad6265SDimitry Andric int MemoryOperand, uint64_t TSFlags) { 11881ad6265SDimitry Andric uint64_t AdSize = TSFlags & X86II::AdSizeMask; 11981ad6265SDimitry Andric bool Is16BitMode = STI.hasFeature(X86::Is16Bit); 12081ad6265SDimitry Andric bool Is32BitMode = STI.hasFeature(X86::Is32Bit); 12181ad6265SDimitry Andric bool Is64BitMode = STI.hasFeature(X86::Is64Bit); 12281ad6265SDimitry Andric if ((Is16BitMode && AdSize == X86II::AdSize32) || 12381ad6265SDimitry Andric (Is32BitMode && AdSize == X86II::AdSize16) || 12481ad6265SDimitry Andric (Is64BitMode && AdSize == X86II::AdSize32)) 12581ad6265SDimitry Andric return true; 12681ad6265SDimitry Andric uint64_t Form = TSFlags & X86II::FormMask; 12781ad6265SDimitry Andric switch (Form) { 12881ad6265SDimitry Andric default: 12981ad6265SDimitry Andric break; 13081ad6265SDimitry Andric case X86II::RawFrmDstSrc: { 13181ad6265SDimitry Andric unsigned siReg = MI.getOperand(1).getReg(); 13281ad6265SDimitry Andric assert(((siReg == X86::SI && MI.getOperand(0).getReg() == X86::DI) || 13381ad6265SDimitry Andric (siReg == X86::ESI && MI.getOperand(0).getReg() == X86::EDI) || 13481ad6265SDimitry Andric (siReg == X86::RSI && MI.getOperand(0).getReg() == X86::RDI)) && 13581ad6265SDimitry Andric "SI and DI register sizes do not match"); 13681ad6265SDimitry Andric return (!Is32BitMode && siReg == X86::ESI) || 13781ad6265SDimitry Andric (Is32BitMode && siReg == X86::SI); 13881ad6265SDimitry Andric } 13981ad6265SDimitry Andric case X86II::RawFrmSrc: { 14081ad6265SDimitry Andric unsigned siReg = MI.getOperand(0).getReg(); 14181ad6265SDimitry Andric return (!Is32BitMode && siReg == X86::ESI) || 14281ad6265SDimitry Andric (Is32BitMode && siReg == X86::SI); 14381ad6265SDimitry Andric } 14481ad6265SDimitry Andric case X86II::RawFrmDst: { 14581ad6265SDimitry Andric unsigned siReg = MI.getOperand(0).getReg(); 14681ad6265SDimitry Andric return (!Is32BitMode && siReg == X86::EDI) || 14781ad6265SDimitry Andric (Is32BitMode && siReg == X86::DI); 14881ad6265SDimitry Andric } 14981ad6265SDimitry Andric } 15081ad6265SDimitry Andric 15181ad6265SDimitry Andric // Determine where the memory operand starts, if present. 15281ad6265SDimitry Andric if (MemoryOperand < 0) 15381ad6265SDimitry Andric return false; 15481ad6265SDimitry Andric 15581ad6265SDimitry Andric if (STI.hasFeature(X86::Is64Bit)) { 15681ad6265SDimitry Andric assert(!is16BitMemOperand(MI, MemoryOperand, STI)); 15781ad6265SDimitry Andric return is32BitMemOperand(MI, MemoryOperand); 15881ad6265SDimitry Andric } 15981ad6265SDimitry Andric if (STI.hasFeature(X86::Is32Bit)) { 16081ad6265SDimitry Andric assert(!is64BitMemOperand(MI, MemoryOperand)); 16181ad6265SDimitry Andric return is16BitMemOperand(MI, MemoryOperand, STI); 16281ad6265SDimitry Andric } 16381ad6265SDimitry Andric assert(STI.hasFeature(X86::Is16Bit)); 16481ad6265SDimitry Andric assert(!is64BitMemOperand(MI, MemoryOperand)); 16581ad6265SDimitry Andric return !is16BitMemOperand(MI, MemoryOperand, STI); 16681ad6265SDimitry Andric } 16781ad6265SDimitry Andric 1680b57cec5SDimitry Andric void X86_MC::initLLVMToSEHAndCVRegMapping(MCRegisterInfo *MRI) { 1690b57cec5SDimitry Andric // FIXME: TableGen these. 1700b57cec5SDimitry Andric for (unsigned Reg = X86::NoRegister + 1; Reg < X86::NUM_TARGET_REGS; ++Reg) { 1710b57cec5SDimitry Andric unsigned SEH = MRI->getEncodingValue(Reg); 1720b57cec5SDimitry Andric MRI->mapLLVMRegToSEHReg(Reg, SEH); 1730b57cec5SDimitry Andric } 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric // Mapping from CodeView to MC register id. 1760b57cec5SDimitry Andric static const struct { 1770b57cec5SDimitry Andric codeview::RegisterId CVReg; 1780b57cec5SDimitry Andric MCPhysReg Reg; 1790b57cec5SDimitry Andric } RegMap[] = { 1800b57cec5SDimitry Andric {codeview::RegisterId::AL, X86::AL}, 1810b57cec5SDimitry Andric {codeview::RegisterId::CL, X86::CL}, 1820b57cec5SDimitry Andric {codeview::RegisterId::DL, X86::DL}, 1830b57cec5SDimitry Andric {codeview::RegisterId::BL, X86::BL}, 1840b57cec5SDimitry Andric {codeview::RegisterId::AH, X86::AH}, 1850b57cec5SDimitry Andric {codeview::RegisterId::CH, X86::CH}, 1860b57cec5SDimitry Andric {codeview::RegisterId::DH, X86::DH}, 1870b57cec5SDimitry Andric {codeview::RegisterId::BH, X86::BH}, 1880b57cec5SDimitry Andric {codeview::RegisterId::AX, X86::AX}, 1890b57cec5SDimitry Andric {codeview::RegisterId::CX, X86::CX}, 1900b57cec5SDimitry Andric {codeview::RegisterId::DX, X86::DX}, 1910b57cec5SDimitry Andric {codeview::RegisterId::BX, X86::BX}, 1920b57cec5SDimitry Andric {codeview::RegisterId::SP, X86::SP}, 1930b57cec5SDimitry Andric {codeview::RegisterId::BP, X86::BP}, 1940b57cec5SDimitry Andric {codeview::RegisterId::SI, X86::SI}, 1950b57cec5SDimitry Andric {codeview::RegisterId::DI, X86::DI}, 1960b57cec5SDimitry Andric {codeview::RegisterId::EAX, X86::EAX}, 1970b57cec5SDimitry Andric {codeview::RegisterId::ECX, X86::ECX}, 1980b57cec5SDimitry Andric {codeview::RegisterId::EDX, X86::EDX}, 1990b57cec5SDimitry Andric {codeview::RegisterId::EBX, X86::EBX}, 2000b57cec5SDimitry Andric {codeview::RegisterId::ESP, X86::ESP}, 2010b57cec5SDimitry Andric {codeview::RegisterId::EBP, X86::EBP}, 2020b57cec5SDimitry Andric {codeview::RegisterId::ESI, X86::ESI}, 2030b57cec5SDimitry Andric {codeview::RegisterId::EDI, X86::EDI}, 2040b57cec5SDimitry Andric 2050b57cec5SDimitry Andric {codeview::RegisterId::EFLAGS, X86::EFLAGS}, 2060b57cec5SDimitry Andric 20704eeddc0SDimitry Andric {codeview::RegisterId::ST0, X86::ST0}, 20804eeddc0SDimitry Andric {codeview::RegisterId::ST1, X86::ST1}, 20904eeddc0SDimitry Andric {codeview::RegisterId::ST2, X86::ST2}, 21004eeddc0SDimitry Andric {codeview::RegisterId::ST3, X86::ST3}, 21104eeddc0SDimitry Andric {codeview::RegisterId::ST4, X86::ST4}, 21204eeddc0SDimitry Andric {codeview::RegisterId::ST5, X86::ST5}, 21304eeddc0SDimitry Andric {codeview::RegisterId::ST6, X86::ST6}, 21404eeddc0SDimitry Andric {codeview::RegisterId::ST7, X86::ST7}, 21504eeddc0SDimitry Andric 2160b57cec5SDimitry Andric {codeview::RegisterId::ST0, X86::FP0}, 2170b57cec5SDimitry Andric {codeview::RegisterId::ST1, X86::FP1}, 2180b57cec5SDimitry Andric {codeview::RegisterId::ST2, X86::FP2}, 2190b57cec5SDimitry Andric {codeview::RegisterId::ST3, X86::FP3}, 2200b57cec5SDimitry Andric {codeview::RegisterId::ST4, X86::FP4}, 2210b57cec5SDimitry Andric {codeview::RegisterId::ST5, X86::FP5}, 2220b57cec5SDimitry Andric {codeview::RegisterId::ST6, X86::FP6}, 2230b57cec5SDimitry Andric {codeview::RegisterId::ST7, X86::FP7}, 2240b57cec5SDimitry Andric 2250b57cec5SDimitry Andric {codeview::RegisterId::MM0, X86::MM0}, 2260b57cec5SDimitry Andric {codeview::RegisterId::MM1, X86::MM1}, 2270b57cec5SDimitry Andric {codeview::RegisterId::MM2, X86::MM2}, 2280b57cec5SDimitry Andric {codeview::RegisterId::MM3, X86::MM3}, 2290b57cec5SDimitry Andric {codeview::RegisterId::MM4, X86::MM4}, 2300b57cec5SDimitry Andric {codeview::RegisterId::MM5, X86::MM5}, 2310b57cec5SDimitry Andric {codeview::RegisterId::MM6, X86::MM6}, 2320b57cec5SDimitry Andric {codeview::RegisterId::MM7, X86::MM7}, 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andric {codeview::RegisterId::XMM0, X86::XMM0}, 2350b57cec5SDimitry Andric {codeview::RegisterId::XMM1, X86::XMM1}, 2360b57cec5SDimitry Andric {codeview::RegisterId::XMM2, X86::XMM2}, 2370b57cec5SDimitry Andric {codeview::RegisterId::XMM3, X86::XMM3}, 2380b57cec5SDimitry Andric {codeview::RegisterId::XMM4, X86::XMM4}, 2390b57cec5SDimitry Andric {codeview::RegisterId::XMM5, X86::XMM5}, 2400b57cec5SDimitry Andric {codeview::RegisterId::XMM6, X86::XMM6}, 2410b57cec5SDimitry Andric {codeview::RegisterId::XMM7, X86::XMM7}, 2420b57cec5SDimitry Andric 2430b57cec5SDimitry Andric {codeview::RegisterId::XMM8, X86::XMM8}, 2440b57cec5SDimitry Andric {codeview::RegisterId::XMM9, X86::XMM9}, 2450b57cec5SDimitry Andric {codeview::RegisterId::XMM10, X86::XMM10}, 2460b57cec5SDimitry Andric {codeview::RegisterId::XMM11, X86::XMM11}, 2470b57cec5SDimitry Andric {codeview::RegisterId::XMM12, X86::XMM12}, 2480b57cec5SDimitry Andric {codeview::RegisterId::XMM13, X86::XMM13}, 2490b57cec5SDimitry Andric {codeview::RegisterId::XMM14, X86::XMM14}, 2500b57cec5SDimitry Andric {codeview::RegisterId::XMM15, X86::XMM15}, 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andric {codeview::RegisterId::SIL, X86::SIL}, 2530b57cec5SDimitry Andric {codeview::RegisterId::DIL, X86::DIL}, 2540b57cec5SDimitry Andric {codeview::RegisterId::BPL, X86::BPL}, 2550b57cec5SDimitry Andric {codeview::RegisterId::SPL, X86::SPL}, 2560b57cec5SDimitry Andric {codeview::RegisterId::RAX, X86::RAX}, 2570b57cec5SDimitry Andric {codeview::RegisterId::RBX, X86::RBX}, 2580b57cec5SDimitry Andric {codeview::RegisterId::RCX, X86::RCX}, 2590b57cec5SDimitry Andric {codeview::RegisterId::RDX, X86::RDX}, 2600b57cec5SDimitry Andric {codeview::RegisterId::RSI, X86::RSI}, 2610b57cec5SDimitry Andric {codeview::RegisterId::RDI, X86::RDI}, 2620b57cec5SDimitry Andric {codeview::RegisterId::RBP, X86::RBP}, 2630b57cec5SDimitry Andric {codeview::RegisterId::RSP, X86::RSP}, 2640b57cec5SDimitry Andric {codeview::RegisterId::R8, X86::R8}, 2650b57cec5SDimitry Andric {codeview::RegisterId::R9, X86::R9}, 2660b57cec5SDimitry Andric {codeview::RegisterId::R10, X86::R10}, 2670b57cec5SDimitry Andric {codeview::RegisterId::R11, X86::R11}, 2680b57cec5SDimitry Andric {codeview::RegisterId::R12, X86::R12}, 2690b57cec5SDimitry Andric {codeview::RegisterId::R13, X86::R13}, 2700b57cec5SDimitry Andric {codeview::RegisterId::R14, X86::R14}, 2710b57cec5SDimitry Andric {codeview::RegisterId::R15, X86::R15}, 2720b57cec5SDimitry Andric {codeview::RegisterId::R8B, X86::R8B}, 2730b57cec5SDimitry Andric {codeview::RegisterId::R9B, X86::R9B}, 2740b57cec5SDimitry Andric {codeview::RegisterId::R10B, X86::R10B}, 2750b57cec5SDimitry Andric {codeview::RegisterId::R11B, X86::R11B}, 2760b57cec5SDimitry Andric {codeview::RegisterId::R12B, X86::R12B}, 2770b57cec5SDimitry Andric {codeview::RegisterId::R13B, X86::R13B}, 2780b57cec5SDimitry Andric {codeview::RegisterId::R14B, X86::R14B}, 2790b57cec5SDimitry Andric {codeview::RegisterId::R15B, X86::R15B}, 2800b57cec5SDimitry Andric {codeview::RegisterId::R8W, X86::R8W}, 2810b57cec5SDimitry Andric {codeview::RegisterId::R9W, X86::R9W}, 2820b57cec5SDimitry Andric {codeview::RegisterId::R10W, X86::R10W}, 2830b57cec5SDimitry Andric {codeview::RegisterId::R11W, X86::R11W}, 2840b57cec5SDimitry Andric {codeview::RegisterId::R12W, X86::R12W}, 2850b57cec5SDimitry Andric {codeview::RegisterId::R13W, X86::R13W}, 2860b57cec5SDimitry Andric {codeview::RegisterId::R14W, X86::R14W}, 2870b57cec5SDimitry Andric {codeview::RegisterId::R15W, X86::R15W}, 2880b57cec5SDimitry Andric {codeview::RegisterId::R8D, X86::R8D}, 2890b57cec5SDimitry Andric {codeview::RegisterId::R9D, X86::R9D}, 2900b57cec5SDimitry Andric {codeview::RegisterId::R10D, X86::R10D}, 2910b57cec5SDimitry Andric {codeview::RegisterId::R11D, X86::R11D}, 2920b57cec5SDimitry Andric {codeview::RegisterId::R12D, X86::R12D}, 2930b57cec5SDimitry Andric {codeview::RegisterId::R13D, X86::R13D}, 2940b57cec5SDimitry Andric {codeview::RegisterId::R14D, X86::R14D}, 2950b57cec5SDimitry Andric {codeview::RegisterId::R15D, X86::R15D}, 2960b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM0, X86::YMM0}, 2970b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM1, X86::YMM1}, 2980b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM2, X86::YMM2}, 2990b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM3, X86::YMM3}, 3000b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM4, X86::YMM4}, 3010b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM5, X86::YMM5}, 3020b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM6, X86::YMM6}, 3030b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM7, X86::YMM7}, 3040b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM8, X86::YMM8}, 3050b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM9, X86::YMM9}, 3060b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM10, X86::YMM10}, 3070b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM11, X86::YMM11}, 3080b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM12, X86::YMM12}, 3090b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM13, X86::YMM13}, 3100b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM14, X86::YMM14}, 3110b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM15, X86::YMM15}, 3120b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM16, X86::YMM16}, 3130b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM17, X86::YMM17}, 3140b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM18, X86::YMM18}, 3150b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM19, X86::YMM19}, 3160b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM20, X86::YMM20}, 3170b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM21, X86::YMM21}, 3180b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM22, X86::YMM22}, 3190b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM23, X86::YMM23}, 3200b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM24, X86::YMM24}, 3210b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM25, X86::YMM25}, 3220b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM26, X86::YMM26}, 3230b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM27, X86::YMM27}, 3240b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM28, X86::YMM28}, 3250b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM29, X86::YMM29}, 3260b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM30, X86::YMM30}, 3270b57cec5SDimitry Andric {codeview::RegisterId::AMD64_YMM31, X86::YMM31}, 3280b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM0, X86::ZMM0}, 3290b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM1, X86::ZMM1}, 3300b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM2, X86::ZMM2}, 3310b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM3, X86::ZMM3}, 3320b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM4, X86::ZMM4}, 3330b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM5, X86::ZMM5}, 3340b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM6, X86::ZMM6}, 3350b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM7, X86::ZMM7}, 3360b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM8, X86::ZMM8}, 3370b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM9, X86::ZMM9}, 3380b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM10, X86::ZMM10}, 3390b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM11, X86::ZMM11}, 3400b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM12, X86::ZMM12}, 3410b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM13, X86::ZMM13}, 3420b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM14, X86::ZMM14}, 3430b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM15, X86::ZMM15}, 3440b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM16, X86::ZMM16}, 3450b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM17, X86::ZMM17}, 3460b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM18, X86::ZMM18}, 3470b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM19, X86::ZMM19}, 3480b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM20, X86::ZMM20}, 3490b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM21, X86::ZMM21}, 3500b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM22, X86::ZMM22}, 3510b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM23, X86::ZMM23}, 3520b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM24, X86::ZMM24}, 3530b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM25, X86::ZMM25}, 3540b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM26, X86::ZMM26}, 3550b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM27, X86::ZMM27}, 3560b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM28, X86::ZMM28}, 3570b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM29, X86::ZMM29}, 3580b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM30, X86::ZMM30}, 3590b57cec5SDimitry Andric {codeview::RegisterId::AMD64_ZMM31, X86::ZMM31}, 3600b57cec5SDimitry Andric {codeview::RegisterId::AMD64_K0, X86::K0}, 3610b57cec5SDimitry Andric {codeview::RegisterId::AMD64_K1, X86::K1}, 3620b57cec5SDimitry Andric {codeview::RegisterId::AMD64_K2, X86::K2}, 3630b57cec5SDimitry Andric {codeview::RegisterId::AMD64_K3, X86::K3}, 3640b57cec5SDimitry Andric {codeview::RegisterId::AMD64_K4, X86::K4}, 3650b57cec5SDimitry Andric {codeview::RegisterId::AMD64_K5, X86::K5}, 3660b57cec5SDimitry Andric {codeview::RegisterId::AMD64_K6, X86::K6}, 3670b57cec5SDimitry Andric {codeview::RegisterId::AMD64_K7, X86::K7}, 3680b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM16, X86::XMM16}, 3690b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM17, X86::XMM17}, 3700b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM18, X86::XMM18}, 3710b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM19, X86::XMM19}, 3720b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM20, X86::XMM20}, 3730b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM21, X86::XMM21}, 3740b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM22, X86::XMM22}, 3750b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM23, X86::XMM23}, 3760b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM24, X86::XMM24}, 3770b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM25, X86::XMM25}, 3780b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM26, X86::XMM26}, 3790b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM27, X86::XMM27}, 3800b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM28, X86::XMM28}, 3810b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM29, X86::XMM29}, 3820b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM30, X86::XMM30}, 3830b57cec5SDimitry Andric {codeview::RegisterId::AMD64_XMM31, X86::XMM31}, 3840b57cec5SDimitry Andric 3850b57cec5SDimitry Andric }; 38604eeddc0SDimitry Andric for (const auto &I : RegMap) 38704eeddc0SDimitry Andric MRI->mapLLVMRegToCVReg(I.Reg, static_cast<int>(I.CVReg)); 3880b57cec5SDimitry Andric } 3890b57cec5SDimitry Andric 3900b57cec5SDimitry Andric MCSubtargetInfo *X86_MC::createX86MCSubtargetInfo(const Triple &TT, 3910b57cec5SDimitry Andric StringRef CPU, StringRef FS) { 3920b57cec5SDimitry Andric std::string ArchFS = X86_MC::ParseX86Triple(TT); 393480093f4SDimitry Andric assert(!ArchFS.empty() && "Failed to parse X86 triple"); 394480093f4SDimitry Andric if (!FS.empty()) 3950b57cec5SDimitry Andric ArchFS = (Twine(ArchFS) + "," + FS).str(); 3960b57cec5SDimitry Andric 397e8d8bef9SDimitry Andric if (CPU.empty()) 398e8d8bef9SDimitry Andric CPU = "generic"; 3990b57cec5SDimitry Andric 4005f757f3fSDimitry Andric size_t posNoEVEX512 = FS.rfind("-evex512"); 4015f757f3fSDimitry Andric // Make sure we won't be cheated by "-avx512fp16". 4025f757f3fSDimitry Andric size_t posNoAVX512F = 4035f757f3fSDimitry Andric FS.ends_with("-avx512f") ? FS.size() - 8 : FS.rfind("-avx512f,"); 4045f757f3fSDimitry Andric size_t posEVEX512 = FS.rfind("+evex512"); 4055f757f3fSDimitry Andric size_t posAVX512F = FS.rfind("+avx512"); // Any AVX512XXX will enable AVX512F. 4065f757f3fSDimitry Andric 4075f757f3fSDimitry Andric if (posAVX512F != StringRef::npos && 4085f757f3fSDimitry Andric (posNoAVX512F == StringRef::npos || posNoAVX512F < posAVX512F)) 4095f757f3fSDimitry Andric if (posEVEX512 == StringRef::npos && posNoEVEX512 == StringRef::npos) 4105f757f3fSDimitry Andric ArchFS += ",+evex512"; 4115f757f3fSDimitry Andric 412e8d8bef9SDimitry Andric return createX86MCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, ArchFS); 4130b57cec5SDimitry Andric } 4140b57cec5SDimitry Andric 4150b57cec5SDimitry Andric static MCInstrInfo *createX86MCInstrInfo() { 4160b57cec5SDimitry Andric MCInstrInfo *X = new MCInstrInfo(); 4170b57cec5SDimitry Andric InitX86MCInstrInfo(X); 4180b57cec5SDimitry Andric return X; 4190b57cec5SDimitry Andric } 4200b57cec5SDimitry Andric 4210b57cec5SDimitry Andric static MCRegisterInfo *createX86MCRegisterInfo(const Triple &TT) { 4220b57cec5SDimitry Andric unsigned RA = (TT.getArch() == Triple::x86_64) 4230b57cec5SDimitry Andric ? X86::RIP // Should have dwarf #16. 4240b57cec5SDimitry Andric : X86::EIP; // Should have dwarf #8. 4250b57cec5SDimitry Andric 4260b57cec5SDimitry Andric MCRegisterInfo *X = new MCRegisterInfo(); 4270b57cec5SDimitry Andric InitX86MCRegisterInfo(X, RA, X86_MC::getDwarfRegFlavour(TT, false), 4280b57cec5SDimitry Andric X86_MC::getDwarfRegFlavour(TT, true), RA); 4290b57cec5SDimitry Andric X86_MC::initLLVMToSEHAndCVRegMapping(X); 4300b57cec5SDimitry Andric return X; 4310b57cec5SDimitry Andric } 4320b57cec5SDimitry Andric 4330b57cec5SDimitry Andric static MCAsmInfo *createX86MCAsmInfo(const MCRegisterInfo &MRI, 434480093f4SDimitry Andric const Triple &TheTriple, 435480093f4SDimitry Andric const MCTargetOptions &Options) { 4360b57cec5SDimitry Andric bool is64Bit = TheTriple.getArch() == Triple::x86_64; 4370b57cec5SDimitry Andric 4380b57cec5SDimitry Andric MCAsmInfo *MAI; 4390b57cec5SDimitry Andric if (TheTriple.isOSBinFormatMachO()) { 4400b57cec5SDimitry Andric if (is64Bit) 4410b57cec5SDimitry Andric MAI = new X86_64MCAsmInfoDarwin(TheTriple); 4420b57cec5SDimitry Andric else 4430b57cec5SDimitry Andric MAI = new X86MCAsmInfoDarwin(TheTriple); 4440b57cec5SDimitry Andric } else if (TheTriple.isOSBinFormatELF()) { 4450b57cec5SDimitry Andric // Force the use of an ELF container. 4460b57cec5SDimitry Andric MAI = new X86ELFMCAsmInfo(TheTriple); 4470b57cec5SDimitry Andric } else if (TheTriple.isWindowsMSVCEnvironment() || 4480b57cec5SDimitry Andric TheTriple.isWindowsCoreCLREnvironment()) { 449fe6060f1SDimitry Andric if (Options.getAssemblyLanguage().equals_insensitive("masm")) 4505ffd83dbSDimitry Andric MAI = new X86MCAsmInfoMicrosoftMASM(TheTriple); 4515ffd83dbSDimitry Andric else 4520b57cec5SDimitry Andric MAI = new X86MCAsmInfoMicrosoft(TheTriple); 4530b57cec5SDimitry Andric } else if (TheTriple.isOSCygMing() || 4540b57cec5SDimitry Andric TheTriple.isWindowsItaniumEnvironment()) { 4550b57cec5SDimitry Andric MAI = new X86MCAsmInfoGNUCOFF(TheTriple); 45606c3fb27SDimitry Andric } else if (TheTriple.isUEFI()) { 45706c3fb27SDimitry Andric MAI = new X86MCAsmInfoGNUCOFF(TheTriple); 4580b57cec5SDimitry Andric } else { 4590b57cec5SDimitry Andric // The default is ELF. 4600b57cec5SDimitry Andric MAI = new X86ELFMCAsmInfo(TheTriple); 4610b57cec5SDimitry Andric } 4620b57cec5SDimitry Andric 4630b57cec5SDimitry Andric // Initialize initial frame state. 4640b57cec5SDimitry Andric // Calculate amount of bytes used for return address storing 4650b57cec5SDimitry Andric int stackGrowth = is64Bit ? -8 : -4; 4660b57cec5SDimitry Andric 4670b57cec5SDimitry Andric // Initial state of the frame pointer is esp+stackGrowth. 4680b57cec5SDimitry Andric unsigned StackPtr = is64Bit ? X86::RSP : X86::ESP; 4695ffd83dbSDimitry Andric MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa( 4700b57cec5SDimitry Andric nullptr, MRI.getDwarfRegNum(StackPtr, true), -stackGrowth); 4710b57cec5SDimitry Andric MAI->addInitialFrameState(Inst); 4720b57cec5SDimitry Andric 4730b57cec5SDimitry Andric // Add return address to move list 4740b57cec5SDimitry Andric unsigned InstPtr = is64Bit ? X86::RIP : X86::EIP; 4750b57cec5SDimitry Andric MCCFIInstruction Inst2 = MCCFIInstruction::createOffset( 4760b57cec5SDimitry Andric nullptr, MRI.getDwarfRegNum(InstPtr, true), stackGrowth); 4770b57cec5SDimitry Andric MAI->addInitialFrameState(Inst2); 4780b57cec5SDimitry Andric 4790b57cec5SDimitry Andric return MAI; 4800b57cec5SDimitry Andric } 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andric static MCInstPrinter *createX86MCInstPrinter(const Triple &T, 4830b57cec5SDimitry Andric unsigned SyntaxVariant, 4840b57cec5SDimitry Andric const MCAsmInfo &MAI, 4850b57cec5SDimitry Andric const MCInstrInfo &MII, 4860b57cec5SDimitry Andric const MCRegisterInfo &MRI) { 4870b57cec5SDimitry Andric if (SyntaxVariant == 0) 4880b57cec5SDimitry Andric return new X86ATTInstPrinter(MAI, MII, MRI); 4890b57cec5SDimitry Andric if (SyntaxVariant == 1) 4900b57cec5SDimitry Andric return new X86IntelInstPrinter(MAI, MII, MRI); 4910b57cec5SDimitry Andric return nullptr; 4920b57cec5SDimitry Andric } 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andric static MCRelocationInfo *createX86MCRelocationInfo(const Triple &TheTriple, 4950b57cec5SDimitry Andric MCContext &Ctx) { 4960b57cec5SDimitry Andric // Default to the stock relocation info. 4970b57cec5SDimitry Andric return llvm::createMCRelocationInfo(TheTriple, Ctx); 4980b57cec5SDimitry Andric } 4990b57cec5SDimitry Andric 5000b57cec5SDimitry Andric namespace llvm { 5010b57cec5SDimitry Andric namespace X86_MC { 5020b57cec5SDimitry Andric 5030b57cec5SDimitry Andric class X86MCInstrAnalysis : public MCInstrAnalysis { 5040b57cec5SDimitry Andric X86MCInstrAnalysis(const X86MCInstrAnalysis &) = delete; 5050b57cec5SDimitry Andric X86MCInstrAnalysis &operator=(const X86MCInstrAnalysis &) = delete; 5060b57cec5SDimitry Andric virtual ~X86MCInstrAnalysis() = default; 5070b57cec5SDimitry Andric 5080b57cec5SDimitry Andric public: 5090b57cec5SDimitry Andric X86MCInstrAnalysis(const MCInstrInfo *MCII) : MCInstrAnalysis(MCII) {} 5100b57cec5SDimitry Andric 5110b57cec5SDimitry Andric #define GET_STIPREDICATE_DECLS_FOR_MC_ANALYSIS 5120b57cec5SDimitry Andric #include "X86GenSubtargetInfo.inc" 5130b57cec5SDimitry Andric 5140b57cec5SDimitry Andric bool clearsSuperRegisters(const MCRegisterInfo &MRI, const MCInst &Inst, 5150b57cec5SDimitry Andric APInt &Mask) const override; 5160b57cec5SDimitry Andric std::vector<std::pair<uint64_t, uint64_t>> 5170b57cec5SDimitry Andric findPltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents, 5180b57cec5SDimitry Andric const Triple &TargetTriple) const override; 5195ffd83dbSDimitry Andric 5205ffd83dbSDimitry Andric bool evaluateBranch(const MCInst &Inst, uint64_t Addr, uint64_t Size, 5215ffd83dbSDimitry Andric uint64_t &Target) const override; 522bdd1243dSDimitry Andric std::optional<uint64_t> 523bdd1243dSDimitry Andric evaluateMemoryOperandAddress(const MCInst &Inst, const MCSubtargetInfo *STI, 524bdd1243dSDimitry Andric uint64_t Addr, uint64_t Size) const override; 525bdd1243dSDimitry Andric std::optional<uint64_t> 526349cc55cSDimitry Andric getMemoryOperandRelocationOffset(const MCInst &Inst, 527349cc55cSDimitry Andric uint64_t Size) const override; 5280b57cec5SDimitry Andric }; 5290b57cec5SDimitry Andric 5300b57cec5SDimitry Andric #define GET_STIPREDICATE_DEFS_FOR_MC_ANALYSIS 5310b57cec5SDimitry Andric #include "X86GenSubtargetInfo.inc" 5320b57cec5SDimitry Andric 5330b57cec5SDimitry Andric bool X86MCInstrAnalysis::clearsSuperRegisters(const MCRegisterInfo &MRI, 5340b57cec5SDimitry Andric const MCInst &Inst, 5350b57cec5SDimitry Andric APInt &Mask) const { 5360b57cec5SDimitry Andric const MCInstrDesc &Desc = Info->get(Inst.getOpcode()); 5370b57cec5SDimitry Andric unsigned NumDefs = Desc.getNumDefs(); 538bdd1243dSDimitry Andric unsigned NumImplicitDefs = Desc.implicit_defs().size(); 5390b57cec5SDimitry Andric assert(Mask.getBitWidth() == NumDefs + NumImplicitDefs && 5400b57cec5SDimitry Andric "Unexpected number of bits in the mask!"); 5410b57cec5SDimitry Andric 5420b57cec5SDimitry Andric bool HasVEX = (Desc.TSFlags & X86II::EncodingMask) == X86II::VEX; 5430b57cec5SDimitry Andric bool HasEVEX = (Desc.TSFlags & X86II::EncodingMask) == X86II::EVEX; 5440b57cec5SDimitry Andric bool HasXOP = (Desc.TSFlags & X86II::EncodingMask) == X86II::XOP; 5450b57cec5SDimitry Andric 5460b57cec5SDimitry Andric const MCRegisterClass &GR32RC = MRI.getRegClass(X86::GR32RegClassID); 5470b57cec5SDimitry Andric const MCRegisterClass &VR128XRC = MRI.getRegClass(X86::VR128XRegClassID); 5480b57cec5SDimitry Andric const MCRegisterClass &VR256XRC = MRI.getRegClass(X86::VR256XRegClassID); 5490b57cec5SDimitry Andric 5500b57cec5SDimitry Andric auto ClearsSuperReg = [=](unsigned RegID) { 5510b57cec5SDimitry Andric // On X86-64, a general purpose integer register is viewed as a 64-bit 5520b57cec5SDimitry Andric // register internal to the processor. 5530b57cec5SDimitry Andric // An update to the lower 32 bits of a 64 bit integer register is 5540b57cec5SDimitry Andric // architecturally defined to zero extend the upper 32 bits. 5550b57cec5SDimitry Andric if (GR32RC.contains(RegID)) 5560b57cec5SDimitry Andric return true; 5570b57cec5SDimitry Andric 5580b57cec5SDimitry Andric // Early exit if this instruction has no vex/evex/xop prefix. 5590b57cec5SDimitry Andric if (!HasEVEX && !HasVEX && !HasXOP) 5600b57cec5SDimitry Andric return false; 5610b57cec5SDimitry Andric 5620b57cec5SDimitry Andric // All VEX and EVEX encoded instructions are defined to zero the high bits 5630b57cec5SDimitry Andric // of the destination register up to VLMAX (i.e. the maximum vector register 5640b57cec5SDimitry Andric // width pertaining to the instruction). 5650b57cec5SDimitry Andric // We assume the same behavior for XOP instructions too. 5660b57cec5SDimitry Andric return VR128XRC.contains(RegID) || VR256XRC.contains(RegID); 5670b57cec5SDimitry Andric }; 5680b57cec5SDimitry Andric 5690b57cec5SDimitry Andric Mask.clearAllBits(); 5700b57cec5SDimitry Andric for (unsigned I = 0, E = NumDefs; I < E; ++I) { 5710b57cec5SDimitry Andric const MCOperand &Op = Inst.getOperand(I); 5720b57cec5SDimitry Andric if (ClearsSuperReg(Op.getReg())) 5730b57cec5SDimitry Andric Mask.setBit(I); 5740b57cec5SDimitry Andric } 5750b57cec5SDimitry Andric 5760b57cec5SDimitry Andric for (unsigned I = 0, E = NumImplicitDefs; I < E; ++I) { 577bdd1243dSDimitry Andric const MCPhysReg Reg = Desc.implicit_defs()[I]; 5780b57cec5SDimitry Andric if (ClearsSuperReg(Reg)) 5790b57cec5SDimitry Andric Mask.setBit(NumDefs + I); 5800b57cec5SDimitry Andric } 5810b57cec5SDimitry Andric 5820b57cec5SDimitry Andric return Mask.getBoolValue(); 5830b57cec5SDimitry Andric } 5840b57cec5SDimitry Andric 5850b57cec5SDimitry Andric static std::vector<std::pair<uint64_t, uint64_t>> 58606c3fb27SDimitry Andric findX86PltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents) { 5870b57cec5SDimitry Andric // Do a lightweight parsing of PLT entries. 5880b57cec5SDimitry Andric std::vector<std::pair<uint64_t, uint64_t>> Result; 5890b57cec5SDimitry Andric for (uint64_t Byte = 0, End = PltContents.size(); Byte + 6 < End; ) { 5900b57cec5SDimitry Andric // Recognize a jmp. 5910b57cec5SDimitry Andric if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0xa3) { 5920b57cec5SDimitry Andric // The jmp instruction at the beginning of each PLT entry jumps to the 5930b57cec5SDimitry Andric // address of the base of the .got.plt section plus the immediate. 59406c3fb27SDimitry Andric // Set the 1 << 32 bit to let ELFObjectFileBase::getPltEntries convert the 59506c3fb27SDimitry Andric // offset to an address. Imm may be a negative int32_t if the GOT entry is 59606c3fb27SDimitry Andric // in .got. 5970b57cec5SDimitry Andric uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2); 59806c3fb27SDimitry Andric Result.emplace_back(PltSectionVA + Byte, Imm | (uint64_t(1) << 32)); 5990b57cec5SDimitry Andric Byte += 6; 6000b57cec5SDimitry Andric } else if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0x25) { 6010b57cec5SDimitry Andric // The jmp instruction at the beginning of each PLT entry jumps to the 6020b57cec5SDimitry Andric // immediate. 6030b57cec5SDimitry Andric uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2); 6040b57cec5SDimitry Andric Result.push_back(std::make_pair(PltSectionVA + Byte, Imm)); 6050b57cec5SDimitry Andric Byte += 6; 6060b57cec5SDimitry Andric } else 6070b57cec5SDimitry Andric Byte++; 6080b57cec5SDimitry Andric } 6090b57cec5SDimitry Andric return Result; 6100b57cec5SDimitry Andric } 6110b57cec5SDimitry Andric 6120b57cec5SDimitry Andric static std::vector<std::pair<uint64_t, uint64_t>> 6130b57cec5SDimitry Andric findX86_64PltEntries(uint64_t PltSectionVA, ArrayRef<uint8_t> PltContents) { 6140b57cec5SDimitry Andric // Do a lightweight parsing of PLT entries. 6150b57cec5SDimitry Andric std::vector<std::pair<uint64_t, uint64_t>> Result; 6160b57cec5SDimitry Andric for (uint64_t Byte = 0, End = PltContents.size(); Byte + 6 < End; ) { 6170b57cec5SDimitry Andric // Recognize a jmp. 6180b57cec5SDimitry Andric if (PltContents[Byte] == 0xff && PltContents[Byte + 1] == 0x25) { 6190b57cec5SDimitry Andric // The jmp instruction at the beginning of each PLT entry jumps to the 6200b57cec5SDimitry Andric // address of the next instruction plus the immediate. 6210b57cec5SDimitry Andric uint32_t Imm = support::endian::read32le(PltContents.data() + Byte + 2); 6220b57cec5SDimitry Andric Result.push_back( 6230b57cec5SDimitry Andric std::make_pair(PltSectionVA + Byte, PltSectionVA + Byte + 6 + Imm)); 6240b57cec5SDimitry Andric Byte += 6; 6250b57cec5SDimitry Andric } else 6260b57cec5SDimitry Andric Byte++; 6270b57cec5SDimitry Andric } 6280b57cec5SDimitry Andric return Result; 6290b57cec5SDimitry Andric } 6300b57cec5SDimitry Andric 63106c3fb27SDimitry Andric std::vector<std::pair<uint64_t, uint64_t>> 63206c3fb27SDimitry Andric X86MCInstrAnalysis::findPltEntries(uint64_t PltSectionVA, 63306c3fb27SDimitry Andric ArrayRef<uint8_t> PltContents, 63406c3fb27SDimitry Andric const Triple &TargetTriple) const { 6350b57cec5SDimitry Andric switch (TargetTriple.getArch()) { 6360b57cec5SDimitry Andric case Triple::x86: 63706c3fb27SDimitry Andric return findX86PltEntries(PltSectionVA, PltContents); 6380b57cec5SDimitry Andric case Triple::x86_64: 6390b57cec5SDimitry Andric return findX86_64PltEntries(PltSectionVA, PltContents); 6400b57cec5SDimitry Andric default: 6410b57cec5SDimitry Andric return {}; 6420b57cec5SDimitry Andric } 6430b57cec5SDimitry Andric } 6440b57cec5SDimitry Andric 6455ffd83dbSDimitry Andric bool X86MCInstrAnalysis::evaluateBranch(const MCInst &Inst, uint64_t Addr, 6465ffd83dbSDimitry Andric uint64_t Size, uint64_t &Target) const { 6475ffd83dbSDimitry Andric if (Inst.getNumOperands() == 0 || 648bdd1243dSDimitry Andric Info->get(Inst.getOpcode()).operands()[0].OperandType != 649bdd1243dSDimitry Andric MCOI::OPERAND_PCREL) 6505ffd83dbSDimitry Andric return false; 6515ffd83dbSDimitry Andric Target = Addr + Size + Inst.getOperand(0).getImm(); 6525ffd83dbSDimitry Andric return true; 6535ffd83dbSDimitry Andric } 6545ffd83dbSDimitry Andric 655bdd1243dSDimitry Andric std::optional<uint64_t> X86MCInstrAnalysis::evaluateMemoryOperandAddress( 656349cc55cSDimitry Andric const MCInst &Inst, const MCSubtargetInfo *STI, uint64_t Addr, 657349cc55cSDimitry Andric uint64_t Size) const { 6588bcb0991SDimitry Andric const MCInstrDesc &MCID = Info->get(Inst.getOpcode()); 6598bcb0991SDimitry Andric int MemOpStart = X86II::getMemoryOperandNo(MCID.TSFlags); 6608bcb0991SDimitry Andric if (MemOpStart == -1) 661bdd1243dSDimitry Andric return std::nullopt; 6628bcb0991SDimitry Andric MemOpStart += X86II::getOperandBias(MCID); 6638bcb0991SDimitry Andric 6648bcb0991SDimitry Andric const MCOperand &SegReg = Inst.getOperand(MemOpStart + X86::AddrSegmentReg); 6658bcb0991SDimitry Andric const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg); 6668bcb0991SDimitry Andric const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg); 6678bcb0991SDimitry Andric const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt); 6688bcb0991SDimitry Andric const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp); 6698bcb0991SDimitry Andric if (SegReg.getReg() != 0 || IndexReg.getReg() != 0 || ScaleAmt.getImm() != 1 || 6708bcb0991SDimitry Andric !Disp.isImm()) 671bdd1243dSDimitry Andric return std::nullopt; 6728bcb0991SDimitry Andric 6738bcb0991SDimitry Andric // RIP-relative addressing. 6748bcb0991SDimitry Andric if (BaseReg.getReg() == X86::RIP) 6758bcb0991SDimitry Andric return Addr + Size + Disp.getImm(); 6768bcb0991SDimitry Andric 677bdd1243dSDimitry Andric return std::nullopt; 6788bcb0991SDimitry Andric } 6798bcb0991SDimitry Andric 680bdd1243dSDimitry Andric std::optional<uint64_t> 681349cc55cSDimitry Andric X86MCInstrAnalysis::getMemoryOperandRelocationOffset(const MCInst &Inst, 682349cc55cSDimitry Andric uint64_t Size) const { 683349cc55cSDimitry Andric if (Inst.getOpcode() != X86::LEA64r) 684bdd1243dSDimitry Andric return std::nullopt; 685349cc55cSDimitry Andric const MCInstrDesc &MCID = Info->get(Inst.getOpcode()); 686349cc55cSDimitry Andric int MemOpStart = X86II::getMemoryOperandNo(MCID.TSFlags); 687349cc55cSDimitry Andric if (MemOpStart == -1) 688bdd1243dSDimitry Andric return std::nullopt; 689349cc55cSDimitry Andric MemOpStart += X86II::getOperandBias(MCID); 690349cc55cSDimitry Andric const MCOperand &SegReg = Inst.getOperand(MemOpStart + X86::AddrSegmentReg); 691349cc55cSDimitry Andric const MCOperand &BaseReg = Inst.getOperand(MemOpStart + X86::AddrBaseReg); 692349cc55cSDimitry Andric const MCOperand &IndexReg = Inst.getOperand(MemOpStart + X86::AddrIndexReg); 693349cc55cSDimitry Andric const MCOperand &ScaleAmt = Inst.getOperand(MemOpStart + X86::AddrScaleAmt); 694349cc55cSDimitry Andric const MCOperand &Disp = Inst.getOperand(MemOpStart + X86::AddrDisp); 695349cc55cSDimitry Andric // Must be a simple rip-relative address. 696349cc55cSDimitry Andric if (BaseReg.getReg() != X86::RIP || SegReg.getReg() != 0 || 697349cc55cSDimitry Andric IndexReg.getReg() != 0 || ScaleAmt.getImm() != 1 || !Disp.isImm()) 698bdd1243dSDimitry Andric return std::nullopt; 699349cc55cSDimitry Andric // rip-relative ModR/M immediate is 32 bits. 700349cc55cSDimitry Andric assert(Size > 4 && "invalid instruction size for rip-relative lea"); 701349cc55cSDimitry Andric return Size - 4; 702349cc55cSDimitry Andric } 703349cc55cSDimitry Andric 7040b57cec5SDimitry Andric } // end of namespace X86_MC 7050b57cec5SDimitry Andric 7060b57cec5SDimitry Andric } // end of namespace llvm 7070b57cec5SDimitry Andric 7080b57cec5SDimitry Andric static MCInstrAnalysis *createX86MCInstrAnalysis(const MCInstrInfo *Info) { 7090b57cec5SDimitry Andric return new X86_MC::X86MCInstrAnalysis(Info); 7100b57cec5SDimitry Andric } 7110b57cec5SDimitry Andric 7120b57cec5SDimitry Andric // Force static initialization. 713480093f4SDimitry Andric extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeX86TargetMC() { 7140b57cec5SDimitry Andric for (Target *T : {&getTheX86_32Target(), &getTheX86_64Target()}) { 7150b57cec5SDimitry Andric // Register the MC asm info. 7160b57cec5SDimitry Andric RegisterMCAsmInfoFn X(*T, createX86MCAsmInfo); 7170b57cec5SDimitry Andric 7180b57cec5SDimitry Andric // Register the MC instruction info. 7190b57cec5SDimitry Andric TargetRegistry::RegisterMCInstrInfo(*T, createX86MCInstrInfo); 7200b57cec5SDimitry Andric 7210b57cec5SDimitry Andric // Register the MC register info. 7220b57cec5SDimitry Andric TargetRegistry::RegisterMCRegInfo(*T, createX86MCRegisterInfo); 7230b57cec5SDimitry Andric 7240b57cec5SDimitry Andric // Register the MC subtarget info. 7250b57cec5SDimitry Andric TargetRegistry::RegisterMCSubtargetInfo(*T, 7260b57cec5SDimitry Andric X86_MC::createX86MCSubtargetInfo); 7270b57cec5SDimitry Andric 7280b57cec5SDimitry Andric // Register the MC instruction analyzer. 7290b57cec5SDimitry Andric TargetRegistry::RegisterMCInstrAnalysis(*T, createX86MCInstrAnalysis); 7300b57cec5SDimitry Andric 7310b57cec5SDimitry Andric // Register the code emitter. 7320b57cec5SDimitry Andric TargetRegistry::RegisterMCCodeEmitter(*T, createX86MCCodeEmitter); 7330b57cec5SDimitry Andric 7340b57cec5SDimitry Andric // Register the obj target streamer. 7350b57cec5SDimitry Andric TargetRegistry::RegisterObjectTargetStreamer(*T, 7360b57cec5SDimitry Andric createX86ObjectTargetStreamer); 7370b57cec5SDimitry Andric 7380b57cec5SDimitry Andric // Register the asm target streamer. 7390b57cec5SDimitry Andric TargetRegistry::RegisterAsmTargetStreamer(*T, createX86AsmTargetStreamer); 7400b57cec5SDimitry Andric 741bdd1243dSDimitry Andric // Register the null streamer. 742bdd1243dSDimitry Andric TargetRegistry::RegisterNullTargetStreamer(*T, createX86NullTargetStreamer); 743bdd1243dSDimitry Andric 7440b57cec5SDimitry Andric TargetRegistry::RegisterCOFFStreamer(*T, createX86WinCOFFStreamer); 745*0fca6ea1SDimitry Andric TargetRegistry::RegisterELFStreamer(*T, createX86ELFStreamer); 7460b57cec5SDimitry Andric 7470b57cec5SDimitry Andric // Register the MCInstPrinter. 7480b57cec5SDimitry Andric TargetRegistry::RegisterMCInstPrinter(*T, createX86MCInstPrinter); 7490b57cec5SDimitry Andric 7500b57cec5SDimitry Andric // Register the MC relocation info. 7510b57cec5SDimitry Andric TargetRegistry::RegisterMCRelocationInfo(*T, createX86MCRelocationInfo); 7520b57cec5SDimitry Andric } 7530b57cec5SDimitry Andric 7540b57cec5SDimitry Andric // Register the asm backend. 7550b57cec5SDimitry Andric TargetRegistry::RegisterMCAsmBackend(getTheX86_32Target(), 7560b57cec5SDimitry Andric createX86_32AsmBackend); 7570b57cec5SDimitry Andric TargetRegistry::RegisterMCAsmBackend(getTheX86_64Target(), 7580b57cec5SDimitry Andric createX86_64AsmBackend); 7590b57cec5SDimitry Andric } 7600b57cec5SDimitry Andric 76106c3fb27SDimitry Andric MCRegister llvm::getX86SubSuperRegister(MCRegister Reg, unsigned Size, 7620b57cec5SDimitry Andric bool High) { 7635f757f3fSDimitry Andric #define DEFAULT_NOREG \ 7645f757f3fSDimitry Andric default: \ 7655f757f3fSDimitry Andric return X86::NoRegister; 7665f757f3fSDimitry Andric #define SUB_SUPER(R1, R2, R3, R4, R) \ 7675f757f3fSDimitry Andric case X86::R1: \ 7685f757f3fSDimitry Andric case X86::R2: \ 7695f757f3fSDimitry Andric case X86::R3: \ 7705f757f3fSDimitry Andric case X86::R4: \ 7715f757f3fSDimitry Andric return X86::R; 7725f757f3fSDimitry Andric #define A_SUB_SUPER(R) \ 7735f757f3fSDimitry Andric case X86::AH: \ 7745f757f3fSDimitry Andric SUB_SUPER(AL, AX, EAX, RAX, R) 7755f757f3fSDimitry Andric #define D_SUB_SUPER(R) \ 7765f757f3fSDimitry Andric case X86::DH: \ 7775f757f3fSDimitry Andric SUB_SUPER(DL, DX, EDX, RDX, R) 7785f757f3fSDimitry Andric #define C_SUB_SUPER(R) \ 7795f757f3fSDimitry Andric case X86::CH: \ 7805f757f3fSDimitry Andric SUB_SUPER(CL, CX, ECX, RCX, R) 7815f757f3fSDimitry Andric #define B_SUB_SUPER(R) \ 7825f757f3fSDimitry Andric case X86::BH: \ 7835f757f3fSDimitry Andric SUB_SUPER(BL, BX, EBX, RBX, R) 7845f757f3fSDimitry Andric #define SI_SUB_SUPER(R) SUB_SUPER(SIL, SI, ESI, RSI, R) 7855f757f3fSDimitry Andric #define DI_SUB_SUPER(R) SUB_SUPER(DIL, DI, EDI, RDI, R) 7865f757f3fSDimitry Andric #define BP_SUB_SUPER(R) SUB_SUPER(BPL, BP, EBP, RBP, R) 7875f757f3fSDimitry Andric #define SP_SUB_SUPER(R) SUB_SUPER(SPL, SP, ESP, RSP, R) 7885f757f3fSDimitry Andric #define NO_SUB_SUPER(NO, REG) \ 7895f757f3fSDimitry Andric SUB_SUPER(R##NO##B, R##NO##W, R##NO##D, R##NO, REG) 7905f757f3fSDimitry Andric #define NO_SUB_SUPER_B(NO) NO_SUB_SUPER(NO, R##NO##B) 7915f757f3fSDimitry Andric #define NO_SUB_SUPER_W(NO) NO_SUB_SUPER(NO, R##NO##W) 7925f757f3fSDimitry Andric #define NO_SUB_SUPER_D(NO) NO_SUB_SUPER(NO, R##NO##D) 7935f757f3fSDimitry Andric #define NO_SUB_SUPER_Q(NO) NO_SUB_SUPER(NO, R##NO) 7940b57cec5SDimitry Andric switch (Size) { 7955f757f3fSDimitry Andric default: 7965f757f3fSDimitry Andric llvm_unreachable("illegal register size"); 7970b57cec5SDimitry Andric case 8: 7980b57cec5SDimitry Andric if (High) { 7998bcb0991SDimitry Andric switch (Reg.id()) { 8005f757f3fSDimitry Andric DEFAULT_NOREG 8015f757f3fSDimitry Andric A_SUB_SUPER(AH) 8025f757f3fSDimitry Andric D_SUB_SUPER(DH) 8035f757f3fSDimitry Andric C_SUB_SUPER(CH) 8045f757f3fSDimitry Andric B_SUB_SUPER(BH) 8050b57cec5SDimitry Andric } 8060b57cec5SDimitry Andric } else { 8078bcb0991SDimitry Andric switch (Reg.id()) { 8085f757f3fSDimitry Andric DEFAULT_NOREG 8095f757f3fSDimitry Andric A_SUB_SUPER(AL) 8105f757f3fSDimitry Andric D_SUB_SUPER(DL) 8115f757f3fSDimitry Andric C_SUB_SUPER(CL) 8125f757f3fSDimitry Andric B_SUB_SUPER(BL) 8135f757f3fSDimitry Andric SI_SUB_SUPER(SIL) 8145f757f3fSDimitry Andric DI_SUB_SUPER(DIL) 8155f757f3fSDimitry Andric BP_SUB_SUPER(BPL) 8165f757f3fSDimitry Andric SP_SUB_SUPER(SPL) 8175f757f3fSDimitry Andric NO_SUB_SUPER_B(8) 8185f757f3fSDimitry Andric NO_SUB_SUPER_B(9) 8195f757f3fSDimitry Andric NO_SUB_SUPER_B(10) 8205f757f3fSDimitry Andric NO_SUB_SUPER_B(11) 8215f757f3fSDimitry Andric NO_SUB_SUPER_B(12) 8225f757f3fSDimitry Andric NO_SUB_SUPER_B(13) 8235f757f3fSDimitry Andric NO_SUB_SUPER_B(14) 8245f757f3fSDimitry Andric NO_SUB_SUPER_B(15) 8255f757f3fSDimitry Andric NO_SUB_SUPER_B(16) 8265f757f3fSDimitry Andric NO_SUB_SUPER_B(17) 8275f757f3fSDimitry Andric NO_SUB_SUPER_B(18) 8285f757f3fSDimitry Andric NO_SUB_SUPER_B(19) 8295f757f3fSDimitry Andric NO_SUB_SUPER_B(20) 8305f757f3fSDimitry Andric NO_SUB_SUPER_B(21) 8315f757f3fSDimitry Andric NO_SUB_SUPER_B(22) 8325f757f3fSDimitry Andric NO_SUB_SUPER_B(23) 8335f757f3fSDimitry Andric NO_SUB_SUPER_B(24) 8345f757f3fSDimitry Andric NO_SUB_SUPER_B(25) 8355f757f3fSDimitry Andric NO_SUB_SUPER_B(26) 8365f757f3fSDimitry Andric NO_SUB_SUPER_B(27) 8375f757f3fSDimitry Andric NO_SUB_SUPER_B(28) 8385f757f3fSDimitry Andric NO_SUB_SUPER_B(29) 8395f757f3fSDimitry Andric NO_SUB_SUPER_B(30) 8405f757f3fSDimitry Andric NO_SUB_SUPER_B(31) 8410b57cec5SDimitry Andric } 8420b57cec5SDimitry Andric } 8430b57cec5SDimitry Andric case 16: 8448bcb0991SDimitry Andric switch (Reg.id()) { 8455f757f3fSDimitry Andric DEFAULT_NOREG 8465f757f3fSDimitry Andric A_SUB_SUPER(AX) 8475f757f3fSDimitry Andric D_SUB_SUPER(DX) 8485f757f3fSDimitry Andric C_SUB_SUPER(CX) 8495f757f3fSDimitry Andric B_SUB_SUPER(BX) 8505f757f3fSDimitry Andric SI_SUB_SUPER(SI) 8515f757f3fSDimitry Andric DI_SUB_SUPER(DI) 8525f757f3fSDimitry Andric BP_SUB_SUPER(BP) 8535f757f3fSDimitry Andric SP_SUB_SUPER(SP) 8545f757f3fSDimitry Andric NO_SUB_SUPER_W(8) 8555f757f3fSDimitry Andric NO_SUB_SUPER_W(9) 8565f757f3fSDimitry Andric NO_SUB_SUPER_W(10) 8575f757f3fSDimitry Andric NO_SUB_SUPER_W(11) 8585f757f3fSDimitry Andric NO_SUB_SUPER_W(12) 8595f757f3fSDimitry Andric NO_SUB_SUPER_W(13) 8605f757f3fSDimitry Andric NO_SUB_SUPER_W(14) 8615f757f3fSDimitry Andric NO_SUB_SUPER_W(15) 8625f757f3fSDimitry Andric NO_SUB_SUPER_W(16) 8635f757f3fSDimitry Andric NO_SUB_SUPER_W(17) 8645f757f3fSDimitry Andric NO_SUB_SUPER_W(18) 8655f757f3fSDimitry Andric NO_SUB_SUPER_W(19) 8665f757f3fSDimitry Andric NO_SUB_SUPER_W(20) 8675f757f3fSDimitry Andric NO_SUB_SUPER_W(21) 8685f757f3fSDimitry Andric NO_SUB_SUPER_W(22) 8695f757f3fSDimitry Andric NO_SUB_SUPER_W(23) 8705f757f3fSDimitry Andric NO_SUB_SUPER_W(24) 8715f757f3fSDimitry Andric NO_SUB_SUPER_W(25) 8725f757f3fSDimitry Andric NO_SUB_SUPER_W(26) 8735f757f3fSDimitry Andric NO_SUB_SUPER_W(27) 8745f757f3fSDimitry Andric NO_SUB_SUPER_W(28) 8755f757f3fSDimitry Andric NO_SUB_SUPER_W(29) 8765f757f3fSDimitry Andric NO_SUB_SUPER_W(30) 8775f757f3fSDimitry Andric NO_SUB_SUPER_W(31) 8780b57cec5SDimitry Andric } 8790b57cec5SDimitry Andric case 32: 8808bcb0991SDimitry Andric switch (Reg.id()) { 8815f757f3fSDimitry Andric DEFAULT_NOREG 8825f757f3fSDimitry Andric A_SUB_SUPER(EAX) 8835f757f3fSDimitry Andric D_SUB_SUPER(EDX) 8845f757f3fSDimitry Andric C_SUB_SUPER(ECX) 8855f757f3fSDimitry Andric B_SUB_SUPER(EBX) 8865f757f3fSDimitry Andric SI_SUB_SUPER(ESI) 8875f757f3fSDimitry Andric DI_SUB_SUPER(EDI) 8885f757f3fSDimitry Andric BP_SUB_SUPER(EBP) 8895f757f3fSDimitry Andric SP_SUB_SUPER(ESP) 8905f757f3fSDimitry Andric NO_SUB_SUPER_D(8) 8915f757f3fSDimitry Andric NO_SUB_SUPER_D(9) 8925f757f3fSDimitry Andric NO_SUB_SUPER_D(10) 8935f757f3fSDimitry Andric NO_SUB_SUPER_D(11) 8945f757f3fSDimitry Andric NO_SUB_SUPER_D(12) 8955f757f3fSDimitry Andric NO_SUB_SUPER_D(13) 8965f757f3fSDimitry Andric NO_SUB_SUPER_D(14) 8975f757f3fSDimitry Andric NO_SUB_SUPER_D(15) 8985f757f3fSDimitry Andric NO_SUB_SUPER_D(16) 8995f757f3fSDimitry Andric NO_SUB_SUPER_D(17) 9005f757f3fSDimitry Andric NO_SUB_SUPER_D(18) 9015f757f3fSDimitry Andric NO_SUB_SUPER_D(19) 9025f757f3fSDimitry Andric NO_SUB_SUPER_D(20) 9035f757f3fSDimitry Andric NO_SUB_SUPER_D(21) 9045f757f3fSDimitry Andric NO_SUB_SUPER_D(22) 9055f757f3fSDimitry Andric NO_SUB_SUPER_D(23) 9065f757f3fSDimitry Andric NO_SUB_SUPER_D(24) 9075f757f3fSDimitry Andric NO_SUB_SUPER_D(25) 9085f757f3fSDimitry Andric NO_SUB_SUPER_D(26) 9095f757f3fSDimitry Andric NO_SUB_SUPER_D(27) 9105f757f3fSDimitry Andric NO_SUB_SUPER_D(28) 9115f757f3fSDimitry Andric NO_SUB_SUPER_D(29) 9125f757f3fSDimitry Andric NO_SUB_SUPER_D(30) 9135f757f3fSDimitry Andric NO_SUB_SUPER_D(31) 9140b57cec5SDimitry Andric } 9150b57cec5SDimitry Andric case 64: 9168bcb0991SDimitry Andric switch (Reg.id()) { 9175f757f3fSDimitry Andric DEFAULT_NOREG 9185f757f3fSDimitry Andric A_SUB_SUPER(RAX) 9195f757f3fSDimitry Andric D_SUB_SUPER(RDX) 9205f757f3fSDimitry Andric C_SUB_SUPER(RCX) 9215f757f3fSDimitry Andric B_SUB_SUPER(RBX) 9225f757f3fSDimitry Andric SI_SUB_SUPER(RSI) 9235f757f3fSDimitry Andric DI_SUB_SUPER(RDI) 9245f757f3fSDimitry Andric BP_SUB_SUPER(RBP) 9255f757f3fSDimitry Andric SP_SUB_SUPER(RSP) 9265f757f3fSDimitry Andric NO_SUB_SUPER_Q(8) 9275f757f3fSDimitry Andric NO_SUB_SUPER_Q(9) 9285f757f3fSDimitry Andric NO_SUB_SUPER_Q(10) 9295f757f3fSDimitry Andric NO_SUB_SUPER_Q(11) 9305f757f3fSDimitry Andric NO_SUB_SUPER_Q(12) 9315f757f3fSDimitry Andric NO_SUB_SUPER_Q(13) 9325f757f3fSDimitry Andric NO_SUB_SUPER_Q(14) 9335f757f3fSDimitry Andric NO_SUB_SUPER_Q(15) 9345f757f3fSDimitry Andric NO_SUB_SUPER_Q(16) 9355f757f3fSDimitry Andric NO_SUB_SUPER_Q(17) 9365f757f3fSDimitry Andric NO_SUB_SUPER_Q(18) 9375f757f3fSDimitry Andric NO_SUB_SUPER_Q(19) 9385f757f3fSDimitry Andric NO_SUB_SUPER_Q(20) 9395f757f3fSDimitry Andric NO_SUB_SUPER_Q(21) 9405f757f3fSDimitry Andric NO_SUB_SUPER_Q(22) 9415f757f3fSDimitry Andric NO_SUB_SUPER_Q(23) 9425f757f3fSDimitry Andric NO_SUB_SUPER_Q(24) 9435f757f3fSDimitry Andric NO_SUB_SUPER_Q(25) 9445f757f3fSDimitry Andric NO_SUB_SUPER_Q(26) 9455f757f3fSDimitry Andric NO_SUB_SUPER_Q(27) 9465f757f3fSDimitry Andric NO_SUB_SUPER_Q(28) 9475f757f3fSDimitry Andric NO_SUB_SUPER_Q(29) 9485f757f3fSDimitry Andric NO_SUB_SUPER_Q(30) 9495f757f3fSDimitry Andric NO_SUB_SUPER_Q(31) 9500b57cec5SDimitry Andric } 9510b57cec5SDimitry Andric } 9520b57cec5SDimitry Andric } 953