1413577a8SXiang1 Zhang//===---------------------------*-tablegen-*-------------------------------===// 2413577a8SXiang1 Zhang//===------------- X86InstrKL.td - KL Instruction Set Extension -----------===// 3413577a8SXiang1 Zhang// 4c874dd53SChristopher Di Bella// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5c874dd53SChristopher Di Bella// See https://llvm.org/LICENSE.txt for license information. 6c874dd53SChristopher Di Bella// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7413577a8SXiang1 Zhang// 8413577a8SXiang1 Zhang//===----------------------------------------------------------------------===// 9413577a8SXiang1 Zhang// 10413577a8SXiang1 Zhang// This file describes the instructions that make up the Intel key locker 11413577a8SXiang1 Zhang// instruction set. 12413577a8SXiang1 Zhang// 13413577a8SXiang1 Zhang//===----------------------------------------------------------------------===// 14413577a8SXiang1 Zhang 15413577a8SXiang1 Zhang//===----------------------------------------------------------------------===// 16413577a8SXiang1 Zhang// Key Locker instructions 176d0080b5SXinWang10class Encodekey<bits<8> opcode, string m> 186d0080b5SXinWang10 : I<opcode, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src), m#"\t{$src, $dst|$dst, $src}", []>, 196d0080b5SXinWang10 NoCD8, XS; 20413577a8SXiang1 Zhang 216d0080b5SXinWang10multiclass Aesencdec<string suffix> { 226d0080b5SXinWang10 def AESENC128KL#suffix : I<0xDC, MRMSrcMem, (outs VR128:$dst), 236d0080b5SXinWang10 (ins VR128:$src1, opaquemem:$src2), 246d0080b5SXinWang10 "aesenc128kl\t{$src2, $src1|$src1, $src2}", 256d0080b5SXinWang10 [(set VR128:$dst, EFLAGS, (X86aesenc128kl VR128:$src1, addr:$src2))]>, 266d0080b5SXinWang10 NoCD8, XS; 276d0080b5SXinWang10 def AESDEC128KL#suffix : I<0xDD, MRMSrcMem, (outs VR128:$dst), 286d0080b5SXinWang10 (ins VR128:$src1, opaquemem:$src2), 296d0080b5SXinWang10 "aesdec128kl\t{$src2, $src1|$src1, $src2}", 306d0080b5SXinWang10 [(set VR128:$dst, EFLAGS, (X86aesdec128kl VR128:$src1, addr:$src2))]>, 316d0080b5SXinWang10 NoCD8, XS; 326d0080b5SXinWang10 def AESENC256KL#suffix : I<0xDE, MRMSrcMem, (outs VR128:$dst), 336d0080b5SXinWang10 (ins VR128:$src1, opaquemem:$src2), 346d0080b5SXinWang10 "aesenc256kl\t{$src2, $src1|$src1, $src2}", 356d0080b5SXinWang10 [(set VR128:$dst, EFLAGS, (X86aesenc256kl VR128:$src1, addr:$src2))]>, 366d0080b5SXinWang10 NoCD8, XS; 376d0080b5SXinWang10 def AESDEC256KL#suffix : I<0xDF, MRMSrcMem, (outs VR128:$dst), 386d0080b5SXinWang10 (ins VR128:$src1, opaquemem:$src2), 396d0080b5SXinWang10 "aesdec256kl\t{$src2, $src1|$src1, $src2}", 406d0080b5SXinWang10 [(set VR128:$dst, EFLAGS, (X86aesdec256kl VR128:$src1, addr:$src2))]>, 416d0080b5SXinWang10 NoCD8, XS; 426d0080b5SXinWang10} 436d0080b5SXinWang10 446d0080b5SXinWang10let SchedRW = [WriteSystem] in { 456d0080b5SXinWang10 let Uses = [XMM0, EAX], Defs = [EFLAGS], Predicates = [HasKL] in { 46e2dd86bbSCraig Topper def LOADIWKEY : I<0xDC, MRMSrcReg, (outs), (ins VR128:$src1, VR128:$src2), 47413577a8SXiang1 Zhang "loadiwkey\t{$src2, $src1|$src1, $src2}", 48ff32ab3aSShengchen Kan [(int_x86_loadiwkey XMM0, VR128:$src1, VR128:$src2, EAX)]>, T8, XS; 49413577a8SXiang1 Zhang } 50413577a8SXiang1 Zhang 51*de3e4a9dSFreddy Ye let Predicates = [HasKL] in { 526d0080b5SXinWang10 let Uses = [XMM0], Defs = [XMM0, XMM1, XMM2, XMM4, XMM5, XMM6, EFLAGS] in 536d0080b5SXinWang10 def ENCODEKEY128 : Encodekey<0xFA, "encodekey128">, T8; 546d0080b5SXinWang10 556d0080b5SXinWang10 let Uses = [XMM0, XMM1], Defs = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, EFLAGS] in 566d0080b5SXinWang10 def ENCODEKEY256 : Encodekey<0xFB, "encodekey256">, T8; 576d0080b5SXinWang10 586d0080b5SXinWang10 let Constraints = "$src1 = $dst", Defs = [EFLAGS] in 596d0080b5SXinWang10 defm "" : Aesencdec<"">, T8; 60413577a8SXiang1 Zhang } 616d0080b5SXinWang10} // SchedRW 626d0080b5SXinWang10 636d0080b5SXinWang10multiclass Aesencdecwide<string suffix> { 646d0080b5SXinWang10 def AESENCWIDE128KL#suffix : I<0xD8, MRM0m, (outs), (ins opaquemem:$src), "aesencwide128kl\t$src", []>, NoCD8, XS; 656d0080b5SXinWang10 def AESDECWIDE128KL#suffix : I<0xD8, MRM1m, (outs), (ins opaquemem:$src), "aesdecwide128kl\t$src", []>, NoCD8, XS; 666d0080b5SXinWang10 def AESENCWIDE256KL#suffix : I<0xD8, MRM2m, (outs), (ins opaquemem:$src), "aesencwide256kl\t$src", []>, NoCD8, XS; 676d0080b5SXinWang10 def AESDECWIDE256KL#suffix : I<0xD8, MRM3m, (outs), (ins opaquemem:$src), "aesdecwide256kl\t$src", []>, NoCD8, XS; 68413577a8SXiang1 Zhang} 69413577a8SXiang1 Zhang 706d0080b5SXinWang10let SchedRW = [WriteSystem], Uses = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7], 716d0080b5SXinWang10 Defs = [EFLAGS, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7], mayLoad = 1 in { 72*de3e4a9dSFreddy Ye let Predicates = [HasWIDEKL] in 736d0080b5SXinWang10 defm "" : Aesencdecwide<"">, T8; 746d0080b5SXinWang10} // SchedRW 75