ARM: Add ACLE memory barrier intrinsic mapping
authorYi Kong <Yi.Kong@arm.com>
Thu, 17 Jul 2014 12:45:17 +0000 (12:45 +0000)
committerYi Kong <Yi.Kong@arm.com>
Thu, 17 Jul 2014 12:45:17 +0000 (12:45 +0000)
llvm-svn: 213261

clang/lib/Headers/arm_acle.h
clang/test/CodeGen/arm_acle.c

index c51a5dc..a0fd689 100644 (file)
 #if defined(__cplusplus)
 extern "C" {
 #endif
+
 /* 8 SYNCHRONIZATION, BARRIER AND HINT INTRINSICS */
+/* 8.3 Memory barriers */
+#if !defined(_MSC_VER)
+#define __dmb(i) __builtin_arm_dmb(i)
+#define __dsb(i) __builtin_arm_dsb(i)
+#define __isb(i) __builtin_arm_isb(i)
+#endif
+
 /* 8.4 Hints */
 
 #if !defined(_MSC_VER)
index 41ebe15..e4d795a 100644 (file)
@@ -3,8 +3,30 @@
 
 #include <arm_acle.h>
 
-/* Hints */
+/* 8 SYNCHRONIZATION, BARRIER AND HINT INTRINSICS */
+/* 8.3 Memory Barriers */
+// ARM-LABEL: test_dmb
+// AArch32: call void @llvm.arm.dmb(i32 1)
+// AArch64: call void @llvm.aarch64.dmb(i32 1)
+void test_dmb(void) {
+  __dmb(1);
+}
+
+// ARM-LABEL: test_dsb
+// AArch32: call void @llvm.arm.dsb(i32 2)
+// AArch64: call void @llvm.aarch64.dsb(i32 2)
+void test_dsb(void) {
+  __dsb(2);
+}
+
+// ARM-LABEL: test_isb
+// AArch32: call void @llvm.arm.isb(i32 3)
+// AArch64: call void @llvm.aarch64.isb(i32 3)
+void test_isb(void) {
+  __isb(3);
+}
 
+/* 8.4 Hints */
 // ARM-LABEL: test_yield
 // AArch32: call void @llvm.arm.hint(i32 1)
 // AArch64: call void @llvm.aarch64.hint(i32 1)