<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>