[PATCH] D29542: [TargetInfo] Adjust x86-32 atomic support to the CPU used
Dimitry Andric via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 6 11:51:58 PST 2017
dim added a comment.
There's still something strange here. If I compile the following on i386-freebsd12, with `clang -march=i486 -O2 -S`:
_Atomic(long long) ll;
void f(void)
{
++ll;
}
the result is:
.globl f
.p2align 4, 0x90
.type f, at function
f: # @f
# BB#0: # %entry
pushl %ebp
movl %esp, %ebp
pushl %ebx
movl ll+4, %edx
movl ll, %eax
.p2align 4, 0x90
.LBB0_1: # %atomicrmw.start
# =>This Inner Loop Header: Depth=1
movl %eax, %ebx
addl $1, %ebx
movl %edx, %ecx
adcl $0, %ecx
lock cmpxchg8b ll
jne .LBB0_1
# BB#2: # %atomicrmw.end
popl %ebx
popl %ebp
retl
.Lfunc_end0:
.size f, .Lfunc_end0-f
.type ll, at object # @ll
.comm ll,8,4
So what gives? It's still inserting a `cmpxchg8b`! AFAIK it should now insert a call to `__atomic_fetch_add_8` instead.
Note that this changes if you use C++ atomics, e.g.:
#include <atomic>
void f(std::atomic<long long>& x)
{
++x;
}
compiles to:
.globl _Z1fRNSt3__16atomicIxEE
.p2align 4, 0x90
.type _Z1fRNSt3__16atomicIxEE, at function
_Z1fRNSt3__16atomicIxEE: # @_Z1fRNSt3__16atomicIxEE
.Lfunc_begin0:
.cfi_sections .debug_frame
.cfi_startproc
.cfi_personality 0, __gxx_personality_v0
.cfi_lsda 0, .Lexception0
# BB#0: # %entry
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl 8(%ebp), %eax
.Ltmp0:
movl %eax, (%esp)
movl $5, 12(%esp)
movl $0, 8(%esp)
movl $1, 4(%esp)
calll __atomic_fetch_add_8
.Ltmp1:
# BB#1: # %_ZNSt3__113__atomic_baseIxLb1EEppEv.exit
addl $16, %esp
popl %ebp
retl
.LBB0_2: # %lpad.i.i
.Ltmp2:
movl %eax, (%esp)
calll __cxa_call_unexpected
subl $4, %esp
.Lfunc_end0:
.size _Z1fRNSt3__16atomicIxEE, .Lfunc_end0-_Z1fRNSt3__16atomicIxEE
.cfi_endproc
https://reviews.llvm.org/D29542
More information about the cfe-commits
mailing list