Get rid of all symbolic loads. I now do gernate all relocations sequences
rather than relying on the assembler. Only a few more pseudo instructions
left. Also merge load code paths.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22305 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/Alpha/AlphaISelPattern.cpp b/lib/Target/Alpha/AlphaISelPattern.cpp
index 43bc1b8..112872c 100644
--- a/lib/Target/Alpha/AlphaISelPattern.cpp
+++ b/lib/Target/Alpha/AlphaISelPattern.cpp
@@ -92,9 +92,10 @@
setOperationAction(ISD::BRCONDTWOWAY, MVT::Other, Expand);
setOperationAction(ISD::EXTLOAD, MVT::i1, Promote);
+ setOperationAction(ISD::EXTLOAD, MVT::f32, Expand);
- setOperationAction(ISD::ZEXTLOAD, MVT::i1 , Expand);
- setOperationAction(ISD::ZEXTLOAD, MVT::i32 , Expand);
+ setOperationAction(ISD::ZEXTLOAD, MVT::i1, Expand);
+ setOperationAction(ISD::ZEXTLOAD, MVT::i32, Expand);
setOperationAction(ISD::SEXTLOAD, MVT::i1, Expand);
setOperationAction(ISD::SEXTLOAD, MVT::i8, Expand);
@@ -844,26 +845,6 @@
return l - h * IMM_MULT;
}
-static unsigned GetSymVersion(unsigned opcode)
-{
- switch (opcode) {
- default: assert(0 && "unknown load or store"); return 0;
- case Alpha::LDQ: return Alpha::LDQ_SYM;
- case Alpha::LDS: return Alpha::LDS_SYM;
- case Alpha::LDT: return Alpha::LDT_SYM;
- case Alpha::LDL: return Alpha::LDL_SYM;
- case Alpha::LDBU: return Alpha::LDBU_SYM;
- case Alpha::LDWU: return Alpha::LDWU_SYM;
- case Alpha::LDW: return Alpha::LDW_SYM;
- case Alpha::LDB: return Alpha::LDB_SYM;
- case Alpha::STQ: return Alpha::STQ_SYM;
- case Alpha::STS: return Alpha::STS_SYM;
- case Alpha::STT: return Alpha::STT_SYM;
- case Alpha::STL: return Alpha::STL_SYM;
- case Alpha::STW: return Alpha::STW_SYM;
- case Alpha::STB: return Alpha::STB_SYM;
- }
-}
static unsigned GetRelVersion(unsigned opcode)
{
switch (opcode) {
@@ -1212,74 +1193,6 @@
BuildMI(BB, Alpha::CVTST, 1, Result).addReg(Tmp1);
return Result;
- case ISD::CopyFromReg:
- {
- // Make sure we generate both values.
- if (Result != notIn)
- ExprMap[N.getValue(1)] = notIn; // Generate the token
- else
- Result = ExprMap[N.getValue(0)] = MakeReg(N.getValue(0).getValueType());
-
- SDOperand Chain = N.getOperand(0);
-
- Select(Chain);
- unsigned r = dyn_cast<RegSDNode>(Node)->getReg();
- //std::cerr << "CopyFromReg " << Result << " = " << r << "\n";
- BuildMI(BB, Alpha::CPYS, 2, Result).addReg(r).addReg(r);
- return Result;
- }
-
- case ISD::LOAD:
- {
- // Make sure we generate both values.
- if (Result != notIn)
- ExprMap[N.getValue(1)] = notIn; // Generate the token
- else
- Result = ExprMap[N.getValue(0)] = MakeReg(N.getValue(0).getValueType());
-
- DestType = N.getValue(0).getValueType();
-
- SDOperand Chain = N.getOperand(0);
- SDOperand Address = N.getOperand(1);
- Select(Chain);
- Opc = DestType == MVT::f64 ? Alpha::LDT : Alpha::LDS;
-
- if (EnableAlphaLSMark)
- {
- int i = getValueOffset(dyn_cast<SrcValueSDNode>(N.getOperand(2))
- ->getValue());
- int j = getFunctionOffset(BB->getParent()->getFunction());
- BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
- }
-
- if (Address.getOpcode() == ISD::GlobalAddress) {
- AlphaLowering.restoreGP(BB);
- Opc = GetSymVersion(Opc);
- has_sym = true;
- BuildMI(BB, Opc, 1, Result)
- .addGlobalAddress(cast<GlobalAddressSDNode>(Address)->getGlobal());
- }
- else if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(Address)) {
- AlphaLowering.restoreGP(BB);
- Opc = GetRelVersion(Opc);
- has_sym = true;
- Tmp1 = MakeReg(MVT::i64);
- BuildMI(BB, Alpha::LDAHr, 2, Tmp1).addConstantPoolIndex(CP->getIndex())
- .addReg(Alpha::R29);
- BuildMI(BB, Opc, 2, Result).addConstantPoolIndex(CP->getIndex())
- .addReg(Tmp1);
- }
- else if(Address.getOpcode() == ISD::FrameIndex) {
- BuildMI(BB, Opc, 2, Result)
- .addFrameIndex(cast<FrameIndexSDNode>(Address)->getIndex())
- .addReg(Alpha::F31);
- } else {
- long offset;
- SelectAddr(Address, Tmp1, offset);
- BuildMI(BB, Opc, 2, Result).addImm(offset).addReg(Tmp1);
- }
- return Result;
- }
case ISD::ConstantFP:
if (ConstantFPSDNode *CN = dyn_cast<ConstantFPSDNode>(N)) {
if (CN->isExactlyValue(+0.0)) {
@@ -1323,63 +1236,6 @@
}
return Result;
- case ISD::EXTLOAD:
- {
- //include a conversion sequence for float loads to double
- if (Result != notIn)
- ExprMap[N.getValue(1)] = notIn; // Generate the token
- else
- Result = ExprMap[N.getValue(0)] = MakeReg(N.getValue(0).getValueType());
-
- Tmp1 = MakeReg(MVT::f32);
-
- assert(cast<MVTSDNode>(Node)->getExtraValueType() == MVT::f32 &&
- "EXTLOAD not from f32");
- assert(Node->getValueType(0) == MVT::f64 && "EXTLOAD not to f64");
-
- SDOperand Chain = N.getOperand(0);
- SDOperand Address = N.getOperand(1);
- Select(Chain);
-
- if (EnableAlphaLSMark)
- {
- int i = getValueOffset(dyn_cast<SrcValueSDNode>(N.getOperand(2))
- ->getValue());
- int j = getFunctionOffset(BB->getParent()->getFunction());
- BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
- }
-
- if (Address.getOpcode() == ISD::GlobalAddress) {
- AlphaLowering.restoreGP(BB);
- has_sym = true;
- BuildMI(BB, Alpha::LDS_SYM, 1, Tmp1)
- .addGlobalAddress(cast<GlobalAddressSDNode>(Address)->getGlobal());
- }
- else if (ConstantPoolSDNode *CP =
- dyn_cast<ConstantPoolSDNode>(N.getOperand(1)))
- {
- AlphaLowering.restoreGP(BB);
- has_sym = true;
- Tmp2 = MakeReg(MVT::i64);
- BuildMI(BB, Alpha::LDAHr, 2, Tmp2).addConstantPoolIndex(CP->getIndex())
- .addReg(Alpha::R29);
- BuildMI(BB, Alpha::LDSr, 2, Tmp1).addConstantPoolIndex(CP->getIndex())
- .addReg(Tmp2);
- }
- else if(Address.getOpcode() == ISD::FrameIndex) {
- Tmp2 = cast<FrameIndexSDNode>(Address)->getIndex();
- BuildMI(BB, Alpha::LDS, 2, Tmp1)
- .addFrameIndex(cast<FrameIndexSDNode>(Address)->getIndex())
- .addReg(Alpha::F31);
- } else {
- long offset;
- SelectAddr(Address, Tmp2, offset);
- BuildMI(BB, Alpha::LDS, 1, Tmp1).addImm(offset).addReg(Tmp2);
- }
- BuildMI(BB, Alpha::CVTST, 1, Result).addReg(Tmp1);
- return Result;
- }
-
case ISD::SINT_TO_FP:
{
assert (N.getOperand(0).getValueType() == MVT::i64
@@ -1425,17 +1281,10 @@
}
}
- if ((DestType == MVT::f64 || DestType == MVT::f32 ||
- (
- (opcode == ISD::LOAD || opcode == ISD::CopyFromReg ||
- opcode == ISD::EXTLOAD) &&
- (N.getValue(0).getValueType() == MVT::f32 ||
- N.getValue(0).getValueType() == MVT::f64)
- ))
- && opcode != ISD::CALL && opcode != ISD::TAILCALL
- )
+ if ((DestType == MVT::f64 || DestType == MVT::f32)
+ && opcode != ISD::CALL && opcode != ISD::TAILCALL)
return SelectExprFP(N, Result);
-
+
switch (opcode) {
default:
Node->dump();
@@ -1550,10 +1399,15 @@
SDOperand Address = N.getOperand(1);
Select(Chain);
- assert(Node->getValueType(0) == MVT::i64 &&
- "Unknown type to sign extend to.");
+ bool fpext = true;
+
if (opcode == ISD::LOAD)
- Opc = Alpha::LDQ;
+ switch (Node->getValueType(0)) {
+ default: Node->dump(); assert(0 && "Bad load!");
+ case MVT::i64: Opc = Alpha::LDQ; break;
+ case MVT::f64: Opc = Alpha::LDT; break;
+ case MVT::f32: Opc = Alpha::LDS; break;
+ }
else
switch (cast<MVTSDNode>(Node)->getExtraValueType()) {
default: Node->dump(); assert(0 && "Bad sign extend!");
@@ -1566,38 +1420,50 @@
assert(opcode != ISD::SEXTLOAD && "Not zext"); break;
}
- if (EnableAlphaLSMark)
- {
- int i = getValueOffset(dyn_cast<SrcValueSDNode>(N.getOperand(2))
- ->getValue());
- int j = getFunctionOffset(BB->getParent()->getFunction());
- BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
+ int i = 0, j = 0;
+ if (EnableAlphaLSMark) {
+ i = getValueOffset(dyn_cast<SrcValueSDNode>(N.getOperand(2))
+ ->getValue());
+ j = getFunctionOffset(BB->getParent()->getFunction());
}
-
- if (Address.getOpcode() == ISD::GlobalAddress) {
+ if (GlobalAddressSDNode *GASD =
+ dyn_cast<GlobalAddressSDNode>(Address)) {
+ if (GASD->getGlobal()->isExternal()) {
+ Tmp1 = SelectExpr(Address);
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
+ BuildMI(BB, Opc, 2, Result).addImm(0).addReg(Tmp1);
+ } else {
+ Tmp1 = MakeReg(MVT::i64);
+ AlphaLowering.restoreGP(BB);
+ BuildMI(BB, Alpha::LDAHr, 2, Tmp1)
+ .addGlobalAddress(GASD->getGlobal()).addReg(Alpha::R29);
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
+ BuildMI(BB, GetRelVersion(Opc), 2, Result)
+ .addGlobalAddress(GASD->getGlobal()).addReg(Tmp1);
+ }
+ } else if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(Address)) {
AlphaLowering.restoreGP(BB);
- Opc = GetSymVersion(Opc);
- has_sym = true;
- BuildMI(BB, Opc, 1, Result)
- .addGlobalAddress(cast<GlobalAddressSDNode>(Address)->getGlobal());
- }
- else if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(Address)) {
- AlphaLowering.restoreGP(BB);
- Opc = GetRelVersion(Opc);
has_sym = true;
Tmp1 = MakeReg(MVT::i64);
BuildMI(BB, Alpha::LDAHr, 2, Tmp1).addConstantPoolIndex(CP->getIndex())
.addReg(Alpha::R29);
- BuildMI(BB, Opc, 2, Result).addConstantPoolIndex(CP->getIndex())
- .addReg(Tmp1);
- }
- else if(Address.getOpcode() == ISD::FrameIndex) {
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
+ BuildMI(BB, GetRelVersion(Opc), 2, Result)
+ .addConstantPoolIndex(CP->getIndex()).addReg(Tmp1);
+ } else if(Address.getOpcode() == ISD::FrameIndex) {
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
BuildMI(BB, Opc, 2, Result)
.addFrameIndex(cast<FrameIndexSDNode>(Address)->getIndex())
.addReg(Alpha::F31);
} else {
long offset;
SelectAddr(Address, Tmp1, offset);
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
BuildMI(BB, Opc, 2, Result).addImm(offset).addReg(Tmp1);
}
return Result;
@@ -1606,7 +1472,11 @@
case ISD::GlobalAddress:
AlphaLowering.restoreGP(BB);
has_sym = true;
- BuildMI(BB, Alpha::LDQrl, 2, Result)
+
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 3).addImm(0).addImm(0).addImm(getUID());
+
+ BuildMI(BB, Alpha::LDQl, 2, Result)
.addGlobalAddress(cast<GlobalAddressSDNode>(N)->getGlobal())
.addReg(Alpha::R29);
return Result;
@@ -1922,7 +1792,10 @@
Select(Chain);
unsigned r = dyn_cast<RegSDNode>(Node)->getReg();
//std::cerr << "CopyFromReg " << Result << " = " << r << "\n";
- BuildMI(BB, Alpha::BIS, 2, Result).addReg(r).addReg(r);
+ if (DestType == MVT::f32 || DestType == MVT::f64)
+ BuildMI(BB, Alpha::CPYS, 2, Result).addReg(r).addReg(r);
+ else
+ BuildMI(BB, Alpha::BIS, 2, Result).addReg(r).addReg(r);
return Result;
}
@@ -2422,32 +2295,24 @@
}
}
- if (EnableAlphaLSMark)
- {
- int i =
+ int i = 0, j = 0;
+ if (EnableAlphaLSMark) {
+ i =
getValueOffset(dyn_cast<SrcValueSDNode>(N.getOperand(3))->getValue());
- int j = getFunctionOffset(BB->getParent()->getFunction());
- BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
+ j = getFunctionOffset(BB->getParent()->getFunction());
}
- if (Address.getOpcode() == ISD::GlobalAddress)
- {
- AlphaLowering.restoreGP(BB);
- Opc = GetSymVersion(Opc);
- has_sym = true;
- BuildMI(BB, Opc, 2).addReg(Tmp1)
- .addGlobalAddress(cast<GlobalAddressSDNode>(Address)->getGlobal());
- }
- else if(Address.getOpcode() == ISD::FrameIndex)
- {
+ if(Address.getOpcode() == ISD::FrameIndex) {
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
BuildMI(BB, Opc, 3).addReg(Tmp1)
.addFrameIndex(cast<FrameIndexSDNode>(Address)->getIndex())
.addReg(Alpha::F31);
- }
- else
- {
+ } else {
long offset;
SelectAddr(Address, Tmp2, offset);
+ if (EnableAlphaLSMark)
+ BuildMI(BB, Alpha::MEMLABEL, 3).addImm(j).addImm(i).addImm(getUID());
BuildMI(BB, Opc, 3).addReg(Tmp1).addImm(offset).addReg(Tmp2);
}
return;