|
14 | 14 |
|
15 | 15 | //===----------------------------------------------------------------------===//
|
16 | 16 | // Key Locker instructions
|
| 17 | +class Encodekey<bits<8> opcode, string m> |
| 18 | + : I<opcode, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src), m#"\t{$src, $dst|$dst, $src}", []>, |
| 19 | + NoCD8, XS; |
17 | 20 |
|
18 |
| -let SchedRW = [WriteSystem], Predicates = [HasKL] in { |
19 |
| - let Uses = [XMM0, EAX], Defs = [EFLAGS] in { |
| 21 | +multiclass Aesencdec<string suffix> { |
| 22 | + def AESENC128KL#suffix : I<0xDC, MRMSrcMem, (outs VR128:$dst), |
| 23 | + (ins VR128:$src1, opaquemem:$src2), |
| 24 | + "aesenc128kl\t{$src2, $src1|$src1, $src2}", |
| 25 | + [(set VR128:$dst, EFLAGS, (X86aesenc128kl VR128:$src1, addr:$src2))]>, |
| 26 | + NoCD8, XS; |
| 27 | + def AESDEC128KL#suffix : I<0xDD, MRMSrcMem, (outs VR128:$dst), |
| 28 | + (ins VR128:$src1, opaquemem:$src2), |
| 29 | + "aesdec128kl\t{$src2, $src1|$src1, $src2}", |
| 30 | + [(set VR128:$dst, EFLAGS, (X86aesdec128kl VR128:$src1, addr:$src2))]>, |
| 31 | + NoCD8, XS; |
| 32 | + def AESENC256KL#suffix : I<0xDE, MRMSrcMem, (outs VR128:$dst), |
| 33 | + (ins VR128:$src1, opaquemem:$src2), |
| 34 | + "aesenc256kl\t{$src2, $src1|$src1, $src2}", |
| 35 | + [(set VR128:$dst, EFLAGS, (X86aesenc256kl VR128:$src1, addr:$src2))]>, |
| 36 | + NoCD8, XS; |
| 37 | + def AESDEC256KL#suffix : I<0xDF, MRMSrcMem, (outs VR128:$dst), |
| 38 | + (ins VR128:$src1, opaquemem:$src2), |
| 39 | + "aesdec256kl\t{$src2, $src1|$src1, $src2}", |
| 40 | + [(set VR128:$dst, EFLAGS, (X86aesdec256kl VR128:$src1, addr:$src2))]>, |
| 41 | + NoCD8, XS; |
| 42 | +} |
| 43 | + |
| 44 | +let SchedRW = [WriteSystem] in { |
| 45 | + let Uses = [XMM0, EAX], Defs = [EFLAGS], Predicates = [HasKL] in { |
20 | 46 | def LOADIWKEY : I<0xDC, MRMSrcReg, (outs), (ins VR128:$src1, VR128:$src2),
|
21 | 47 | "loadiwkey\t{$src2, $src1|$src1, $src2}",
|
22 | 48 | [(int_x86_loadiwkey XMM0, VR128:$src1, VR128:$src2, EAX)]>, T8, XS;
|
23 | 49 | }
|
24 | 50 |
|
25 |
| - let Uses = [XMM0], Defs = [XMM0, XMM1, XMM2, XMM4, XMM5, XMM6, EFLAGS] in { |
26 |
| - def ENCODEKEY128 : I<0xFA, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src), |
27 |
| - "encodekey128\t{$src, $dst|$dst, $src}", []>, T8, XS; |
28 |
| - } |
| 51 | + let Predicates = [HasKL, NoEGPR] in { |
| 52 | + let Uses = [XMM0], Defs = [XMM0, XMM1, XMM2, XMM4, XMM5, XMM6, EFLAGS] in |
| 53 | + def ENCODEKEY128 : Encodekey<0xFA, "encodekey128">, T8; |
29 | 54 |
|
30 |
| - let Uses = [XMM0, XMM1], Defs = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, EFLAGS] in { |
31 |
| - def ENCODEKEY256 : I<0xFB, MRMSrcReg, (outs GR32:$dst), (ins GR32:$src), |
32 |
| - "encodekey256\t{$src, $dst|$dst, $src}", []>, T8, XS; |
33 |
| - } |
| 55 | + let Uses = [XMM0, XMM1], Defs = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, EFLAGS] in |
| 56 | + def ENCODEKEY256 : Encodekey<0xFB, "encodekey256">, T8; |
34 | 57 |
|
35 |
| - let Constraints = "$src1 = $dst", |
36 |
| - Defs = [EFLAGS] in { |
37 |
| - def AESENC128KL : I<0xDC, MRMSrcMem, (outs VR128:$dst), (ins VR128:$src1, opaquemem:$src2), |
38 |
| - "aesenc128kl\t{$src2, $src1|$src1, $src2}", |
39 |
| - [(set VR128:$dst, EFLAGS, |
40 |
| - (X86aesenc128kl VR128:$src1, addr:$src2))]>, T8, XS; |
| 58 | + let Constraints = "$src1 = $dst", Defs = [EFLAGS] in |
| 59 | + defm "" : Aesencdec<"">, T8; |
| 60 | + } |
41 | 61 |
|
42 |
| - def AESDEC128KL : I<0xDD, MRMSrcMem, (outs VR128:$dst), (ins VR128:$src1, opaquemem:$src2), |
43 |
| - "aesdec128kl\t{$src2, $src1|$src1, $src2}", |
44 |
| - [(set VR128:$dst, EFLAGS, |
45 |
| - (X86aesdec128kl VR128:$src1, addr:$src2))]>, T8, XS; |
| 62 | + let Predicates = [HasKL, HasEGPR, In64BitMode] in { |
| 63 | + let Uses = [XMM0], Defs = [XMM0, XMM1, XMM2, XMM4, XMM5, XMM6, EFLAGS] in |
| 64 | + def ENCODEKEY128_EVEX : Encodekey<0xDA, "encodekey128">, EVEX, T_MAP4; |
46 | 65 |
|
47 |
| - def AESENC256KL : I<0xDE, MRMSrcMem, (outs VR128:$dst), (ins VR128:$src1, opaquemem:$src2), |
48 |
| - "aesenc256kl\t{$src2, $src1|$src1, $src2}", |
49 |
| - [(set VR128:$dst, EFLAGS, |
50 |
| - (X86aesenc256kl VR128:$src1, addr:$src2))]>, T8, XS; |
| 66 | + let Uses = [XMM0, XMM1], Defs = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, EFLAGS] in |
| 67 | + def ENCODEKEY256_EVEX : Encodekey<0xDB, "encodekey256">, EVEX, T_MAP4; |
51 | 68 |
|
52 |
| - def AESDEC256KL : I<0xDF, MRMSrcMem, (outs VR128:$dst), (ins VR128:$src1, opaquemem:$src2), |
53 |
| - "aesdec256kl\t{$src2, $src1|$src1, $src2}", |
54 |
| - [(set VR128:$dst, EFLAGS, |
55 |
| - (X86aesdec256kl VR128:$src1, addr:$src2))]>, T8, XS; |
| 69 | + let Constraints = "$src1 = $dst", Defs = [EFLAGS] in |
| 70 | + defm "" : Aesencdec<"_EVEX">, EVEX, T_MAP4; |
56 | 71 | }
|
| 72 | +} // SchedRW |
57 | 73 |
|
58 |
| -} // SchedRW, Predicates |
| 74 | +multiclass Aesencdecwide<string suffix> { |
| 75 | + def AESENCWIDE128KL#suffix : I<0xD8, MRM0m, (outs), (ins opaquemem:$src), "aesencwide128kl\t$src", []>, NoCD8, XS; |
| 76 | + def AESDECWIDE128KL#suffix : I<0xD8, MRM1m, (outs), (ins opaquemem:$src), "aesdecwide128kl\t$src", []>, NoCD8, XS; |
| 77 | + def AESENCWIDE256KL#suffix : I<0xD8, MRM2m, (outs), (ins opaquemem:$src), "aesencwide256kl\t$src", []>, NoCD8, XS; |
| 78 | + def AESDECWIDE256KL#suffix : I<0xD8, MRM3m, (outs), (ins opaquemem:$src), "aesdecwide256kl\t$src", []>, NoCD8, XS; |
| 79 | +} |
59 | 80 |
|
60 |
| -let SchedRW = [WriteSystem], Predicates = [HasWIDEKL] in { |
61 |
| - let Uses = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7], |
62 |
| - Defs = [EFLAGS, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7], |
63 |
| - mayLoad = 1 in { |
64 |
| - def AESENCWIDE128KL : I<0xD8, MRM0m, (outs), (ins opaquemem:$src), |
65 |
| - "aesencwide128kl\t$src", []>, T8, XS; |
66 |
| - def AESDECWIDE128KL : I<0xD8, MRM1m, (outs), (ins opaquemem:$src), |
67 |
| - "aesdecwide128kl\t$src", []>, T8, XS; |
68 |
| - def AESENCWIDE256KL : I<0xD8, MRM2m, (outs), (ins opaquemem:$src), |
69 |
| - "aesencwide256kl\t$src", []>, T8, XS; |
70 |
| - def AESDECWIDE256KL : I<0xD8, MRM3m, (outs), (ins opaquemem:$src), |
71 |
| - "aesdecwide256kl\t$src", []>, T8, XS; |
72 |
| - } |
| 81 | +let SchedRW = [WriteSystem], Uses = [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7], |
| 82 | + Defs = [EFLAGS, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7], mayLoad = 1 in { |
| 83 | + let Predicates = [HasWIDEKL, NoEGPR] in |
| 84 | + defm "" : Aesencdecwide<"">, T8; |
73 | 85 |
|
74 |
| -} // SchedRW, Predicates |
| 86 | + let Predicates = [HasWIDEKL, HasEGPR, In64BitMode] in |
| 87 | + defm "" : Aesencdecwide<"_EVEX">, EVEX, T_MAP4; |
| 88 | +} // SchedRW |
0 commit comments