Synthesizable[VT.getSimpleVT().SimpleTy] = isSynthesizable;
}
+ /// findRepresentativeClass - Return the largest legal super-reg register class
+ /// of the specified register class.
+ virtual const TargetRegisterClass *
+ findRepresentativeClass(const TargetRegisterClass *RC) const;
+
/// computeRegisterProperties - Once all of the register classes are added,
/// this allows us to compute derived properties we expose.
void computeRegisterProperties();
/// hasLegalSuperRegRegClasses - Return true if the specified register class
/// has one or more super-reg register classes that are legal.
- bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC);
-
- /// findRepresentativeClass - Return the largest legal super-reg register class
- /// of the specified register class.
- const TargetRegisterClass *
- findRepresentativeClass(const TargetRegisterClass *RC);
+ bool hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) const;
};
/// GetReturnInfo - Given an LLVM IR type and return type attributes,
/// hasLegalSuperRegRegClasses - Return true if the specified register class
/// has one or more super-reg register classes that are legal.
-bool TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) {
+bool
+TargetLowering::hasLegalSuperRegRegClasses(const TargetRegisterClass *RC) const{
if (*RC->superregclasses_begin() == 0)
return false;
for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(),
/// findRepresentativeClass - Return the largest legal super-reg register class
/// of the specified register class.
const TargetRegisterClass *
-TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) {
- if (!RC) return 0;
-
+TargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) const {
const TargetRegisterClass *BestRC = RC;
for (TargetRegisterInfo::regclass_iterator I = RC->superregclasses_begin(),
E = RC->superregclasses_end(); I != E; ++I) {
// not a sub-register class / subreg register class) legal register class for
// a group of value types. For example, on i386, i8, i16, and i32
// representative would be GR32; while on x86_64 it's GR64.
- for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i)
- RepRegClassForVT[i] = findRepresentativeClass(RegClassForVT[i]);
+ for (unsigned i = 0; i != MVT::LAST_VALUETYPE; ++i) {
+ const TargetRegisterClass *RC = RegClassForVT[i];
+ RepRegClassForVT[i] = RC ? findRepresentativeClass(RC) : 0;
+ }
}
const char *TargetLowering::getTargetNodeName(unsigned Opcode) const {
benefitFromCodePlacementOpt = true;
}
+const TargetRegisterClass *
+ARMTargetLowering::findRepresentativeClass(const TargetRegisterClass *RC) const{
+ switch (RC->getID()) {
+ default:
+ return RC;
+ case ARM::tGPRRegClassID:
+ case ARM::GPRRegClassID:
+ return ARM::GPRRegisterClass;
+ case ARM::SPRRegClassID:
+ case ARM::DPRRegClassID:
+ return ARM::DPRRegisterClass;
+ case ARM::QPRRegClassID:
+ return ARM::QPRRegisterClass;
+ }
+}
+
const char *ARMTargetLowering::getTargetNodeName(unsigned Opcode) const {
switch (Opcode) {
default: return 0;
/// materialize the FP immediate as a load from a constant pool.
virtual bool isFPImmLegal(const APFloat &Imm, EVT VT) const;
+ protected:
+ const TargetRegisterClass *
+ findRepresentativeClass(const TargetRegisterClass *RC) const;
+
private:
/// Subtarget - Keep a pointer to the ARMSubtarget around so that we can
/// make the right decision when generating code for different targets.