Boost logo

Boost :

From: Michael Marcin (mmarcin_at_[hidden])
Date: 2007-09-10 00:26:03


Phil Endecott wrote:
> Guillaume Melquiond wrote:
>> 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; }
>
> Here's what I get on ARM:
>
> _Z8full_addjj:
> adds r2, r1, r2
> movcc r1, #0
> movcs r1, #1
> str r2, [r0, #0]
> strb r1, [r0, #4]
> mov pc, lr
>
> _Z11no_overflowjj:
> cmn r0, r1
> movcs r0, #0
> movcc r0, #1
> mov pc, lr
>
>

RVCT 2.2 with --arm and -O2

Gives:

_Z8full_addjj PROC
         PUSH {r2,r3,lr}
         ADD r2,r1,r2
         CMP r2,r1
         MOVCS r1,#0
         MOVCC r1,#1
         STR r1,[sp,#0]
         STR r2,[sp,#4]
         STR r2,[r0,#0]
         LDRB r1,[sp,#0]
         STRB r1,[r0,#4]
         POP {r3,r12,pc}
         ENDP

_Z11no_overflowjj PROC
         PUSH {r0-r3,lr}
         MOV r2,r1
         MOV r1,r0
         ADD r0,sp,#8
         BL _Z8full_addjj
         LDR r0,[sp,#8]
         LDR r1,[sp,#0xc]
         STM sp,{r0,r1}
         LDRB r0,[sp,#4]
         RSBS r0,r0,#1
         MOVCC r0,#0
         POP {r1-r3,r12,pc}
         ENDP

Seems just a tad worse than what you got :)
What GCC did you use?

Thanks,

Michael Marcin


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk