<div dir="ltr">Out of curiosity are these all going to be separate on a processor? I.e. it's not just a single family of instructions like avx, but a bunch of separate features controlled by separate cpuid flags?<div><br></div><div>-eric</div><br><div class="gmail_quote"><div dir="ltr">On Mon, Oct 12, 2015 at 4:49 AM Amjad Aboud via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: aaboud<br>
Date: Mon Oct 12 06:47:46 2015<br>
New Revision: 250029<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=250029&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=250029&view=rev</a><br>
Log:<br>
[X86] Add XSAVE intrinsic family<br>
<br>
Add intrinsics for the<br>
  XSAVE instructions (XSAVE/XSAVE64/XRSTOR/XRSTOR64)<br>
  XSAVEOPT instructions (XSAVEOPT/XSAVEOPT64)<br>
  XSAVEC instructions (XSAVEC/XSAVEC64)<br>
  XSAVES instructions (XSAVES/XSAVES64/XRSTORS/XRSTORS64)<br>
<br>
Differential Revision: <a href="http://reviews.llvm.org/D13012" rel="noreferrer" target="_blank">http://reviews.llvm.org/D13012</a><br>
<br>
Added:<br>
    llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsave.ll<br>
    llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsavec.ll<br>
    llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaveopt.ll<br>
    llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaves.ll<br>
    llvm/trunk/test/CodeGen/X86/system-intrinsics-xsave.ll<br>
    llvm/trunk/test/CodeGen/X86/system-intrinsics-xsavec.ll<br>
    llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaveopt.ll<br>
    llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaves.ll<br>
Modified:<br>
    llvm/trunk/include/llvm/IR/IntrinsicsX86.td<br>
    llvm/trunk/lib/Support/Host.cpp<br>
    llvm/trunk/lib/Target/X86/X86.td<br>
    llvm/trunk/lib/Target/X86/X86InstrInfo.td<br>
    llvm/trunk/lib/Target/X86/X86InstrSystem.td<br>
    llvm/trunk/lib/Target/X86/X86Subtarget.cpp<br>
    llvm/trunk/lib/Target/X86/X86Subtarget.h<br>
<br>
Modified: llvm/trunk/include/llvm/IR/IntrinsicsX86.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicsX86.td?rev=250029&r1=250028&r2=250029&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/IntrinsicsX86.td?rev=250029&r1=250028&r2=250029&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/IntrinsicsX86.td (original)<br>
+++ llvm/trunk/include/llvm/IR/IntrinsicsX86.td Mon Oct 12 06:47:46 2015<br>
@@ -3801,6 +3801,35 @@ let TargetPrefix = "x86" in {  // All in<br>
 }<br>
<br>
 //===----------------------------------------------------------------------===//<br>
+// XSAVE<br>
+let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".<br>
+  def int_x86_xsave :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xsave64 :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xrstor :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xrstor64 :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xsaveopt :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xsaveopt64 :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xrstors :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xrstors64 :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xsavec :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xsavec64 :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xsaves :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+  def int_x86_xsaves64 :<br>
+              Intrinsic<[], [llvm_ptr_ty, llvm_i32_ty, llvm_i32_ty], []>;<br>
+}<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
 // Half float conversion<br>
<br>
 let TargetPrefix = "x86" in {  // All intrinsics start with "llvm.x86.".<br>
<br>
Modified: llvm/trunk/lib/Support/Host.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Host.cpp?rev=250029&r1=250028&r2=250029&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Host.cpp?rev=250029&r1=250028&r2=250029&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Support/Host.cpp (original)<br>
+++ llvm/trunk/lib/Support/Host.cpp Mon Oct 12 06:47:46 2015<br>
@@ -769,6 +769,7 @@ bool sys::getHostCPUFeatures(StringMap<b<br>
   Features["movbe"]  = (ECX >> 22) & 1;<br>
   Features["popcnt"] = (ECX >> 23) & 1;<br>
   Features["aes"]    = (ECX >> 25) & 1;<br>
+  Features["xsave"]  = (ECX >> 26) & 1;<br>
   Features["rdrnd"]  = (ECX >> 30) & 1;<br>
<br>
   // If CPUID indicates support for XSAVE, XRESTORE and AVX, and XGETBV<br>
@@ -819,6 +820,14 @@ bool sys::getHostCPUFeatures(StringMap<b<br>
   Features["avx512bw"] = HasLeaf7 && ((EBX >> 30) & 1) && HasAVX512Save;<br>
   Features["avx512vl"] = HasLeaf7 && ((EBX >> 31) & 1) && HasAVX512Save;<br>
<br>
+<br>
+  bool HasLeafD = MaxLevel >= 0xd &&<br>
+    !GetX86CpuIDAndInfoEx(0xd, 0x1, &EAX, &EBX, &ECX, &EDX);<br>
+<br>
+  Features["xsaveopt"] = Features["xsave"] && HasLeafD && ((EAX >> 0) & 1);<br>
+  Features["xsavec"]   = Features["xsave"] && HasLeafD && ((EAX >> 1) & 1);<br>
+  Features["xsaves"]   = Features["xsave"] && HasLeafD && ((EAX >> 3) & 1);<br>
+<br>
   return true;<br>
 }<br>
 #elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86.td?rev=250029&r1=250028&r2=250029&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86.td?rev=250029&r1=250028&r2=250029&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86.td (original)<br>
+++ llvm/trunk/lib/Target/X86/X86.td Mon Oct 12 06:47:46 2015<br>
@@ -37,6 +37,18 @@ def FeatureCMOV    : SubtargetFeature<"c<br>
 def FeaturePOPCNT   : SubtargetFeature<"popcnt", "HasPOPCNT", "true",<br>
                                        "Support POPCNT instruction">;<br>
<br>
+def FeatureXSAVE   : SubtargetFeature<"xsave", "HasXSAVE", "true",<br>
+                                       "Support xsave instructions">;<br>
+<br>
+def FeatureXSAVEOPT: SubtargetFeature<"xsaveopt", "HasXSAVEOPT", "true",<br>
+                                       "Support xsaveopt instructions">;<br>
+<br>
+def FeatureXSAVEC  : SubtargetFeature<"xsavec", "HasXSAVEC", "true",<br>
+                                       "Support xsavec instructions">;<br>
+<br>
+def FeatureXSAVES  : SubtargetFeature<"xsaves", "HasXSAVES", "true",<br>
+                                       "Support xsaves instructions">;<br>
+<br>
 // The MMX subtarget feature is separate from the rest of the SSE features<br>
 // because it's important (for odd compatibility reasons) to be able to<br>
 // turn it off explicitly while allowing SSE+ to be on.<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86InstrInfo.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=250029&r1=250028&r2=250029&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrInfo.td?rev=250029&r1=250028&r2=250029&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86InstrInfo.td (original)<br>
+++ llvm/trunk/lib/Target/X86/X86InstrInfo.td Mon Oct 12 06:47:46 2015<br>
@@ -773,6 +773,10 @@ def NoVLX_Or_NoBWI : Predicate<"!Subtarg<br>
<br>
 def HasPOPCNT    : Predicate<"Subtarget->hasPOPCNT()">;<br>
 def HasAES       : Predicate<"Subtarget->hasAES()">;<br>
+def HasXSAVE     : Predicate<"Subtarget->hasXSAVE()">;<br>
+def HasXSAVEOPT  : Predicate<"Subtarget->hasXSAVEOPT()">;<br>
+def HasXSAVEC    : Predicate<"Subtarget->hasXSAVEC()">;<br>
+def HasXSAVES    : Predicate<"Subtarget->hasXSAVES()">;<br>
 def HasPCLMUL    : Predicate<"Subtarget->hasPCLMUL()">;<br>
 def HasFMA       : Predicate<"Subtarget->hasFMA()">;<br>
 def UseFMAOnAVX  : Predicate<"Subtarget->hasFMA() && !Subtarget->hasAVX512()">;<br>
@@ -2635,7 +2639,9 @@ def : MnemonicAlias<"fxrstorq",  "fxrsto<br>
 def : MnemonicAlias<"xsaveq",    "xsave64",    "att">;<br>
 def : MnemonicAlias<"xrstorq",   "xrstor64",   "att">;<br>
 def : MnemonicAlias<"xsaveoptq", "xsaveopt64", "att">;<br>
-<br>
+def : MnemonicAlias<"xrstorsq",  "xrstors64",  "att">;<br>
+def : MnemonicAlias<"xsavecq",   "xsavec64",   "att">;<br>
+def : MnemonicAlias<"xsavesq",   "xsaves64",   "att">;<br>
<br>
 class CondCodeAlias<string Prefix,string Suffix, string OldCond, string NewCond,<br>
                     string VariantName><br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86InstrSystem.td<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSystem.td?rev=250029&r1=250028&r2=250029&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86InstrSystem.td?rev=250029&r1=250028&r2=250029&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86InstrSystem.td (original)<br>
+++ llvm/trunk/lib/Target/X86/X86InstrSystem.td Mon Oct 12 06:47:46 2015<br>
@@ -478,39 +478,60 @@ def WBINVD : I<0x09, RawFrm, (outs), (in<br>
 //===----------------------------------------------------------------------===//<br>
 // XSAVE instructions<br>
 let SchedRW = [WriteSystem] in {<br>
+let Predicates = [HasXSAVE] in {<br>
 let Defs = [EDX, EAX], Uses = [ECX] in<br>
   def XGETBV : I<0x01, MRM_D0, (outs), (ins), "xgetbv", []>, TB;<br>
<br>
 let Uses = [EDX, EAX, ECX] in<br>
   def XSETBV : I<0x01, MRM_D1, (outs), (ins), "xsetbv", []>, TB;<br>
+}<br>
<br>
-let Uses = [RDX, RAX] in {<br>
-  def XSAVE : I<0xAE, MRM4m, (outs opaque512mem:$dst), (ins),<br>
-               "xsave\t$dst", []>, TB;<br>
-  def XSAVE64 : RI<0xAE, MRM4m, (outs opaque512mem:$dst), (ins),<br>
-                 "xsave64\t$dst", []>, TB, Requires<[In64BitMode]>;<br>
+let Uses = [EDX, EAX] in {<br>
+let Predicates = [HasXSAVE] in {<br>
+  def XSAVE : I<0xAE, MRM4m, (outs), (ins opaque512mem:$dst),<br>
+                "xsave\t$dst",<br>
+                [(int_x86_xsave addr:$dst, EDX, EAX)]>, TB;<br>
+  def XSAVE64 : RI<0xAE, MRM4m, (outs), (ins opaque512mem:$dst),<br>
+                   "xsave64\t$dst",<br>
+                   [(int_x86_xsave64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;<br>
   def XRSTOR : I<0xAE, MRM5m, (outs), (ins opaque512mem:$dst),<br>
-               "xrstor\t$dst", []>, TB;<br>
+                 "xrstor\t$dst",<br>
+                 [(int_x86_xrstor addr:$dst, EDX, EAX)]>, TB;<br>
   def XRSTOR64 : RI<0xAE, MRM5m, (outs), (ins opaque512mem:$dst),<br>
-                 "xrstor64\t$dst", []>, TB, Requires<[In64BitMode]>;<br>
-  def XSAVEOPT : I<0xAE, MRM6m, (outs opaque512mem:$dst), (ins),<br>
-                  "xsaveopt\t$dst", []>, PS;<br>
-  def XSAVEOPT64 : RI<0xAE, MRM6m, (outs opaque512mem:$dst), (ins),<br>
-                    "xsaveopt64\t$dst", []>, PS, Requires<[In64BitMode]>;<br>
-<br>
+                    "xrstor64\t$dst",<br>
+                    [(int_x86_xrstor64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;<br>
+}<br>
+let Predicates = [HasXSAVEOPT] in {<br>
+  def XSAVEOPT : I<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),<br>
+                   "xsaveopt\t$dst",<br>
+                   [(int_x86_xsaveopt addr:$dst, EDX, EAX)]>, TB;<br>
+  def XSAVEOPT64 : RI<0xAE, MRM6m, (outs), (ins opaque512mem:$dst),<br>
+                      "xsaveopt64\t$dst",<br>
+                      [(int_x86_xsaveopt64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;<br>
+}<br>
+let Predicates = [HasXSAVEC] in {<br>
+  def XSAVEC : I<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),<br>
+                 "xsavec\t$dst",<br>
+                 [(int_x86_xsavec addr:$dst, EDX, EAX)]>, TB;<br>
+  def XSAVEC64 : RI<0xC7, MRM4m, (outs), (ins opaque512mem:$dst),<br>
+                   "xsavec64\t$dst",<br>
+                   [(int_x86_xsavec64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;<br>
+}<br>
+let Predicates = [HasXSAVES] in {<br>
+  def XSAVES : I<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),<br>
+                 "xsaves\t$dst",<br>
+                 [(int_x86_xsaves addr:$dst, EDX, EAX)]>, TB;<br>
+  def XSAVES64 : RI<0xC7, MRM5m, (outs), (ins opaque512mem:$dst),<br>
+                    "xsaves64\t$dst",<br>
+                    [(int_x86_xsaves64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;<br>
   def XRSTORS : I<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),<br>
-                "xrstors\t$dst", []>, TB;<br>
+                  "xrstors\t$dst",<br>
+                  [(int_x86_xrstors addr:$dst, EDX, EAX)]>, TB;<br>
   def XRSTORS64 : RI<0xC7, MRM3m, (outs), (ins opaque512mem:$dst),<br>
-                  "xrstors64\t$dst", []>, TB, Requires<[In64BitMode]>;<br>
-  def XSAVEC : I<0xC7, MRM4m, (outs opaque512mem:$dst), (ins),<br>
-                "xsavec\t$dst", []>, TB;<br>
-  def XSAVEC64 : RI<0xC7, MRM4m, (outs opaque512mem:$dst), (ins),<br>
-                  "xsavec64\t$dst", []>, TB, Requires<[In64BitMode]>;<br>
-  def XSAVES : I<0xC7, MRM5m, (outs opaque512mem:$dst), (ins),<br>
-                "xsaves\t$dst", []>, TB;<br>
-  def XSAVES64 : RI<0xC7, MRM5m, (outs opaque512mem:$dst), (ins),<br>
-                  "xsaves64\t$dst", []>, TB, Requires<[In64BitMode]>;<br>
+                     "xrstors64\t$dst",<br>
+                     [(int_x86_xrstors64 addr:$dst, EDX, EAX)]>, TB, Requires<[In64BitMode]>;<br>
 }<br>
+} // Uses<br>
 } // SchedRW<br>
<br>
 //===----------------------------------------------------------------------===//<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86Subtarget.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=250029&r1=250028&r2=250029&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.cpp?rev=250029&r1=250028&r2=250029&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86Subtarget.cpp (original)<br>
+++ llvm/trunk/lib/Target/X86/X86Subtarget.cpp Mon Oct 12 06:47:46 2015<br>
@@ -236,6 +236,10 @@ void X86Subtarget::initializeEnvironment<br>
   HasPOPCNT = false;<br>
   HasSSE4A = false;<br>
   HasAES = false;<br>
+  HasXSAVE = false;<br>
+  HasXSAVEOPT = false;<br>
+  HasXSAVEC = false;<br>
+  HasXSAVES = false;<br>
   HasPCLMUL = false;<br>
   HasFMA = false;<br>
   HasFMA4 = false;<br>
<br>
Modified: llvm/trunk/lib/Target/X86/X86Subtarget.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=250029&r1=250028&r2=250029&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86Subtarget.h?rev=250029&r1=250028&r2=250029&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/X86/X86Subtarget.h (original)<br>
+++ llvm/trunk/lib/Target/X86/X86Subtarget.h Mon Oct 12 06:47:46 2015<br>
@@ -89,6 +89,15 @@ protected:<br>
   /// Target has AES instructions<br>
   bool HasAES;<br>
<br>
+  /// Target has XSAVE instructions<br>
+  bool HasXSAVE;<br>
+  /// Target has XSAVEOPT instructions<br>
+  bool HasXSAVEOPT;<br>
+  /// Target has XSAVEC instructions<br>
+  bool HasXSAVEC;<br>
+  /// Target has XSAVES instructions<br>
+  bool HasXSAVES;<br>
+<br>
   /// Target has carry-less multiplication<br>
   bool HasPCLMUL;<br>
<br>
@@ -339,6 +348,10 @@ public:<br>
   bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; }<br>
   bool hasPOPCNT() const { return HasPOPCNT; }<br>
   bool hasAES() const { return HasAES; }<br>
+  bool hasXSAVE() const { return HasXSAVE; }<br>
+  bool hasXSAVEOPT() const { return HasXSAVEOPT; }<br>
+  bool hasXSAVEC() const { return HasXSAVEC; }<br>
+  bool hasXSAVES() const { return HasXSAVES; }<br>
   bool hasPCLMUL() const { return HasPCLMUL; }<br>
   bool hasFMA() const { return HasFMA; }<br>
   // FIXME: Favor FMA when both are enabled. Is this the right thing to do?<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsave.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsave.ll?rev=250029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsave.ll?rev=250029&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsave.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsave.ll Mon Oct 12 06:47:46 2015<br>
@@ -0,0 +1,41 @@<br>
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xsave | FileCheck %s<br>
+<br>
+define void @test_xsave(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsave<br>
+; CHECK: movl  %edx, %eax<br>
+; CHECK: movl  %esi, %edx<br>
+; CHECK: xsave (%rdi)<br>
+  call void @llvm.x86.xsave(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsave(i8*, i32, i32)<br>
+<br>
+define void @test_xsave64(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsave64<br>
+; CHECK: movl    %edx, %eax<br>
+; CHECK: movl    %esi, %edx<br>
+; CHECK: xsave64 (%rdi)<br>
+  call void @llvm.x86.xsave64(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsave64(i8*, i32, i32)<br>
+<br>
+define void @test_xrstor(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xrstor<br>
+; CHECK: movl   %edx, %eax<br>
+; CHECK: movl   %esi, %edx<br>
+; CHECK: xrstor (%rdi)<br>
+  call void @llvm.x86.xrstor(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xrstor(i8*, i32, i32)<br>
+<br>
+define void @test_xrstor64(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xrstor64<br>
+; CHECK: movl     %edx, %eax<br>
+; CHECK: movl     %esi, %edx<br>
+; CHECK: xrstor64 (%rdi)<br>
+  call void @llvm.x86.xrstor64(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xrstor64(i8*, i32, i32)<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsavec.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsavec.ll?rev=250029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsavec.ll?rev=250029&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsavec.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsavec.ll Mon Oct 12 06:47:46 2015<br>
@@ -0,0 +1,21 @@<br>
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xsave,+xsavec | FileCheck %s<br>
+<br>
+define void @test_xsavec(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsavec<br>
+; CHECK: movl   %edx, %eax<br>
+; CHECK: movl   %esi, %edx<br>
+; CHECK: xsavec (%rdi)<br>
+  call void @llvm.x86.xsavec(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsavec(i8*, i32, i32)<br>
+<br>
+define void @test_xsavec64(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsavec64<br>
+; CHECK: movl     %edx, %eax<br>
+; CHECK: movl     %esi, %edx<br>
+; CHECK: xsavec64 (%rdi)<br>
+  call void @llvm.x86.xsavec64(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsavec64(i8*, i32, i32)<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaveopt.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaveopt.ll?rev=250029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaveopt.ll?rev=250029&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaveopt.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaveopt.ll Mon Oct 12 06:47:46 2015<br>
@@ -0,0 +1,21 @@<br>
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xsaveopt | FileCheck %s<br>
+<br>
+define void @test_xsaveopt(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsaveopt<br>
+; CHECK: movl     %edx, %eax<br>
+; CHECK: movl     %esi, %edx<br>
+; CHECK: xsaveopt (%rdi)<br>
+  call void @llvm.x86.xsaveopt(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsaveopt(i8*, i32, i32)<br>
+<br>
+define void @test_xsaveopt64(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsaveopt64<br>
+; CHECK: movl       %edx, %eax<br>
+; CHECK: movl       %esi, %edx<br>
+; CHECK: xsaveopt64 (%rdi)<br>
+  call void @llvm.x86.xsaveopt64(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsaveopt64(i8*, i32, i32)<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaves.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaves.ll?rev=250029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaves.ll?rev=250029&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaves.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/system-intrinsics-64-xsaves.ll Mon Oct 12 06:47:46 2015<br>
@@ -0,0 +1,41 @@<br>
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+xsave,+xsaves | FileCheck %s<br>
+<br>
+define void @test_xsaves(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsaves<br>
+; CHECK: movl   %edx, %eax<br>
+; CHECK: movl   %esi, %edx<br>
+; CHECK: xsaves (%rdi)<br>
+  call void @llvm.x86.xsaves(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsaves(i8*, i32, i32)<br>
+<br>
+define void @test_xsaves64(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsaves64<br>
+; CHECK: movl     %edx, %eax<br>
+; CHECK: movl     %esi, %edx<br>
+; CHECK: xsaves64 (%rdi)<br>
+  call void @llvm.x86.xsaves64(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsaves64(i8*, i32, i32)<br>
+<br>
+define void @test_xrstors(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xrstors<br>
+; CHECK: movl    %edx, %eax<br>
+; CHECK: movl    %esi, %edx<br>
+; CHECK: xrstors (%rdi)<br>
+  call void @llvm.x86.xrstors(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xrstors(i8*, i32, i32)<br>
+<br>
+define void @test_xrstors64(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xrstors64<br>
+; CHECK: movl      %edx, %eax<br>
+; CHECK: movl      %esi, %edx<br>
+; CHECK: xrstors64 (%rdi)<br>
+  call void @llvm.x86.xrstors64(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xrstors64(i8*, i32, i32)<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/system-intrinsics-xsave.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-xsave.ll?rev=250029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-xsave.ll?rev=250029&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/system-intrinsics-xsave.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/system-intrinsics-xsave.ll Mon Oct 12 06:47:46 2015<br>
@@ -0,0 +1,23 @@<br>
+; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+xsave | FileCheck %s<br>
+<br>
+define void @test_xsave(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsave<br>
+; CHECK: movl  8(%esp), %edx<br>
+; CHECK: movl  12(%esp), %eax<br>
+; CHECK: movl  4(%esp), %ecx<br>
+; CHECK: xsave (%ecx)<br>
+  call void @llvm.x86.xsave(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsave(i8*, i32, i32)<br>
+<br>
+define void @test_xrstor(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xrstor<br>
+; CHECK: movl   8(%esp), %edx<br>
+; CHECK: movl   12(%esp), %eax<br>
+; CHECK: movl   4(%esp), %ecx<br>
+; CHECK: xrstor (%ecx)<br>
+  call void @llvm.x86.xrstor(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xrstor(i8*, i32, i32)<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/system-intrinsics-xsavec.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-xsavec.ll?rev=250029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-xsavec.ll?rev=250029&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/system-intrinsics-xsavec.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/system-intrinsics-xsavec.ll Mon Oct 12 06:47:46 2015<br>
@@ -0,0 +1,12 @@<br>
+; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+xsave,+xsavec | FileCheck %s<br>
+<br>
+define void @test_xsavec(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsavec<br>
+; CHECK: movl   8(%esp), %edx<br>
+; CHECK: movl   12(%esp), %eax<br>
+; CHECK: movl   4(%esp), %ecx<br>
+; CHECK: xsavec (%ecx)<br>
+  call void @llvm.x86.xsavec(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsavec(i8*, i32, i32)<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaveopt.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaveopt.ll?rev=250029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaveopt.ll?rev=250029&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaveopt.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaveopt.ll Mon Oct 12 06:47:46 2015<br>
@@ -0,0 +1,12 @@<br>
+; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+xsave,+xsaveopt | FileCheck %s<br>
+<br>
+define void @test_xsaveopt(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsaveopt<br>
+; CHECK: movl     8(%esp), %edx<br>
+; CHECK: movl     12(%esp), %eax<br>
+; CHECK: movl     4(%esp), %ecx<br>
+; CHECK: xsaveopt (%ecx)<br>
+  call void @llvm.x86.xsaveopt(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsaveopt(i8*, i32, i32)<br>
<br>
Added: llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaves.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaves.ll?rev=250029&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaves.ll?rev=250029&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaves.ll (added)<br>
+++ llvm/trunk/test/CodeGen/X86/system-intrinsics-xsaves.ll Mon Oct 12 06:47:46 2015<br>
@@ -0,0 +1,23 @@<br>
+; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+xsave,+xsaves | FileCheck %s<br>
+<br>
+define void @test_xsaves(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xsaves<br>
+; CHECK: movl   8(%esp), %edx<br>
+; CHECK: movl   12(%esp), %eax<br>
+; CHECK: movl   4(%esp), %ecx<br>
+; CHECK: xsaves (%ecx)<br>
+  call void @llvm.x86.xsaves(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xsaves(i8*, i32, i32)<br>
+<br>
+define void @test_xrstors(i8* %ptr, i32 %hi, i32 %lo) {<br>
+; CHECK-LABEL: test_xrstors<br>
+; CHECK: movl    8(%esp), %edx<br>
+; CHECK: movl    12(%esp), %eax<br>
+; CHECK: movl    4(%esp), %ecx<br>
+; CHECK: xrstors (%ecx)<br>
+  call void @llvm.x86.xrstors(i8* %ptr, i32 %hi, i32 %lo)<br>
+  ret void;<br>
+}<br>
+declare void @llvm.x86.xrstors(i8*, i32, i32)<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div>