diff --git a/llvm/lib/Target/X86/X86InstrInfo.td b/llvm/lib/Target/X86/X86InstrInfo.td index bcbd12733022..4800ac99beda 100644 --- a/llvm/lib/Target/X86/X86InstrInfo.td +++ b/llvm/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/llvm/lib/Target/X86/X86InstrSSE.td b/llvm/lib/Target/X86/X86InstrSSE.td index 2523d6252c1e..77eb33d32b4a 100644 --- a/llvm/lib/Target/X86/X86InstrSSE.td +++ b/llvm/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/llvm/lib/Target/X86/X86InstrXOP.td b/llvm/lib/Target/X86/X86InstrXOP.td index 5dde2d07babe..be3011192f75 100644 --- a/llvm/lib/Target/X86/X86InstrXOP.td +++ b/llvm/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