NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: port-arm/56839: GCC emits wrong codes for compare_and_swap_1 bultins on armv5 (el & eb)
The following reply was made to PR port-arm/56839; it has been noted by GNATS.
From: Rin Okuyama <rokuyama.rk%gmail.com@localhost>
To: Nick Hudson <nick.hudson%gmx.co.uk@localhost>, gnats-bugs%netbsd.org@localhost,
port-arm-maintainer%netbsd.org@localhost, gnats-admin%netbsd.org@localhost,
netbsd-bugs%netbsd.org@localhost
Cc:
Subject: Re: port-arm/56839: GCC emits wrong codes for compare_and_swap_1
bultins on armv5 (el & eb)
Date: Fri, 20 May 2022 10:32:32 +0900
Hi,
On 2022/05/18 20:48, Nick Hudson wrote:
> I think this fixes things. It's a bit ugly...
>
> https://www.netbsd.org/~skrll/pr56839.diff
This does not work:
(1) GCC expands __sync_bool_compare_and_swap_N() into
__sync_val_compare_and_swap_N() as optimization.
(2) The patch does not cover __sync_val_compare_and_swap_N()
( == _atomic_cas_8N() ).
On the other hand, this patch for _atomic_cas_8N() fixes the problem:
https://gist.github.com/rokuyama/3d791f2ceb2757dc389a95910162c9cb
However, IMO, this is not the real fix:
(a) I've found that MI part, not arm-dependent part, of GCC carries
out sign-extension; something is wrong in
expand_builtin_compare_and_swap() @ dist/gcc/gcc/builtins.c,
but I've never fully understand what goes wrong yet...
(Strangely enough, GCC itself recognizes that these builtins
takes unsigned integers...)
(b) Therefore, archs other than arm that do not have 1- and 2-byte
atomic cas builtins (== missing equivalent instructions) should
be affected.
(c) It should be better to fix GCC rather than adding workaround to
libc routines.
Thanks,
rin
Home |
Main Index |
Thread Index |
Old Index