@@ -1089,36 +1089,30 @@ def : Pat<(X86testpat (loadi64 addr:$src1), i64relocImmSExt32_su:$src2),
1089
1089
//===----------------------------------------------------------------------===//
1090
1090
// ANDN Instruction
1091
1091
//
1092
- multiclass bmi_andn<string mnemonic, RegisterClass RC, X86MemOperand x86memop,
1093
- PatFrag ld_frag, X86FoldableSchedWrite sched> {
1094
- let Predicates = [HasBMI, NoEGPR] in {
1095
- def rr : I<0xF2, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2),
1096
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1097
- [(set RC:$dst, EFLAGS, (X86and_flag (not RC:$src1), RC:$src2))]>,
1098
- VEX, VVVV, Sched<[sched]>;
1099
- def rm : I<0xF2, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2),
1100
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1101
- [(set RC:$dst, EFLAGS,
1102
- (X86and_flag (not RC:$src1), (ld_frag addr:$src2)))]>,
1103
- VEX, VVVV, Sched<[sched.Folded, sched.ReadAfterFold]>;
1104
- }
1105
- let Predicates = [HasBMI, HasEGPR, In64BitMode] in {
1106
- def rr_EVEX : I<0xF2, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2),
1107
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1108
- [(set RC:$dst, EFLAGS, (X86and_flag (not RC:$src1), RC:$src2))]>,
1109
- EVEX, VVVV, Sched<[sched]>;
1110
- def rm_EVEX : I<0xF2, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2),
1111
- !strconcat(mnemonic, "\t{$src2, $src1, $dst|$dst, $src1, $src2}"),
1112
- [(set RC:$dst, EFLAGS,
1113
- (X86and_flag (not RC:$src1), (ld_frag addr:$src2)))]>,
1114
- EVEX, VVVV, Sched<[sched.Folded, sched.ReadAfterFold]>;
1115
- }
1092
+ multiclass AndN<X86TypeInfo t, string suffix> {
1093
+ defvar andn_rr_p =
1094
+ [(set t.RegClass:$dst, EFLAGS, (X86and_flag (not t.RegClass:$src1),
1095
+ t.RegClass:$src2))];
1096
+ defvar andn_rm_p =
1097
+ [(set t.RegClass:$dst, EFLAGS, (X86and_flag (not t.RegClass:$src1),
1098
+ (t.LoadNode addr:$src2)))];
1099
+ def rr#suffix : ITy<0xF2, MRMSrcReg, t, (outs t.RegClass:$dst),
1100
+ (ins t.RegClass:$src1, t.RegClass:$src2), "andn",
1101
+ binop_ndd_args, andn_rr_p>, VVVV, Sched<[WriteALU]>,
1102
+ T8, DefEFLAGS;
1103
+ def rm#suffix : ITy<0xF2, MRMSrcMem, t, (outs t.RegClass:$dst),
1104
+ (ins t.RegClass:$src1, t.MemOperand:$src2), "andn",
1105
+ binop_ndd_args, andn_rm_p>, VVVV,
1106
+ Sched<[WriteALU.Folded, WriteALU.ReadAfterFold]>,
1107
+ T8, DefEFLAGS;
1116
1108
}
1117
1109
1118
1110
// Complexity is reduced to give and with immediate a chance to match first.
1119
- let Defs = [EFLAGS], AddedComplexity = -6 in {
1120
- defm ANDN32 : bmi_andn<"andn{l}", GR32, i32mem, loadi32, WriteALU>, T8;
1121
- defm ANDN64 : bmi_andn<"andn{q}", GR64, i64mem, loadi64, WriteALU>, T8, REX_W;
1111
+ let AddedComplexity = -6 in {
1112
+ defm ANDN32 : AndN<Xi32, "">, VEX, Requires<[HasBMI, NoEGPR]>;
1113
+ defm ANDN64 : AndN<Xi64, "">, VEX, REX_W, Requires<[HasBMI, NoEGPR]>;
1114
+ defm ANDN32 : AndN<Xi32, "_EVEX">, EVEX, Requires<[HasBMI, HasEGPR, In64BitMode]>;
1115
+ defm ANDN64 : AndN<Xi64, "_EVEX">, EVEX, REX_W, Requires<[HasBMI, HasEGPR, In64BitMode]>;
1122
1116
}
1123
1117
1124
1118
let Predicates = [HasBMI], AddedComplexity = -6 in {
0 commit comments