From abd71f69bc6aae537406278338b06f1270cf7e30 Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Wed, 20 Sep 2017 06:38:41 +0000 Subject: [PATCH] [X86] Remove isel checks for immediate size on floating point compare and xop compare instructions. NFCI If these checks fail we end up not selecting an instruction at all. So we are already relying on the immediate being checked upstream of isel. So doing the check in isel is just bloat to the isel table. Interestingly, we didn't check on the AVX512 version of the instructions anyway. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313724 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86InstrInfo.td | 8 ------- lib/Target/X86/X86InstrSSE.td | 50 ++++++++++++++++++++---------------------- lib/Target/X86/X86InstrXOP.td | 4 ++-- 3 files changed, 26 insertions(+), 36 deletions(-) diff --git a/lib/Target/X86/X86InstrInfo.td b/lib/Target/X86/X86InstrInfo.td index bcbd1273302..4800ac99bed 100644 --- a/lib/Target/X86/X86InstrInfo.td +++ b/lib/Target/X86/X86InstrInfo.td @@ -590,19 +590,11 @@ def SSECC : Operand { let OperandType = "OPERAND_IMMEDIATE"; } -def i8immZExt3 : ImmLeaf= 0 && Imm < 8; -}]>; - def AVXCC : Operand { let PrintMethod = "printSSEAVXCC"; let OperandType = "OPERAND_IMMEDIATE"; } -def i8immZExt5 : ImmLeaf= 0 && Imm < 32; -}]>; - def AVX512ICC : Operand { let PrintMethod = "printSSEAVXCC"; let OperandType = "OPERAND_IMMEDIATE"; diff --git a/lib/Target/X86/X86InstrSSE.td b/lib/Target/X86/X86InstrSSE.td index 2523d6252c1..77eb33d32b4 100644 --- a/lib/Target/X86/X86InstrSSE.td +++ b/lib/Target/X86/X86InstrSSE.td @@ -2071,16 +2071,16 @@ let Predicates = [UseSSE2] in { multiclass sse12_cmp_scalar { + OpndItins itins> { let isCommutable = 1 in def rr : SIi8<0xC2, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2, CC:$cc), asm, - [(set RC:$dst, (OpNode (VT RC:$src1), RC:$src2, immLeaf:$cc))], + [(set RC:$dst, (OpNode (VT RC:$src1), RC:$src2, imm:$cc))], itins.rr>, Sched<[itins.Sched]>; def rm : SIi8<0xC2, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2, CC:$cc), asm, [(set RC:$dst, (OpNode (VT RC:$src1), - (ld_frag addr:$src2), immLeaf:$cc))], + (ld_frag addr:$src2), imm:$cc))], itins.rm>, Sched<[itins.Sched.Folded, ReadAfterLd]>; @@ -2101,41 +2101,41 @@ let ExeDomain = SSEPackedSingle in defm VCMPSS : sse12_cmp_scalar, XS, VEX_4V, VEX_LIG, VEX_WIG; + SSE_ALU_F32S>, XS, VEX_4V, VEX_LIG, VEX_WIG; let ExeDomain = SSEPackedDouble in defm VCMPSD : sse12_cmp_scalar, // same latency as 32 bit compare + SSE_ALU_F32S>, // same latency as 32 bit compare XD, VEX_4V, VEX_LIG, VEX_WIG; let Constraints = "$src1 = $dst" in { let ExeDomain = SSEPackedSingle in defm CMPSS : sse12_cmp_scalar, XS; + "cmpss\t{$cc, $src2, $dst|$dst, $src2, $cc}", SSE_ALU_F32S>, + XS; let ExeDomain = SSEPackedDouble in defm CMPSD : sse12_cmp_scalar, XD; + SSE_ALU_F64S>, XD; } multiclass sse12_cmp_scalar_int { + ComplexPattern mem_cpat> { def rr : SIi8<0xC2, MRMSrcReg, (outs VR128:$dst), (ins VR128:$src1, VR128:$src, CC:$cc), asm, [(set VR128:$dst, (Int VR128:$src1, - VR128:$src, immLeaf:$cc))], + VR128:$src, imm:$cc))], itins.rr>, Sched<[itins.Sched]>; let mayLoad = 1 in def rm : SIi8<0xC2, MRMSrcMem, (outs VR128:$dst), (ins VR128:$src1, memop:$src, CC:$cc), asm, [(set VR128:$dst, (Int VR128:$src1, - mem_cpat:$src, immLeaf:$cc))], + mem_cpat:$src, imm:$cc))], itins.rm>, Sched<[itins.Sched.Folded, ReadAfterLd]>; } @@ -2145,23 +2145,21 @@ let isCodeGenOnly = 1 in { let ExeDomain = SSEPackedSingle in defm Int_VCMPSS : sse12_cmp_scalar_int, - XS, VEX_4V; + SSE_ALU_F32S, sse_load_f32>, XS, VEX_4V; let ExeDomain = SSEPackedDouble in defm Int_VCMPSD : sse12_cmp_scalar_int, // same latency as f32 + SSE_ALU_F32S, sse_load_f64>, // same latency as f32 XD, VEX_4V; let Constraints = "$src1 = $dst" in { let ExeDomain = SSEPackedSingle in defm Int_CMPSS : sse12_cmp_scalar_int, XS; + SSE_ALU_F32S, sse_load_f32>, XS; let ExeDomain = SSEPackedDouble in defm Int_CMPSD : sse12_cmp_scalar_int, - XD; + SSE_ALU_F64S, sse_load_f64>, XD; } } @@ -2255,18 +2253,18 @@ let Defs = [EFLAGS] in { // sse12_cmp_packed - sse 1 & 2 compare packed instructions multiclass sse12_cmp_packed { let isCommutable = 1 in def rri : PIi8<0xC2, MRMSrcReg, (outs RC:$dst), (ins RC:$src1, RC:$src2, CC:$cc), asm, - [(set RC:$dst, (VT (X86cmpp RC:$src1, RC:$src2, immLeaf:$cc)))], + [(set RC:$dst, (VT (X86cmpp RC:$src1, RC:$src2, imm:$cc)))], itins.rr, d>, Sched<[WriteFAdd]>; def rmi : PIi8<0xC2, MRMSrcMem, (outs RC:$dst), (ins RC:$src1, x86memop:$src2, CC:$cc), asm, [(set RC:$dst, - (VT (X86cmpp RC:$src1, (ld_frag addr:$src2), immLeaf:$cc)))], + (VT (X86cmpp RC:$src1, (ld_frag addr:$src2), imm:$cc)))], itins.rm, d>, Sched<[WriteFAddLd, ReadAfterLd]>; @@ -2286,28 +2284,28 @@ multiclass sse12_cmp_packed, PS, VEX_4V, VEX_WIG; + SSEPackedSingle, loadv4f32>, PS, VEX_4V, VEX_WIG; defm VCMPPD : sse12_cmp_packed, PD, VEX_4V, VEX_WIG; + SSEPackedDouble, loadv2f64>, PD, VEX_4V, VEX_WIG; defm VCMPPSY : sse12_cmp_packed, PS, VEX_4V, VEX_L; + SSEPackedSingle, loadv8f32>, PS, VEX_4V, VEX_L; defm VCMPPDY : sse12_cmp_packed, PD, VEX_4V, VEX_L; + SSEPackedDouble, loadv4f64>, PD, VEX_4V, VEX_L; let Constraints = "$src1 = $dst" in { defm CMPPS : sse12_cmp_packed, PS; + SSEPackedSingle, memopv4f32, SSE_ALU_F32P>, PS; defm CMPPD : sse12_cmp_packed, PD; + SSEPackedDouble, memopv2f64, SSE_ALU_F64P>, PD; } //===----------------------------------------------------------------------===// diff --git a/lib/Target/X86/X86InstrXOP.td b/lib/Target/X86/X86InstrXOP.td index 5dde2d07bab..be3011192f7 100644 --- a/lib/Target/X86/X86InstrXOP.td +++ b/lib/Target/X86/X86InstrXOP.td @@ -213,7 +213,7 @@ multiclass xopvpcom opc, string Suffix, SDNode OpNode, ValueType vt128> "\t{$src2, $src1, $dst|$dst, $src1, $src2}"), [(set VR128:$dst, (vt128 (OpNode (vt128 VR128:$src1), (vt128 VR128:$src2), - i8immZExt3:$cc)))]>, + imm:$cc)))]>, XOP_4V; def mi : IXOPi8 opc, string Suffix, SDNode OpNode, ValueType vt128> [(set VR128:$dst, (vt128 (OpNode (vt128 VR128:$src1), (vt128 (bitconvert (loadv2i64 addr:$src2))), - i8immZExt3:$cc)))]>, + imm:$cc)))]>, XOP_4V; let isAsmParserOnly = 1, hasSideEffects = 0 in { def ri_alt : IXOPi8