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