aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target
diff options
context:
space:
mode:
authorVikram S. Adve <vadve@cs.uiuc.edu>2003-07-25 21:08:58 +0000
committerVikram S. Adve <vadve@cs.uiuc.edu>2003-07-25 21:08:58 +0000
commite9a567cc77fbedf8f9219e441130dd28f444da2e (patch)
tree3ed868593e86cd2cc588e7588546ba73351cdac1 /lib/Target
parentbc001b24a17a2329dfd96bc22b8862b645603058 (diff)
downloadexternal_llvm-e9a567cc77fbedf8f9219e441130dd28f444da2e.zip
external_llvm-e9a567cc77fbedf8f9219e441130dd28f444da2e.tar.gz
external_llvm-e9a567cc77fbedf8f9219e441130dd28f444da2e.tar.bz2
1. Fix a case that was marking the invalid reg. num. (-1) as used,
causing a nasty array bound error later. 2. Fix silly typo causing logical shift of unsigned long to use SRL instead of SRLX. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7330 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r--lib/Target/SparcV9/SparcV9InstrSelection.cpp49
1 files changed, 35 insertions, 14 deletions
diff --git a/lib/Target/SparcV9/SparcV9InstrSelection.cpp b/lib/Target/SparcV9/SparcV9InstrSelection.cpp
index 0dbdb1b..6692550 100644
--- a/lib/Target/SparcV9/SparcV9InstrSelection.cpp
+++ b/lib/Target/SparcV9/SparcV9InstrSelection.cpp
@@ -1538,7 +1538,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
BuildMI(V9::JMPLRETi, 3).addReg(returnAddrTmp).addSImm(8)
.addMReg(target.getRegInfo().getZeroRegNum(), MOTy::Def);
- // If ther is a value to return, we need to:
+ // If there is a value to return, we need to:
// (a) Sign-extend the value if it is smaller than 8 bytes (reg size)
// (b) Insert a copy to copy the return value to the appropriate reg.
// -- For FP values, create a FMOVS or FMOVD instruction
@@ -1580,7 +1580,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
new TmpInstruction(mcfi, retValToUse, NULL, "argReg");
retMI->addImplicitRef(retVReg);
-
+
if (retType->isFloatingPoint())
M = (BuildMI(retType==Type::FloatTy? V9::FMOVS : V9::FMOVD, 2)
.addReg(retValToUse).addReg(retVReg, MOTy::Def));
@@ -2511,7 +2511,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
CallArgInfo& argInfo = argDesc->getArgInfo(argNo);
Value* argVal = argInfo.getArgVal(); // don't use callInstr arg here
const Type* argType = argVal->getType();
- unsigned regType = regInfo.getRegType(argType);
+ unsigned regType = regInfo.getRegTypeForDataType(argType);
unsigned argSize = target.getTargetData().getTypeSize(argType);
int regNumForArg = TargetRegInfo::getInvalidRegNum();
unsigned regClassIDOfArgReg;
@@ -2523,15 +2523,31 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
// K = #integer argument registers.
bool isFPArg = argVal->getType()->isFloatingPoint();
if (isVarArgs && isFPArg) {
- // If it is a function with no prototype, pass value
- // as an FP value as well as a varargs value
- if (noPrototype)
- argInfo.setUseFPArgReg();
-
- // If this arg. is in the first $K$ regs, add copy-
+
+ if (noPrototype) {
+ // It is a function with no prototype: pass value
+ // as an FP value as well as a varargs value. The FP value
+ // may go in a register or on the stack. The copy instruction
+ // to the outgoing reg/stack is created by the normal argument
+ // handling code since this is the "normal" passing mode.
+ //
+ regNumForArg = regInfo.regNumForFPArg(regType,
+ false, false, argNo,
+ regClassIDOfArgReg);
+ if (regNumForArg == regInfo.getInvalidRegNum())
+ argInfo.setUseStackSlot();
+ else
+ argInfo.setUseFPArgReg();
+ }
+
+ // If this arg. is in the first $K$ regs, add special copy-
// float-to-int instructions to pass the value as an int.
- // To check if it is in teh first $K$, get the register
- // number for the arg #i.
+ // To check if it is in the first $K$, get the register
+ // number for the arg #i. These copy instructions are
+ // generated here because they are extra cases and not needed
+ // for the normal argument handling (some code reuse is
+ // possible though -- later).
+ //
int copyRegNum = regInfo.regNumForIntArg(false, false, argNo,
regClassIDOfArgReg);
if (copyRegNum != regInfo.getInvalidRegNum()) {
@@ -2543,7 +2559,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
argVal, NULL,
"argRegCopy");
callMI->addImplicitRef(argVReg);
-
+
// Get a temp stack location to use to copy
// float-to-int via the stack.
//
@@ -2630,7 +2646,9 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
M = BuildMI(storeOpCode, 3).addReg(argVal)
.addMReg(regInfo.getStackPointer()).addSImm(argOffset);
mvec.push_back(M);
- } else {
+ }
+ else if (regNumForArg != regInfo.getInvalidRegNum()) {
+
// Create a virtual register to represent the arg reg. Mark
// this vreg as being an implicit operand of the call MI.
TmpInstruction* argVReg =
@@ -2656,6 +2674,9 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
mvec.push_back(M);
}
+ else
+ assert(argInfo.getArgCopy() != regInfo.getInvalidRegNum() &&
+ "Arg. not in stack slot, primary or secondary register?");
}
// add call instruction and delay slot before copying return value
@@ -2736,7 +2757,7 @@ GetInstructionsByRule(InstructionNode* subtreeRoot,
"Shr unsupported for other types");
Add3OperandInstr(opType->isSigned()
? (opType == Type::LongTy ? V9::SRAXr6 : V9::SRAr5)
- : (opType == Type::LongTy ? V9::SRLXr6 : V9::SRLr5),
+ : (opType == Type::ULongTy ? V9::SRLXr6 : V9::SRLr5),
subtreeRoot, mvec);
break;
}