summaryrefslogtreecommitdiffstats
path: root/clang/test
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2015-09-22 00:46:21 +0000
committerNico Weber <nicolasweber@gmx.de>2015-09-22 00:46:21 +0000
commit1f22a34409b2ecaffd5b982eb24247126979801b (patch)
tree57c0887424de6ba20d599dfa2d2b036d6f21674e /clang/test
parent3c9c8338d0b6ec43cdaedeaeab26996ebd6982b4 (diff)
downloadbcm5719-llvm-1f22a34409b2ecaffd5b982eb24247126979801b.tar.gz
bcm5719-llvm-1f22a34409b2ecaffd5b982eb24247126979801b.zip
ms Intrin.h: Fix __movsw's and __stosw's inline asm.
Before, clang's internal assembler would reject the inline asm in clang's Intrin.h. To make sure this doesn't happen for other Intrin.h functions using __asm__ blocks, add 32-bit and 64-bit codegen tests for Intrin.h. Sadly, these tests discovered that __readcr3 and __writecr3 have bad implementations in 64-bit builds. This will have to be fixed in a follow-up. llvm-svn: 248234
Diffstat (limited to 'clang/test')
-rw-r--r--clang/test/Headers/ms-intrin.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/clang/test/Headers/ms-intrin.cpp b/clang/test/Headers/ms-intrin.cpp
index a83225e37f8..9b3c6c97090 100644
--- a/clang/test/Headers/ms-intrin.cpp
+++ b/clang/test/Headers/ms-intrin.cpp
@@ -5,12 +5,12 @@
// RUN: %clang_cc1 -triple i386-pc-win32 -target-cpu broadwell \
// RUN: -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \
-// RUN: -ffreestanding -fsyntax-only -Werror \
+// RUN: -ffreestanding -emit-obj -o /dev/null -Werror \
// RUN: -isystem %S/Inputs/include %s
// RUN: %clang_cc1 -triple x86_64-pc-win32 \
// RUN: -fms-extensions -fms-compatibility -fms-compatibility-version=17.00 \
-// RUN: -ffreestanding -fsyntax-only -Werror \
+// RUN: -ffreestanding -emit-obj -o /dev/null -Werror \
// RUN: -isystem %S/Inputs/include %s
// RUN: %clang_cc1 -triple thumbv7--windows \
@@ -27,3 +27,35 @@ typedef __SIZE_TYPE__ size_t;
// Use some C++ to make sure we closed the extern "C" brackets.
template <typename T>
void foo(T V) {}
+
+// __asm__ blocks are only checked for inline functions that end up being
+// emitted, so call functions with __asm__ blocks to make sure their inline
+// assembly parses.
+void f() {
+ __movsb(0, 0, 0);
+ __movsd(0, 0, 0);
+ __movsw(0, 0, 0);
+
+ __stosb(0, 0, 0);
+ __stosd(0, 0, 0);
+ __stosw(0, 0, 0);
+
+#ifdef _M_X64
+ __movsq(0, 0, 0);
+ __stosq(0, 0, 0);
+#endif
+
+ int info[4];
+ __cpuid(info, 0);
+ __cpuidex(info, 0, 0);
+ _xgetbv(0);
+ __halt();
+ __readmsr(0);
+
+ // FIXME: Call these in 64-bit too once the intrinsics have been fixed to
+ // work there.
+#ifndef _M_X64
+ __readcr3();
+ __writecr3(0);
+#endif
+}
OpenPOWER on IntegriCloud