mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[X86] Generalize and combine some similar type constraints and node types. No changes to the isel table size so the separation wasn't buying us anything.
llvm-svn: 270026
This commit is contained in:
parent
c298b9dab5
commit
1aff453749
@ -4963,28 +4963,28 @@ multiclass avx512_cvt_s_int_round<bits<8> opc, X86VectorVTInfo SrcVT ,
|
||||
|
||||
// Convert float/double to signed/unsigned int 32/64
|
||||
defm VCVTSS2SIZ: avx512_cvt_s_int_round<0x2D, f32x_info, i32x_info,
|
||||
X86cvtss2si, "cvtss2si">,
|
||||
X86cvts2si, "cvtss2si">,
|
||||
XS, EVEX_CD8<32, CD8VT1>;
|
||||
defm VCVTSS2SI64Z: avx512_cvt_s_int_round<0x2D, f32x_info, i64x_info,
|
||||
X86cvtss2si, "cvtss2si">,
|
||||
X86cvts2si, "cvtss2si">,
|
||||
XS, VEX_W, EVEX_CD8<32, CD8VT1>;
|
||||
defm VCVTSS2USIZ: avx512_cvt_s_int_round<0x79, f32x_info, i32x_info,
|
||||
X86cvtss2usi, "cvtss2usi">,
|
||||
X86cvts2usi, "cvtss2usi">,
|
||||
XS, EVEX_CD8<32, CD8VT1>;
|
||||
defm VCVTSS2USI64Z: avx512_cvt_s_int_round<0x79, f32x_info, i64x_info,
|
||||
X86cvtss2usi, "cvtss2usi">, XS, VEX_W,
|
||||
X86cvts2usi, "cvtss2usi">, XS, VEX_W,
|
||||
EVEX_CD8<32, CD8VT1>;
|
||||
defm VCVTSD2SIZ: avx512_cvt_s_int_round<0x2D, f64x_info, i32x_info,
|
||||
X86cvtsd2si, "cvtsd2si">,
|
||||
X86cvts2si, "cvtsd2si">,
|
||||
XD, EVEX_CD8<64, CD8VT1>;
|
||||
defm VCVTSD2SI64Z: avx512_cvt_s_int_round<0x2D, f64x_info, i64x_info,
|
||||
X86cvtsd2si, "cvtsd2si">,
|
||||
X86cvts2si, "cvtsd2si">,
|
||||
XD, VEX_W, EVEX_CD8<64, CD8VT1>;
|
||||
defm VCVTSD2USIZ: avx512_cvt_s_int_round<0x79, f64x_info, i32x_info,
|
||||
X86cvtsd2usi, "cvtsd2usi">,
|
||||
X86cvts2usi, "cvtsd2usi">,
|
||||
XD, EVEX_CD8<64, CD8VT1>;
|
||||
defm VCVTSD2USI64Z: avx512_cvt_s_int_round<0x79, f64x_info, i64x_info,
|
||||
X86cvtsd2usi, "cvtsd2usi">, XD, VEX_W,
|
||||
X86cvts2usi, "cvtsd2usi">, XD, VEX_W,
|
||||
EVEX_CD8<64, CD8VT1>;
|
||||
|
||||
// The SSE version of these instructions are disabled for AVX512.
|
||||
@ -5038,11 +5038,11 @@ let Predicates = [HasAVX512] in {
|
||||
let isCodeGenOnly = 1,hasSideEffects = 0 in {
|
||||
def rr_Int : SI<opc, MRMSrcReg, (outs _DstRC.RC:$dst), (ins _SrcRC.RC:$src),
|
||||
!strconcat(asm,"\t{$src, $dst|$dst, $src}"),
|
||||
[(set _DstRC.RC:$dst, (OpNodeRnd _SrcRC.RC:$src,
|
||||
[(set _DstRC.RC:$dst, (OpNodeRnd (_SrcRC.VT _SrcRC.RC:$src),
|
||||
(i32 FROUND_CURRENT)))]>, EVEX, VEX_LIG;
|
||||
def rb_Int : SI<opc, MRMSrcReg, (outs _DstRC.RC:$dst), (ins _SrcRC.RC:$src),
|
||||
!strconcat(asm,"\t{{sae}, $src, $dst|$dst, $src, {sae}}"),
|
||||
[(set _DstRC.RC:$dst, (OpNodeRnd _SrcRC.RC:$src,
|
||||
[(set _DstRC.RC:$dst, (OpNodeRnd (_SrcRC.VT _SrcRC.RC:$src),
|
||||
(i32 FROUND_NO_EXC)))]>,
|
||||
EVEX,VEX_LIG , EVEX_B;
|
||||
let mayLoad = 1 in
|
||||
@ -5057,29 +5057,29 @@ let Predicates = [HasAVX512] in {
|
||||
|
||||
|
||||
defm VCVTTSS2SIZ: avx512_cvt_s_all<0x2C, "cvttss2si", f32x_info, i32x_info,
|
||||
fp_to_sint,X86cvttss2IntRnd>,
|
||||
fp_to_sint,X86cvtts2IntRnd>,
|
||||
XS, EVEX_CD8<32, CD8VT1>;
|
||||
defm VCVTTSS2SI64Z: avx512_cvt_s_all<0x2C, "cvttss2si", f32x_info, i64x_info,
|
||||
fp_to_sint,X86cvttss2IntRnd>,
|
||||
fp_to_sint,X86cvtts2IntRnd>,
|
||||
VEX_W, XS, EVEX_CD8<32, CD8VT1>;
|
||||
defm VCVTTSD2SIZ: avx512_cvt_s_all<0x2C, "cvttsd2si", f64x_info, i32x_info,
|
||||
fp_to_sint,X86cvttsd2IntRnd>,
|
||||
fp_to_sint,X86cvtts2IntRnd>,
|
||||
XD, EVEX_CD8<64, CD8VT1>;
|
||||
defm VCVTTSD2SI64Z: avx512_cvt_s_all<0x2C, "cvttsd2si", f64x_info, i64x_info,
|
||||
fp_to_sint,X86cvttsd2IntRnd>,
|
||||
fp_to_sint,X86cvtts2IntRnd>,
|
||||
VEX_W, XD, EVEX_CD8<64, CD8VT1>;
|
||||
|
||||
defm VCVTTSS2USIZ: avx512_cvt_s_all<0x78, "cvttss2usi", f32x_info, i32x_info,
|
||||
fp_to_uint,X86cvttss2UIntRnd>,
|
||||
fp_to_uint,X86cvtts2UIntRnd>,
|
||||
XS, EVEX_CD8<32, CD8VT1>;
|
||||
defm VCVTTSS2USI64Z: avx512_cvt_s_all<0x78, "cvttss2usi", f32x_info, i64x_info,
|
||||
fp_to_uint,X86cvttss2UIntRnd>,
|
||||
fp_to_uint,X86cvtts2UIntRnd>,
|
||||
XS,VEX_W, EVEX_CD8<32, CD8VT1>;
|
||||
defm VCVTTSD2USIZ: avx512_cvt_s_all<0x78, "cvttsd2usi", f64x_info, i32x_info,
|
||||
fp_to_uint,X86cvttsd2UIntRnd>,
|
||||
fp_to_uint,X86cvtts2UIntRnd>,
|
||||
XD, EVEX_CD8<64, CD8VT1>;
|
||||
defm VCVTTSD2USI64Z: avx512_cvt_s_all<0x78, "cvttsd2usi", f64x_info, i64x_info,
|
||||
fp_to_uint,X86cvttsd2UIntRnd>,
|
||||
fp_to_uint,X86cvtts2UIntRnd>,
|
||||
XD, VEX_W, EVEX_CD8<64, CD8VT1>;
|
||||
let Predicates = [HasAVX512] in {
|
||||
def : Pat<(i32 (int_x86_sse_cvttss2si (v4f32 VR128X:$src))),
|
||||
@ -5509,59 +5509,59 @@ defm VCVTUDQ2PS : avx512_cvtdq2ps<0x7A, "vcvtudq2ps", uint_to_fp,
|
||||
X86VUintToFpRnd>, XD,
|
||||
EVEX_CD8<32, CD8VF>;
|
||||
|
||||
defm VCVTPS2DQ : avx512_cvtps2dq<0x5B, "vcvtps2dq", X86cvtps2Int,
|
||||
X86cvtps2IntRnd>, PD, EVEX_CD8<32, CD8VF>;
|
||||
defm VCVTPS2DQ : avx512_cvtps2dq<0x5B, "vcvtps2dq", X86cvtp2Int,
|
||||
X86cvtp2IntRnd>, PD, EVEX_CD8<32, CD8VF>;
|
||||
|
||||
defm VCVTPD2DQ : avx512_cvtpd2dq<0xE6, "vcvtpd2dq", X86cvtpd2Int,
|
||||
X86cvtpd2IntRnd>, XD, VEX_W,
|
||||
defm VCVTPD2DQ : avx512_cvtpd2dq<0xE6, "vcvtpd2dq", X86cvtp2Int,
|
||||
X86cvtp2IntRnd>, XD, VEX_W,
|
||||
EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTPS2UDQ : avx512_cvtps2dq<0x79, "vcvtps2udq", X86cvtps2UInt,
|
||||
X86cvtps2UIntRnd>,
|
||||
defm VCVTPS2UDQ : avx512_cvtps2dq<0x79, "vcvtps2udq", X86cvtp2UInt,
|
||||
X86cvtp2UIntRnd>,
|
||||
PS, EVEX_CD8<32, CD8VF>;
|
||||
defm VCVTPD2UDQ : avx512_cvtpd2dq<0x79, "vcvtpd2udq", X86cvtpd2UInt,
|
||||
X86cvtpd2UIntRnd>, VEX_W,
|
||||
defm VCVTPD2UDQ : avx512_cvtpd2dq<0x79, "vcvtpd2udq", X86cvtp2UInt,
|
||||
X86cvtp2UIntRnd>, VEX_W,
|
||||
PS, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTPD2QQ : avx512_cvtpd2qq<0x7B, "vcvtpd2qq", X86cvtpd2Int,
|
||||
X86cvtpd2IntRnd>, VEX_W,
|
||||
defm VCVTPD2QQ : avx512_cvtpd2qq<0x7B, "vcvtpd2qq", X86cvtp2Int,
|
||||
X86cvtp2IntRnd>, VEX_W,
|
||||
PD, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTPS2QQ : avx512_cvtps2qq<0x7B, "vcvtps2qq", X86cvtps2Int,
|
||||
X86cvtps2IntRnd>, PD, EVEX_CD8<32, CD8VH>;
|
||||
defm VCVTPS2QQ : avx512_cvtps2qq<0x7B, "vcvtps2qq", X86cvtp2Int,
|
||||
X86cvtp2IntRnd>, PD, EVEX_CD8<32, CD8VH>;
|
||||
|
||||
defm VCVTPD2UQQ : avx512_cvtpd2qq<0x79, "vcvtpd2uqq", X86cvtpd2UInt,
|
||||
X86cvtpd2UIntRnd>, VEX_W,
|
||||
defm VCVTPD2UQQ : avx512_cvtpd2qq<0x79, "vcvtpd2uqq", X86cvtp2UInt,
|
||||
X86cvtp2UIntRnd>, VEX_W,
|
||||
PD, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTPS2UQQ : avx512_cvtps2qq<0x79, "vcvtps2uqq", X86cvtps2UInt,
|
||||
X86cvtps2UIntRnd>, PD, EVEX_CD8<32, CD8VH>;
|
||||
defm VCVTPS2UQQ : avx512_cvtps2qq<0x79, "vcvtps2uqq", X86cvtp2UInt,
|
||||
X86cvtp2UIntRnd>, PD, EVEX_CD8<32, CD8VH>;
|
||||
|
||||
defm VCVTTPD2QQ : avx512_cvttpd2qq<0x7A, "vcvttpd2qq", fp_to_sint,
|
||||
X86VFpToSlongRnd>, VEX_W,
|
||||
X86VFpToSintRnd>, VEX_W,
|
||||
PD, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTTPS2QQ : avx512_cvttps2qq<0x7A, "vcvttps2qq", fp_to_sint,
|
||||
X86VFpToSlongRnd>, PD, EVEX_CD8<32, CD8VH>;
|
||||
X86VFpToSintRnd>, PD, EVEX_CD8<32, CD8VH>;
|
||||
|
||||
defm VCVTTPD2UQQ : avx512_cvttpd2qq<0x78, "vcvttpd2uqq", fp_to_uint,
|
||||
X86VFpToUlongRnd>, VEX_W,
|
||||
X86VFpToUintRnd>, VEX_W,
|
||||
PD, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTTPS2UQQ : avx512_cvttps2qq<0x78, "vcvttps2uqq", fp_to_uint,
|
||||
X86VFpToUlongRnd>, PD, EVEX_CD8<32, CD8VH>;
|
||||
X86VFpToUintRnd>, PD, EVEX_CD8<32, CD8VH>;
|
||||
|
||||
defm VCVTQQ2PD : avx512_cvtqq2pd<0xE6, "vcvtqq2pd", sint_to_fp,
|
||||
X86VSlongToFpRnd>, VEX_W, XS, EVEX_CD8<64, CD8VF>;
|
||||
X86VSintToFpRnd>, VEX_W, XS, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTUQQ2PD : avx512_cvtqq2pd<0x7A, "vcvtuqq2pd", uint_to_fp,
|
||||
X86VUlongToFpRnd>, VEX_W, XS, EVEX_CD8<64, CD8VF>;
|
||||
X86VUintToFpRnd>, VEX_W, XS, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTQQ2PS : avx512_cvtqq2ps<0x5B, "vcvtqq2ps", sint_to_fp,
|
||||
X86VSlongToFpRnd>, VEX_W, PS, EVEX_CD8<64, CD8VF>;
|
||||
X86VSintToFpRnd>, VEX_W, PS, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
defm VCVTUQQ2PS : avx512_cvtqq2ps<0x7A, "vcvtuqq2ps", uint_to_fp,
|
||||
X86VUlongToFpRnd>, VEX_W, XD, EVEX_CD8<64, CD8VF>;
|
||||
X86VUintToFpRnd>, VEX_W, XD, EVEX_CD8<64, CD8VF>;
|
||||
|
||||
let Predicates = [HasAVX512, NoVLX] in {
|
||||
def : Pat<(v8i32 (fp_to_uint (v8f32 VR256X:$src1))),
|
||||
|
@ -513,75 +513,44 @@ def SDTintToFPRound: SDTypeProfile<1, 3, [SDTCisVec<0>, SDTCisFP<0>,
|
||||
SDTCisSameAs<0,1>, SDTCisInt<2>,
|
||||
SDTCisVT<3, i32>]>;
|
||||
|
||||
def SDTDoubleToInt: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>,
|
||||
SDTCisInt<0>, SDTCVecEltisVT<1, f64>]>;
|
||||
def SDTFloatToInt: SDTypeProfile<1, 1, [SDTCisVec<0>, SDTCisVec<1>,
|
||||
SDTCisInt<0>, SDTCVecEltisVT<1, f32>]>;
|
||||
SDTCisInt<0>, SDTCisFP<1>]>;
|
||||
|
||||
def SDTDoubleToIntRnd: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
|
||||
SDTCisInt<0>, SDTCVecEltisVT<1, f64>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
def SDTSDoubleToIntRnd: SDTypeProfile<1, 2, [SDTCisInt<0>,SDTCisFP<1>,
|
||||
SDTCVecEltisVT<1, f64>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
def SDTFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
|
||||
SDTCisInt<0>, SDTCVecEltisVT<1, f32>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
SDTCisInt<0>, SDTCisFP<1>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
def SDTSFloatToIntRnd: SDTypeProfile<1, 2, [SDTCisInt<0>, SDTCisFP<1>,
|
||||
SDTCVecEltisVT<1, f32>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
SDTCisVec<1>, SDTCisVT<2, i32>]>;
|
||||
def SDTVintToFPRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
|
||||
SDTCisFP<0>, SDTCVecEltisVT<1, i32>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
def SDTVlongToFPRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
|
||||
SDTCisFP<0>, SDTCVecEltisVT<1, i64>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
|
||||
def SDTVFPToIntRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
|
||||
SDTCisFP<1>, SDTCVecEltisVT<0, i32>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
def SDTVFPToLongRound: SDTypeProfile<1, 2, [SDTCisVec<0>, SDTCisVec<1>,
|
||||
SDTCisFP<1>, SDTCVecEltisVT<0, i64>,
|
||||
SDTCisFP<0>, SDTCisInt<1>,
|
||||
SDTCisVT<2, i32>]>;
|
||||
|
||||
// Scalar
|
||||
def X86SintToFpRnd : SDNode<"X86ISD::SINT_TO_FP_RND", SDTintToFPRound>;
|
||||
def X86UintToFpRnd : SDNode<"X86ISD::UINT_TO_FP_RND", SDTintToFPRound>;
|
||||
|
||||
def X86cvttss2IntRnd : SDNode<"X86ISD::FP_TO_SINT_RND", SDTSFloatToIntRnd>;
|
||||
def X86cvttss2UIntRnd : SDNode<"X86ISD::FP_TO_UINT_RND", SDTSFloatToIntRnd>;
|
||||
def X86cvttsd2IntRnd : SDNode<"X86ISD::FP_TO_SINT_RND", SDTSDoubleToIntRnd>;
|
||||
def X86cvttsd2UIntRnd : SDNode<"X86ISD::FP_TO_UINT_RND", SDTSDoubleToIntRnd>;
|
||||
def X86cvtts2IntRnd : SDNode<"X86ISD::FP_TO_SINT_RND", SDTSFloatToIntRnd>;
|
||||
def X86cvtts2UIntRnd : SDNode<"X86ISD::FP_TO_UINT_RND", SDTSFloatToIntRnd>;
|
||||
|
||||
def X86cvtsd2si : SDNode<"X86ISD::SCALAR_FP_TO_SINT_RND", SDTSDoubleToIntRnd>;
|
||||
def X86cvtsd2usi : SDNode<"X86ISD::SCALAR_FP_TO_UINT_RND", SDTSDoubleToIntRnd>;
|
||||
def X86cvtss2si : SDNode<"X86ISD::SCALAR_FP_TO_SINT_RND", SDTSFloatToIntRnd>;
|
||||
def X86cvtss2usi : SDNode<"X86ISD::SCALAR_FP_TO_UINT_RND", SDTSFloatToIntRnd>;
|
||||
def X86cvts2si : SDNode<"X86ISD::SCALAR_FP_TO_SINT_RND", SDTSFloatToIntRnd>;
|
||||
def X86cvts2usi : SDNode<"X86ISD::SCALAR_FP_TO_UINT_RND", SDTSFloatToIntRnd>;
|
||||
|
||||
// Vector with rounding mode
|
||||
|
||||
// cvtt fp-to-int staff
|
||||
def X86VFpToSintRnd : SDNode<"ISD::FP_TO_SINT", SDTVFPToIntRound>;
|
||||
def X86VFpToUintRnd : SDNode<"ISD::FP_TO_UINT", SDTVFPToIntRound>;
|
||||
def X86VFpToSlongRnd : SDNode<"ISD::FP_TO_SINT", SDTVFPToLongRound>;
|
||||
def X86VFpToUlongRnd : SDNode<"ISD::FP_TO_UINT", SDTVFPToLongRound>;
|
||||
def X86VFpToSintRnd : SDNode<"ISD::FP_TO_SINT", SDTFloatToIntRnd>;
|
||||
def X86VFpToUintRnd : SDNode<"ISD::FP_TO_UINT", SDTFloatToIntRnd>;
|
||||
|
||||
def X86VSintToFpRnd : SDNode<"ISD::SINT_TO_FP", SDTVintToFPRound>;
|
||||
def X86VUintToFpRnd : SDNode<"ISD::UINT_TO_FP", SDTVintToFPRound>;
|
||||
def X86VSlongToFpRnd : SDNode<"ISD::SINT_TO_FP", SDTVlongToFPRound>;
|
||||
def X86VUlongToFpRnd : SDNode<"ISD::UINT_TO_FP", SDTVlongToFPRound>;
|
||||
|
||||
// cvt fp-to-int staff
|
||||
def X86cvtps2IntRnd : SDNode<"X86ISD::FP_TO_SINT_RND", SDTFloatToIntRnd>;
|
||||
def X86cvtps2UIntRnd : SDNode<"X86ISD::FP_TO_UINT_RND", SDTFloatToIntRnd>;
|
||||
def X86cvtpd2IntRnd : SDNode<"X86ISD::FP_TO_SINT_RND", SDTDoubleToIntRnd>;
|
||||
def X86cvtpd2UIntRnd : SDNode<"X86ISD::FP_TO_UINT_RND", SDTDoubleToIntRnd>;
|
||||
def X86cvtp2IntRnd : SDNode<"X86ISD::FP_TO_SINT_RND", SDTFloatToIntRnd>;
|
||||
def X86cvtp2UIntRnd : SDNode<"X86ISD::FP_TO_UINT_RND", SDTFloatToIntRnd>;
|
||||
|
||||
// Vector without rounding mode
|
||||
def X86cvtps2Int : SDNode<"X86ISD::FP_TO_SINT_RND", SDTFloatToInt>;
|
||||
def X86cvtps2UInt : SDNode<"X86ISD::FP_TO_UINT_RND", SDTFloatToInt>;
|
||||
def X86cvtpd2Int : SDNode<"X86ISD::FP_TO_SINT_RND", SDTDoubleToInt>;
|
||||
def X86cvtpd2UInt : SDNode<"X86ISD::FP_TO_UINT_RND", SDTDoubleToInt>;
|
||||
def X86cvtp2Int : SDNode<"X86ISD::FP_TO_SINT_RND", SDTFloatToInt>;
|
||||
def X86cvtp2UInt : SDNode<"X86ISD::FP_TO_UINT_RND", SDTFloatToInt>;
|
||||
|
||||
def X86cvtph2ps : SDNode<"ISD::FP16_TO_FP",
|
||||
SDTypeProfile<1, 2, [SDTCVecEltisVT<0, f32>,
|
||||
|
Loading…
x
Reference in New Issue
Block a user