|
|
Message-ID: <20150521120611.GO11258@port70.net>
Date: Thu, 21 May 2015 14:06:12 +0200
From: Szabolcs Nagy <nsz@...t70.net>
To: musl@...ts.openwall.com
Subject: Re: Refactoring atomics as llsc?
* Rich Felker <dalias@...c.org> [2015-05-21 00:12:37 -0400]:
> This is coming along really well so far. Here's the ARMv7 code
> generated for a sample external x_swap function that calls a_swap:
>
> x_swap:
> mov r3, r0
> dmb ish
> .L3:
> ldrex r0, [r3]
> strex r2,r1,[r3]
> cmp r2, #0
> bne .L3
> dmb ish
> bx lr
>
> The code that's producing this is the arm atomic_arch.h (so far only
> supports inline atomics for v7+):
>
...
> #ifndef a_swap
> #define a_swap a_swap
> static inline int a_swap(volatile int *p, int v)
> {
> int old;
> a_pre_llsc();
> do old = a_ll(p);
> while (!a_sc(p, v));
> a_post_llsc();
> return old;
> }
> #endif
>
nice
> Unfortunately there's a nasty snag: global objects like
> need_fallback_a_swap, v6_compat, or barrier_func_ptr will be re-read
> over and over in functions using atomics because the "memory" clobbers
> in the asm invalidate any value the compiler may have cached.
>
> Fortunately, there seems to be a clean solution: load them via asm
> that looks like
>
> static inline int v6_compat() {
> int r;
> __asm__ ( "..." : "=r"(r) );
> return r;
> }
>
> where the "..." is asm to perform the load. Since this asm is not
> volatile and has no inputs, it can be CSE'd and treated like an
> attribute-const function. Strictly speaking this doesn't prevent
> reordering to the very beginning of program execution, before the
> runtime atomic selection is initialized, but I don't think that's a
> serious practical concern. It's certainly not a concern with dynamic
> linking since nothing can be reordered back into dynamic-linker-time,
> and the atomics would be initialized there. For static-linking LTO
> this may require some more thought for formal correctness.
does gcc cse that?
why is it guaranteed that r will be always the same?
(and how can gcc know the cost of the asm? it seems to
me that would be needed to determine if it's worth keeping
r in a reg or just rerun the asm every time)
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.