[clang] 413577a - [X86] Support Intel Key Locker

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Sep 30 11:08:34 PDT 2020


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.

On Wed, 30 Sep 2020 at 03:09, Xiang1 Zhang via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

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


More information about the cfe-commits mailing list