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!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75629 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Anton Korobeynikov 2009-07-14 09:53:14 +00:00
parent e9fd67e2c6
commit 94ac0343cc
2 changed files with 13 additions and 3 deletions

View File

@ -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:

View File

@ -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);