mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-23 05:25:50 -04:00

As reported on http://lists.llvm.org/pipermail/cfe-dev/2018-August/058760.html, this broke i386-freebsd11 due to its lack of atomic 64 bit primitives. While that's not really this commit's fault, let's revert back to the old behaviour until this can be fixed. This means generating cmpxchg8b etc for i386 and i486 which don't technically support those, but that's been the behaviour for a long time, so a little longer probably doesn't hurt that much. > Adjust MaxAtomicInlineWidth for i386/i486 targets. > > This is to fix the bug reported in https://bugs.llvm.org/show_bug.cgi?id=34347#c6. > Currently, all MaxAtomicInlineWidth of x86-32 targets are set to 64. However, > i386 doesn't support any cmpxchg related instructions. i486 only supports cmpxchg. > So in this patch MaxAtomicInlineWidth is reset as follows: > For i386, the MaxAtomicInlineWidth should be 0 because no cmpxchg is supported. > For i486, the MaxAtomicInlineWidth should be 32 because it supports cmpxchg. > For others 32 bits x86 cpu, the MaxAtomicInlineWidth should be 64 because of cmpxchg8b. > > Differential Revision: https://reviews.llvm.org/D42154 llvm-svn: 340666
70 lines
1.7 KiB
C++
70 lines
1.7 KiB
C++
// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - -triple=x86_64-linux-gnu | FileCheck %s
|
|
// RUN: %clang_cc1 %s -std=c++11 -emit-llvm -o - -triple=x86_64-linux-gnu -target-cpu core2 | FileCheck %s --check-prefix=CORE2
|
|
// Check the atomic code generation for cpu targets w/wo cx16 support.
|
|
|
|
struct alignas(8) AM8 {
|
|
int f1, f2;
|
|
};
|
|
AM8 m8;
|
|
AM8 load8() {
|
|
AM8 am;
|
|
// CHECK-LABEL: @_Z5load8v
|
|
// CHECK: load atomic i64, {{.*}} monotonic
|
|
// CORE2-LABEL: @_Z5load8v
|
|
// CORE2: load atomic i64, {{.*}} monotonic
|
|
__atomic_load(&m8, &am, 0);
|
|
return am;
|
|
}
|
|
|
|
AM8 s8;
|
|
void store8() {
|
|
// CHECK-LABEL: @_Z6store8v
|
|
// CHECK: store atomic i64 {{.*}} monotonic
|
|
// CORE2-LABEL: @_Z6store8v
|
|
// CORE2: store atomic i64 {{.*}} monotonic
|
|
__atomic_store(&m8, &s8, 0);
|
|
}
|
|
|
|
bool cmpxchg8() {
|
|
AM8 am;
|
|
// CHECK-LABEL: @_Z8cmpxchg8v
|
|
// CHECK: cmpxchg i64* {{.*}} monotonic
|
|
// CORE2-LABEL: @_Z8cmpxchg8v
|
|
// CORE2: cmpxchg i64* {{.*}} monotonic
|
|
return __atomic_compare_exchange(&m8, &s8, &am, 0, 0, 0);
|
|
}
|
|
|
|
struct alignas(16) AM16 {
|
|
long f1, f2;
|
|
};
|
|
|
|
AM16 m16;
|
|
AM16 load16() {
|
|
AM16 am;
|
|
// CHECK-LABEL: @_Z6load16v
|
|
// CHECK: call void @__atomic_load
|
|
// CORE2-LABEL: @_Z6load16v
|
|
// CORE2: load atomic i128, {{.*}} monotonic
|
|
__atomic_load(&m16, &am, 0);
|
|
return am;
|
|
}
|
|
|
|
AM16 s16;
|
|
void store16() {
|
|
// CHECK-LABEL: @_Z7store16v
|
|
// CHECK: call void @__atomic_store
|
|
// CORE2-LABEL: @_Z7store16v
|
|
// CORE2: store atomic i128 {{.*}} monotonic
|
|
__atomic_store(&m16, &s16, 0);
|
|
}
|
|
|
|
bool cmpxchg16() {
|
|
AM16 am;
|
|
// CHECK-LABEL: @_Z9cmpxchg16v
|
|
// CHECK: call zeroext i1 @__atomic_compare_exchange
|
|
// CORE2-LABEL: @_Z9cmpxchg16v
|
|
// CORE2: cmpxchg i128* {{.*}} monotonic
|
|
return __atomic_compare_exchange(&m16, &s16, &am, 0, 0, 0);
|
|
}
|
|
|