2002-11-20 18:59:43 +00:00
|
|
|
//===- Target/X86/X86RegisterClasses.cpp - Register Classes -------*-C++-*-===//
|
|
|
|
//
|
|
|
|
// This file describes the X86 Register Classes which describe registers.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "llvm/Target/MRegisterInfo.h"
|
|
|
|
#include "X86RegisterInfo.h"
|
|
|
|
#include "llvm/Type.h"
|
|
|
|
|
|
|
|
enum {
|
|
|
|
#define R(ENUM, NAME, FLAGS, TSFLAGS) ENUM,
|
|
|
|
#include "X86RegisterInfo.def"
|
|
|
|
};
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
static const unsigned X86ByteRegisterClassRegs[] = {
|
|
|
|
#define R(ENUM, NAME, FLAGS, TSFLAGS)
|
|
|
|
#define R8(ENUM, NAME, FLAGS, TSFLAGS) ENUM,
|
|
|
|
#include "X86RegisterInfo.def"
|
|
|
|
};
|
|
|
|
|
|
|
|
class X86ByteRegisterClass : public TargetRegisterClass {
|
|
|
|
protected:
|
|
|
|
|
|
|
|
public:
|
|
|
|
X86ByteRegisterClass() {}
|
|
|
|
unsigned getNumRegs() const {
|
|
|
|
return sizeof(X86ByteRegisterClassRegs)/
|
|
|
|
sizeof(X86ByteRegisterClassRegs[0]);
|
|
|
|
}
|
|
|
|
unsigned getRegister(unsigned idx) const {
|
|
|
|
assert(idx < getNumRegs() && "Index out of bounds!");
|
|
|
|
return X86ByteRegisterClassRegs[idx];
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned getDataSize() const { return 1; }
|
|
|
|
|
|
|
|
} X86ByteRegisterClassInstance;
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
static const unsigned X86ShortRegisterClassRegs[] = {
|
|
|
|
#define R(ENUM, NAME, FLAGS, TSFLAGS)
|
|
|
|
#define R16(ENUM, NAME, FLAGS, TSFLAGS) ENUM,
|
|
|
|
#include "X86RegisterInfo.def"
|
|
|
|
};
|
|
|
|
|
|
|
|
class X86ShortRegisterClass : public TargetRegisterClass {
|
|
|
|
protected:
|
|
|
|
|
|
|
|
public:
|
|
|
|
X86ShortRegisterClass() {}
|
|
|
|
unsigned getNumRegs() const {
|
|
|
|
return sizeof(X86ShortRegisterClassRegs)/
|
|
|
|
sizeof(X86ShortRegisterClassRegs[0]); }
|
|
|
|
unsigned getRegister(unsigned idx) const {
|
|
|
|
assert(idx < getNumRegs() && "Index out of bounds!");
|
|
|
|
return X86ShortRegisterClassRegs[idx];
|
|
|
|
}
|
|
|
|
unsigned getDataSize() const { return 2; }
|
|
|
|
|
|
|
|
} X86ShortRegisterClassInstance;
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
|
//
|
|
|
|
|
|
|
|
static const unsigned X86IntRegisterClassRegs[] = {
|
|
|
|
#define R(ENUM, NAME, FLAGS, TSFLAGS)
|
|
|
|
#define R32(ENUM, NAME, FLAGS, TSFLAGS) ENUM,
|
|
|
|
#include "X86RegisterInfo.def"
|
|
|
|
};
|
|
|
|
|
|
|
|
class X86IntRegisterClass : public TargetRegisterClass {
|
|
|
|
protected:
|
|
|
|
|
|
|
|
public:
|
|
|
|
X86IntRegisterClass() {}
|
|
|
|
unsigned getNumRegs() const {
|
|
|
|
return sizeof(X86IntRegisterClassRegs)/
|
|
|
|
sizeof(X86IntRegisterClassRegs[0]); }
|
|
|
|
unsigned getRegister(unsigned idx) const {
|
|
|
|
assert(idx < getNumRegs() && "Index out of bounds!");
|
|
|
|
return X86IntRegisterClassRegs[idx];
|
|
|
|
}
|
|
|
|
unsigned getDataSize() const { return 4; }
|
|
|
|
|
|
|
|
} X86IntRegisterClassInstance;
|
|
|
|
|
|
|
|
|
|
|
|
static const TargetRegisterClass *X86RegClasses[] = {
|
|
|
|
&X86ByteRegisterClassInstance,
|
|
|
|
&X86ShortRegisterClassInstance,
|
|
|
|
&X86IntRegisterClassInstance
|
|
|
|
};
|
|
|
|
|
|
|
|
const TargetRegisterClass* X86RegisterInfo::getRegClassForType(const Type* Ty)
|
|
|
|
const
|
|
|
|
{
|
|
|
|
switch (Ty->getPrimitiveID()) {
|
2002-11-21 00:25:56 +00:00
|
|
|
case Type::BoolTyID:
|
2002-11-20 18:59:43 +00:00
|
|
|
case Type::SByteTyID:
|
|
|
|
case Type::UByteTyID: return &X86ByteRegisterClassInstance;
|
|
|
|
case Type::ShortTyID:
|
|
|
|
case Type::UShortTyID: return &X86ShortRegisterClassInstance;
|
|
|
|
case Type::IntTyID:
|
|
|
|
case Type::UIntTyID:
|
|
|
|
case Type::PointerTyID: return &X86IntRegisterClassInstance;
|
|
|
|
|
|
|
|
case Type::LongTyID: /* None of these are handled yet! */
|
|
|
|
case Type::ULongTyID:
|
|
|
|
case Type::FloatTyID:
|
|
|
|
case Type::DoubleTyID:
|
|
|
|
|
|
|
|
default:
|
|
|
|
assert(0 && "Invalid type to getClass!");
|
|
|
|
return 0; // not reached
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MRegisterInfo::const_iterator X86RegisterInfo::const_regclass_begin() const {
|
|
|
|
return X86RegClasses[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
unsigned X86RegisterInfo::getNumRegClasses() const {
|
|
|
|
return sizeof(X86RegClasses)/sizeof(X86RegClasses[0]);
|
|
|
|
}
|
|
|
|
|
|
|
|
MRegisterInfo::const_iterator X86RegisterInfo::const_regclass_end() const {
|
|
|
|
return (X86RegClasses[0]+getNumRegClasses());
|
|
|
|
}
|
|
|
|
|