Changes in directory llvm/lib/ExecutionEngine/Interpreter:
Execution.cpp updated: 1.162 -> 1.163 --- Log message: Implement bit-accurate sext instruction. This patch fixes test/Integer/2007-01-17-TruncSext.ll --- Diffs of the changes: (+14 -10) Execution.cpp | 24 ++++++++++++++---------- 1 files changed, 14 insertions(+), 10 deletions(-) Index: llvm/lib/ExecutionEngine/Interpreter/Execution.cpp diff -u llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.162 llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.163 --- llvm/lib/ExecutionEngine/Interpreter/Execution.cpp:1.162 Wed Jan 17 20:12:51 2007 +++ llvm/lib/ExecutionEngine/Interpreter/Execution.cpp Sat Jan 20 02:32:52 2007 @@ -1347,21 +1347,25 @@ assert(SBitWidth <= 64 && DBitWidth <= 64 && "Integer types > 64 bits not supported"); assert(SBitWidth < DBitWidth && "Invalid sign extend"); - int64_t Extended = 0; - if (SBitWidth == 1) - // For sign extension from bool, we must extend the source bits. - Extended = 0 - (Src.Int1Val & 1); - else if (SBitWidth <= 8) - Extended = (int64_t) (int8_t)Src.Int8Val; + + // Normalize to a 64-bit value. + uint64_t Normalized = 0; + if (SBitWidth <= 8) + Normalized = Src.Int8Val; else if (SBitWidth <= 16) - Extended = (int64_t) (int16_t)Src.Int16Val; + Normalized = Src.Int16Val; else if (SBitWidth <= 32) - Extended = (int64_t) (int32_t)Src.Int32Val; + Normalized = Src.Int32Val; else - Extended = (int64_t) Src.Int64Val; + Normalized = Src.Int64Val; + + // Now do the bit-accurate sign extension manually. + bool isSigned = (Normalized & (1 << (SBitWidth-1))) != 0; + if (isSigned) + Normalized |= ~SITy->getBitMask(); // Now that we have a sign extended value, assign it to the destination - INTEGER_ASSIGN(Dest, DBitWidth, Extended); + INTEGER_ASSIGN(Dest, DBitWidth, Normalized); return Dest; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits