summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Korobeynikov <asl@math.spbu.ru>2009-07-14 09:53:14 +0000
committerAnton Korobeynikov <asl@math.spbu.ru>2009-07-14 09:53:14 +0000
commitba70a9b0c7988808e0fc478a84e9845d96ba464b (patch)
treeba37dec3ed161080180269ac001b4b44def0d758
parent1c0fecfcc3a3d56bbada9449153bb60e4fef8b4e (diff)
downloadbcm5719-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.cpp14
-rw-r--r--llvm/lib/Target/MSIL/MSILWriter.h2
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);
OpenPOWER on IntegriCloud