diff options
author | Brian Gaeke <gaeke@uiuc.edu> | 2004-03-06 05:32:28 +0000 |
---|---|---|
committer | Brian Gaeke <gaeke@uiuc.edu> | 2004-03-06 05:32:28 +0000 |
commit | 08f64c3321e9103d7a9a29baf0158cfced4cadc1 (patch) | |
tree | e0503164c2082cd5da898608ba746a054fa67c82 /lib/Target/Sparc/SparcV8ISelSimple.cpp | |
parent | a8056fabebbc23c080b7cda81ca8f74eedc1a585 (diff) | |
download | external_llvm-08f64c3321e9103d7a9a29baf0158cfced4cadc1.zip external_llvm-08f64c3321e9103d7a9a29baf0158cfced4cadc1.tar.gz external_llvm-08f64c3321e9103d7a9a29baf0158cfced4cadc1.tar.bz2 |
Support return values of basic integer types.
Emit RETL instruction to return instead of funny JMPL.
Fix indentation.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12186 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/Sparc/SparcV8ISelSimple.cpp')
-rw-r--r-- | lib/Target/Sparc/SparcV8ISelSimple.cpp | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/lib/Target/Sparc/SparcV8ISelSimple.cpp b/lib/Target/Sparc/SparcV8ISelSimple.cpp index 5c145cb..ec331ee 100644 --- a/lib/Target/Sparc/SparcV8ISelSimple.cpp +++ b/lib/Target/Sparc/SparcV8ISelSimple.cpp @@ -227,12 +227,25 @@ bool V8ISel::runOnFunction(Function &Fn) { void V8ISel::visitReturnInst(ReturnInst &I) { - if (I.getNumOperands() == 0) { - // Just emit a 'jmpl' instruction to return. - BuildMI(BB, V8::JMPLi, 2, V8::G0).addZImm(8).addReg(V8::I7); - return; + if (I.getNumOperands () == 1) { + unsigned RetValReg = getReg (I.getOperand (0)); + switch (getClass (I.getOperand (0)->getType ())) { + case cByte: + case cShort: + case cInt: + // Schlep it over into i0 (where it will become o0 after restore). + BuildMI (BB, V8::ORrr, 2, V8::I0).addReg(V8::G0).addReg(RetValReg); + break; + default: + visitInstruction (I); + return; + } + } else if (I.getNumOperands () != 1) { + visitInstruction (I); } - visitInstruction(I); + // Just emit a 'retl' instruction to return. + BuildMI(BB, V8::RETL, 0); + return; } void V8ISel::visitBinaryOperator (BinaryOperator &I) { @@ -249,36 +262,36 @@ void V8ISel::visitBinaryOperator (BinaryOperator &I) { BuildMI (BB, V8::SUBrr, 2, ResultReg).addReg (Op0Reg).addReg (Op1Reg); break; default: - visitInstruction (I); + visitInstruction (I); return; } switch (getClass (I.getType ())) { case cByte: - if (I.getType ()->isSigned ()) { // add byte - BuildMI (BB, V8::ANDri, 2, DestReg).addReg (ResultReg).addZImm (0xff); - } else { // add ubyte - unsigned TmpReg = makeAnotherReg (I.getType ()); - BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (24); - BuildMI (BB, V8::SRAri, 2, DestReg).addReg (TmpReg).addZImm (24); - } + if (I.getType ()->isSigned ()) { // add byte + BuildMI (BB, V8::ANDri, 2, DestReg).addReg (ResultReg).addZImm (0xff); + } else { // add ubyte + unsigned TmpReg = makeAnotherReg (I.getType ()); + BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (24); + BuildMI (BB, V8::SRAri, 2, DestReg).addReg (TmpReg).addZImm (24); + } break; case cShort: - if (I.getType ()->isSigned ()) { // add short - unsigned TmpReg = makeAnotherReg (I.getType ()); - BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (16); - BuildMI (BB, V8::SRAri, 2, DestReg).addReg (TmpReg).addZImm (16); - } else { // add ushort - unsigned TmpReg = makeAnotherReg (I.getType ()); - BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (24); - BuildMI (BB, V8::SRLri, 2, DestReg).addReg (TmpReg).addZImm (24); - } + if (I.getType ()->isSigned ()) { // add short + unsigned TmpReg = makeAnotherReg (I.getType ()); + BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (16); + BuildMI (BB, V8::SRAri, 2, DestReg).addReg (TmpReg).addZImm (16); + } else { // add ushort + unsigned TmpReg = makeAnotherReg (I.getType ()); + BuildMI (BB, V8::SLLri, 2, TmpReg).addReg (ResultReg).addZImm (24); + BuildMI (BB, V8::SRLri, 2, DestReg).addReg (TmpReg).addZImm (24); + } break; case cInt: - BuildMI (BB, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg (ResultReg); + BuildMI (BB, V8::ORrr, 2, DestReg).addReg (V8::G0).addReg (ResultReg); break; default: - visitInstruction (I); + visitInstruction (I); return; } } |