aboutsummaryrefslogtreecommitdiff
path: root/lib/Target/ARM/ARMRegisterBankInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Target/ARM/ARMRegisterBankInfo.cpp')
-rw-r--r--lib/Target/ARM/ARMRegisterBankInfo.cpp68
1 files changed, 67 insertions, 1 deletions
diff --git a/lib/Target/ARM/ARMRegisterBankInfo.cpp b/lib/Target/ARM/ARMRegisterBankInfo.cpp
index fad0e98285e6..0e16d6bcfe2b 100644
--- a/lib/Target/ARM/ARMRegisterBankInfo.cpp
+++ b/lib/Target/ARM/ARMRegisterBankInfo.cpp
@@ -175,15 +175,20 @@ const RegisterBank &ARMRegisterBankInfo::getRegBankFromRegClass(
switch (RC.getID()) {
case GPRRegClassID:
+ case GPRwithAPSRRegClassID:
case GPRnopcRegClassID:
+ case rGPRRegClassID:
case GPRspRegClassID:
case tGPR_and_tcGPRRegClassID:
+ case tcGPRRegClassID:
case tGPRRegClassID:
return getRegBank(ARM::GPRRegBankID);
+ case HPRRegClassID:
case SPR_8RegClassID:
case SPRRegClassID:
case DPR_8RegClassID:
case DPRRegClassID:
+ case QPRRegClassID:
return getRegBank(ARM::FPRRegBankID);
default:
llvm_unreachable("Unsupported register kind");
@@ -263,13 +268,74 @@ ARMRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
case G_FADD:
case G_FSUB:
case G_FMUL:
- case G_FDIV: {
+ case G_FDIV:
+ case G_FNEG: {
LLT Ty = MRI.getType(MI.getOperand(0).getReg());
OperandsMapping =Ty.getSizeInBits() == 64
? &ARM::ValueMappings[ARM::DPR3OpsIdx]
: &ARM::ValueMappings[ARM::SPR3OpsIdx];
break;
}
+ case G_FMA: {
+ LLT Ty = MRI.getType(MI.getOperand(0).getReg());
+ OperandsMapping =
+ Ty.getSizeInBits() == 64
+ ? getOperandsMapping({&ARM::ValueMappings[ARM::DPR3OpsIdx],
+ &ARM::ValueMappings[ARM::DPR3OpsIdx],
+ &ARM::ValueMappings[ARM::DPR3OpsIdx],
+ &ARM::ValueMappings[ARM::DPR3OpsIdx]})
+ : getOperandsMapping({&ARM::ValueMappings[ARM::SPR3OpsIdx],
+ &ARM::ValueMappings[ARM::SPR3OpsIdx],
+ &ARM::ValueMappings[ARM::SPR3OpsIdx],
+ &ARM::ValueMappings[ARM::SPR3OpsIdx]});
+ break;
+ }
+ case G_FPEXT: {
+ LLT ToTy = MRI.getType(MI.getOperand(0).getReg());
+ LLT FromTy = MRI.getType(MI.getOperand(1).getReg());
+ if (ToTy.getSizeInBits() == 64 && FromTy.getSizeInBits() == 32)
+ OperandsMapping =
+ getOperandsMapping({&ARM::ValueMappings[ARM::DPR3OpsIdx],
+ &ARM::ValueMappings[ARM::SPR3OpsIdx]});
+ break;
+ }
+ case G_FPTRUNC: {
+ LLT ToTy = MRI.getType(MI.getOperand(0).getReg());
+ LLT FromTy = MRI.getType(MI.getOperand(1).getReg());
+ if (ToTy.getSizeInBits() == 32 && FromTy.getSizeInBits() == 64)
+ OperandsMapping =
+ getOperandsMapping({&ARM::ValueMappings[ARM::SPR3OpsIdx],
+ &ARM::ValueMappings[ARM::DPR3OpsIdx]});
+ break;
+ }
+ case G_FPTOSI:
+ case G_FPTOUI: {
+ LLT ToTy = MRI.getType(MI.getOperand(0).getReg());
+ LLT FromTy = MRI.getType(MI.getOperand(1).getReg());
+ if ((FromTy.getSizeInBits() == 32 || FromTy.getSizeInBits() == 64) &&
+ ToTy.getSizeInBits() == 32)
+ OperandsMapping =
+ FromTy.getSizeInBits() == 64
+ ? getOperandsMapping({&ARM::ValueMappings[ARM::GPR3OpsIdx],
+ &ARM::ValueMappings[ARM::DPR3OpsIdx]})
+ : getOperandsMapping({&ARM::ValueMappings[ARM::GPR3OpsIdx],
+ &ARM::ValueMappings[ARM::SPR3OpsIdx]});
+ break;
+ }
+ case G_SITOFP:
+ case G_UITOFP: {
+ LLT ToTy = MRI.getType(MI.getOperand(0).getReg());
+ LLT FromTy = MRI.getType(MI.getOperand(1).getReg());
+ if (FromTy.getSizeInBits() == 32 &&
+ (ToTy.getSizeInBits() == 32 || ToTy.getSizeInBits() == 64))
+ OperandsMapping =
+ ToTy.getSizeInBits() == 64
+ ? getOperandsMapping({&ARM::ValueMappings[ARM::DPR3OpsIdx],
+ &ARM::ValueMappings[ARM::GPR3OpsIdx]})
+ : getOperandsMapping({&ARM::ValueMappings[ARM::SPR3OpsIdx],
+ &ARM::ValueMappings[ARM::GPR3OpsIdx]});
+ break;
+ }
case G_CONSTANT:
case G_FRAME_INDEX:
case G_GLOBAL_VALUE: