[01/11] stdlib/longlong.h: Remove incorrect lvalue to rvalue conversion from asm output constraints

Message ID 20221028173532.876027-2-adhemerval.zanella@linaro.org
State Superseded
Headers
Series Initial fixes for clang build support |

Checks

Context Check Description
dj/TryBot-apply_patch success Patch applied to master at the time it was sent

Commit Message

Adhemerval Zanella Oct. 28, 2022, 5:35 p.m. UTC
  From: Fangrui Song <maskray@google.com>

An output constraint takes a lvalue. While GCC happily strips the
incorrect lvalue to rvalue conversion, Clang rejects the code by
default:

    error: invalid use of a cast in a inline asm context requiring an lvalue: remove the cast or build with -fheinous-gnu-extensions
---
 stdlib/longlong.h | 186 +++++++++++++++++++++++-----------------------
 1 file changed, 93 insertions(+), 93 deletions(-)
  

Comments

Joseph Myers Oct. 28, 2022, 9:05 p.m. UTC | #1
On Fri, 28 Oct 2022, Adhemerval Zanella via Libc-alpha wrote:

> From: Fangrui Song <maskray@google.com>
> 
> An output constraint takes a lvalue. While GCC happily strips the
> incorrect lvalue to rvalue conversion, Clang rejects the code by
> default:

We treat GCC as the upstream source of this file.
  
Fangrui Song Oct. 28, 2022, 9:32 p.m. UTC | #2
On 2022-10-28, Joseph Myers wrote:
>On Fri, 28 Oct 2022, Adhemerval Zanella via Libc-alpha wrote:
>
>> From: Fangrui Song <maskray@google.com>
>>
>> An output constraint takes a lvalue. While GCC happily strips the
>> incorrect lvalue to rvalue conversion, Clang rejects the code by
>> default:
>
>We treat GCC as the upstream source of this file.

I tried gcc-patches in 2021-10
https://gcc.gnu.org/pipermail/gcc-patches/2021-October/581722.html
stdlib/longlong.h: Remove incorrect lvalue to rvalue conversion from asm output constraints

If the GCC patch is not favored, the clang build will have to use -fheinous-gnu-extensions :(
  
Adhemerval Zanella Oct. 31, 2022, 6:32 p.m. UTC | #3
On 28/10/22 18:32, Fangrui Song wrote:
> On 2022-10-28, Joseph Myers wrote:
>> On Fri, 28 Oct 2022, Adhemerval Zanella via Libc-alpha wrote:
>>
>>> From: Fangrui Song <maskray@google.com>
>>>
>>> An output constraint takes a lvalue. While GCC happily strips the
>>> incorrect lvalue to rvalue conversion, Clang rejects the code by
>>> default:
>>
>> We treat GCC as the upstream source of this file.
> 
> I tried gcc-patches in 2021-10
> https://gcc.gnu.org/pipermail/gcc-patches/2021-October/581722.html
> stdlib/longlong.h: Remove incorrect lvalue to rvalue conversion from asm output constraints
> 
> If the GCC patch is not favored, the clang build will have to use -fheinous-gnu-extensions :(

I recall this conversion, thanks for bring this up again. I don't have a strong
preference, using -fheinous-gnu-extensions might be an option. It would require
an additional configure check and add the flag on each file.
  
Adhemerval Zanella Nov. 1, 2022, 1:56 p.m. UTC | #4
On 31/10/22 15:32, Adhemerval Zanella Netto wrote:
> 
> 
> On 28/10/22 18:32, Fangrui Song wrote:
>> On 2022-10-28, Joseph Myers wrote:
>>> On Fri, 28 Oct 2022, Adhemerval Zanella via Libc-alpha wrote:
>>>
>>>> From: Fangrui Song <maskray@google.com>
>>>>
>>>> An output constraint takes a lvalue. While GCC happily strips the
>>>> incorrect lvalue to rvalue conversion, Clang rejects the code by
>>>> default:
>>>
>>> We treat GCC as the upstream source of this file.
>>
>> I tried gcc-patches in 2021-10
>> https://gcc.gnu.org/pipermail/gcc-patches/2021-October/581722.html
>> stdlib/longlong.h: Remove incorrect lvalue to rvalue conversion from asm output constraints
>>
>> If the GCC patch is not favored, the clang build will have to use -fheinous-gnu-extensions :(
> 
> I recall this conversion, thanks for bring this up again. I don't have a strong
> preference, using -fheinous-gnu-extensions might be an option. It would require
> an additional configure check and add the flag on each file.

Using -fheinous-gnu-extensions does not seem to be a long-term solution,
clang accepts it but still throws an warning:

  warning: invalid use of a cast in an inline asm context requiring an lvalue: 
  accepted due to -fheinous-gnu-extensions, but clang may remove support for 
  this in the future

And we do not have a -Wno-heinous-gnu-extensions to suppress it.  But what really 
worries me that eventually clang decides to remove it.

From gcc thread, it is unlikely that the cast would be removed since they provide
a diagnostic way.  So I am open to suggestion on how to proceed. 

One option would be to start provide proper static inline function, so we can
remove the cast; and adapt the glibc code to use it.  However it would result in
a quite large patch, and it would need to modify multiple projects (gcc, gmp,
glibc at least).

Another option would be to check at configure time if cast in inline asm
context is supported and disable the cast if not.

I am inclined for the later.
  
Joseph Myers Nov. 1, 2022, 2:18 p.m. UTC | #5
On Tue, 1 Nov 2022, Adhemerval Zanella Netto wrote:

> Another option would be to check at configure time if cast in inline asm
> context is supported and disable the cast if not.

The file is meant to be taken verbatim (no local changes) from GCC.  So 
you're getting into generating a file in the build tree based on automated 
substitutions into the source file from GCC there.
  
Adhemerval Zanella Nov. 1, 2022, 5:05 p.m. UTC | #6
On 01/11/22 11:18, Joseph Myers wrote:
> On Tue, 1 Nov 2022, Adhemerval Zanella Netto wrote:
> 
>> Another option would be to check at configure time if cast in inline asm
>> context is supported and disable the cast if not.
> 
> The file is meant to be taken verbatim (no local changes) from GCC.  So 
> you're getting into generating a file in the build tree based on automated 
> substitutions into the source file from GCC there.
> 

I am open to suggestions in fact, I am not sure if this option would be best
one.  The automated substitution tends to be error prone with simple regex,
but it might the best option (specially because longlong.h is not an constant
updated file and the ABI won't change anytime soon).
  
Andrew Pinski Nov. 1, 2022, 5:11 p.m. UTC | #7
On Fri, Oct 28, 2022 at 10:36 AM Adhemerval Zanella via Libc-alpha
<libc-alpha@sourceware.org> wrote:
>
> From: Fangrui Song <maskray@google.com>
>
> An output constraint takes a lvalue. While GCC happily strips the
> incorrect lvalue to rvalue conversion, Clang rejects the code by
> default:

For GCC this is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=2803 .
I wrote about the ones in longlong.h (inside GCC sources) in comment
#11 back in 2004 when I tried to fix GCC's front-end to reject this.

Thanks,
Andrew


>
>     error: invalid use of a cast in a inline asm context requiring an lvalue: remove the cast or build with -fheinous-gnu-extensions
> ---
>  stdlib/longlong.h | 186 +++++++++++++++++++++++-----------------------
>  1 file changed, 93 insertions(+), 93 deletions(-)
>
> diff --git a/stdlib/longlong.h b/stdlib/longlong.h
> index d8f76a43b5..303cc4e8d0 100644
> --- a/stdlib/longlong.h
> +++ b/stdlib/longlong.h
> @@ -194,8 +194,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>  #if defined (__arc__) && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("add.f      %1, %4, %5\n\tadc       %0, %2, %3"             \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "%r" ((USItype) (ah)),                                     \
>              "rICal" ((USItype) (bh)),                                  \
>              "%r" ((USItype) (al)),                                     \
> @@ -203,8 +203,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>            : "cc")
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("sub.f      %1, %4, %5\n\tsbc       %0, %2, %3"             \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "r" ((USItype) (ah)),                                      \
>              "rICal" ((USItype) (bh)),                                  \
>              "r" ((USItype) (al)),                                      \
> @@ -230,16 +230,16 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>   && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("adds       %1, %4, %5\n\tadc       %0, %2, %3"             \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "%r" ((USItype) (ah)),                                     \
>              "rI" ((USItype) (bh)),                                     \
>              "%r" ((USItype) (al)),                                     \
>              "rI" ((USItype) (bl)) __CLOBBER_CC)
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("subs       %1, %4, %5\n\tsbc       %0, %2, %3"             \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "r" ((USItype) (ah)),                                      \
>              "rI" ((USItype) (bh)),                                     \
>              "r" ((USItype) (al)),                                      \
> @@ -262,8 +262,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>            "    addcs   %0, %0, #65536\n"                               \
>            "    adds    %1, %1, %3, lsl #16\n"                          \
>            "    adc     %0, %0, %3, lsr #16"                            \
> -          : "=&r" ((USItype) (xh)),                                    \
> -            "=r" ((USItype) (xl)),                                     \
> +          : "=&r" (xh),                                                \
> +            "=r" (xl),                                                 \
>              "=&r" (__t0), "=&r" (__t1), "=r" (__t2)                    \
>            : "r" ((USItype) (a)),                                       \
>              "r" ((USItype) (b)) __CLOBBER_CC );                        \
> @@ -348,16 +348,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if defined (__hppa) && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0"                             \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "%rM" ((USItype) (ah)),                                    \
>              "rM" ((USItype) (bh)),                                     \
>              "%rM" ((USItype) (al)),                                    \
>              "rM" ((USItype) (bl)))
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0"                             \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "rM" ((USItype) (ah)),                                     \
>              "rM" ((USItype) (bh)),                                     \
>              "rM" ((USItype) (al)),                                     \
> @@ -456,30 +456,30 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("add{l} {%5,%1|%1,%5}\n\tadc{l} {%3,%0|%0,%3}"              \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "%0" ((USItype) (ah)),                                     \
>              "g" ((USItype) (bh)),                                      \
>              "%1" ((USItype) (al)),                                     \
>              "g" ((USItype) (bl)))
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("sub{l} {%5,%1|%1,%5}\n\tsbb{l} {%3,%0|%0,%3}"              \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "0" ((USItype) (ah)),                                      \
>              "g" ((USItype) (bh)),                                      \
>              "1" ((USItype) (al)),                                      \
>              "g" ((USItype) (bl)))
>  #define umul_ppmm(w1, w0, u, v) \
>    __asm__ ("mul{l} %3"                                                 \
> -          : "=a" ((USItype) (w0)),                                     \
> -            "=d" ((USItype) (w1))                                      \
> +          : "=a" (w0),                                                 \
> +            "=d" (w1)                                                  \
>            : "%0" ((USItype) (u)),                                      \
>              "rm" ((USItype) (v)))
>  #define udiv_qrnnd(q, r, n1, n0, dv) \
>    __asm__ ("div{l} %4"                                                 \
> -          : "=a" ((USItype) (q)),                                      \
> -            "=d" ((USItype) (r))                                       \
> +          : "=a" (q),                                                  \
> +            "=d" (r)                                                   \
>            : "0" ((USItype) (n0)),                                      \
>              "1" ((USItype) (n1)),                                      \
>              "rm" ((USItype) (dv)))
> @@ -492,30 +492,30 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if defined (__x86_64__) && W_TYPE_SIZE == 64
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("add{q} {%5,%1|%1,%5}\n\tadc{q} {%3,%0|%0,%3}"              \
> -          : "=r" ((UDItype) (sh)),                                     \
> -            "=&r" ((UDItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "%0" ((UDItype) (ah)),                                     \
>              "rme" ((UDItype) (bh)),                                    \
>              "%1" ((UDItype) (al)),                                     \
>              "rme" ((UDItype) (bl)))
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("sub{q} {%5,%1|%1,%5}\n\tsbb{q} {%3,%0|%0,%3}"              \
> -          : "=r" ((UDItype) (sh)),                                     \
> -            "=&r" ((UDItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "0" ((UDItype) (ah)),                                      \
>              "rme" ((UDItype) (bh)),                                    \
>              "1" ((UDItype) (al)),                                      \
>              "rme" ((UDItype) (bl)))
>  #define umul_ppmm(w1, w0, u, v) \
>    __asm__ ("mul{q} %3"                                                 \
> -          : "=a" ((UDItype) (w0)),                                     \
> -            "=d" ((UDItype) (w1))                                      \
> +          : "=a" (w0),                                                 \
> +            "=d" (w1)                                                  \
>            : "%0" ((UDItype) (u)),                                      \
>              "rm" ((UDItype) (v)))
>  #define udiv_qrnnd(q, r, n1, n0, dv) \
>    __asm__ ("div{q} %4"                                                 \
> -          : "=a" ((UDItype) (q)),                                      \
> -            "=d" ((UDItype) (r))                                       \
> +          : "=a" (q),                                                  \
> +            "=d" (r)                                                   \
>            : "0" ((UDItype) (n0)),                                      \
>              "1" ((UDItype) (n1)),                                      \
>              "rm" ((UDItype) (dv)))
> @@ -609,8 +609,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    /* The cmp clears the condition bit.  */ \
>    __asm__ ("cmp %0,%0\n\taddx %1,%5\n\taddx %0,%3"                     \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "0" ((USItype) (ah)),                                      \
>              "r" ((USItype) (bh)),                                      \
>              "1" ((USItype) (al)),                                      \
> @@ -619,8 +619,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    /* The cmp clears the condition bit.  */ \
>    __asm__ ("cmp %0,%0\n\tsubx %1,%5\n\tsubx %0,%3"                     \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "0" ((USItype) (ah)),                                      \
>              "r" ((USItype) (bh)),                                      \
>              "1" ((USItype) (al)),                                      \
> @@ -631,16 +631,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if defined (__mc68000__) && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0"                             \
> -          : "=d" ((USItype) (sh)),                                     \
> -            "=&d" ((USItype) (sl))                                     \
> +          : "=d" (sh),                                                 \
> +            "=&d" (sl)                                                 \
>            : "%0" ((USItype) (ah)),                                     \
>              "d" ((USItype) (bh)),                                      \
>              "%1" ((USItype) (al)),                                     \
>              "g" ((USItype) (bl)))
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0"                             \
> -          : "=d" ((USItype) (sh)),                                     \
> -            "=&d" ((USItype) (sl))                                     \
> +          : "=d" (sh),                                                 \
> +            "=&d" (sl)                                                 \
>            : "0" ((USItype) (ah)),                                      \
>              "d" ((USItype) (bh)),                                      \
>              "1" ((USItype) (al)),                                      \
> @@ -650,23 +650,23 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if (defined (__mc68020__) && !defined (__mc68060__))
>  #define umul_ppmm(w1, w0, u, v) \
>    __asm__ ("mulu%.l %3,%1:%0"                                          \
> -          : "=d" ((USItype) (w0)),                                     \
> -            "=d" ((USItype) (w1))                                      \
> +          : "=d" (w0),                                                 \
> +            "=d" (w1)                                                  \
>            : "%0" ((USItype) (u)),                                      \
>              "dmi" ((USItype) (v)))
>  #define UMUL_TIME 45
>  #define udiv_qrnnd(q, r, n1, n0, d) \
>    __asm__ ("divu%.l %4,%1:%0"                                          \
> -          : "=d" ((USItype) (q)),                                      \
> -            "=d" ((USItype) (r))                                       \
> +          : "=d" (q),                                                  \
> +            "=d" (r)                                                   \
>            : "0" ((USItype) (n0)),                                      \
>              "1" ((USItype) (n1)),                                      \
>              "dmi" ((USItype) (d)))
>  #define UDIV_TIME 90
>  #define sdiv_qrnnd(q, r, n1, n0, d) \
>    __asm__ ("divs%.l %4,%1:%0"                                          \
> -          : "=d" ((USItype) (q)),                                      \
> -            "=d" ((USItype) (r))                                       \
> +          : "=d" (q),                                                  \
> +            "=d" (r)                                                   \
>            : "0" ((USItype) (n0)),                                      \
>              "1" ((USItype) (n1)),                                      \
>              "dmi" ((USItype) (d)))
> @@ -700,8 +700,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>            "    move%.l %/d2,%1\n"                                      \
>            "    add%.l  %/d1,%/d0\n"                                    \
>            "    move%.l %/d0,%0"                                        \
> -          : "=g" ((USItype) (xh)),                                     \
> -            "=g" ((USItype) (xl))                                      \
> +          : "=g" (xh),                                                 \
> +            "=g" (xl)                                                  \
>            : "g" ((USItype) (a)),                                       \
>              "g" ((USItype) (b))                                        \
>            : "d0", "d1", "d2", "d3", "d4")
> @@ -736,8 +736,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>            "    move%.l %/d2,%1\n"                                      \
>            "    add%.l  %/d1,%/d0\n"                                    \
>            "    move%.l %/d0,%0"                                        \
> -          : "=g" ((USItype) (xh)),                                     \
> -            "=g" ((USItype) (xl))                                      \
> +          : "=g" (xh)),                                                \
> +            "=g" (xl)                                                  \
>            : "g" ((USItype) (a)),                                       \
>              "g" ((USItype) (b))                                        \
>            : "d0", "d1", "d2", "d3", "d4")
> @@ -751,7 +751,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if defined (__mc68020__) && !defined (__mcpu32__)
>  #define count_leading_zeros(count, x) \
>    __asm__ ("bfffo %1{%b2:%b2},%0"                                      \
> -          : "=d" ((USItype) (count))                                   \
> +          : "=d" (count)                                               \
>            : "od" ((USItype) (x)), "n" (0))
>  /* Some ColdFire architectures have a ff1 instruction supported via
>     __builtin_clz. */
> @@ -764,16 +764,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if defined (__m88000__) && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3"                  \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "%rJ" ((USItype) (ah)),                                    \
>              "rJ" ((USItype) (bh)),                                     \
>              "%rJ" ((USItype) (al)),                                    \
>              "rJ" ((USItype) (bl)))
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3"                  \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "rJ" ((USItype) (ah)),                                     \
>              "rJ" ((USItype) (bh)),                                     \
>              "rJ" ((USItype) (al)),                                     \
> @@ -1000,16 +1000,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("a %1,%5\n\tae %0,%3"                                       \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "%0" ((USItype) (ah)),                                     \
>              "r" ((USItype) (bh)),                                      \
>              "%1" ((USItype) (al)),                                     \
>              "r" ((USItype) (bl)))
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("s %1,%5\n\tse %0,%3"                                       \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "0" ((USItype) (ah)),                                      \
>              "r" ((USItype) (bh)),                                      \
>              "1" ((USItype) (al)),                                      \
> @@ -1038,8 +1038,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  "      m       r2,%3\n"                                                \
>  "      cas     %0,r2,r0\n"                                             \
>  "      mfs     r10,%1"                                                 \
> -            : "=r" ((USItype) (ph)),                                   \
> -              "=r" ((USItype) (pl))                                    \
> +            : "=r" (ph),                                               \
> +              "=r" (pl)                                                \
>              : "%r" (__m0),                                             \
>                 "r" (__m1)                                              \
>              : "r2");                                                   \
> @@ -1052,12 +1052,12 @@ extern UDItype __umulsidi3 (USItype, USItype);
>    do {                                                                 \
>      if ((x) >= 0x10000)                                                        \
>        __asm__ ("clz    %0,%1"                                          \
> -              : "=r" ((USItype) (count))                               \
> +              : "=r" (count)                                           \
>                : "r" ((USItype) (x) >> 16));                            \
>      else                                                               \
>        {                                                                        \
>         __asm__ ("clz   %0,%1"                                          \
> -                : "=r" ((USItype) (count))                             \
> +                : "=r" (count)                                         \
>                  : "r" ((USItype) (x)));                                        \
>         (count) += 16;                                                  \
>        }                                                                        \
> @@ -1119,8 +1119,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #define umul_ppmm(w1, w0, u, v) \
>    __asm__ (                                                            \
>         "dmulu.l        %2,%3\n\tsts%M1 macl,%1\n\tsts%M0       mach,%0"        \
> -          : "=r<" ((USItype)(w1)),                                     \
> -            "=r<" ((USItype)(w0))                                      \
> +          : "=r<" (w1),                                                \
> +            "=r<" (w0)                                                 \
>            : "r" ((USItype)(u)),                                        \
>              "r" ((USItype)(v))                                         \
>            : "macl", "mach")
> @@ -1191,8 +1191,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>      && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0"                         \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "%rJ" ((USItype) (ah)),                                    \
>              "rI" ((USItype) (bh)),                                     \
>              "%rJ" ((USItype) (al)),                                    \
> @@ -1200,8 +1200,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>            __CLOBBER_CC)
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0"                         \
> -          : "=r" ((USItype) (sh)),                                     \
> -            "=&r" ((USItype) (sl))                                     \
> +          : "=r" (sh),                                                 \
> +            "=&r" (sl)                                                 \
>            : "rJ" ((USItype) (ah)),                                     \
>              "rI" ((USItype) (bh)),                                     \
>              "rJ" ((USItype) (al)),                                     \
> @@ -1213,7 +1213,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>      register USItype __g1 asm ("g1");                                  \
>      __asm__ ("umul\t%2,%3,%1\n\t"                                      \
>              "srlx\t%1, 32, %0"                                         \
> -            : "=r" ((USItype) (w1)),                                   \
> +            : "=r" (w1),                                               \
>                "=r" (__g1)                                              \
>              : "r" ((USItype) (u)),                                     \
>                "r" ((USItype) (v)));                                    \
> @@ -1224,8 +1224,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>            "udiv\t%3,%4,%0\n\t"                                         \
>            "umul\t%0,%4,%1\n\t"                                         \
>            "sub\t%3,%1,%1"                                              \
> -          : "=&r" ((USItype) (__q)),                                   \
> -            "=&r" ((USItype) (__r))                                    \
> +          : "=&r" (__q),                                               \
> +            "=&r" (__r)                                                \
>            : "r" ((USItype) (__n1)),                                    \
>              "r" ((USItype) (__n0)),                                    \
>              "r" ((USItype) (__d)))
> @@ -1233,14 +1233,14 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if defined (__sparc_v8__)
>  #define umul_ppmm(w1, w0, u, v) \
>    __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
> -          : "=r" ((USItype) (w1)),                                     \
> -            "=r" ((USItype) (w0))                                      \
> +          : "=r" (w1),                                                 \
> +            "=r" (w0)                                                  \
>            : "r" ((USItype) (u)),                                       \
>              "r" ((USItype) (v)))
>  #define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
>    __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
> -          : "=&r" ((USItype) (__q)),                                   \
> -            "=&r" ((USItype) (__r))                                    \
> +          : "=&r" (__q),                                               \
> +            "=&r" (__r)                                                \
>            : "r" ((USItype) (__n1)),                                    \
>              "r" ((USItype) (__n0)),                                    \
>              "r" ((USItype) (__d)))
> @@ -1250,8 +1250,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>     instructions scan (ffs from high bit) and divscc.  */
>  #define umul_ppmm(w1, w0, u, v) \
>    __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
> -          : "=r" ((USItype) (w1)),                                     \
> -            "=r" ((USItype) (w0))                                      \
> +          : "=r" (w1),                                                 \
> +            "=r" (w0)                                                  \
>            : "r" ((USItype) (u)),                                       \
>              "r" ((USItype) (v)))
>  #define udiv_qrnnd(q, r, n1, n0, d) \
> @@ -1294,8 +1294,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  "      bl,a 1f\n"                                                      \
>  "      add     %1,%4,%1\n"                                             \
>  "1:    ! End of inline udiv_qrnnd"                                     \
> -          : "=r" ((USItype) (q)),                                      \
> -            "=r" ((USItype) (r))                                       \
> +          : "=r" (q),                                                  \
> +            "=r" (r)                                                   \
>            : "r" ((USItype) (n1)),                                      \
>              "r" ((USItype) (n0)),                                      \
>              "rI" ((USItype) (d))                                       \
> @@ -1304,7 +1304,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #define count_leading_zeros(count, x) \
>    do {                                                                  \
>    __asm__ ("scan %1,1,%0"                                               \
> -          : "=r" ((USItype) (count))                                   \
> +          : "=r" (count)                                               \
>            : "r" ((USItype) (x)));                                      \
>    } while (0)
>  /* Early sparclites return 63 for an argument of 0, but they warn that future
> @@ -1354,8 +1354,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  "      mulscc  %%g1,0,%%g1\n"                                          \
>  "      add     %%g1,%%o5,%0\n"                                         \
>  "      rd      %%y,%1"                                                 \
> -          : "=r" ((USItype) (w1)),                                     \
> -            "=r" ((USItype) (w0))                                      \
> +          : "=r" (w1),                                                 \
> +            "=r" (w0)                                                  \
>            : "%rI" ((USItype) (u)),                                     \
>              "r" ((USItype) (v))                                                \
>            : "g1", "o5" __AND_CLOBBER_CC)
> @@ -1387,8 +1387,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  "      sub     %1,%2,%1\n"                                             \
>  "3:    xnor    %0,0,%0\n"                                              \
>  "      ! End of inline udiv_qrnnd"                                     \
> -          : "=&r" ((USItype) (__q)),                                   \
> -            "=&r" ((USItype) (__r))                                    \
> +          : "=&r" (__q),                                               \
> +            "=&r" (__r)                                                \
>            : "r" ((USItype) (__d)),                                     \
>              "1" ((USItype) (__n1)),                                    \
>              "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC)
> @@ -1407,8 +1407,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>              "add\t%r3,%4,%0\n\t"                                       \
>              "movcs\t%%xcc, 1, %2\n\t"                                  \
>              "add\t%0, %2, %0"                                          \
> -            : "=r" ((UDItype)(sh)),                                    \
> -              "=&r" ((UDItype)(sl)),                                   \
> +            : "=r" (sh),                                               \
> +              "=&r" (sl),                                              \
>                "+r" (__carry)                                           \
>              : "%rJ" ((UDItype)(ah)),                                   \
>                "rI" ((UDItype)(bh)),                                    \
> @@ -1424,8 +1424,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>              "sub\t%r3,%4,%0\n\t"                                       \
>              "movcs\t%%xcc, 1, %2\n\t"                                  \
>              "sub\t%0, %2, %0"                                          \
> -            : "=r" ((UDItype)(sh)),                                    \
> -              "=&r" ((UDItype)(sl)),                                   \
> +            : "=r" (sh),                                               \
> +              "=&r" (sl),                                              \
>                "+r" (__carry)                                           \
>              : "%rJ" ((UDItype)(ah)),                                   \
>                "rI" ((UDItype)(bh)),                                    \
> @@ -1459,8 +1459,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>                    "sllx %3,32,%3\n\t"                                  \
>                    "add %1,%3,%1\n\t"                                   \
>                    "add %5,%2,%0"                                       \
> -          : "=r" ((UDItype)(wh)),                                      \
> -            "=&r" ((UDItype)(wl)),                                     \
> +          : "=r" (wh),                                                 \
> +            "=&r" (wl),                                                \
>              "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4)     \
>            : "r" ((UDItype)(u)),                                        \
>              "r" ((UDItype)(v))                                         \
> @@ -1473,16 +1473,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>  #if defined (__vax__) && W_TYPE_SIZE == 32
>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>    __asm__ ("addl2 %5,%1\n\tadwc %3,%0"                                 \
> -          : "=g" ((USItype) (sh)),                                     \
> -            "=&g" ((USItype) (sl))                                     \
> +          : "=g" (sh)),                                                \
> +            "=&g" (sl)                                                 \
>            : "%0" ((USItype) (ah)),                                     \
>              "g" ((USItype) (bh)),                                      \
>              "%1" ((USItype) (al)),                                     \
>              "g" ((USItype) (bl)))
>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>    __asm__ ("subl2 %5,%1\n\tsbwc %3,%0"                                 \
> -          : "=g" ((USItype) (sh)),                                     \
> -            "=&g" ((USItype) (sl))                                     \
> +          : "=g" (sh)),                                                \
> +            "=&g" (sl)                                                 \
>            : "0" ((USItype) (ah)),                                      \
>              "g" ((USItype) (bh)),                                      \
>              "1" ((USItype) (al)),                                      \
> --
> 2.34.1
>
  
Cristian Rodríguez Nov. 2, 2022, 3:14 p.m. UTC | #8
On Tue, Nov 1, 2022 at 2:06 PM Adhemerval Zanella Netto via Libc-alpha
<libc-alpha@sourceware.org> wrote:

> I am open to suggestions in fact,

What about just using the compiler builtins directly and not using
this header at all?
  
Adhemerval Zanella Nov. 2, 2022, 5:10 p.m. UTC | #9
On 02/11/22 12:14, Cristian Rodríguez wrote:
> On Tue, Nov 1, 2022 at 2:06 PM Adhemerval Zanella Netto via Libc-alpha
> <libc-alpha@sourceware.org> wrote:
> 
>> I am open to suggestions in fact,
> 
> What about just using the compiler builtins directly and not using
> this header at all?

My understanding is this header should be used in the scenario where the
builtin might generate libcalls, for instance on libgcc and/or libc.
  
Cristian Rodríguez Nov. 2, 2022, 7:43 p.m. UTC | #10
On Wed, Nov 2, 2022 at 2:10 PM Adhemerval Zanella Netto
<adhemerval.zanella@linaro.org> wrote:
>
>
>
> On 02/11/22 12:14, Cristian Rodríguez wrote:
> > On Tue, Nov 1, 2022 at 2:06 PM Adhemerval Zanella Netto via Libc-alpha
> > <libc-alpha@sourceware.org> wrote:
> >
> >> I am open to suggestions in fact,
> >
> > What about just using the compiler builtins directly and not using
> > this header at all?
>
> My understanding is this header should be used in the scenario where the
> builtin might generate libcalls, for instance on libgcc and/or libc.

My - I confess very limited - research the other day suggests there
are very few targets without __clz* __ctz__ patterns.. On this case it
will indeed call libgcc (is that frowned upon still?) but not libc ...
  
Adhemerval Zanella Nov. 3, 2022, 12:17 p.m. UTC | #11
On 02/11/22 16:43, Cristian Rodríguez wrote:
> On Wed, Nov 2, 2022 at 2:10 PM Adhemerval Zanella Netto
> <adhemerval.zanella@linaro.org> wrote:
>>
>>
>>
>> On 02/11/22 12:14, Cristian Rodríguez wrote:
>>> On Tue, Nov 1, 2022 at 2:06 PM Adhemerval Zanella Netto via Libc-alpha
>>> <libc-alpha@sourceware.org> wrote:
>>>
>>>> I am open to suggestions in fact,
>>>
>>> What about just using the compiler builtins directly and not using
>>> this header at all?
>>
>> My understanding is this header should be used in the scenario where the
>> builtin might generate libcalls, for instance on libgcc and/or libc.
> 
> My - I confess very limited - research the other day suggests there
> are very few targets without __clz* __ctz__ patterns.. On this case it
> will indeed call libgcc (is that frowned upon still?) but not libc ...

This header is also quite ancient, I think it provided the counter leading
and trailing zero even before the ctz/clz builtins and before ffs libc function.
But I agree with you that builtins should be used when possible.

Another issue is the ctz/clz analogous is not the only interface it provides,
but also a some macros used extensively on some soft-fp routines.  We will
also need to rewrite a lot of interfaces, which is shared with gcc as well.
  
Fangrui Song Nov. 6, 2022, 7:30 p.m. UTC | #12
On 2022-11-01, Andrew Pinski via Libc-alpha wrote:
> On Fri, Oct 28, 2022 at 10:36 AM Adhemerval Zanella via Libc-alpha
><libc-alpha@sourceware.org> wrote:
>>
>> From: Fangrui Song <maskray@google.com>
>>
>> An output constraint takes a lvalue. While GCC happily strips the
>> incorrect lvalue to rvalue conversion, Clang rejects the code by
>> default:
>
>For GCC this is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=2803 .
>I wrote about the ones in longlong.h (inside GCC sources) in comment
>#11 back in 2004 when I tried to fix GCC's front-end to reject this.
>
>Thanks,
>Andrew

Thanks for the comment.  Would GCC side consider
https://gcc.gnu.org/pipermail/gcc-patches/2021-October/581722.html ?
If GCC takes the patch to its diverged GMP 2.0 copy (released 1996), glibc can import the change.

>
>
>>
>>     error: invalid use of a cast in a inline asm context requiring an lvalue: remove the cast or build with -fheinous-gnu-extensions
>> ---
>>  stdlib/longlong.h | 186 +++++++++++++++++++++++-----------------------
>>  1 file changed, 93 insertions(+), 93 deletions(-)
>>
>> diff --git a/stdlib/longlong.h b/stdlib/longlong.h
>> index d8f76a43b5..303cc4e8d0 100644
>> --- a/stdlib/longlong.h
>> +++ b/stdlib/longlong.h
>> @@ -194,8 +194,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>>  #if defined (__arc__) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add.f      %1, %4, %5\n\tadc       %0, %2, %3"             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%r" ((USItype) (ah)),                                     \
>>              "rICal" ((USItype) (bh)),                                  \
>>              "%r" ((USItype) (al)),                                     \
>> @@ -203,8 +203,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>>            : "cc")
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub.f      %1, %4, %5\n\tsbc       %0, %2, %3"             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "r" ((USItype) (ah)),                                      \
>>              "rICal" ((USItype) (bh)),                                  \
>>              "r" ((USItype) (al)),                                      \
>> @@ -230,16 +230,16 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>>   && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("adds       %1, %4, %5\n\tadc       %0, %2, %3"             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%r" ((USItype) (ah)),                                     \
>>              "rI" ((USItype) (bh)),                                     \
>>              "%r" ((USItype) (al)),                                     \
>>              "rI" ((USItype) (bl)) __CLOBBER_CC)
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("subs       %1, %4, %5\n\tsbc       %0, %2, %3"             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "r" ((USItype) (ah)),                                      \
>>              "rI" ((USItype) (bh)),                                     \
>>              "r" ((USItype) (al)),                                      \
>> @@ -262,8 +262,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>>            "    addcs   %0, %0, #65536\n"                               \
>>            "    adds    %1, %1, %3, lsl #16\n"                          \
>>            "    adc     %0, %0, %3, lsr #16"                            \
>> -          : "=&r" ((USItype) (xh)),                                    \
>> -            "=r" ((USItype) (xl)),                                     \
>> +          : "=&r" (xh),                                                \
>> +            "=r" (xl),                                                 \
>>              "=&r" (__t0), "=&r" (__t1), "=r" (__t2)                    \
>>            : "r" ((USItype) (a)),                                       \
>>              "r" ((USItype) (b)) __CLOBBER_CC );                        \
>> @@ -348,16 +348,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__hppa) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0"                             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%rM" ((USItype) (ah)),                                    \
>>              "rM" ((USItype) (bh)),                                     \
>>              "%rM" ((USItype) (al)),                                    \
>>              "rM" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0"                             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "rM" ((USItype) (ah)),                                     \
>>              "rM" ((USItype) (bh)),                                     \
>>              "rM" ((USItype) (al)),                                     \
>> @@ -456,30 +456,30 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add{l} {%5,%1|%1,%5}\n\tadc{l} {%3,%0|%0,%3}"              \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%0" ((USItype) (ah)),                                     \
>>              "g" ((USItype) (bh)),                                      \
>>              "%1" ((USItype) (al)),                                     \
>>              "g" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub{l} {%5,%1|%1,%5}\n\tsbb{l} {%3,%0|%0,%3}"              \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "g" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>>              "g" ((USItype) (bl)))
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("mul{l} %3"                                                 \
>> -          : "=a" ((USItype) (w0)),                                     \
>> -            "=d" ((USItype) (w1))                                      \
>> +          : "=a" (w0),                                                 \
>> +            "=d" (w1)                                                  \
>>            : "%0" ((USItype) (u)),                                      \
>>              "rm" ((USItype) (v)))
>>  #define udiv_qrnnd(q, r, n1, n0, dv) \
>>    __asm__ ("div{l} %4"                                                 \
>> -          : "=a" ((USItype) (q)),                                      \
>> -            "=d" ((USItype) (r))                                       \
>> +          : "=a" (q),                                                  \
>> +            "=d" (r)                                                   \
>>            : "0" ((USItype) (n0)),                                      \
>>              "1" ((USItype) (n1)),                                      \
>>              "rm" ((USItype) (dv)))
>> @@ -492,30 +492,30 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__x86_64__) && W_TYPE_SIZE == 64
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add{q} {%5,%1|%1,%5}\n\tadc{q} {%3,%0|%0,%3}"              \
>> -          : "=r" ((UDItype) (sh)),                                     \
>> -            "=&r" ((UDItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%0" ((UDItype) (ah)),                                     \
>>              "rme" ((UDItype) (bh)),                                    \
>>              "%1" ((UDItype) (al)),                                     \
>>              "rme" ((UDItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub{q} {%5,%1|%1,%5}\n\tsbb{q} {%3,%0|%0,%3}"              \
>> -          : "=r" ((UDItype) (sh)),                                     \
>> -            "=&r" ((UDItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((UDItype) (ah)),                                      \
>>              "rme" ((UDItype) (bh)),                                    \
>>              "1" ((UDItype) (al)),                                      \
>>              "rme" ((UDItype) (bl)))
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("mul{q} %3"                                                 \
>> -          : "=a" ((UDItype) (w0)),                                     \
>> -            "=d" ((UDItype) (w1))                                      \
>> +          : "=a" (w0),                                                 \
>> +            "=d" (w1)                                                  \
>>            : "%0" ((UDItype) (u)),                                      \
>>              "rm" ((UDItype) (v)))
>>  #define udiv_qrnnd(q, r, n1, n0, dv) \
>>    __asm__ ("div{q} %4"                                                 \
>> -          : "=a" ((UDItype) (q)),                                      \
>> -            "=d" ((UDItype) (r))                                       \
>> +          : "=a" (q),                                                  \
>> +            "=d" (r)                                                   \
>>            : "0" ((UDItype) (n0)),                                      \
>>              "1" ((UDItype) (n1)),                                      \
>>              "rm" ((UDItype) (dv)))
>> @@ -609,8 +609,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    /* The cmp clears the condition bit.  */ \
>>    __asm__ ("cmp %0,%0\n\taddx %1,%5\n\taddx %0,%3"                     \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "r" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> @@ -619,8 +619,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    /* The cmp clears the condition bit.  */ \
>>    __asm__ ("cmp %0,%0\n\tsubx %1,%5\n\tsubx %0,%3"                     \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "r" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> @@ -631,16 +631,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__mc68000__) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0"                             \
>> -          : "=d" ((USItype) (sh)),                                     \
>> -            "=&d" ((USItype) (sl))                                     \
>> +          : "=d" (sh),                                                 \
>> +            "=&d" (sl)                                                 \
>>            : "%0" ((USItype) (ah)),                                     \
>>              "d" ((USItype) (bh)),                                      \
>>              "%1" ((USItype) (al)),                                     \
>>              "g" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0"                             \
>> -          : "=d" ((USItype) (sh)),                                     \
>> -            "=&d" ((USItype) (sl))                                     \
>> +          : "=d" (sh),                                                 \
>> +            "=&d" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "d" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> @@ -650,23 +650,23 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if (defined (__mc68020__) && !defined (__mc68060__))
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("mulu%.l %3,%1:%0"                                          \
>> -          : "=d" ((USItype) (w0)),                                     \
>> -            "=d" ((USItype) (w1))                                      \
>> +          : "=d" (w0),                                                 \
>> +            "=d" (w1)                                                  \
>>            : "%0" ((USItype) (u)),                                      \
>>              "dmi" ((USItype) (v)))
>>  #define UMUL_TIME 45
>>  #define udiv_qrnnd(q, r, n1, n0, d) \
>>    __asm__ ("divu%.l %4,%1:%0"                                          \
>> -          : "=d" ((USItype) (q)),                                      \
>> -            "=d" ((USItype) (r))                                       \
>> +          : "=d" (q),                                                  \
>> +            "=d" (r)                                                   \
>>            : "0" ((USItype) (n0)),                                      \
>>              "1" ((USItype) (n1)),                                      \
>>              "dmi" ((USItype) (d)))
>>  #define UDIV_TIME 90
>>  #define sdiv_qrnnd(q, r, n1, n0, d) \
>>    __asm__ ("divs%.l %4,%1:%0"                                          \
>> -          : "=d" ((USItype) (q)),                                      \
>> -            "=d" ((USItype) (r))                                       \
>> +          : "=d" (q),                                                  \
>> +            "=d" (r)                                                   \
>>            : "0" ((USItype) (n0)),                                      \
>>              "1" ((USItype) (n1)),                                      \
>>              "dmi" ((USItype) (d)))
>> @@ -700,8 +700,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>            "    move%.l %/d2,%1\n"                                      \
>>            "    add%.l  %/d1,%/d0\n"                                    \
>>            "    move%.l %/d0,%0"                                        \
>> -          : "=g" ((USItype) (xh)),                                     \
>> -            "=g" ((USItype) (xl))                                      \
>> +          : "=g" (xh),                                                 \
>> +            "=g" (xl)                                                  \
>>            : "g" ((USItype) (a)),                                       \
>>              "g" ((USItype) (b))                                        \
>>            : "d0", "d1", "d2", "d3", "d4")
>> @@ -736,8 +736,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>            "    move%.l %/d2,%1\n"                                      \
>>            "    add%.l  %/d1,%/d0\n"                                    \
>>            "    move%.l %/d0,%0"                                        \
>> -          : "=g" ((USItype) (xh)),                                     \
>> -            "=g" ((USItype) (xl))                                      \
>> +          : "=g" (xh)),                                                \
>> +            "=g" (xl)                                                  \
>>            : "g" ((USItype) (a)),                                       \
>>              "g" ((USItype) (b))                                        \
>>            : "d0", "d1", "d2", "d3", "d4")
>> @@ -751,7 +751,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__mc68020__) && !defined (__mcpu32__)
>>  #define count_leading_zeros(count, x) \
>>    __asm__ ("bfffo %1{%b2:%b2},%0"                                      \
>> -          : "=d" ((USItype) (count))                                   \
>> +          : "=d" (count)                                               \
>>            : "od" ((USItype) (x)), "n" (0))
>>  /* Some ColdFire architectures have a ff1 instruction supported via
>>     __builtin_clz. */
>> @@ -764,16 +764,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__m88000__) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3"                  \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%rJ" ((USItype) (ah)),                                    \
>>              "rJ" ((USItype) (bh)),                                     \
>>              "%rJ" ((USItype) (al)),                                    \
>>              "rJ" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3"                  \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "rJ" ((USItype) (ah)),                                     \
>>              "rJ" ((USItype) (bh)),                                     \
>>              "rJ" ((USItype) (al)),                                     \
>> @@ -1000,16 +1000,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("a %1,%5\n\tae %0,%3"                                       \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%0" ((USItype) (ah)),                                     \
>>              "r" ((USItype) (bh)),                                      \
>>              "%1" ((USItype) (al)),                                     \
>>              "r" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("s %1,%5\n\tse %0,%3"                                       \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "r" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> @@ -1038,8 +1038,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  "      m       r2,%3\n"                                                \
>>  "      cas     %0,r2,r0\n"                                             \
>>  "      mfs     r10,%1"                                                 \
>> -            : "=r" ((USItype) (ph)),                                   \
>> -              "=r" ((USItype) (pl))                                    \
>> +            : "=r" (ph),                                               \
>> +              "=r" (pl)                                                \
>>              : "%r" (__m0),                                             \
>>                 "r" (__m1)                                              \
>>              : "r2");                                                   \
>> @@ -1052,12 +1052,12 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>    do {                                                                 \
>>      if ((x) >= 0x10000)                                                        \
>>        __asm__ ("clz    %0,%1"                                          \
>> -              : "=r" ((USItype) (count))                               \
>> +              : "=r" (count)                                           \
>>                : "r" ((USItype) (x) >> 16));                            \
>>      else                                                               \
>>        {                                                                        \
>>         __asm__ ("clz   %0,%1"                                          \
>> -                : "=r" ((USItype) (count))                             \
>> +                : "=r" (count)                                         \
>>                  : "r" ((USItype) (x)));                                        \
>>         (count) += 16;                                                  \
>>        }                                                                        \
>> @@ -1119,8 +1119,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ (                                                            \
>>         "dmulu.l        %2,%3\n\tsts%M1 macl,%1\n\tsts%M0       mach,%0"        \
>> -          : "=r<" ((USItype)(w1)),                                     \
>> -            "=r<" ((USItype)(w0))                                      \
>> +          : "=r<" (w1),                                                \
>> +            "=r<" (w0)                                                 \
>>            : "r" ((USItype)(u)),                                        \
>>              "r" ((USItype)(v))                                         \
>>            : "macl", "mach")
>> @@ -1191,8 +1191,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>      && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0"                         \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%rJ" ((USItype) (ah)),                                    \
>>              "rI" ((USItype) (bh)),                                     \
>>              "%rJ" ((USItype) (al)),                                    \
>> @@ -1200,8 +1200,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>            __CLOBBER_CC)
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0"                         \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "rJ" ((USItype) (ah)),                                     \
>>              "rI" ((USItype) (bh)),                                     \
>>              "rJ" ((USItype) (al)),                                     \
>> @@ -1213,7 +1213,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>      register USItype __g1 asm ("g1");                                  \
>>      __asm__ ("umul\t%2,%3,%1\n\t"                                      \
>>              "srlx\t%1, 32, %0"                                         \
>> -            : "=r" ((USItype) (w1)),                                   \
>> +            : "=r" (w1),                                               \
>>                "=r" (__g1)                                              \
>>              : "r" ((USItype) (u)),                                     \
>>                "r" ((USItype) (v)));                                    \
>> @@ -1224,8 +1224,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>            "udiv\t%3,%4,%0\n\t"                                         \
>>            "umul\t%0,%4,%1\n\t"                                         \
>>            "sub\t%3,%1,%1"                                              \
>> -          : "=&r" ((USItype) (__q)),                                   \
>> -            "=&r" ((USItype) (__r))                                    \
>> +          : "=&r" (__q),                                               \
>> +            "=&r" (__r)                                                \
>>            : "r" ((USItype) (__n1)),                                    \
>>              "r" ((USItype) (__n0)),                                    \
>>              "r" ((USItype) (__d)))
>> @@ -1233,14 +1233,14 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__sparc_v8__)
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
>> -          : "=r" ((USItype) (w1)),                                     \
>> -            "=r" ((USItype) (w0))                                      \
>> +          : "=r" (w1),                                                 \
>> +            "=r" (w0)                                                  \
>>            : "r" ((USItype) (u)),                                       \
>>              "r" ((USItype) (v)))
>>  #define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
>>    __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
>> -          : "=&r" ((USItype) (__q)),                                   \
>> -            "=&r" ((USItype) (__r))                                    \
>> +          : "=&r" (__q),                                               \
>> +            "=&r" (__r)                                                \
>>            : "r" ((USItype) (__n1)),                                    \
>>              "r" ((USItype) (__n0)),                                    \
>>              "r" ((USItype) (__d)))
>> @@ -1250,8 +1250,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>     instructions scan (ffs from high bit) and divscc.  */
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
>> -          : "=r" ((USItype) (w1)),                                     \
>> -            "=r" ((USItype) (w0))                                      \
>> +          : "=r" (w1),                                                 \
>> +            "=r" (w0)                                                  \
>>            : "r" ((USItype) (u)),                                       \
>>              "r" ((USItype) (v)))
>>  #define udiv_qrnnd(q, r, n1, n0, d) \
>> @@ -1294,8 +1294,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  "      bl,a 1f\n"                                                      \
>>  "      add     %1,%4,%1\n"                                             \
>>  "1:    ! End of inline udiv_qrnnd"                                     \
>> -          : "=r" ((USItype) (q)),                                      \
>> -            "=r" ((USItype) (r))                                       \
>> +          : "=r" (q),                                                  \
>> +            "=r" (r)                                                   \
>>            : "r" ((USItype) (n1)),                                      \
>>              "r" ((USItype) (n0)),                                      \
>>              "rI" ((USItype) (d))                                       \
>> @@ -1304,7 +1304,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #define count_leading_zeros(count, x) \
>>    do {                                                                  \
>>    __asm__ ("scan %1,1,%0"                                               \
>> -          : "=r" ((USItype) (count))                                   \
>> +          : "=r" (count)                                               \
>>            : "r" ((USItype) (x)));                                      \
>>    } while (0)
>>  /* Early sparclites return 63 for an argument of 0, but they warn that future
>> @@ -1354,8 +1354,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  "      mulscc  %%g1,0,%%g1\n"                                          \
>>  "      add     %%g1,%%o5,%0\n"                                         \
>>  "      rd      %%y,%1"                                                 \
>> -          : "=r" ((USItype) (w1)),                                     \
>> -            "=r" ((USItype) (w0))                                      \
>> +          : "=r" (w1),                                                 \
>> +            "=r" (w0)                                                  \
>>            : "%rI" ((USItype) (u)),                                     \
>>              "r" ((USItype) (v))                                                \
>>            : "g1", "o5" __AND_CLOBBER_CC)
>> @@ -1387,8 +1387,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  "      sub     %1,%2,%1\n"                                             \
>>  "3:    xnor    %0,0,%0\n"                                              \
>>  "      ! End of inline udiv_qrnnd"                                     \
>> -          : "=&r" ((USItype) (__q)),                                   \
>> -            "=&r" ((USItype) (__r))                                    \
>> +          : "=&r" (__q),                                               \
>> +            "=&r" (__r)                                                \
>>            : "r" ((USItype) (__d)),                                     \
>>              "1" ((USItype) (__n1)),                                    \
>>              "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC)
>> @@ -1407,8 +1407,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>              "add\t%r3,%4,%0\n\t"                                       \
>>              "movcs\t%%xcc, 1, %2\n\t"                                  \
>>              "add\t%0, %2, %0"                                          \
>> -            : "=r" ((UDItype)(sh)),                                    \
>> -              "=&r" ((UDItype)(sl)),                                   \
>> +            : "=r" (sh),                                               \
>> +              "=&r" (sl),                                              \
>>                "+r" (__carry)                                           \
>>              : "%rJ" ((UDItype)(ah)),                                   \
>>                "rI" ((UDItype)(bh)),                                    \
>> @@ -1424,8 +1424,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>              "sub\t%r3,%4,%0\n\t"                                       \
>>              "movcs\t%%xcc, 1, %2\n\t"                                  \
>>              "sub\t%0, %2, %0"                                          \
>> -            : "=r" ((UDItype)(sh)),                                    \
>> -              "=&r" ((UDItype)(sl)),                                   \
>> +            : "=r" (sh),                                               \
>> +              "=&r" (sl),                                              \
>>                "+r" (__carry)                                           \
>>              : "%rJ" ((UDItype)(ah)),                                   \
>>                "rI" ((UDItype)(bh)),                                    \
>> @@ -1459,8 +1459,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>                    "sllx %3,32,%3\n\t"                                  \
>>                    "add %1,%3,%1\n\t"                                   \
>>                    "add %5,%2,%0"                                       \
>> -          : "=r" ((UDItype)(wh)),                                      \
>> -            "=&r" ((UDItype)(wl)),                                     \
>> +          : "=r" (wh),                                                 \
>> +            "=&r" (wl),                                                \
>>              "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4)     \
>>            : "r" ((UDItype)(u)),                                        \
>>              "r" ((UDItype)(v))                                         \
>> @@ -1473,16 +1473,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__vax__) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("addl2 %5,%1\n\tadwc %3,%0"                                 \
>> -          : "=g" ((USItype) (sh)),                                     \
>> -            "=&g" ((USItype) (sl))                                     \
>> +          : "=g" (sh)),                                                \
>> +            "=&g" (sl)                                                 \
>>            : "%0" ((USItype) (ah)),                                     \
>>              "g" ((USItype) (bh)),                                      \
>>              "%1" ((USItype) (al)),                                     \
>>              "g" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("subl2 %5,%1\n\tsbwc %3,%0"                                 \
>> -          : "=g" ((USItype) (sh)),                                     \
>> -            "=&g" ((USItype) (sl))                                     \
>> +          : "=g" (sh)),                                                \
>> +            "=&g" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "g" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> --
>> 2.34.1
>>
  
Fangrui Song Nov. 6, 2022, 7:32 p.m. UTC | #13
[Fixing email address.. Really sorry for my mistake.]

On 2022-11-01, Andrew Pinski via Libc-alpha wrote:
> On Fri, Oct 28, 2022 at 10:36 AM Adhemerval Zanella via Libc-alpha
><libc-alpha@sourceware.org> wrote:
>>
>> From: Fangrui Song <maskray@google.com>
>>
>> An output constraint takes a lvalue. While GCC happily strips the
>> incorrect lvalue to rvalue conversion, Clang rejects the code by
>> default:
>
>For GCC this is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=2803 .
>I wrote about the ones in longlong.h (inside GCC sources) in comment
>#11 back in 2004 when I tried to fix GCC's front-end to reject this.
>
>Thanks,
>Andrew

Thanks for the comment.  Would GCC side consider
https://gcc.gnu.org/pipermail/gcc-patches/2021-October/581722.html ?
If GCC takes the patch to its diverged GMP 2.0 copy (released 1996), glibc can import the change.

>
>
>>
>>     error: invalid use of a cast in a inline asm context requiring an lvalue: remove the cast or build with -fheinous-gnu-extensions
>> ---
>>  stdlib/longlong.h | 186 +++++++++++++++++++++++-----------------------
>>  1 file changed, 93 insertions(+), 93 deletions(-)
>>
>> diff --git a/stdlib/longlong.h b/stdlib/longlong.h
>> index d8f76a43b5..303cc4e8d0 100644
>> --- a/stdlib/longlong.h
>> +++ b/stdlib/longlong.h
>> @@ -194,8 +194,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>>  #if defined (__arc__) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add.f      %1, %4, %5\n\tadc       %0, %2, %3"             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%r" ((USItype) (ah)),                                     \
>>              "rICal" ((USItype) (bh)),                                  \
>>              "%r" ((USItype) (al)),                                     \
>> @@ -203,8 +203,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>>            : "cc")
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub.f      %1, %4, %5\n\tsbc       %0, %2, %3"             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "r" ((USItype) (ah)),                                      \
>>              "rICal" ((USItype) (bh)),                                  \
>>              "r" ((USItype) (al)),                                      \
>> @@ -230,16 +230,16 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>>   && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("adds       %1, %4, %5\n\tadc       %0, %2, %3"             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%r" ((USItype) (ah)),                                     \
>>              "rI" ((USItype) (bh)),                                     \
>>              "%r" ((USItype) (al)),                                     \
>>              "rI" ((USItype) (bl)) __CLOBBER_CC)
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("subs       %1, %4, %5\n\tsbc       %0, %2, %3"             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "r" ((USItype) (ah)),                                      \
>>              "rI" ((USItype) (bh)),                                     \
>>              "r" ((USItype) (al)),                                      \
>> @@ -262,8 +262,8 @@ extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
>>            "    addcs   %0, %0, #65536\n"                               \
>>            "    adds    %1, %1, %3, lsl #16\n"                          \
>>            "    adc     %0, %0, %3, lsr #16"                            \
>> -          : "=&r" ((USItype) (xh)),                                    \
>> -            "=r" ((USItype) (xl)),                                     \
>> +          : "=&r" (xh),                                                \
>> +            "=r" (xl),                                                 \
>>              "=&r" (__t0), "=&r" (__t1), "=r" (__t2)                    \
>>            : "r" ((USItype) (a)),                                       \
>>              "r" ((USItype) (b)) __CLOBBER_CC );                        \
>> @@ -348,16 +348,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__hppa) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0"                             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%rM" ((USItype) (ah)),                                    \
>>              "rM" ((USItype) (bh)),                                     \
>>              "%rM" ((USItype) (al)),                                    \
>>              "rM" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0"                             \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "rM" ((USItype) (ah)),                                     \
>>              "rM" ((USItype) (bh)),                                     \
>>              "rM" ((USItype) (al)),                                     \
>> @@ -456,30 +456,30 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add{l} {%5,%1|%1,%5}\n\tadc{l} {%3,%0|%0,%3}"              \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%0" ((USItype) (ah)),                                     \
>>              "g" ((USItype) (bh)),                                      \
>>              "%1" ((USItype) (al)),                                     \
>>              "g" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub{l} {%5,%1|%1,%5}\n\tsbb{l} {%3,%0|%0,%3}"              \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "g" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>>              "g" ((USItype) (bl)))
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("mul{l} %3"                                                 \
>> -          : "=a" ((USItype) (w0)),                                     \
>> -            "=d" ((USItype) (w1))                                      \
>> +          : "=a" (w0),                                                 \
>> +            "=d" (w1)                                                  \
>>            : "%0" ((USItype) (u)),                                      \
>>              "rm" ((USItype) (v)))
>>  #define udiv_qrnnd(q, r, n1, n0, dv) \
>>    __asm__ ("div{l} %4"                                                 \
>> -          : "=a" ((USItype) (q)),                                      \
>> -            "=d" ((USItype) (r))                                       \
>> +          : "=a" (q),                                                  \
>> +            "=d" (r)                                                   \
>>            : "0" ((USItype) (n0)),                                      \
>>              "1" ((USItype) (n1)),                                      \
>>              "rm" ((USItype) (dv)))
>> @@ -492,30 +492,30 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__x86_64__) && W_TYPE_SIZE == 64
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add{q} {%5,%1|%1,%5}\n\tadc{q} {%3,%0|%0,%3}"              \
>> -          : "=r" ((UDItype) (sh)),                                     \
>> -            "=&r" ((UDItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%0" ((UDItype) (ah)),                                     \
>>              "rme" ((UDItype) (bh)),                                    \
>>              "%1" ((UDItype) (al)),                                     \
>>              "rme" ((UDItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub{q} {%5,%1|%1,%5}\n\tsbb{q} {%3,%0|%0,%3}"              \
>> -          : "=r" ((UDItype) (sh)),                                     \
>> -            "=&r" ((UDItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((UDItype) (ah)),                                      \
>>              "rme" ((UDItype) (bh)),                                    \
>>              "1" ((UDItype) (al)),                                      \
>>              "rme" ((UDItype) (bl)))
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("mul{q} %3"                                                 \
>> -          : "=a" ((UDItype) (w0)),                                     \
>> -            "=d" ((UDItype) (w1))                                      \
>> +          : "=a" (w0),                                                 \
>> +            "=d" (w1)                                                  \
>>            : "%0" ((UDItype) (u)),                                      \
>>              "rm" ((UDItype) (v)))
>>  #define udiv_qrnnd(q, r, n1, n0, dv) \
>>    __asm__ ("div{q} %4"                                                 \
>> -          : "=a" ((UDItype) (q)),                                      \
>> -            "=d" ((UDItype) (r))                                       \
>> +          : "=a" (q),                                                  \
>> +            "=d" (r)                                                   \
>>            : "0" ((UDItype) (n0)),                                      \
>>              "1" ((UDItype) (n1)),                                      \
>>              "rm" ((UDItype) (dv)))
>> @@ -609,8 +609,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    /* The cmp clears the condition bit.  */ \
>>    __asm__ ("cmp %0,%0\n\taddx %1,%5\n\taddx %0,%3"                     \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "r" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> @@ -619,8 +619,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    /* The cmp clears the condition bit.  */ \
>>    __asm__ ("cmp %0,%0\n\tsubx %1,%5\n\tsubx %0,%3"                     \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "r" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> @@ -631,16 +631,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__mc68000__) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0"                             \
>> -          : "=d" ((USItype) (sh)),                                     \
>> -            "=&d" ((USItype) (sl))                                     \
>> +          : "=d" (sh),                                                 \
>> +            "=&d" (sl)                                                 \
>>            : "%0" ((USItype) (ah)),                                     \
>>              "d" ((USItype) (bh)),                                      \
>>              "%1" ((USItype) (al)),                                     \
>>              "g" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0"                             \
>> -          : "=d" ((USItype) (sh)),                                     \
>> -            "=&d" ((USItype) (sl))                                     \
>> +          : "=d" (sh),                                                 \
>> +            "=&d" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "d" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> @@ -650,23 +650,23 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if (defined (__mc68020__) && !defined (__mc68060__))
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("mulu%.l %3,%1:%0"                                          \
>> -          : "=d" ((USItype) (w0)),                                     \
>> -            "=d" ((USItype) (w1))                                      \
>> +          : "=d" (w0),                                                 \
>> +            "=d" (w1)                                                  \
>>            : "%0" ((USItype) (u)),                                      \
>>              "dmi" ((USItype) (v)))
>>  #define UMUL_TIME 45
>>  #define udiv_qrnnd(q, r, n1, n0, d) \
>>    __asm__ ("divu%.l %4,%1:%0"                                          \
>> -          : "=d" ((USItype) (q)),                                      \
>> -            "=d" ((USItype) (r))                                       \
>> +          : "=d" (q),                                                  \
>> +            "=d" (r)                                                   \
>>            : "0" ((USItype) (n0)),                                      \
>>              "1" ((USItype) (n1)),                                      \
>>              "dmi" ((USItype) (d)))
>>  #define UDIV_TIME 90
>>  #define sdiv_qrnnd(q, r, n1, n0, d) \
>>    __asm__ ("divs%.l %4,%1:%0"                                          \
>> -          : "=d" ((USItype) (q)),                                      \
>> -            "=d" ((USItype) (r))                                       \
>> +          : "=d" (q),                                                  \
>> +            "=d" (r)                                                   \
>>            : "0" ((USItype) (n0)),                                      \
>>              "1" ((USItype) (n1)),                                      \
>>              "dmi" ((USItype) (d)))
>> @@ -700,8 +700,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>            "    move%.l %/d2,%1\n"                                      \
>>            "    add%.l  %/d1,%/d0\n"                                    \
>>            "    move%.l %/d0,%0"                                        \
>> -          : "=g" ((USItype) (xh)),                                     \
>> -            "=g" ((USItype) (xl))                                      \
>> +          : "=g" (xh),                                                 \
>> +            "=g" (xl)                                                  \
>>            : "g" ((USItype) (a)),                                       \
>>              "g" ((USItype) (b))                                        \
>>            : "d0", "d1", "d2", "d3", "d4")
>> @@ -736,8 +736,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>            "    move%.l %/d2,%1\n"                                      \
>>            "    add%.l  %/d1,%/d0\n"                                    \
>>            "    move%.l %/d0,%0"                                        \
>> -          : "=g" ((USItype) (xh)),                                     \
>> -            "=g" ((USItype) (xl))                                      \
>> +          : "=g" (xh)),                                                \
>> +            "=g" (xl)                                                  \
>>            : "g" ((USItype) (a)),                                       \
>>              "g" ((USItype) (b))                                        \
>>            : "d0", "d1", "d2", "d3", "d4")
>> @@ -751,7 +751,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__mc68020__) && !defined (__mcpu32__)
>>  #define count_leading_zeros(count, x) \
>>    __asm__ ("bfffo %1{%b2:%b2},%0"                                      \
>> -          : "=d" ((USItype) (count))                                   \
>> +          : "=d" (count)                                               \
>>            : "od" ((USItype) (x)), "n" (0))
>>  /* Some ColdFire architectures have a ff1 instruction supported via
>>     __builtin_clz. */
>> @@ -764,16 +764,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__m88000__) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3"                  \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%rJ" ((USItype) (ah)),                                    \
>>              "rJ" ((USItype) (bh)),                                     \
>>              "%rJ" ((USItype) (al)),                                    \
>>              "rJ" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3"                  \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "rJ" ((USItype) (ah)),                                     \
>>              "rJ" ((USItype) (bh)),                                     \
>>              "rJ" ((USItype) (al)),                                     \
>> @@ -1000,16 +1000,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("a %1,%5\n\tae %0,%3"                                       \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%0" ((USItype) (ah)),                                     \
>>              "r" ((USItype) (bh)),                                      \
>>              "%1" ((USItype) (al)),                                     \
>>              "r" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("s %1,%5\n\tse %0,%3"                                       \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "r" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> @@ -1038,8 +1038,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  "      m       r2,%3\n"                                                \
>>  "      cas     %0,r2,r0\n"                                             \
>>  "      mfs     r10,%1"                                                 \
>> -            : "=r" ((USItype) (ph)),                                   \
>> -              "=r" ((USItype) (pl))                                    \
>> +            : "=r" (ph),                                               \
>> +              "=r" (pl)                                                \
>>              : "%r" (__m0),                                             \
>>                 "r" (__m1)                                              \
>>              : "r2");                                                   \
>> @@ -1052,12 +1052,12 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>    do {                                                                 \
>>      if ((x) >= 0x10000)                                                        \
>>        __asm__ ("clz    %0,%1"                                          \
>> -              : "=r" ((USItype) (count))                               \
>> +              : "=r" (count)                                           \
>>                : "r" ((USItype) (x) >> 16));                            \
>>      else                                                               \
>>        {                                                                        \
>>         __asm__ ("clz   %0,%1"                                          \
>> -                : "=r" ((USItype) (count))                             \
>> +                : "=r" (count)                                         \
>>                  : "r" ((USItype) (x)));                                        \
>>         (count) += 16;                                                  \
>>        }                                                                        \
>> @@ -1119,8 +1119,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ (                                                            \
>>         "dmulu.l        %2,%3\n\tsts%M1 macl,%1\n\tsts%M0       mach,%0"        \
>> -          : "=r<" ((USItype)(w1)),                                     \
>> -            "=r<" ((USItype)(w0))                                      \
>> +          : "=r<" (w1),                                                \
>> +            "=r<" (w0)                                                 \
>>            : "r" ((USItype)(u)),                                        \
>>              "r" ((USItype)(v))                                         \
>>            : "macl", "mach")
>> @@ -1191,8 +1191,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>      && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0"                         \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "%rJ" ((USItype) (ah)),                                    \
>>              "rI" ((USItype) (bh)),                                     \
>>              "%rJ" ((USItype) (al)),                                    \
>> @@ -1200,8 +1200,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>            __CLOBBER_CC)
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0"                         \
>> -          : "=r" ((USItype) (sh)),                                     \
>> -            "=&r" ((USItype) (sl))                                     \
>> +          : "=r" (sh),                                                 \
>> +            "=&r" (sl)                                                 \
>>            : "rJ" ((USItype) (ah)),                                     \
>>              "rI" ((USItype) (bh)),                                     \
>>              "rJ" ((USItype) (al)),                                     \
>> @@ -1213,7 +1213,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>      register USItype __g1 asm ("g1");                                  \
>>      __asm__ ("umul\t%2,%3,%1\n\t"                                      \
>>              "srlx\t%1, 32, %0"                                         \
>> -            : "=r" ((USItype) (w1)),                                   \
>> +            : "=r" (w1),                                               \
>>                "=r" (__g1)                                              \
>>              : "r" ((USItype) (u)),                                     \
>>                "r" ((USItype) (v)));                                    \
>> @@ -1224,8 +1224,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>            "udiv\t%3,%4,%0\n\t"                                         \
>>            "umul\t%0,%4,%1\n\t"                                         \
>>            "sub\t%3,%1,%1"                                              \
>> -          : "=&r" ((USItype) (__q)),                                   \
>> -            "=&r" ((USItype) (__r))                                    \
>> +          : "=&r" (__q),                                               \
>> +            "=&r" (__r)                                                \
>>            : "r" ((USItype) (__n1)),                                    \
>>              "r" ((USItype) (__n0)),                                    \
>>              "r" ((USItype) (__d)))
>> @@ -1233,14 +1233,14 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__sparc_v8__)
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
>> -          : "=r" ((USItype) (w1)),                                     \
>> -            "=r" ((USItype) (w0))                                      \
>> +          : "=r" (w1),                                                 \
>> +            "=r" (w0)                                                  \
>>            : "r" ((USItype) (u)),                                       \
>>              "r" ((USItype) (v)))
>>  #define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
>>    __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
>> -          : "=&r" ((USItype) (__q)),                                   \
>> -            "=&r" ((USItype) (__r))                                    \
>> +          : "=&r" (__q),                                               \
>> +            "=&r" (__r)                                                \
>>            : "r" ((USItype) (__n1)),                                    \
>>              "r" ((USItype) (__n0)),                                    \
>>              "r" ((USItype) (__d)))
>> @@ -1250,8 +1250,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>     instructions scan (ffs from high bit) and divscc.  */
>>  #define umul_ppmm(w1, w0, u, v) \
>>    __asm__ ("umul %2,%3,%1;rd %%y,%0"                                   \
>> -          : "=r" ((USItype) (w1)),                                     \
>> -            "=r" ((USItype) (w0))                                      \
>> +          : "=r" (w1),                                                 \
>> +            "=r" (w0)                                                  \
>>            : "r" ((USItype) (u)),                                       \
>>              "r" ((USItype) (v)))
>>  #define udiv_qrnnd(q, r, n1, n0, d) \
>> @@ -1294,8 +1294,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  "      bl,a 1f\n"                                                      \
>>  "      add     %1,%4,%1\n"                                             \
>>  "1:    ! End of inline udiv_qrnnd"                                     \
>> -          : "=r" ((USItype) (q)),                                      \
>> -            "=r" ((USItype) (r))                                       \
>> +          : "=r" (q),                                                  \
>> +            "=r" (r)                                                   \
>>            : "r" ((USItype) (n1)),                                      \
>>              "r" ((USItype) (n0)),                                      \
>>              "rI" ((USItype) (d))                                       \
>> @@ -1304,7 +1304,7 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #define count_leading_zeros(count, x) \
>>    do {                                                                  \
>>    __asm__ ("scan %1,1,%0"                                               \
>> -          : "=r" ((USItype) (count))                                   \
>> +          : "=r" (count)                                               \
>>            : "r" ((USItype) (x)));                                      \
>>    } while (0)
>>  /* Early sparclites return 63 for an argument of 0, but they warn that future
>> @@ -1354,8 +1354,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  "      mulscc  %%g1,0,%%g1\n"                                          \
>>  "      add     %%g1,%%o5,%0\n"                                         \
>>  "      rd      %%y,%1"                                                 \
>> -          : "=r" ((USItype) (w1)),                                     \
>> -            "=r" ((USItype) (w0))                                      \
>> +          : "=r" (w1),                                                 \
>> +            "=r" (w0)                                                  \
>>            : "%rI" ((USItype) (u)),                                     \
>>              "r" ((USItype) (v))                                                \
>>            : "g1", "o5" __AND_CLOBBER_CC)
>> @@ -1387,8 +1387,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  "      sub     %1,%2,%1\n"                                             \
>>  "3:    xnor    %0,0,%0\n"                                              \
>>  "      ! End of inline udiv_qrnnd"                                     \
>> -          : "=&r" ((USItype) (__q)),                                   \
>> -            "=&r" ((USItype) (__r))                                    \
>> +          : "=&r" (__q),                                               \
>> +            "=&r" (__r)                                                \
>>            : "r" ((USItype) (__d)),                                     \
>>              "1" ((USItype) (__n1)),                                    \
>>              "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC)
>> @@ -1407,8 +1407,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>              "add\t%r3,%4,%0\n\t"                                       \
>>              "movcs\t%%xcc, 1, %2\n\t"                                  \
>>              "add\t%0, %2, %0"                                          \
>> -            : "=r" ((UDItype)(sh)),                                    \
>> -              "=&r" ((UDItype)(sl)),                                   \
>> +            : "=r" (sh),                                               \
>> +              "=&r" (sl),                                              \
>>                "+r" (__carry)                                           \
>>              : "%rJ" ((UDItype)(ah)),                                   \
>>                "rI" ((UDItype)(bh)),                                    \
>> @@ -1424,8 +1424,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>              "sub\t%r3,%4,%0\n\t"                                       \
>>              "movcs\t%%xcc, 1, %2\n\t"                                  \
>>              "sub\t%0, %2, %0"                                          \
>> -            : "=r" ((UDItype)(sh)),                                    \
>> -              "=&r" ((UDItype)(sl)),                                   \
>> +            : "=r" (sh),                                               \
>> +              "=&r" (sl),                                              \
>>                "+r" (__carry)                                           \
>>              : "%rJ" ((UDItype)(ah)),                                   \
>>                "rI" ((UDItype)(bh)),                                    \
>> @@ -1459,8 +1459,8 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>                    "sllx %3,32,%3\n\t"                                  \
>>                    "add %1,%3,%1\n\t"                                   \
>>                    "add %5,%2,%0"                                       \
>> -          : "=r" ((UDItype)(wh)),                                      \
>> -            "=&r" ((UDItype)(wl)),                                     \
>> +          : "=r" (wh),                                                 \
>> +            "=&r" (wl),                                                \
>>              "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4)     \
>>            : "r" ((UDItype)(u)),                                        \
>>              "r" ((UDItype)(v))                                         \
>> @@ -1473,16 +1473,16 @@ extern UDItype __umulsidi3 (USItype, USItype);
>>  #if defined (__vax__) && W_TYPE_SIZE == 32
>>  #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("addl2 %5,%1\n\tadwc %3,%0"                                 \
>> -          : "=g" ((USItype) (sh)),                                     \
>> -            "=&g" ((USItype) (sl))                                     \
>> +          : "=g" (sh)),                                                \
>> +            "=&g" (sl)                                                 \
>>            : "%0" ((USItype) (ah)),                                     \
>>              "g" ((USItype) (bh)),                                      \
>>              "%1" ((USItype) (al)),                                     \
>>              "g" ((USItype) (bl)))
>>  #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
>>    __asm__ ("subl2 %5,%1\n\tsbwc %3,%0"                                 \
>> -          : "=g" ((USItype) (sh)),                                     \
>> -            "=&g" ((USItype) (sl))                                     \
>> +          : "=g" (sh)),                                                \
>> +            "=&g" (sl)                                                 \
>>            : "0" ((USItype) (ah)),                                      \
>>              "g" ((USItype) (bh)),                                      \
>>              "1" ((USItype) (al)),                                      \
>> --
>> 2.34.1
>>
  
Adhemerval Zanella Nov. 7, 2022, 1:39 p.m. UTC | #14
On 06/11/22 16:32, Fangrui Song wrote:
> [Fixing email address.. Really sorry for my mistake.]
> 
> On 2022-11-01, Andrew Pinski via Libc-alpha wrote:
>> On Fri, Oct 28, 2022 at 10:36 AM Adhemerval Zanella via Libc-alpha
>> <libc-alpha@sourceware.org> wrote:
>>>
>>> From: Fangrui Song <maskray@google.com>
>>>
>>> An output constraint takes a lvalue. While GCC happily strips the
>>> incorrect lvalue to rvalue conversion, Clang rejects the code by
>>> default:
>>
>> For GCC this is https://gcc.gnu.org/bugzilla/show_bug.cgi?id=2803 .
>> I wrote about the ones in longlong.h (inside GCC sources) in comment
>> #11 back in 2004 when I tried to fix GCC's front-end to reject this.
>>
>> Thanks,
>> Andrew
> 
> Thanks for the comment.  Would GCC side consider
> https://gcc.gnu.org/pipermail/gcc-patches/2021-October/581722.html ?
> If GCC takes the patch to its diverged GMP 2.0 copy (released 1996), glibc can import the change.

It would make the glibc changes way easier to maintain, since I really
dislike the hack I proposed to fix on glibc side [1] (which I don't
see how to fix it without rewriting a lot of stuff to avoid the use
of longlong.h).

[1] https://patchwork.sourceware.org/project/glibc/patch/20221102145559.1962008-4-adhemerval.zanella@linaro.org/
  

Patch

diff --git a/stdlib/longlong.h b/stdlib/longlong.h
index d8f76a43b5..303cc4e8d0 100644
--- a/stdlib/longlong.h
+++ b/stdlib/longlong.h
@@ -194,8 +194,8 @@  extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
 #if defined (__arc__) && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("add.f	%1, %4, %5\n\tadc	%0, %2, %3"		\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "%r" ((USItype) (ah)),					\
 	     "rICal" ((USItype) (bh)),					\
 	     "%r" ((USItype) (al)),					\
@@ -203,8 +203,8 @@  extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
 	   : "cc")
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("sub.f	%1, %4, %5\n\tsbc	%0, %2, %3"		\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "r" ((USItype) (ah)),					\
 	     "rICal" ((USItype) (bh)),					\
 	     "r" ((USItype) (al)),					\
@@ -230,16 +230,16 @@  extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
  && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("adds	%1, %4, %5\n\tadc	%0, %2, %3"		\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "%r" ((USItype) (ah)),					\
 	     "rI" ((USItype) (bh)),					\
 	     "%r" ((USItype) (al)),					\
 	     "rI" ((USItype) (bl)) __CLOBBER_CC)
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("subs	%1, %4, %5\n\tsbc	%0, %2, %3"		\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "r" ((USItype) (ah)),					\
 	     "rI" ((USItype) (bh)),					\
 	     "r" ((USItype) (al)),					\
@@ -262,8 +262,8 @@  extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype);
 	   "	addcs	%0, %0, #65536\n"				\
 	   "	adds	%1, %1, %3, lsl #16\n"				\
 	   "	adc	%0, %0, %3, lsr #16"				\
-	   : "=&r" ((USItype) (xh)),					\
-	     "=r" ((USItype) (xl)),					\
+	   : "=&r" (xh),						\
+	     "=r" (xl),							\
 	     "=&r" (__t0), "=&r" (__t1), "=r" (__t2)			\
 	   : "r" ((USItype) (a)),					\
 	     "r" ((USItype) (b)) __CLOBBER_CC );			\
@@ -348,16 +348,16 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if defined (__hppa) && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0"				\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "%rM" ((USItype) (ah)),					\
 	     "rM" ((USItype) (bh)),					\
 	     "%rM" ((USItype) (al)),					\
 	     "rM" ((USItype) (bl)))
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0"				\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "rM" ((USItype) (ah)),					\
 	     "rM" ((USItype) (bh)),					\
 	     "rM" ((USItype) (al)),					\
@@ -456,30 +456,30 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("add{l} {%5,%1|%1,%5}\n\tadc{l} {%3,%0|%0,%3}"		\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "%0" ((USItype) (ah)),					\
 	     "g" ((USItype) (bh)),					\
 	     "%1" ((USItype) (al)),					\
 	     "g" ((USItype) (bl)))
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("sub{l} {%5,%1|%1,%5}\n\tsbb{l} {%3,%0|%0,%3}"		\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "0" ((USItype) (ah)),					\
 	     "g" ((USItype) (bh)),					\
 	     "1" ((USItype) (al)),					\
 	     "g" ((USItype) (bl)))
 #define umul_ppmm(w1, w0, u, v) \
   __asm__ ("mul{l} %3"							\
-	   : "=a" ((USItype) (w0)),					\
-	     "=d" ((USItype) (w1))					\
+	   : "=a" (w0),							\
+	     "=d" (w1)							\
 	   : "%0" ((USItype) (u)),					\
 	     "rm" ((USItype) (v)))
 #define udiv_qrnnd(q, r, n1, n0, dv) \
   __asm__ ("div{l} %4"							\
-	   : "=a" ((USItype) (q)),					\
-	     "=d" ((USItype) (r))					\
+	   : "=a" (q),							\
+	     "=d" (r)							\
 	   : "0" ((USItype) (n0)),					\
 	     "1" ((USItype) (n1)),					\
 	     "rm" ((USItype) (dv)))
@@ -492,30 +492,30 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if defined (__x86_64__) && W_TYPE_SIZE == 64
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("add{q} {%5,%1|%1,%5}\n\tadc{q} {%3,%0|%0,%3}"		\
-	   : "=r" ((UDItype) (sh)),					\
-	     "=&r" ((UDItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "%0" ((UDItype) (ah)),					\
 	     "rme" ((UDItype) (bh)),					\
 	     "%1" ((UDItype) (al)),					\
 	     "rme" ((UDItype) (bl)))
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("sub{q} {%5,%1|%1,%5}\n\tsbb{q} {%3,%0|%0,%3}"		\
-	   : "=r" ((UDItype) (sh)),					\
-	     "=&r" ((UDItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "0" ((UDItype) (ah)),					\
 	     "rme" ((UDItype) (bh)),					\
 	     "1" ((UDItype) (al)),					\
 	     "rme" ((UDItype) (bl)))
 #define umul_ppmm(w1, w0, u, v) \
   __asm__ ("mul{q} %3"							\
-	   : "=a" ((UDItype) (w0)),					\
-	     "=d" ((UDItype) (w1))					\
+	   : "=a" (w0),							\
+	     "=d" (w1)							\
 	   : "%0" ((UDItype) (u)),					\
 	     "rm" ((UDItype) (v)))
 #define udiv_qrnnd(q, r, n1, n0, dv) \
   __asm__ ("div{q} %4"							\
-	   : "=a" ((UDItype) (q)),					\
-	     "=d" ((UDItype) (r))					\
+	   : "=a" (q),							\
+	     "=d" (r)							\
 	   : "0" ((UDItype) (n0)),					\
 	     "1" ((UDItype) (n1)),					\
 	     "rm" ((UDItype) (dv)))
@@ -609,8 +609,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   /* The cmp clears the condition bit.  */ \
   __asm__ ("cmp %0,%0\n\taddx %1,%5\n\taddx %0,%3"			\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "0" ((USItype) (ah)),					\
 	     "r" ((USItype) (bh)),					\
 	     "1" ((USItype) (al)),					\
@@ -619,8 +619,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   /* The cmp clears the condition bit.  */ \
   __asm__ ("cmp %0,%0\n\tsubx %1,%5\n\tsubx %0,%3"			\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "0" ((USItype) (ah)),					\
 	     "r" ((USItype) (bh)),					\
 	     "1" ((USItype) (al)),					\
@@ -631,16 +631,16 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if defined (__mc68000__) && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0"				\
-	   : "=d" ((USItype) (sh)),					\
-	     "=&d" ((USItype) (sl))					\
+	   : "=d" (sh),							\
+	     "=&d" (sl)							\
 	   : "%0" ((USItype) (ah)),					\
 	     "d" ((USItype) (bh)),					\
 	     "%1" ((USItype) (al)),					\
 	     "g" ((USItype) (bl)))
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0"				\
-	   : "=d" ((USItype) (sh)),					\
-	     "=&d" ((USItype) (sl))					\
+	   : "=d" (sh),							\
+	     "=&d" (sl)							\
 	   : "0" ((USItype) (ah)),					\
 	     "d" ((USItype) (bh)),					\
 	     "1" ((USItype) (al)),					\
@@ -650,23 +650,23 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if (defined (__mc68020__) && !defined (__mc68060__))
 #define umul_ppmm(w1, w0, u, v) \
   __asm__ ("mulu%.l %3,%1:%0"						\
-	   : "=d" ((USItype) (w0)),					\
-	     "=d" ((USItype) (w1))					\
+	   : "=d" (w0),							\
+	     "=d" (w1)							\
 	   : "%0" ((USItype) (u)),					\
 	     "dmi" ((USItype) (v)))
 #define UMUL_TIME 45
 #define udiv_qrnnd(q, r, n1, n0, d) \
   __asm__ ("divu%.l %4,%1:%0"						\
-	   : "=d" ((USItype) (q)),					\
-	     "=d" ((USItype) (r))					\
+	   : "=d" (q),							\
+	     "=d" (r)							\
 	   : "0" ((USItype) (n0)),					\
 	     "1" ((USItype) (n1)),					\
 	     "dmi" ((USItype) (d)))
 #define UDIV_TIME 90
 #define sdiv_qrnnd(q, r, n1, n0, d) \
   __asm__ ("divs%.l %4,%1:%0"						\
-	   : "=d" ((USItype) (q)),					\
-	     "=d" ((USItype) (r))					\
+	   : "=d" (q),							\
+	     "=d" (r)							\
 	   : "0" ((USItype) (n0)),					\
 	     "1" ((USItype) (n1)),					\
 	     "dmi" ((USItype) (d)))
@@ -700,8 +700,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 	   "	move%.l	%/d2,%1\n"					\
 	   "	add%.l	%/d1,%/d0\n"					\
 	   "	move%.l	%/d0,%0"					\
-	   : "=g" ((USItype) (xh)),					\
-	     "=g" ((USItype) (xl))					\
+	   : "=g" (xh),							\
+	     "=g" (xl)							\
 	   : "g" ((USItype) (a)),					\
 	     "g" ((USItype) (b))					\
 	   : "d0", "d1", "d2", "d3", "d4")
@@ -736,8 +736,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 	   "	move%.l	%/d2,%1\n"					\
 	   "	add%.l	%/d1,%/d0\n"					\
 	   "	move%.l	%/d0,%0"					\
-	   : "=g" ((USItype) (xh)),					\
-	     "=g" ((USItype) (xl))					\
+	   : "=g" (xh)),						\
+	     "=g" (xl)							\
 	   : "g" ((USItype) (a)),					\
 	     "g" ((USItype) (b))					\
 	   : "d0", "d1", "d2", "d3", "d4")
@@ -751,7 +751,7 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if defined (__mc68020__) && !defined (__mcpu32__)
 #define count_leading_zeros(count, x) \
   __asm__ ("bfffo %1{%b2:%b2},%0"					\
-	   : "=d" ((USItype) (count))					\
+	   : "=d" (count)						\
 	   : "od" ((USItype) (x)), "n" (0))
 /* Some ColdFire architectures have a ff1 instruction supported via
    __builtin_clz. */
@@ -764,16 +764,16 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if defined (__m88000__) && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3"			\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "%rJ" ((USItype) (ah)),					\
 	     "rJ" ((USItype) (bh)),					\
 	     "%rJ" ((USItype) (al)),					\
 	     "rJ" ((USItype) (bl)))
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3"			\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "rJ" ((USItype) (ah)),					\
 	     "rJ" ((USItype) (bh)),					\
 	     "rJ" ((USItype) (al)),					\
@@ -1000,16 +1000,16 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("a %1,%5\n\tae %0,%3"					\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "%0" ((USItype) (ah)),					\
 	     "r" ((USItype) (bh)),					\
 	     "%1" ((USItype) (al)),					\
 	     "r" ((USItype) (bl)))
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("s %1,%5\n\tse %0,%3"					\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "0" ((USItype) (ah)),					\
 	     "r" ((USItype) (bh)),					\
 	     "1" ((USItype) (al)),					\
@@ -1038,8 +1038,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 "	m	r2,%3\n"						\
 "	cas	%0,r2,r0\n"						\
 "	mfs	r10,%1"							\
-	     : "=r" ((USItype) (ph)),					\
-	       "=r" ((USItype) (pl))					\
+	     : "=r" (ph),						\
+	       "=r" (pl)						\
 	     : "%r" (__m0),						\
 		"r" (__m1)						\
 	     : "r2");							\
@@ -1052,12 +1052,12 @@  extern UDItype __umulsidi3 (USItype, USItype);
   do {									\
     if ((x) >= 0x10000)							\
       __asm__ ("clz	%0,%1"						\
-	       : "=r" ((USItype) (count))				\
+	       : "=r" (count)						\
 	       : "r" ((USItype) (x) >> 16));				\
     else								\
       {									\
 	__asm__ ("clz	%0,%1"						\
-		 : "=r" ((USItype) (count))				\
+		 : "=r" (count)						\
 		 : "r" ((USItype) (x)));					\
 	(count) += 16;							\
       }									\
@@ -1119,8 +1119,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #define umul_ppmm(w1, w0, u, v) \
   __asm__ (								\
        "dmulu.l	%2,%3\n\tsts%M1	macl,%1\n\tsts%M0	mach,%0"	\
-	   : "=r<" ((USItype)(w1)),					\
-	     "=r<" ((USItype)(w0))					\
+	   : "=r<" (w1),						\
+	     "=r<" (w0)							\
 	   : "r" ((USItype)(u)),					\
 	     "r" ((USItype)(v))						\
 	   : "macl", "mach")
@@ -1191,8 +1191,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
     && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0"				\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "%rJ" ((USItype) (ah)),					\
 	     "rI" ((USItype) (bh)),					\
 	     "%rJ" ((USItype) (al)),					\
@@ -1200,8 +1200,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 	   __CLOBBER_CC)
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0"				\
-	   : "=r" ((USItype) (sh)),					\
-	     "=&r" ((USItype) (sl))					\
+	   : "=r" (sh),							\
+	     "=&r" (sl)							\
 	   : "rJ" ((USItype) (ah)),					\
 	     "rI" ((USItype) (bh)),					\
 	     "rJ" ((USItype) (al)),					\
@@ -1213,7 +1213,7 @@  extern UDItype __umulsidi3 (USItype, USItype);
     register USItype __g1 asm ("g1");					\
     __asm__ ("umul\t%2,%3,%1\n\t"					\
 	     "srlx\t%1, 32, %0"						\
-	     : "=r" ((USItype) (w1)),					\
+	     : "=r" (w1),						\
 	       "=r" (__g1)						\
 	     : "r" ((USItype) (u)),					\
 	       "r" ((USItype) (v)));					\
@@ -1224,8 +1224,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 	   "udiv\t%3,%4,%0\n\t"						\
 	   "umul\t%0,%4,%1\n\t"						\
 	   "sub\t%3,%1,%1"						\
-	   : "=&r" ((USItype) (__q)),					\
-	     "=&r" ((USItype) (__r))					\
+	   : "=&r" (__q),						\
+	     "=&r" (__r)						\
 	   : "r" ((USItype) (__n1)),					\
 	     "r" ((USItype) (__n0)),					\
 	     "r" ((USItype) (__d)))
@@ -1233,14 +1233,14 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if defined (__sparc_v8__)
 #define umul_ppmm(w1, w0, u, v) \
   __asm__ ("umul %2,%3,%1;rd %%y,%0"					\
-	   : "=r" ((USItype) (w1)),					\
-	     "=r" ((USItype) (w0))					\
+	   : "=r" (w1),							\
+	     "=r" (w0)							\
 	   : "r" ((USItype) (u)),					\
 	     "r" ((USItype) (v)))
 #define udiv_qrnnd(__q, __r, __n1, __n0, __d) \
   __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\
-	   : "=&r" ((USItype) (__q)),					\
-	     "=&r" ((USItype) (__r))					\
+	   : "=&r" (__q),						\
+	     "=&r" (__r)						\
 	   : "r" ((USItype) (__n1)),					\
 	     "r" ((USItype) (__n0)),					\
 	     "r" ((USItype) (__d)))
@@ -1250,8 +1250,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
    instructions scan (ffs from high bit) and divscc.  */
 #define umul_ppmm(w1, w0, u, v) \
   __asm__ ("umul %2,%3,%1;rd %%y,%0"					\
-	   : "=r" ((USItype) (w1)),					\
-	     "=r" ((USItype) (w0))					\
+	   : "=r" (w1),							\
+	     "=r" (w0)							\
 	   : "r" ((USItype) (u)),					\
 	     "r" ((USItype) (v)))
 #define udiv_qrnnd(q, r, n1, n0, d) \
@@ -1294,8 +1294,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 "	bl,a 1f\n"							\
 "	add	%1,%4,%1\n"						\
 "1:	! End of inline udiv_qrnnd"					\
-	   : "=r" ((USItype) (q)),					\
-	     "=r" ((USItype) (r))					\
+	   : "=r" (q),							\
+	     "=r" (r)							\
 	   : "r" ((USItype) (n1)),					\
 	     "r" ((USItype) (n0)),					\
 	     "rI" ((USItype) (d))					\
@@ -1304,7 +1304,7 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #define count_leading_zeros(count, x) \
   do {                                                                  \
   __asm__ ("scan %1,1,%0"                                               \
-	   : "=r" ((USItype) (count))                                   \
+	   : "=r" (count)                                   		\
 	   : "r" ((USItype) (x)));					\
   } while (0)
 /* Early sparclites return 63 for an argument of 0, but they warn that future
@@ -1354,8 +1354,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 "	mulscc	%%g1,0,%%g1\n"						\
 "	add	%%g1,%%o5,%0\n"						\
 "	rd	%%y,%1"							\
-	   : "=r" ((USItype) (w1)),					\
-	     "=r" ((USItype) (w0))					\
+	   : "=r" (w1),							\
+	     "=r" (w0)							\
 	   : "%rI" ((USItype) (u)),					\
 	     "r" ((USItype) (v))						\
 	   : "g1", "o5" __AND_CLOBBER_CC)
@@ -1387,8 +1387,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 "	sub	%1,%2,%1\n"						\
 "3:	xnor	%0,0,%0\n"						\
 "	! End of inline udiv_qrnnd"					\
-	   : "=&r" ((USItype) (__q)),					\
-	     "=&r" ((USItype) (__r))					\
+	   : "=&r" (__q),						\
+	     "=&r" (__r)						\
 	   : "r" ((USItype) (__d)),					\
 	     "1" ((USItype) (__n1)),					\
 	     "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC)
@@ -1407,8 +1407,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 	     "add\t%r3,%4,%0\n\t"					\
 	     "movcs\t%%xcc, 1, %2\n\t"					\
 	     "add\t%0, %2, %0"						\
-	     : "=r" ((UDItype)(sh)),				      	\
-	       "=&r" ((UDItype)(sl)),				      	\
+	     : "=r" (sh),				      		\
+	       "=&r" (sl),				      		\
 	       "+r" (__carry)				      		\
 	     : "%rJ" ((UDItype)(ah)),				     	\
 	       "rI" ((UDItype)(bh)),				      	\
@@ -1424,8 +1424,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 	     "sub\t%r3,%4,%0\n\t"					\
 	     "movcs\t%%xcc, 1, %2\n\t"					\
 	     "sub\t%0, %2, %0"						\
-	     : "=r" ((UDItype)(sh)),				      	\
-	       "=&r" ((UDItype)(sl)),				      	\
+	     : "=r" (sh),				      		\
+	       "=&r" (sl),				      		\
 	       "+r" (__carry)				      		\
 	     : "%rJ" ((UDItype)(ah)),				     	\
 	       "rI" ((UDItype)(bh)),				      	\
@@ -1459,8 +1459,8 @@  extern UDItype __umulsidi3 (USItype, USItype);
 		   "sllx %3,32,%3\n\t"					\
 		   "add %1,%3,%1\n\t"					\
 		   "add %5,%2,%0"					\
-	   : "=r" ((UDItype)(wh)),					\
-	     "=&r" ((UDItype)(wl)),					\
+	   : "=r" (wh),							\
+	     "=&r" (wl),						\
 	     "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4)	\
 	   : "r" ((UDItype)(u)),					\
 	     "r" ((UDItype)(v))						\
@@ -1473,16 +1473,16 @@  extern UDItype __umulsidi3 (USItype, USItype);
 #if defined (__vax__) && W_TYPE_SIZE == 32
 #define add_ssaaaa(sh, sl, ah, al, bh, bl) \
   __asm__ ("addl2 %5,%1\n\tadwc %3,%0"					\
-	   : "=g" ((USItype) (sh)),					\
-	     "=&g" ((USItype) (sl))					\
+	   : "=g" (sh)),						\
+	     "=&g" (sl)							\
 	   : "%0" ((USItype) (ah)),					\
 	     "g" ((USItype) (bh)),					\
 	     "%1" ((USItype) (al)),					\
 	     "g" ((USItype) (bl)))
 #define sub_ddmmss(sh, sl, ah, al, bh, bl) \
   __asm__ ("subl2 %5,%1\n\tsbwc %3,%0"					\
-	   : "=g" ((USItype) (sh)),					\
-	     "=&g" ((USItype) (sl))					\
+	   : "=g" (sh)),						\
+	     "=&g" (sl)							\
 	   : "0" ((USItype) (ah)),					\
 	     "g" ((USItype) (bh)),					\
 	     "1" ((USItype) (al)),					\