https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102566

--- Comment #36 from H.J. Lu <hjl.tools at gmail dot com> ---
(1 << (x)) works, but (((unsigned int) 1) << (x)) doesn't work:

[hjl@gnu-skx-1 gcc]$ cat bar.c
void bar (void);

#define MASK1(x) (1 << (x))

void
f1 (unsigned int *a, unsigned int bit)
{
  if ((__atomic_fetch_xor (a, MASK1 (bit), __ATOMIC_RELAXED) & MASK1 (bit)))
    bar ();
}

#define MASK2(x) (((unsigned int) 1) << (x))

void
f2 (unsigned int *a, unsigned int bit)
{
  if ((__atomic_fetch_xor (a, MASK2 (bit), __ATOMIC_RELAXED) & MASK2 (bit)))
    bar ();
}
[hjl@gnu-skx-1 gcc]$ ./xgcc -B./ -S -O2 bar.c
[hjl@gnu-skx-1 gcc]$ cat bar.s
        .file   "bar.c"
        .text
        .p2align 4
        .globl  f1
        .type   f1, @function
f1:
.LFB0:
        .cfi_startproc
        lock btcl       %esi, (%rdi)
        jc      .L4
        ret
        .p2align 4,,10
        .p2align 3
.L4:
        jmp     bar
        .cfi_endproc
.LFE0:
        .size   f1, .-f1
        .p2align 4
        .globl  f2
        .type   f2, @function
f2:
.LFB1:
        .cfi_startproc
        movl    %esi, %ecx
        movl    $1, %edx
        movl    (%rdi), %eax
        sall    %cl, %edx
.L6:
        movl    %eax, %r8d
        movl    %eax, %esi
        xorl    %edx, %r8d
        lock cmpxchgl   %r8d, (%rdi)
        jne     .L6
        btl     %ecx, %esi
        jc      .L10
        ret
        .p2align 4,,10
        .p2align 3
.L10:
        jmp     bar
        .cfi_endproc
.LFE1:
        .size   f2, .-f2
        .ident  "GCC: (GNU) 13.0.1 20230118 (experimental)"
        .section        .note.GNU-stack,"",@progbits
[hjl@gnu-skx-1 gcc]$

Reply via email to