<div dir="ltr">Reverted in r278814, it appears to break usage of _xgetbv on Windows:<div><a href="https://build.chromium.org/p/chromium.fyi/builders/ClangToTWin%28dll%29/builds/5846/steps/compile/logs/stdio">https://build.chromium.org/p/chromium.fyi/builders/ClangToTWin%28dll%29/builds/5846/steps/compile/logs/stdio</a><br></div><div><div>../../base/cpu.cc(194,10):  error: use of undeclared identifier '_xgetbv'</div><div>        (_xgetbv(0) & 6) == 6 /* XSAVE enabled by kernel */;</div></div><div><br></div><div>You removed the test in ms-intrin.cpp that would have prevented this breakage, too.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Aug 16, 2016 at 1:13 AM, Marina Yatsina via cfe-commits <span dir="ltr"><<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: myatsina<br>
Date: Tue Aug 16 03:13:36 2016<br>
New Revision: 278783<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=278783&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=278783&view=rev</a><br>
Log:<br>
[X86] Add xgetbv/x[X86] Add xgetbv xsetbv intrinsics to non-windows platforms<br>
<br>
commit on behalf of guyblank<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D21959" rel="noreferrer" target="_blank">https://reviews.llvm.org/<wbr>D21959</a><br>
<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86.def<br>
    cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp<br>
    cfe/trunk/lib/Headers/intrin.h<br>
    cfe/trunk/lib/Headers/<wbr>xsaveintrin.h<br>
    cfe/trunk/test/CodeGen/<wbr>builtins-x86.c<br>
    cfe/trunk/test/CodeGen/x86_32-<wbr>xsave.c<br>
    cfe/trunk/test/CodeGen/x86_64-<wbr>xsave.c<br>
    cfe/trunk/test/Headers/ms-<wbr>intrin.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86.def<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=278783&r1=278782&r2=278783&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/include/<wbr>clang/Basic/BuiltinsX86.def?<wbr>rev=278783&r1=278782&r2=<wbr>278783&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86.def (original)<br>
+++ cfe/trunk/include/clang/Basic/<wbr>BuiltinsX86.def Tue Aug 16 03:13:36 2016<br>
@@ -644,6 +644,8 @@ TARGET_BUILTIN(__builtin_ia32_<wbr>fxsave64,<br>
 // XSAVE<br>
 TARGET_BUILTIN(__builtin_ia32_<wbr>xsave, "vv*ULLi", "", "xsave")<br>
 TARGET_BUILTIN(__builtin_ia32_<wbr>xsave64, "vv*ULLi", "", "xsave")<br>
+TARGET_BUILTIN(__builtin_<wbr>ia32_xgetbv, "ULLiUi", "", "xsave")<br>
+TARGET_BUILTIN(__builtin_<wbr>ia32_xsetbv, "vUiULLi", "", "xsave")<br>
 TARGET_BUILTIN(__builtin_ia32_<wbr>xrstor, "vv*ULLi", "", "xsave")<br>
 TARGET_BUILTIN(__builtin_ia32_<wbr>xrstor64, "vv*ULLi", "", "xsave")<br>
 TARGET_BUILTIN(__builtin_ia32_<wbr>xsaveopt, "vv*ULLi", "", "xsaveopt")<br>
<br>
Modified: cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=278783&r1=278782&r2=278783&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp?rev=278783&r1=<wbr>278782&r2=278783&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/<wbr>CGBuiltin.cpp Tue Aug 16 03:13:36 2016<br>
@@ -6915,7 +6915,8 @@ Value *CodeGenFunction::<wbr>EmitX86BuiltinEx<br>
   case X86::BI__builtin_ia32_xsavec:<br>
   case X86::BI__builtin_ia32_<wbr>xsavec64:<br>
   case X86::BI__builtin_ia32_xsaves:<br>
-  case X86::BI__builtin_ia32_<wbr>xsaves64: {<br>
+  case X86::BI__builtin_ia32_<wbr>xsaves64:<br>
+  case X86::BI__builtin_ia32_xsetbv: {<br>
     Intrinsic::ID ID;<br>
 #define INTRINSIC_X86_XSAVE_ID(NAME) \<br>
     case X86::BI__builtin_ia32_##NAME: \<br>
@@ -6935,6 +6936,7 @@ Value *CodeGenFunction::<wbr>EmitX86BuiltinEx<br>
     INTRINSIC_X86_XSAVE_ID(<wbr>xsavec64);<br>
     INTRINSIC_X86_XSAVE_ID(xsaves)<wbr>;<br>
     INTRINSIC_X86_XSAVE_ID(<wbr>xsaves64);<br>
+    INTRINSIC_X86_XSAVE_ID(xsetbv)<wbr>;<br>
     }<br>
 #undef INTRINSIC_X86_XSAVE_ID<br>
     Value *Mhi = Builder.CreateTrunc(<br>
@@ -6944,6 +6946,8 @@ Value *CodeGenFunction::<wbr>EmitX86BuiltinEx<br>
     Ops.push_back(Mlo);<br>
     return Builder.CreateCall(CGM.<wbr>getIntrinsic(ID), Ops);<br>
   }<br>
+  case X86::BI__builtin_ia32_xgetbv:<br>
+    return Builder.CreateCall(CGM.<wbr>getIntrinsic(Intrinsic::x86_<wbr>xgetbv), Ops);<br>
   case X86::BI__builtin_ia32_<wbr>storedqudi128_mask:<br>
   case X86::BI__builtin_ia32_<wbr>storedqusi128_mask:<br>
   case X86::BI__builtin_ia32_<wbr>storedquhi128_mask:<br>
<br>
Modified: cfe/trunk/lib/Headers/intrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/intrin.h?rev=278783&r1=278782&r2=278783&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Headers/<wbr>intrin.h?rev=278783&r1=278782&<wbr>r2=278783&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Headers/intrin.h (original)<br>
+++ cfe/trunk/lib/Headers/intrin.h Tue Aug 16 03:13:36 2016<br>
@@ -289,10 +289,6 @@ static __inline__<br>
 void _WriteBarrier(void);<br>
 unsigned __int32 xbegin(void);<br>
 void _xend(void);<br>
-static __inline__<br>
-#define _XCR_XFEATURE_ENABLED_MASK 0<br>
-unsigned __int64 __cdecl _xgetbv(unsigned int);<br>
-void __cdecl _xsetbv(unsigned int, unsigned __int64);<br>
<br>
 /* These additional intrinsics are turned on in x64/amd64/x86_64 mode. */<br>
 #ifdef __x86_64__<br>
@@ -908,12 +904,6 @@ __cpuidex(int __info[4], int __level, in<br>
   __asm__ ("cpuid" : "=a"(__info[0]), "=b" (__info[1]), "=c"(__info[2]), "=d"(__info[3])<br>
                    : "a"(__level), "c"(__ecx));<br>
 }<br>
-static __inline__ unsigned __int64 __cdecl __DEFAULT_FN_ATTRS<br>
-_xgetbv(unsigned int __xcr_no) {<br>
-  unsigned int __eax, __edx;<br>
-  __asm__ ("xgetbv" : "=a" (__eax), "=d" (__edx) : "c" (__xcr_no));<br>
-  return ((unsigned __int64)__edx << 32) | __eax;<br>
-}<br>
 static __inline__ void __DEFAULT_FN_ATTRS<br>
 __halt(void) {<br>
   __asm__ volatile ("hlt");<br>
<br>
Modified: cfe/trunk/lib/Headers/<wbr>xsaveintrin.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/xsaveintrin.h?rev=278783&r1=278782&r2=278783&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/lib/Headers/<wbr>xsaveintrin.h?rev=278783&r1=<wbr>278782&r2=278783&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/lib/Headers/<wbr>xsaveintrin.h (original)<br>
+++ cfe/trunk/lib/Headers/<wbr>xsaveintrin.h Tue Aug 16 03:13:36 2016<br>
@@ -28,6 +28,8 @@<br>
 #ifndef __XSAVEINTRIN_H<br>
 #define __XSAVEINTRIN_H<br>
<br>
+#define _XCR_XFEATURE_ENABLED_MASK 0<br>
+<br>
 /* Define the default attributes for the functions in this file. */<br>
 #define __DEFAULT_FN_ATTRS __attribute__((__always_<wbr>inline__, __nodebug__,  __target__("xsave")))<br>
<br>
@@ -41,6 +43,16 @@ _xrstor(void *__p, unsigned long long __<br>
   return __builtin_ia32_xrstor(__p, __m);<br>
 }<br>
<br>
+static __inline__ unsigned long long __DEFAULT_FN_ATTRS<br>
+_xgetbv(unsigned int __a) {<br>
+  return  __builtin_ia32_xgetbv(__a);<br>
+}<br>
+<br>
+static __inline__ void __DEFAULT_FN_ATTRS<br>
+_xsetbv(unsigned int __a, unsigned long long __b) {<br>
+  __builtin_ia32_xsetbv(__a, __b);<br>
+}<br>
+<br>
 #ifdef __x86_64__<br>
 static __inline__ void __DEFAULT_FN_ATTRS<br>
 _xsave64(void *__p, unsigned long long __m) {<br>
@@ -51,6 +63,7 @@ static __inline__ void __DEFAULT_FN_ATTR<br>
 _xrstor64(void *__p, unsigned long long __m) {<br>
   return __builtin_ia32_xrstor64(__p, __m);<br>
 }<br>
+<br>
 #endif<br>
<br>
 #undef __DEFAULT_FN_ATTRS<br>
<br>
Modified: cfe/trunk/test/CodeGen/<wbr>builtins-x86.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins-x86.c?rev=278783&r1=278782&r2=278783&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGen/builtins-x86.c?rev=<wbr>278783&r1=278782&r2=278783&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGen/<wbr>builtins-x86.c (original)<br>
+++ cfe/trunk/test/CodeGen/<wbr>builtins-x86.c Tue Aug 16 03:13:36 2016<br>
@@ -270,6 +270,8 @@ void f0() {<br>
<br>
   (void)__builtin_ia32_xsave(<wbr>tmp_vp, tmp_ULLi);<br>
   (void)__builtin_ia32_xsave64(<wbr>tmp_vp, tmp_ULLi);<br>
+  tmp_ULLi = __builtin_ia32_xgetbv(tmp_Ui);<br>
+  (void)__builtin_ia32_xsetbv(<wbr>tmp_Ui, tmp_ULLi);<br>
   (void)__builtin_ia32_xrstor(<wbr>tmp_vp, tmp_ULLi);<br>
   (void)__builtin_ia32_xrstor64(<wbr>tmp_vp, tmp_ULLi);<br>
   (void)__builtin_ia32_xsaveopt(<wbr>tmp_vp, tmp_ULLi);<br>
<br>
Modified: cfe/trunk/test/CodeGen/x86_32-<wbr>xsave.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_32-xsave.c?rev=278783&r1=278782&r2=278783&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGen/x86_32-xsave.c?rev=<wbr>278783&r1=278782&r2=278783&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGen/x86_32-<wbr>xsave.c (original)<br>
+++ cfe/trunk/test/CodeGen/x86_32-<wbr>xsave.c Tue Aug 16 03:13:36 2016<br>
@@ -1,6 +1,9 @@<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVE -O0 -triple=i686-unknown-unknown -target-feature +xsave -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVE<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVE -O0 -triple=i686-unknown-unknown -target-feature +xsave -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVE<br>
<br>
+// RUN: %clang_cc1 %s -DTEST_XGETBV -O0 -triple=i686-unknown-unknown -target-feature +xsave -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XGETBV<br>
+// RUN: %clang_cc1 %s -DTEST_XSETBV -O0 -triple=i686-unknown-unknown -target-feature +xsave -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSETBV<br>
+<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVEOPT -O0 -triple=i686-unknown-unknown -target-feature +xsave -target-feature +xsaveopt -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVEOPT<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVEOPT -O0 -triple=i686-unknown-unknown -target-feature +xsave -target-feature +xsaveopt -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVEOPT<br>
<br>
@@ -10,9 +13,15 @@<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVES -O0 -triple=i686-unknown-unknown -target-feature +xsave -target-feature +xsaves -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVES<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVES -O0 -triple=i686-unknown-unknown -target-feature +xsave -target-feature +xsaves -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVES<br>
<br>
+// Don't include mm_malloc.h, it's system specific.<br>
+#define __MM_MALLOC_H<br>
+#include <x86intrin.h><br>
+<br>
 void test() {<br>
-  unsigned long long tmp_ULLi = 0;<br>
-  void*              tmp_vp = 0;<br>
+  unsigned long long tmp_ULLi;<br>
+  unsigned int       tmp_Ui;<br>
+  void*              tmp_vp;<br>
+  tmp_ULLi = 0; tmp_Ui = 0; tmp_vp = 0;<br>
<br>
 #ifdef TEST_XSAVE<br>
 // XSAVE: [[tmp_vp_1:%[0-9a-zA-z]+]] = load i8*, i8** %tmp_vp, align 4<br>
@@ -30,6 +39,12 @@ void test() {<br>
 // XSAVE: [[low32_3:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_3]] to i32<br>
 // XSAVE: call void @llvm.x86.xrstor(i8* [[tmp_vp_3]], i32 [[high32_3]], i32 [[low32_3]])<br>
   (void)__builtin_ia32_xrstor(<wbr>tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVE: call void @llvm.x86.xsave<br>
+  (void)_xsave(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVE: call void @llvm.x86.xrstor<br>
+  (void)_xrstor(tmp_vp, tmp_ULLi);<br>
 #endif<br>
<br>
 #ifdef TEST_XSAVEOPT<br>
@@ -40,6 +55,9 @@ void test() {<br>
 // XSAVEOPT: [[low32_1:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_1]] to i32<br>
 // XSAVEOPT: call void @llvm.x86.xsaveopt(i8* [[tmp_vp_1]], i32 [[high32_1]], i32 [[low32_1]])<br>
   (void)__builtin_ia32_xsaveopt(<wbr>tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVEOPT: call void @llvm.x86.xsaveopt<br>
+  (void)_xsaveopt(tmp_vp, tmp_ULLi);<br>
 #endif<br>
<br>
 #ifdef TEST_XSAVEC<br>
@@ -50,6 +68,9 @@ void test() {<br>
 // XSAVEC: [[low32_1:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_1]] to i32<br>
 // XSAVEC: call void @llvm.x86.xsavec(i8* [[tmp_vp_1]], i32 [[high32_1]], i32 [[low32_1]])<br>
   (void)__builtin_ia32_xsavec(<wbr>tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVEC: call void @llvm.x86.xsavec<br>
+  (void)_xsavec(tmp_vp, tmp_ULLi);<br>
 #endif<br>
<br>
 #ifdef TEST_XSAVES<br>
@@ -68,5 +89,34 @@ void test() {<br>
 // XSAVES: [[low32_3:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_3]] to i32<br>
 // XSAVES: call void @llvm.x86.xrstors(i8* [[tmp_vp_3]], i32 [[high32_3]], i32 [[low32_3]])<br>
   (void)__builtin_ia32_xrstors(<wbr>tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVES: call void @llvm.x86.xsaves<br>
+  (void)_xsaves(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVES: call void @llvm.x86.xrstors<br>
+  (void)_xrstors(tmp_vp, tmp_ULLi);<br>
+#endif<br>
+<br>
+#ifdef TEST_XGETBV<br>
+// XGETBV: [[tmp_Ui:%[0-9a-zA-z]+]] = load i32, i32* %tmp_Ui, align 4<br>
+// XGETBV: call i64 @llvm.x86.xgetbv(i32 [[tmp_Ui]])<br>
+  tmp_ULLi = __builtin_ia32_xgetbv(tmp_Ui);<br>
+<br>
+// XGETBV: call i64 @llvm.x86.xgetbv<br>
+  tmp_ULLi = _xgetbv(tmp_Ui);<br>
+#endif<br>
+<br>
+#ifdef TEST_XSETBV<br>
+// XSETBV: [[tmp_Ui:%[0-9a-zA-z]+]] = load i32, i32* %tmp_Ui, align 4<br>
+// XSETBV: [[tmp_ULLi_3:%[0-9a-zA-z]+]] = load i64, i64* %tmp_ULLi, align 8<br>
+// XSETBV: [[high64_3:%[0-9a-zA-z]+]] = lshr i64 [[tmp_ULLi_3]], 32<br>
+// XSETBV: [[high32_3:%[0-9a-zA-z]+]] = trunc i64 [[high64_3]] to i32<br>
+// XSETBV: [[low32_3:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_3]] to i32<br>
+// XSETBV: call void @llvm.x86.xsetbv(i32 [[tmp_Ui]], i32 [[high32_3]], i32 [[low32_3]])<br>
+  (void)__builtin_ia32_xsetbv(<wbr>tmp_Ui, tmp_ULLi);<br>
+<br>
+  // XSETBV: call void @llvm.x86.xsetbv<br>
+  (void)_xsetbv(tmp_Ui, tmp_ULLi);<br>
 #endif<br>
-}<br>
+<br>
+}<br>
\ No newline at end of file<br>
<br>
Modified: cfe/trunk/test/CodeGen/x86_64-<wbr>xsave.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_64-xsave.c?rev=278783&r1=278782&r2=278783&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>CodeGen/x86_64-xsave.c?rev=<wbr>278783&r1=278782&r2=278783&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/CodeGen/x86_64-<wbr>xsave.c (original)<br>
+++ cfe/trunk/test/CodeGen/x86_64-<wbr>xsave.c Tue Aug 16 03:13:36 2016<br>
@@ -1,6 +1,9 @@<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVE -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVE<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVE -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVE<br>
<br>
+// RUN: %clang_cc1 %s -DTEST_XGETBV -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XGETBV<br>
+// RUN: %clang_cc1 %s -DTEST_XSETBV -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSETBV<br>
+<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVEOPT -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsaveopt -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVEOPT<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVEOPT -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsaveopt -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVEOPT<br>
<br>
@@ -10,9 +13,16 @@<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVES -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsaves -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVES<br>
 // RUN: %clang_cc1 %s -DTEST_XSAVES -O0 -triple=x86_64-unknown-unknown -target-feature +xsave -target-feature +xsaves -fno-signed-char -emit-llvm -o - -Wall -Werror | FileCheck %s --check-prefix=XSAVES<br>
<br>
+// Don't include mm_malloc.h, it's system specific.<br>
+#define __MM_MALLOC_H<br>
+#include <x86intrin.h><br>
+<br>
+<br>
 void test() {<br>
-  unsigned long long tmp_ULLi = 0;<br>
-  void*              tmp_vp = 0;<br>
+  unsigned long long tmp_ULLi;<br>
+  unsigned int       tmp_Ui;<br>
+  void*              tmp_vp;<br>
+  tmp_ULLi = 0; tmp_Ui = 0; tmp_vp = 0;<br>
<br>
 #ifdef TEST_XSAVE<br>
 // XSAVE: [[tmp_vp_1:%[0-9a-zA-z]+]] = load i8*, i8** %tmp_vp, align 8<br>
@@ -46,6 +56,18 @@ void test() {<br>
 // XSAVE: [[low32_4:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_4]] to i32<br>
 // XSAVE: call void @llvm.x86.xrstor64(i8* [[tmp_vp_4]], i32 [[high32_4]], i32 [[low32_4]])<br>
   (void)__builtin_ia32_xrstor64(<wbr>tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVE: call void @llvm.x86.xsave<br>
+  (void)_xsave(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVE: call void @llvm.x86.xsave64<br>
+  (void)_xsave64(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVE: call void @llvm.x86.xrstor<br>
+  (void)_xrstor(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVE: call void @llvm.x86.xrstor64<br>
+  (void)_xrstor64(tmp_vp, tmp_ULLi);<br>
 #endif<br>
<br>
 #ifdef TEST_XSAVEOPT<br>
@@ -64,6 +86,12 @@ void test() {<br>
 // XSAVEOPT: [[low32_2:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_2]] to i32<br>
 // XSAVEOPT: call void @llvm.x86.xsaveopt64(i8* [[tmp_vp_2]], i32 [[high32_2]], i32 [[low32_2]])<br>
   (void)__builtin_ia32_<wbr>xsaveopt64(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVEOPT: call void @llvm.x86.xsaveopt<br>
+  (void)_xsaveopt(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVEOPT: call void @llvm.x86.xsaveopt64<br>
+  (void)_xsaveopt64(tmp_vp, tmp_ULLi);<br>
 #endif<br>
<br>
 #ifdef TEST_XSAVEC<br>
@@ -82,6 +110,12 @@ void test() {<br>
 // XSAVEC: [[low32_2:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_2]] to i32<br>
 // XSAVEC: call void @llvm.x86.xsavec64(i8* [[tmp_vp_2]], i32 [[high32_2]], i32 [[low32_2]])<br>
   (void)__builtin_ia32_xsavec64(<wbr>tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVEC: call void @llvm.x86.xsavec<br>
+  (void)_xsavec(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVEC: call void @llvm.x86.xsavec64<br>
+  (void)_xsavec64(tmp_vp, tmp_ULLi);<br>
 #endif<br>
<br>
 #ifdef TEST_XSAVES<br>
@@ -116,5 +150,39 @@ void test() {<br>
 // XSAVES: [[low32_4:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_4]] to i32<br>
 // XSAVES: call void @llvm.x86.xrstors64(i8* [[tmp_vp_4]], i32 [[high32_4]], i32 [[low32_4]])<br>
   (void)__builtin_ia32_<wbr>xrstors64(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVES: call void @llvm.x86.xsaves<br>
+  (void)_xsaves(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVES: call void @llvm.x86.xsaves64<br>
+  (void)_xsaves64(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVES: call void @llvm.x86.xrstors<br>
+  (void)_xrstors(tmp_vp, tmp_ULLi);<br>
+<br>
+// XSAVES: call void @llvm.x86.xrstors64<br>
+  (void)_xrstors64(tmp_vp, tmp_ULLi);<br>
+#endif<br>
+<br>
+#ifdef TEST_XGETBV<br>
+// XGETBV: [[tmp_Ui:%[0-9a-zA-z]+]] = load i32, i32* %tmp_Ui, align 4<br>
+// XGETBV: call i64 @llvm.x86.xgetbv(i32 [[tmp_Ui]])<br>
+  tmp_ULLi = __builtin_ia32_xgetbv(tmp_Ui);<br>
+<br>
+// XGETBV: call i64 @llvm.x86.xgetbv<br>
+  tmp_ULLi = _xgetbv(tmp_Ui);<br>
+#endif<br>
+<br>
+#ifdef TEST_XSETBV<br>
+// XSETBV: [[tmp_Ui:%[0-9a-zA-z]+]] = load i32, i32* %tmp_Ui, align 4<br>
+// XSETBV: [[tmp_ULLi_3:%[0-9a-zA-z]+]] = load i64, i64* %tmp_ULLi, align 8<br>
+// XSETBV: [[high64_3:%[0-9a-zA-z]+]] = lshr i64 [[tmp_ULLi_3]], 32<br>
+// XSETBV: [[high32_3:%[0-9a-zA-z]+]] = trunc i64 [[high64_3]] to i32<br>
+// XSETBV: [[low32_3:%[0-9a-zA-z]+]] = trunc i64 [[tmp_ULLi_3]] to i32<br>
+// XSETBV: call void @llvm.x86.xsetbv(i32 [[tmp_Ui]], i32 [[high32_3]], i32 [[low32_3]])<br>
+  (void)__builtin_ia32_xsetbv(<wbr>tmp_Ui, tmp_ULLi);<br>
+<br>
+  // XSETBV: call void @llvm.x86.xsetbv<br>
+  (void)_xsetbv(tmp_Ui, tmp_ULLi);<br>
 #endif<br>
 }<br>
<br>
Modified: cfe/trunk/test/Headers/ms-<wbr>intrin.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/ms-intrin.cpp?rev=278783&r1=278782&r2=278783&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/cfe/trunk/test/<wbr>Headers/ms-intrin.cpp?rev=<wbr>278783&r1=278782&r2=278783&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- cfe/trunk/test/Headers/ms-<wbr>intrin.cpp (original)<br>
+++ cfe/trunk/test/Headers/ms-<wbr>intrin.cpp Tue Aug 16 03:13:36 2016<br>
@@ -50,7 +50,6 @@ void f() {<br>
   int info[4];<br>
   __cpuid(info, 0);<br>
   __cpuidex(info, 0, 0);<br>
-  _xgetbv(0);<br>
   __halt();<br>
   __readmsr(0);<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br></div>