Skip to content

Commit 250e98e

Browse files
committed
[X86][NFC] Simplify the definition of ANDN by using class ITy
1 parent dc1fade commit 250e98e

File tree

2 files changed

+22
-27
lines changed

2 files changed

+22
-27
lines changed

llvm/lib/Target/X86/X86InstrArithmetic.td

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,36 +1089,30 @@ def : Pat<(X86testpat (loadi64 addr:$src1), i64relocImmSExt32_su:$src2),
10891089
//===----------------------------------------------------------------------===//
10901090
// ANDN Instruction
10911091
//
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;
11161108
}
11171109

11181110
// 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]>;
11221116
}
11231117

11241118
let Predicates = [HasBMI], AddedComplexity = -6 in {

llvm/lib/Target/X86/X86InstrUtils.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,3 +969,4 @@ class ITy<bits<8> opcode, Format f, X86TypeInfo typeinfo, dag outs, dag ins,
969969
}
970970

971971
defvar binop_args = "{$src2, $src1|$src1, $src2}";
972+
defvar binop_ndd_args = "{$src2, $src1, $dst|$dst, $src1, $src2}";

0 commit comments

Comments
 (0)