[llvm-commits] [llvm] r100233 - in /llvm/trunk: ./ include/llvm/Support/ lib/Target/ARM/ lib/Target/ARM/Disassembler/ test/MC/Disassembler/ utils/TableGen/

Jakob Stoklund Olesen stoklund at 2pi.dk
Sun Apr 4 18:59:45 PDT 2010


On Apr 4, 2010, at 6:48 PM, Johnny Chen wrote:

> Hi Jakob,
> 
> Thanks.  You're welcome to modify the MathExtras.h stuff.
> Right now, arm disassembler is the only client of SignExtend32<B>(int32_t x).
> I originally use a bit-field hack but Chris thinks it is non-portable.

How about this?

  return x | -(x & (1 << (B - 1)));


> 
> On Apr 4, 2010, at 6:31 PM, Jakob Stoklund Olesen wrote:
> 
>> 
>> On Apr 2, 2010, at 3:27 PM, Johnny Chen wrote:
>> 
>>> Modified: llvm/trunk/include/llvm/Support/MathExtras.h
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/MathExtras.h?rev=100233&r1=100232&r2=100233&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/include/llvm/Support/MathExtras.h (original)
>>> +++ llvm/trunk/include/llvm/Support/MathExtras.h Fri Apr  2 17:27:38 2010
>>> @@ -457,6 +457,18 @@
>>> return (x < 0) ? -x : x;
>>> }
>>> 
>>> +/// SignExtend32 - Sign extend B-bit number x to 32-bit int.
>>> +/// Usage int32_t r = SignExtend32<5>(x);
>>> +template <unsigned B> inline int32_t SignExtend32(int32_t x) {
>>> +  return (x << (32 - B)) >> (32 - B);
>>> +}
>>> +
>>> +/// SignExtend64 - Sign extend B-bit number x to 64-bit int.
>>> +/// Usage int64_t r = SignExtend64<5>(x);
>>> +template <unsigned B> inline int64_t SignExtend64(int32_t x) {
>> 
>> Should be (int64_t x).
>> 
>>> +  return (x << (64 - B)) >> (64 - B);
>>> +}
>>> +
>> 
>> I wonder if this is safe? These functions depend on signed overflow which is undefined behavior.
>> 
> 





More information about the llvm-commits mailing list