MacOS 10.5 ============= begin of test.cpp ================= #include <stdio.h>
#include <libkern/OSAtomic.h> typedef int32_t atomicord32; static inline atomicord32 __attribute__((always_inline)) /*atomicord32 */AtomicIncrement(volatile atomicord32 *paoDestination) { return OSAtomicIncrement32Barrier(paoDestination); } bool TestAtomic_Increment() { bool bResult = false; do { volatile atomicord32 aoStorage = (atomicord32)(-1); if (AtomicIncrement(&aoStorage) != (atomicord32)0 || aoStorage != (atomicord32)0) { break; } if (AtomicIncrement(&aoStorage) != (atomicord32)1 || aoStorage != (atomicord32)1) { break; } bResult = true; } while (false); return bResult; } int main() { bool bTestResult = TestAtomic_Increment(); printf("%d\n", (int)(bTestResult ? 1 : 0)); return 0; } ============= end of test.cpp ================= with "-m64" TestAtomic_Increment compiles to ================ 0x00000001000026e0 <_Z20TestAtomic_Incrementv+0>: mflr r0 0x00000001000026e4 <_Z20TestAtomic_Incrementv+4>: std r30,-16(r1) 0x00000001000026e8 <_Z20TestAtomic_Incrementv+8>: std r0,16(r1) 0x00000001000026ec <_Z20TestAtomic_Incrementv+12>: stdu r1,-160(r1) 0x00000001000026f0 <_Z20TestAtomic_Incrementv+16>: mr r30,r1 0x00000001000026f4 <_Z20TestAtomic_Incrementv+20>: li r0,0 0x00000001000026f8 <_Z20TestAtomic_Incrementv+24>: stb r0,112(r30) 0x00000001000026fc <_Z20TestAtomic_Incrementv+28>: li r0,-1 0x0000000100002700 <_Z20TestAtomic_Incrementv+32>: stw r0,116(r30) 0x0000000100002704 <_Z20TestAtomic_Incrementv+36>: addi r0,r30,116 0x0000000100002708 <_Z20TestAtomic_Incrementv+40>: mr r3,r0 0x000000010000270c <_Z20TestAtomic_Incrementv+44>: bl 0x1000017c4 <AtomicIncrement> 0x0000000100002710 <_Z20TestAtomic_Incrementv+48>: mr r0,r3 0x0000000100002714 <_Z20TestAtomic_Incrementv+52>: cmpdi cr7,r0,0 0x0000000100002718 <_Z20TestAtomic_Incrementv+56>: bne- cr7,0x10000272c <_Z20TestAtomic_Incrementv+76> 0x000000010000271c <_Z20TestAtomic_Incrementv+60>: lwz r0,116(r30) 0x0000000100002720 <_Z20TestAtomic_Incrementv+64>: extsw r0,r0 0x0000000100002724 <_Z20TestAtomic_Incrementv+68>: cmpdi cr7,r0,0 0x0000000100002728 <_Z20TestAtomic_Incrementv+72>: beq- cr7,0x100002738 <_Z20TestAtomic_Incrementv+88> 0x000000010000272c <_Z20TestAtomic_Incrementv+76>: li r0,1 0x0000000100002730 <_Z20TestAtomic_Incrementv+80>: std r0,136(r30) 0x0000000100002734 <_Z20TestAtomic_Incrementv+84>: b 0x100002740 <_Z20TestAtomic_Incrementv+96> 0x0000000100002738 <_Z20TestAtomic_Incrementv+88>: li r0,0 0x000000010000273c <_Z20TestAtomic_Incrementv+92>: std r0,136(r30) 0x0000000100002740 <_Z20TestAtomic_Incrementv+96>: ld r0,136(r30) 0x0000000100002744 <_Z20TestAtomic_Incrementv+100>: cmpdi cr7,r0,0 0x0000000100002748 <_Z20TestAtomic_Incrementv+104>: bne- cr7,0x10000279c <_Z20TestAtomic_Incrementv+188> 0x000000010000274c <_Z20TestAtomic_Incrementv+108>: addi r0,r30,116 0x0000000100002750 <_Z20TestAtomic_Incrementv+112>: mr r3,r0 0x0000000100002754 <_Z20TestAtomic_Incrementv+116>: bl 0x1000017c4 <AtomicIncrement> 0x0000000100002758 <_Z20TestAtomic_Incrementv+120>: mr r0,r3 0x000000010000275c <_Z20TestAtomic_Incrementv+124>: cmpwi cr7,r0,1 0x0000000100002760 <_Z20TestAtomic_Incrementv+128>: bne- cr7,0x100002774 <_Z20TestAtomic_Incrementv+148> 0x0000000100002764 <_Z20TestAtomic_Incrementv+132>: lwz r0,116(r30) 0x0000000100002768 <_Z20TestAtomic_Incrementv+136>: extsw r0,r0 0x000000010000276c <_Z20TestAtomic_Incrementv+140>: cmpwi cr7,r0,1 0x0000000100002770 <_Z20TestAtomic_Incrementv+144>: beq- cr7,0x100002780 <_Z20TestAtomic_Incrementv+160> 0x0000000100002774 <_Z20TestAtomic_Incrementv+148>: li r0,1 0x0000000100002778 <_Z20TestAtomic_Incrementv+152>: std r0,128(r30) 0x000000010000277c <_Z20TestAtomic_Incrementv+156>: b 0x100002788 <_Z20TestAtomic_Incrementv+168> 0x0000000100002780 <_Z20TestAtomic_Incrementv+160>: li r0,0 0x0000000100002784 <_Z20TestAtomic_Incrementv+164>: std r0,128(r30) 0x0000000100002788 <_Z20TestAtomic_Incrementv+168>: ld r0,128(r30) 0x000000010000278c <_Z20TestAtomic_Incrementv+172>: cmpdi cr7,r0,0 0x0000000100002790 <_Z20TestAtomic_Incrementv+176>: bne- cr7,0x10000279c <_Z20TestAtomic_Incrementv+188> 0x0000000100002794 <_Z20TestAtomic_Incrementv+180>: li r0,1 0x0000000100002798 <_Z20TestAtomic_Incrementv+184>: stb r0,112(r30) 0x000000010000279c <_Z20TestAtomic_Incrementv+188>: lbz r0,112(r30) 0x00000001000027a0 <_Z20TestAtomic_Incrementv+192>: clrldi r0,r0,56 0x00000001000027a4 <_Z20TestAtomic_Incrementv+196>: mr r3,r0 0x00000001000027a8 <_Z20TestAtomic_Incrementv+200>: ld r1,0(r1) 0x00000001000027ac <_Z20TestAtomic_Incrementv+204>: ld r0,16(r1) 0x00000001000027b0 <_Z20TestAtomic_Incrementv+208>: mtlr r0 0x00000001000027b4 <_Z20TestAtomic_Incrementv+212>: ld r30,-16(r1) 0x00000001000027b8 <_Z20TestAtomic_Incrementv+216>: blr ================ For comparison of first AtomicIncrement() invocation result with zero "cmpdi cr7,r0,0" instruction has been generated at 0x0000000100002714, which is incorrect. For comparison of second AtomicIncrement() invocation result with one "cmpwi cr7,r0,1" instruction has been generated at 0x000000010000275c, which is correct. On exit from first call to AtomicIncrement() cr3 equals to 0x100000000 (naturally, 0x0FFFFFFFF + 1) and 8 byte comparison with zero yields incorrect result. osx-leopard:build oder$ g++ -m64 -o test test.cpp osx-leopard:build oder$ ./test 0 -- Summary: Wrong instruction generated for comparison with zero on PPC 64 bit Product: gcc Version: 4.0.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: oder at eleks dot lviv dot ua GCC build triplet: ppc GCC host triplet: ppc GCC target triplet: ppc http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35836