From b0dac0f6f107b29e49a78d6aa358d1d8d76852bc Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Mon, 18 Sep 2017 05:50:54 +0000 Subject: [PATCH] [X86] Strengthen some of the SD type constraints in X86InstrFragmentsSIMD.td This effects the vector shift and rotates as well as some of the vector compares. The changes to the shifts by immediates allows a few hundred bytes to be removed by removing type checks for the size of the immediate containing the shift/rotate amount. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313512 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86InstrFragmentsSIMD.td | 69 ++++++++++++------------- 1 file changed, 32 insertions(+), 37 deletions(-) diff --git a/lib/Target/X86/X86InstrFragmentsSIMD.td b/lib/Target/X86/X86InstrFragmentsSIMD.td index c791e7c7cd4..ca3d78dd7f2 100644 --- a/lib/Target/X86/X86InstrFragmentsSIMD.td +++ b/lib/Target/X86/X86InstrFragmentsSIMD.td @@ -146,8 +146,11 @@ def X86fpextRnd : SDNode<"X86ISD::VFPEXTS_RND", SDTCisSameSizeAs<0, 2>, SDTCisVT<3, i32>]>>; -def X86vshldq : SDNode<"X86ISD::VSHLDQ", SDTIntShiftOp>; -def X86vshrdq : SDNode<"X86ISD::VSRLDQ", SDTIntShiftOp>; +def X86vshiftimm : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, + SDTCisVT<2, i8>, SDTCisInt<0>]>; + +def X86vshldq : SDNode<"X86ISD::VSHLDQ", X86vshiftimm>; +def X86vshrdq : SDNode<"X86ISD::VSRLDQ", X86vshiftimm>; def X86cmpp : SDNode<"X86ISD::CMPP", SDTX86VFCMP>; def X86pcmpeq : SDNode<"X86ISD::PCMPEQ", SDTIntBinOp, [SDNPCommutative]>; def X86pcmpgt : SDNode<"X86ISD::PCMPGT", SDTIntBinOp>; @@ -164,15 +167,16 @@ def X86CmpMaskCC : SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>]>; def X86CmpMaskCCRound : SDTypeProfile<1, 4, [SDTCisVec<0>,SDTCVecEltisVT<0, i1>, - SDTCisVec<1>, SDTCisSameAs<2, 1>, + SDTCisVec<1>, SDTCisFP<1>, SDTCisSameAs<2, 1>, SDTCisSameNumEltsAs<0, 1>, SDTCisVT<3, i8>, SDTCisVT<4, i32>]>; def X86CmpMaskCCScalar : - SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisSameAs<1, 2>, SDTCisVT<3, i8>]>; + SDTypeProfile<1, 3, [SDTCisInt<0>, SDTCisFP<1>, SDTCisSameAs<1, 2>, + SDTCisVT<3, i8>]>; def X86CmpMaskCCScalarRound : - SDTypeProfile<1, 4, [SDTCisInt<0>, SDTCisSameAs<1, 2>, SDTCisVT<3, i8>, - SDTCisVT<4, i32>]>; + SDTypeProfile<1, 4, [SDTCisInt<0>, SDTCisFP<1>, SDTCisSameAs<1, 2>, + SDTCisVT<3, i8>, SDTCisVT<4, i32>]>; def X86cmpm : SDNode<"X86ISD::CMPM", X86CmpMaskCC>; def X86cmpmRnd : SDNode<"X86ISD::CMPM_RND", X86CmpMaskCCRound>; @@ -180,23 +184,22 @@ def X86cmpmu : SDNode<"X86ISD::CMPMU", X86CmpMaskCC>; def X86cmpms : SDNode<"X86ISD::FSETCCM", X86CmpMaskCCScalar>; def X86cmpmsRnd : SDNode<"X86ISD::FSETCCM_RND", X86CmpMaskCCScalarRound>; -def X86vshl : SDNode<"X86ISD::VSHL", - SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, - SDTCisVec<2>]>>; -def X86vsrl : SDNode<"X86ISD::VSRL", - SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, - SDTCisVec<2>]>>; -def X86vsra : SDNode<"X86ISD::VSRA", - SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, - SDTCisVec<2>]>>; +def X86vshiftuniform : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, + SDTCisVec<2>, SDTCisInt<0>, + SDTCisInt<1>]>; + +def X86vshl : SDNode<"X86ISD::VSHL", X86vshiftuniform>; +def X86vsrl : SDNode<"X86ISD::VSRL", X86vshiftuniform>; +def X86vsra : SDNode<"X86ISD::VSRA", X86vshiftuniform>; + +def X86vshiftvariable : SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, + SDTCisSameAs<0,2>, SDTCisInt<0>]>; -def X86vsrav : SDNode<"X86ISD::VSRAV" , - SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, - SDTCisSameAs<0,2>]>>; +def X86vsrav : SDNode<"X86ISD::VSRAV", X86vshiftvariable>; -def X86vshli : SDNode<"X86ISD::VSHLI", SDTIntShiftOp>; -def X86vsrli : SDNode<"X86ISD::VSRLI", SDTIntShiftOp>; -def X86vsrai : SDNode<"X86ISD::VSRAI", SDTIntShiftOp>; +def X86vshli : SDNode<"X86ISD::VSHLI", X86vshiftimm>; +def X86vsrli : SDNode<"X86ISD::VSRLI", X86vshiftimm>; +def X86vsrai : SDNode<"X86ISD::VSRAI", X86vshiftimm>; def X86kshiftl : SDNode<"X86ISD::KSHIFTL", SDTypeProfile<1, 2, [SDTCVecEltisVT<0, i1>, @@ -207,31 +210,23 @@ def X86kshiftr : SDNode<"X86ISD::KSHIFTR", SDTCisSameAs<0, 1>, SDTCisVT<2, i8>]>>; -def X86vrotli : SDNode<"X86ISD::VROTLI", SDTIntShiftOp>; -def X86vrotri : SDNode<"X86ISD::VROTRI", SDTIntShiftOp>; +def X86vrotli : SDNode<"X86ISD::VROTLI", X86vshiftimm>; +def X86vrotri : SDNode<"X86ISD::VROTRI", X86vshiftimm>; -def X86vprot : SDNode<"X86ISD::VPROT", - SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, - SDTCisSameAs<0,2>]>>; -def X86vproti : SDNode<"X86ISD::VPROTI", - SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, - SDTCisVT<2, i8>]>>; +def X86vprot : SDNode<"X86ISD::VPROT", X86vshiftvariable>; +def X86vproti : SDNode<"X86ISD::VPROTI", X86vshiftimm>; -def X86vpshl : SDNode<"X86ISD::VPSHL", - SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, - SDTCisSameAs<0,2>]>>; -def X86vpsha : SDNode<"X86ISD::VPSHA", - SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisSameAs<0,1>, - SDTCisSameAs<0,2>]>>; +def X86vpshl : SDNode<"X86ISD::VPSHL", X86vshiftvariable>; +def X86vpsha : SDNode<"X86ISD::VPSHA", X86vshiftvariable>; def X86vpcom : SDNode<"X86ISD::VPCOM", SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, SDTCisSameAs<0,2>, - SDTCisVT<3, i8>]>>; + SDTCisVT<3, i8>, SDTCisInt<0>]>>; def X86vpcomu : SDNode<"X86ISD::VPCOMU", SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisSameAs<0,1>, SDTCisSameAs<0,2>, - SDTCisVT<3, i8>]>>; + SDTCisVT<3, i8>, SDTCisInt<0>]>>; def X86vpermil2 : SDNode<"X86ISD::VPERMIL2", SDTypeProfile<1, 4, [SDTCisVec<0>, SDTCisSameAs<0,1>, SDTCisSameAs<0,2>, -- 2.40.0