@@ -6706,31 +6706,31 @@ let Constraints = "$src1 = $dst" in {
6706
6706
6707
6707
// FIXME: Is there a better scheduler class for SHA than WriteVecIMul?
6708
6708
multiclass SHAI_binop<bits<8> Opc, string OpcodeStr, Intrinsic IntId,
6709
- X86FoldableSchedWrite sched, bit UsesXMM0 = 0> {
6710
- def rr : I<Opc, MRMSrcReg, (outs VR128:$dst),
6711
- (ins VR128:$src1, VR128:$src2),
6712
- !if(UsesXMM0,
6713
- !strconcat(OpcodeStr, "\t{%xmm0, $src2, $dst|$dst, $src2, xmm0}"),
6714
- !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}")),
6715
- [!if(UsesXMM0,
6716
- (set VR128:$dst, (IntId VR128:$src1, VR128:$src2, XMM0)),
6717
- (set VR128:$dst, (IntId VR128:$src1, VR128:$src2)))]>,
6718
- T8PS, Sched<[sched]>;
6719
-
6720
- def rm : I<Opc, MRMSrcMem, (outs VR128:$dst),
6721
- (ins VR128:$src1, i128mem:$src2),
6722
- !if(UsesXMM0,
6723
- !strconcat(OpcodeStr, "\t{%xmm0, $src2, $dst|$dst, $src2, xmm0}"),
6724
- !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}")),
6725
- [!if(UsesXMM0,
6726
- (set VR128:$dst, (IntId VR128:$src1,
6727
- (memop addr:$src2), XMM0)),
6728
- (set VR128:$dst, (IntId VR128:$src1,
6729
- (memop addr:$src2))))]>, T8PS,
6730
- Sched<[sched.Folded, sched.ReadAfterFold]>;
6709
+ X86FoldableSchedWrite sched, string Suffix = "", bit UsesXMM0 = 0> {
6710
+ def rr#Suffix : I<Opc, MRMSrcReg, (outs VR128:$dst),
6711
+ (ins VR128:$src1, VR128:$src2),
6712
+ !if(UsesXMM0,
6713
+ !strconcat(OpcodeStr, "\t{%xmm0, $src2, $dst|$dst, $src2, xmm0}"),
6714
+ !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}")),
6715
+ [!if(UsesXMM0,
6716
+ (set VR128:$dst, (IntId VR128:$src1, VR128:$src2, XMM0)),
6717
+ (set VR128:$dst, (IntId VR128:$src1, VR128:$src2)))]>,
6718
+ T8PS, Sched<[sched]>;
6719
+
6720
+ def rm#Suffix : I<Opc, MRMSrcMem, (outs VR128:$dst),
6721
+ (ins VR128:$src1, i128mem:$src2),
6722
+ !if(UsesXMM0,
6723
+ !strconcat(OpcodeStr, "\t{%xmm0, $src2, $dst|$dst, $src2, xmm0}"),
6724
+ !strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}")),
6725
+ [!if(UsesXMM0,
6726
+ (set VR128:$dst, (IntId VR128:$src1,
6727
+ (memop addr:$src2), XMM0)),
6728
+ (set VR128:$dst, (IntId VR128:$src1,
6729
+ (memop addr:$src2))))]>, T8PS,
6730
+ Sched<[sched.Folded, sched.ReadAfterFold]>;
6731
6731
}
6732
6732
6733
- let Constraints = "$src1 = $dst", Predicates = [HasSHA] in {
6733
+ let Constraints = "$src1 = $dst", Predicates = [HasSHA, NoEGPR ] in {
6734
6734
def SHA1RNDS4rri : Ii8<0xCC, MRMSrcReg, (outs VR128:$dst),
6735
6735
(ins VR128:$src1, VR128:$src2, u8imm:$src3),
6736
6736
"sha1rnds4\t{$src3, $src2, $dst|$dst, $src2, $src3}",
@@ -6757,19 +6757,55 @@ let Constraints = "$src1 = $dst", Predicates = [HasSHA] in {
6757
6757
6758
6758
let Uses=[XMM0] in
6759
6759
defm SHA256RNDS2 : SHAI_binop<0xCB, "sha256rnds2", int_x86_sha256rnds2,
6760
- SchedWriteVecIMul.XMM, 1>;
6760
+ SchedWriteVecIMul.XMM, "", 1>;
6761
6761
6762
6762
defm SHA256MSG1 : SHAI_binop<0xCC, "sha256msg1", int_x86_sha256msg1,
6763
6763
SchedWriteVecIMul.XMM>;
6764
6764
defm SHA256MSG2 : SHAI_binop<0xCD, "sha256msg2", int_x86_sha256msg2,
6765
6765
SchedWriteVecIMul.XMM>;
6766
6766
}
6767
6767
6768
- // Aliases with explicit %xmm0
6769
- def : InstAlias<"sha256rnds2\t{$src2, $dst|$dst, $src2}",
6770
- (SHA256RNDS2rr VR128:$dst, VR128:$src2), 0>;
6771
- def : InstAlias<"sha256rnds2\t{$src2, $dst|$dst, $src2}",
6772
- (SHA256RNDS2rm VR128:$dst, i128mem:$src2), 0>;
6768
+ let Constraints = "$src1 = $dst", Predicates = [HasSHA, HasEGPR, In64BitMode] in {
6769
+ def SHA1RNDS4rri_EVEX: Ii8<0xD4, MRMSrcReg, (outs VR128:$dst),
6770
+ (ins VR128:$src1, VR128:$src2, u8imm:$src3),
6771
+ "sha1rnds4\t{$src3, $src2, $dst|$dst, $src2, $src3}",
6772
+ [(set VR128:$dst,
6773
+ (int_x86_sha1rnds4 VR128:$src1, VR128:$src2,
6774
+ (i8 timm:$src3)))]>,
6775
+ EVEX_NoCD8, T_MAP4PS, Sched<[SchedWriteVecIMul.XMM]>;
6776
+ def SHA1RNDS4rmi_EVEX: Ii8<0xD4, MRMSrcMem, (outs VR128:$dst),
6777
+ (ins VR128:$src1, i128mem:$src2, u8imm:$src3),
6778
+ "sha1rnds4\t{$src3, $src2, $dst|$dst, $src2, $src3}",
6779
+ [(set VR128:$dst,
6780
+ (int_x86_sha1rnds4 VR128:$src1,
6781
+ (memop addr:$src2),
6782
+ (i8 timm:$src3)))]>,
6783
+ EVEX_NoCD8, T_MAP4PS,
6784
+ Sched<[SchedWriteVecIMul.XMM.Folded,
6785
+ SchedWriteVecIMul.XMM.ReadAfterFold]>;
6786
+
6787
+ defm SHA1NEXTE : SHAI_binop<0xD8, "sha1nexte", int_x86_sha1nexte,
6788
+ SchedWriteVecIMul.XMM, "_EVEX">,
6789
+ EVEX_NoCD8, T_MAP4PS;
6790
+ defm SHA1MSG1 : SHAI_binop<0xD9, "sha1msg1", int_x86_sha1msg1,
6791
+ SchedWriteVecIMul.XMM, "_EVEX">,
6792
+ EVEX_NoCD8, T_MAP4PS;
6793
+ defm SHA1MSG2 : SHAI_binop<0xDA, "sha1msg2", int_x86_sha1msg2,
6794
+ SchedWriteVecIMul.XMM, "_EVEX">,
6795
+ EVEX_NoCD8, T_MAP4PS;
6796
+
6797
+ let Uses=[XMM0] in
6798
+ defm SHA256RNDS2 : SHAI_binop<0xDB, "sha256rnds2", int_x86_sha256rnds2,
6799
+ SchedWriteVecIMul.XMM, "_EVEX", 1>,
6800
+ EVEX_NoCD8, T_MAP4PS;
6801
+
6802
+ defm SHA256MSG1 : SHAI_binop<0xDC, "sha256msg1", int_x86_sha256msg1,
6803
+ SchedWriteVecIMul.XMM, "_EVEX">,
6804
+ EVEX_NoCD8, T_MAP4PS;
6805
+ defm SHA256MSG2 : SHAI_binop<0xDD, "sha256msg2", int_x86_sha256msg2,
6806
+ SchedWriteVecIMul.XMM, "_EVEX">,
6807
+ EVEX_NoCD8, T_MAP4PS;
6808
+ }
6773
6809
6774
6810
//===----------------------------------------------------------------------===//
6775
6811
// AES-NI Instructions
0 commit comments