NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-sh3/60773: sh3 __sync_val_compare_and_swap_1 test failures
The following reply was made to PR toolchain/60773; it has been noted by GNATS.
From: Taylor R Campbell <riastradh%NetBSD.org@localhost>
To: Valery Ushakov <uwe%stderr.spb.ru@localhost>,
gnats-bugs%NetBSD.org@localhost, netbsd-bugs%NetBSD.org@localhost,
Nick Hudson <skrll%NetBSD.org@localhost>
Cc:
Subject: Re: port-sh3/60773: sh3 __sync_val_compare_and_swap_1 test failures
Date: Fri, 25 Sep 2026 19:47:19 +0000
I did the same for Arm with -march=armv5t -mfloat-abi=soft, and here's
how it came out -- gcc treats __sync_* as signed, not unsigned (note
the `and r2, r2, #255' in main__ and main_u8 but not main_s8):
00000000 <main__>:
0: e3e01077 mvn r1, #119 @ 0x77
4: e52de004 push {lr} @ (str lr, [sp, #-4]!)
8: e24dd00c sub sp, sp, #12
c: e3e0200f mvn r2, #15
10: e28d0007 add r0, sp, #7
14: e5cd1007 strb r1, [sp, #7]
18: ebfffffe bl 0 <__sync_val_compare_and_swap_1>
18: R_ARM_CALL __sync_val_compare_and_swap_1
1c: e1a02000 mov r2, r0
20: e3a01088 mov r1, #136 @ 0x88
24: e20220ff and r2, r2, #255 @ 0xff
28: e59f000c ldr r0, [pc, #12] @ 3c <main__+0x3c>
2c: ebfffffe bl 0 <printf>
...
00000040 <main_u8>:
40: e3e03077 mvn r3, #119 @ 0x77
44: e52de004 push {lr} @ (str lr, [sp, #-4]!)
48: e24dd00c sub sp, sp, #12
4c: e3a020f0 mov r2, #240 @ 0xf0
50: e3a01088 mov r1, #136 @ 0x88
54: e28d0007 add r0, sp, #7
58: e5cd3007 strb r3, [sp, #7]
5c: ebfffffe bl 0 <u8_sync_val_compare_and_swap_1>
5c: R_ARM_CALL u8_sync_val_compare_and_swap_1
60: e3a01088 mov r1, #136 @ 0x88
64: e1a02000 mov r2, r0
68: e59f000c ldr r0, [pc, #12] @ 7c <main_u8+0x3c>
6c: ebfffffe bl 0 <printf>
...
00000080 <main_s8>:
80: e3e01077 mvn r1, #119 @ 0x77
84: e52de004 push {lr} @ (str lr, [sp, #-4]!)
88: e24dd00c sub sp, sp, #12
8c: e3e0200f mvn r2, #15
90: e28d0007 add r0, sp, #7
94: e5cd1007 strb r1, [sp, #7]
98: ebfffffe bl 0 <s8_sync_val_compare_and_swap_1>
98: R_ARM_CALL s8_sync_val_compare_and_swap_1
9c: e1a02000 mov r2, r0
a0: e3a01088 mov r1, #136 @ 0x88
a4: e20220ff and r2, r2, #255 @ 0xff
a8: e59f000c ldr r0, [pc, #12] @ bc <main_s8+0x3c>
ac: ebfffffe bl 0 <printf>
ac: R_ARM_CALL printf
...
On sparc, though, as on sh3, __sync_* is treated as unsigned (note the
`and %o0, 0xff, %o2' in main_s8 but not in main__ or main_u8):
00000000 <main__>:
main__():
0: 9d e3 bf 98 save %sp, -104, %sp
4: 82 10 3f 88 mov -120, %g1
8: 94 10 20 f0 mov 0xf0, %o2
c: c2 2f bf ff stb %g1, [ %fp + -1 ]
10: 92 10 20 88 mov 0x88, %o1
14: 40 00 00 00 call 14 <main__+0x14>
14: R_SPARC_WDISP30 __sync_val_compare_and_swap_1
18: 90 07 bf ff add %fp, -1, %o0
1c: 92 10 20 88 mov 0x88, %o1
20: 94 10 00 08 mov %o0, %o2
24: b0 10 20 00 clr %i0
28: 11 00 00 00 sethi %hi(0), %o0
28: R_SPARC_HI22 .rodata.str1.8
2c: 40 00 00 00 call 2c <main__+0x2c>
2c: R_SPARC_WDISP30 printf
30: 90 12 20 00 mov %o0, %o0 ! 0 <main__>
30: R_SPARC_LO10 .rodata.str1.8
34: 81 c7 e0 08 ret
38: 81 e8 00 00 restore
0000003c <main_u8>:
main_u8():
3c: 9d e3 bf 98 save %sp, -104, %sp
40: 82 10 3f 88 mov -120, %g1
44: 94 10 20 f0 mov 0xf0, %o2
48: c2 2f bf ff stb %g1, [ %fp + -1 ]
4c: 92 10 20 88 mov 0x88, %o1
50: 40 00 00 00 call 50 <main_u8+0x14>
50: R_SPARC_WDISP30 u8_sync_val_compare_and_swap_1
54: 90 07 bf ff add %fp, -1, %o0
58: 92 10 20 88 mov 0x88, %o1
5c: 94 10 00 08 mov %o0, %o2
60: b0 10 20 00 clr %i0
64: 11 00 00 00 sethi %hi(0), %o0
64: R_SPARC_HI22 .rodata.str1.8
68: 40 00 00 00 call 68 <main_u8+0x2c>
68: R_SPARC_WDISP30 printf
6c: 90 12 20 00 mov %o0, %o0 ! 0 <main__>
6c: R_SPARC_LO10 .rodata.str1.8
70: 81 c7 e0 08 ret
74: 81 e8 00 00 restore
00000078 <main_s8>:
main_s8():
78: 9d e3 bf 98 save %sp, -104, %sp
7c: 82 10 3f 88 mov -120, %g1
80: 94 10 3f f0 mov -16, %o2
84: c2 2f bf ff stb %g1, [ %fp + -1 ]
88: 92 10 3f 88 mov -120, %o1
8c: 40 00 00 00 call 8c <main_s8+0x14>
8c: R_SPARC_WDISP30 s8_sync_val_compare_and_swap_1
90: 90 07 bf ff add %fp, -1, %o0
94: 92 10 20 88 mov 0x88, %o1
98: 94 0a 20 ff and %o0, 0xff, %o2
9c: b0 10 20 00 clr %i0
a0: 11 00 00 00 sethi %hi(0), %o0
a0: R_SPARC_HI22 .rodata.str1.8
a4: 40 00 00 00 call a4 <main_s8+0x2c>
a4: R_SPARC_WDISP30 printf
a8: 90 12 20 00 mov %o0, %o0 ! 0 <main__>
a8: R_SPARC_LO10 .rodata.str1.8
ac: 81 c7 e0 08 ret
b0: 81 e8 00 00 restore
So something screwy is going on with gcc's internal concept of what
signedness to use for __sync_*.
Home |
Main Index |
Thread Index |
Old Index