Optimise non-native 128-bit addition in int128.h.

On platforms without native 128-bit integer support, simplify the test
for carry in int128_add_uint64() by noting that the low-part addition
is unsigned integer arithmetic, which is just modular arithmetic.
Therefore the test for carry can simply be written as "new value < old
value" (i.e., a test for modular wrap-around). This can then be made
branchless so that on modern compilers it produces the same machine
instructions as native 128-bit addition, making it significantly
simpler and faster.

Similarly, the test for carry in int128_add_int64() can be written in
much the same way, but with an extra term to compensate for the sign
of the value being added. Again, on modern compilers this leads to
branchless code, often identical to the native 128-bit integer
addition machine code.

Author: Dean Rasheed <dean.a.rash...@gmail.com>
Reviewed-by: John Naylor <johncnaylo...@gmail.com>
Discussion: 
https://postgr.es/m/caezatcwgbmc9zwkmyqqpaqz2x6gaamyrb+rnmsuncdmcl2m...@mail.gmail.com

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/d9bb8ef093d62763cfd19d37e6bb8182998a3f88

Modified Files
--------------
src/include/common/int128.h | 36 ++++++++++++++++--------------------
1 file changed, 16 insertions(+), 20 deletions(-)

Reply via email to