
Le samedi 08 septembre 2007 à 23:10 -0400, Daryle Walker a écrit :
Maybe we should add a header to our detail (and/or pending) folder encapsulating the full versions of built-in integer arithmetic operations, that most(?) processors have, but neither C nor C++ let us access. I'm talking about functions like:
std::pair<unsigned, bool> full_add( unsigned a1, unsigned a2 );
The processor has a "carry" flag whenever an integer addition overflows, but we can't access it (without assembly-language hacks).
Is it really worth it? Nowadays, compilers are smart enough. They generate better code when details are not obfuscated by hand-crafted assembly code. I tested the following code with GCC: #include <algorithm> std::pair<unsigned, bool> full_add(unsigned a, unsigned b) { return std::make_pair(a + b, a + b < a); } bool no_overflow(unsigned a, unsigned b) { return !full_add(a, b).second; } The no_overflow function is a bit dumb, but it is here to check that the compiler was able to perform optimizations. This is the generated code on x86-64: _Z11no_overflowjj: addl %edi, %esi setae %al ret This is the optimal assembly code. And there is no way to obtain this code if you use an assembly hack in the full_add function. Best regards, Guillaume