<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D">Adding Guy, the author of this commit.<o:p></o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></a></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> Reid Kleckner [mailto:rnk@google.com]
<br>
<b>Sent:</b> Tuesday, August 16, 2016 19:14<br>
<b>To:</b> Yatsina, Marina <marina.yatsina@intel.com><br>
<b>Cc:</b> cfe-commits <cfe-commits@lists.llvm.org><br>
<b>Subject:</b> Re: r278783 - [X86] Add xgetbv/x[X86] Add xgetbv xsetbv intrinsics to non-windows platforms<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Reverted in r278814, it appears to break usage of _xgetbv on Windows:<o:p></o:p></p>
<div>
<p class="MsoNormal"><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><o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal">../../base/cpu.cc(194,10):  error: use of undeclared identifier '_xgetbv'<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">        (_xgetbv(0) & 6) == 6 /* XSAVE enabled by kernel */;<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">You removed the test in ms-intrin.cpp that would have prevented this breakage, too.<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Tue, Aug 16, 2016 at 1:13 AM, Marina Yatsina via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<o:p></o:p></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<p class="MsoNormal">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" target="_blank">
http://llvm.org/viewvc/llvm-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" target="_blank">
https://reviews.llvm.org/D21959</a><br>
<br>
<br>
Modified:<br>
    cfe/trunk/include/clang/Basic/BuiltinsX86.def<br>
    cfe/trunk/lib/CodeGen/CGBuiltin.cpp<br>
    cfe/trunk/lib/Headers/intrin.h<br>
    cfe/trunk/lib/Headers/xsaveintrin.h<br>
    cfe/trunk/test/CodeGen/builtins-x86.c<br>
    cfe/trunk/test/CodeGen/x86_32-xsave.c<br>
    cfe/trunk/test/CodeGen/x86_64-xsave.c<br>
    cfe/trunk/test/Headers/ms-intrin.cpp<br>
<br>
Modified: cfe/trunk/include/clang/Basic/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" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/BuiltinsX86.def?rev=278783&r1=278782&r2=278783&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/include/clang/Basic/BuiltinsX86.def (original)<br>
+++ cfe/trunk/include/clang/Basic/BuiltinsX86.def Tue Aug 16 03:13:36 2016<br>
@@ -644,6 +644,8 @@ TARGET_BUILTIN(__builtin_ia32_fxsave64,<br>
 // XSAVE<br>
 TARGET_BUILTIN(__builtin_ia32_xsave, "vv*ULLi", "", "xsave")<br>
 TARGET_BUILTIN(__builtin_ia32_xsave64, "vv*ULLi", "", "xsave")<br>
+TARGET_BUILTIN(__builtin_ia32_xgetbv, "ULLiUi", "", "xsave")<br>
+TARGET_BUILTIN(__builtin_ia32_xsetbv, "vUiULLi", "", "xsave")<br>
 TARGET_BUILTIN(__builtin_ia32_xrstor, "vv*ULLi", "", "xsave")<br>
 TARGET_BUILTIN(__builtin_ia32_xrstor64, "vv*ULLi", "", "xsave")<br>
 TARGET_BUILTIN(__builtin_ia32_xsaveopt, "vv*ULLi", "", "xsaveopt")<br>
<br>
Modified: cfe/trunk/lib/CodeGen/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" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGBuiltin.cpp?rev=278783&r1=278782&r2=278783&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/CodeGen/CGBuiltin.cpp (original)<br>
+++ cfe/trunk/lib/CodeGen/CGBuiltin.cpp Tue Aug 16 03:13:36 2016<br>
@@ -6915,7 +6915,8 @@ Value *CodeGenFunction::EmitX86BuiltinEx<br>
   case X86::BI__builtin_ia32_xsavec:<br>
   case X86::BI__builtin_ia32_xsavec64:<br>
   case X86::BI__builtin_ia32_xsaves:<br>
-  case X86::BI__builtin_ia32_xsaves64: {<br>
+  case X86::BI__builtin_ia32_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::EmitX86BuiltinEx<br>
     INTRINSIC_X86_XSAVE_ID(xsavec64);<br>
     INTRINSIC_X86_XSAVE_ID(xsaves);<br>
     INTRINSIC_X86_XSAVE_ID(xsaves64);<br>
+    INTRINSIC_X86_XSAVE_ID(xsetbv);<br>
     }<br>
 #undef INTRINSIC_X86_XSAVE_ID<br>
     Value *Mhi = Builder.CreateTrunc(<br>
@@ -6944,6 +6946,8 @@ Value *CodeGenFunction::EmitX86BuiltinEx<br>
     Ops.push_back(Mlo);<br>
     return Builder.CreateCall(CGM.getIntrinsic(ID), Ops);<br>
   }<br>
+  case X86::BI__builtin_ia32_xgetbv:<br>
+    return Builder.CreateCall(CGM.getIntrinsic(Intrinsic::x86_xgetbv), Ops);<br>
   case X86::BI__builtin_ia32_storedqudi128_mask:<br>
   case X86::BI__builtin_ia32_storedqusi128_mask:<br>
   case X86::BI__builtin_ia32_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" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/intrin.h?rev=278783&r1=278782&r2=278783&view=diff</a><br>
==============================================================================<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/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" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Headers/xsaveintrin.h?rev=278783&r1=278782&r2=278783&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Headers/xsaveintrin.h (original)<br>
+++ cfe/trunk/lib/Headers/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_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/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" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/builtins-x86.c?rev=278783&r1=278782&r2=278783&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/builtins-x86.c (original)<br>
+++ cfe/trunk/test/CodeGen/builtins-x86.c Tue Aug 16 03:13:36 2016<br>
@@ -270,6 +270,8 @@ void f0() {<br>
<br>
   (void)__builtin_ia32_xsave(tmp_vp, tmp_ULLi);<br>
   (void)__builtin_ia32_xsave64(tmp_vp, tmp_ULLi);<br>
+  tmp_ULLi = __builtin_ia32_xgetbv(tmp_Ui);<br>
+  (void)__builtin_ia32_xsetbv(tmp_Ui, tmp_ULLi);<br>
   (void)__builtin_ia32_xrstor(tmp_vp, tmp_ULLi);<br>
   (void)__builtin_ia32_xrstor64(tmp_vp, tmp_ULLi);<br>
   (void)__builtin_ia32_xsaveopt(tmp_vp, tmp_ULLi);<br>
<br>
Modified: cfe/trunk/test/CodeGen/x86_32-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" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_32-xsave.c?rev=278783&r1=278782&r2=278783&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/x86_32-xsave.c (original)<br>
+++ cfe/trunk/test/CodeGen/x86_32-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(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(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(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(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(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-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" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_64-xsave.c?rev=278783&r1=278782&r2=278783&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGen/x86_64-xsave.c (original)<br>
+++ cfe/trunk/test/CodeGen/x86_64-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(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_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(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_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(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-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" target="_blank">
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Headers/ms-intrin.cpp?rev=278783&r1=278782&r2=278783&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Headers/ms-intrin.cpp (original)<br>
+++ cfe/trunk/test/Headers/ms-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>
_______________________________________________<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" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><o:p></o:p></p>
</blockquote>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></body>
</html>