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)



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