10b57cec5SDimitry Andric//===- X86RegisterInfo.td - Describe the X86 Register File --*- tablegen -*-==// 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 describes the X86 Register file, defining the registers themselves, 100b57cec5SDimitry Andric// aliases between the registers, and the register classes built out of the 110b57cec5SDimitry Andric// registers. 120b57cec5SDimitry Andric// 130b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 140b57cec5SDimitry Andric 150b57cec5SDimitry Andricclass X86Reg<string n, bits<16> Enc, list<Register> subregs = []> : Register<n> { 160b57cec5SDimitry Andric let Namespace = "X86"; 170b57cec5SDimitry Andric let HWEncoding = Enc; 180b57cec5SDimitry Andric let SubRegs = subregs; 190b57cec5SDimitry Andric} 200b57cec5SDimitry Andric 210b57cec5SDimitry Andric// Subregister indices. 220b57cec5SDimitry Andriclet Namespace = "X86" in { 230b57cec5SDimitry Andric def sub_8bit : SubRegIndex<8>; 240b57cec5SDimitry Andric def sub_8bit_hi : SubRegIndex<8, 8>; 250b57cec5SDimitry Andric def sub_8bit_hi_phony : SubRegIndex<8, 8>; 260b57cec5SDimitry Andric def sub_16bit : SubRegIndex<16>; 270b57cec5SDimitry Andric def sub_16bit_hi : SubRegIndex<16, 16>; 280b57cec5SDimitry Andric def sub_32bit : SubRegIndex<32>; 290b57cec5SDimitry Andric def sub_xmm : SubRegIndex<128>; 300b57cec5SDimitry Andric def sub_ymm : SubRegIndex<256>; 310b57cec5SDimitry Andric def sub_mask_0 : SubRegIndex<-1>; 320b57cec5SDimitry Andric def sub_mask_1 : SubRegIndex<-1, -1>; 330b57cec5SDimitry Andric} 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 360b57cec5SDimitry Andric// Register definitions... 370b57cec5SDimitry Andric// 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric// In the register alias definitions below, we define which registers alias 400b57cec5SDimitry Andric// which others. We only specify which registers the small registers alias, 410b57cec5SDimitry Andric// because the register file generator is smart enough to figure out that 420b57cec5SDimitry Andric// AL aliases AX if we tell it that AX aliased AL (for example). 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric// Dwarf numbering is different for 32-bit and 64-bit, and there are 450b57cec5SDimitry Andric// variations by target as well. Currently the first entry is for X86-64, 460b57cec5SDimitry Andric// second - for EH on X86-32/Darwin and third is 'generic' one (X86-32/Linux 470b57cec5SDimitry Andric// and debug information on X86-32/Darwin) 480b57cec5SDimitry Andric 490b57cec5SDimitry Andric// 8-bit registers 500b57cec5SDimitry Andric// Low registers 510b57cec5SDimitry Andricdef AL : X86Reg<"al", 0>; 520b57cec5SDimitry Andricdef DL : X86Reg<"dl", 2>; 530b57cec5SDimitry Andricdef CL : X86Reg<"cl", 1>; 540b57cec5SDimitry Andricdef BL : X86Reg<"bl", 3>; 550b57cec5SDimitry Andric 560b57cec5SDimitry Andric// High registers. On x86-64, these cannot be used in any instruction 570b57cec5SDimitry Andric// with a REX prefix. 580b57cec5SDimitry Andricdef AH : X86Reg<"ah", 4>; 590b57cec5SDimitry Andricdef DH : X86Reg<"dh", 6>; 600b57cec5SDimitry Andricdef CH : X86Reg<"ch", 5>; 610b57cec5SDimitry Andricdef BH : X86Reg<"bh", 7>; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric// X86-64 only, requires REX. 640b57cec5SDimitry Andricdef SIL : X86Reg<"sil", 6>; 650b57cec5SDimitry Andricdef DIL : X86Reg<"dil", 7>; 660b57cec5SDimitry Andricdef BPL : X86Reg<"bpl", 5>; 670b57cec5SDimitry Andricdef SPL : X86Reg<"spl", 4>; 680b57cec5SDimitry Andricdef R8B : X86Reg<"r8b", 8>; 690b57cec5SDimitry Andricdef R9B : X86Reg<"r9b", 9>; 700b57cec5SDimitry Andricdef R10B : X86Reg<"r10b", 10>; 710b57cec5SDimitry Andricdef R11B : X86Reg<"r11b", 11>; 720b57cec5SDimitry Andricdef R12B : X86Reg<"r12b", 12>; 730b57cec5SDimitry Andricdef R13B : X86Reg<"r13b", 13>; 740b57cec5SDimitry Andricdef R14B : X86Reg<"r14b", 14>; 750b57cec5SDimitry Andricdef R15B : X86Reg<"r15b", 15>; 76*5f757f3fSDimitry Andric// RAGreedy prefers to select a cheaper register 77*5f757f3fSDimitry Andric// For x86, 78*5f757f3fSDimitry Andric// Cost(caller-save reg) < Cost(callee-save reg) 79*5f757f3fSDimitry Andric// b/c callee-save register needs push/pop in prolog/epilog. 80*5f757f3fSDimitry Andric// If both registers are callee-saved or caller-saved, 81*5f757f3fSDimitry Andric// Cost(short-encoding reg) < Cost(long-encoding reg) 82*5f757f3fSDimitry Andric// 83*5f757f3fSDimitry Andric// To achieve this, we do the following things: 84*5f757f3fSDimitry Andric// 1. Set CostPerUse=1 for registers that need prefix 85*5f757f3fSDimitry Andric// 2. Consider callee-save register is never cheaper than a register w/ cost 1 86*5f757f3fSDimitry Andric// 3. List caller-save register before callee-save regsiter in RegisterClass 87*5f757f3fSDimitry Andric// or AllocationOrder 88*5f757f3fSDimitry Andric// 89*5f757f3fSDimitry Andric// NOTE: 90*5f757f3fSDimitry Andric// D133902 stopped assigning register costs for R8-R15, which brought gain 91*5f757f3fSDimitry Andric// and regression. We don't know if we should assign cost to R16-R31 w/o 92*5f757f3fSDimitry Andric// performance data. 93*5f757f3fSDimitry Andric// TODO: 94*5f757f3fSDimitry Andric// Update the comment/cost after tuning. 95*5f757f3fSDimitry Andric// APX only, requires REX2 or EVEX. 96*5f757f3fSDimitry Andriclet PositionOrder = 4 in { 97*5f757f3fSDimitry Andricdef R16B : X86Reg<"r16b", 16>; 98*5f757f3fSDimitry Andricdef R17B : X86Reg<"r17b", 17>; 99*5f757f3fSDimitry Andricdef R18B : X86Reg<"r18b", 18>; 100*5f757f3fSDimitry Andricdef R19B : X86Reg<"r19b", 19>; 101*5f757f3fSDimitry Andricdef R20B : X86Reg<"r20b", 20>; 102*5f757f3fSDimitry Andricdef R21B : X86Reg<"r21b", 21>; 103*5f757f3fSDimitry Andricdef R22B : X86Reg<"r22b", 22>; 104*5f757f3fSDimitry Andricdef R23B : X86Reg<"r23b", 23>; 105*5f757f3fSDimitry Andricdef R24B : X86Reg<"r24b", 24>; 106*5f757f3fSDimitry Andricdef R25B : X86Reg<"r25b", 25>; 107*5f757f3fSDimitry Andricdef R26B : X86Reg<"r26b", 26>; 108*5f757f3fSDimitry Andricdef R27B : X86Reg<"r27b", 27>; 109*5f757f3fSDimitry Andricdef R28B : X86Reg<"r28b", 28>; 110*5f757f3fSDimitry Andricdef R29B : X86Reg<"r29b", 29>; 111*5f757f3fSDimitry Andricdef R30B : X86Reg<"r30b", 30>; 112*5f757f3fSDimitry Andricdef R31B : X86Reg<"r31b", 31>; 113*5f757f3fSDimitry Andric} 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andriclet isArtificial = 1 in { 1160b57cec5SDimitry Andric// High byte of the low 16 bits of the super-register: 1170b57cec5SDimitry Andricdef SIH : X86Reg<"", -1>; 1180b57cec5SDimitry Andricdef DIH : X86Reg<"", -1>; 1190b57cec5SDimitry Andricdef BPH : X86Reg<"", -1>; 1200b57cec5SDimitry Andricdef SPH : X86Reg<"", -1>; 1210b57cec5SDimitry Andricdef R8BH : X86Reg<"", -1>; 1220b57cec5SDimitry Andricdef R9BH : X86Reg<"", -1>; 1230b57cec5SDimitry Andricdef R10BH : X86Reg<"", -1>; 1240b57cec5SDimitry Andricdef R11BH : X86Reg<"", -1>; 1250b57cec5SDimitry Andricdef R12BH : X86Reg<"", -1>; 1260b57cec5SDimitry Andricdef R13BH : X86Reg<"", -1>; 1270b57cec5SDimitry Andricdef R14BH : X86Reg<"", -1>; 1280b57cec5SDimitry Andricdef R15BH : X86Reg<"", -1>; 129*5f757f3fSDimitry Andriclet PositionOrder = 4 in { 130*5f757f3fSDimitry Andricdef R16BH : X86Reg<"", -1>; 131*5f757f3fSDimitry Andricdef R17BH : X86Reg<"", -1>; 132*5f757f3fSDimitry Andricdef R18BH : X86Reg<"", -1>; 133*5f757f3fSDimitry Andricdef R19BH : X86Reg<"", -1>; 134*5f757f3fSDimitry Andricdef R20BH : X86Reg<"", -1>; 135*5f757f3fSDimitry Andricdef R21BH : X86Reg<"", -1>; 136*5f757f3fSDimitry Andricdef R22BH : X86Reg<"", -1>; 137*5f757f3fSDimitry Andricdef R23BH : X86Reg<"", -1>; 138*5f757f3fSDimitry Andricdef R24BH : X86Reg<"", -1>; 139*5f757f3fSDimitry Andricdef R25BH : X86Reg<"", -1>; 140*5f757f3fSDimitry Andricdef R26BH : X86Reg<"", -1>; 141*5f757f3fSDimitry Andricdef R27BH : X86Reg<"", -1>; 142*5f757f3fSDimitry Andricdef R28BH : X86Reg<"", -1>; 143*5f757f3fSDimitry Andricdef R29BH : X86Reg<"", -1>; 144*5f757f3fSDimitry Andricdef R30BH : X86Reg<"", -1>; 145*5f757f3fSDimitry Andricdef R31BH : X86Reg<"", -1>; 146*5f757f3fSDimitry Andric} 1470b57cec5SDimitry Andric// High word of the low 32 bits of the super-register: 1480b57cec5SDimitry Andricdef HAX : X86Reg<"", -1>; 1490b57cec5SDimitry Andricdef HDX : X86Reg<"", -1>; 1500b57cec5SDimitry Andricdef HCX : X86Reg<"", -1>; 1510b57cec5SDimitry Andricdef HBX : X86Reg<"", -1>; 1520b57cec5SDimitry Andricdef HSI : X86Reg<"", -1>; 1530b57cec5SDimitry Andricdef HDI : X86Reg<"", -1>; 1540b57cec5SDimitry Andricdef HBP : X86Reg<"", -1>; 1550b57cec5SDimitry Andricdef HSP : X86Reg<"", -1>; 1560b57cec5SDimitry Andricdef HIP : X86Reg<"", -1>; 1570b57cec5SDimitry Andricdef R8WH : X86Reg<"", -1>; 1580b57cec5SDimitry Andricdef R9WH : X86Reg<"", -1>; 1590b57cec5SDimitry Andricdef R10WH : X86Reg<"", -1>; 1600b57cec5SDimitry Andricdef R11WH : X86Reg<"", -1>; 1610b57cec5SDimitry Andricdef R12WH : X86Reg<"", -1>; 1620b57cec5SDimitry Andricdef R13WH : X86Reg<"", -1>; 1630b57cec5SDimitry Andricdef R14WH : X86Reg<"", -1>; 1640b57cec5SDimitry Andricdef R15WH : X86Reg<"", -1>; 165*5f757f3fSDimitry Andriclet PositionOrder = 4 in { 166*5f757f3fSDimitry Andricdef R16WH : X86Reg<"", -1>; 167*5f757f3fSDimitry Andricdef R17WH : X86Reg<"", -1>; 168*5f757f3fSDimitry Andricdef R18WH : X86Reg<"", -1>; 169*5f757f3fSDimitry Andricdef R19WH : X86Reg<"", -1>; 170*5f757f3fSDimitry Andricdef R20WH : X86Reg<"", -1>; 171*5f757f3fSDimitry Andricdef R21WH : X86Reg<"", -1>; 172*5f757f3fSDimitry Andricdef R22WH : X86Reg<"", -1>; 173*5f757f3fSDimitry Andricdef R23WH : X86Reg<"", -1>; 174*5f757f3fSDimitry Andricdef R24WH : X86Reg<"", -1>; 175*5f757f3fSDimitry Andricdef R25WH : X86Reg<"", -1>; 176*5f757f3fSDimitry Andricdef R26WH : X86Reg<"", -1>; 177*5f757f3fSDimitry Andricdef R27WH : X86Reg<"", -1>; 178*5f757f3fSDimitry Andricdef R28WH : X86Reg<"", -1>; 179*5f757f3fSDimitry Andricdef R29WH : X86Reg<"", -1>; 180*5f757f3fSDimitry Andricdef R30WH : X86Reg<"", -1>; 181*5f757f3fSDimitry Andricdef R31WH : X86Reg<"", -1>; 182*5f757f3fSDimitry Andric} 1830b57cec5SDimitry Andric} 1840b57cec5SDimitry Andric 1850b57cec5SDimitry Andric// 16-bit registers 1860b57cec5SDimitry Andriclet SubRegIndices = [sub_8bit, sub_8bit_hi], CoveredBySubRegs = 1 in { 1870b57cec5SDimitry Andricdef AX : X86Reg<"ax", 0, [AL,AH]>; 1880b57cec5SDimitry Andricdef DX : X86Reg<"dx", 2, [DL,DH]>; 1890b57cec5SDimitry Andricdef CX : X86Reg<"cx", 1, [CL,CH]>; 1900b57cec5SDimitry Andricdef BX : X86Reg<"bx", 3, [BL,BH]>; 1910b57cec5SDimitry Andric} 1920b57cec5SDimitry Andriclet SubRegIndices = [sub_8bit, sub_8bit_hi_phony], CoveredBySubRegs = 1 in { 1930b57cec5SDimitry Andricdef SI : X86Reg<"si", 6, [SIL,SIH]>; 1940b57cec5SDimitry Andricdef DI : X86Reg<"di", 7, [DIL,DIH]>; 1950b57cec5SDimitry Andricdef BP : X86Reg<"bp", 5, [BPL,BPH]>; 1960b57cec5SDimitry Andricdef SP : X86Reg<"sp", 4, [SPL,SPH]>; 1970b57cec5SDimitry Andric} 1980b57cec5SDimitry Andricdef IP : X86Reg<"ip", 0>; 1990b57cec5SDimitry Andric 2000b57cec5SDimitry Andric// X86-64 only, requires REX. 201bdd1243dSDimitry Andriclet SubRegIndices = [sub_8bit, sub_8bit_hi_phony], CoveredBySubRegs = 1 in { 2020b57cec5SDimitry Andricdef R8W : X86Reg<"r8w", 8, [R8B,R8BH]>; 2030b57cec5SDimitry Andricdef R9W : X86Reg<"r9w", 9, [R9B,R9BH]>; 2040b57cec5SDimitry Andricdef R10W : X86Reg<"r10w", 10, [R10B,R10BH]>; 2050b57cec5SDimitry Andricdef R11W : X86Reg<"r11w", 11, [R11B,R11BH]>; 2060b57cec5SDimitry Andricdef R12W : X86Reg<"r12w", 12, [R12B,R12BH]>; 2070b57cec5SDimitry Andricdef R13W : X86Reg<"r13w", 13, [R13B,R13BH]>; 2080b57cec5SDimitry Andricdef R14W : X86Reg<"r14w", 14, [R14B,R14BH]>; 2090b57cec5SDimitry Andricdef R15W : X86Reg<"r15w", 15, [R15B,R15BH]>; 2100b57cec5SDimitry Andric} 211*5f757f3fSDimitry Andric// APX only, requires REX2 or EVEX. 212*5f757f3fSDimitry Andriclet SubRegIndices = [sub_8bit, sub_8bit_hi_phony], CoveredBySubRegs = 1 in { 213*5f757f3fSDimitry Andriclet PositionOrder = 4 in { 214*5f757f3fSDimitry Andricdef R16W : X86Reg<"r16w", 16, [R16B,R16BH]>; 215*5f757f3fSDimitry Andricdef R17W : X86Reg<"r17w", 17, [R17B,R17BH]>; 216*5f757f3fSDimitry Andricdef R18W : X86Reg<"r18w", 18, [R18B,R18BH]>; 217*5f757f3fSDimitry Andricdef R19W : X86Reg<"r19w", 19, [R19B,R19BH]>; 218*5f757f3fSDimitry Andricdef R20W : X86Reg<"r20w", 20, [R20B,R20BH]>; 219*5f757f3fSDimitry Andricdef R21W : X86Reg<"r21w", 21, [R21B,R21BH]>; 220*5f757f3fSDimitry Andricdef R22W : X86Reg<"r22w", 22, [R22B,R22BH]>; 221*5f757f3fSDimitry Andricdef R23W : X86Reg<"r23w", 23, [R23B,R23BH]>; 222*5f757f3fSDimitry Andricdef R24W : X86Reg<"r24w", 24, [R24B,R24BH]>; 223*5f757f3fSDimitry Andricdef R25W : X86Reg<"r25w", 25, [R25B,R25BH]>; 224*5f757f3fSDimitry Andricdef R26W : X86Reg<"r26w", 26, [R26B,R26BH]>; 225*5f757f3fSDimitry Andricdef R27W : X86Reg<"r27w", 27, [R27B,R27BH]>; 226*5f757f3fSDimitry Andricdef R28W : X86Reg<"r28w", 28, [R28B,R28BH]>; 227*5f757f3fSDimitry Andricdef R29W : X86Reg<"r29w", 29, [R29B,R29BH]>; 228*5f757f3fSDimitry Andricdef R30W : X86Reg<"r30w", 30, [R30B,R30BH]>; 229*5f757f3fSDimitry Andricdef R31W : X86Reg<"r31w", 31, [R31B,R31BH]>; 230*5f757f3fSDimitry Andric} 231*5f757f3fSDimitry Andric} 2320b57cec5SDimitry Andric 2330b57cec5SDimitry Andric// 32-bit registers 2340b57cec5SDimitry Andriclet SubRegIndices = [sub_16bit, sub_16bit_hi], CoveredBySubRegs = 1 in { 2350b57cec5SDimitry Andricdef EAX : X86Reg<"eax", 0, [AX, HAX]>, DwarfRegNum<[-2, 0, 0]>; 2360b57cec5SDimitry Andricdef EDX : X86Reg<"edx", 2, [DX, HDX]>, DwarfRegNum<[-2, 2, 2]>; 2370b57cec5SDimitry Andricdef ECX : X86Reg<"ecx", 1, [CX, HCX]>, DwarfRegNum<[-2, 1, 1]>; 2380b57cec5SDimitry Andricdef EBX : X86Reg<"ebx", 3, [BX, HBX]>, DwarfRegNum<[-2, 3, 3]>; 2390b57cec5SDimitry Andricdef ESI : X86Reg<"esi", 6, [SI, HSI]>, DwarfRegNum<[-2, 6, 6]>; 2400b57cec5SDimitry Andricdef EDI : X86Reg<"edi", 7, [DI, HDI]>, DwarfRegNum<[-2, 7, 7]>; 2410b57cec5SDimitry Andricdef EBP : X86Reg<"ebp", 5, [BP, HBP]>, DwarfRegNum<[-2, 4, 5]>; 2420b57cec5SDimitry Andricdef ESP : X86Reg<"esp", 4, [SP, HSP]>, DwarfRegNum<[-2, 5, 4]>; 2430b57cec5SDimitry Andricdef EIP : X86Reg<"eip", 0, [IP, HIP]>, DwarfRegNum<[-2, 8, 8]>; 2440b57cec5SDimitry Andric} 2450b57cec5SDimitry Andric 2460b57cec5SDimitry Andric// X86-64 only, requires REX 247bdd1243dSDimitry Andriclet SubRegIndices = [sub_16bit, sub_16bit_hi], CoveredBySubRegs = 1 in { 2480b57cec5SDimitry Andricdef R8D : X86Reg<"r8d", 8, [R8W,R8WH]>; 2490b57cec5SDimitry Andricdef R9D : X86Reg<"r9d", 9, [R9W,R9WH]>; 2500b57cec5SDimitry Andricdef R10D : X86Reg<"r10d", 10, [R10W,R10WH]>; 2510b57cec5SDimitry Andricdef R11D : X86Reg<"r11d", 11, [R11W,R11WH]>; 2520b57cec5SDimitry Andricdef R12D : X86Reg<"r12d", 12, [R12W,R12WH]>; 2530b57cec5SDimitry Andricdef R13D : X86Reg<"r13d", 13, [R13W,R13WH]>; 2540b57cec5SDimitry Andricdef R14D : X86Reg<"r14d", 14, [R14W,R14WH]>; 2550b57cec5SDimitry Andricdef R15D : X86Reg<"r15d", 15, [R15W,R15WH]>; 2560b57cec5SDimitry Andric} 2570b57cec5SDimitry Andric 258*5f757f3fSDimitry Andric// APX only, requires REX2 or EVEX. 259*5f757f3fSDimitry Andriclet SubRegIndices = [sub_16bit, sub_16bit_hi], CoveredBySubRegs = 1 in { 260*5f757f3fSDimitry Andriclet PositionOrder = 4 in { 261*5f757f3fSDimitry Andricdef R16D : X86Reg<"r16d", 16, [R16W,R16WH]>; 262*5f757f3fSDimitry Andricdef R17D : X86Reg<"r17d", 17, [R17W,R17WH]>; 263*5f757f3fSDimitry Andricdef R18D : X86Reg<"r18d", 18, [R18W,R18WH]>; 264*5f757f3fSDimitry Andricdef R19D : X86Reg<"r19d", 19, [R19W,R19WH]>; 265*5f757f3fSDimitry Andricdef R20D : X86Reg<"r20d", 20, [R20W,R20WH]>; 266*5f757f3fSDimitry Andricdef R21D : X86Reg<"r21d", 21, [R21W,R21WH]>; 267*5f757f3fSDimitry Andricdef R22D : X86Reg<"r22d", 22, [R22W,R22WH]>; 268*5f757f3fSDimitry Andricdef R23D : X86Reg<"r23d", 23, [R23W,R23WH]>; 269*5f757f3fSDimitry Andricdef R24D : X86Reg<"r24d", 24, [R24W,R24WH]>; 270*5f757f3fSDimitry Andricdef R25D : X86Reg<"r25d", 25, [R25W,R25WH]>; 271*5f757f3fSDimitry Andricdef R26D : X86Reg<"r26d", 26, [R26W,R26WH]>; 272*5f757f3fSDimitry Andricdef R27D : X86Reg<"r27d", 27, [R27W,R27WH]>; 273*5f757f3fSDimitry Andricdef R28D : X86Reg<"r28d", 28, [R28W,R28WH]>; 274*5f757f3fSDimitry Andricdef R29D : X86Reg<"r29d", 29, [R29W,R29WH]>; 275*5f757f3fSDimitry Andricdef R30D : X86Reg<"r30d", 30, [R30W,R30WH]>; 276*5f757f3fSDimitry Andricdef R31D : X86Reg<"r31d", 31, [R31W,R31WH]>; 277*5f757f3fSDimitry Andric} 278*5f757f3fSDimitry Andric} 2790b57cec5SDimitry Andric// 64-bit registers, X86-64 only 2800b57cec5SDimitry Andriclet SubRegIndices = [sub_32bit] in { 2810b57cec5SDimitry Andricdef RAX : X86Reg<"rax", 0, [EAX]>, DwarfRegNum<[0, -2, -2]>; 2820b57cec5SDimitry Andricdef RDX : X86Reg<"rdx", 2, [EDX]>, DwarfRegNum<[1, -2, -2]>; 2830b57cec5SDimitry Andricdef RCX : X86Reg<"rcx", 1, [ECX]>, DwarfRegNum<[2, -2, -2]>; 2840b57cec5SDimitry Andricdef RBX : X86Reg<"rbx", 3, [EBX]>, DwarfRegNum<[3, -2, -2]>; 2850b57cec5SDimitry Andricdef RSI : X86Reg<"rsi", 6, [ESI]>, DwarfRegNum<[4, -2, -2]>; 2860b57cec5SDimitry Andricdef RDI : X86Reg<"rdi", 7, [EDI]>, DwarfRegNum<[5, -2, -2]>; 2870b57cec5SDimitry Andricdef RBP : X86Reg<"rbp", 5, [EBP]>, DwarfRegNum<[6, -2, -2]>; 2880b57cec5SDimitry Andricdef RSP : X86Reg<"rsp", 4, [ESP]>, DwarfRegNum<[7, -2, -2]>; 2890b57cec5SDimitry Andric 2900b57cec5SDimitry Andric// These also require REX. 2910b57cec5SDimitry Andricdef R8 : X86Reg<"r8", 8, [R8D]>, DwarfRegNum<[ 8, -2, -2]>; 2920b57cec5SDimitry Andricdef R9 : X86Reg<"r9", 9, [R9D]>, DwarfRegNum<[ 9, -2, -2]>; 2930b57cec5SDimitry Andricdef R10 : X86Reg<"r10", 10, [R10D]>, DwarfRegNum<[10, -2, -2]>; 2940b57cec5SDimitry Andricdef R11 : X86Reg<"r11", 11, [R11D]>, DwarfRegNum<[11, -2, -2]>; 2950b57cec5SDimitry Andricdef R12 : X86Reg<"r12", 12, [R12D]>, DwarfRegNum<[12, -2, -2]>; 2960b57cec5SDimitry Andricdef R13 : X86Reg<"r13", 13, [R13D]>, DwarfRegNum<[13, -2, -2]>; 2970b57cec5SDimitry Andricdef R14 : X86Reg<"r14", 14, [R14D]>, DwarfRegNum<[14, -2, -2]>; 2980b57cec5SDimitry Andricdef R15 : X86Reg<"r15", 15, [R15D]>, DwarfRegNum<[15, -2, -2]>; 2990b57cec5SDimitry Andricdef RIP : X86Reg<"rip", 0, [EIP]>, DwarfRegNum<[16, -2, -2]>; 300*5f757f3fSDimitry Andric// APX only, requires REX2 or EVEX. 301*5f757f3fSDimitry Andriclet PositionOrder = 4 in { 302*5f757f3fSDimitry Andricdef R16 : X86Reg<"r16", 16, [R16D]>, DwarfRegNum<[130, -2, -2]>; 303*5f757f3fSDimitry Andricdef R17 : X86Reg<"r17", 17, [R17D]>, DwarfRegNum<[131, -2, -2]>; 304*5f757f3fSDimitry Andricdef R18 : X86Reg<"r18", 18, [R18D]>, DwarfRegNum<[132, -2, -2]>; 305*5f757f3fSDimitry Andricdef R19 : X86Reg<"r19", 19, [R19D]>, DwarfRegNum<[133, -2, -2]>; 306*5f757f3fSDimitry Andricdef R20 : X86Reg<"r20", 20, [R20D]>, DwarfRegNum<[134, -2, -2]>; 307*5f757f3fSDimitry Andricdef R21 : X86Reg<"r21", 21, [R21D]>, DwarfRegNum<[135, -2, -2]>; 308*5f757f3fSDimitry Andricdef R22 : X86Reg<"r22", 22, [R22D]>, DwarfRegNum<[136, -2, -2]>; 309*5f757f3fSDimitry Andricdef R23 : X86Reg<"r23", 23, [R23D]>, DwarfRegNum<[137, -2, -2]>; 310*5f757f3fSDimitry Andricdef R24 : X86Reg<"r24", 24, [R24D]>, DwarfRegNum<[138, -2, -2]>; 311*5f757f3fSDimitry Andricdef R25 : X86Reg<"r25", 25, [R25D]>, DwarfRegNum<[139, -2, -2]>; 312*5f757f3fSDimitry Andricdef R26 : X86Reg<"r26", 26, [R26D]>, DwarfRegNum<[140, -2, -2]>; 313*5f757f3fSDimitry Andricdef R27 : X86Reg<"r27", 27, [R27D]>, DwarfRegNum<[141, -2, -2]>; 314*5f757f3fSDimitry Andricdef R28 : X86Reg<"r28", 28, [R28D]>, DwarfRegNum<[142, -2, -2]>; 315*5f757f3fSDimitry Andricdef R29 : X86Reg<"r29", 29, [R29D]>, DwarfRegNum<[143, -2, -2]>; 316*5f757f3fSDimitry Andricdef R30 : X86Reg<"r30", 30, [R30D]>, DwarfRegNum<[144, -2, -2]>; 317*5f757f3fSDimitry Andricdef R31 : X86Reg<"r31", 31, [R31D]>, DwarfRegNum<[145, -2, -2]>; 318*5f757f3fSDimitry Andric} 319bdd1243dSDimitry Andric} 3200b57cec5SDimitry Andric 3210b57cec5SDimitry Andric// MMX Registers. These are actually aliased to ST0 .. ST7 3220b57cec5SDimitry Andricdef MM0 : X86Reg<"mm0", 0>, DwarfRegNum<[41, 29, 29]>; 3230b57cec5SDimitry Andricdef MM1 : X86Reg<"mm1", 1>, DwarfRegNum<[42, 30, 30]>; 3240b57cec5SDimitry Andricdef MM2 : X86Reg<"mm2", 2>, DwarfRegNum<[43, 31, 31]>; 3250b57cec5SDimitry Andricdef MM3 : X86Reg<"mm3", 3>, DwarfRegNum<[44, 32, 32]>; 3260b57cec5SDimitry Andricdef MM4 : X86Reg<"mm4", 4>, DwarfRegNum<[45, 33, 33]>; 3270b57cec5SDimitry Andricdef MM5 : X86Reg<"mm5", 5>, DwarfRegNum<[46, 34, 34]>; 3280b57cec5SDimitry Andricdef MM6 : X86Reg<"mm6", 6>, DwarfRegNum<[47, 35, 35]>; 3290b57cec5SDimitry Andricdef MM7 : X86Reg<"mm7", 7>, DwarfRegNum<[48, 36, 36]>; 3300b57cec5SDimitry Andric 3310b57cec5SDimitry Andric// Pseudo Floating Point registers 3320b57cec5SDimitry Andricdef FP0 : X86Reg<"fp0", 0>; 3330b57cec5SDimitry Andricdef FP1 : X86Reg<"fp1", 0>; 3340b57cec5SDimitry Andricdef FP2 : X86Reg<"fp2", 0>; 3350b57cec5SDimitry Andricdef FP3 : X86Reg<"fp3", 0>; 3360b57cec5SDimitry Andricdef FP4 : X86Reg<"fp4", 0>; 3370b57cec5SDimitry Andricdef FP5 : X86Reg<"fp5", 0>; 3380b57cec5SDimitry Andricdef FP6 : X86Reg<"fp6", 0>; 3390b57cec5SDimitry Andricdef FP7 : X86Reg<"fp7", 0>; 3400b57cec5SDimitry Andric 3410b57cec5SDimitry Andric// XMM Registers, used by the various SSE instruction set extensions. 3420b57cec5SDimitry Andricdef XMM0: X86Reg<"xmm0", 0>, DwarfRegNum<[17, 21, 21]>; 3430b57cec5SDimitry Andricdef XMM1: X86Reg<"xmm1", 1>, DwarfRegNum<[18, 22, 22]>; 3440b57cec5SDimitry Andricdef XMM2: X86Reg<"xmm2", 2>, DwarfRegNum<[19, 23, 23]>; 3450b57cec5SDimitry Andricdef XMM3: X86Reg<"xmm3", 3>, DwarfRegNum<[20, 24, 24]>; 3460b57cec5SDimitry Andricdef XMM4: X86Reg<"xmm4", 4>, DwarfRegNum<[21, 25, 25]>; 3470b57cec5SDimitry Andricdef XMM5: X86Reg<"xmm5", 5>, DwarfRegNum<[22, 26, 26]>; 3480b57cec5SDimitry Andricdef XMM6: X86Reg<"xmm6", 6>, DwarfRegNum<[23, 27, 27]>; 3490b57cec5SDimitry Andricdef XMM7: X86Reg<"xmm7", 7>, DwarfRegNum<[24, 28, 28]>; 3500b57cec5SDimitry Andric 3510b57cec5SDimitry Andric// X86-64 only 3520b57cec5SDimitry Andricdef XMM8: X86Reg<"xmm8", 8>, DwarfRegNum<[25, -2, -2]>; 3530b57cec5SDimitry Andricdef XMM9: X86Reg<"xmm9", 9>, DwarfRegNum<[26, -2, -2]>; 3540b57cec5SDimitry Andricdef XMM10: X86Reg<"xmm10", 10>, DwarfRegNum<[27, -2, -2]>; 3550b57cec5SDimitry Andricdef XMM11: X86Reg<"xmm11", 11>, DwarfRegNum<[28, -2, -2]>; 3560b57cec5SDimitry Andricdef XMM12: X86Reg<"xmm12", 12>, DwarfRegNum<[29, -2, -2]>; 3570b57cec5SDimitry Andricdef XMM13: X86Reg<"xmm13", 13>, DwarfRegNum<[30, -2, -2]>; 3580b57cec5SDimitry Andricdef XMM14: X86Reg<"xmm14", 14>, DwarfRegNum<[31, -2, -2]>; 3590b57cec5SDimitry Andricdef XMM15: X86Reg<"xmm15", 15>, DwarfRegNum<[32, -2, -2]>; 3600b57cec5SDimitry Andric 361*5f757f3fSDimitry Andriclet PositionOrder = 2 in { 362*5f757f3fSDimitry Andric// XMM16-31 registers, used by AVX-512 instructions. 3630b57cec5SDimitry Andricdef XMM16: X86Reg<"xmm16", 16>, DwarfRegNum<[67, -2, -2]>; 3640b57cec5SDimitry Andricdef XMM17: X86Reg<"xmm17", 17>, DwarfRegNum<[68, -2, -2]>; 3650b57cec5SDimitry Andricdef XMM18: X86Reg<"xmm18", 18>, DwarfRegNum<[69, -2, -2]>; 3660b57cec5SDimitry Andricdef XMM19: X86Reg<"xmm19", 19>, DwarfRegNum<[70, -2, -2]>; 3670b57cec5SDimitry Andricdef XMM20: X86Reg<"xmm20", 20>, DwarfRegNum<[71, -2, -2]>; 3680b57cec5SDimitry Andricdef XMM21: X86Reg<"xmm21", 21>, DwarfRegNum<[72, -2, -2]>; 3690b57cec5SDimitry Andricdef XMM22: X86Reg<"xmm22", 22>, DwarfRegNum<[73, -2, -2]>; 3700b57cec5SDimitry Andricdef XMM23: X86Reg<"xmm23", 23>, DwarfRegNum<[74, -2, -2]>; 3710b57cec5SDimitry Andricdef XMM24: X86Reg<"xmm24", 24>, DwarfRegNum<[75, -2, -2]>; 3720b57cec5SDimitry Andricdef XMM25: X86Reg<"xmm25", 25>, DwarfRegNum<[76, -2, -2]>; 3730b57cec5SDimitry Andricdef XMM26: X86Reg<"xmm26", 26>, DwarfRegNum<[77, -2, -2]>; 3740b57cec5SDimitry Andricdef XMM27: X86Reg<"xmm27", 27>, DwarfRegNum<[78, -2, -2]>; 3750b57cec5SDimitry Andricdef XMM28: X86Reg<"xmm28", 28>, DwarfRegNum<[79, -2, -2]>; 3760b57cec5SDimitry Andricdef XMM29: X86Reg<"xmm29", 29>, DwarfRegNum<[80, -2, -2]>; 3770b57cec5SDimitry Andricdef XMM30: X86Reg<"xmm30", 30>, DwarfRegNum<[81, -2, -2]>; 3780b57cec5SDimitry Andricdef XMM31: X86Reg<"xmm31", 31>, DwarfRegNum<[82, -2, -2]>; 379*5f757f3fSDimitry Andric} 3800b57cec5SDimitry Andric 3810b57cec5SDimitry Andric// YMM0-15 registers, used by AVX instructions and 3820b57cec5SDimitry Andric// YMM16-31 registers, used by AVX-512 instructions. 383*5f757f3fSDimitry Andriclet SubRegIndices = [sub_xmm], PositionOrder = 1 in { 384*5f757f3fSDimitry Andric foreach Index = 0-15 in { 385*5f757f3fSDimitry Andric def YMM#Index : X86Reg<"ymm"#Index, Index, [!cast<X86Reg>("XMM"#Index)]>, 386*5f757f3fSDimitry Andric DwarfRegAlias<!cast<X86Reg>("XMM"#Index)>; 387*5f757f3fSDimitry Andric } 388*5f757f3fSDimitry Andric} 389*5f757f3fSDimitry Andriclet SubRegIndices = [sub_xmm], PositionOrder = 2 in { 390*5f757f3fSDimitry Andric foreach Index = 16-31 in { 3910b57cec5SDimitry Andric def YMM#Index : X86Reg<"ymm"#Index, Index, [!cast<X86Reg>("XMM"#Index)]>, 3920b57cec5SDimitry Andric DwarfRegAlias<!cast<X86Reg>("XMM"#Index)>; 3930b57cec5SDimitry Andric } 3940b57cec5SDimitry Andric} 3950b57cec5SDimitry Andric 396*5f757f3fSDimitry Andric 3970b57cec5SDimitry Andric// ZMM Registers, used by AVX-512 instructions. 398*5f757f3fSDimitry Andriclet SubRegIndices = [sub_ymm], PositionOrder = 2 in { 3990b57cec5SDimitry Andric foreach Index = 0-31 in { 4000b57cec5SDimitry Andric def ZMM#Index : X86Reg<"zmm"#Index, Index, [!cast<X86Reg>("YMM"#Index)]>, 4010b57cec5SDimitry Andric DwarfRegAlias<!cast<X86Reg>("XMM"#Index)>; 4020b57cec5SDimitry Andric } 4030b57cec5SDimitry Andric} 4040b57cec5SDimitry Andric 405*5f757f3fSDimitry Andriclet PositionOrder = 2 in { 4060b57cec5SDimitry Andric// Mask Registers, used by AVX-512 instructions. 4070b57cec5SDimitry Andricdef K0 : X86Reg<"k0", 0>, DwarfRegNum<[118, 93, 93]>; 4080b57cec5SDimitry Andricdef K1 : X86Reg<"k1", 1>, DwarfRegNum<[119, 94, 94]>; 4090b57cec5SDimitry Andricdef K2 : X86Reg<"k2", 2>, DwarfRegNum<[120, 95, 95]>; 4100b57cec5SDimitry Andricdef K3 : X86Reg<"k3", 3>, DwarfRegNum<[121, 96, 96]>; 4110b57cec5SDimitry Andricdef K4 : X86Reg<"k4", 4>, DwarfRegNum<[122, 97, 97]>; 4120b57cec5SDimitry Andricdef K5 : X86Reg<"k5", 5>, DwarfRegNum<[123, 98, 98]>; 4130b57cec5SDimitry Andricdef K6 : X86Reg<"k6", 6>, DwarfRegNum<[124, 99, 99]>; 4140b57cec5SDimitry Andricdef K7 : X86Reg<"k7", 7>, DwarfRegNum<[125, 100, 100]>; 415*5f757f3fSDimitry Andric// Mask register pairs 416*5f757f3fSDimitry Andricdef KPAIRS : RegisterTuples<[sub_mask_0, sub_mask_1], 417*5f757f3fSDimitry Andric [(add K0, K2, K4, K6), (add K1, K3, K5, K7)]>; 418*5f757f3fSDimitry Andric} 419*5f757f3fSDimitry Andric 420*5f757f3fSDimitry Andric// TMM registers, used by AMX instructions. 421*5f757f3fSDimitry Andriclet PositionOrder = 3 in { 422*5f757f3fSDimitry Andric// Tile config registers. 423*5f757f3fSDimitry Andricdef TMMCFG: X86Reg<"tmmcfg", 0>; 424*5f757f3fSDimitry Andric// Tile "registers". 425*5f757f3fSDimitry Andricdef TMM0: X86Reg<"tmm0", 0>; 426*5f757f3fSDimitry Andricdef TMM1: X86Reg<"tmm1", 1>; 427*5f757f3fSDimitry Andricdef TMM2: X86Reg<"tmm2", 2>; 428*5f757f3fSDimitry Andricdef TMM3: X86Reg<"tmm3", 3>; 429*5f757f3fSDimitry Andricdef TMM4: X86Reg<"tmm4", 4>; 430*5f757f3fSDimitry Andricdef TMM5: X86Reg<"tmm5", 5>; 431*5f757f3fSDimitry Andricdef TMM6: X86Reg<"tmm6", 6>; 432*5f757f3fSDimitry Andricdef TMM7: X86Reg<"tmm7", 7>; 433*5f757f3fSDimitry Andric} 4340b57cec5SDimitry Andric 4350b57cec5SDimitry Andric// Floating point stack registers. These don't map one-to-one to the FP 4360b57cec5SDimitry Andric// pseudo registers, but we still mark them as aliasing FP registers. That 4370b57cec5SDimitry Andric// way both kinds can be live without exceeding the stack depth. ST registers 4380b57cec5SDimitry Andric// are only live around inline assembly. 4390b57cec5SDimitry Andricdef ST0 : X86Reg<"st", 0>, DwarfRegNum<[33, 12, 11]>; 4400b57cec5SDimitry Andricdef ST1 : X86Reg<"st(1)", 1>, DwarfRegNum<[34, 13, 12]>; 4410b57cec5SDimitry Andricdef ST2 : X86Reg<"st(2)", 2>, DwarfRegNum<[35, 14, 13]>; 4420b57cec5SDimitry Andricdef ST3 : X86Reg<"st(3)", 3>, DwarfRegNum<[36, 15, 14]>; 4430b57cec5SDimitry Andricdef ST4 : X86Reg<"st(4)", 4>, DwarfRegNum<[37, 16, 15]>; 4440b57cec5SDimitry Andricdef ST5 : X86Reg<"st(5)", 5>, DwarfRegNum<[38, 17, 16]>; 4450b57cec5SDimitry Andricdef ST6 : X86Reg<"st(6)", 6>, DwarfRegNum<[39, 18, 17]>; 4460b57cec5SDimitry Andricdef ST7 : X86Reg<"st(7)", 7>, DwarfRegNum<[40, 19, 18]>; 4470b57cec5SDimitry Andric 4480b57cec5SDimitry Andric// Floating-point status word 4490b57cec5SDimitry Andricdef FPSW : X86Reg<"fpsr", 0>; 4500b57cec5SDimitry Andric 4510b57cec5SDimitry Andric// Floating-point control word 4520b57cec5SDimitry Andricdef FPCW : X86Reg<"fpcr", 0>; 4530b57cec5SDimitry Andric 454480093f4SDimitry Andric// SIMD Floating-point control register. 455480093f4SDimitry Andric// Note: We only model the "Uses" of the control bits: current rounding modes, 456480093f4SDimitry Andric// DAZ, FTZ and exception masks. We don't model the "Defs" of flag bits. 457480093f4SDimitry Andricdef MXCSR : X86Reg<"mxcsr", 0>; 458480093f4SDimitry Andric 4590b57cec5SDimitry Andric// Status flags register. 4600b57cec5SDimitry Andric// 4610b57cec5SDimitry Andric// Note that some flags that are commonly thought of as part of the status 4620b57cec5SDimitry Andric// flags register are modeled separately. Typically this is due to instructions 4630b57cec5SDimitry Andric// reading and updating those flags independently of all the others. We don't 4640b57cec5SDimitry Andric// want to create false dependencies between these instructions and so we use 4650b57cec5SDimitry Andric// a separate register to model them. 466bdd1243dSDimitry Andricdef EFLAGS : X86Reg<"flags", 0>, DwarfRegNum<[49, 9, 9]>; 467bdd1243dSDimitry Andricdef _EFLAGS : X86Reg<"eflags", 0>, DwarfRegAlias<EFLAGS>; 468bdd1243dSDimitry Andricdef RFLAGS : X86Reg<"rflags", 0>, DwarfRegNum<[49, -2, -2]>; 4690b57cec5SDimitry Andric 4700b57cec5SDimitry Andric// The direction flag. 4710b57cec5SDimitry Andricdef DF : X86Reg<"dirflag", 0>; 4720b57cec5SDimitry Andric 4730b57cec5SDimitry Andric 4740b57cec5SDimitry Andric// Segment registers 47506c3fb27SDimitry Andricdef CS : X86Reg<"cs", 1>, DwarfRegNum<[51, -2, 41]>; 47606c3fb27SDimitry Andricdef DS : X86Reg<"ds", 3>, DwarfRegNum<[53, -2, 43]>; 47706c3fb27SDimitry Andricdef SS : X86Reg<"ss", 2>, DwarfRegNum<[52, -2, 42]>; 47806c3fb27SDimitry Andricdef ES : X86Reg<"es", 0>, DwarfRegNum<[50, -2, 40]>; 47906c3fb27SDimitry Andricdef FS : X86Reg<"fs", 4>, DwarfRegNum<[54, -2, 44]>; 48006c3fb27SDimitry Andricdef GS : X86Reg<"gs", 5>, DwarfRegNum<[55, -2, 45]>; 4810b57cec5SDimitry Andric 482bdd1243dSDimitry Andricdef FS_BASE : X86Reg<"fs.base", 0>, DwarfRegNum<[58, -2, -2]>; 483bdd1243dSDimitry Andricdef GS_BASE : X86Reg<"gs.base", 0>, DwarfRegNum<[59, -2, -2]>; 484bdd1243dSDimitry Andric 4850b57cec5SDimitry Andric// Debug registers 4860b57cec5SDimitry Andricdef DR0 : X86Reg<"dr0", 0>; 4870b57cec5SDimitry Andricdef DR1 : X86Reg<"dr1", 1>; 4880b57cec5SDimitry Andricdef DR2 : X86Reg<"dr2", 2>; 4890b57cec5SDimitry Andricdef DR3 : X86Reg<"dr3", 3>; 4900b57cec5SDimitry Andricdef DR4 : X86Reg<"dr4", 4>; 4910b57cec5SDimitry Andricdef DR5 : X86Reg<"dr5", 5>; 4920b57cec5SDimitry Andricdef DR6 : X86Reg<"dr6", 6>; 4930b57cec5SDimitry Andricdef DR7 : X86Reg<"dr7", 7>; 4940b57cec5SDimitry Andricdef DR8 : X86Reg<"dr8", 8>; 4950b57cec5SDimitry Andricdef DR9 : X86Reg<"dr9", 9>; 4960b57cec5SDimitry Andricdef DR10 : X86Reg<"dr10", 10>; 4970b57cec5SDimitry Andricdef DR11 : X86Reg<"dr11", 11>; 4980b57cec5SDimitry Andricdef DR12 : X86Reg<"dr12", 12>; 4990b57cec5SDimitry Andricdef DR13 : X86Reg<"dr13", 13>; 5000b57cec5SDimitry Andricdef DR14 : X86Reg<"dr14", 14>; 5010b57cec5SDimitry Andricdef DR15 : X86Reg<"dr15", 15>; 5020b57cec5SDimitry Andric 5030b57cec5SDimitry Andric// Control registers 5040b57cec5SDimitry Andricdef CR0 : X86Reg<"cr0", 0>; 5050b57cec5SDimitry Andricdef CR1 : X86Reg<"cr1", 1>; 5060b57cec5SDimitry Andricdef CR2 : X86Reg<"cr2", 2>; 5070b57cec5SDimitry Andricdef CR3 : X86Reg<"cr3", 3>; 5080b57cec5SDimitry Andricdef CR4 : X86Reg<"cr4", 4>; 5090b57cec5SDimitry Andricdef CR5 : X86Reg<"cr5", 5>; 5100b57cec5SDimitry Andricdef CR6 : X86Reg<"cr6", 6>; 5110b57cec5SDimitry Andricdef CR7 : X86Reg<"cr7", 7>; 5120b57cec5SDimitry Andricdef CR8 : X86Reg<"cr8", 8>; 5130b57cec5SDimitry Andricdef CR9 : X86Reg<"cr9", 9>; 5140b57cec5SDimitry Andricdef CR10 : X86Reg<"cr10", 10>; 5150b57cec5SDimitry Andricdef CR11 : X86Reg<"cr11", 11>; 5160b57cec5SDimitry Andricdef CR12 : X86Reg<"cr12", 12>; 5170b57cec5SDimitry Andricdef CR13 : X86Reg<"cr13", 13>; 5180b57cec5SDimitry Andricdef CR14 : X86Reg<"cr14", 14>; 5190b57cec5SDimitry Andricdef CR15 : X86Reg<"cr15", 15>; 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andric// Pseudo index registers 5220b57cec5SDimitry Andricdef EIZ : X86Reg<"eiz", 4>; 5230b57cec5SDimitry Andricdef RIZ : X86Reg<"riz", 4>; 5240b57cec5SDimitry Andric 5250b57cec5SDimitry Andric// CET registers - Shadow Stack Pointer 5260b57cec5SDimitry Andricdef SSP : X86Reg<"ssp", 0>; 5270b57cec5SDimitry Andric 5280b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5290b57cec5SDimitry Andric// Register Class Definitions... now that we have all of the pieces, define the 5300b57cec5SDimitry Andric// top-level register classes. The order specified in the register list is 5310b57cec5SDimitry Andric// implicitly defined to be the register allocation order. 5320b57cec5SDimitry Andric// 5330b57cec5SDimitry Andric 5340b57cec5SDimitry Andric// List call-clobbered registers before callee-save registers. RBX, RBP, (and 5350b57cec5SDimitry Andric// R12, R13, R14, and R15 for X86-64) are callee-save registers. 5360b57cec5SDimitry Andric// In 64-mode, there are 12 additional i8 registers, SIL, DIL, BPL, SPL, and 5370b57cec5SDimitry Andric// R8B, ... R15B. 5380b57cec5SDimitry Andric// Allocate R12 and R13 last, as these require an extra byte when 5390b57cec5SDimitry Andric// encoded in x86_64 instructions. 5400b57cec5SDimitry Andric// FIXME: Allow AH, CH, DH, BH to be used as general-purpose registers in 5410b57cec5SDimitry Andric// 64-bit mode. The main complication is that they cannot be encoded in an 5420b57cec5SDimitry Andric// instruction requiring a REX prefix, while SIL, DIL, BPL, R8D, etc. 5430b57cec5SDimitry Andric// require a REX prefix. For example, "addb %ah, %dil" and "movzbl %ah, %r8d" 5440b57cec5SDimitry Andric// cannot be encoded. 5450b57cec5SDimitry Andricdef GR8 : RegisterClass<"X86", [i8], 8, 5460b57cec5SDimitry Andric (add AL, CL, DL, AH, CH, DH, BL, BH, SIL, DIL, BPL, SPL, 547*5f757f3fSDimitry Andric R8B, R9B, R10B, R11B, R16B, R17B, R18B, R19B, R20B, 548*5f757f3fSDimitry Andric R21B, R22B, R23B, R24B, R25B, R26B, R27B, R28B, R29B, 549*5f757f3fSDimitry Andric R30B, R31B, R14B, R15B, R12B, R13B)> { 5500b57cec5SDimitry Andric let AltOrders = [(sub GR8, AH, BH, CH, DH)]; 5510b57cec5SDimitry Andric let AltOrderSelect = [{ 5520b57cec5SDimitry Andric return MF.getSubtarget<X86Subtarget>().is64Bit(); 5530b57cec5SDimitry Andric }]; 5540b57cec5SDimitry Andric} 5550b57cec5SDimitry Andric 5560b57cec5SDimitry Andriclet isAllocatable = 0 in 5570b57cec5SDimitry Andricdef GRH8 : RegisterClass<"X86", [i8], 8, 5580b57cec5SDimitry Andric (add SIH, DIH, BPH, SPH, R8BH, R9BH, R10BH, R11BH, 559*5f757f3fSDimitry Andric R12BH, R13BH, R14BH, R15BH, R16BH, R17BH, R18BH, 560*5f757f3fSDimitry Andric R19BH, R20BH, R21BH, R22BH, R23BH, R24BH, R25BH, 561*5f757f3fSDimitry Andric R26BH, R27BH, R28BH, R29BH, R30BH, R31BH)>; 5620b57cec5SDimitry Andricdef GR16 : RegisterClass<"X86", [i16], 16, 563*5f757f3fSDimitry Andric (add AX, CX, DX, SI, DI, BX, BP, SP, R8W, R9W, R10W, 564*5f757f3fSDimitry Andric R11W, R16W, R17W, R18W, R19W, R20W, R21W, R22W, R23W, 565*5f757f3fSDimitry Andric R24W, R25W, R26W, R27W, R28W, R29W, R30W, R31W, R14W, 566*5f757f3fSDimitry Andric R15W, R12W, R13W)>; 5670b57cec5SDimitry Andric 5680b57cec5SDimitry Andriclet isAllocatable = 0 in 5690b57cec5SDimitry Andricdef GRH16 : RegisterClass<"X86", [i16], 16, 570*5f757f3fSDimitry Andric (add HAX, HCX, HDX, HSI, HDI, HBX, HBP, HSP, HIP, R8WH, 571*5f757f3fSDimitry Andric R9WH, R10WH, R11WH, R12WH, R13WH, R14WH, R15WH, R16WH, 572*5f757f3fSDimitry Andric R17WH, R18WH, R19WH, R20WH, R21WH, R22WH, R23WH, R24WH, 573*5f757f3fSDimitry Andric R25WH, R26WH, R27WH, R28WH, R29WH, R30WH, R31WH)>; 5740b57cec5SDimitry Andricdef GR32 : RegisterClass<"X86", [i32], 32, 575*5f757f3fSDimitry Andric (add EAX, ECX, EDX, ESI, EDI, EBX, EBP, ESP, R8D, R9D, 576*5f757f3fSDimitry Andric R10D, R11D, R16D, R17D, R18D, R19D, R20D, R21D, R22D, 577*5f757f3fSDimitry Andric R23D, R24D, R25D, R26D, R27D, R28D, R29D, R30D, R31D, 578*5f757f3fSDimitry Andric R14D, R15D, R12D, R13D)>; 5790b57cec5SDimitry Andric 5800b57cec5SDimitry Andric// GR64 - 64-bit GPRs. This oddly includes RIP, which isn't accurate, since 5810b57cec5SDimitry Andric// RIP isn't really a register and it can't be used anywhere except in an 5820b57cec5SDimitry Andric// address, but it doesn't cause trouble. 5830b57cec5SDimitry Andric// FIXME: it *does* cause trouble - CheckBaseRegAndIndexReg() has extra 5840b57cec5SDimitry Andric// tests because of the inclusion of RIP in this register class. 5850b57cec5SDimitry Andricdef GR64 : RegisterClass<"X86", [i64], 64, 586*5f757f3fSDimitry Andric (add RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11, R16, R17, 587*5f757f3fSDimitry Andric R18, R19, R20, R21, R22, R23, R24, R25, R26, R27, R28, R29, 588*5f757f3fSDimitry Andric R30, R31, RBX, R14, R15, R12, R13, RBP, RSP, RIP)>; 5890b57cec5SDimitry Andric 5900eae32dcSDimitry Andric// GR64PLTSafe - 64-bit GPRs without R10, R11, RSP and RIP. Could be used when 5910eae32dcSDimitry Andric// emitting code for intrinsics, which use implict input registers. 5920eae32dcSDimitry Andricdef GR64PLTSafe : RegisterClass<"X86", [i64], 64, 5930eae32dcSDimitry Andric (add RAX, RCX, RDX, RSI, RDI, R8, R9, 5940eae32dcSDimitry Andric RBX, R14, R15, R12, R13, RBP)>; 595349cc55cSDimitry Andric 59606c3fb27SDimitry Andric// It includes the GPR that are used as scratch register for Linux64 calling 59706c3fb27SDimitry Andric// convention. 59806c3fb27SDimitry Andricdef GR64_ArgRef: RegisterClass<"X86", [i64], 64, (add R10, R11)> { 59906c3fb27SDimitry Andric let GeneratePressureSet = 0; 60006c3fb27SDimitry Andric} 60106c3fb27SDimitry Andric 60206c3fb27SDimitry Andric// It includes the GPR that are used as scratch register for Linux32 calling 60306c3fb27SDimitry Andric// convention. 60406c3fb27SDimitry Andricdef GR32_ArgRef: RegisterClass<"X86", [i32], 32, (add ECX, EDX)> { 60506c3fb27SDimitry Andric let GeneratePressureSet = 0; 60606c3fb27SDimitry Andric} 60706c3fb27SDimitry Andric 6080b57cec5SDimitry Andric// Segment registers for use by MOV instructions (and others) that have a 6090b57cec5SDimitry Andric// segment register as one operand. Always contain a 16-bit segment 6100b57cec5SDimitry Andric// descriptor. 6110b57cec5SDimitry Andricdef SEGMENT_REG : RegisterClass<"X86", [i16], 16, (add CS, DS, SS, ES, FS, GS)>; 6120b57cec5SDimitry Andric 6130b57cec5SDimitry Andric// Debug registers. 6140b57cec5SDimitry Andricdef DEBUG_REG : RegisterClass<"X86", [i32], 32, (sequence "DR%u", 0, 15)>; 6150b57cec5SDimitry Andric 6160b57cec5SDimitry Andric// Control registers. 6170b57cec5SDimitry Andricdef CONTROL_REG : RegisterClass<"X86", [i64], 64, (sequence "CR%u", 0, 15)>; 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric// GR8_ABCD_L, GR8_ABCD_H, GR16_ABCD, GR32_ABCD, GR64_ABCD - Subclasses of 6200b57cec5SDimitry Andric// GR8, GR16, GR32, and GR64 which contain just the "a" "b", "c", and "d" 6210b57cec5SDimitry Andric// registers. On x86-32, GR16_ABCD and GR32_ABCD are classes for registers 6220b57cec5SDimitry Andric// that support 8-bit subreg operations. On x86-64, GR16_ABCD, GR32_ABCD, 6230b57cec5SDimitry Andric// and GR64_ABCD are classes for registers that support 8-bit h-register 6240b57cec5SDimitry Andric// operations. 6250b57cec5SDimitry Andricdef GR8_ABCD_L : RegisterClass<"X86", [i8], 8, (add AL, CL, DL, BL)>; 6260b57cec5SDimitry Andricdef GR8_ABCD_H : RegisterClass<"X86", [i8], 8, (add AH, CH, DH, BH)>; 6270b57cec5SDimitry Andricdef GR16_ABCD : RegisterClass<"X86", [i16], 16, (add AX, CX, DX, BX)>; 6280b57cec5SDimitry Andricdef GR32_ABCD : RegisterClass<"X86", [i32], 32, (add EAX, ECX, EDX, EBX)>; 6290b57cec5SDimitry Andricdef GR64_ABCD : RegisterClass<"X86", [i64], 64, (add RAX, RCX, RDX, RBX)>; 6300b57cec5SDimitry Andricdef GR32_TC : RegisterClass<"X86", [i32], 32, (add EAX, ECX, EDX, ESP)>; 6310b57cec5SDimitry Andricdef GR64_TC : RegisterClass<"X86", [i64], 64, (add RAX, RCX, RDX, RSI, RDI, 6320b57cec5SDimitry Andric R8, R9, R11, RIP, RSP)>; 6330b57cec5SDimitry Andricdef GR64_TCW64 : RegisterClass<"X86", [i64], 64, (add RAX, RCX, RDX, 6340b57cec5SDimitry Andric R8, R9, R10, R11, 6350b57cec5SDimitry Andric RIP, RSP)>; 6360b57cec5SDimitry Andric 6370b57cec5SDimitry Andric// GR8_NOREX - GR8 registers which do not require a REX prefix. 6380b57cec5SDimitry Andricdef GR8_NOREX : RegisterClass<"X86", [i8], 8, 6390b57cec5SDimitry Andric (add AL, CL, DL, AH, CH, DH, BL, BH)> { 6400b57cec5SDimitry Andric let AltOrders = [(sub GR8_NOREX, AH, BH, CH, DH)]; 6410b57cec5SDimitry Andric let AltOrderSelect = [{ 6420b57cec5SDimitry Andric return MF.getSubtarget<X86Subtarget>().is64Bit(); 6430b57cec5SDimitry Andric }]; 6440b57cec5SDimitry Andric} 6450b57cec5SDimitry Andric// GR16_NOREX - GR16 registers which do not require a REX prefix. 6460b57cec5SDimitry Andricdef GR16_NOREX : RegisterClass<"X86", [i16], 16, 6470b57cec5SDimitry Andric (add AX, CX, DX, SI, DI, BX, BP, SP)>; 6480b57cec5SDimitry Andric// GR32_NOREX - GR32 registers which do not require a REX prefix. 6490b57cec5SDimitry Andricdef GR32_NOREX : RegisterClass<"X86", [i32], 32, 6500b57cec5SDimitry Andric (add EAX, ECX, EDX, ESI, EDI, EBX, EBP, ESP)>; 6510b57cec5SDimitry Andric// GR64_NOREX - GR64 registers which do not require a REX prefix. 6520b57cec5SDimitry Andricdef GR64_NOREX : RegisterClass<"X86", [i64], 64, 6530b57cec5SDimitry Andric (add RAX, RCX, RDX, RSI, RDI, RBX, RBP, RSP, RIP)>; 654*5f757f3fSDimitry Andric// GeneratePressureSet = 0 here is a temporary workaround for lots of 655*5f757f3fSDimitry Andric// LIT fail. Whether enabling in the future still needs discussion. 656*5f757f3fSDimitry Andriclet GeneratePressureSet = 0 in { 657*5f757f3fSDimitry Andric// GR8_NOREX2 - GR8 registers which do not require a REX2 prefix. 658*5f757f3fSDimitry Andricdef GR8_NOREX2 : RegisterClass<"X86", [i8], 8, 659*5f757f3fSDimitry Andric (sub GR8, (sequence "R%uB", 16, 31))> { 660*5f757f3fSDimitry Andric let AltOrders = [(sub GR8_NOREX2, AH, BH, CH, DH)]; 661*5f757f3fSDimitry Andric let AltOrderSelect = [{ 662*5f757f3fSDimitry Andric return MF.getSubtarget<X86Subtarget>().is64Bit(); 663*5f757f3fSDimitry Andric }]; 664*5f757f3fSDimitry Andric} 665*5f757f3fSDimitry Andric// GR16_NOREX2 - GR16 registers which do not require a REX2 prefix. 666*5f757f3fSDimitry Andricdef GR16_NOREX2 : RegisterClass<"X86", [i16], 16, 667*5f757f3fSDimitry Andric (sub GR16, (sequence "R%uW", 16, 31))>; 668*5f757f3fSDimitry Andric// GR32_NOREX2 - GR32 registers which do not require a REX2 prefix. 669*5f757f3fSDimitry Andricdef GR32_NOREX2 : RegisterClass<"X86", [i32], 32, 670*5f757f3fSDimitry Andric (sub GR32, (sequence "R%uD", 16, 31))>; 671*5f757f3fSDimitry Andric// GR64_NOREX2 - GR64 registers which do not require a REX2 prefix. 672*5f757f3fSDimitry Andricdef GR64_NOREX2 : RegisterClass<"X86", [i64], 64, 673*5f757f3fSDimitry Andric (sub GR64, (sequence "R%u", 16, 31))>; 674*5f757f3fSDimitry Andric} 6750b57cec5SDimitry Andric 6760b57cec5SDimitry Andric// GR32_NOSP - GR32 registers except ESP. 6770b57cec5SDimitry Andricdef GR32_NOSP : RegisterClass<"X86", [i32], 32, (sub GR32, ESP)>; 6780b57cec5SDimitry Andric 6790b57cec5SDimitry Andric// GR64_NOSP - GR64 registers except RSP (and RIP). 6800b57cec5SDimitry Andricdef GR64_NOSP : RegisterClass<"X86", [i64], 64, (sub GR64, RSP, RIP)>; 6810b57cec5SDimitry Andric 6820b57cec5SDimitry Andric// GR32_NOREX_NOSP - GR32 registers which do not require a REX prefix except 6830b57cec5SDimitry Andric// ESP. 6840b57cec5SDimitry Andricdef GR32_NOREX_NOSP : RegisterClass<"X86", [i32], 32, 6850b57cec5SDimitry Andric (and GR32_NOREX, GR32_NOSP)>; 6860b57cec5SDimitry Andric 6870b57cec5SDimitry Andric// GR64_NOREX_NOSP - GR64_NOREX registers except RSP. 6880b57cec5SDimitry Andricdef GR64_NOREX_NOSP : RegisterClass<"X86", [i64], 64, 6890b57cec5SDimitry Andric (and GR64_NOREX, GR64_NOSP)>; 690*5f757f3fSDimitry Andriclet GeneratePressureSet = 0 in { 691*5f757f3fSDimitry Andric// GR32_NOREX2_NOSP - GR32_NOREX2 registers except ESP. 692*5f757f3fSDimitry Andricdef GR32_NOREX2_NOSP : RegisterClass<"X86", [i32], 32, 693*5f757f3fSDimitry Andric (sub GR32_NOREX2, ESP)>; 694*5f757f3fSDimitry Andric 695*5f757f3fSDimitry Andric// GR64_NOREX2_NOSP - GR64_NOREX2 registers except RSP, RIP. 696*5f757f3fSDimitry Andricdef GR64_NOREX2_NOSP : RegisterClass<"X86", [i64], 64, 697*5f757f3fSDimitry Andric (sub GR64_NOREX2, RSP, RIP)>; 698*5f757f3fSDimitry Andric} 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andric// Register classes used for ABIs that use 32-bit address accesses, 701*5f757f3fSDimitry Andric// while using the whole x86_64 ISA. 7020b57cec5SDimitry Andric 7030b57cec5SDimitry Andric// In such cases, it is fine to use RIP as we are sure the 32 high 7040b57cec5SDimitry Andric// bits are not set. We do not need variants for NOSP as RIP is not 7050b57cec5SDimitry Andric// allowed there. 7060b57cec5SDimitry Andric// RIP is not spilled anywhere for now, so stick to 32-bit alignment 7070b57cec5SDimitry Andric// to save on memory space. 7080b57cec5SDimitry Andric// FIXME: We could allow all 64bit registers, but we would need 7090b57cec5SDimitry Andric// something to check that the 32 high bits are not set, 7100b57cec5SDimitry Andric// which we do not have right now. 7110b57cec5SDimitry Andricdef LOW32_ADDR_ACCESS : RegisterClass<"X86", [i32], 32, (add GR32, RIP)>; 7120b57cec5SDimitry Andric 7135ffd83dbSDimitry Andric// When RBP is used as a base pointer in a 32-bit addresses environment, 7140b57cec5SDimitry Andric// this is also safe to use the full register to access addresses. 7150b57cec5SDimitry Andric// Since RBP will never be spilled, stick to a 32 alignment to save 7160b57cec5SDimitry Andric// on memory consumption. 7170b57cec5SDimitry Andricdef LOW32_ADDR_ACCESS_RBP : RegisterClass<"X86", [i32], 32, 7180b57cec5SDimitry Andric (add LOW32_ADDR_ACCESS, RBP)>; 7190b57cec5SDimitry Andric 7200b57cec5SDimitry Andric// A class to support the 'A' assembler constraint: [ER]AX then [ER]DX. 7210b57cec5SDimitry Andricdef GR32_AD : RegisterClass<"X86", [i32], 32, (add EAX, EDX)>; 7220b57cec5SDimitry Andricdef GR64_AD : RegisterClass<"X86", [i64], 64, (add RAX, RDX)>; 7230b57cec5SDimitry Andric 7240b57cec5SDimitry Andric// Classes to support the 64-bit assembler constraint tied to a fixed 7250b57cec5SDimitry Andric// register in 32-bit mode. The second register is always the next in 7260b57cec5SDimitry Andric// the list. Wrap around causes an error. 7270b57cec5SDimitry Andricdef GR32_DC : RegisterClass<"X86", [i32], 32, (add EDX, ECX)>; 7280b57cec5SDimitry Andricdef GR32_CB : RegisterClass<"X86", [i32], 32, (add ECX, EBX)>; 7290b57cec5SDimitry Andricdef GR32_BSI : RegisterClass<"X86", [i32], 32, (add EBX, ESI)>; 7300b57cec5SDimitry Andricdef GR32_SIDI : RegisterClass<"X86", [i32], 32, (add ESI, EDI)>; 7310b57cec5SDimitry Andricdef GR32_DIBP : RegisterClass<"X86", [i32], 32, (add EDI, EBP)>; 7320b57cec5SDimitry Andricdef GR32_BPSP : RegisterClass<"X86", [i32], 32, (add EBP, ESP)>; 7330b57cec5SDimitry Andric 7340b57cec5SDimitry Andric// Scalar SSE2 floating point registers. 7350b57cec5SDimitry Andricdef FR32 : RegisterClass<"X86", [f32], 32, (sequence "XMM%u", 0, 15)>; 7360b57cec5SDimitry Andric 7370b57cec5SDimitry Andricdef FR64 : RegisterClass<"X86", [f64], 64, (add FR32)>; 7380b57cec5SDimitry Andric 73981ad6265SDimitry Andricdef FR16 : RegisterClass<"X86", [f16], 16, (add FR32)> {let Size = 32;} 74081ad6265SDimitry Andric 7410b57cec5SDimitry Andric 7420b57cec5SDimitry Andric// FIXME: This sets up the floating point register files as though they are f64 7430b57cec5SDimitry Andric// values, though they really are f80 values. This will cause us to spill 7440b57cec5SDimitry Andric// values as 64-bit quantities instead of 80-bit quantities, which is much much 7450b57cec5SDimitry Andric// faster on common hardware. In reality, this should be controlled by a 7460b57cec5SDimitry Andric// command line option or something. 7470b57cec5SDimitry Andric 7480b57cec5SDimitry Andric 7490b57cec5SDimitry Andricdef RFP32 : RegisterClass<"X86",[f32], 32, (sequence "FP%u", 0, 6)>; 7500b57cec5SDimitry Andricdef RFP64 : RegisterClass<"X86",[f64], 32, (add RFP32)>; 7510b57cec5SDimitry Andricdef RFP80 : RegisterClass<"X86",[f80], 32, (add RFP32)>; 7520b57cec5SDimitry Andric 7530b57cec5SDimitry Andric// st(7) may be is not allocatable. 7540b57cec5SDimitry Andricdef RFP80_7 : RegisterClass<"X86",[f80], 32, (add FP7)> { 7550b57cec5SDimitry Andric let isAllocatable = 0; 7560b57cec5SDimitry Andric} 7570b57cec5SDimitry Andric 7580b57cec5SDimitry Andric// Floating point stack registers (these are not allocatable by the 7590b57cec5SDimitry Andric// register allocator - the floating point stackifier is responsible 7600b57cec5SDimitry Andric// for transforming FPn allocations to STn registers) 7610b57cec5SDimitry Andricdef RST : RegisterClass<"X86", [f80, f64, f32], 32, (sequence "ST%u", 0, 7)> { 7620b57cec5SDimitry Andric let isAllocatable = 0; 7630b57cec5SDimitry Andric} 7640b57cec5SDimitry Andric 7650b57cec5SDimitry Andric// Helper to allow %st to print as %st(0) when its encoded in the instruction. 7660b57cec5SDimitry Andricdef RSTi : RegisterOperand<RST, "printSTiRegOperand">; 7670b57cec5SDimitry Andric 7680b57cec5SDimitry Andric// Generic vector registers: VR64 and VR128. 7690b57cec5SDimitry Andric// Ensure that float types are declared first - only float is legal on SSE1. 7700b57cec5SDimitry Andricdef VR64: RegisterClass<"X86", [x86mmx], 64, (sequence "MM%u", 0, 7)>; 771bdd1243dSDimitry Andricdef VR128 : RegisterClass<"X86", [v4f32, v2f64, v8f16, v8bf16, v16i8, v8i16, v4i32, v2i64, f128], 7720b57cec5SDimitry Andric 128, (add FR32)>; 773bdd1243dSDimitry Andricdef VR256 : RegisterClass<"X86", [v8f32, v4f64, v16f16, v16bf16, v32i8, v16i16, v8i32, v4i64], 7740b57cec5SDimitry Andric 256, (sequence "YMM%u", 0, 15)>; 7750b57cec5SDimitry Andric 7760b57cec5SDimitry Andric// Status flags registers. 7770b57cec5SDimitry Andricdef CCR : RegisterClass<"X86", [i32], 32, (add EFLAGS)> { 7780b57cec5SDimitry Andric let CopyCost = -1; // Don't allow copying of status registers. 7790b57cec5SDimitry Andric let isAllocatable = 0; 7800b57cec5SDimitry Andric} 7810b57cec5SDimitry Andricdef FPCCR : RegisterClass<"X86", [i16], 16, (add FPSW)> { 7820b57cec5SDimitry Andric let CopyCost = -1; // Don't allow copying of status registers. 7830b57cec5SDimitry Andric let isAllocatable = 0; 7840b57cec5SDimitry Andric} 7850b57cec5SDimitry Andricdef DFCCR : RegisterClass<"X86", [i32], 32, (add DF)> { 7860b57cec5SDimitry Andric let CopyCost = -1; // Don't allow copying of status registers. 7870b57cec5SDimitry Andric let isAllocatable = 0; 7880b57cec5SDimitry Andric} 7890b57cec5SDimitry Andric 7900b57cec5SDimitry Andric// AVX-512 vector/mask registers. 791bdd1243dSDimitry Andricdef VR512 : RegisterClass<"X86", [v16f32, v8f64, v32f16, v32bf16, v64i8, v32i16, v16i32, v8i64], 7920b57cec5SDimitry Andric 512, (sequence "ZMM%u", 0, 31)>; 7930b57cec5SDimitry Andric 7940b57cec5SDimitry Andric// Represents the lower 16 registers that have VEX/legacy encodable subregs. 7950b57cec5SDimitry Andricdef VR512_0_15 : RegisterClass<"X86", [v16f32, v8f64, v64i8, v32i16, v16i32, v8i64], 7960b57cec5SDimitry Andric 512, (sequence "ZMM%u", 0, 15)>; 7970b57cec5SDimitry Andric 7980b57cec5SDimitry Andric// Scalar AVX-512 floating point registers. 7990b57cec5SDimitry Andricdef FR32X : RegisterClass<"X86", [f32], 32, (sequence "XMM%u", 0, 31)>; 8000b57cec5SDimitry Andric 8010b57cec5SDimitry Andricdef FR64X : RegisterClass<"X86", [f64], 64, (add FR32X)>; 8020b57cec5SDimitry Andric 80381ad6265SDimitry Andricdef FR16X : RegisterClass<"X86", [f16], 16, (add FR32X)> {let Size = 32;} 804349cc55cSDimitry Andric 8050b57cec5SDimitry Andric// Extended VR128 and VR256 for AVX-512 instructions 806bdd1243dSDimitry Andricdef VR128X : RegisterClass<"X86", [v4f32, v2f64, v8f16, v8bf16, v16i8, v8i16, v4i32, v2i64, f128], 8070b57cec5SDimitry Andric 128, (add FR32X)>; 808bdd1243dSDimitry Andricdef VR256X : RegisterClass<"X86", [v8f32, v4f64, v16f16, v16bf16, v32i8, v16i16, v8i32, v4i64], 8090b57cec5SDimitry Andric 256, (sequence "YMM%u", 0, 31)>; 8100b57cec5SDimitry Andric 8110b57cec5SDimitry Andric// Mask registers 8120b57cec5SDimitry Andricdef VK1 : RegisterClass<"X86", [v1i1], 16, (sequence "K%u", 0, 7)> {let Size = 16;} 8130b57cec5SDimitry Andricdef VK2 : RegisterClass<"X86", [v2i1], 16, (add VK1)> {let Size = 16;} 8140b57cec5SDimitry Andricdef VK4 : RegisterClass<"X86", [v4i1], 16, (add VK2)> {let Size = 16;} 8150b57cec5SDimitry Andricdef VK8 : RegisterClass<"X86", [v8i1], 16, (add VK4)> {let Size = 16;} 8160b57cec5SDimitry Andricdef VK16 : RegisterClass<"X86", [v16i1], 16, (add VK8)> {let Size = 16;} 8170b57cec5SDimitry Andricdef VK32 : RegisterClass<"X86", [v32i1], 32, (add VK16)> {let Size = 32;} 8180b57cec5SDimitry Andricdef VK64 : RegisterClass<"X86", [v64i1], 64, (add VK32)> {let Size = 64;} 8190b57cec5SDimitry Andric 8200b57cec5SDimitry Andricdef VK1PAIR : RegisterClass<"X86", [untyped], 16, (add KPAIRS)> {let Size = 32;} 8210b57cec5SDimitry Andricdef VK2PAIR : RegisterClass<"X86", [untyped], 16, (add KPAIRS)> {let Size = 32;} 8220b57cec5SDimitry Andricdef VK4PAIR : RegisterClass<"X86", [untyped], 16, (add KPAIRS)> {let Size = 32;} 8230b57cec5SDimitry Andricdef VK8PAIR : RegisterClass<"X86", [untyped], 16, (add KPAIRS)> {let Size = 32;} 8240b57cec5SDimitry Andricdef VK16PAIR : RegisterClass<"X86", [untyped], 16, (add KPAIRS)> {let Size = 32;} 8250b57cec5SDimitry Andric 8260b57cec5SDimitry Andricdef VK1WM : RegisterClass<"X86", [v1i1], 16, (sub VK1, K0)> {let Size = 16;} 8270b57cec5SDimitry Andricdef VK2WM : RegisterClass<"X86", [v2i1], 16, (sub VK2, K0)> {let Size = 16;} 8280b57cec5SDimitry Andricdef VK4WM : RegisterClass<"X86", [v4i1], 16, (sub VK4, K0)> {let Size = 16;} 8290b57cec5SDimitry Andricdef VK8WM : RegisterClass<"X86", [v8i1], 16, (sub VK8, K0)> {let Size = 16;} 8300b57cec5SDimitry Andricdef VK16WM : RegisterClass<"X86", [v16i1], 16, (add VK8WM)> {let Size = 16;} 8310b57cec5SDimitry Andricdef VK32WM : RegisterClass<"X86", [v32i1], 32, (add VK16WM)> {let Size = 32;} 8320b57cec5SDimitry Andricdef VK64WM : RegisterClass<"X86", [v64i1], 64, (add VK32WM)> {let Size = 64;} 8330b57cec5SDimitry Andric 8345ffd83dbSDimitry Andric// Tiles 835e8d8bef9SDimitry Andriclet CopyCost = -1 in // Don't allow copying of tile registers 836e8d8bef9SDimitry Andricdef TILE : RegisterClass<"X86", [x86amx], 8192, 8375ffd83dbSDimitry Andric (sequence "TMM%u", 0, 7)> {let Size = 8192;} 83881ad6265SDimitry Andric 83981ad6265SDimitry Andric//===----------------------------------------------------------------------===// 84081ad6265SDimitry Andric// Register categories. 84181ad6265SDimitry Andric// 84281ad6265SDimitry Andric 84381ad6265SDimitry Andric// The TILE and VK*PAIR registers may not be "fixed", but we don't want them 84481ad6265SDimitry Andric// anyway. 84581ad6265SDimitry Andricdef FixedRegisters : RegisterCategory<[DEBUG_REG, CONTROL_REG, CCR, FPCCR, 84681ad6265SDimitry Andric DFCCR, TILE, VK1PAIR, VK2PAIR, VK4PAIR, 84781ad6265SDimitry Andric VK8PAIR, VK16PAIR]>; 84881ad6265SDimitry Andricdef GeneralPurposeRegisters : RegisterCategory<[GR64, GR32, GR16, GR8]>; 849