Messages in this thread | | | From | David Laight <> | Subject | RE: [PATCH v4] x86: use builtins to read eflags | Date | Fri, 11 Feb 2022 16:40:01 +0000 |
| |
From: Bill Wendling > Sent: 10 February 2022 22:32 > > GCC and Clang both have builtins to read and write the EFLAGS register. > This allows the compiler to determine the best way to generate this > code, which can improve code generation. > > This issue arose due to Clang's issue with the "=rm" constraint. Clang > chooses to be conservative in these situations, and so uses memory > instead of registers. This is a known issue, which is currently being > addressed. > > However, using builtins is beneficial in general, because it removes the > burden of determining what's the way to read the flags register from the > programmer and places it on to the compiler, which has the information > needed to make that decision.
Except that neither gcc nor clang attempt to make that decision. They always do pushf; pop ax;
... > v4: - Clang now no longer generates stack frames when using these builtins. > - Corrected misspellings.
While clang 'head' has been fixed, it seems a bit premature to say it is 'fixed' enough for all clang builds to use the builtin.
Seems better to change it (back) to "=r" and comment that this is currently as good as __builtin_ia32_readeflags_u64() and that clang makes a 'pigs breakfast' of "=rm" - which has only marginal benefit.
Changing to __builtin_ia32_readeflags_u64() may be worth while if/when the compilers will generate pushf; pop mem; for it.
David
- Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)
| |