Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
llvm-epi-0.8
Manage
Activity
Members
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Deploy
Releases
Model registry
Analyze
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
Roger Ferrer
llvm-epi-0.8
Commits
731953bc
Commit
731953bc
authored
21 years ago
by
Chris Lattner
Browse files
Options
Downloads
Patches
Plain Diff
Initial checkin of X86 Register File description
llvm-svn: 7509
parent
f0b32aa9
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
llvm/lib/Target/X86/X86RegisterInfo.td
+116
-0
116 additions, 0 deletions
llvm/lib/Target/X86/X86RegisterInfo.td
with
116 additions
and
0 deletions
llvm/lib/Target/X86/X86RegisterInfo.td
0 → 100644
+
116
−
0
View file @
731953bc
//===- 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<AL, [AX, EAX]>; def : RegisterAliases<BL, [BX, EBX]>;
def : RegisterAliases<CL, [CX, ECX]>; def : RegisterAliases<DL, [DX, EDX]>;
def : RegisterAliases<AH, [AX, EAX]>; def : RegisterAliases<BH, [BX, EBX]>;
def : RegisterAliases<CH, [CX, ECX]>; def : RegisterAliases<DH, [DX, EDX]>;
def : RegisterAliases<AX, [EAX]>; def : RegisterAliases<BX, [EBX]>;
def : RegisterAliases<CX, [ECX]>; def : RegisterAliases<DX, [EDX]>;
def : RegisterAliases<SI, [ESI]>; def : RegisterAliases<DI, [EDI]>;
def : RegisterAliases<SP, [ESP]>; def : RegisterAliases<BP, [EBP]>;
//===----------------------------------------------------------------------===//
// 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<i8, 1, [AL, CL, DL, BL, AH, CH, DH, BH]>;
def r16 : RegisterClass<i16, 2, [AX, CX, DX, BX, SI, DI, BP, SP]> {
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<i32, 4, [EAX, ECX, EDX, EBX, ESI, EDI, EBP, ESP]> {
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<f80, 4, [FP0, FP1, FP2, FP3, FP4, FP5, FP6]>;
// Registers which cannot be allocated... and are thus left unnamed.
def : RegisterClass<f80, 4, [ST0, ST1, ST2, ST3, ST4, ST5, ST6, ST7]>;
def : RegisterClass<i16, 2, [EFLAGS]>;
//===----------------------------------------------------------------------===//
// 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;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment