diff --git a/lib/Target/X86/X86RegisterInfo.td b/lib/Target/X86/X86RegisterInfo.td new file mode 100644 index 00000000000..41950bfe8e4 --- /dev/null +++ b/lib/Target/X86/X86RegisterInfo.td @@ -0,0 +1,116 @@ +//===- X86RegisterInfo.td - Describe the X86 Register File ------*- C++ -*-===// +// +// This file describes the X86 Register file, defining the registers themselves, +// aliases between the registers, and the register classes built out of the +// registers. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +// Register definitions... +// +set Namespace = "X86" in { + // 32-bit registers + def EAX : Register; def ECX : Register; + def EDX : Register; def EBX : Register; + def ESP : Register; def EBP : Register; + def ESI : Register; def EDI : Register; + + // 16-bit registers + def AX : Register; def CX : Register; + def DX : Register; def BX : Register; + def SP : Register; def BP : Register; + def SI : Register; def DI : Register; + + // 8-bit registers + def AL : Register; def CL : Register; + def DL : Register; def BL : Register; + def AH : Register; def CH : Register; + def DH : Register; def BH : Register; + + // Pseudo Floating Point registers + def FP0 : Register; def FP1 : Register; + def FP2 : Register; def FP3 : Register; + def FP4 : Register; def FP5 : Register; + def FP6 : Register; + + // Floating point stack registers + def ST0 : Register; def ST1 : Register; + def ST2 : Register; def ST3 : Register; + def ST4 : Register; def ST5 : Register; + def ST6 : Register; def ST7 : Register; + + // Flags, Segment registers, etc... + + // This is a slimy hack to make it possible to say that flags are clobbered... + // Ideally we'd model instructions based on which particular flag(s) they + // could clobber. + def EFLAGS : Register; +} + +//===----------------------------------------------------------------------===// +// Register alias definitions... define which registers alias which others. We +// only specify which registers the small registers alias, because the register +// file generator is smart enough to figure out that AL aliases AX if we tell it +// that AX aliases AL (for example). +// +def : RegisterAliases; def : RegisterAliases; +def : RegisterAliases; def : RegisterAliases; +def : RegisterAliases; def : RegisterAliases; +def : RegisterAliases; def : RegisterAliases; + +def : RegisterAliases; def : RegisterAliases; +def : RegisterAliases; def : RegisterAliases; +def : RegisterAliases; def : RegisterAliases; +def : RegisterAliases; def : RegisterAliases; + +//===----------------------------------------------------------------------===// +// Register Class Definitions... now that we have all of the pieces, define the +// top-level register classes. The order specified in the register list is +// implicitly defined to be the register allocation order. +// +def r8 : RegisterClass; +def r16 : RegisterClass { + set Methods = [{ + iterator allocation_order_end(MachineFunction &MF) const { + if (hasFP(MF)) // Does the function dedicate EBP to being a frame ptr? + return end()-2; // If so, don't allocate SP or BP + else + return end()-1; // If not, just don't allocate SP + } + }]; +} + +def r32 : RegisterClass { + set Methods = [{ + iterator allocation_order_end(MachineFunction &MF) const { + if (hasFP(MF)) // Does the function dedicate EBP to being a frame ptr? + return end()-2; // If so, don't allocate ESP or EBP + else + return end()-1; // If not, just don't allocate ESP + } + }]; +} + +def rFP : RegisterClass; + +// Registers which cannot be allocated... and are thus left unnamed. +def : RegisterClass; +def : RegisterClass; + + + +//===----------------------------------------------------------------------===// +// Finally, define the global RegisterInfo implementation. +// + +def : RegisterInfo { + // Specify the class name for the register info generator to make. + set ClassName = "X86GenRegisterInfo"; + + // Specify the calle saved registers. + set CalleeSavedRegisters = [ESI, EDI, EBX, EBP]; + + // Yes, pointers are 32-bits in size. + set PointerType = i32; +}