Skip to content

Commit 689db42

Browse files
authored
[X86][NFC] Reorgnize the X86Instr*.td (#74454)
1. Move all pattern fragments for SIMD instructions to X86InstrFragmentsSIMD.td 2. Create X86InstrFragments.td and move non-SIMD pattern fragments into it 3. Create X86InstrOperands.td and move operand definitions into it 4. Create X86InstrPredicates.td and move predicate definitions into it 5. Create X86InstrUtils.td and move utilities for simplifying the instruction definitions into it
1 parent 4699789 commit 689db42

14 files changed

+2681
-2651
lines changed

llvm/lib/Target/X86/X86Instr3DNow.td

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,16 +79,6 @@ let SchedRW = [WriteEMMS],
7979
def FEMMS : I3DNow<0x0E, RawFrm, (outs), (ins), "femms",
8080
[(int_x86_mmx_femms)]>, TB;
8181

82-
// PREFETCHWT1 is supported we want to use it for everything but T0.
83-
def PrefetchWLevel : PatFrag<(ops), (i32 timm), [{
84-
return N->getSExtValue() == 3 || !Subtarget->hasPREFETCHWT1();
85-
}]>;
86-
87-
// Use PREFETCHWT1 for NTA, T2, T1.
88-
def PrefetchWT1Level : TImmLeaf<i32, [{
89-
return Imm < 3;
90-
}]>;
91-
9282
let SchedRW = [WriteLoad] in {
9383
let Predicates = [Has3DNow, NoSSEPrefetch] in
9484
def PREFETCH : I3DNow<0x0D, MRM0m, (outs), (ins i8mem:$addr),

llvm/lib/Target/X86/X86InstrAVX512.td

Lines changed: 0 additions & 283 deletions
Large diffs are not rendered by default.

llvm/lib/Target/X86/X86InstrArithmetic.td

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,6 @@ def PLEA64r : PseudoI<(outs GR64:$dst), (ins anymem:$src), []>;
4848
// Fixed-Register Multiplication and Division Instructions.
4949
//
5050

51-
// SchedModel info for instruction that loads one value and gets the second
52-
// (and possibly third) value from a register.
53-
// This is used for instructions that put the memory operands before other
54-
// uses.
55-
class SchedLoadReg<X86FoldableSchedWrite Sched> : Sched<[Sched.Folded,
56-
// Memory operand.
57-
ReadDefault, ReadDefault, ReadDefault, ReadDefault, ReadDefault,
58-
// Register reads (implicit or explicit).
59-
Sched.ReadAfterFold, Sched.ReadAfterFold]>;
60-
6151
// BinOpRR - Binary instructions with inputs "reg, reg".
6252
class BinOpRR<bits<8> opcode, string mnemonic, X86TypeInfo typeinfo,
6353
dag outlist, X86FoldableSchedWrite sched, list<dag> pattern>
@@ -506,17 +496,6 @@ class IMulOpRMI<bits<8> opcode, string mnemonic, X86TypeInfo info,
506496
let ImmT = info.ImmEncoding;
507497
}
508498

509-
def X86add_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs),
510-
(X86add_flag node:$lhs, node:$rhs), [{
511-
return hasNoCarryFlagUses(SDValue(N, 1));
512-
}]>;
513-
514-
def X86sub_flag_nocf : PatFrag<(ops node:$lhs, node:$rhs),
515-
(X86sub_flag node:$lhs, node:$rhs), [{
516-
// Only use DEC if the result is used.
517-
return !SDValue(N, 0).use_empty() && hasNoCarryFlagUses(SDValue(N, 1));
518-
}]>;
519-
520499
let Defs = [EFLAGS] in {
521500
let Constraints = "$src1 = $dst", SchedRW = [WriteALU] in {
522501
// Short forms only valid in 32-bit mode. Selected during MCInst lowering.
@@ -1221,9 +1200,6 @@ def : Pat<(store (X86adc_flag i64relocImmSExt32_su:$src, (load addr:$dst), EFLAG
12211200
// generate a result. From an encoding perspective, they are very different:
12221201
// they don't have all the usual imm8 and REV forms, and are encoded into a
12231202
// different space.
1224-
def X86testpat : PatFrag<(ops node:$lhs, node:$rhs),
1225-
(X86cmp (and_su node:$lhs, node:$rhs), 0)>;
1226-
12271203
let isCompare = 1 in {
12281204
let Defs = [EFLAGS] in {
12291205
let isCommutable = 1 in {

llvm/lib/Target/X86/X86InstrCompiler.td

Lines changed: 0 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -786,16 +786,6 @@ defm LOCK_OR : LOCK_ArithBinOp<0x08, 0x80, 0x83, MRM1m, X86lock_or , "or">;
786786
defm LOCK_AND : LOCK_ArithBinOp<0x20, 0x80, 0x83, MRM4m, X86lock_and, "and">;
787787
defm LOCK_XOR : LOCK_ArithBinOp<0x30, 0x80, 0x83, MRM6m, X86lock_xor, "xor">;
788788

789-
def X86lock_add_nocf : PatFrag<(ops node:$lhs, node:$rhs),
790-
(X86lock_add node:$lhs, node:$rhs), [{
791-
return hasNoCarryFlagUses(SDValue(N, 0));
792-
}]>;
793-
794-
def X86lock_sub_nocf : PatFrag<(ops node:$lhs, node:$rhs),
795-
(X86lock_sub node:$lhs, node:$rhs), [{
796-
return hasNoCarryFlagUses(SDValue(N, 0));
797-
}]>;
798-
799789
let Defs = [EFLAGS], mayLoad = 1, mayStore = 1, isCodeGenOnly = 1,
800790
SchedRW = [WriteALURMW] in {
801791
let Predicates = [UseIncDec] in {
@@ -1304,31 +1294,6 @@ def : Pat<(X86call_rvmarker (i64 tglobaladdr:$rvfunc), (i64 tglobaladdr:$dst)),
13041294
// %r11. This happens when calling a vararg function with 6 arguments.
13051295
//
13061296
// Match an X86tcret that uses less than 7 volatile registers.
1307-
def X86tcret_6regs : PatFrag<(ops node:$ptr, node:$off),
1308-
(X86tcret node:$ptr, node:$off), [{
1309-
// X86tcret args: (*chain, ptr, imm, regs..., glue)
1310-
unsigned NumRegs = 0;
1311-
for (unsigned i = 3, e = N->getNumOperands(); i != e; ++i)
1312-
if (isa<RegisterSDNode>(N->getOperand(i)) && ++NumRegs > 6)
1313-
return false;
1314-
return true;
1315-
}]>;
1316-
1317-
def X86tcret_1reg : PatFrag<(ops node:$ptr, node:$off),
1318-
(X86tcret node:$ptr, node:$off), [{
1319-
// X86tcret args: (*chain, ptr, imm, regs..., glue)
1320-
unsigned NumRegs = 1;
1321-
const SDValue& BasePtr = cast<LoadSDNode>(N->getOperand(1))->getBasePtr();
1322-
if (isa<FrameIndexSDNode>(BasePtr))
1323-
NumRegs = 3;
1324-
else if (BasePtr->getNumOperands() && isa<GlobalAddressSDNode>(BasePtr->getOperand(0)))
1325-
NumRegs = 3;
1326-
for (unsigned i = 3, e = N->getNumOperands(); i != e; ++i)
1327-
if (isa<RegisterSDNode>(N->getOperand(i)) && ( NumRegs-- == 0))
1328-
return false;
1329-
return true;
1330-
}]>;
1331-
13321297
def : Pat<(X86tcret ptr_rc_tailcall:$dst, timm:$off),
13331298
(TCRETURNri ptr_rc_tailcall:$dst, timm:$off)>,
13341299
Requires<[Not64BitMode, NotUseIndirectThunkCalls]>;
@@ -1449,32 +1414,8 @@ def : Pat<(i64 (anyext GR16:$src)),
14491414
def : Pat<(i64 (anyext GR32:$src)),
14501415
(INSERT_SUBREG (i64 (IMPLICIT_DEF)), GR32:$src, sub_32bit)>;
14511416

1452-
// If this is an anyext of the remainder of an 8-bit sdivrem, use a MOVSX
1453-
// instead of a MOVZX. The sdivrem lowering will emit emit a MOVSX to move
1454-
// %ah to the lower byte of a register. By using a MOVSX here we allow a
1455-
// post-isel peephole to merge the two MOVSX instructions into one.
1456-
def anyext_sdiv : PatFrag<(ops node:$lhs), (anyext node:$lhs),[{
1457-
return (N->getOperand(0).getOpcode() == ISD::SDIVREM &&
1458-
N->getOperand(0).getResNo() == 1);
1459-
}]>;
14601417
def : Pat<(i32 (anyext_sdiv GR8:$src)), (MOVSX32rr8 GR8:$src)>;
14611418

1462-
// Any instruction that defines a 32-bit result leaves the high half of the
1463-
// register. Truncate can be lowered to EXTRACT_SUBREG. CopyFromReg may
1464-
// be copying from a truncate. AssertSext/AssertZext/AssertAlign aren't saying
1465-
// anything about the upper 32 bits, they're probably just qualifying a
1466-
// CopyFromReg. FREEZE may be coming from a a truncate. Any other 32-bit
1467-
// operation will zero-extend up to 64 bits.
1468-
def def32 : PatLeaf<(i32 GR32:$src), [{
1469-
return N->getOpcode() != ISD::TRUNCATE &&
1470-
N->getOpcode() != TargetOpcode::EXTRACT_SUBREG &&
1471-
N->getOpcode() != ISD::CopyFromReg &&
1472-
N->getOpcode() != ISD::AssertSext &&
1473-
N->getOpcode() != ISD::AssertZext &&
1474-
N->getOpcode() != ISD::AssertAlign &&
1475-
N->getOpcode() != ISD::FREEZE;
1476-
}]>;
1477-
14781419
// In the case of a 32-bit def that is known to implicitly zero-extend,
14791420
// we can use a SUBREG_TO_REG.
14801421
def : Pat<(i64 (zext def32:$src)),
@@ -1492,17 +1433,6 @@ def : Pat<(i64 (and (anyext def32:$src), 0x00000000FFFFFFFF)),
14921433
// generator to make the generated code easier to read. To do this, we select
14931434
// into "disjoint bits" pseudo ops.
14941435

1495-
// Treat an 'or' node is as an 'add' if the or'ed bits are known to be zero.
1496-
def or_is_add : PatFrag<(ops node:$lhs, node:$rhs), (or node:$lhs, node:$rhs),[{
1497-
if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1)))
1498-
return CurDAG->MaskedValueIsZero(N->getOperand(0), CN->getAPIntValue());
1499-
1500-
KnownBits Known0 = CurDAG->computeKnownBits(N->getOperand(0), 0);
1501-
KnownBits Known1 = CurDAG->computeKnownBits(N->getOperand(1), 0);
1502-
return (~Known0.Zero & ~Known1.Zero) == 0;
1503-
}]>;
1504-
1505-
15061436
// (or x1, x2) -> (add x1, x2) if two operands are known not to share bits.
15071437
// Try this before the selecting to OR.
15081438
let SchedRW = [WriteALU] in {
@@ -1820,23 +1750,6 @@ def : Pat<(shl GR16:$src1, (i8 1)), (ADD16rr GR16:$src1, GR16:$src1)>;
18201750
def : Pat<(shl GR32:$src1, (i8 1)), (ADD32rr GR32:$src1, GR32:$src1)>;
18211751
def : Pat<(shl GR64:$src1, (i8 1)), (ADD64rr GR64:$src1, GR64:$src1)>;
18221752

1823-
def shiftMask8 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{
1824-
return isUnneededShiftMask(N, 3);
1825-
}]>;
1826-
1827-
def shiftMask16 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{
1828-
return isUnneededShiftMask(N, 4);
1829-
}]>;
1830-
1831-
def shiftMask32 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{
1832-
return isUnneededShiftMask(N, 5);
1833-
}]>;
1834-
1835-
def shiftMask64 : PatFrag<(ops node:$lhs), (and node:$lhs, imm), [{
1836-
return isUnneededShiftMask(N, 6);
1837-
}]>;
1838-
1839-
18401753
// Shift amount is implicitly masked.
18411754
multiclass MaskedShiftAmountPats<SDNode frag, string name> {
18421755
// (shift x (and y, 31)) ==> (shift x, y)

llvm/lib/Target/X86/X86InstrFPStack.td

Lines changed: 0 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -12,127 +12,6 @@
1212
//
1313
//===----------------------------------------------------------------------===//
1414

15-
//===----------------------------------------------------------------------===//
16-
// FPStack specific DAG Nodes.
17-
//===----------------------------------------------------------------------===//
18-
19-
def SDTX86Fld : SDTypeProfile<1, 1, [SDTCisFP<0>,
20-
SDTCisPtrTy<1>]>;
21-
def SDTX86Fst : SDTypeProfile<0, 2, [SDTCisFP<0>,
22-
SDTCisPtrTy<1>]>;
23-
def SDTX86Fild : SDTypeProfile<1, 1, [SDTCisFP<0>, SDTCisPtrTy<1>]>;
24-
def SDTX86Fist : SDTypeProfile<0, 2, [SDTCisFP<0>, SDTCisPtrTy<1>]>;
25-
26-
def SDTX86CwdStore : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
27-
def SDTX86CwdLoad : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
28-
def SDTX86FPEnv : SDTypeProfile<0, 1, [SDTCisPtrTy<0>]>;
29-
30-
def X86fp80_add : SDNode<"X86ISD::FP80_ADD", SDTFPBinOp, [SDNPCommutative]>;
31-
def X86strict_fp80_add : SDNode<"X86ISD::STRICT_FP80_ADD", SDTFPBinOp,
32-
[SDNPHasChain,SDNPCommutative]>;
33-
def any_X86fp80_add : PatFrags<(ops node:$lhs, node:$rhs),
34-
[(X86strict_fp80_add node:$lhs, node:$rhs),
35-
(X86fp80_add node:$lhs, node:$rhs)]>;
36-
37-
def X86fld : SDNode<"X86ISD::FLD", SDTX86Fld,
38-
[SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
39-
def X86fst : SDNode<"X86ISD::FST", SDTX86Fst,
40-
[SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
41-
def X86fild : SDNode<"X86ISD::FILD", SDTX86Fild,
42-
[SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
43-
def X86fist : SDNode<"X86ISD::FIST", SDTX86Fist,
44-
[SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
45-
def X86fp_to_mem : SDNode<"X86ISD::FP_TO_INT_IN_MEM", SDTX86Fst,
46-
[SDNPHasChain, SDNPMayStore, SDNPMemOperand]>;
47-
def X86fp_cwd_get16 : SDNode<"X86ISD::FNSTCW16m", SDTX86CwdStore,
48-
[SDNPHasChain, SDNPMayStore, SDNPSideEffect,
49-
SDNPMemOperand]>;
50-
def X86fp_cwd_set16 : SDNode<"X86ISD::FLDCW16m", SDTX86CwdLoad,
51-
[SDNPHasChain, SDNPMayLoad, SDNPSideEffect,
52-
SDNPMemOperand]>;
53-
def X86fpenv_get : SDNode<"X86ISD::FNSTENVm", SDTX86FPEnv,
54-
[SDNPHasChain, SDNPMayStore, SDNPSideEffect,
55-
SDNPMemOperand]>;
56-
def X86fpenv_set : SDNode<"X86ISD::FLDENVm", SDTX86FPEnv,
57-
[SDNPHasChain, SDNPMayLoad, SDNPSideEffect,
58-
SDNPMemOperand]>;
59-
60-
def X86fstf32 : PatFrag<(ops node:$val, node:$ptr),
61-
(X86fst node:$val, node:$ptr), [{
62-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f32;
63-
}]>;
64-
def X86fstf64 : PatFrag<(ops node:$val, node:$ptr),
65-
(X86fst node:$val, node:$ptr), [{
66-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f64;
67-
}]>;
68-
def X86fstf80 : PatFrag<(ops node:$val, node:$ptr),
69-
(X86fst node:$val, node:$ptr), [{
70-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f80;
71-
}]>;
72-
73-
def X86fldf32 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{
74-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f32;
75-
}]>;
76-
def X86fldf64 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{
77-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f64;
78-
}]>;
79-
def X86fldf80 : PatFrag<(ops node:$ptr), (X86fld node:$ptr), [{
80-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::f80;
81-
}]>;
82-
83-
def X86fild16 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{
84-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16;
85-
}]>;
86-
def X86fild32 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{
87-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
88-
}]>;
89-
def X86fild64 : PatFrag<(ops node:$ptr), (X86fild node:$ptr), [{
90-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
91-
}]>;
92-
93-
def X86fist32 : PatFrag<(ops node:$val, node:$ptr),
94-
(X86fist node:$val, node:$ptr), [{
95-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
96-
}]>;
97-
98-
def X86fist64 : PatFrag<(ops node:$val, node:$ptr),
99-
(X86fist node:$val, node:$ptr), [{
100-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
101-
}]>;
102-
103-
def X86fp_to_i16mem : PatFrag<(ops node:$val, node:$ptr),
104-
(X86fp_to_mem node:$val, node:$ptr), [{
105-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i16;
106-
}]>;
107-
def X86fp_to_i32mem : PatFrag<(ops node:$val, node:$ptr),
108-
(X86fp_to_mem node:$val, node:$ptr), [{
109-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i32;
110-
}]>;
111-
def X86fp_to_i64mem : PatFrag<(ops node:$val, node:$ptr),
112-
(X86fp_to_mem node:$val, node:$ptr), [{
113-
return cast<MemIntrinsicSDNode>(N)->getMemoryVT() == MVT::i64;
114-
}]>;
115-
116-
//===----------------------------------------------------------------------===//
117-
// FPStack pattern fragments
118-
//===----------------------------------------------------------------------===//
119-
120-
def fpimm0 : FPImmLeaf<fAny, [{
121-
return Imm.isExactlyValue(+0.0);
122-
}]>;
123-
124-
def fpimmneg0 : FPImmLeaf<fAny, [{
125-
return Imm.isExactlyValue(-0.0);
126-
}]>;
127-
128-
def fpimm1 : FPImmLeaf<fAny, [{
129-
return Imm.isExactlyValue(+1.0);
130-
}]>;
131-
132-
def fpimmneg1 : FPImmLeaf<fAny, [{
133-
return Imm.isExactlyValue(-1.0);
134-
}]>;
135-
13615
// Some 'special' instructions - expanded after instruction selection.
13716
// Clobbers EFLAGS due to OR instruction used internally.
13817
// FIXME: Can we model this in SelectionDAG?

0 commit comments

Comments
 (0)