Implement xgetbv and xsetbv.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 22 Feb 2011 00:35:18 +0000 (00:35 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 22 Feb 2011 00:35:18 +0000 (00:35 +0000)
Patch by Jai Menon.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126165 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/X86InstrFormats.td
lib/Target/X86/X86InstrInfo.h
lib/Target/X86/X86InstrSystem.td
lib/Target/X86/X86MCCodeEmitter.cpp
test/MC/X86/x86-64.s
utils/TableGen/X86RecognizableInstr.cpp

index 344c14c112a0eeb22c59c0d44a3bd6be2b34d20f..0660072589e4c98a0c67ac945fbd48333f530ce6 100644 (file)
@@ -41,6 +41,8 @@ def MRM_F8 : Format<41>;
 def MRM_F9 : Format<42>;
 def RawFrmImm8 : Format<43>;
 def RawFrmImm16 : Format<44>;
+def MRM_D0 : Format<45>;
+def MRM_D1 : Format<46>;
 
 // ImmType - This specifies the immediate type used by an instruction. This is
 // part of the ad-hoc solution used to emit machine instruction encodings by our
index 1d44207872732330cb931c6fd9711484bf20fb61..fcb5a25104ac460bc21f9836133815abf4746332 100644 (file)
@@ -311,6 +311,8 @@ namespace X86II {
     MRM_F0 = 40,
     MRM_F8 = 41,
     MRM_F9 = 42,
+    MRM_D0 = 45,
+    MRM_D1 = 46,
 
     /// RawFrmImm8 - This is used for the ENTER instruction, which has two
     /// immediates, the first of which is a 16-bit immediate (specified by
@@ -577,6 +579,8 @@ namespace X86II {
     case X86II::MRM_F0:
     case X86II::MRM_F8:
     case X86II::MRM_F9:
+    case X86II::MRM_D0:
+    case X86II::MRM_D1:
       return -1;
     }
   }
index 1a58ba0f96ef722c478ac3d9faa475cacfb69bef..6a24d145c6967c1a5523440e97ee04da440b7fc9 100644 (file)
@@ -388,3 +388,8 @@ def CPUID : I<0xA2, RawFrm, (outs), (ins), "cpuid", []>, TB;
 def INVD : I<0x08, RawFrm, (outs), (ins), "invd", []>, TB;
 def WBINVD : I<0x09, RawFrm, (outs), (ins), "wbinvd", []>, TB;
 
+let Defs = [RDX, RAX], Uses = [RCX] in
+  def XGETBV : I<0x01, MRM_D0, (outs), (ins), "xgetbv", []>, TB;
+
+let Uses = [RDX, RAX, RCX] in
+  def XSETBV : I<0x01, MRM_D1, (outs), (ins), "xsetbv", []>, TB;
index e6dc74e65d795f815820b6d2576ce8f1f8b34d56..0e3b5711f2b5e1a07eb0246394edfe4a10badf5a 100644 (file)
@@ -979,6 +979,14 @@ EncodeInstruction(const MCInst &MI, raw_ostream &OS,
     EmitByte(BaseOpcode, CurByte, OS);
     EmitByte(0xF9, CurByte, OS);
     break;
+  case X86II::MRM_D0:
+    EmitByte(BaseOpcode, CurByte, OS);
+    EmitByte(0xD0, CurByte, OS);
+    break;
+  case X86II::MRM_D1:
+    EmitByte(BaseOpcode, CurByte, OS);
+    EmitByte(0xD1, CurByte, OS);
+    break;
   }
 
   // If there is a remaining operand, it must be a trailing immediate.  Emit it
index c8b6414d59a6c4174e77b788b4a2eb544029cb32..4e3499055bde2463c9afe3663ffde6755872bf35 100644 (file)
@@ -942,3 +942,7 @@ movq 18446744073709551615,%rbx   // CHECK: movq     -1, %rbx
 
 // PR8946
 movdqu %xmm0, %xmm1 // CHECK: movdqu   %xmm0, %xmm1 # encoding: [0xf3,0x0f,0x6f,0xc8]
+
+// PR8935
+xgetbv // CHECK: xgetbv # encoding: [0x0f,0x01,0xd0]
+xsetbv // CHECK: xsetbv # encoding: [0x0f,0x01,0xd1]
index ccd3efd980a260ae69ca45be9f286e076308c583..b0839c33982dc5e7e134419649d456b894daad36 100644 (file)
@@ -34,7 +34,9 @@ using namespace llvm;
   MAP(E8, 39)           \
   MAP(F0, 40)           \
   MAP(F8, 41)           \
-  MAP(F9, 42)
+  MAP(F9, 42)           \
+  MAP(D0, 45)           \
+  MAP(D1, 46)
 
 // A clone of X86 since we can't depend on something that is generated.
 namespace X86Local {