diff options
| author | Anton Korobeynikov <asl@math.spbu.ru> | 2009-07-14 09:53:14 +0000 |
|---|---|---|
| committer | Anton Korobeynikov <asl@math.spbu.ru> | 2009-07-14 09:53:14 +0000 |
| commit | ba70a9b0c7988808e0fc478a84e9845d96ba464b (patch) | |
| tree | ba37dec3ed161080180269ac001b4b44def0d758 | |
| parent | 1c0fecfcc3a3d56bbada9449153bb60e4fef8b4e (diff) | |
| download | bcm5719-llvm-ba70a9b0c7988808e0fc478a84e9845d96ba464b.tar.gz bcm5719-llvm-ba70a9b0c7988808e0fc478a84e9845d96ba464b.zip | |
Add extra sign extension to the same bit width before int sign
extension to another bit width. This is needed to get correct singed value.
Patch by Artur Pietrek!
llvm-svn: 75629
| -rw-r--r-- | llvm/lib/Target/MSIL/MSILWriter.cpp | 14 | ||||
| -rw-r--r-- | llvm/lib/Target/MSIL/MSILWriter.h | 2 |
2 files changed, 13 insertions, 3 deletions
diff --git a/llvm/lib/Target/MSIL/MSILWriter.cpp b/llvm/lib/Target/MSIL/MSILWriter.cpp index 61ec0283045..81e5cd4aec0 100644 --- a/llvm/lib/Target/MSIL/MSILWriter.cpp +++ b/llvm/lib/Target/MSIL/MSILWriter.cpp @@ -670,12 +670,18 @@ void MSILWriter::printIndirectSave(const Type* Ty) { void MSILWriter::printCastInstruction(unsigned int Op, const Value* V, - const Type* Ty) { + const Type* Ty, const Type* SrcTy) { std::string Tmp(""); printValueLoad(V); switch (Op) { // Signed case Instruction::SExt: + // If sign extending int, convert first from unsigned to signed + // with the same bit size - because otherwise we will loose the sign. + if (SrcTy) { + Tmp = "conv."+getTypePostfix(SrcTy,false,true); + printSimpleInstruction(Tmp.c_str()); + } case Instruction::SIToFP: case Instruction::FPToSI: Tmp = "conv."+getTypePostfix(Ty,false,true); @@ -1152,9 +1158,13 @@ void MSILWriter::printInstruction(const Instruction* Inst) { case Instruction::Store: printIndirectSave(Inst->getOperand(1), Inst->getOperand(0)); break; + case Instruction::SExt: + printCastInstruction(Inst->getOpcode(),Left, + cast<CastInst>(Inst)->getDestTy(), + cast<CastInst>(Inst)->getSrcTy()); + break; case Instruction::Trunc: case Instruction::ZExt: - case Instruction::SExt: case Instruction::FPTrunc: case Instruction::FPExt: case Instruction::UIToFP: diff --git a/llvm/lib/Target/MSIL/MSILWriter.h b/llvm/lib/Target/MSIL/MSILWriter.h index 2ef8a85d2bc..ea0dfad0e46 100644 --- a/llvm/lib/Target/MSIL/MSILWriter.h +++ b/llvm/lib/Target/MSIL/MSILWriter.h @@ -187,7 +187,7 @@ namespace { void printIndirectSave(const Type* Ty); void printCastInstruction(unsigned int Op, const Value* V, - const Type* Ty); + const Type* Ty, const Type* SrcTy=0); void printGepInstruction(const Value* V, gep_type_iterator I, gep_type_iterator E); |

