57 lines · cpp
1// RUN: %clang_cc1 -Wall -Werror -triple thumbv8-linux-gnueabi -fno-signed-char -emit-llvm -o - %s | FileCheck %s2// RUN: %clang_cc1 -Wall -Werror -triple arm64-apple-ios7.0 -emit-llvm -o - %s | FileCheck %s --check-prefix=CHECK-ARM643 4bool b;5 6// CHECK-LABEL: @_Z10test_ldrexv()7// CHECK: call i32 @llvm.arm.ldrex.p0(ptr elementtype(i8) @b)8 9// CHECK-ARM64-LABEL: @_Z10test_ldrexv()10// CHECK-ARM64: call i64 @llvm.aarch64.ldxr.p0(ptr elementtype(i8) @b)11 12void test_ldrex() {13 b = __builtin_arm_ldrex(&b);14}15 16// CHECK-LABEL: @_Z10tset_strexv()17// CHECK: %{{.*}} = call i32 @llvm.arm.strex.p0(i32 1, ptr elementtype(i8) @b)18 19// CHECK-ARM64-LABEL: @_Z10tset_strexv()20// CHECK-ARM64: %{{.*}} = call i32 @llvm.aarch64.stxr.p0(i64 1, ptr elementtype(i8) @b)21 22void tset_strex() {23 __builtin_arm_strex(true, &b);24}25 26#ifdef __arm__27// ARM exclusive atomic builtins28 29long long c;30 31// CHECK-LABEL: @_Z11test_ldrexdv()32// CHECK: [[STRUCTRES:%.*]] = call { i32, i32 } @llvm.arm.ldrexd(ptr @c)33// CHECK: [[RESHI:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 134// CHECK: [[RESLO:%.*]] = extractvalue { i32, i32 } [[STRUCTRES]], 035// CHECK: [[RESHI64:%.*]] = zext i32 [[RESHI]] to i6436// CHECK: [[RESLO64:%.*]] = zext i32 [[RESLO]] to i6437// CHECK: [[RESHIHI:%.*]] = shl nuw i64 [[RESHI64]], 3238// CHECK: [[INTRES:%.*]] = or i64 [[RESHIHI]], [[RESLO64]]39// CHECK: store i64 [[INTRES]], ptr @c, align 840 41void test_ldrexd() {42 c = __builtin_arm_ldrexd(&c);43}44 45// CHECK-LABEL: @_Z11tset_strexdv()46// CHECK: store i64 42, ptr [[TMP:%.*]], align 847// CHECK: [[LOHI:%.*]] = load { i32, i32 }, ptr [[TMP]]48// CHECK: [[LO:%.*]] = extractvalue { i32, i32 } [[LOHI]], 049// CHECK: [[HI:%.*]] = extractvalue { i32, i32 } [[LOHI]], 150// CHECK: %{{.*}} = call i32 @llvm.arm.strexd(i32 [[LO]], i32 [[HI]], ptr @c)51 52void tset_strexd() {53 __builtin_arm_strexd(42, &c);54}55 56#endif57