<div dir="ltr"><div>Please remove the long comments from these intrinsics headers. These headers are included a *lot*, so any extra text here adds up pretty fast. Also, no-one looks into the intrinsics headers for the documentation, and in any case, we're implementing an external specification here and it's not our job to document that specification. Finally, a lot of this isn't even documentation for the intrinsics, it's documentation for the instructions underlying those intrinsics and includes a bunch of useless information about (for example) effect on flags registers and the like.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, 30 Sep 2020 at 03:09, Xiang1 Zhang via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Xiang1 Zhang<br>
Date: 2020-09-30T18:08:45+08:00<br>
New Revision: 413577a8790407d75ba834fa5668c2632fe1851e<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/413577a8790407d75ba834fa5668c2632fe1851e" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/413577a8790407d75ba834fa5668c2632fe1851e</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/413577a8790407d75ba834fa5668c2632fe1851e.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/413577a8790407d75ba834fa5668c2632fe1851e.diff</a><br>
<br>
LOG: [X86] Support Intel Key Locker<br>
<br>
Key Locker provides a mechanism to encrypt and decrypt data with an AES key without having access<br>
to the raw key value by converting AES keys into “handles”. These handles can be used to perform the<br>
same encryption and decryption operations as the original AES keys, but they only work on the current<br>
system and only until they are revoked. If software revokes Key Locker handles (e.g., on a reboot),<br>
then any previous handles can no longer be used.<br>
<br>
Reviewed By: craig.topper<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D88398" rel="noreferrer" target="_blank">https://reviews.llvm.org/D88398</a><br>
<br>
Added: <br>
    clang/lib/Headers/keylocker_wide_intrin.h<br>
    clang/lib/Headers/keylockerintrin.h<br>
    clang/test/CodeGen/X86/keylocker.c<br>
    llvm/lib/Target/X86/X86InstrInfo.td.rej<br>
    llvm/lib/Target/X86/X86InstrKL.td<br>
    llvm/test/CodeGen/X86/keylocker-intrinsics.ll<br>
    llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-32-att.txt<br>
    llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-32-intel.txt<br>
    llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-64-att.txt<br>
    llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-64-intel.txt<br>
    llvm/test/MC/X86/KEYLOCKER/keylocker-att.s<br>
    llvm/test/MC/X86/KEYLOCKER/keylocker-intel.s<br>
    llvm/test/MC/X86/KEYLOCKER/x86-64-keylocker-att.s<br>
    llvm/test/MC/X86/KEYLOCKER/x86-64-keylocker-intel.s<br>
<br>
Modified: <br>
    clang/include/clang/Basic/BuiltinsX86.def<br>
    clang/include/clang/Driver/Options.td<br>
    clang/lib/Basic/Targets/X86.cpp<br>
    clang/lib/Basic/Targets/X86.h<br>
    clang/lib/CodeGen/CGBuiltin.cpp<br>
    clang/lib/Headers/CMakeLists.txt<br>
    clang/lib/Headers/immintrin.h<br>
    clang/test/CodeGen/attr-target-x86.c<br>
    clang/test/Driver/x86-target-features.c<br>
    clang/test/Preprocessor/x86_target_features.c<br>
    llvm/include/llvm/IR/IntrinsicsX86.td<br>
    llvm/include/llvm/Support/X86TargetParser.def<br>
    llvm/lib/IR/Function.cpp<br>
    llvm/lib/Support/Host.cpp<br>
    llvm/lib/Support/X86TargetParser.cpp<br>
    llvm/lib/Target/X86/X86.td<br>
    llvm/lib/Target/X86/X86ISelLowering.cpp<br>
    llvm/lib/Target/X86/X86InstrInfo.td<br>
    llvm/lib/Target/X86/X86Subtarget.h<br>
    llvm/utils/TableGen/IntrinsicEmitter.cpp<br>
<br>
Removed: <br>
<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang/include/clang/Basic/BuiltinsX86.def b/clang/include/clang/Basic/BuiltinsX86.def<br>
index 35fb98352ec2..e212d0a2a0cc 100644<br>
--- a/clang/include/clang/Basic/BuiltinsX86.def<br>
+++ b/clang/include/clang/Basic/BuiltinsX86.def<br>
@@ -1900,6 +1900,25 @@ TARGET_BUILTIN(__builtin_ia32_invpcid, "vUiv*", "nc", "invpcid")<br>
 TARGET_BUILTIN(__builtin_ia32_enqcmd, "Ucv*vC*", "n", "enqcmd")<br>
 TARGET_BUILTIN(__builtin_ia32_enqcmds, "Ucv*vC*", "n", "enqcmd")<br>
<br>
+// KEY LOCKER<br>
+TARGET_BUILTIN(__builtin_ia32_loadiwkey, "vUiV2OiV2OiV2Oi", "nV:128:", "kl")<br>
+TARGET_BUILTIN(__builtin_ia32_encodekey128,<br>
+               "UiUiV2OiV2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*", "nV:128:", "kl")<br>
+TARGET_BUILTIN(__builtin_ia32_encodekey256,<br>
+               "UiUiV2OiV2OiV2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*", "nV:128:", "kl")<br>
+TARGET_BUILTIN(__builtin_ia32_aesenc128kl, "UcV2Oi*V2OivC*", "nV:128:", "kl")<br>
+TARGET_BUILTIN(__builtin_ia32_aesenc256kl, "UcV2Oi*V2OivC*", "nV:128:", "kl")<br>
+TARGET_BUILTIN(__builtin_ia32_aesdec128kl, "UcV2Oi*V2OivC*", "nV:128:", "kl")<br>
+TARGET_BUILTIN(__builtin_ia32_aesdec256kl, "UcV2Oi*V2OivC*", "nV:128:", "kl")<br>
+TARGET_BUILTIN(__builtin_ia32_aesencwide128kl,<br>
+               "UcvC*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2OiV2OiV2OiV2OiV2OiV2OiV2OiV2Oi", "nV:128:", "kl,widekl")<br>
+TARGET_BUILTIN(__builtin_ia32_aesencwide256kl,<br>
+               "UcvC*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2OiV2OiV2OiV2OiV2OiV2OiV2OiV2Oi", "nV:128:", "kl,widekl")<br>
+TARGET_BUILTIN(__builtin_ia32_aesdecwide128kl,<br>
+               "UcvC*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2OiV2OiV2OiV2OiV2OiV2OiV2OiV2Oi", "nV:128:", "kl,widekl")<br>
+TARGET_BUILTIN(__builtin_ia32_aesdecwide256kl,<br>
+               "UcvC*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2Oi*V2OiV2OiV2OiV2OiV2OiV2OiV2OiV2Oi", "nV:128:", "kl,widekl")<br>
+<br>
 // SERIALIZE<br>
 TARGET_BUILTIN(__builtin_ia32_serialize, "v", "n", "serialize")<br>
<br>
<br>
diff  --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td<br>
index 09fdf50b1cb8..672a833c9d4d 100644<br>
--- a/clang/include/clang/Driver/Options.td<br>
+++ b/clang/include/clang/Driver/Options.td<br>
@@ -3253,6 +3253,10 @@ def minvpcid : Flag<["-"], "minvpcid">, Group<m_x86_Features_Group>;<br>
 def mno_invpcid : Flag<["-"], "mno-invpcid">, Group<m_x86_Features_Group>;<br>
 def mgfni : Flag<["-"], "mgfni">, Group<m_x86_Features_Group>;<br>
 def mno_gfni : Flag<["-"], "mno-gfni">, Group<m_x86_Features_Group>;<br>
+def mkl : Flag<["-"], "mkl">, Group<m_x86_Features_Group>;<br>
+def mno_kl : Flag<["-"], "mno-kl">, Group<m_x86_Features_Group>;<br>
+def mwidekl : Flag<["-"], "mwidekl">, Group<m_x86_Features_Group>;<br>
+def mno_widekl : Flag<["-"], "mno-widekl">, Group<m_x86_Features_Group>;<br>
 def mlwp : Flag<["-"], "mlwp">, Group<m_x86_Features_Group>;<br>
 def mno_lwp : Flag<["-"], "mno-lwp">, Group<m_x86_Features_Group>;<br>
 def mlzcnt : Flag<["-"], "mlzcnt">, Group<m_x86_Features_Group>;<br>
<br>
diff  --git a/clang/lib/Basic/Targets/X86.cpp b/clang/lib/Basic/Targets/X86.cpp<br>
index b829dfac74fb..5d89894c7628 100644<br>
--- a/clang/lib/Basic/Targets/X86.cpp<br>
+++ b/clang/lib/Basic/Targets/X86.cpp<br>
@@ -276,6 +276,10 @@ bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,<br>
       HasCLDEMOTE = true;<br>
     } else if (Feature == "+rdpid") {<br>
       HasRDPID = true;<br>
+    } else if (Feature == "+kl") {<br>
+      HasKL = true;<br>
+    } else if (Feature == "+widekl") {<br>
+      HasWIDEKL = true;<br>
     } else if (Feature == "+retpoline-external-thunk") {<br>
       HasRetpolineExternalThunk = true;<br>
     } else if (Feature == "+sahf") {<br>
@@ -678,6 +682,10 @@ void X86TargetInfo::getTargetDefines(const LangOptions &Opts,<br>
     Builder.defineMacro("__PREFETCHWT1__");<br>
   if (HasCLZERO)<br>
     Builder.defineMacro("__CLZERO__");<br>
+  if (HasKL)<br>
+    Builder.defineMacro("__KL__");<br>
+  if (HasWIDEKL)<br>
+    Builder.defineMacro("__WIDEKL__");<br>
   if (HasRDPID)<br>
     Builder.defineMacro("__RDPID__");<br>
   if (HasCLDEMOTE)<br>
@@ -833,6 +841,8 @@ bool X86TargetInfo::isValidFeatureName(StringRef Name) const {<br>
       .Case("fxsr", true)<br>
       .Case("gfni", true)<br>
       .Case("invpcid", true)<br>
+      .Case("kl", true)<br>
+      .Case("widekl", true)<br>
       .Case("lwp", true)<br>
       .Case("lzcnt", true)<br>
       .Case("mmx", true)<br>
@@ -919,6 +929,8 @@ bool X86TargetInfo::hasFeature(StringRef Feature) const {<br>
       .Case("fxsr", HasFXSR)<br>
       .Case("gfni", HasGFNI)<br>
       .Case("invpcid", HasINVPCID)<br>
+      .Case("kl", HasKL)<br>
+      .Case("widekl", HasWIDEKL)<br>
       .Case("lwp", HasLWP)<br>
       .Case("lzcnt", HasLZCNT)<br>
       .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)<br>
<br>
diff  --git a/clang/lib/Basic/Targets/X86.h b/clang/lib/Basic/Targets/X86.h<br>
index 25dc9458c25a..7b2b7dcf6460 100644<br>
--- a/clang/lib/Basic/Targets/X86.h<br>
+++ b/clang/lib/Basic/Targets/X86.h<br>
@@ -127,6 +127,8 @@ class LLVM_LIBRARY_VISIBILITY X86TargetInfo : public TargetInfo {<br>
   bool HasPTWRITE = false;<br>
   bool HasINVPCID = false;<br>
   bool HasENQCMD = false;<br>
+  bool HasKL = false;      // For key locker<br>
+  bool HasWIDEKL = false; // For wide key locker<br>
   bool HasAMXTILE = false;<br>
   bool HasAMXINT8 = false;<br>
   bool HasAMXBF16 = false;<br>
<br>
diff  --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp<br>
index 57804494d9a5..bb1c1d1aef33 100644<br>
--- a/clang/lib/CodeGen/CGBuiltin.cpp<br>
+++ b/clang/lib/CodeGen/CGBuiltin.cpp<br>
@@ -14037,6 +14037,93 @@ Value *CodeGenFunction::EmitX86BuiltinExpr(unsigned BuiltinID,<br>
   case X86::BI__builtin_ia32_psubusb128:<br>
   case X86::BI__builtin_ia32_psubusw128:<br>
     return EmitX86BinaryIntrinsic(*this, Ops, Intrinsic::usub_sat);<br>
+  case X86::BI__builtin_ia32_encodekey128:<br>
+  case X86::BI__builtin_ia32_encodekey256:<br>
+  case X86::BI__builtin_ia32_aesenc128kl:<br>
+  case X86::BI__builtin_ia32_aesdec128kl:<br>
+  case X86::BI__builtin_ia32_aesenc256kl:<br>
+  case X86::BI__builtin_ia32_aesdec256kl:<br>
+  case X86::BI__builtin_ia32_aesencwide128kl:<br>
+  case X86::BI__builtin_ia32_aesdecwide128kl:<br>
+  case X86::BI__builtin_ia32_aesencwide256kl:<br>
+  case X86::BI__builtin_ia32_aesdecwide256kl: {<br>
+    int FirstReturnOp;<br>
+    int ResultCount;<br>
+    SmallVector<Value*, 9> InOps;<br>
+    unsigned ID;<br>
+<br>
+    switch (BuiltinID) {<br>
+    default: llvm_unreachable("Unsupported intrinsic!");<br>
+    case X86::BI__builtin_ia32_encodekey128:<br>
+      ID = Intrinsic::x86_encodekey128;<br>
+      InOps = {Ops[0], Ops[1]};<br>
+      FirstReturnOp = 2;<br>
+      ResultCount = 6;<br>
+      break;<br>
+    case X86::BI__builtin_ia32_encodekey256:<br>
+      ID = Intrinsic::x86_encodekey256;<br>
+      InOps = {Ops[0], Ops[1], Ops[2]};<br>
+      FirstReturnOp = 3;<br>
+      ResultCount = 7;<br>
+      break;<br>
+    case X86::BI__builtin_ia32_aesenc128kl:<br>
+    case X86::BI__builtin_ia32_aesdec128kl:<br>
+    case X86::BI__builtin_ia32_aesenc256kl:<br>
+    case X86::BI__builtin_ia32_aesdec256kl: {<br>
+      InOps = {Ops[1], Ops[2]};<br>
+      FirstReturnOp = 0;<br>
+      ResultCount = 1;<br>
+      switch (BuiltinID) {<br>
+      case X86::BI__builtin_ia32_aesenc128kl:<br>
+        ID = Intrinsic::x86_aesenc128kl;<br>
+        break;<br>
+      case X86::BI__builtin_ia32_aesdec128kl:<br>
+        ID = Intrinsic::x86_aesdec128kl;<br>
+        break;<br>
+      case X86::BI__builtin_ia32_aesenc256kl:<br>
+        ID = Intrinsic::x86_aesenc256kl;<br>
+        break;<br>
+      case X86::BI__builtin_ia32_aesdec256kl:<br>
+        ID = Intrinsic::x86_aesdec256kl;<br>
+        break;<br>
+      }<br>
+      break;<br>
+    }<br>
+    case X86::BI__builtin_ia32_aesencwide128kl:<br>
+    case X86::BI__builtin_ia32_aesdecwide128kl:<br>
+    case X86::BI__builtin_ia32_aesencwide256kl:<br>
+    case X86::BI__builtin_ia32_aesdecwide256kl: {<br>
+      InOps = {Ops[0], Ops[9], Ops[10], Ops[11], Ops[12], Ops[13],<br>
+               Ops[14], Ops[15], Ops[16]};<br>
+      FirstReturnOp = 1;<br>
+      ResultCount = 8;<br>
+      switch (BuiltinID) {<br>
+      case X86::BI__builtin_ia32_aesencwide128kl:<br>
+        ID = Intrinsic::x86_aesencwide128kl;<br>
+        break;<br>
+      case X86::BI__builtin_ia32_aesdecwide128kl:<br>
+        ID = Intrinsic::x86_aesdecwide128kl;<br>
+        break;<br>
+      case X86::BI__builtin_ia32_aesencwide256kl:<br>
+        ID = Intrinsic::x86_aesencwide256kl;<br>
+        break;<br>
+      case X86::BI__builtin_ia32_aesdecwide256kl:<br>
+        ID = Intrinsic::x86_aesdecwide256kl;<br>
+        break;<br>
+      }<br>
+      break;<br>
+    }<br>
+    }<br>
+<br>
+    Value *Call = Builder.CreateCall(CGM.getIntrinsic(ID), InOps);<br>
+<br>
+    for (int i = 0; i < ResultCount; ++i) {<br>
+      Builder.CreateDefaultAlignedStore(Builder.CreateExtractValue(Call, i + 1),<br>
+                                        Ops[FirstReturnOp + i]);<br>
+    }<br>
+<br>
+    return Builder.CreateExtractValue(Call, 0);<br>
+  }<br>
   }<br>
 }<br>
<br>
<br>
diff  --git a/clang/lib/Headers/CMakeLists.txt b/clang/lib/Headers/CMakeLists.txt<br>
index a9761f049067..8c12d5ab935d 100644<br>
--- a/clang/lib/Headers/CMakeLists.txt<br>
+++ b/clang/lib/Headers/CMakeLists.txt<br>
@@ -72,6 +72,8 @@ set(files<br>
   inttypes.h<br>
   invpcidintrin.h<br>
   iso646.h<br>
+  keylockerintrin.h<br>
+  keylocker_wide_intrin.h<br>
   limits.h<br>
   lwpintrin.h<br>
   lzcntintrin.h<br>
<br>
diff  --git a/clang/lib/Headers/immintrin.h b/clang/lib/Headers/immintrin.h<br>
index e9dff2310fdf..1beade1be248 100644<br>
--- a/clang/lib/Headers/immintrin.h<br>
+++ b/clang/lib/Headers/immintrin.h<br>
@@ -471,6 +471,16 @@ _storebe_i64(void * __P, long long __D) {<br>
 #include <invpcidintrin.h><br>
 #endif<br>
<br>
+#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \<br>
+    defined(__KL__)<br>
+#include <keylockerintrin.h><br>
+#endif<br>
+<br>
+#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \<br>
+    defined(__WIDEKL__)<br>
+#include <keylocker_wide_intrin.h><br>
+#endif<br>
+<br>
 #if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \<br>
     defined(__AMXTILE__) || defined(__AMXINT8__) || defined(__AMXBF16__)<br>
 #include <amxintrin.h><br>
<br>
diff  --git a/clang/lib/Headers/keylocker_wide_intrin.h b/clang/lib/Headers/keylocker_wide_intrin.h<br>
new file mode 100644<br>
index 000000000000..9b6c9ccab811<br>
--- /dev/null<br>
+++ b/clang/lib/Headers/keylocker_wide_intrin.h<br>
@@ -0,0 +1,259 @@<br>
+/*===-------------- keylocker_wide_intrin.h - KL_WIDE Intrinsics ------------===<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a copy<br>
+ * of this software and associated documentation files (the "Software"), to deal<br>
+ * in the Software without restriction, including without limitation the rights<br>
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br>
+ * copies of the Software, and to permit persons to whom the Software is<br>
+ * furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice shall be included in<br>
+ * all copies or substantial portions of the Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br>
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br>
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br>
+ * THE SOFTWARE.<br>
+ *<br>
+ *===-----------------------------------------------------------------------===<br>
+ */<br>
+<br>
+#ifndef __IMMINTRIN_H<br>
+#error "Never use <keylocker_wide_intrin.h> directly; include <immintrin.h> instead."<br>
+#endif<br>
+<br>
+#ifndef _KEYLOCKERINTRIN_WIDE_H<br>
+#define _KEYLOCKERINTRIN_WIDE_H<br>
+<br>
+/* Define the default attributes for the functions in this file. */<br>
+#define __DEFAULT_FN_ATTRS \<br>
+  __attribute__((__always_inline__, __nodebug__, __target__("kl,widekl"),\<br>
+                 __min_vector_width__(128)))<br>
+<br>
+/// Encrypt __idata[0] to __idata[7] using 128-bit AES key indicated by handle<br>
+/// at __h and store each resultant block back from __odata to __odata+7. And<br>
+/// return the affected ZF flag status.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> AESENCWIDE128KL </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// Handle := MEM[__h+383:__h]<br>
+/// IllegalHandle := ( HandleReservedBitSet (Handle[383:0]) ||<br>
+///                    (Handle[127:0] AND (CPL > 0)) ||<br>
+///                    Handle[255:128] ||<br>
+///                    HandleKeyType (Handle[383:0]) != HANDLE_KEY_TYPE_AES128 )<br>
+/// IF (IllegalHandle)<br>
+///   ZF := 1<br>
+/// ELSE<br>
+///   (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)<br>
+///   IF Authentic == 0<br>
+///     ZF := 1<br>
+///   ELSE<br>
+///     FOR i := 0 to 7<br>
+///       __odata[i] := AES128Encrypt (__idata[i], UnwrappedKey)<br>
+///     ENDFOR<br>
+///     ZF := 0<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
+_mm_aesencwide128kl_u8(__m128i __odata[8], const __m128i __idata[8], const void* __h) {<br>
+  return __builtin_ia32_aesencwide128kl(__h,<br>
+                                        __odata,<br>
+                                        __odata + 1,<br>
+                                        __odata + 2,<br>
+                                        __odata + 3,<br>
+                                        __odata + 4,<br>
+                                        __odata + 5,<br>
+                                        __odata + 6,<br>
+                                        __odata + 7,<br>
+                                        __idata[0],<br>
+                                        __idata[1],<br>
+                                        __idata[2],<br>
+                                        __idata[3],<br>
+                                        __idata[4],<br>
+                                        __idata[5],<br>
+                                        __idata[6],<br>
+                                        __idata[7]);<br>
+}<br>
+<br>
+/// Encrypt __idata[0] to __idata[7] using 256-bit AES key indicated by handle<br>
+/// at __h and store each resultant block back from __odata to __odata+7. And<br>
+/// return the affected ZF flag status.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> AESENCWIDE256KL </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// Handle[511:0] := MEM[__h+511:__h]<br>
+/// IllegalHandle := ( HandleReservedBitSet (Handle[511:0]) ||<br>
+///                    (Handle[127:0] AND (CPL > 0)) ||<br>
+///                    Handle[255:128] ||<br>
+///                    HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES512 )<br>
+/// IF (IllegalHandle)<br>
+///   ZF := 1<br>
+/// ELSE<br>
+///   (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)<br>
+///   IF Authentic == 0<br>
+///     ZF := 1<br>
+///   ELSE<br>
+///     FOR i := 0 to 7<br>
+///       __odata[i] := AES256Encrypt (__idata[i], UnwrappedKey)<br>
+///     ENDFOR<br>
+///     ZF := 0<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
+_mm_aesencwide256kl_u8(__m128i __odata[8], const __m128i __idata[8], const void* __h) {<br>
+  return __builtin_ia32_aesencwide256kl(__h,<br>
+                                        __odata,<br>
+                                        __odata + 1,<br>
+                                        __odata + 2,<br>
+                                        __odata + 3,<br>
+                                        __odata + 4,<br>
+                                        __odata + 5,<br>
+                                        __odata + 6,<br>
+                                        __odata + 7,<br>
+                                        __idata[0],<br>
+                                        __idata[1],<br>
+                                        __idata[2],<br>
+                                        __idata[3],<br>
+                                        __idata[4],<br>
+                                        __idata[5],<br>
+                                        __idata[6],<br>
+                                        __idata[7]);<br>
+}<br>
+<br>
+/// Decrypt __idata[0] to __idata[7] using 128-bit AES key indicated by handle<br>
+/// at __h and store each resultant block back from __odata to __odata+7. And<br>
+/// return the affected ZF flag status.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> AESDECWIDE128KL </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// Handle[383:0] := MEM[__h+383:__h]<br>
+/// IllegalHandle := ( HandleReservedBitSet (Handle[383:0]) ||<br>
+///                    (Handle[127:0] AND (CPL > 0)) ||<br>
+///                    Handle[255:128] ||<br>
+///                    HandleKeyType (Handle) != HANDLE_KEY_TYPE_AES128 )<br>
+/// IF (IllegalHandle)<br>
+///   ZF := 1<br>
+/// ELSE<br>
+///   (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)<br>
+///   IF Authentic == 0<br>
+///     ZF := 1<br>
+///   ELSE<br>
+///     FOR i := 0 to 7<br>
+///       __odata[i] := AES128Decrypt (__idata[i], UnwrappedKey)<br>
+///     ENDFOR<br>
+///     ZF := 0<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
+_mm_aesdecwide128kl_u8(__m128i __odata[8], const __m128i __idata[8], const void* __h) {<br>
+  return __builtin_ia32_aesdecwide128kl(__h,<br>
+                                        __odata,<br>
+                                        __odata + 1,<br>
+                                        __odata + 2,<br>
+                                        __odata + 3,<br>
+                                        __odata + 4,<br>
+                                        __odata + 5,<br>
+                                        __odata + 6,<br>
+                                        __odata + 7,<br>
+                                        __idata[0],<br>
+                                        __idata[1],<br>
+                                        __idata[2],<br>
+                                        __idata[3],<br>
+                                        __idata[4],<br>
+                                        __idata[5],<br>
+                                        __idata[6],<br>
+                                        __idata[7]);<br>
+}<br>
+<br>
+/// Decrypt __idata[0] to __idata[7] using 256-bit AES key indicated by handle<br>
+/// at __h and store each resultant block back from __odata to __odata+7. And<br>
+/// return the affected ZF flag status.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> AESDECWIDE256KL </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// Handle[511:0] := MEM[__h+511:__h]<br>
+/// IllegalHandle = ( HandleReservedBitSet (Handle[511:0]) ||<br>
+///                   (Handle[127:0] AND (CPL > 0)) ||<br>
+///                   Handle[255:128] ||<br>
+///                   HandleKeyType (Handle) != HANDLE_KEY_TYPE_AES512 )<br>
+/// If (IllegalHandle)<br>
+///   ZF := 1<br>
+/// ELSE<br>
+///   (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)<br>
+///   IF Authentic == 0<br>
+///     ZF := 1<br>
+///   ELSE<br>
+///     FOR i := 0 to 7<br>
+///       __odata[i] := AES256Decrypt (__idata[i], UnwrappedKey)<br>
+///     ENDFOR<br>
+///     ZF := 0<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
+_mm_aesdecwide256kl_u8(__m128i __odata[8], const __m128i __idata[8], const void* __h) {<br>
+  return __builtin_ia32_aesdecwide256kl(__h,<br>
+                                        __odata,<br>
+                                        __odata + 1,<br>
+                                        __odata + 2,<br>
+                                        __odata + 3,<br>
+                                        __odata + 4,<br>
+                                        __odata + 5,<br>
+                                        __odata + 6,<br>
+                                        __odata + 7,<br>
+                                        __idata[0],<br>
+                                        __idata[1],<br>
+                                        __idata[2],<br>
+                                        __idata[3],<br>
+                                        __idata[4],<br>
+                                        __idata[5],<br>
+                                        __idata[6],<br>
+                                        __idata[7]);<br>
+}<br>
+<br>
+<br>
+#undef __DEFAULT_FN_ATTRS<br>
+<br>
+#endif /* _KEYLOCKERINTRIN_WIDE_H */<br>
<br>
diff  --git a/clang/lib/Headers/keylockerintrin.h b/clang/lib/Headers/keylockerintrin.h<br>
new file mode 100644<br>
index 000000000000..5bd4fe59c6be<br>
--- /dev/null<br>
+++ b/clang/lib/Headers/keylockerintrin.h<br>
@@ -0,0 +1,343 @@<br>
+/*===----------------- keylockerintrin.h - KL Intrinsics -------------------===<br>
+ *<br>
+ * Permission is hereby granted, free of charge, to any person obtaining a copy<br>
+ * of this software and associated documentation files (the "Software"), to deal<br>
+ * in the Software without restriction, including without limitation the rights<br>
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell<br>
+ * copies of the Software, and to permit persons to whom the Software is<br>
+ * furnished to do so, subject to the following conditions:<br>
+ *<br>
+ * The above copyright notice and this permission notice shall be included in<br>
+ * all copies or substantial portions of the Software.<br>
+ *<br>
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR<br>
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,<br>
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE<br>
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER<br>
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,<br>
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN<br>
+ * THE SOFTWARE.<br>
+ *<br>
+ *===-----------------------------------------------------------------------===<br>
+ */<br>
+<br>
+#ifndef __IMMINTRIN_H<br>
+#error "Never use <keylockerintrin.h> directly; include <immintrin.h> instead."<br>
+#endif<br>
+<br>
+#ifndef _KEYLOCKERINTRIN_H<br>
+#define _KEYLOCKERINTRIN_H<br>
+<br>
+/* Define the default attributes for the functions in this file. */<br>
+#define __DEFAULT_FN_ATTRS \<br>
+  __attribute__((__always_inline__, __nodebug__, __target__("kl"),\<br>
+                 __min_vector_width__(128)))<br>
+<br>
+/// Load internal wrapping key from __intkey, __enkey_lo and __enkey_hi. __ctl<br>
+/// will assigned to EAX, whch specifies the KeySource and whether backing up<br>
+/// the key is permitted. The 256-bit encryption key is loaded from the two<br>
+/// explicit operands (__enkey_lo and __enkey_hi). The 128-bit integrity key is<br>
+/// loaded from the implicit operand XMM0 which assigned by __intkey.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> LOADIWKEY </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// IF CPL > 0 // LOADKWKEY only allowed at ring 0 (supervisor mode)<br>
+///   GP (0)<br>
+/// FI<br>
+/// IF “LOADIWKEY exiting” VM execution control set<br>
+///   VMexit<br>
+/// FI<br>
+/// IF __ctl[4:1] > 1 // Reserved KeySource encoding used<br>
+///   GP (0)<br>
+/// FI<br>
+/// IF __ctl[31:5] != 0 // Reserved bit in __ctl is set<br>
+///   GP (0)<br>
+/// FI<br>
+/// IF __ctl[0] AND (CPUID.19H.ECX[0] == 0) // NoBackup is not supported on this part<br>
+///   GP (0)<br>
+/// FI<br>
+/// IF (__ctl[4:1] == 1) AND (CPUID.19H.ECX[1] == 0) // KeySource of 1 is not supported on this part<br>
+///   GP (0)<br>
+/// FI<br>
+/// IF (__ctl[4:1] == 0) // KeySource of 0.<br>
+///   IWKey.Encryption Key[127:0] := __enkey_hi[127:0]:<br>
+///   IWKey.Encryption Key[255:128] := __enkey_lo[127:0]<br>
+///   IWKey.IntegrityKey[127:0] := __intkey[127:0]<br>
+///   IWKey.NoBackup := __ctl[0]<br>
+///   IWKey.KeySource := __ctl[4:1]<br>
+///   ZF := 0<br>
+/// ELSE // KeySource of 1. See RDSEED definition for details of randomness<br>
+///   IF HW_NRND_GEN.ready == 1 // Full-entropy random data from RDSEED was received<br>
+///     IWKey.Encryption Key[127:0] := __enkey_hi[127:0] XOR HW_NRND_GEN.data[127:0]<br>
+///     IWKey.Encryption Key[255:128] := __enkey_lo[127:0] XOR HW_NRND_GEN.data[255:128]<br>
+///     IWKey.Encryption Key[255:0] := __enkey_hi[127:0]:__enkey_lo[127:0] XOR HW_NRND_GEN.data[255:0]<br>
+///     IWKey.IntegrityKey[127:0] := __intkey[127:0] XOR HW_NRND_GEN.data[383:256]<br>
+///     IWKey.NoBackup := __ctl[0]<br>
+///     IWKey.KeySource := __ctl[4:1]<br>
+///     ZF := 0<br>
+///   ELSE // Random data was not returned from RDSEED. IWKey was not loaded<br>
+///     ZF := 1<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ void __DEFAULT_FN_ATTRS<br>
+_mm_loadiwkey (unsigned int __ctl, __m128i __intkey,<br>
+               __m128i __enkey_lo, __m128i __enkey_hi) {<br>
+  __builtin_ia32_loadiwkey (__ctl, __intkey, __enkey_lo, __enkey_hi);<br>
+}<br>
+<br>
+/// Wrap a 128-bit AES key from __key into a key handle and output in<br>
+/// ((__m128i*)__h) to ((__m128i*)__h) + 5  and a 32-bit value as return.<br>
+/// The explicit source operand __htype specifies handle restrictions.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> ENCODEKEY128 </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// InputKey[127:0] := __key[127:0]<br>
+/// KeyMetadata[2:0] := __htype[2:0]<br>
+/// KeyMetadata[23:3] := 0 // Reserved for future usage<br>
+/// KeyMetadata[27:24] := 0 // KeyType is AES-128 (value of 0)<br>
+/// KeyMetadata[127:28] := 0 // Reserved for future usage<br>
+/// Handle[383:0] := WrapKey128(InputKey[127:0], KeyMetadata[127:0],<br>
+///                  IWKey.Integrity Key[127:0], IWKey.Encryption Key[255:0])<br>
+/// dst[0] := IWKey.NoBackup<br>
+/// dst[4:1] := IWKey.KeySource[3:0]<br>
+/// dst[31:5] := 0<br>
+/// MEM[__h+127:__h] := Handle[127:0]   // AAD<br>
+/// MEM[__h+255:__h+128] := Handle[255:128] // Integrity Tag<br>
+/// MEM[__h+383:__h+256] := Handle[383:256] // CipherText<br>
+/// MEM[__h+511:__h+384] := 0 // Reserved for future usage<br>
+/// MEM[__h+639:__h+512] := 0 // Reserved for future usage<br>
+/// MEM[__h+767:__h+640] := 0 // Reserved for future usage<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// ZF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned int __DEFAULT_FN_ATTRS<br>
+_mm_encodekey128_u32(unsigned int __htype, __m128i __key, void *__h) {<br>
+  __m128i *__results = (__m128i*)__h;<br>
+<br>
+  return __builtin_ia32_encodekey128(__htype, __key,<br>
+                                     __results,<br>
+                                     __results + 1,<br>
+                                     __results + 2,<br>
+                                     __results + 3,<br>
+                                     __results + 4,<br>
+                                     __results + 5);<br>
+}<br>
+<br>
+/// Wrap a 256-bit AES key from __key_hi:__key_lo into a key handle, then<br>
+/// output handle in ((__m128i*)__h) to ((__m128i*)__h) + 6 and<br>
+/// a 32-bit value as return.<br>
+/// The explicit source operand __htype specifies handle restrictions.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> ENCODEKEY256 </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// InputKey[127:0] := __key_lo[127:0]<br>
+/// InputKey[255:128] := __key_hi[255:128]<br>
+/// KeyMetadata[2:0] := __htype[2:0]<br>
+/// KeyMetadata[23:3] := 0 // Reserved for future usage<br>
+/// KeyMetadata[27:24] := 1 // KeyType is AES-256 (value of 1)<br>
+/// KeyMetadata[127:28] := 0 // Reserved for future usage<br>
+/// Handle[511:0] := WrapKey256(InputKey[255:0], KeyMetadata[127:0],<br>
+///                  IWKey.Integrity Key[127:0], IWKey.Encryption Key[255:0])<br>
+/// dst[0] := IWKey.NoBackup<br>
+/// dst[4:1] := IWKey.KeySource[3:0]<br>
+/// dst[31:5] := 0<br>
+/// MEM[__h+127:__h]   := Handle[127:0] // AAD<br>
+/// MEM[__h+255:__h+128] := Handle[255:128] // Tag<br>
+/// MEM[__h+383:__h+256] := Handle[383:256] // CipherText[127:0]<br>
+/// MEM[__h+511:__h+384] := Handle[511:384] // CipherText[255:128]<br>
+/// MEM[__h+639:__h+512] := 0 // Reserved for future usage<br>
+/// MEM[__h+767:__h+640] := 0 // Reserved for future usage<br>
+/// MEM[__h+895:__h+768] := 0 Integrity// Reserved for future usage<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// ZF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned int __DEFAULT_FN_ATTRS<br>
+_mm_encodekey256_u32(unsigned int __htype, __m128i __key_lo, __m128i __key_hi,<br>
+                     void *__h) {<br>
+  __m128i *__results = (__m128i*)__h;<br>
+<br>
+  return __builtin_ia32_encodekey256(__htype, __key_lo, __key_hi,<br>
+                                     __results,<br>
+                                     __results + 1,<br>
+                                     __results + 2,<br>
+                                     __results + 3,<br>
+                                     __results + 4,<br>
+                                     __results + 5,<br>
+                                     __results + 6);<br>
+}<br>
+<br>
+/// The AESENC128KL performs 10 rounds of AES to encrypt the __idata using<br>
+/// the 128-bit key in the handle from the __h. It stores the result in the<br>
+/// __odata. And return the affected ZF flag status.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> AESENC128KL </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// Handle[383:0] := MEM[__h+383:__h] // Load is not guaranteed to be atomic.<br>
+/// IllegalHandle := ( HandleReservedBitSet (Handle[383:0]) ||<br>
+///                    (Handle[127:0] AND (CPL > 0)) ||<br>
+///                    Handle[383:256] ||<br>
+///                    HandleKeyType (Handle[383:0]) != HANDLE_KEY_TYPE_AES128 )<br>
+/// IF (IllegalHandle)<br>
+///   ZF := 1<br>
+/// ELSE<br>
+///   (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)<br>
+///   IF (Authentic == 0)<br>
+///     ZF := 1<br>
+///   ELSE<br>
+///     MEM[__odata+127:__odata] := AES128Encrypt (__idata[127:0], UnwrappedKey)<br>
+///     ZF := 0<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
+_mm_aesenc128kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {<br>
+  return __builtin_ia32_aesenc128kl(__odata, __idata, __h);<br>
+}<br>
+<br>
+/// The AESENC256KL performs 14 rounds of AES to encrypt the __idata using<br>
+/// the 256-bit key in the handle from the __h. It stores the result in the<br>
+/// __odata. And return the affected ZF flag status.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> AESENC256KL </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// Handle[511:0] := MEM[__h+511:__h] // Load is not guaranteed to be atomic.<br>
+/// IllegalHandle := ( HandleReservedBitSet (Handle[511:0]) ||<br>
+///                    (Handle[127:0] AND (CPL > 0)) ||<br>
+///                    Handle[255:128] ||<br>
+///                    HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES256 )<br>
+/// IF (IllegalHandle)<br>
+///   ZF := 1<br>
+/// ELSE<br>
+///   (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)<br>
+///   IF (Authentic == 0)<br>
+///     ZF := 1<br>
+///   ELSE<br>
+///     MEM[__odata+127:__odata] := AES256Encrypt (__idata[127:0], UnwrappedKey)<br>
+///     ZF := 0<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
+_mm_aesenc256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {<br>
+  return __builtin_ia32_aesenc256kl(__odata, __idata, __h);<br>
+}<br>
+<br>
+/// The AESDEC128KL performs 10 rounds of AES to decrypt the __idata using<br>
+/// the 128-bit key in the handle from the __h. It stores the result in the<br>
+/// __odata. And return the affected ZF flag status.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> AESDEC128KL </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// Handle[383:0] := MEM[__h+383:__h] // Load is not guaranteed to be atomic.<br>
+/// IllegalHandle := (HandleReservedBitSet (Handle[383:0]) ||<br>
+///                  (Handle[127:0] AND (CPL > 0)) ||<br>
+///                  Handle[383:256] ||<br>
+///                  HandleKeyType (Handle[383:0]) != HANDLE_KEY_TYPE_AES128)<br>
+/// IF (IllegalHandle)<br>
+///   ZF := 1<br>
+/// ELSE<br>
+///   (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate384 (Handle[383:0], IWKey)<br>
+///   IF (Authentic == 0)<br>
+///     ZF := 1<br>
+///   ELSE<br>
+///     MEM[__odata+127:__odata] := AES128Decrypt (__idata[127:0], UnwrappedKey)<br>
+///     ZF := 0<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
+_mm_aesdec128kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {<br>
+  return __builtin_ia32_aesdec128kl(__odata, __idata, __h);<br>
+}<br>
+<br>
+/// The AESDEC256KL performs 10 rounds of AES to decrypt the __idata using<br>
+/// the 256-bit key in the handle from the __h. It stores the result in the<br>
+/// __odata. And return the affected ZF flag status.<br>
+///<br>
+/// \headerfile <x86intrin.h><br>
+///<br>
+/// This intrinsic corresponds to the <c> AESDEC256KL </c> instructions.<br>
+///<br>
+/// \operation<br>
+/// Handle[511:0] := MEM[__h+511:__h]<br>
+/// IllegalHandle := (HandleReservedBitSet (Handle[511:0]) ||<br>
+///                   (Handle[127:0] AND (CPL > 0)) ||<br>
+///                   Handle[383:256] ||<br>
+///                   HandleKeyType (Handle[511:0]) != HANDLE_KEY_TYPE_AES256)<br>
+/// IF (IllegalHandle)<br>
+///   ZF := 1<br>
+/// ELSE<br>
+///   (UnwrappedKey, Authentic) := UnwrapKeyAndAuthenticate512 (Handle[511:0], IWKey)<br>
+///   IF (Authentic == 0)<br>
+///     ZF := 1<br>
+///   ELSE<br>
+///     MEM[__odata+127:__odata] := AES256Decrypt (__idata[127:0], UnwrappedKey)<br>
+///     ZF := 0<br>
+///   FI<br>
+/// FI<br>
+/// dst := ZF<br>
+/// OF := 0<br>
+/// SF := 0<br>
+/// AF := 0<br>
+/// PF := 0<br>
+/// CF := 0<br>
+/// \endoperation<br>
+static __inline__ unsigned char __DEFAULT_FN_ATTRS<br>
+_mm_aesdec256kl_u8(__m128i* __odata, __m128i __idata, const void *__h) {<br>
+  return __builtin_ia32_aesdec256kl(__odata, __idata, __h);<br>
+}<br>
+<br>
+#undef __DEFAULT_FN_ATTRS<br>
+<br>
+#endif /* _KEYLOCKERINTRIN_H */<br>
<br>
diff  --git a/clang/test/CodeGen/X86/keylocker.c b/clang/test/CodeGen/X86/keylocker.c<br>
new file mode 100644<br>
index 000000000000..835bdd279ef1<br>
--- /dev/null<br>
+++ b/clang/test/CodeGen/X86/keylocker.c<br>
@@ -0,0 +1,72 @@<br>
+// RUN: %clang_cc1 %s -ffreestanding -triple=x86_64-unknown-unknown -target-feature +kl -target-feature +widekl -emit-llvm -o - -Wall -Werror | FileCheck %s<br>
+// RUN: %clang_cc1 %s -ffreestanding -triple=i386-unknown-unknown -target-feature +kl -target-feature +widekl -emit-llvm -o - -Wall -Werror | FileCheck %s<br>
+// RUN: %clang_cc1 %s -ffreestanding -triple=x86_64-unknown-unknown -target-feature +widekl -emit-llvm -o - -Wall -Werror | FileCheck %s<br>
+// RUN: %clang_cc1 %s -ffreestanding -triple=i386-unknown-unknown -target-feature +widekl -emit-llvm -o - -Wall -Werror | FileCheck %s<br>
+<br>
+#include <x86intrin.h><br>
+<br>
+void test_loadiwkey(unsigned int ctl, __m128i intkey, __m128i enkey_lo, __m128i enkey_hi) {<br>
+  //CHECK-LABEL: @test_loadiwkey<br>
+  //CHECK: @llvm.x86.loadiwkey<br>
+  _mm_loadiwkey(ctl, intkey, enkey_lo, enkey_hi);<br>
+}<br>
+<br>
+unsigned int test_encodekey128_u32(unsigned int htype, __m128i key, void *h) {<br>
+  //CHECK-LABEL: @test_encodekey128_u32<br>
+  //CHECK: call { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 %{{.*}}, <2 x i64> %{{.*}})<br>
+  return _mm_encodekey128_u32(htype, key, h);<br>
+}<br>
+<br>
+unsigned int test_encodekey256_u32(unsigned int htype, __m128i key_lo, __m128i key_hi, void *h) {<br>
+  //CHECK-LABEL: @test_encodekey256_u32<br>
+  //CHECK: call { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey256(i32 %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})<br>
+  return _mm_encodekey256_u32(htype, key_lo, key_hi, h);<br>
+}<br>
+<br>
+unsigned char test_mm_aesenc256kl_u8(__m128i *odata, __m128i idata, const void *h) {<br>
+  //CHECK-LABEL: @test_mm_aesenc256kl_u8<br>
+  //CHECK: call { i8, <2 x i64> } @llvm.x86.aesenc256kl(<2 x i64> %{{.*}}, i8* %{{.*}})<br>
+  return _mm_aesenc256kl_u8(odata, idata, h);<br>
+}<br>
+<br>
+unsigned char test_mm_aesdec256kl_u8(__m128i *odata, __m128i idata, const void *h) {<br>
+  //CHECK-LABEL: @test_mm_aesdec256kl_u8<br>
+  //CHECK: call { i8, <2 x i64> } @llvm.x86.aesdec256kl(<2 x i64> %{{.*}}, i8* %{{.*}})<br>
+  return _mm_aesdec256kl_u8(odata, idata, h);<br>
+}<br>
+<br>
+unsigned char test_mm_aesenc128kl_u8(__m128i *odata, __m128i idata, const void *h) {<br>
+  //CHECK-LABEL: @test_mm_aesenc128kl_u8<br>
+  //CHECK: call { i8, <2 x i64> } @llvm.x86.aesenc128kl(<2 x i64> %{{.*}}, i8* %{{.*}})<br>
+  return _mm_aesenc128kl_u8(odata, idata, h);<br>
+}<br>
+<br>
+unsigned char test_mm_aesdec128kl_u8(__m128i *odata, __m128i idata, const void *h) {<br>
+  //CHECK-LABEL: @test_mm_aesdec128kl_u8<br>
+  //CHECK: call { i8, <2 x i64> } @llvm.x86.aesdec128kl(<2 x i64> %{{.*}}, i8* %{{.*}})<br>
+  return _mm_aesdec128kl_u8(odata, idata, h);<br>
+}<br>
+<br>
+unsigned char test__mm_aesencwide128kl_u8(__m128i odata[8], const __m128i idata[8], const void* h) {<br>
+  //CHECK-LABEL: @test__mm_aesencwide128kl<br>
+  //CHECK: call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesencwide128kl(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}},      <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})<br>
+  return _mm_aesencwide128kl_u8(odata, idata, h);<br>
+}<br>
+<br>
+unsigned char test__mm_aesdecwide128kl_u8(__m128i odata[8], const __m128i idata[8], const void* h) {<br>
+  //CHECK-LABEL: @test__mm_aesdecwide128kl<br>
+  //CHECK: call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesdecwide128kl(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}},      <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})<br>
+  return _mm_aesdecwide128kl_u8(odata, idata, h);<br>
+}<br>
+<br>
+unsigned char test__mm_aesencwide256kl_u8(__m128i odata[8], const __m128i idata[8], const void* h) {<br>
+  //CHECK-LABEL: @test__mm_aesencwide256kl<br>
+  //CHECK: call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesencwide256kl(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}},      <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})<br>
+  return _mm_aesencwide256kl_u8(odata, idata, h);<br>
+}<br>
+<br>
+unsigned char test__mm_aesdecwide256kl_u8(__m128i odata[8], const __m128i idata[8], const void* h) {<br>
+  //CHECK-LABEL: @test__mm_aesdecwide256kl<br>
+  //CHECK: call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesdecwide256kl(i8* %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}},      <2 x i64> %{{.*}}, <2 x i64> %{{.*}}, <2 x i64> %{{.*}})<br>
+  return _mm_aesdecwide256kl_u8(odata, idata, h);<br>
+}<br>
<br>
diff  --git a/clang/test/CodeGen/attr-target-x86.c b/clang/test/CodeGen/attr-target-x86.c<br>
index 304e5b78d346..738b65b11131 100644<br>
--- a/clang/test/CodeGen/attr-target-x86.c<br>
+++ b/clang/test/CodeGen/attr-target-x86.c<br>
@@ -50,7 +50,7 @@ int __attribute__((target("tune=sandybridge"))) walrus(int a) { return 4; }<br>
 // CHECK: #0 = {{.*}}"target-cpu"="i686" "target-features"="+cx8,+x87" "tune-cpu"="i686"<br>
 // CHECK: #1 = {{.*}}"target-cpu"="ivybridge" "target-features"="+avx,+cx16,+cx8,+f16c,+fsgsbase,+fxsr,+mmx,+pclmul,+popcnt,+rdrnd,+sahf,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave,+xsaveopt"<br>
 // CHECK-NOT: tune-cpu<br>
-// CHECK: #2 = {{.*}}"target-cpu"="i686" "target-features"="+cx8,+x87,-aes,-avx,-avx2,-avx512bf16,-avx512bitalg,-avx512bw,-avx512cd,-avx512dq,-avx512er,-avx512f,-avx512ifma,-avx512pf,-avx512vbmi,-avx512vbmi2,-avx512vl,-avx512vnni,-avx512vp2intersect,-avx512vpopcntdq,-f16c,-fma,-fma4,-gfni,-pclmul,-sha,-sse2,-sse3,-sse4.1,-sse4.2,-sse4a,-ssse3,-vaes,-vpclmulqdq,-xop" "tune-cpu"="i686"<br>
+// CHECK: #2 = {{.*}}"target-cpu"="i686" "target-features"="+cx8,+x87,-aes,-avx,-avx2,-avx512bf16,-avx512bitalg,-avx512bw,-avx512cd,-avx512dq,-avx512er,-avx512f,-avx512ifma,-avx512pf,-avx512vbmi,-avx512vbmi2,-avx512vl,-avx512vnni,-avx512vp2intersect,-avx512vpopcntdq,-f16c,-fma,-fma4,-gfni,-kl,-pclmul,-sha,-sse2,-sse3,-sse4.1,-sse4.2,-sse4a,-ssse3,-vaes,-vpclmulqdq,-widekl,-xop" "tune-cpu"="i686"<br>
 // CHECK: #3 = {{.*}}"target-cpu"="i686" "target-features"="+cx8,+mmx,+popcnt,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87" "tune-cpu"="i686"<br>
 // CHECK: #4 = {{.*}}"target-cpu"="i686" "target-features"="+cx8,+x87,-avx,-avx2,-avx512bf16,-avx512bitalg,-avx512bw,-avx512cd,-avx512dq,-avx512er,-avx512f,-avx512ifma,-avx512pf,-avx512vbmi,-avx512vbmi2,-avx512vl,-avx512vnni,-avx512vp2intersect,-avx512vpopcntdq,-f16c,-fma,-fma4,-sse4.1,-sse4.2,-vaes,-vpclmulqdq,-xop" "tune-cpu"="i686"<br>
 // CHECK: #5 = {{.*}}"target-cpu"="ivybridge" "target-features"="+avx,+cx16,+cx8,+f16c,+fsgsbase,+fxsr,+mmx,+pclmul,+popcnt,+rdrnd,+sahf,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave,+xsaveopt,-aes,-vaes"<br>
<br>
diff  --git a/clang/test/Driver/x86-target-features.c b/clang/test/Driver/x86-target-features.c<br>
index 85a9374ab905..9de728c19c7c 100644<br>
--- a/clang/test/Driver/x86-target-features.c<br>
+++ b/clang/test/Driver/x86-target-features.c<br>
@@ -254,6 +254,16 @@<br>
 // TSXLDTRK: "-target-feature" "+tsxldtrk"<br>
 // NO-TSXLDTRK: "-target-feature" "-tsxldtrk"<br>
<br>
+// RUN: %clang -target i386-linux-gnu -mkl %s -### -o %t.o 2>&1 | FileCheck -check-prefix=KL %s<br>
+// RUN: %clang -target i386-linux-gnu -mno-kl %s -### -o %t.o 2>&1 | FileCheck -check-prefix=NO-KL %s<br>
+// KL: "-target-feature" "+kl"<br>
+// NO-KL: "-target-feature" "-kl"<br>
+<br>
+// RUN: %clang -target i386-linux-gnu -mwidekl %s -### -o %t.o 2>&1 | FileCheck -check-prefix=WIDE_KL %s<br>
+// RUN: %clang -target i386-linux-gnu -mno-widekl %s -### -o %t.o 2>&1 | FileCheck -check-prefix=NO-WIDE_KL %s<br>
+// WIDE_KL: "-target-feature" "+widekl"<br>
+// NO-WIDE_KL: "-target-feature" "-widekl"<br>
+<br>
 // RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mamx-tile %s -### -o %t.o 2>&1 | FileCheck --check-prefix=AMX-TILE %s<br>
 // RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mno-amx-tile %s -### -o %t.o 2>&1 | FileCheck --check-prefix=NO-AMX-TILE %s<br>
 // AMX-TILE: "-target-feature" "+amx-tile"<br>
<br>
diff  --git a/clang/test/Preprocessor/x86_target_features.c b/clang/test/Preprocessor/x86_target_features.c<br>
index 4a46a131afa7..59bc9d6ab531 100644<br>
--- a/clang/test/Preprocessor/x86_target_features.c<br>
+++ b/clang/test/Preprocessor/x86_target_features.c<br>
@@ -486,6 +486,25 @@<br>
<br>
 // NOVP2INTERSECT-NOT: #define __AVX512VP2INTERSECT__ 1<br>
<br>
+<br>
+// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mkl -x c -E -dM -o - %s | FileCheck  -check-prefix=KEYLOCKER %s<br>
+// KEYLOCKER: #define __KL__ 1<br>
+<br>
+// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mno-kl -x c -E -dM -o - %s | FileCheck  -check-prefix=NOKEYLOCKER %s<br>
+// NOKEYLOCKER-NOT: #define __KL__ 1<br>
+<br>
+// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mwidekl -x c -E -dM -o - %s | FileCheck  -check-prefix=KEYLOCKERW %s<br>
+// KEYLOCKERW: #define __KL__ 1<br>
+// KEYLOCKERW: #define __WIDEKL__ 1<br>
+<br>
+// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mno-widekl -x c -E -dM -o - %s | FileCheck  -check-prefix=NOKEYLOCKERW %s<br>
+// NOKEYLOCKERW-NOT: #define __KL__ 1<br>
+// NOKEYLOCKERW-NOT: #define __WIDEKL__ 1<br>
+<br>
+// RUN: %clang -target i386-unknown-linux-gnu -march=i386 -mwidekl -mno-kl -x c -E -dM -o - %s | FileCheck  -check-prefix=NOKEYLOCKERW2 %s<br>
+// NOKEYLOCKERW2-NOT: #define __KL__ 1<br>
+// NOKEYLOCKERW2-NOT: #define __WIDEKL__ 1<br>
+<br>
 // RUN: %clang -target i386-unknown-unknown -march=atom -menqcmd -x c -E -dM -o - %s | FileCheck -match-full-lines --check-prefix=ENQCMD %s<br>
<br>
 // ENQCMD: #define __ENQCMD__ 1<br>
<br>
diff  --git a/llvm/include/llvm/IR/IntrinsicsX86.td b/llvm/include/llvm/IR/IntrinsicsX86.td<br>
index 51ecb9788564..5708a761919f 100644<br>
--- a/llvm/include/llvm/IR/IntrinsicsX86.td<br>
+++ b/llvm/include/llvm/IR/IntrinsicsX86.td<br>
@@ -4948,6 +4948,59 @@ let TargetPrefix = "x86" in {<br>
   def int_x86_xresldtrk : GCCBuiltin<"__builtin_ia32_xresldtrk">,<br>
               Intrinsic<[], [], []>;<br>
 }<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Key Locker<br>
+let TargetPrefix = "x86" in {<br>
+  def int_x86_loadiwkey : GCCBuiltin<"__builtin_ia32_loadiwkey">,<br>
+      Intrinsic<[], [llvm_i32_ty, llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],<br>
+                []>;<br>
+  def int_x86_encodekey128 :<br>
+      Intrinsic<[llvm_i32_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],<br>
+                [llvm_i32_ty, llvm_v2i64_ty], []>;<br>
+  def int_x86_encodekey256 :<br>
+      Intrinsic<[llvm_i32_ty, llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],<br>
+                [llvm_i32_ty, llvm_v2i64_ty, llvm_v2i64_ty], []>;<br>
+  def int_x86_aesenc128kl :<br>
+      Intrinsic<[llvm_i8_ty, llvm_v2i64_ty], [llvm_v2i64_ty, llvm_ptr_ty], []>;<br>
+  def int_x86_aesdec128kl :<br>
+      Intrinsic<[llvm_i8_ty, llvm_v2i64_ty], [llvm_v2i64_ty, llvm_ptr_ty], []>;<br>
+  def int_x86_aesenc256kl :<br>
+      Intrinsic<[llvm_i8_ty, llvm_v2i64_ty], [llvm_v2i64_ty, llvm_ptr_ty], []>;<br>
+  def int_x86_aesdec256kl :<br>
+      Intrinsic<[llvm_i8_ty, llvm_v2i64_ty], [llvm_v2i64_ty, llvm_ptr_ty], []>;<br>
+  def int_x86_aesencwide128kl :<br>
+      Intrinsic<[llvm_i8_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],<br>
+                [llvm_ptr_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty], []>;<br>
+  def int_x86_aesdecwide128kl :<br>
+      Intrinsic<[llvm_i8_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],<br>
+                [llvm_ptr_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty], []>;<br>
+  def int_x86_aesencwide256kl :<br>
+      Intrinsic<[llvm_i8_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],<br>
+                [llvm_ptr_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty], []>;<br>
+  def int_x86_aesdecwide256kl :<br>
+      Intrinsic<[llvm_i8_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty],<br>
+                [llvm_ptr_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty,<br>
+                 llvm_v2i64_ty, llvm_v2i64_ty, llvm_v2i64_ty], []>;<br>
+}<br>
+<br>
 //===----------------------------------------------------------------------===//<br>
 // AMX - Intel AMX extensions<br>
<br>
<br>
diff  --git a/llvm/include/llvm/Support/X86TargetParser.def b/llvm/include/llvm/Support/X86TargetParser.def<br>
index e3998c99a50a..2a803ca7a689 100644<br>
--- a/llvm/include/llvm/Support/X86TargetParser.def<br>
+++ b/llvm/include/llvm/Support/X86TargetParser.def<br>
@@ -154,6 +154,8 @@ X86_FEATURE       (F16C,            "f16c")<br>
 X86_FEATURE       (FSGSBASE,        "fsgsbase")<br>
 X86_FEATURE       (FXSR,            "fxsr")<br>
 X86_FEATURE       (INVPCID,         "invpcid")<br>
+X86_FEATURE       (KL,              "kl")<br>
+X86_FEATURE       (WIDEKL,          "widekl")<br>
 X86_FEATURE       (LWP,             "lwp")<br>
 X86_FEATURE       (LZCNT,           "lzcnt")<br>
 X86_FEATURE       (MOVBE,           "movbe")<br>
<br>
diff  --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp<br>
index 16cf1bd8a117..8d741c3125a8 100644<br>
--- a/llvm/lib/IR/Function.cpp<br>
+++ b/llvm/lib/IR/Function.cpp<br>
@@ -833,7 +833,8 @@ enum IIT_Info {<br>
   IIT_SUBDIVIDE4_ARG = 45,<br>
   IIT_VEC_OF_BITCASTS_TO_INT = 46,<br>
   IIT_V128 = 47,<br>
-  IIT_BF16 = 48<br>
+  IIT_BF16 = 48,<br>
+  IIT_STRUCT9 = 49<br>
 };<br>
<br>
 static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,<br>
@@ -995,6 +996,7 @@ static void DecodeIITType(unsigned &NextElt, ArrayRef<unsigned char> Infos,<br>
   case IIT_EMPTYSTRUCT:<br>
     OutputTable.push_back(IITDescriptor::get(IITDescriptor::Struct, 0));<br>
     return;<br>
+  case IIT_STRUCT9: ++StructElts; LLVM_FALLTHROUGH;<br>
   case IIT_STRUCT8: ++StructElts; LLVM_FALLTHROUGH;<br>
   case IIT_STRUCT7: ++StructElts; LLVM_FALLTHROUGH;<br>
   case IIT_STRUCT6: ++StructElts; LLVM_FALLTHROUGH;<br>
<br>
diff  --git a/llvm/lib/Support/Host.cpp b/llvm/lib/Support/Host.cpp<br>
index 26534580d02d..0f674bbcdc1b 100644<br>
--- a/llvm/lib/Support/Host.cpp<br>
+++ b/llvm/lib/Support/Host.cpp<br>
@@ -1469,6 +1469,7 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {<br>
   Features["avx512bitalg"]    = HasLeaf7 && ((ECX >> 12) & 1) && HasAVX512Save;<br>
   Features["avx512vpopcntdq"] = HasLeaf7 && ((ECX >> 14) & 1) && HasAVX512Save;<br>
   Features["rdpid"]           = HasLeaf7 && ((ECX >> 22) & 1);<br>
+  Features["kl"]              = HasLeaf7 && ((ECX >> 23) & 1); // key locker<br>
   Features["cldemote"]        = HasLeaf7 && ((ECX >> 25) & 1);<br>
   Features["movdiri"]         = HasLeaf7 && ((ECX >> 27) & 1);<br>
   Features["movdir64b"]       = HasLeaf7 && ((ECX >> 28) & 1);<br>
@@ -1509,6 +1510,10 @@ bool sys::getHostCPUFeatures(StringMap<bool> &Features) {<br>
<br>
   Features["ptwrite"] = HasLeaf14 && ((EBX >> 4) & 1);<br>
<br>
+  bool HasLeaf19 =<br>
+      MaxLevel >= 0x19 && !getX86CpuIDAndInfo(0x19, &EAX, &EBX, &ECX, &EDX);<br>
+  Features["widekl"] = HasLeaf7 && HasLeaf19 && ((EBX >> 2) & 1);<br>
+<br>
   return true;<br>
 }<br>
 #elif defined(__linux__) && (defined(__arm__) || defined(__aarch64__))<br>
<br>
diff  --git a/llvm/lib/Support/X86TargetParser.cpp b/llvm/lib/Support/X86TargetParser.cpp<br>
index b7d9bd4f865c..99836b8460de 100644<br>
--- a/llvm/lib/Support/X86TargetParser.cpp<br>
+++ b/llvm/lib/Support/X86TargetParser.cpp<br>
@@ -194,7 +194,7 @@ static constexpr FeatureBitset FeaturesICLServer =<br>
     FeaturesICLClient | FeaturePCONFIG | FeatureWBNOINVD;<br>
 static constexpr FeatureBitset FeaturesTigerlake =<br>
     FeaturesICLClient | FeatureAVX512VP2INTERSECT | FeatureMOVDIR64B |<br>
-    FeatureMOVDIRI | FeatureSHSTK;<br>
+    FeatureMOVDIRI | FeatureSHSTK | FeatureKL | FeatureWIDEKL;<br>
 static constexpr FeatureBitset FeaturesSapphireRapids =<br>
     FeaturesICLServer | FeatureAMX_TILE | FeatureAMX_INT8 | FeatureAMX_BF16 |<br>
     FeatureAVX512BF16 | FeatureAVX512VP2INTERSECT | FeatureCLDEMOTE | FeatureENQCMD |<br>
@@ -538,6 +538,10 @@ static constexpr FeatureBitset ImpliedFeaturesAMX_TILE = {};<br>
 static constexpr FeatureBitset ImpliedFeaturesAMX_BF16 = FeatureAMX_TILE;<br>
 static constexpr FeatureBitset ImpliedFeaturesAMX_INT8 = FeatureAMX_TILE;<br>
<br>
+// Key Locker Features<br>
+static constexpr FeatureBitset ImpliedFeaturesKL = FeatureSSE2;<br>
+static constexpr FeatureBitset ImpliedFeaturesWIDEKL = FeatureKL;<br>
+<br>
 static constexpr FeatureInfo FeatureInfos[X86::CPU_FEATURE_MAX] = {<br>
 #define X86_FEATURE(ENUM, STR) {{STR}, ImpliedFeatures##ENUM},<br>
 #include "llvm/Support/X86TargetParser.def"<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86.td b/llvm/lib/Target/X86/X86.td<br>
index f2651d658d71..e5d47a0ac325 100644<br>
--- a/llvm/lib/Target/X86/X86.td<br>
+++ b/llvm/lib/Target/X86/X86.td<br>
@@ -279,6 +279,12 @@ def FeatureWAITPKG  : SubtargetFeature<"waitpkg", "HasWAITPKG", "true",<br>
                                       "Wait and pause enhancements">;<br>
 def FeatureENQCMD : SubtargetFeature<"enqcmd", "HasENQCMD", "true",<br>
                                      "Has ENQCMD instructions">;<br>
+def FeatureKL  : SubtargetFeature<"kl", "HasKL", "true",<br>
+                                  "Support Key Locker kl Instructions",<br>
+                                  [FeatureSSE2]>;<br>
+def FeatureWIDEKL  : SubtargetFeature<"widekl", "HasWIDEKL", "true",<br>
+                                      "Support Key Locker wide Instructions",<br>
+                                      [FeatureKL]>;<br>
 def FeatureSERIALIZE : SubtargetFeature<"serialize", "HasSERIALIZE", "true",<br>
                                         "Has serialize instruction">;<br>
 def FeatureTSXLDTRK : SubtargetFeature<"tsxldtrk", "HasTSXLDTRK", "true",<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp<br>
index 4b3adc7dcfbc..d0fd1046fdeb 100644<br>
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp<br>
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp<br>
@@ -25966,6 +25966,185 @@ static SDValue LowerINTRINSIC_W_CHAIN(SDValue Op, const X86Subtarget &Subtarget,<br>
                                    Op->getOperand(3), Op->getOperand(4)});<br>
       return Chain;<br>
     }<br>
+    case Intrinsic::x86_encodekey128:<br>
+    case Intrinsic::x86_encodekey256: {<br>
+      SDLoc DL(Op);<br>
+      SDVTList VTs = DAG.getVTList(MVT::i32, MVT::Other, MVT::Glue);<br>
+      SDValue Chain = Op.getOperand(0);<br>
+      bool IsEK256 = false;<br>
+      Chain = DAG.getCopyToReg(Chain, DL, X86::XMM0, Op->getOperand(3),<br>
+                               SDValue());<br>
+<br>
+      unsigned Opcode;<br>
+<br>
+      switch (IntNo) {<br>
+      default: llvm_unreachable("Impossible intrinsic");<br>
+      case Intrinsic::x86_encodekey128:<br>
+        Opcode = X86::ENCODEKEY128;<br>
+        break;<br>
+      case Intrinsic::x86_encodekey256:<br>
+        Opcode = X86::ENCODEKEY256;<br>
+        Chain = DAG.getCopyToReg(Chain, DL, X86::XMM1, Op->getOperand(4),<br>
+                                 Chain.getValue(1));<br>
+        IsEK256 = true;<br>
+        break;<br>
+      }<br>
+<br>
+      SDNode *Res = DAG.getMachineNode(Opcode, DL, VTs,<br>
+                                       {Op.getOperand(2), Chain,<br>
+                                        Chain.getValue(1)});<br>
+<br>
+      Chain = SDValue(Res, 1);<br>
+<br>
+      SDValue XMM0 = DAG.getCopyFromReg(Chain, DL, X86::XMM0, MVT::v16i8,<br>
+                                        SDValue(Res, 2));<br>
+      SDValue XMM1 = DAG.getCopyFromReg(XMM0.getValue(1), DL, X86::XMM1,<br>
+                                        MVT::v16i8, XMM0.getValue(2));<br>
+      SDValue XMM2 = DAG.getCopyFromReg(XMM1.getValue(1), DL, X86::XMM2,<br>
+                                        MVT::v16i8, XMM1.getValue(2));<br>
+      SDValue XMM3, XMM4;<br>
+      if (IsEK256) {<br>
+        XMM3 = DAG.getCopyFromReg(XMM2.getValue(1), DL, X86::XMM3,<br>
+                                  MVT::v16i8, XMM2.getValue(2));<br>
+        XMM4 = DAG.getCopyFromReg(XMM3.getValue(1), DL, X86::XMM4,<br>
+                                  MVT::v16i8, XMM3.getValue(2));<br>
+      } else {<br>
+        XMM4 = DAG.getCopyFromReg(XMM2.getValue(1), DL, X86::XMM4,<br>
+                                  MVT::v16i8, XMM2.getValue(2));<br>
+      }<br>
+      SDValue XMM5 = DAG.getCopyFromReg(XMM4.getValue(1), DL, X86::XMM5,<br>
+                                        MVT::v16i8, XMM4.getValue(2));<br>
+      SDValue XMM6 = DAG.getCopyFromReg(XMM5.getValue(1), DL, X86::XMM6,<br>
+                                        MVT::v16i8, XMM5.getValue(2));<br>
+<br>
+      if (IsEK256) {<br>
+        return DAG.getNode(ISD::MERGE_VALUES, DL, Op->getVTList(),<br>
+                           {SDValue(Res, 0),<br>
+                            XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, Chain});<br>
+      } else {<br>
+        return DAG.getNode(ISD::MERGE_VALUES, DL, Op->getVTList(),<br>
+                           {SDValue(Res, 0),<br>
+                            XMM0, XMM1, XMM2, XMM4, XMM5, XMM6, Chain});<br>
+      }<br>
+    }<br>
+    case Intrinsic::x86_aesenc128kl:<br>
+    case Intrinsic::x86_aesdec128kl:<br>
+    case Intrinsic::x86_aesenc256kl:<br>
+    case Intrinsic::x86_aesdec256kl: {<br>
+      SDLoc DL(Op);<br>
+      SDVTList VTs = DAG.getVTList(MVT::v16i8, MVT::Other, MVT::Glue);<br>
+      SDValue Chain = Op.getOperand(0);<br>
+      unsigned Opcode;<br>
+<br>
+      switch (IntNo) {<br>
+      default: llvm_unreachable("Impossible intrinsic");<br>
+      case Intrinsic::x86_aesenc128kl:<br>
+        Opcode = X86::AESENC128KL;<br>
+        break;<br>
+      case Intrinsic::x86_aesdec128kl:<br>
+        Opcode = X86::AESDEC128KL;<br>
+        break;<br>
+      case Intrinsic::x86_aesenc256kl:<br>
+        Opcode = X86::AESENC256KL;<br>
+        break;<br>
+      case Intrinsic::x86_aesdec256kl:<br>
+        Opcode = X86::AESDEC256KL;<br>
+        break;<br>
+      }<br>
+<br>
+      SDValue XMM = Op.getOperand(2);<br>
+      SDValue Base = Op.getOperand(3);<br>
+      SDValue Index = DAG.getRegister(0, MVT::i32);<br>
+      SDValue Scale = DAG.getTargetConstant(1, DL, MVT::i8);<br>
+      SDValue Disp = DAG.getTargetConstant(0, DL, MVT::i32);<br>
+      SDValue Segment = DAG.getRegister(0, MVT::i32);<br>
+<br>
+      SDNode *Res = DAG.getMachineNode(Opcode, DL, VTs, {XMM, Base, Scale, Index,<br>
+                                                         Disp, Segment, Chain});<br>
+      Chain = SDValue(Res, 1);<br>
+      SDValue EFLAGS = DAG.getCopyFromReg(Chain, DL, X86::EFLAGS, MVT::i32,<br>
+                                          SDValue(Res, 2));<br>
+      SDValue ZF = getSETCC(X86::COND_E, EFLAGS.getValue(0), DL, DAG);<br>
+<br>
+      return DAG.getNode(ISD::MERGE_VALUES, DL, Op->getVTList(),<br>
+                         {ZF, SDValue(Res, 0), EFLAGS.getValue(1)});<br>
+    }<br>
+    case Intrinsic::x86_aesencwide128kl:<br>
+    case Intrinsic::x86_aesdecwide128kl:<br>
+    case Intrinsic::x86_aesencwide256kl:<br>
+    case Intrinsic::x86_aesdecwide256kl: {<br>
+      SDLoc DL(Op);<br>
+      SDVTList VTs = DAG.getVTList(MVT::Other, MVT::Glue);<br>
+      SDValue Chain = Op.getOperand(0);<br>
+      unsigned Opcode;<br>
+<br>
+      switch (IntNo) {<br>
+      default: llvm_unreachable("Impossible intrinsic");<br>
+      case Intrinsic::x86_aesencwide128kl:<br>
+        Opcode = X86::AESENCWIDE128KL;<br>
+        break;<br>
+      case Intrinsic::x86_aesdecwide128kl:<br>
+        Opcode = X86::AESDECWIDE128KL;<br>
+        break;<br>
+      case Intrinsic::x86_aesencwide256kl:<br>
+        Opcode = X86::AESENCWIDE256KL;<br>
+        break;<br>
+      case Intrinsic::x86_aesdecwide256kl:<br>
+        Opcode = X86::AESDECWIDE256KL;<br>
+        break;<br>
+      }<br>
+<br>
+      SDValue Base = Op.getOperand(2);<br>
+      SDValue Index = DAG.getRegister(0, MVT::i32);<br>
+      SDValue Scale = DAG.getTargetConstant(1, DL, MVT::i8);<br>
+      SDValue Disp = DAG.getTargetConstant(0, DL, MVT::i32);<br>
+      SDValue Segment = DAG.getRegister(0, MVT::i32);<br>
+<br>
+      Chain = DAG.getCopyToReg(Chain, DL, X86::XMM0, Op->getOperand(3),<br>
+                               SDValue());<br>
+      Chain = DAG.getCopyToReg(Chain.getValue(0), DL, X86::XMM1,<br>
+                               Op->getOperand(4), Chain.getValue(1));<br>
+      Chain = DAG.getCopyToReg(Chain.getValue(0), DL, X86::XMM2,<br>
+                               Op->getOperand(5), Chain.getValue(1));<br>
+      Chain = DAG.getCopyToReg(Chain.getValue(0), DL, X86::XMM3,<br>
+                               Op->getOperand(6), Chain.getValue(1));<br>
+      Chain = DAG.getCopyToReg(Chain.getValue(0), DL, X86::XMM4,<br>
+                               Op->getOperand(7), Chain.getValue(1));<br>
+      Chain = DAG.getCopyToReg(Chain.getValue(0), DL, X86::XMM5,<br>
+                               Op->getOperand(8), Chain.getValue(1));<br>
+      Chain = DAG.getCopyToReg(Chain.getValue(0), DL, X86::XMM6,<br>
+                               Op->getOperand(9), Chain.getValue(1));<br>
+      Chain = DAG.getCopyToReg(Chain.getValue(0), DL, X86::XMM7,<br>
+                               Op->getOperand(10),Chain.getValue(1));<br>
+<br>
+      SDNode *Res = DAG.getMachineNode(Opcode, DL, VTs, {Base, Scale, Index,<br>
+                                                         Disp, Segment, Chain,<br>
+                                                         Chain.getValue(1)});<br>
+<br>
+      Chain = SDValue(Res, 0);<br>
+      SDValue EFLAGS = DAG.getCopyFromReg(Chain, DL, X86::EFLAGS, MVT::i32,<br>
+                                          SDValue(Res, 1));<br>
+      SDValue ZF = getSETCC(X86::COND_E, EFLAGS.getValue(0), DL, DAG);<br>
+      SDValue XMM0 = DAG.getCopyFromReg(EFLAGS.getValue(1), DL, X86::XMM0,<br>
+                                        MVT::v16i8, EFLAGS.getValue(2));<br>
+      SDValue XMM1 = DAG.getCopyFromReg(XMM0.getValue(1), DL, X86::XMM1,<br>
+                                        MVT::v16i8, XMM0.getValue(2));<br>
+      SDValue XMM2 = DAG.getCopyFromReg(XMM1.getValue(1), DL, X86::XMM2,<br>
+                                        MVT::v16i8, XMM1.getValue(2));<br>
+      SDValue XMM3 = DAG.getCopyFromReg(XMM2.getValue(1), DL, X86::XMM3,<br>
+                                        MVT::v16i8, XMM2.getValue(2));<br>
+      SDValue XMM4 = DAG.getCopyFromReg(XMM3.getValue(1), DL, X86::XMM4,<br>
+                                        MVT::v16i8, XMM3.getValue(2));<br>
+      SDValue XMM5 = DAG.getCopyFromReg(XMM4.getValue(1), DL, X86::XMM5,<br>
+                                        MVT::v16i8, XMM4.getValue(2));<br>
+      SDValue XMM6 = DAG.getCopyFromReg(XMM5.getValue(1), DL, X86::XMM6,<br>
+                                        MVT::v16i8, XMM5.getValue(2));<br>
+      SDValue XMM7 = DAG.getCopyFromReg(XMM6.getValue(1), DL, X86::XMM7,<br>
+                                        MVT::v16i8, XMM6.getValue(2));<br>
+      return DAG.getNode(ISD::MERGE_VALUES, DL, Op->getVTList(),<br>
+                         {ZF, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,<br>
+                          XMM7.getValue(1)});<br>
+    }<br>
     }<br>
     return SDValue();<br>
   }<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td<br>
index 99a9ce2fc7e6..d13ba5dbc0eb 100644<br>
--- a/llvm/lib/Target/X86/X86InstrInfo.td<br>
+++ b/llvm/lib/Target/X86/X86InstrInfo.td<br>
@@ -971,6 +971,8 @@ def HasCmpxchg8b : Predicate<"Subtarget->hasCmpxchg8b()">;<br>
 def HasCmpxchg16b: Predicate<"Subtarget->hasCmpxchg16b()">;<br>
 def HasPCONFIG   : Predicate<"Subtarget->hasPCONFIG()">;<br>
 def HasENQCMD    : Predicate<"Subtarget->hasENQCMD()">;<br>
+def HasKL        : Predicate<"Subtarget->hasKL()">;<br>
+def HasWIDEKL    : Predicate<"Subtarget->hasWIDEKL()">;<br>
 def HasSERIALIZE : Predicate<"Subtarget->hasSERIALIZE()">;<br>
 def HasTSXLDTRK  : Predicate<"Subtarget->hasTSXLDTRK()">;<br>
 def HasAMXTILE   : Predicate<"Subtarget->hasAMXTILE()">;<br>
@@ -3094,6 +3096,9 @@ include "X86InstrSGX.td"<br>
<br>
 include "X86InstrTDX.td"<br>
<br>
+// Key Locker instructions<br>
+include "X86InstrKL.td"<br>
+<br>
 // AMX instructions<br>
 include "X86InstrAMX.td"<br>
<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstrInfo.td.rej b/llvm/lib/Target/X86/X86InstrInfo.td.rej<br>
new file mode 100644<br>
index 000000000000..5c0a632b55a7<br>
--- /dev/null<br>
+++ b/llvm/lib/Target/X86/X86InstrInfo.td.rej<br>
@@ -0,0 +1,11 @@<br>
+<br>
diff  a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td       (rejected hunks)<br>
+@@ -3092,6 +3094,9 @@ include "X86InstrSVM.td"<br>
+ include "X86InstrTSX.td"<br>
+ include "X86InstrSGX.td"<br>
+ <br>
++// Key Locker instructions<br>
++include "X86InstrKL.td"<br>
++<br>
+ // AMX instructions<br>
+ include "X86InstrAMX.td"<br>
+ <br>
<br>
diff  --git a/llvm/lib/Target/X86/X86InstrKL.td b/llvm/lib/Target/X86/X86InstrKL.td<br>
new file mode 100644<br>
index 000000000000..452410891bd8<br>
--- /dev/null<br>
+++ b/llvm/lib/Target/X86/X86InstrKL.td<br>
@@ -0,0 +1,66 @@<br>
+//===---------------------------*-tablegen-*-------------------------------===//<br>
+//===------------- X86InstrKL.td - KL Instruction Set Extension -----------===//<br>
+//<br>
+//                     The LLVM Compiler Infrastructure<br>
+//<br>
+// This file is distributed under the University of Illinois Open Source<br>
+// License. See LICENSE.TXT for details.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+//<br>
+// This file describes the instructions that make up the Intel key locker<br>
+// instruction set.<br>
+//<br>
+//===----------------------------------------------------------------------===//<br>
+<br>
+//===----------------------------------------------------------------------===//<br>
+// Key Locker instructions<br>
+<br>
+let SchedRW = [WriteSystem], Predicates = [HasKL] in {<br>
+  let Uses = [XMM0, EAX] in {<br>
+    def LOADIWKEY : I<0xDC, MRMSrcReg, (outs), (ins VR128X:$src1, VR128X:$src2),<br>
+                      "loadiwkey\t{$src2, $src1|$src1, $src2}",<br>
+                      [(int_x86_loadiwkey EAX, XMM0, VR128X:$src1, VR128X:$src2)]>, T8XS;<br>
+  }<br>
+<br>
+  let Uses = [XMM0], Defs = [XMM0, XMM1, XMM2, XMM4, XMM5, XMM6] in {<br>
+    def ENCODEKEY128 : I<0xFA, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),<br>
+                         "encodekey128\t{$src, $dst|$dst, $src}", []>, T8XS;<br>
+  }<br>
+<br>
+  let Uses = [XMM0, XMM1], Defs = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6] in {<br>
+    def ENCODEKEY256 : I<0xFB, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src),<br>
+                         "encodekey256\t{$src, $dst|$dst, $src}", []>, T8XS;<br>
+  }<br>
+<br>
+  let Constraints = "$src1 = $dst",<br>
+      Defs = [EFLAGS] in {<br>
+   def AESENC128KL : I<0xDC, MRMSrcMem, (outs VR128X:$dst), (ins VR128X:$src1, opaquemem:$src2),<br>
+                        "aesenc128kl\t{$src2, $src1|$src1, $src2}", []>, T8XS;<br>
+<br>
+   def AESDEC128KL : I<0xDD, MRMSrcMem, (outs VR128X:$dst), (ins VR128X:$src1, opaquemem:$src2),<br>
+                        "aesdec128kl\t{$src2, $src1|$src1, $src2}", []>, T8XS;<br>
+<br>
+   def AESENC256KL : I<0xDE, MRMSrcMem, (outs VR128X:$dst), (ins VR128X:$src1, opaquemem:$src2),<br>
+                        "aesenc256kl\t{$src2, $src1|$src1, $src2}", []>, T8XS;<br>
+<br>
+   def AESDEC256KL : I<0xDF, MRMSrcMem, (outs VR128X:$dst), (ins VR128X:$src1, opaquemem:$src2),<br>
+                        "aesdec256kl\t{$src2, $src1|$src1, $src2}", []>, T8XS;<br>
+  }<br>
+<br>
+} // SchedRW, Predicates<br>
+<br>
+let SchedRW = [WriteSystem], Predicates = [HasWIDEKL] in {<br>
+  let Uses = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7],<br>
+      Defs = [EFLAGS, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7] in {<br>
+    def AESENCWIDE128KL : I<0xD8, MRM0m, (outs), (ins opaquemem:$src),<br>
+                            "aesencwide128kl\t$src", []>, T8XS;<br>
+    def AESDECWIDE128KL : I<0xD8, MRM1m, (outs), (ins opaquemem:$src),<br>
+                            "aesdecwide128kl\t$src", []>, T8XS;<br>
+    def AESENCWIDE256KL : I<0xD8, MRM2m, (outs), (ins opaquemem:$src),<br>
+                            "aesencwide256kl\t$src", []>, T8XS;<br>
+    def AESDECWIDE256KL : I<0xD8, MRM3m, (outs), (ins opaquemem:$src),<br>
+                            "aesdecwide256kl\t$src", []>, T8XS;<br>
+  }<br>
+<br>
+} // SchedRW, Predicates<br>
<br>
diff  --git a/llvm/lib/Target/X86/X86Subtarget.h b/llvm/lib/Target/X86/X86Subtarget.h<br>
index 923f8105870f..263be40639db 100644<br>
--- a/llvm/lib/Target/X86/X86Subtarget.h<br>
+++ b/llvm/lib/Target/X86/X86Subtarget.h<br>
@@ -395,6 +395,12 @@ class X86Subtarget final : public X86GenSubtargetInfo {<br>
   /// Processor supports PCONFIG instruction<br>
   bool HasPCONFIG = false;<br>
<br>
+  /// Processor support key locker instructions<br>
+  bool HasKL = false;<br>
+<br>
+  /// Processor support key locker wide instructions<br>
+  bool HasWIDEKL = false;<br>
+<br>
   /// Processor supports SERIALIZE instruction<br>
   bool HasSERIALIZE = false;<br>
<br>
@@ -728,6 +734,8 @@ class X86Subtarget final : public X86GenSubtargetInfo {<br>
   bool hasSGX() const { return HasSGX; }<br>
   bool hasINVPCID() const { return HasINVPCID; }<br>
   bool hasENQCMD() const { return HasENQCMD; }<br>
+  bool hasKL() const { return HasKL; }<br>
+  bool hasWIDEKL() const { return HasWIDEKL; }<br>
   bool hasSERIALIZE() const { return HasSERIALIZE; }<br>
   bool hasTSXLDTRK() const { return HasTSXLDTRK; }<br>
   bool useRetpolineIndirectCalls() const { return UseRetpolineIndirectCalls; }<br>
<br>
diff  --git a/llvm/test/CodeGen/X86/keylocker-intrinsics.ll b/llvm/test/CodeGen/X86/keylocker-intrinsics.ll<br>
new file mode 100644<br>
index 000000000000..472eed484a16<br>
--- /dev/null<br>
+++ b/llvm/test/CodeGen/X86/keylocker-intrinsics.ll<br>
@@ -0,0 +1,312 @@<br>
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py<br>
+; RUN: llc < %s -mtriple=x86_64-unkown-unknown -mattr=+kl,widekl | FileCheck %s --check-prefix=X64<br>
+; RUN: llc < %s -mtriple=i386-unkown-unknown -mattr=+kl,widekl -mattr=+avx2 | FileCheck %s --check-prefix=X32<br>
+; RUN: llc < %s -mtriple=x86_64-unkown-unknown -mattr=+widekl | FileCheck %s --check-prefix=X64<br>
+; RUN: llc < %s -mtriple=i386-unkown-unknown -mattr=+widekl -mattr=+avx2 | FileCheck %s --check-prefix=X32<br>
+<br>
+declare void @llvm.x86.loadiwkey(i32, <2 x i64>, <2 x i64>, <2 x i64>)<br>
+declare { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32, <2 x i64>)<br>
+declare { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey256(i32, <2 x i64>, <2 x i64>)<br>
+declare { i8, <2 x i64> } @llvm.x86.aesenc128kl(<2 x i64>, i8*)<br>
+declare { i8, <2 x i64> } @llvm.x86.aesdec128kl(<2 x i64>, i8*)<br>
+declare { i8, <2 x i64> } @llvm.x86.aesenc256kl(<2 x i64>, i8*)<br>
+declare { i8, <2 x i64> } @llvm.x86.aesdec256kl(<2 x i64>, i8*)<br>
+declare { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesencwide128kl(i8*, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>)<br>
+declare { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesencwide256kl(i8*, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>)<br>
+<br>
+define void @test_loadiwkey(i32 %ctl, <2 x i64> %intkey, <2 x i64> %enkey_lo, <2 x i64> %enkey_hi) {<br>
+; X64-LABEL: test_loadiwkey:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    movl %edi, %eax<br>
+; X64-NEXT:    loadiwkey %xmm2, %xmm1<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_loadiwkey:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    loadiwkey %xmm2, %xmm1<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  tail call void @llvm.x86.loadiwkey(i32 %ctl, <2 x i64> %intkey, <2 x i64> %enkey_lo, <2 x i64> %enkey_hi)<br>
+  ret void<br>
+}<br>
+<br>
+define i32 @test_encodekey128_u32(i32 %htype, <2 x i64> %key, <2 x i64>* nocapture %h0, <2 x i64>* nocapture %h1, <2 x i64>* nocapture %h2, <2 x i64>* nocapture %h3, <2 x i64>* nocapture %h4, <2 x i64>* nocapture %h5) {<br>
+; X64-LABEL: test_encodekey128_u32:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    movq {{[0-9]+}}(%rsp), %r10<br>
+; X64-NEXT:    encodekey128 %edi, %eax<br>
+; X64-NEXT:    movaps %xmm0, (%rsi)<br>
+; X64-NEXT:    movaps %xmm1, (%rdx)<br>
+; X64-NEXT:    movaps %xmm2, (%rcx)<br>
+; X64-NEXT:    movaps %xmm4, (%r8)<br>
+; X64-NEXT:    movaps %xmm5, (%r9)<br>
+; X64-NEXT:    movaps %xmm6, (%r10)<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_encodekey128_u32:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    pushl %ebp<br>
+; X32-NEXT:    .cfi_def_cfa_offset 8<br>
+; X32-NEXT:    pushl %ebx<br>
+; X32-NEXT:    .cfi_def_cfa_offset 12<br>
+; X32-NEXT:    pushl %edi<br>
+; X32-NEXT:    .cfi_def_cfa_offset 16<br>
+; X32-NEXT:    pushl %esi<br>
+; X32-NEXT:    .cfi_def_cfa_offset 20<br>
+; X32-NEXT:    .cfi_offset %esi, -20<br>
+; X32-NEXT:    .cfi_offset %edi, -16<br>
+; X32-NEXT:    .cfi_offset %ebx, -12<br>
+; X32-NEXT:    .cfi_offset %ebp, -8<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %edi<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebp<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    encodekey128 %eax, %eax<br>
+; X32-NEXT:    vmovaps %xmm0, (%ebp)<br>
+; X32-NEXT:    vmovaps %xmm1, (%ebx)<br>
+; X32-NEXT:    vmovaps %xmm2, (%edi)<br>
+; X32-NEXT:    vmovaps %xmm4, (%esi)<br>
+; X32-NEXT:    vmovaps %xmm5, (%edx)<br>
+; X32-NEXT:    vmovaps %xmm6, (%ecx)<br>
+; X32-NEXT:    popl %esi<br>
+; X32-NEXT:    .cfi_def_cfa_offset 16<br>
+; X32-NEXT:    popl %edi<br>
+; X32-NEXT:    .cfi_def_cfa_offset 12<br>
+; X32-NEXT:    popl %ebx<br>
+; X32-NEXT:    .cfi_def_cfa_offset 8<br>
+; X32-NEXT:    popl %ebp<br>
+; X32-NEXT:    .cfi_def_cfa_offset 4<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  %0 = tail call { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey128(i32 %htype, <2 x i64> %key)<br>
+  %1 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 1<br>
+  store <2 x i64> %1, <2 x i64>* %h0, align 16<br>
+  %2 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 2<br>
+  store <2 x i64> %2, <2 x i64>* %h1, align 16<br>
+  %3 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 3<br>
+  store <2 x i64> %3, <2 x i64>* %h2, align 16<br>
+  %4 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 4<br>
+  store <2 x i64> %4, <2 x i64>* %h3, align 16<br>
+  %5 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 5<br>
+  store <2 x i64> %5, <2 x i64>* %h4, align 16<br>
+  %6 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 6<br>
+  store <2 x i64> %6, <2 x i64>* %h5, align 16<br>
+  %7 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 0<br>
+  ret i32 %7<br>
+}<br>
+<br>
+define i32 @test_encodekey256_u32(i32 %htype, <2 x i64> %key_lo, <2 x i64> %key_hi, <2 x i64>* nocapture %h0, <2 x i64>* nocapture %h1, <2 x i64>* nocapture %h2, <2 x i64>* nocapture %h3, <2 x i64>* nocapture %h4, <2 x i64>* nocapture %h5, <2 x      i64>* nocapture readnone %h6) {<br>
+; X64-LABEL: test_encodekey256_u32:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    movq {{[0-9]+}}(%rsp), %r10<br>
+; X64-NEXT:    encodekey256 %edi, %eax<br>
+; X64-NEXT:    movaps %xmm0, (%rsi)<br>
+; X64-NEXT:    movaps %xmm1, (%rdx)<br>
+; X64-NEXT:    movaps %xmm2, (%rcx)<br>
+; X64-NEXT:    movaps %xmm3, (%r8)<br>
+; X64-NEXT:    movaps %xmm4, (%r9)<br>
+; X64-NEXT:    movaps %xmm5, (%r10)<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_encodekey256_u32:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    pushl %ebp<br>
+; X32-NEXT:    .cfi_def_cfa_offset 8<br>
+; X32-NEXT:    pushl %ebx<br>
+; X32-NEXT:    .cfi_def_cfa_offset 12<br>
+; X32-NEXT:    pushl %edi<br>
+; X32-NEXT:    .cfi_def_cfa_offset 16<br>
+; X32-NEXT:    pushl %esi<br>
+; X32-NEXT:    .cfi_def_cfa_offset 20<br>
+; X32-NEXT:    .cfi_offset %esi, -20<br>
+; X32-NEXT:    .cfi_offset %edi, -16<br>
+; X32-NEXT:    .cfi_offset %ebx, -12<br>
+; X32-NEXT:    .cfi_offset %ebp, -8<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %ecx<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %edx<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %esi<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %edi<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebx<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %ebp<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    encodekey256 %eax, %eax<br>
+; X32-NEXT:    vmovaps %xmm0, (%ebp)<br>
+; X32-NEXT:    vmovaps %xmm1, (%ebx)<br>
+; X32-NEXT:    vmovaps %xmm2, (%edi)<br>
+; X32-NEXT:    vmovaps %xmm3, (%esi)<br>
+; X32-NEXT:    vmovaps %xmm4, (%edx)<br>
+; X32-NEXT:    vmovaps %xmm5, (%ecx)<br>
+; X32-NEXT:    popl %esi<br>
+; X32-NEXT:    .cfi_def_cfa_offset 16<br>
+; X32-NEXT:    popl %edi<br>
+; X32-NEXT:    .cfi_def_cfa_offset 12<br>
+; X32-NEXT:    popl %ebx<br>
+; X32-NEXT:    .cfi_def_cfa_offset 8<br>
+; X32-NEXT:    popl %ebp<br>
+; X32-NEXT:    .cfi_def_cfa_offset 4<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  %0 = tail call { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.encodekey256(i32 %htype, <2 x i64> %key_lo, <2 x i64> %key_hi)<br>
+  %1 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 1<br>
+  store <2 x i64> %1, <2 x i64>* %h0, align 16<br>
+  %2 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 2<br>
+  store <2 x i64> %2, <2 x i64>* %h1, align 16<br>
+  %3 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 3<br>
+  store <2 x i64> %3, <2 x i64>* %h2, align 16<br>
+  %4 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 4<br>
+  store <2 x i64> %4, <2 x i64>* %h3, align 16<br>
+  %5 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 5<br>
+  store <2 x i64> %5, <2 x i64>* %h4, align 16<br>
+  %6 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 6<br>
+  store <2 x i64> %6, <2 x i64>* %h5, align 16<br>
+  %7 = extractvalue { i32, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 0<br>
+  ret i32 %7<br>
+}<br>
+<br>
+define i8 @test_mm_aesenc128kl_u8(<2 x i64> %data, i8* %h) {<br>
+; X64-LABEL: test_mm_aesenc128kl_u8:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    aesenc128kl (%rdi), %xmm0<br>
+; X64-NEXT:    sete %al<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_mm_aesenc128kl_u8:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    aesenc128kl (%eax), %xmm0<br>
+; X32-NEXT:    sete %al<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  %0 = tail call { i8, <2 x i64> } @llvm.x86.aesenc128kl(<2 x i64> %data, i8* %h)<br>
+  %1 = extractvalue { i8, <2 x i64> } %0, 0<br>
+  ret i8 %1<br>
+}<br>
+<br>
+define i8 @test_mm_aesdec128kl_u8(<2 x i64> %data, i8* %h) {<br>
+; X64-LABEL: test_mm_aesdec128kl_u8:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    aesdec128kl (%rdi), %xmm0<br>
+; X64-NEXT:    sete %al<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_mm_aesdec128kl_u8:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    aesdec128kl (%eax), %xmm0<br>
+; X32-NEXT:    sete %al<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  %0 = tail call { i8, <2 x i64> } @llvm.x86.aesdec128kl(<2 x i64> %data, i8* %h)<br>
+  %1 = extractvalue { i8, <2 x i64> } %0, 0<br>
+  ret i8 %1<br>
+}<br>
+<br>
+define i8 @test_mm_aesenc256kl_u8(<2 x i64> %data, i8* %h) {<br>
+; X64-LABEL: test_mm_aesenc256kl_u8:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    aesenc256kl (%rdi), %xmm0<br>
+; X64-NEXT:    sete %al<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_mm_aesenc256kl_u8:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    aesenc256kl (%eax), %xmm0<br>
+; X32-NEXT:    sete %al<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  %0 = tail call { i8, <2 x i64> } @llvm.x86.aesenc256kl(<2 x i64> %data, i8* %h)<br>
+  %1 = extractvalue { i8, <2 x i64> } %0, 0<br>
+  ret i8 %1<br>
+}<br>
+<br>
+define i8 @test_mm_aesdec256kl_u8(<2 x i64> %data, i8* %h) {<br>
+; X64-LABEL: test_mm_aesdec256kl_u8:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    aesdec256kl (%rdi), %xmm0<br>
+; X64-NEXT:    sete %al<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_mm_aesdec256kl_u8:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    movl {{[0-9]+}}(%esp), %eax<br>
+; X32-NEXT:    aesdec256kl (%eax), %xmm0<br>
+; X32-NEXT:    sete %al<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  %0 = tail call { i8, <2 x i64> } @llvm.x86.aesdec256kl(<2 x i64> %data, i8* %h)<br>
+  %1 = extractvalue { i8, <2 x i64> } %0, 0<br>
+  ret i8 %1<br>
+}<br>
+<br>
+define i8 @test_mm_aesencwide128kl_u8(i8* %p, <2 x i64> %v0, <2 x i64> %v1, <2 x i64> %v2, <2 x i64> %v3, <2 x i64> %v4, <2 x i64> %v5, <2 x i64> %v6, <2 x i64> %v7) {<br>
+; X64-LABEL: test_mm_aesencwide128kl_u8:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    aesencwide128kl (%rdi)<br>
+; X64-NEXT:    sete %al<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_mm_aesencwide128kl_u8:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    pushl %ebp<br>
+; X32-NEXT:    .cfi_def_cfa_offset 8<br>
+; X32-NEXT:    .cfi_offset %ebp, -8<br>
+; X32-NEXT:    movl %esp, %ebp<br>
+; X32-NEXT:    .cfi_def_cfa_register %ebp<br>
+; X32-NEXT:    andl $-16, %esp<br>
+; X32-NEXT:    subl $16, %esp<br>
+; X32-NEXT:    vmovaps 24(%ebp), %xmm3<br>
+; X32-NEXT:    vmovaps 40(%ebp), %xmm4<br>
+; X32-NEXT:    vmovaps 56(%ebp), %xmm5<br>
+; X32-NEXT:    vmovaps 72(%ebp), %xmm6<br>
+; X32-NEXT:    vmovaps 88(%ebp), %xmm7<br>
+; X32-NEXT:    movl 8(%ebp), %eax<br>
+; X32-NEXT:    aesencwide128kl (%eax)<br>
+; X32-NEXT:    sete %al<br>
+; X32-NEXT:    movl %ebp, %esp<br>
+; X32-NEXT:    popl %ebp<br>
+; X32-NEXT:    .cfi_def_cfa %esp, 4<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  %0 = call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesencwide128kl(i8* %p, <2 x i64> %v0, <2 x i64> %v1, <2 x i64> %v2, <2 x i64> %v3, <2 x i64> %v4, <2 x i64> %v5, <2 x i64> %v6,      <2 x i64> %v7)<br>
+  %1 = extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 0<br>
+  ret i8 %1<br>
+}<br>
+<br>
+define i8 @test_mm_aesencwide256kl_u8(i8* %p, <2 x i64> %v0, <2 x i64> %v1, <2 x i64> %v2, <2 x i64> %v3, <2 x i64> %v4, <2 x i64> %v5, <2 x i64> %v6, <2 x i64> %v7) {<br>
+; X64-LABEL: test_mm_aesencwide256kl_u8:<br>
+; X64:       # %bb.0: # %entry<br>
+; X64-NEXT:    aesencwide256kl (%rdi)<br>
+; X64-NEXT:    sete %al<br>
+; X64-NEXT:    retq<br>
+;<br>
+; X32-LABEL: test_mm_aesencwide256kl_u8:<br>
+; X32:       # %bb.0: # %entry<br>
+; X32-NEXT:    pushl %ebp<br>
+; X32-NEXT:    .cfi_def_cfa_offset 8<br>
+; X32-NEXT:    .cfi_offset %ebp, -8<br>
+; X32-NEXT:    movl %esp, %ebp<br>
+; X32-NEXT:    .cfi_def_cfa_register %ebp<br>
+; X32-NEXT:    andl $-16, %esp<br>
+; X32-NEXT:    subl $16, %esp<br>
+; X32-NEXT:    vmovaps 24(%ebp), %xmm3<br>
+; X32-NEXT:    vmovaps 40(%ebp), %xmm4<br>
+; X32-NEXT:    vmovaps 56(%ebp), %xmm5<br>
+; X32-NEXT:    vmovaps 72(%ebp), %xmm6<br>
+; X32-NEXT:    vmovaps 88(%ebp), %xmm7<br>
+; X32-NEXT:    movl 8(%ebp), %eax<br>
+; X32-NEXT:    aesencwide256kl (%eax)<br>
+; X32-NEXT:    sete %al<br>
+; X32-NEXT:    movl %ebp, %esp<br>
+; X32-NEXT:    popl %ebp<br>
+; X32-NEXT:    .cfi_def_cfa %esp, 4<br>
+; X32-NEXT:    retl<br>
+entry:<br>
+  %0 = call { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.x86.aesencwide256kl(i8* %p, <2 x i64> %v0, <2 x i64> %v1, <2 x i64> %v2, <2 x i64> %v3, <2 x i64> %v4, <2 x i64> %v5, <2 x i64> %v6,      <2 x i64> %v7)<br>
+  %1 = extractvalue { i8, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } %0, 0<br>
+  ret i8 %1<br>
+}<br>
<br>
diff  --git a/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-32-att.txt b/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-32-att.txt<br>
new file mode 100644<br>
index 000000000000..45f2d1164faa<br>
--- /dev/null<br>
+++ b/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-32-att.txt<br>
@@ -0,0 +1,276 @@<br>
+# RUN: llvm-mc --disassemble %s -triple=i686-apple-darwin9 | FileCheck %s<br>
+# CHECK: loadiwkey       %xmm2, %xmm3<br>
+0xf3 0x0f 0x38 0xdc 0xda<br>
+<br>
+# CHECK: loadiwkey       %xmm2, %xmm6<br>
+0xf3 0x0f 0x38 0xdc 0xf2<br>
+<br>
+# CHECK: encodekey128       %eax, %ebx<br>
+0xf3 0x0f 0x38 0xfa 0xd8<br>
+<br>
+# CHECK: encodekey128       %eax, %edx<br>
+0xf3 0x0f 0x38 0xfa 0xd0<br>
+<br>
+# CHECK: encodekey256       %eax, %ebx<br>
+0xf3 0x0f 0x38 0xfb 0xd8<br>
+<br>
+# CHECK: encodekey256       %eax, %edx<br>
+0xf3 0x0f 0x38 0xfb 0xd0<br>
+<br>
+# CHECK: aesenc128kl     126(%edx), %xmm2<br>
+0xf3 0x0f 0x38 0xdc 0x52 0x7e<br>
+<br>
+# CHECK: aesdec128kl     126(%edx), %xmm2<br>
+0xf3 0x0f 0x38 0xdd 0x52 0x7e<br>
+<br>
+# CHECK: aesenc256kl     126(%edx), %xmm2<br>
+0xf3 0x0f 0x38 0xde 0x52 0x7e<br>
+<br>
+# CHECK: aesdec256kl     126(%edx), %xmm2<br>
+0xf3 0x0f 0x38 0xdf 0x52 0x7e<br>
+<br>
+# CHECK: aesencwide128kl       (%ebx)<br>
+0xf3 0x0f 0x38 0xd8 0x03<br>
+<br>
+# CHECK: aesencwide128kl       126(%edx)<br>
+0xf3 0x0f 0x38 0xd8 0x42 0x7e<br>
+<br>
+# CHECK: aesdecwide128kl       (%ebx)<br>
+0xf3 0x0f 0x38 0xd8 0x0b<br>
+<br>
+# CHECK: aesdecwide128kl       126(%edx)<br>
+0xf3 0x0f 0x38 0xd8 0x4a 0x7e<br>
+<br>
+# CHECK: aesencwide256kl (%ebx)<br>
+0xf3 0x0f 0x38 0xd8 0x13<br>
+<br>
+# CHECK: aesencwide256kl 126(%edx)<br>
+0xf3 0x0f 0x38 0xd8 0x52 0x7e<br>
+<br>
+# CHECK: aesdecwide256kl (%ebx)<br>
+0xf3 0x0f 0x38 0xd8 0x1b<br>
+<br>
+# CHECK: aesdecwide256kl 126(%edx)<br>
+0xf3 0x0f 0x38 0xd8 0x5a 0x7e<br>
+<br>
+# CHECK:      aesdec128kl 268435456(%esp,%esi,8), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec128kl 291(%edi,%eax,4), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl (%eax), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x10<br>
+<br>
+# CHECK:      aesdec128kl -1536(,%ebp,2), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x14,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdec128kl 6096(%ecx), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x91,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl -6144(%edx), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x92,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl  268435456(%esp,%esi,8), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec256kl  291(%edi,%eax,4), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  (%eax), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x10<br>
+<br>
+# CHECK:      aesdec256kl  -2048(,%ebp,2), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl  8128(%ecx), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  -8192(%edx), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl 268435456(%esp,%esi,8), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc128kl 291(%edi,%eax,4), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl (%eax), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x10<br>
+<br>
+# CHECK:      aesenc128kl -1536(,%ebp,2), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x14,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl 6096(%ecx), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x91,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl -6144(%edx), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x92,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl  268435456(%esp,%esi,8), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc256kl  291(%edi,%eax,4), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  (%eax), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x10<br>
+<br>
+# CHECK:      aesenc256kl  -2048(,%ebp,2), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl  8128(%ecx), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  -8192(%edx), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      loadiwkey %xmm3, %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0xd3<br>
+<br>
+# CHECK:      aesdec128kl 268435456(%esp,%esi,8), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec128kl 291(%edi,%eax,4), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl (%eax), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x10<br>
+<br>
+# CHECK:      aesdec128kl -1536(,%ebp,2), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x14,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdec128kl 6096(%ecx), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x91,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl -6144(%edx), %xmm2<br>
+0xf3,0x0f,0x38,0xdd,0x92,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl  268435456(%esp,%esi,8), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec256kl  291(%edi,%eax,4), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  (%eax), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x10<br>
+<br>
+# CHECK:      aesdec256kl  -2048(,%ebp,2), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl  8128(%ecx), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  -8192(%edx), %xmm2<br>
+0xf3,0x0f,0x38,0xdf,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl 268435456(%esp,%esi,8), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc128kl 291(%edi,%eax,4), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl (%eax), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x10<br>
+<br>
+# CHECK:      aesenc128kl -1536(,%ebp,2), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x14,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl 6096(%ecx), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x91,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl -6144(%edx), %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0x92,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl  268435456(%esp,%esi,8), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc256kl  291(%edi,%eax,4), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  (%eax), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x10<br>
+<br>
+# CHECK:      aesenc256kl  -2048(,%ebp,2), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl  8128(%ecx), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  -8192(%edx), %xmm2<br>
+0xf3,0x0f,0x38,0xde,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      loadiwkey %xmm3, %xmm2<br>
+0xf3,0x0f,0x38,0xdc,0xd3<br>
+<br>
+# CHECK:      aesdecwide128kl 268435456(%esp,%esi,8)<br>
+0xf3,0x0f,0x38,0xd8,0x8c,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdecwide128kl 291(%edi,%eax,4)<br>
+0xf3,0x0f,0x38,0xd8,0x8c,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl (%eax)<br>
+0xf3,0x0f,0x38,0xd8,0x08<br>
+<br>
+# CHECK:      aesdecwide128kl -1536(,%ebp,2)<br>
+0xf3,0x0f,0x38,0xd8,0x0c,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide128kl 6096(%ecx)<br>
+0xf3,0x0f,0x38,0xd8,0x89,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl -6144(%edx)<br>
+0xf3,0x0f,0x38,0xd8,0x8a,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide256kl  268435456(%esp,%esi,8)<br>
+0xf3,0x0f,0x38,0xd8,0x9c,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdecwide256kl  291(%edi,%eax,4)<br>
+0xf3,0x0f,0x38,0xd8,0x9c,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl  (%eax)<br>
+0xf3,0x0f,0x38,0xd8,0x18<br>
+<br>
+# CHECK:      aesdecwide256kl  -2048(,%ebp,2)<br>
+0xf3,0x0f,0x38,0xd8,0x1c,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide256kl  8128(%ecx)<br>
+0xf3,0x0f,0x38,0xd8,0x99,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl  -8192(%edx)<br>
+0xf3,0x0f,0x38,0xd8,0x9a,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide128kl 268435456(%esp,%esi,8)<br>
+0xf3,0x0f,0x38,0xd8,0x84,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesencwide128kl 291(%edi,%eax,4)<br>
+0xf3,0x0f,0x38,0xd8,0x84,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl (%eax)<br>
+0xf3,0x0f,0x38,0xd8,0x00<br>
+<br>
+# CHECK:      aesencwide128kl -1536(,%ebp,2)<br>
+0xf3,0x0f,0x38,0xd8,0x04,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide128kl 6096(%ecx)<br>
+0xf3,0x0f,0x38,0xd8,0x81,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl -6144(%edx)<br>
+0xf3,0x0f,0x38,0xd8,0x82,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide256kl  268435456(%esp,%esi,8)<br>
+0xf3,0x0f,0x38,0xd8,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesencwide256kl  291(%edi,%eax,4)<br>
+0xf3,0x0f,0x38,0xd8,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl  (%eax)<br>
+0xf3,0x0f,0x38,0xd8,0x10<br>
+<br>
+# CHECK:      aesencwide256kl  -2048(,%ebp,2)<br>
+0xf3,0x0f,0x38,0xd8,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide256kl  8128(%ecx)<br>
+0xf3,0x0f,0x38,0xd8,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl  -8192(%edx)<br>
+0xf3,0x0f,0x38,0xd8,0x92,0x00,0xe0,0xff,0xff<br>
<br>
diff  --git a/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-32-intel.txt b/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-32-intel.txt<br>
new file mode 100644<br>
index 000000000000..983abeb78060<br>
--- /dev/null<br>
+++ b/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-32-intel.txt<br>
@@ -0,0 +1,223 @@<br>
+# RUN: llvm-mc --disassemble %s -triple=i386 -x86-asm-syntax=intel --output-asm-variant=1 | FileCheck %s<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xdd,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xdd,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [eax]<br>
+0xf3,0x0f,0x38,0xdd,0x10<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [2*ebp - 1536]<br>
+0xf3,0x0f,0x38,0xdd,0x14,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [ecx + 6096]<br>
+0xf3,0x0f,0x38,0xdd,0x91,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [edx - 6144]<br>
+0xf3,0x0f,0x38,0xdd,0x92,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xdf,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xdf,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [eax]<br>
+0xf3,0x0f,0x38,0xdf,0x10<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [2*ebp - 2048]<br>
+0xf3,0x0f,0x38,0xdf,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [ecx + 8128]<br>
+0xf3,0x0f,0x38,0xdf,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [edx - 8192]<br>
+0xf3,0x0f,0x38,0xdf,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xdc,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xdc,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [eax]<br>
+0xf3,0x0f,0x38,0xdc,0x10<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [2*ebp - 1536]<br>
+0xf3,0x0f,0x38,0xdc,0x14,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [ecx + 6096]<br>
+0xf3,0x0f,0x38,0xdc,0x91,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [edx - 6144]<br>
+0xf3,0x0f,0x38,0xdc,0x92,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xde,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xde,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [eax]<br>
+0xf3,0x0f,0x38,0xde,0x10<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [2*ebp - 2048]<br>
+0xf3,0x0f,0x38,0xde,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [ecx + 8128]<br>
+0xf3,0x0f,0x38,0xde,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [edx - 8192]<br>
+0xf3,0x0f,0x38,0xde,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      loadiwkey xmm2, xmm3<br>
+0xf3,0x0f,0x38,0xdc,0xd3<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xdd,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xdd,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [eax]<br>
+0xf3,0x0f,0x38,0xdd,0x10<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [2*ebp - 1536]<br>
+0xf3,0x0f,0x38,0xdd,0x14,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [ecx + 6096]<br>
+0xf3,0x0f,0x38,0xdd,0x91,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm2, [edx - 6144]<br>
+0xf3,0x0f,0x38,0xdd,0x92,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xdf,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xdf,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [eax]<br>
+0xf3,0x0f,0x38,0xdf,0x10<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [2*ebp - 2048]<br>
+0xf3,0x0f,0x38,0xdf,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [ecx + 8128]<br>
+0xf3,0x0f,0x38,0xdf,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm2, [edx - 8192]<br>
+0xf3,0x0f,0x38,0xdf,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xdc,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xdc,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [eax]<br>
+0xf3,0x0f,0x38,0xdc,0x10<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [2*ebp - 1536]<br>
+0xf3,0x0f,0x38,0xdc,0x14,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [ecx + 6096]<br>
+0xf3,0x0f,0x38,0xdc,0x91,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm2, [edx - 6144]<br>
+0xf3,0x0f,0x38,0xdc,0x92,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xde,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xde,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [eax]<br>
+0xf3,0x0f,0x38,0xde,0x10<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [2*ebp - 2048]<br>
+0xf3,0x0f,0x38,0xde,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [ecx + 8128]<br>
+0xf3,0x0f,0x38,0xde,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm2, [edx - 8192]<br>
+0xf3,0x0f,0x38,0xde,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      loadiwkey xmm2, xmm3<br>
+0xf3,0x0f,0x38,0xdc,0xd3<br>
+<br>
+# CHECK:      aesdecwide128kl [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xd8,0x8c,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdecwide128kl [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xd8,0x8c,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl [eax]<br>
+0xf3,0x0f,0x38,0xd8,0x08<br>
+<br>
+# CHECK:      aesdecwide128kl [2*ebp - 1536]<br>
+0xf3,0x0f,0x38,0xd8,0x0c,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide128kl [ecx + 6096]<br>
+0xf3,0x0f,0x38,0xd8,0x89,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl [edx - 6144]<br>
+0xf3,0x0f,0x38,0xd8,0x8a,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide256kl [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xd8,0x9c,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdecwide256kl [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xd8,0x9c,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl [eax]<br>
+0xf3,0x0f,0x38,0xd8,0x18<br>
+<br>
+# CHECK:      aesdecwide256kl [2*ebp - 2048]<br>
+0xf3,0x0f,0x38,0xd8,0x1c,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide256kl [ecx + 8128]<br>
+0xf3,0x0f,0x38,0xd8,0x99,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl [edx - 8192]<br>
+0xf3,0x0f,0x38,0xd8,0x9a,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide128kl [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xd8,0x84,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesencwide128kl [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xd8,0x84,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl [eax]<br>
+0xf3,0x0f,0x38,0xd8,0x00<br>
+<br>
+# CHECK:      aesencwide128kl [2*ebp - 1536]<br>
+0xf3,0x0f,0x38,0xd8,0x04,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide128kl [ecx + 6096]<br>
+0xf3,0x0f,0x38,0xd8,0x81,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl [edx - 6144]<br>
+0xf3,0x0f,0x38,0xd8,0x82,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide256kl [esp + 8*esi + 268435456]<br>
+0xf3,0x0f,0x38,0xd8,0x94,0xf4,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesencwide256kl [edi + 4*eax + 291]<br>
+0xf3,0x0f,0x38,0xd8,0x94,0x87,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl [eax]<br>
+0xf3,0x0f,0x38,0xd8,0x10<br>
+<br>
+# CHECK:      aesencwide256kl [2*ebp - 2048]<br>
+0xf3,0x0f,0x38,0xd8,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide256kl [ecx + 8128]<br>
+0xf3,0x0f,0x38,0xd8,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl [edx - 8192]<br>
+0xf3,0x0f,0x38,0xd8,0x92,0x00,0xe0,0xff,0xff<br>
<br>
diff  --git a/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-64-att.txt b/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-64-att.txt<br>
new file mode 100644<br>
index 000000000000..973677d92aa3<br>
--- /dev/null<br>
+++ b/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-64-att.txt<br>
@@ -0,0 +1,277 @@<br>
+# RUN: llvm-mc --disassemble %s -triple=x86_64 | FileCheck %s<br>
+# CHECK: loadiwkey       %xmm2, %xmm3<br>
+0xf3 0x0f 0x38 0xdc 0xda<br>
+<br>
+# CHECK: loadiwkey       %xmm2, %xmm6<br>
+0xf3 0x0f 0x38 0xdc 0xf2<br>
+<br>
+# CHECK: encodekey128       %eax, %ebx<br>
+0xf3 0x0f 0x38 0xfa 0xd8<br>
+<br>
+# CHECK: encodekey128       %eax, %edx<br>
+0xf3 0x0f 0x38 0xfa 0xd0<br>
+<br>
+# CHECK: encodekey256       %eax, %ebx<br>
+0xf3 0x0f 0x38 0xfb 0xd8<br>
+<br>
+# CHECK: encodekey256       %eax, %edx<br>
+0xf3 0x0f 0x38 0xfb 0xd0<br>
+<br>
+# CHECK: aesenc128kl     126(%rdx), %xmm2<br>
+0xf3 0x0f 0x38 0xdc 0x52 0x7e<br>
+<br>
+# CHECK: aesdec128kl     126(%rdx), %xmm2<br>
+0xf3 0x0f 0x38 0xdd 0x52 0x7e<br>
+<br>
+# CHECK: aesenc256kl     126(%rdx), %xmm2<br>
+0xf3 0x0f 0x38 0xde 0x52 0x7e<br>
+<br>
+# CHECK: aesdec256kl     126(%rdx), %xmm2<br>
+0xf3 0x0f 0x38 0xdf 0x52 0x7e<br>
+<br>
+# CHECK: aesencwide128kl       (%rbx)<br>
+0xf3 0x0f 0x38 0xd8 0x03<br>
+<br>
+# CHECK: aesencwide128kl       126(%rdx)<br>
+0xf3 0x0f 0x38 0xd8 0x42 0x7e<br>
+<br>
+# CHECK: aesdecwide128kl       (%rbx)<br>
+0xf3 0x0f 0x38 0xd8 0x0b<br>
+<br>
+# CHECK: aesdecwide128kl       126(%rdx)<br>
+0xf3 0x0f 0x38 0xd8 0x4a 0x7e<br>
+<br>
+# CHECK: aesencwide256kl (%rbx)<br>
+0xf3 0x0f 0x38 0xd8 0x13<br>
+<br>
+# CHECK: aesencwide256kl 126(%rdx)<br>
+0xf3 0x0f 0x38 0xd8 0x52 0x7e<br>
+<br>
+# CHECK: aesdecwide256kl (%rbx)<br>
+0xf3 0x0f 0x38 0xd8 0x1b<br>
+<br>
+# CHECK: aesdecwide256kl 126(%rdx)<br>
+0xf3 0x0f 0x38 0xd8 0x5a 0x7e<br>
+<br>
+# CHECK:      aesdec128kl 268435456(%rbp,%r14,8), %xmm6<br>
+0xf3,0x42,0x0f,0x38,0xdd,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec128kl 291(%r8,%rax,4), %xmm6<br>
+0xf3,0x41,0x0f,0x38,0xdd,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl (%rip), %xmm6<br>
+0xf3,0x0f,0x38,0xdd,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl -1536(,%rbp,2), %xmm6<br>
+0xf3,0x0f,0x38,0xdd,0x34,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdec128kl 6096(%rcx), %xmm6<br>
+0xf3,0x0f,0x38,0xdd,0xb1,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl -6144(%rdx), %xmm6<br>
+0xf3,0x0f,0x38,0xdd,0xb2,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl  268435456(%rbp,%r14,8), %xmm6<br>
+0xf3,0x42,0x0f,0x38,0xdf,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec256kl  291(%r8,%rax,4), %xmm6<br>
+0xf3,0x41,0x0f,0x38,0xdf,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  (%rip), %xmm6<br>
+0xf3,0x0f,0x38,0xdf,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  -2048(,%rbp,2), %xmm6<br>
+0xf3,0x0f,0x38,0xdf,0x34,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl  8128(%rcx), %xmm6<br>
+0xf3,0x0f,0x38,0xdf,0xb1,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  -8192(%rdx), %xmm6<br>
+0xf3,0x0f,0x38,0xdf,0xb2,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl 268435456(%rbp,%r14,8), %xmm6<br>
+0xf3,0x42,0x0f,0x38,0xdc,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc128kl 291(%r8,%rax,4), %xmm6<br>
+0xf3,0x41,0x0f,0x38,0xdc,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl (%rip), %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl -1536(,%rbp,2), %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0x34,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl 6096(%rcx), %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0xb1,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl -6144(%rdx), %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0xb2,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl  268435456(%rbp,%r14,8), %xmm6<br>
+0xf3,0x42,0x0f,0x38,0xde,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc256kl  291(%r8,%rax,4), %xmm6<br>
+0xf3,0x41,0x0f,0x38,0xde,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  (%rip), %xmm6<br>
+0xf3,0x0f,0x38,0xde,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  -2048(,%rbp,2), %xmm6<br>
+0xf3,0x0f,0x38,0xde,0x34,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl  8128(%rcx), %xmm6<br>
+0xf3,0x0f,0x38,0xde,0xb1,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  -8192(%rdx), %xmm6<br>
+0xf3,0x0f,0x38,0xde,0xb2,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      loadiwkey %xmm7, %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0xf7<br>
+<br>
+# CHECK:      aesdec128kl 268435456(%rbp,%r14,8), %xmm6<br>
+0xf3,0x42,0x0f,0x38,0xdd,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec128kl 291(%r8,%rax,4), %xmm6<br>
+0xf3,0x41,0x0f,0x38,0xdd,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl (%rip), %xmm6<br>
+0xf3,0x0f,0x38,0xdd,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl -1536(,%rbp,2), %xmm6<br>
+0xf3,0x0f,0x38,0xdd,0x34,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdec128kl 6096(%rcx), %xmm6<br>
+0xf3,0x0f,0x38,0xdd,0xb1,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl -6144(%rdx), %xmm6<br>
+0xf3,0x0f,0x38,0xdd,0xb2,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl  268435456(%rbp,%r14,8), %xmm6<br>
+0xf3,0x42,0x0f,0x38,0xdf,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec256kl  291(%r8,%rax,4), %xmm6<br>
+0xf3,0x41,0x0f,0x38,0xdf,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  (%rip), %xmm6<br>
+0xf3,0x0f,0x38,0xdf,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  -2048(,%rbp,2), %xmm6<br>
+0xf3,0x0f,0x38,0xdf,0x34,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl  8128(%rcx), %xmm6<br>
+0xf3,0x0f,0x38,0xdf,0xb1,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl  -8192(%rdx), %xmm6<br>
+0xf3,0x0f,0x38,0xdf,0xb2,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl 268435456(%rbp,%r14,8), %xmm6<br>
+0xf3,0x42,0x0f,0x38,0xdc,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc128kl 291(%r8,%rax,4), %xmm6<br>
+0xf3,0x41,0x0f,0x38,0xdc,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl (%rip), %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl -1536(,%rbp,2), %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0x34,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl 6096(%rcx), %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0xb1,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl -6144(%rdx), %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0xb2,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl  268435456(%rbp,%r14,8), %xmm6<br>
+0xf3,0x42,0x0f,0x38,0xde,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc256kl  291(%r8,%rax,4), %xmm6<br>
+0xf3,0x41,0x0f,0x38,0xde,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  (%rip), %xmm6<br>
+0xf3,0x0f,0x38,0xde,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  -2048(,%rbp,2), %xmm6<br>
+0xf3,0x0f,0x38,0xde,0x34,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl  8128(%rcx), %xmm6<br>
+0xf3,0x0f,0x38,0xde,0xb1,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl  -8192(%rdx), %xmm6<br>
+0xf3,0x0f,0x38,0xde,0xb2,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      loadiwkey %xmm7, %xmm6<br>
+0xf3,0x0f,0x38,0xdc,0xf7<br>
+<br>
+# CHECK:      aesdecwide128kl 268435456(%rbp,%r14,8)<br>
+0xf3,0x42,0x0f,0x38,0xd8,0x8c,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdecwide128kl 291(%r8,%rax,4)<br>
+0xf3,0x41,0x0f,0x38,0xd8,0x8c,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl (%rip)<br>
+0xf3,0x0f,0x38,0xd8,0x0d,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl -1536(,%rbp,2)<br>
+0xf3,0x0f,0x38,0xd8,0x0c,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide128kl 6096(%rcx)<br>
+0xf3,0x0f,0x38,0xd8,0x89,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl -6144(%rdx)<br>
+0xf3,0x0f,0x38,0xd8,0x8a,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide256kl  268435456(%rbp,%r14,8)<br>
+0xf3,0x42,0x0f,0x38,0xd8,0x9c,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdecwide256kl  291(%r8,%rax,4)<br>
+0xf3,0x41,0x0f,0x38,0xd8,0x9c,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl  (%rip)<br>
+0xf3,0x0f,0x38,0xd8,0x1d,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl  -2048(,%rbp,2)<br>
+0xf3,0x0f,0x38,0xd8,0x1c,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide256kl  8128(%rcx)<br>
+0xf3,0x0f,0x38,0xd8,0x99,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl  -8192(%rdx)<br>
+0xf3,0x0f,0x38,0xd8,0x9a,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide128kl 268435456(%rbp,%r14,8)<br>
+0xf3,0x42,0x0f,0x38,0xd8,0x84,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesencwide128kl 291(%r8,%rax,4)<br>
+0xf3,0x41,0x0f,0x38,0xd8,0x84,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl (%rip)<br>
+0xf3,0x0f,0x38,0xd8,0x05,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl -1536(,%rbp,2)<br>
+0xf3,0x0f,0x38,0xd8,0x04,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide128kl 6096(%rcx)<br>
+0xf3,0x0f,0x38,0xd8,0x81,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl -6144(%rdx)<br>
+0xf3,0x0f,0x38,0xd8,0x82,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide256kl  268435456(%rbp,%r14,8)<br>
+0xf3,0x42,0x0f,0x38,0xd8,0x94,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesencwide256kl  291(%r8,%rax,4)<br>
+0xf3,0x41,0x0f,0x38,0xd8,0x94,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl  (%rip)<br>
+0xf3,0x0f,0x38,0xd8,0x15,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl  -2048(,%rbp,2)<br>
+0xf3,0x0f,0x38,0xd8,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide256kl  8128(%rcx)<br>
+0xf3,0x0f,0x38,0xd8,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl  -8192(%rdx)<br>
+0xf3,0x0f,0x38,0xd8,0x92,0x00,0xe0,0xff,0xff<br>
+<br>
<br>
diff  --git a/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-64-intel.txt b/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-64-intel.txt<br>
new file mode 100644<br>
index 000000000000..262c6185f85b<br>
--- /dev/null<br>
+++ b/llvm/test/MC/Disassembler/X86/KEYLOCKER/Keylocker-x86-64-intel.txt<br>
@@ -0,0 +1,223 @@<br>
+# RUN: llvm-mc --disassemble %s -triple=x86_64 -x86-asm-syntax=intel --output-asm-variant=1 | FileCheck %s<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xdd,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xdd,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [rip]<br>
+0xf3,0x0f,0x38,0xdd,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [2*rbp - 1536]<br>
+0xf3,0x0f,0x38,0xdd,0x34,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [rcx + 6096]<br>
+0xf3,0x0f,0x38,0xdd,0xb1,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [rdx - 6144]<br>
+0xf3,0x0f,0x38,0xdd,0xb2,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xdf,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xdf,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [rip]<br>
+0xf3,0x0f,0x38,0xdf,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [2*rbp - 2048]<br>
+0xf3,0x0f,0x38,0xdf,0x34,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [rcx + 8128]<br>
+0xf3,0x0f,0x38,0xdf,0xb1,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [rdx - 8192]<br>
+0xf3,0x0f,0x38,0xdf,0xb2,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xdc,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xdc,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [rip]<br>
+0xf3,0x0f,0x38,0xdc,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [2*rbp - 1536]<br>
+0xf3,0x0f,0x38,0xdc,0x34,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [rcx + 6096]<br>
+0xf3,0x0f,0x38,0xdc,0xb1,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [rdx - 6144]<br>
+0xf3,0x0f,0x38,0xdc,0xb2,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xde,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xde,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [rip]<br>
+0xf3,0x0f,0x38,0xde,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [2*rbp - 2048]<br>
+0xf3,0x0f,0x38,0xde,0x34,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [rcx + 8128]<br>
+0xf3,0x0f,0x38,0xde,0xb1,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [rdx - 8192]<br>
+0xf3,0x0f,0x38,0xde,0xb2,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      loadiwkey xmm6, xmm7<br>
+0xf3,0x0f,0x38,0xdc,0xf7<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xdd,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xdd,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [rip]<br>
+0xf3,0x0f,0x38,0xdd,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [2*rbp - 1536]<br>
+0xf3,0x0f,0x38,0xdd,0x34,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [rcx + 6096]<br>
+0xf3,0x0f,0x38,0xdd,0xb1,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdec128kl xmm6, [rdx - 6144]<br>
+0xf3,0x0f,0x38,0xdd,0xb2,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xdf,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xdf,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [rip]<br>
+0xf3,0x0f,0x38,0xdf,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [2*rbp - 2048]<br>
+0xf3,0x0f,0x38,0xdf,0x34,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [rcx + 8128]<br>
+0xf3,0x0f,0x38,0xdf,0xb1,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdec256kl xmm6, [rdx - 8192]<br>
+0xf3,0x0f,0x38,0xdf,0xb2,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xdc,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xdc,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [rip]<br>
+0xf3,0x0f,0x38,0xdc,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [2*rbp - 1536]<br>
+0xf3,0x0f,0x38,0xdc,0x34,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [rcx + 6096]<br>
+0xf3,0x0f,0x38,0xdc,0xb1,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesenc128kl xmm6, [rdx - 6144]<br>
+0xf3,0x0f,0x38,0xdc,0xb2,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xde,0xb4,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xde,0xb4,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [rip]<br>
+0xf3,0x0f,0x38,0xde,0x35,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [2*rbp - 2048]<br>
+0xf3,0x0f,0x38,0xde,0x34,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [rcx + 8128]<br>
+0xf3,0x0f,0x38,0xde,0xb1,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesenc256kl xmm6, [rdx - 8192]<br>
+0xf3,0x0f,0x38,0xde,0xb2,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      loadiwkey xmm6, xmm7<br>
+0xf3,0x0f,0x38,0xdc,0xf7<br>
+<br>
+# CHECK:      aesdecwide128kl [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xd8,0x8c,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdecwide128kl [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xd8,0x8c,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl [rip]<br>
+0xf3,0x0f,0x38,0xd8,0x0d,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl [2*rbp - 1536]<br>
+0xf3,0x0f,0x38,0xd8,0x0c,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide128kl [rcx + 6096]<br>
+0xf3,0x0f,0x38,0xd8,0x89,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide128kl [rdx - 6144]<br>
+0xf3,0x0f,0x38,0xd8,0x8a,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide256kl [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xd8,0x9c,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesdecwide256kl [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xd8,0x9c,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl [rip]<br>
+0xf3,0x0f,0x38,0xd8,0x1d,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl [2*rbp - 2048]<br>
+0xf3,0x0f,0x38,0xd8,0x1c,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesdecwide256kl [rcx + 8128]<br>
+0xf3,0x0f,0x38,0xd8,0x99,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesdecwide256kl [rdx - 8192]<br>
+0xf3,0x0f,0x38,0xd8,0x9a,0x00,0xe0,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide128kl [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xd8,0x84,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesencwide128kl [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xd8,0x84,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl [rip]<br>
+0xf3,0x0f,0x38,0xd8,0x05,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl [2*rbp - 1536]<br>
+0xf3,0x0f,0x38,0xd8,0x04,0x6d,0x00,0xfa,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide128kl [rcx + 6096]<br>
+0xf3,0x0f,0x38,0xd8,0x81,0xd0,0x17,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide128kl [rdx - 6144]<br>
+0xf3,0x0f,0x38,0xd8,0x82,0x00,0xe8,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide256kl [rbp + 8*r14 + 268435456]<br>
+0xf3,0x42,0x0f,0x38,0xd8,0x94,0xf5,0x00,0x00,0x00,0x10<br>
+<br>
+# CHECK:      aesencwide256kl [r8 + 4*rax + 291]<br>
+0xf3,0x41,0x0f,0x38,0xd8,0x94,0x80,0x23,0x01,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl [rip]<br>
+0xf3,0x0f,0x38,0xd8,0x15,0x00,0x00,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl [2*rbp - 2048]<br>
+0xf3,0x0f,0x38,0xd8,0x14,0x6d,0x00,0xf8,0xff,0xff<br>
+<br>
+# CHECK:      aesencwide256kl [rcx + 8128]<br>
+0xf3,0x0f,0x38,0xd8,0x91,0xc0,0x1f,0x00,0x00<br>
+<br>
+# CHECK:      aesencwide256kl [rdx - 8192]<br>
+0xf3,0x0f,0x38,0xd8,0x92,0x00,0xe0,0xff,0xff<br>
<br>
diff  --git a/llvm/test/MC/X86/KEYLOCKER/keylocker-att.s b/llvm/test/MC/X86/KEYLOCKER/keylocker-att.s<br>
new file mode 100644<br>
index 000000000000..3352a2f5ec81<br>
--- /dev/null<br>
+++ b/llvm/test/MC/X86/KEYLOCKER/keylocker-att.s<br>
@@ -0,0 +1,205 @@<br>
+// RUN: llvm-mc -triple i386-unknown-unknown --show-encoding %s | FileCheck %s<br>
+<br>
+// CHECK:      aesdec128kl 268435456(%esp,%esi,8), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesdec128kl 268435456(%esp,%esi,8), %xmm2<br>
+<br>
+// CHECK:      aesdec128kl 291(%edi,%eax,4), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesdec128kl 291(%edi,%eax,4), %xmm2<br>
+<br>
+// CHECK:      aesdec128kl (%eax), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x10]<br>
+               aesdec128kl (%eax), %xmm2<br>
+<br>
+// CHECK:      aesdec128kl -1536(,%ebp,2), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x14,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesdec128kl -1536(,%ebp,2), %xmm2<br>
+<br>
+// CHECK:      aesdec128kl 6096(%ecx), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x91,0xd0,0x17,0x00,0x00]<br>
+               aesdec128kl 6096(%ecx), %xmm2<br>
+<br>
+// CHECK:      aesdec128kl -6144(%edx), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x92,0x00,0xe8,0xff,0xff]<br>
+               aesdec128kl -6144(%edx), %xmm2<br>
+<br>
+// CHECK:      aesdec256kl  268435456(%esp,%esi,8), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesdec256kl  268435456(%esp,%esi,8), %xmm2<br>
+<br>
+// CHECK:      aesdec256kl  291(%edi,%eax,4), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesdec256kl  291(%edi,%eax,4), %xmm2<br>
+<br>
+// CHECK:      aesdec256kl  (%eax), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x10]<br>
+               aesdec256kl  (%eax), %xmm2<br>
+<br>
+// CHECK:      aesdec256kl  -2048(,%ebp,2), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x14,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesdec256kl  -2048(,%ebp,2), %xmm2<br>
+<br>
+// CHECK:      aesdec256kl  8128(%ecx), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x91,0xc0,0x1f,0x00,0x00]<br>
+               aesdec256kl  8128(%ecx), %xmm2<br>
+<br>
+// CHECK:      aesdec256kl  -8192(%edx), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x92,0x00,0xe0,0xff,0xff]<br>
+               aesdec256kl  -8192(%edx), %xmm2<br>
+<br>
+// CHECK:      aesenc128kl 268435456(%esp,%esi,8), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesenc128kl 268435456(%esp,%esi,8), %xmm2<br>
+<br>
+// CHECK:      aesenc128kl 291(%edi,%eax,4), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesenc128kl 291(%edi,%eax,4), %xmm2<br>
+<br>
+// CHECK:      aesenc128kl (%eax), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x10]<br>
+               aesenc128kl (%eax), %xmm2<br>
+<br>
+// CHECK:      aesenc128kl -1536(,%ebp,2), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x14,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesenc128kl -1536(,%ebp,2), %xmm2<br>
+<br>
+// CHECK:      aesenc128kl 6096(%ecx), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x91,0xd0,0x17,0x00,0x00]<br>
+               aesenc128kl 6096(%ecx), %xmm2<br>
+<br>
+// CHECK:      aesenc128kl -6144(%edx), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x92,0x00,0xe8,0xff,0xff]<br>
+               aesenc128kl -6144(%edx), %xmm2<br>
+<br>
+// CHECK:      aesenc256kl  268435456(%esp,%esi,8), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesenc256kl  268435456(%esp,%esi,8), %xmm2<br>
+<br>
+// CHECK:      aesenc256kl  291(%edi,%eax,4), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesenc256kl  291(%edi,%eax,4), %xmm2<br>
+<br>
+// CHECK:      aesenc256kl  (%eax), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x10]<br>
+               aesenc256kl  (%eax), %xmm2<br>
+<br>
+// CHECK:      aesenc256kl  -2048(,%ebp,2), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x14,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesenc256kl  -2048(,%ebp,2), %xmm2<br>
+<br>
+// CHECK:      aesenc256kl  8128(%ecx), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x91,0xc0,0x1f,0x00,0x00]<br>
+               aesenc256kl  8128(%ecx), %xmm2<br>
+<br>
+// CHECK:      aesenc256kl  -8192(%edx), %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x92,0x00,0xe0,0xff,0xff]<br>
+               aesenc256kl  -8192(%edx), %xmm2<br>
+<br>
+// CHECK:      encodekey128 %ecx, %ecx<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xfa,0xc9]<br>
+               encodekey128 %ecx, %ecx<br>
+<br>
+// CHECK:      encodekey256 %ecx, %ecx<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xfb,0xc9]<br>
+               encodekey256 %ecx, %ecx<br>
+<br>
+// CHECK:      loadiwkey %xmm3, %xmm2<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0xd3]<br>
+               loadiwkey %xmm3, %xmm2<br>
+<br>
+// CHECK:      aesdecwide128kl 268435456(%esp,%esi,8)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x8c,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesdecwide128kl 268435456(%esp,%esi,8)<br>
+<br>
+// CHECK:      aesdecwide128kl 291(%edi,%eax,4)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x8c,0x87,0x23,0x01,0x00,0x00]<br>
+               aesdecwide128kl 291(%edi,%eax,4)<br>
+<br>
+// CHECK:      aesdecwide128kl (%eax)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x08]<br>
+               aesdecwide128kl (%eax)<br>
+<br>
+// CHECK:      aesdecwide128kl -1536(,%ebp,2)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x0c,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesdecwide128kl -1536(,%ebp,2)<br>
+<br>
+// CHECK:      aesdecwide128kl 6096(%ecx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x89,0xd0,0x17,0x00,0x00]<br>
+               aesdecwide128kl 6096(%ecx)<br>
+<br>
+// CHECK:      aesdecwide128kl -6144(%edx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x8a,0x00,0xe8,0xff,0xff]<br>
+               aesdecwide128kl -6144(%edx)<br>
+<br>
+// CHECK:      aesdecwide256kl  268435456(%esp,%esi,8)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x9c,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesdecwide256kl  268435456(%esp,%esi,8)<br>
+<br>
+// CHECK:      aesdecwide256kl  291(%edi,%eax,4)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x9c,0x87,0x23,0x01,0x00,0x00]<br>
+               aesdecwide256kl  291(%edi,%eax,4)<br>
+<br>
+// CHECK:      aesdecwide256kl  (%eax)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x18]<br>
+               aesdecwide256kl  (%eax)<br>
+<br>
+// CHECK:      aesdecwide256kl  -2048(,%ebp,2)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x1c,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesdecwide256kl  -2048(,%ebp,2)<br>
+<br>
+// CHECK:      aesdecwide256kl  8128(%ecx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x99,0xc0,0x1f,0x00,0x00]<br>
+               aesdecwide256kl  8128(%ecx)<br>
+<br>
+// CHECK:      aesdecwide256kl  -8192(%edx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x9a,0x00,0xe0,0xff,0xff]<br>
+               aesdecwide256kl  -8192(%edx)<br>
+<br>
+// CHECK:      aesencwide128kl 268435456(%esp,%esi,8)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x84,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesencwide128kl 268435456(%esp,%esi,8)<br>
+<br>
+// CHECK:      aesencwide128kl 291(%edi,%eax,4)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x84,0x87,0x23,0x01,0x00,0x00]<br>
+               aesencwide128kl 291(%edi,%eax,4)<br>
+<br>
+// CHECK:      aesencwide128kl (%eax)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x00]<br>
+               aesencwide128kl (%eax)<br>
+<br>
+// CHECK:      aesencwide128kl -1536(,%ebp,2)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x04,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesencwide128kl -1536(,%ebp,2)<br>
+<br>
+// CHECK:      aesencwide128kl 6096(%ecx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x81,0xd0,0x17,0x00,0x00]<br>
+               aesencwide128kl 6096(%ecx)<br>
+<br>
+// CHECK:      aesencwide128kl -6144(%edx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x82,0x00,0xe8,0xff,0xff]<br>
+               aesencwide128kl -6144(%edx)<br>
+<br>
+// CHECK:      aesencwide256kl  268435456(%esp,%esi,8)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesencwide256kl  268435456(%esp,%esi,8)<br>
+<br>
+// CHECK:      aesencwide256kl  291(%edi,%eax,4)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesencwide256kl  291(%edi,%eax,4)<br>
+<br>
+// CHECK:      aesencwide256kl  (%eax)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x10]<br>
+               aesencwide256kl  (%eax)<br>
+<br>
+// CHECK:      aesencwide256kl  -2048(,%ebp,2)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x14,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesencwide256kl  -2048(,%ebp,2)<br>
+<br>
+// CHECK:      aesencwide256kl  8128(%ecx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x91,0xc0,0x1f,0x00,0x00]<br>
+               aesencwide256kl  8128(%ecx)<br>
+<br>
+// CHECK:      aesencwide256kl  -8192(%edx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x92,0x00,0xe0,0xff,0xff]<br>
+               aesencwide256kl  -8192(%edx)<br>
<br>
diff  --git a/llvm/test/MC/X86/KEYLOCKER/keylocker-intel.s b/llvm/test/MC/X86/KEYLOCKER/keylocker-intel.s<br>
new file mode 100644<br>
index 000000000000..7eb1e0df8c55<br>
--- /dev/null<br>
+++ b/llvm/test/MC/X86/KEYLOCKER/keylocker-intel.s<br>
@@ -0,0 +1,205 @@<br>
+// RUN: llvm-mc -triple i386-unknown-unknown -x86-asm-syntax=intel -output-asm-variant=1 --show-encoding %s | FileCheck %s<br>
+<br>
+// CHECK:      aesdec128kl xmm2, [esp + 8*esi + 268435456]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesdec128kl xmm2, [esp + 8*esi + 268435456]<br>
+<br>
+// CHECK:      aesdec128kl xmm2, [edi + 4*eax + 291]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesdec128kl xmm2, [edi + 4*eax + 291]<br>
+<br>
+// CHECK:      aesdec128kl xmm2, [eax]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x10]<br>
+               aesdec128kl xmm2, [eax]<br>
+<br>
+// CHECK:      aesdec128kl xmm2, [2*ebp - 1536]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x14,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesdec128kl xmm2, [2*ebp - 1536]<br>
+<br>
+// CHECK:      aesdec128kl xmm2, [ecx + 6096]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x91,0xd0,0x17,0x00,0x00]<br>
+               aesdec128kl xmm2, [ecx + 6096]<br>
+<br>
+// CHECK:      aesdec128kl xmm2, [edx - 6144]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x92,0x00,0xe8,0xff,0xff]<br>
+               aesdec128kl xmm2, [edx - 6144]<br>
+<br>
+// CHECK:      aesdec256kl xmm2, [esp + 8*esi + 268435456]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesdec256kl xmm2, [esp + 8*esi + 268435456]<br>
+<br>
+// CHECK:      aesdec256kl xmm2, [edi + 4*eax + 291]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesdec256kl xmm2, [edi + 4*eax + 291]<br>
+<br>
+// CHECK:      aesdec256kl xmm2, [eax]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x10]<br>
+               aesdec256kl xmm2, [eax]<br>
+<br>
+// CHECK:      aesdec256kl xmm2, [2*ebp - 2048]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x14,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesdec256kl xmm2, [2*ebp - 2048]<br>
+<br>
+// CHECK:      aesdec256kl xmm2, [ecx + 8128]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x91,0xc0,0x1f,0x00,0x00]<br>
+               aesdec256kl xmm2, [ecx + 8128]<br>
+<br>
+// CHECK:      aesdec256kl xmm2, [edx - 8192]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x92,0x00,0xe0,0xff,0xff]<br>
+               aesdec256kl xmm2, [edx - 8192]<br>
+<br>
+// CHECK:      aesenc128kl xmm2, [esp + 8*esi + 268435456]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesenc128kl xmm2, [esp + 8*esi + 268435456]<br>
+<br>
+// CHECK:      aesenc128kl xmm2, [edi + 4*eax + 291]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesenc128kl xmm2, [edi + 4*eax + 291]<br>
+<br>
+// CHECK:      aesenc128kl xmm2, [eax]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x10]<br>
+               aesenc128kl xmm2, [eax]<br>
+<br>
+// CHECK:      aesenc128kl xmm2, [2*ebp - 1536]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x14,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesenc128kl xmm2, [2*ebp - 1536]<br>
+<br>
+// CHECK:      aesenc128kl xmm2, [ecx + 6096]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x91,0xd0,0x17,0x00,0x00]<br>
+               aesenc128kl xmm2, [ecx + 6096]<br>
+<br>
+// CHECK:      aesenc128kl xmm2, [edx - 6144]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x92,0x00,0xe8,0xff,0xff]<br>
+               aesenc128kl xmm2, [edx - 6144]<br>
+<br>
+// CHECK:      aesenc256kl xmm2, [esp + 8*esi + 268435456]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesenc256kl xmm2, [esp + 8*esi + 268435456]<br>
+<br>
+// CHECK:      aesenc256kl xmm2, [edi + 4*eax + 291]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesenc256kl xmm2, [edi + 4*eax + 291]<br>
+<br>
+// CHECK:      aesenc256kl xmm2, [eax]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x10]<br>
+               aesenc256kl xmm2, [eax]<br>
+<br>
+// CHECK:      aesenc256kl xmm2, [2*ebp - 2048]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x14,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesenc256kl xmm2, [2*ebp - 2048]<br>
+<br>
+// CHECK:      aesenc256kl xmm2, [ecx + 8128]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x91,0xc0,0x1f,0x00,0x00]<br>
+               aesenc256kl xmm2, [ecx + 8128]<br>
+<br>
+// CHECK:      aesenc256kl xmm2, [edx - 8192]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x92,0x00,0xe0,0xff,0xff]<br>
+               aesenc256kl xmm2, [edx - 8192]<br>
+<br>
+// CHECK:      encodekey128 ecx, ecx<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xfa,0xc9]<br>
+               encodekey128 ecx, ecx<br>
+<br>
+// CHECK:      encodekey256 ecx, ecx<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xfb,0xc9]<br>
+               encodekey256 ecx, ecx<br>
+<br>
+// CHECK:      loadiwkey xmm2, xmm3<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0xd3]<br>
+               loadiwkey xmm2, xmm3<br>
+<br>
+// CHECK:      aesdecwide128kl [esp + 8*esi + 268435456]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x8c,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesdecwide128kl [esp + 8*esi + 268435456]<br>
+<br>
+// CHECK:      aesdecwide128kl [edi + 4*eax + 291]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x8c,0x87,0x23,0x01,0x00,0x00]<br>
+               aesdecwide128kl [edi + 4*eax + 291]<br>
+<br>
+// CHECK:      aesdecwide128kl [eax]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x08]<br>
+               aesdecwide128kl [eax]<br>
+<br>
+// CHECK:      aesdecwide128kl [2*ebp - 1536]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x0c,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesdecwide128kl [2*ebp - 1536]<br>
+<br>
+// CHECK:      aesdecwide128kl [ecx + 6096]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x89,0xd0,0x17,0x00,0x00]<br>
+               aesdecwide128kl [ecx + 6096]<br>
+<br>
+// CHECK:      aesdecwide128kl [edx - 6144]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x8a,0x00,0xe8,0xff,0xff]<br>
+               aesdecwide128kl [edx - 6144]<br>
+<br>
+// CHECK:      aesdecwide256kl [esp + 8*esi + 268435456]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x9c,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesdecwide256kl [esp + 8*esi + 268435456]<br>
+<br>
+// CHECK:      aesdecwide256kl [edi + 4*eax + 291]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x9c,0x87,0x23,0x01,0x00,0x00]<br>
+               aesdecwide256kl [edi + 4*eax + 291]<br>
+<br>
+// CHECK:      aesdecwide256kl [eax]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x18]<br>
+               aesdecwide256kl [eax]<br>
+<br>
+// CHECK:      aesdecwide256kl [2*ebp - 2048]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x1c,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesdecwide256kl [2*ebp - 2048]<br>
+<br>
+// CHECK:      aesdecwide256kl [ecx + 8128]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x99,0xc0,0x1f,0x00,0x00]<br>
+               aesdecwide256kl [ecx + 8128]<br>
+<br>
+// CHECK:      aesdecwide256kl [edx - 8192]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x9a,0x00,0xe0,0xff,0xff]<br>
+               aesdecwide256kl [edx - 8192]<br>
+<br>
+// CHECK:      aesencwide128kl [esp + 8*esi + 268435456]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x84,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesencwide128kl [esp + 8*esi + 268435456]<br>
+<br>
+// CHECK:      aesencwide128kl [edi + 4*eax + 291]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x84,0x87,0x23,0x01,0x00,0x00]<br>
+               aesencwide128kl [edi + 4*eax + 291]<br>
+<br>
+// CHECK:      aesencwide128kl [eax]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x00]<br>
+               aesencwide128kl [eax]<br>
+<br>
+// CHECK:      aesencwide128kl [2*ebp - 1536]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x04,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesencwide128kl [2*ebp - 1536]<br>
+<br>
+// CHECK:      aesencwide128kl [ecx + 6096]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x81,0xd0,0x17,0x00,0x00]<br>
+               aesencwide128kl [ecx + 6096]<br>
+<br>
+// CHECK:      aesencwide128kl [edx - 6144]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x82,0x00,0xe8,0xff,0xff]<br>
+               aesencwide128kl [edx - 6144]<br>
+<br>
+// CHECK:      aesencwide256kl [esp + 8*esi + 268435456]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x94,0xf4,0x00,0x00,0x00,0x10]<br>
+               aesencwide256kl [esp + 8*esi + 268435456]<br>
+<br>
+// CHECK:      aesencwide256kl [edi + 4*eax + 291]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x94,0x87,0x23,0x01,0x00,0x00]<br>
+               aesencwide256kl [edi + 4*eax + 291]<br>
+<br>
+// CHECK:      aesencwide256kl [eax]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x10]<br>
+               aesencwide256kl [eax]<br>
+<br>
+// CHECK:      aesencwide256kl [2*ebp - 2048]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x14,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesencwide256kl [2*ebp - 2048]<br>
+<br>
+// CHECK:      aesencwide256kl [ecx + 8128]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x91,0xc0,0x1f,0x00,0x00]<br>
+               aesencwide256kl [ecx + 8128]<br>
+<br>
+// CHECK:      aesencwide256kl [edx - 8192]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x92,0x00,0xe0,0xff,0xff]<br>
+               aesencwide256kl [edx - 8192]<br>
<br>
diff  --git a/llvm/test/MC/X86/KEYLOCKER/x86-64-keylocker-att.s b/llvm/test/MC/X86/KEYLOCKER/x86-64-keylocker-att.s<br>
new file mode 100644<br>
index 000000000000..dc467d76c287<br>
--- /dev/null<br>
+++ b/llvm/test/MC/X86/KEYLOCKER/x86-64-keylocker-att.s<br>
@@ -0,0 +1,205 @@<br>
+// RUN: llvm-mc -triple x86_64-unknown-unknown --show-encoding %s | FileCheck %s<br>
+<br>
+// CHECK:      aesdec128kl 268435456(%rbp,%r14,8), %xmm6<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xdd,0xb4,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesdec128kl 268435456(%rbp,%r14,8), %xmm6<br>
+<br>
+// CHECK:      aesdec128kl 291(%r8,%rax,4), %xmm6<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xdd,0xb4,0x80,0x23,0x01,0x00,0x00]<br>
+               aesdec128kl 291(%r8,%rax,4), %xmm6<br>
+<br>
+// CHECK:      aesdec128kl (%rip), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x35,0x00,0x00,0x00,0x00]<br>
+               aesdec128kl (%rip), %xmm6<br>
+<br>
+// CHECK:      aesdec128kl -1536(,%rbp,2), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x34,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesdec128kl -1536(,%rbp,2), %xmm6<br>
+<br>
+// CHECK:      aesdec128kl 6096(%rcx), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0xb1,0xd0,0x17,0x00,0x00]<br>
+               aesdec128kl 6096(%rcx), %xmm6<br>
+<br>
+// CHECK:      aesdec128kl -6144(%rdx), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0xb2,0x00,0xe8,0xff,0xff]<br>
+               aesdec128kl -6144(%rdx), %xmm6<br>
+<br>
+// CHECK:      aesdec256kl  268435456(%rbp,%r14,8), %xmm6<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xdf,0xb4,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesdec256kl  268435456(%rbp,%r14,8), %xmm6<br>
+<br>
+// CHECK:      aesdec256kl  291(%r8,%rax,4), %xmm6<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xdf,0xb4,0x80,0x23,0x01,0x00,0x00]<br>
+               aesdec256kl  291(%r8,%rax,4), %xmm6<br>
+<br>
+// CHECK:      aesdec256kl  (%rip), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x35,0x00,0x00,0x00,0x00]<br>
+               aesdec256kl  (%rip), %xmm6<br>
+<br>
+// CHECK:      aesdec256kl  -2048(,%rbp,2), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x34,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesdec256kl  -2048(,%rbp,2), %xmm6<br>
+<br>
+// CHECK:      aesdec256kl  8128(%rcx), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0xb1,0xc0,0x1f,0x00,0x00]<br>
+               aesdec256kl  8128(%rcx), %xmm6<br>
+<br>
+// CHECK:      aesdec256kl  -8192(%rdx), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0xb2,0x00,0xe0,0xff,0xff]<br>
+               aesdec256kl  -8192(%rdx), %xmm6<br>
+<br>
+// CHECK:      aesenc128kl 268435456(%rbp,%r14,8), %xmm6<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xdc,0xb4,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesenc128kl 268435456(%rbp,%r14,8), %xmm6<br>
+<br>
+// CHECK:      aesenc128kl 291(%r8,%rax,4), %xmm6<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xdc,0xb4,0x80,0x23,0x01,0x00,0x00]<br>
+               aesenc128kl 291(%r8,%rax,4), %xmm6<br>
+<br>
+// CHECK:      aesenc128kl (%rip), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x35,0x00,0x00,0x00,0x00]<br>
+               aesenc128kl (%rip), %xmm6<br>
+<br>
+// CHECK:      aesenc128kl -1536(,%rbp,2), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x34,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesenc128kl -1536(,%rbp,2), %xmm6<br>
+<br>
+// CHECK:      aesenc128kl 6096(%rcx), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0xb1,0xd0,0x17,0x00,0x00]<br>
+               aesenc128kl 6096(%rcx), %xmm6<br>
+<br>
+// CHECK:      aesenc128kl -6144(%rdx), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0xb2,0x00,0xe8,0xff,0xff]<br>
+               aesenc128kl -6144(%rdx), %xmm6<br>
+<br>
+// CHECK:      aesenc256kl  268435456(%rbp,%r14,8), %xmm6<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xde,0xb4,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesenc256kl  268435456(%rbp,%r14,8), %xmm6<br>
+<br>
+// CHECK:      aesenc256kl  291(%r8,%rax,4), %xmm6<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xde,0xb4,0x80,0x23,0x01,0x00,0x00]<br>
+               aesenc256kl  291(%r8,%rax,4), %xmm6<br>
+<br>
+// CHECK:      aesenc256kl  (%rip), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x35,0x00,0x00,0x00,0x00]<br>
+               aesenc256kl  (%rip), %xmm6<br>
+<br>
+// CHECK:      aesenc256kl  -2048(,%rbp,2), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x34,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesenc256kl  -2048(,%rbp,2), %xmm6<br>
+<br>
+// CHECK:      aesenc256kl  8128(%rcx), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0xb1,0xc0,0x1f,0x00,0x00]<br>
+               aesenc256kl  8128(%rcx), %xmm6<br>
+<br>
+// CHECK:      aesenc256kl  -8192(%rdx), %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0xb2,0x00,0xe0,0xff,0xff]<br>
+               aesenc256kl  -8192(%rdx), %xmm6<br>
+<br>
+// CHECK:      encodekey128 %ecx, %ecx<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xfa,0xc9]<br>
+               encodekey128 %ecx, %ecx<br>
+<br>
+// CHECK:      encodekey256 %ecx, %ecx<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xfb,0xc9]<br>
+               encodekey256 %ecx, %ecx<br>
+<br>
+// CHECK:      loadiwkey %xmm7, %xmm6<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0xf7]<br>
+               loadiwkey %xmm7, %xmm6<br>
+<br>
+// CHECK:      aesdecwide128kl 268435456(%rbp,%r14,8)<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xd8,0x8c,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesdecwide128kl 268435456(%rbp,%r14,8)<br>
+<br>
+// CHECK:      aesdecwide128kl 291(%r8,%rax,4)<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xd8,0x8c,0x80,0x23,0x01,0x00,0x00]<br>
+               aesdecwide128kl 291(%r8,%rax,4)<br>
+<br>
+// CHECK:      aesdecwide128kl (%rip)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x0d,0x00,0x00,0x00,0x00]<br>
+               aesdecwide128kl (%rip)<br>
+<br>
+// CHECK:      aesdecwide128kl -1536(,%rbp,2)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x0c,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesdecwide128kl -1536(,%rbp,2)<br>
+<br>
+// CHECK:      aesdecwide128kl 6096(%rcx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x89,0xd0,0x17,0x00,0x00]<br>
+               aesdecwide128kl 6096(%rcx)<br>
+<br>
+// CHECK:      aesdecwide128kl -6144(%rdx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x8a,0x00,0xe8,0xff,0xff]<br>
+               aesdecwide128kl -6144(%rdx)<br>
+<br>
+// CHECK:      aesdecwide256kl  268435456(%rbp,%r14,8)<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xd8,0x9c,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesdecwide256kl  268435456(%rbp,%r14,8)<br>
+<br>
+// CHECK:      aesdecwide256kl  291(%r8,%rax,4)<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xd8,0x9c,0x80,0x23,0x01,0x00,0x00]<br>
+               aesdecwide256kl  291(%r8,%rax,4)<br>
+<br>
+// CHECK:      aesdecwide256kl  (%rip)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x1d,0x00,0x00,0x00,0x00]<br>
+               aesdecwide256kl  (%rip)<br>
+<br>
+// CHECK:      aesdecwide256kl  -2048(,%rbp,2)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x1c,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesdecwide256kl  -2048(,%rbp,2)<br>
+<br>
+// CHECK:      aesdecwide256kl  8128(%rcx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x99,0xc0,0x1f,0x00,0x00]<br>
+               aesdecwide256kl  8128(%rcx)<br>
+<br>
+// CHECK:      aesdecwide256kl  -8192(%rdx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x9a,0x00,0xe0,0xff,0xff]<br>
+               aesdecwide256kl  -8192(%rdx)<br>
+<br>
+// CHECK:      aesencwide128kl 268435456(%rbp,%r14,8)<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xd8,0x84,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesencwide128kl 268435456(%rbp,%r14,8)<br>
+<br>
+// CHECK:      aesencwide128kl 291(%r8,%rax,4)<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xd8,0x84,0x80,0x23,0x01,0x00,0x00]<br>
+               aesencwide128kl 291(%r8,%rax,4)<br>
+<br>
+// CHECK:      aesencwide128kl (%rip)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x05,0x00,0x00,0x00,0x00]<br>
+               aesencwide128kl (%rip)<br>
+<br>
+// CHECK:      aesencwide128kl -1536(,%rbp,2)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x04,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesencwide128kl -1536(,%rbp,2)<br>
+<br>
+// CHECK:      aesencwide128kl 6096(%rcx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x81,0xd0,0x17,0x00,0x00]<br>
+               aesencwide128kl 6096(%rcx)<br>
+<br>
+// CHECK:      aesencwide128kl -6144(%rdx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x82,0x00,0xe8,0xff,0xff]<br>
+               aesencwide128kl -6144(%rdx)<br>
+<br>
+// CHECK:      aesencwide256kl  268435456(%rbp,%r14,8)<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xd8,0x94,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesencwide256kl  268435456(%rbp,%r14,8)<br>
+<br>
+// CHECK:      aesencwide256kl  291(%r8,%rax,4)<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xd8,0x94,0x80,0x23,0x01,0x00,0x00]<br>
+               aesencwide256kl  291(%r8,%rax,4)<br>
+<br>
+// CHECK:      aesencwide256kl  (%rip)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x15,0x00,0x00,0x00,0x00]<br>
+               aesencwide256kl  (%rip)<br>
+<br>
+// CHECK:      aesencwide256kl  -2048(,%rbp,2)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x14,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesencwide256kl  -2048(,%rbp,2)<br>
+<br>
+// CHECK:      aesencwide256kl  8128(%rcx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x91,0xc0,0x1f,0x00,0x00]<br>
+               aesencwide256kl  8128(%rcx)<br>
+<br>
+// CHECK:      aesencwide256kl  -8192(%rdx)<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x92,0x00,0xe0,0xff,0xff]<br>
+               aesencwide256kl  -8192(%rdx)<br>
<br>
diff  --git a/llvm/test/MC/X86/KEYLOCKER/x86-64-keylocker-intel.s b/llvm/test/MC/X86/KEYLOCKER/x86-64-keylocker-intel.s<br>
new file mode 100644<br>
index 000000000000..cb8921acdc1f<br>
--- /dev/null<br>
+++ b/llvm/test/MC/X86/KEYLOCKER/x86-64-keylocker-intel.s<br>
@@ -0,0 +1,205 @@<br>
+// RUN: llvm-mc -triple x86_64-unknown-unknown -x86-asm-syntax=intel -output-asm-variant=1 --show-encoding %s | FileCheck %s<br>
+<br>
+// CHECK:      aesdec128kl xmm6, [rbp + 8*r14 + 268435456]<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xdd,0xb4,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesdec128kl xmm6, [rbp + 8*r14 + 268435456]<br>
+<br>
+// CHECK:      aesdec128kl xmm6, [r8 + 4*rax + 291]<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xdd,0xb4,0x80,0x23,0x01,0x00,0x00]<br>
+               aesdec128kl xmm6, [r8 + 4*rax + 291]<br>
+<br>
+// CHECK:      aesdec128kl xmm6, [rip]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x35,0x00,0x00,0x00,0x00]<br>
+               aesdec128kl xmm6, [rip]<br>
+<br>
+// CHECK:      aesdec128kl xmm6, [2*rbp - 1536]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0x34,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesdec128kl xmm6, [2*rbp - 1536]<br>
+<br>
+// CHECK:      aesdec128kl xmm6, [rcx + 6096]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0xb1,0xd0,0x17,0x00,0x00]<br>
+               aesdec128kl xmm6, [rcx + 6096]<br>
+<br>
+// CHECK:      aesdec128kl xmm6, [rdx - 6144]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdd,0xb2,0x00,0xe8,0xff,0xff]<br>
+               aesdec128kl xmm6, [rdx - 6144]<br>
+<br>
+// CHECK:      aesdec256kl xmm6, [rbp + 8*r14 + 268435456]<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xdf,0xb4,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesdec256kl xmm6, [rbp + 8*r14 + 268435456]<br>
+<br>
+// CHECK:      aesdec256kl xmm6, [r8 + 4*rax + 291]<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xdf,0xb4,0x80,0x23,0x01,0x00,0x00]<br>
+               aesdec256kl xmm6, [r8 + 4*rax + 291]<br>
+<br>
+// CHECK:      aesdec256kl xmm6, [rip]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x35,0x00,0x00,0x00,0x00]<br>
+               aesdec256kl xmm6, [rip]<br>
+<br>
+// CHECK:      aesdec256kl xmm6, [2*rbp - 2048]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0x34,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesdec256kl xmm6, [2*rbp - 2048]<br>
+<br>
+// CHECK:      aesdec256kl xmm6, [rcx + 8128]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0xb1,0xc0,0x1f,0x00,0x00]<br>
+               aesdec256kl xmm6, [rcx + 8128]<br>
+<br>
+// CHECK:      aesdec256kl xmm6, [rdx - 8192]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdf,0xb2,0x00,0xe0,0xff,0xff]<br>
+               aesdec256kl xmm6, [rdx - 8192]<br>
+<br>
+// CHECK:      aesenc128kl xmm6, [rbp + 8*r14 + 268435456]<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xdc,0xb4,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesenc128kl xmm6, [rbp + 8*r14 + 268435456]<br>
+<br>
+// CHECK:      aesenc128kl xmm6, [r8 + 4*rax + 291]<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xdc,0xb4,0x80,0x23,0x01,0x00,0x00]<br>
+               aesenc128kl xmm6, [r8 + 4*rax + 291]<br>
+<br>
+// CHECK:      aesenc128kl xmm6, [rip]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x35,0x00,0x00,0x00,0x00]<br>
+               aesenc128kl xmm6, [rip]<br>
+<br>
+// CHECK:      aesenc128kl xmm6, [2*rbp - 1536]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0x34,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesenc128kl xmm6, [2*rbp - 1536]<br>
+<br>
+// CHECK:      aesenc128kl xmm6, [rcx + 6096]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0xb1,0xd0,0x17,0x00,0x00]<br>
+               aesenc128kl xmm6, [rcx + 6096]<br>
+<br>
+// CHECK:      aesenc128kl xmm6, [rdx - 6144]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0xb2,0x00,0xe8,0xff,0xff]<br>
+               aesenc128kl xmm6, [rdx - 6144]<br>
+<br>
+// CHECK:      aesenc256kl xmm6, [rbp + 8*r14 + 268435456]<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xde,0xb4,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesenc256kl xmm6, [rbp + 8*r14 + 268435456]<br>
+<br>
+// CHECK:      aesenc256kl xmm6, [r8 + 4*rax + 291]<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xde,0xb4,0x80,0x23,0x01,0x00,0x00]<br>
+               aesenc256kl xmm6, [r8 + 4*rax + 291]<br>
+<br>
+// CHECK:      aesenc256kl xmm6, [rip]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x35,0x00,0x00,0x00,0x00]<br>
+               aesenc256kl xmm6, [rip]<br>
+<br>
+// CHECK:      aesenc256kl xmm6, [2*rbp - 2048]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0x34,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesenc256kl xmm6, [2*rbp - 2048]<br>
+<br>
+// CHECK:      aesenc256kl xmm6, [rcx + 8128]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0xb1,0xc0,0x1f,0x00,0x00]<br>
+               aesenc256kl xmm6, [rcx + 8128]<br>
+<br>
+// CHECK:      aesenc256kl xmm6, [rdx - 8192]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xde,0xb2,0x00,0xe0,0xff,0xff]<br>
+               aesenc256kl xmm6, [rdx - 8192]<br>
+<br>
+// CHECK:      encodekey128 ecx, ecx<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xfa,0xc9]<br>
+               encodekey128 ecx, ecx<br>
+<br>
+// CHECK:      encodekey256 ecx, ecx<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xfb,0xc9]<br>
+               encodekey256 ecx, ecx<br>
+<br>
+// CHECK:      loadiwkey xmm6, xmm7<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xdc,0xf7]<br>
+               loadiwkey xmm6, xmm7<br>
+<br>
+// CHECK:      aesdecwide128kl [rbp + 8*r14 + 268435456]<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xd8,0x8c,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesdecwide128kl [rbp + 8*r14 + 268435456]<br>
+<br>
+// CHECK:      aesdecwide128kl [r8 + 4*rax + 291]<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xd8,0x8c,0x80,0x23,0x01,0x00,0x00]<br>
+               aesdecwide128kl [r8 + 4*rax + 291]<br>
+<br>
+// CHECK:      aesdecwide128kl [rip]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x0d,0x00,0x00,0x00,0x00]<br>
+               aesdecwide128kl [rip]<br>
+<br>
+// CHECK:      aesdecwide128kl [2*rbp - 1536]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x0c,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesdecwide128kl [2*rbp - 1536]<br>
+<br>
+// CHECK:      aesdecwide128kl [rcx + 6096]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x89,0xd0,0x17,0x00,0x00]<br>
+               aesdecwide128kl [rcx + 6096]<br>
+<br>
+// CHECK:      aesdecwide128kl [rdx - 6144]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x8a,0x00,0xe8,0xff,0xff]<br>
+               aesdecwide128kl [rdx - 6144]<br>
+<br>
+// CHECK:      aesdecwide256kl [rbp + 8*r14 + 268435456]<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xd8,0x9c,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesdecwide256kl [rbp + 8*r14 + 268435456]<br>
+<br>
+// CHECK:      aesdecwide256kl [r8 + 4*rax + 291]<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xd8,0x9c,0x80,0x23,0x01,0x00,0x00]<br>
+               aesdecwide256kl [r8 + 4*rax + 291]<br>
+<br>
+// CHECK:      aesdecwide256kl [rip]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x1d,0x00,0x00,0x00,0x00]<br>
+               aesdecwide256kl [rip]<br>
+<br>
+// CHECK:      aesdecwide256kl [2*rbp - 2048]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x1c,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesdecwide256kl [2*rbp - 2048]<br>
+<br>
+// CHECK:      aesdecwide256kl [rcx + 8128]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x99,0xc0,0x1f,0x00,0x00]<br>
+               aesdecwide256kl [rcx + 8128]<br>
+<br>
+// CHECK:      aesdecwide256kl [rdx - 8192]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x9a,0x00,0xe0,0xff,0xff]<br>
+               aesdecwide256kl [rdx - 8192]<br>
+<br>
+// CHECK:      aesencwide128kl [rbp + 8*r14 + 268435456]<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xd8,0x84,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesencwide128kl [rbp + 8*r14 + 268435456]<br>
+<br>
+// CHECK:      aesencwide128kl [r8 + 4*rax + 291]<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xd8,0x84,0x80,0x23,0x01,0x00,0x00]<br>
+               aesencwide128kl [r8 + 4*rax + 291]<br>
+<br>
+// CHECK:      aesencwide128kl [rip]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x05,0x00,0x00,0x00,0x00]<br>
+               aesencwide128kl [rip]<br>
+<br>
+// CHECK:      aesencwide128kl [2*rbp - 1536]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x04,0x6d,0x00,0xfa,0xff,0xff]<br>
+               aesencwide128kl [2*rbp - 1536]<br>
+<br>
+// CHECK:      aesencwide128kl [rcx + 6096]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x81,0xd0,0x17,0x00,0x00]<br>
+               aesencwide128kl [rcx + 6096]<br>
+<br>
+// CHECK:      aesencwide128kl [rdx - 6144]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x82,0x00,0xe8,0xff,0xff]<br>
+               aesencwide128kl [rdx - 6144]<br>
+<br>
+// CHECK:      aesencwide256kl [rbp + 8*r14 + 268435456]<br>
+// CHECK: encoding: [0xf3,0x42,0x0f,0x38,0xd8,0x94,0xf5,0x00,0x00,0x00,0x10]<br>
+               aesencwide256kl [rbp + 8*r14 + 268435456]<br>
+<br>
+// CHECK:      aesencwide256kl [r8 + 4*rax + 291]<br>
+// CHECK: encoding: [0xf3,0x41,0x0f,0x38,0xd8,0x94,0x80,0x23,0x01,0x00,0x00]<br>
+               aesencwide256kl [r8 + 4*rax + 291]<br>
+<br>
+// CHECK:      aesencwide256kl [rip]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x15,0x00,0x00,0x00,0x00]<br>
+               aesencwide256kl [rip]<br>
+<br>
+// CHECK:      aesencwide256kl [2*rbp - 2048]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x14,0x6d,0x00,0xf8,0xff,0xff]<br>
+               aesencwide256kl [2*rbp - 2048]<br>
+<br>
+// CHECK:      aesencwide256kl [rcx + 8128]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x91,0xc0,0x1f,0x00,0x00]<br>
+               aesencwide256kl [rcx + 8128]<br>
+<br>
+// CHECK:      aesencwide256kl [rdx - 8192]<br>
+// CHECK: encoding: [0xf3,0x0f,0x38,0xd8,0x92,0x00,0xe0,0xff,0xff]<br>
+               aesencwide256kl [rdx - 8192]<br>
<br>
diff  --git a/llvm/utils/TableGen/IntrinsicEmitter.cpp b/llvm/utils/TableGen/IntrinsicEmitter.cpp<br>
index 4e368fac2c83..6a8a60d00639 100644<br>
--- a/llvm/utils/TableGen/IntrinsicEmitter.cpp<br>
+++ b/llvm/utils/TableGen/IntrinsicEmitter.cpp<br>
@@ -246,7 +246,8 @@ enum IIT_Info {<br>
   IIT_SUBDIVIDE4_ARG = 45,<br>
   IIT_VEC_OF_BITCASTS_TO_INT = 46,<br>
   IIT_V128 = 47,<br>
-  IIT_BF16 = 48<br>
+  IIT_BF16 = 48,<br>
+  IIT_STRUCT9 = 49<br>
 };<br>
<br>
 static void EncodeFixedValueType(MVT::SimpleValueType VT,<br>
@@ -469,6 +470,7 @@ static void ComputeFixedEncoding(const CodeGenIntrinsic &Int,<br>
       case 6: TypeSig.push_back(IIT_STRUCT6); break;<br>
       case 7: TypeSig.push_back(IIT_STRUCT7); break;<br>
       case 8: TypeSig.push_back(IIT_STRUCT8); break;<br>
+      case 9: TypeSig.push_back(IIT_STRUCT9); break;<br>
       default: llvm_unreachable("Unhandled case in struct");<br>
     }<br>
<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div></div>