diff options
author | Chris Lattner <sabre@nondot.org> | 2006-01-16 01:40:00 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-01-16 01:40:00 +0000 |
commit | 99cf50937d55381fbcdb506e61fb46ade774e7ee (patch) | |
tree | b9480b32db67d28647ae3a2d87334deec9d07a00 /lib | |
parent | bf2d595dca1b7cd79143f59497b496033c27903e (diff) | |
download | external_llvm-99cf50937d55381fbcdb506e61fb46ade774e7ee.zip external_llvm-99cf50937d55381fbcdb506e61fb46ade774e7ee.tar.gz external_llvm-99cf50937d55381fbcdb506e61fb46ade774e7ee.tar.bz2 |
Silly Sparc is big endian. If we have to load args out of incoming stack slots
that are smaller than an int, make sure to adjust the frame pointer to take
this into consideration.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25351 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/Sparc/SparcISelDAGToDAG.cpp | 4 | ||||
-rw-r--r-- | lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp | 4 |
2 files changed, 8 insertions, 0 deletions
diff --git a/lib/Target/Sparc/SparcISelDAGToDAG.cpp b/lib/Target/Sparc/SparcISelDAGToDAG.cpp index 08c6636..e09b308 100644 --- a/lib/Target/Sparc/SparcISelDAGToDAG.cpp +++ b/lib/Target/Sparc/SparcISelDAGToDAG.cpp @@ -241,6 +241,10 @@ SparcV8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) { unsigned LoadOp = I->getType()->isSigned() ? ISD::SEXTLOAD : ISD::ZEXTLOAD; + // Sparc is big endian, so add an offset based on the ObjectVT. + unsigned Offset = 4-std::max(1U, MVT::getSizeInBits(ObjectVT)/8); + FIPtr = DAG.getNode(ISD::ADD, MVT::i32, FIPtr, + DAG.getConstant(Offset, MVT::i32)); Load = DAG.getExtLoad(LoadOp, MVT::i32, Root, FIPtr, DAG.getSrcValue(0), ObjectVT); Load = DAG.getNode(ISD::TRUNCATE, ObjectVT, Load); diff --git a/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp b/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp index 08c6636..e09b308 100644 --- a/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp +++ b/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp @@ -241,6 +241,10 @@ SparcV8TargetLowering::LowerArguments(Function &F, SelectionDAG &DAG) { unsigned LoadOp = I->getType()->isSigned() ? ISD::SEXTLOAD : ISD::ZEXTLOAD; + // Sparc is big endian, so add an offset based on the ObjectVT. + unsigned Offset = 4-std::max(1U, MVT::getSizeInBits(ObjectVT)/8); + FIPtr = DAG.getNode(ISD::ADD, MVT::i32, FIPtr, + DAG.getConstant(Offset, MVT::i32)); Load = DAG.getExtLoad(LoadOp, MVT::i32, Root, FIPtr, DAG.getSrcValue(0), ObjectVT); Load = DAG.getNode(ISD::TRUNCATE, ObjectVT, Load); |