https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107713
Bug ID: 107713
Summary: Wrong implementation atomic_exchange<short> on
LoongArch
Product: gcc
Version: 13.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
Assignee: unassigned at gcc dot gnu.org
Reporter: hejinyang at loongson dot cn
Target Milestone: ---
Created attachment 53905
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53905&action=edit
preprocessed file
Target: loongarch64-unknown-linux-gnu
Configured with: ../configure --prefix=/usr --libdir=/usr/lib64
--build=x86_64-cross-linux-gnu --host=loongarch64-unknown-linux-gnu
--target=loongarch64-unknown-linux-gnu --enable-__cxa_atexit
--enable-threads=posix --with-system-zlib --enable-libstdcxx-time
--enable-checking=release --with-build-sysroot=/opt/mylaos/sysroot
--enable-default-pie --enable-languages=c,c++,fortran,objc,obj-c++,lto
gcc version 13.0.0 20220801 (experimental) (GCC)
test_of_sync_lock_test_and_set.c:
char lock;
char hello()
{
return __sync_lock_test_and_set (&lock, 1);
}
Cmdline:
gcc test_of_sync_lock_test_and_set.c -S --save-temps
Output Fragment:
1:
ll.w $r12,$r16,0
and $r19,$r12,$r14
bne $r19,$r15,2f <--- Wrong
and $r19,$r12,$r17
or $r19,$r19,$r18
sc.w $r19,$r16,0
beq $zero,$r19,1b
b 3f
2:
dbar 0x700
3: