[cfe-dev] [RFC] Introduce overflow builtins

Dave Zarzycki zarzycki at apple.com
Sun Apr 1 23:55:59 PDT 2012

On Apr 1, 2012, at 10:59 PM, Xi Wang <xi.wang at gmail.com> wrote:

>> 1) Make __builtin_mul_with_overflow() return the "high" half of the result instead of a bool. You should be able to use the normal LLVM multiplication intrinsics for this instead of llvm.*mul.with.overflow.*.
> I guess you mean something like MSVC's intrinsics:
> __int64 _mul128( 
>   __int64 Multiplier, 
>   __int64 Multiplicand, 
>   __int64 *HighProduct 
> );
> __int64 __mulh( 
>   __int64 a, 
>   __int64 b 
> );
> http://msdn.microsoft.com/en-us/library/82cxdw50.aspx
> http://msdn.microsoft.com/en-us/library/17wa28cw.aspx
> I don't think you need a new builtin here.  For example, converting a and b to __int128_t should do the trick.

What do you do when you want to overflow check __int128_t arithmetic? More on this topic below...

>> 2) Make __builtin_*_with_overflow work with 8-bit integers.
> Actually I doubt if types smaller than `int' would require overflow checking in practice..

In practice? Well maybe not your code, but for many others the lack of 8-bit support makes using the __builtin_*_with_overflow() intrinsics in generic code much harder and much uglier.

>> 3) Add __builtin_add_with_carry() and __builtin_sub_with_borrow().
> What could benefit from them?

With the overflow intrinsics that you are proposing, you've solved half of the work required to writing a straightforward, efficient, and somewhat portable "Big Number" library. :-)

For example, 128-bit or larger integers could have been solved in a library instead of directly in the compiler if these intrinsics were available.


More information about the cfe-dev mailing list