Author: nico Date: Mon Sep 21 19:46:21 2015 New Revision: 248234 URL: http://llvm.org/viewvc/llvm-project?rev=248234&view=rev Log: 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. Modified: cfe/trunk/lib/Headers/Intrin.h cfe/trunk/test/Headers/ms-intrin.cpp Modified: cfe/trunk/lib/Headers/Intrin.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/Intrin.h?rev=248234&r1=248233&r2=248234&view=diff ============================================================================== --- cfe/trunk/lib/Headers/Intrin.h (original) +++ cfe/trunk/lib/Headers/Intrin.h Mon Sep 21 19:46:21 2015 @@ -846,7 +846,7 @@ __movsd(unsigned long *__dst, unsigned l } static __inline__ void __DEFAULT_FN_ATTRS __movsw(unsigned short *__dst, unsigned short const *__src, size_t __n) { - __asm__("rep movsh" : : "D"(__dst), "S"(__src), "c"(__n) + __asm__("rep movsw" : : "D"(__dst), "S"(__src), "c"(__n) : "%edi", "%esi", "%ecx"); } static __inline__ void __DEFAULT_FN_ATTRS @@ -861,7 +861,7 @@ __stosd(unsigned long *__dst, unsigned l } static __inline__ void __DEFAULT_FN_ATTRS __stosw(unsigned short *__dst, unsigned short __x, size_t __n) { - __asm__("rep stosh" : : "D"(__dst), "a"(__x), "c"(__n) + __asm__("rep stosw" : : "D"(__dst), "a"(__x), "c"(__n) : "%edi", "%ecx"); } #endif Modified: cfe/trunk/test/Headers/ms-intrin.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/ms-intrin.cpp?rev=248234&r1=248233&r2=248234&view=diff ============================================================================== --- cfe/trunk/test/Headers/ms-intrin.cpp (original) +++ cfe/trunk/test/Headers/ms-intrin.cpp Mon Sep 21 19:46:21 2015 @@ -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 +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits