forked from OSchip/llvm-project
				
			[X86] Begin removing matching of FROUND_CURRENT and FROUND_NO_EXC from isel tables.
Instead I plan to have dedicated nodes for FROUND_CURRENT and FROUND_NO_EXC. This patch starts with FADDS/FSUBS/FMULS/FDIVS/FMAXS/FMINS/FSQRTS. llvm-svn: 355799
This commit is contained in:
		
							parent
							
								
									428dcd5c3f
								
							
						
					
					
						commit
						b7e6bfe579
					
				| 
						 | 
				
			
			@ -21943,6 +21943,20 @@ SDValue X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
 | 
			
		|||
      return DAG.getNode(IntrData->Opc0, dl, Op.getValueType(),
 | 
			
		||||
                         Op.getOperand(1), Src2);
 | 
			
		||||
    }
 | 
			
		||||
    case INTR_TYPE_2OP_SAE: {
 | 
			
		||||
      SDValue Sae = Op.getOperand(3);
 | 
			
		||||
 | 
			
		||||
      unsigned Opc;
 | 
			
		||||
      if (isRoundModeCurDirection(Sae))
 | 
			
		||||
        Opc = IntrData->Opc0;
 | 
			
		||||
      else if (isRoundModeSAE(Sae))
 | 
			
		||||
        Opc = IntrData->Opc1;
 | 
			
		||||
      else
 | 
			
		||||
        return SDValue();
 | 
			
		||||
 | 
			
		||||
      return DAG.getNode(Opc, dl, Op.getValueType(), Op.getOperand(1),
 | 
			
		||||
                         Op.getOperand(2));
 | 
			
		||||
    }
 | 
			
		||||
    case INTR_TYPE_3OP:
 | 
			
		||||
    case INTR_TYPE_3OP_IMM8: {
 | 
			
		||||
      SDValue Src1 = Op.getOperand(1);
 | 
			
		||||
| 
						 | 
				
			
			@ -22053,6 +22067,23 @@ SDValue X86TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
 | 
			
		|||
                                              Src2, RoundingMode),
 | 
			
		||||
                                  Mask, passThru, Subtarget, DAG);
 | 
			
		||||
    }
 | 
			
		||||
    case INTR_TYPE_SCALAR_MASK_SAE: {
 | 
			
		||||
      SDValue Src1 = Op.getOperand(1);
 | 
			
		||||
      SDValue Src2 = Op.getOperand(2);
 | 
			
		||||
      SDValue passThru = Op.getOperand(3);
 | 
			
		||||
      SDValue Mask = Op.getOperand(4);
 | 
			
		||||
      SDValue Sae = Op.getOperand(5);
 | 
			
		||||
      unsigned Opc;
 | 
			
		||||
      if (isRoundModeCurDirection(Sae))
 | 
			
		||||
        Opc = IntrData->Opc0;
 | 
			
		||||
      else if (isRoundModeSAE(Sae))
 | 
			
		||||
        Opc = IntrData->Opc1;
 | 
			
		||||
      else
 | 
			
		||||
        return SDValue();
 | 
			
		||||
 | 
			
		||||
      return getScalarMaskingNode(DAG.getNode(Opc, dl, VT, Src1, Src2),
 | 
			
		||||
                                  Mask, passThru, Subtarget, DAG);
 | 
			
		||||
    }
 | 
			
		||||
    case INTR_TYPE_SCALAR_MASK_RM: {
 | 
			
		||||
      assert(Op.getNumOperands() == 6 && "Unexpected number of operands");
 | 
			
		||||
      SDValue Src1 = Op.getOperand(1);
 | 
			
		||||
| 
						 | 
				
			
			@ -27516,12 +27547,12 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
 | 
			
		|||
  case X86ISD::CONFLICT:           return "X86ISD::CONFLICT";
 | 
			
		||||
  case X86ISD::FMAX:               return "X86ISD::FMAX";
 | 
			
		||||
  case X86ISD::FMAXS:              return "X86ISD::FMAXS";
 | 
			
		||||
  case X86ISD::FMAX_RND:           return "X86ISD::FMAX_RND";
 | 
			
		||||
  case X86ISD::FMAXS_RND:          return "X86ISD::FMAX_RND";
 | 
			
		||||
  case X86ISD::FMAX_SAE:           return "X86ISD::FMAX_SAE";
 | 
			
		||||
  case X86ISD::FMAXS_SAE:          return "X86ISD::FMAXS_SAE";
 | 
			
		||||
  case X86ISD::FMIN:               return "X86ISD::FMIN";
 | 
			
		||||
  case X86ISD::FMINS:              return "X86ISD::FMINS";
 | 
			
		||||
  case X86ISD::FMIN_RND:           return "X86ISD::FMIN_RND";
 | 
			
		||||
  case X86ISD::FMINS_RND:          return "X86ISD::FMINS_RND";
 | 
			
		||||
  case X86ISD::FMIN_SAE:           return "X86ISD::FMIN_SAE";
 | 
			
		||||
  case X86ISD::FMINS_SAE:          return "X86ISD::FMINS_SAE";
 | 
			
		||||
  case X86ISD::FMAXC:              return "X86ISD::FMAXC";
 | 
			
		||||
  case X86ISD::FMINC:              return "X86ISD::FMINC";
 | 
			
		||||
  case X86ISD::FRSQRT:             return "X86ISD::FRSQRT";
 | 
			
		||||
| 
						 | 
				
			
			@ -27708,14 +27739,19 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
 | 
			
		|||
  case X86ISD::RSQRT28:            return "X86ISD::RSQRT28";
 | 
			
		||||
  case X86ISD::RSQRT28S:           return "X86ISD::RSQRT28S";
 | 
			
		||||
  case X86ISD::FADD_RND:           return "X86ISD::FADD_RND";
 | 
			
		||||
  case X86ISD::FADDS:              return "X86ISD::FADDS";
 | 
			
		||||
  case X86ISD::FADDS_RND:          return "X86ISD::FADDS_RND";
 | 
			
		||||
  case X86ISD::FSUB_RND:           return "X86ISD::FSUB_RND";
 | 
			
		||||
  case X86ISD::FSUBS:              return "X86ISD::FSUBS";
 | 
			
		||||
  case X86ISD::FSUBS_RND:          return "X86ISD::FSUBS_RND";
 | 
			
		||||
  case X86ISD::FMUL_RND:           return "X86ISD::FMUL_RND";
 | 
			
		||||
  case X86ISD::FMULS:              return "X86ISD::FMULS";
 | 
			
		||||
  case X86ISD::FMULS_RND:          return "X86ISD::FMULS_RND";
 | 
			
		||||
  case X86ISD::FDIV_RND:           return "X86ISD::FDIV_RND";
 | 
			
		||||
  case X86ISD::FDIVS:              return "X86ISD::FDIVS";
 | 
			
		||||
  case X86ISD::FDIVS_RND:          return "X86ISD::FDIVS_RND";
 | 
			
		||||
  case X86ISD::FSQRT_RND:          return "X86ISD::FSQRT_RND";
 | 
			
		||||
  case X86ISD::FSQRTS:             return "X86ISD::FSQRTS";
 | 
			
		||||
  case X86ISD::FSQRTS_RND:         return "X86ISD::FSQRTS_RND";
 | 
			
		||||
  case X86ISD::FGETEXP_RND:        return "X86ISD::FGETEXP_RND";
 | 
			
		||||
  case X86ISD::FGETEXPS_RND:       return "X86ISD::FGETEXPS_RND";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -211,13 +211,13 @@ namespace llvm {
 | 
			
		|||
      ADDSUB,
 | 
			
		||||
 | 
			
		||||
      //  FP vector ops with rounding mode.
 | 
			
		||||
      FADD_RND, FADDS_RND,
 | 
			
		||||
      FSUB_RND, FSUBS_RND,
 | 
			
		||||
      FMUL_RND, FMULS_RND,
 | 
			
		||||
      FDIV_RND, FDIVS_RND,
 | 
			
		||||
      FMAX_RND, FMAXS_RND,
 | 
			
		||||
      FMIN_RND, FMINS_RND,
 | 
			
		||||
      FSQRT_RND, FSQRTS_RND,
 | 
			
		||||
      FADD_RND, FADDS, FADDS_RND,
 | 
			
		||||
      FSUB_RND, FSUBS, FSUBS_RND,
 | 
			
		||||
      FMUL_RND, FMULS, FMULS_RND,
 | 
			
		||||
      FDIV_RND, FDIVS, FDIVS_RND,
 | 
			
		||||
      FMAX_SAE, FMAXS_SAE,
 | 
			
		||||
      FMIN_SAE, FMINS_SAE,
 | 
			
		||||
      FSQRT_RND, FSQRTS, FSQRTS_RND,
 | 
			
		||||
 | 
			
		||||
      // FP vector get exponent.
 | 
			
		||||
      FGETEXP_RND, FGETEXPS_RND,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5452,16 +5452,14 @@ multiclass avx512_fp_scalar<bits<8> opc, string OpcodeStr,X86VectorVTInfo _,
 | 
			
		|||
  defm rr_Int : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst),
 | 
			
		||||
                           (ins _.RC:$src1, _.RC:$src2), OpcodeStr,
 | 
			
		||||
                           "$src2, $src1", "$src1, $src2",
 | 
			
		||||
                           (_.VT (VecNode _.RC:$src1, _.RC:$src2,
 | 
			
		||||
                                          (i32 FROUND_CURRENT)))>,
 | 
			
		||||
                           (_.VT (VecNode _.RC:$src1, _.RC:$src2))>,
 | 
			
		||||
                           Sched<[sched]>;
 | 
			
		||||
 | 
			
		||||
  defm rm_Int : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst),
 | 
			
		||||
                         (ins _.RC:$src1, _.IntScalarMemOp:$src2), OpcodeStr,
 | 
			
		||||
                         "$src2, $src1", "$src1, $src2",
 | 
			
		||||
                         (_.VT (VecNode _.RC:$src1,
 | 
			
		||||
                                        _.ScalarIntMemCPat:$src2,
 | 
			
		||||
                                        (i32 FROUND_CURRENT)))>,
 | 
			
		||||
                                        _.ScalarIntMemCPat:$src2))>,
 | 
			
		||||
                         Sched<[sched.Folded, sched.ReadAfterFold]>;
 | 
			
		||||
  let isCodeGenOnly = 1, Predicates = [HasAVX512] in {
 | 
			
		||||
  def rr : I< opc, MRMSrcReg, (outs _.FRC:$dst),
 | 
			
		||||
| 
						 | 
				
			
			@ -5528,23 +5526,22 @@ multiclass avx512_fp_scalar_sae<bits<8> opc, string OpcodeStr,X86VectorVTInfo _,
 | 
			
		|||
  defm rrb_Int : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst),
 | 
			
		||||
                            (ins _.RC:$src1, _.RC:$src2), OpcodeStr,
 | 
			
		||||
                            "{sae}, $src2, $src1", "$src1, $src2, {sae}",
 | 
			
		||||
                            (SaeNode (_.VT _.RC:$src1), (_.VT _.RC:$src2),
 | 
			
		||||
                            (i32 FROUND_NO_EXC))>, EVEX_B,
 | 
			
		||||
                            Sched<[sched]>;
 | 
			
		||||
                            (SaeNode (_.VT _.RC:$src1), (_.VT _.RC:$src2))>,
 | 
			
		||||
                            EVEX_B, Sched<[sched]>;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
multiclass avx512_binop_s_round<bits<8> opc, string OpcodeStr, SDNode OpNode,
 | 
			
		||||
                                SDNode VecNode, X86SchedWriteSizes sched,
 | 
			
		||||
                                bit IsCommutable> {
 | 
			
		||||
                                SDNode VecNode, SDNode RndNode,
 | 
			
		||||
                                X86SchedWriteSizes sched, bit IsCommutable> {
 | 
			
		||||
  defm SSZ : avx512_fp_scalar<opc, OpcodeStr#"ss", f32x_info, OpNode, VecNode,
 | 
			
		||||
                              sched.PS.Scl, IsCommutable>,
 | 
			
		||||
             avx512_fp_scalar_round<opc, OpcodeStr#"ss", f32x_info, VecNode,
 | 
			
		||||
             avx512_fp_scalar_round<opc, OpcodeStr#"ss", f32x_info, RndNode,
 | 
			
		||||
                              sched.PS.Scl, IsCommutable>,
 | 
			
		||||
                              XS, EVEX_4V, VEX_LIG,  EVEX_CD8<32, CD8VT1>;
 | 
			
		||||
  defm SDZ : avx512_fp_scalar<opc, OpcodeStr#"sd", f64x_info, OpNode, VecNode,
 | 
			
		||||
                              sched.PD.Scl, IsCommutable>,
 | 
			
		||||
             avx512_fp_scalar_round<opc, OpcodeStr#"sd", f64x_info, VecNode,
 | 
			
		||||
             avx512_fp_scalar_round<opc, OpcodeStr#"sd", f64x_info, RndNode,
 | 
			
		||||
                              sched.PD.Scl, IsCommutable>,
 | 
			
		||||
                              XD, VEX_W, EVEX_4V, VEX_LIG, EVEX_CD8<64, CD8VT1>;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -5559,17 +5556,17 @@ multiclass avx512_binop_s_sae<bits<8> opc, string OpcodeStr, SDNode OpNode,
 | 
			
		|||
                              VecNode, SaeNode, sched.PD.Scl, IsCommutable>,
 | 
			
		||||
                              XD, VEX_W, EVEX_4V, VEX_LIG, EVEX_CD8<64, CD8VT1>;
 | 
			
		||||
}
 | 
			
		||||
defm VADD : avx512_binop_s_round<0x58, "vadd", fadd, X86faddRnds,
 | 
			
		||||
defm VADD : avx512_binop_s_round<0x58, "vadd", fadd, X86fadds, X86faddRnds,
 | 
			
		||||
                                 SchedWriteFAddSizes, 1>;
 | 
			
		||||
defm VMUL : avx512_binop_s_round<0x59, "vmul", fmul, X86fmulRnds,
 | 
			
		||||
defm VMUL : avx512_binop_s_round<0x59, "vmul", fmul, X86fmuls, X86fmulRnds,
 | 
			
		||||
                                 SchedWriteFMulSizes, 1>;
 | 
			
		||||
defm VSUB : avx512_binop_s_round<0x5C, "vsub", fsub, X86fsubRnds,
 | 
			
		||||
defm VSUB : avx512_binop_s_round<0x5C, "vsub", fsub, X86fsubs, X86fsubRnds,
 | 
			
		||||
                                 SchedWriteFAddSizes, 0>;
 | 
			
		||||
defm VDIV : avx512_binop_s_round<0x5E, "vdiv", fdiv, X86fdivRnds,
 | 
			
		||||
defm VDIV : avx512_binop_s_round<0x5E, "vdiv", fdiv, X86fdivs, X86fdivRnds,
 | 
			
		||||
                                 SchedWriteFDivSizes, 0>;
 | 
			
		||||
defm VMIN : avx512_binop_s_sae<0x5D, "vmin", X86fmin, X86fmins, X86fminRnds,
 | 
			
		||||
defm VMIN : avx512_binop_s_sae<0x5D, "vmin", X86fmin, X86fmins, X86fminSAEs,
 | 
			
		||||
                               SchedWriteFCmpSizes, 0>;
 | 
			
		||||
defm VMAX : avx512_binop_s_sae<0x5F, "vmax", X86fmax, X86fmaxs, X86fmaxRnds,
 | 
			
		||||
defm VMAX : avx512_binop_s_sae<0x5F, "vmax", X86fmax, X86fmaxs, X86fmaxSAEs,
 | 
			
		||||
                               SchedWriteFCmpSizes, 0>;
 | 
			
		||||
 | 
			
		||||
// MIN/MAX nodes are commutable under "unsafe-fp-math". In this case we use
 | 
			
		||||
| 
						 | 
				
			
			@ -5656,7 +5653,7 @@ multiclass avx512_fp_sae_packed<bits<8> opc, string OpcodeStr,
 | 
			
		|||
  defm rrb: AVX512_maskable<opc, MRMSrcReg, _, (outs _.RC:$dst),
 | 
			
		||||
                  (ins _.RC:$src1, _.RC:$src2), OpcodeStr##_.Suffix,
 | 
			
		||||
                  "{sae}, $src2, $src1", "$src1, $src2, {sae}",
 | 
			
		||||
                  (_.VT (OpNodeRnd _.RC:$src1, _.RC:$src2, (i32 FROUND_NO_EXC)))>,
 | 
			
		||||
                  (_.VT (OpNodeRnd _.RC:$src1, _.RC:$src2))>,
 | 
			
		||||
                  EVEX_4V, EVEX_B, Sched<[sched]>;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -5725,10 +5722,10 @@ defm VDIV : avx512_fp_binop_p<0x5E, "vdiv", fdiv, HasAVX512,
 | 
			
		|||
            avx512_fp_binop_p_round<0x5E, "vdiv", X86fdivRnd, SchedWriteFDivSizes>;
 | 
			
		||||
defm VMIN : avx512_fp_binop_p<0x5D, "vmin", X86fmin, HasAVX512,
 | 
			
		||||
                              SchedWriteFCmpSizes, 0>,
 | 
			
		||||
            avx512_fp_binop_p_sae<0x5D, "vmin", X86fminRnd, SchedWriteFCmpSizes>;
 | 
			
		||||
            avx512_fp_binop_p_sae<0x5D, "vmin", X86fminSAE, SchedWriteFCmpSizes>;
 | 
			
		||||
defm VMAX : avx512_fp_binop_p<0x5F, "vmax", X86fmax, HasAVX512,
 | 
			
		||||
                              SchedWriteFCmpSizes, 0>,
 | 
			
		||||
            avx512_fp_binop_p_sae<0x5F, "vmax", X86fmaxRnd, SchedWriteFCmpSizes>;
 | 
			
		||||
            avx512_fp_binop_p_sae<0x5F, "vmax", X86fmaxSAE, SchedWriteFCmpSizes>;
 | 
			
		||||
let isCodeGenOnly = 1 in {
 | 
			
		||||
  defm VMINC : avx512_fp_binop_p<0x5D, "vmin", X86fminc, HasAVX512,
 | 
			
		||||
                                 SchedWriteFCmpSizes, 1>;
 | 
			
		||||
| 
						 | 
				
			
			@ -9317,16 +9314,14 @@ multiclass avx512_sqrt_scalar<bits<8> opc, string OpcodeStr, X86FoldableSchedWri
 | 
			
		|||
    defm r_Int : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst),
 | 
			
		||||
                         (ins _.RC:$src1, _.RC:$src2), OpcodeStr,
 | 
			
		||||
                         "$src2, $src1", "$src1, $src2",
 | 
			
		||||
                         (X86fsqrtRnds (_.VT _.RC:$src1),
 | 
			
		||||
                                    (_.VT _.RC:$src2),
 | 
			
		||||
                                    (i32 FROUND_CURRENT))>,
 | 
			
		||||
                         (X86fsqrts (_.VT _.RC:$src1),
 | 
			
		||||
                                    (_.VT _.RC:$src2))>,
 | 
			
		||||
                         Sched<[sched]>;
 | 
			
		||||
    defm m_Int : AVX512_maskable_scalar<opc, MRMSrcMem, _, (outs _.RC:$dst),
 | 
			
		||||
                         (ins _.RC:$src1, _.IntScalarMemOp:$src2), OpcodeStr,
 | 
			
		||||
                         "$src2, $src1", "$src1, $src2",
 | 
			
		||||
                         (X86fsqrtRnds (_.VT _.RC:$src1),
 | 
			
		||||
                                    _.ScalarIntMemCPat:$src2,
 | 
			
		||||
                                    (i32 FROUND_CURRENT))>,
 | 
			
		||||
                         (X86fsqrts (_.VT _.RC:$src1),
 | 
			
		||||
                                    _.ScalarIntMemCPat:$src2)>,
 | 
			
		||||
                         Sched<[sched.Folded, sched.ReadAfterFold]>;
 | 
			
		||||
    defm rb_Int : AVX512_maskable_scalar<opc, MRMSrcReg, _, (outs _.RC:$dst),
 | 
			
		||||
                         (ins _.RC:$src1, _.RC:$src2, AVX512RC:$rc), OpcodeStr,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -459,20 +459,25 @@ def X86Blendv    : SDNode<"X86ISD::BLENDV",
 | 
			
		|||
def X86Addsub    : SDNode<"X86ISD::ADDSUB", SDTFPBinOp>;
 | 
			
		||||
 | 
			
		||||
def X86faddRnd   : SDNode<"X86ISD::FADD_RND",  SDTFPBinOpRound>;
 | 
			
		||||
def X86fadds     : SDNode<"X86ISD::FADDS",     SDTFPBinOp>;
 | 
			
		||||
def X86faddRnds  : SDNode<"X86ISD::FADDS_RND", SDTFPBinOpRound>;
 | 
			
		||||
def X86fsubRnd   : SDNode<"X86ISD::FSUB_RND",  SDTFPBinOpRound>;
 | 
			
		||||
def X86fsubs     : SDNode<"X86ISD::FSUBS",     SDTFPBinOp>;
 | 
			
		||||
def X86fsubRnds  : SDNode<"X86ISD::FSUBS_RND", SDTFPBinOpRound>;
 | 
			
		||||
def X86fmulRnd   : SDNode<"X86ISD::FMUL_RND",  SDTFPBinOpRound>;
 | 
			
		||||
def X86fmuls     : SDNode<"X86ISD::FMULS",     SDTFPBinOp>;
 | 
			
		||||
def X86fmulRnds  : SDNode<"X86ISD::FMULS_RND", SDTFPBinOpRound>;
 | 
			
		||||
def X86fdivRnd   : SDNode<"X86ISD::FDIV_RND",  SDTFPBinOpRound>;
 | 
			
		||||
def X86fdivs     : SDNode<"X86ISD::FDIVS",     SDTFPBinOp>;
 | 
			
		||||
def X86fdivRnds  : SDNode<"X86ISD::FDIVS_RND", SDTFPBinOpRound>;
 | 
			
		||||
def X86fmaxRnd   : SDNode<"X86ISD::FMAX_RND",  SDTFPBinOpRound>;
 | 
			
		||||
def X86fmaxRnds  : SDNode<"X86ISD::FMAXS_RND", SDTFPBinOpRound>;
 | 
			
		||||
def X86fminRnd   : SDNode<"X86ISD::FMIN_RND",  SDTFPBinOpRound>;
 | 
			
		||||
def X86fminRnds  : SDNode<"X86ISD::FMINS_RND", SDTFPBinOpRound>;
 | 
			
		||||
def X86fmaxSAE   : SDNode<"X86ISD::FMAX_SAE",  SDTFPBinOp>;
 | 
			
		||||
def X86fmaxSAEs  : SDNode<"X86ISD::FMAXS_SAE", SDTFPBinOp>;
 | 
			
		||||
def X86fminSAE   : SDNode<"X86ISD::FMIN_SAE",  SDTFPBinOp>;
 | 
			
		||||
def X86fminSAEs  : SDNode<"X86ISD::FMINS_SAE", SDTFPBinOp>;
 | 
			
		||||
def X86scalef    : SDNode<"X86ISD::SCALEF",         SDTFPBinOpRound>;
 | 
			
		||||
def X86scalefs   : SDNode<"X86ISD::SCALEFS",        SDTFPBinOpRound>;
 | 
			
		||||
def X86fsqrtRnd     : SDNode<"X86ISD::FSQRT_RND",   SDTFPUnaryOpRound>;
 | 
			
		||||
def X86fsqrts       : SDNode<"X86ISD::FSQRTS", SDTFPBinOp>;
 | 
			
		||||
def X86fsqrtRnds    : SDNode<"X86ISD::FSQRTS_RND", SDTFPBinOpRound>;
 | 
			
		||||
def X86fgetexpRnd   : SDNode<"X86ISD::FGETEXP_RND", SDTFPUnaryOpRound>;
 | 
			
		||||
def X86fgetexpRnds  : SDNode<"X86ISD::FGETEXPS_RND", SDTFPBinOpRound>;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,10 +24,11 @@ enum IntrinsicType : uint16_t {
 | 
			
		|||
  INTR_TYPE_3OP_IMM8,
 | 
			
		||||
  CMP_MASK_CC,CMP_MASK_SCALAR_CC, VSHIFT, COMI, COMI_RM, BLENDV,
 | 
			
		||||
  CVTPD2PS_MASK,
 | 
			
		||||
  INTR_TYPE_2OP_SAE,
 | 
			
		||||
  INTR_TYPE_1OP_MASK, INTR_TYPE_1OP_MASK_RM,
 | 
			
		||||
  INTR_TYPE_2OP_MASK, INTR_TYPE_2OP_MASK_RM,
 | 
			
		||||
  INTR_TYPE_3OP_MASK,
 | 
			
		||||
  IFMA_OP, VPERM_2OP, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
  IFMA_OP, VPERM_2OP, INTR_TYPE_SCALAR_MASK, INTR_TYPE_SCALAR_MASK_SAE,
 | 
			
		||||
  INTR_TYPE_SCALAR_MASK_RM, INTR_TYPE_3OP_SCALAR_MASK,
 | 
			
		||||
  COMPRESS_EXPAND_IN_REG,
 | 
			
		||||
  TRUNCATE_TO_REG, CVTPS2PH_MASK, CVTPD2DQ_MASK, CVTQQ2PS_MASK,
 | 
			
		||||
| 
						 | 
				
			
			@ -456,10 +457,10 @@ static const IntrinsicData  IntrinsicsWithoutChain[] = {
 | 
			
		|||
  X86_INTRINSIC_DATA(avx512_kadd_d, INTR_TYPE_2OP, X86ISD::KADD, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_kadd_q, INTR_TYPE_2OP, X86ISD::KADD, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_kadd_w, INTR_TYPE_2OP, X86ISD::KADD, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_add_sd_round, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FADDS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_add_ss_round, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FADDS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_add_sd_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FADDS, X86ISD::FADDS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_add_ss_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FADDS, X86ISD::FADDS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_cmp_sd,     CMP_MASK_SCALAR_CC,
 | 
			
		||||
                     X86ISD::FSETCCM, X86ISD::FSETCCM_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_cmp_ss,     CMP_MASK_SCALAR_CC,
 | 
			
		||||
| 
						 | 
				
			
			@ -569,10 +570,10 @@ static const IntrinsicData  IntrinsicsWithoutChain[] = {
 | 
			
		|||
                     X86ISD::CVTTP2UI, X86ISD::CVTTP2UI_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_cvtuqq2ps_128, CVTQQ2PS_MASK,
 | 
			
		||||
                     X86ISD::CVTUI2P, X86ISD::MCVTUI2P),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_div_sd_round, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FDIVS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_div_ss_round, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FDIVS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_div_sd_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FDIVS, X86ISD::FDIVS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_div_ss_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FDIVS, X86ISD::FDIVS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_expand,        COMPRESS_EXPAND_IN_REG,
 | 
			
		||||
                     X86ISD::EXPAND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_fixupimm_pd_128, FIXUPIMM, X86ISD::VFIXUPIMM, 0),
 | 
			
		||||
| 
						 | 
				
			
			@ -617,18 +618,18 @@ static const IntrinsicData  IntrinsicsWithoutChain[] = {
 | 
			
		|||
                     X86ISD::VGETMANTS, X86ISD::VGETMANTS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_getmant_ss, INTR_TYPE_3OP_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::VGETMANTS, X86ISD::VGETMANTS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_max_sd_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FMAXS, X86ISD::FMAXS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_max_ss_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FMAXS, X86ISD::FMAXS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_min_sd_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FMINS, X86ISD::FMINS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_min_ss_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FMINS, X86ISD::FMINS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_mul_sd_round, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FMULS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_mul_ss_round, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FMULS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_max_sd_round, INTR_TYPE_SCALAR_MASK_SAE,
 | 
			
		||||
                     X86ISD::FMAXS, X86ISD::FMAXS_SAE),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_max_ss_round, INTR_TYPE_SCALAR_MASK_SAE,
 | 
			
		||||
                     X86ISD::FMAXS, X86ISD::FMAXS_SAE),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_min_sd_round, INTR_TYPE_SCALAR_MASK_SAE,
 | 
			
		||||
                     X86ISD::FMINS, X86ISD::FMINS_SAE),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_min_ss_round, INTR_TYPE_SCALAR_MASK_SAE,
 | 
			
		||||
                     X86ISD::FMINS, X86ISD::FMINS_SAE),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_mul_sd_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FMULS, X86ISD::FMULS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_mul_ss_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FMULS, X86ISD::FMULS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_pmov_db_128, TRUNCATE_TO_REG,
 | 
			
		||||
                     X86ISD::VTRUNC, X86ISD::VMTRUNC),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_pmov_db_256, TRUNCATE_TO_REG,
 | 
			
		||||
| 
						 | 
				
			
			@ -771,14 +772,14 @@ static const IntrinsicData  IntrinsicsWithoutChain[] = {
 | 
			
		|||
                     X86ISD::SCALEFS, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_scalef_ss, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::SCALEFS, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_sqrt_sd, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FSQRTS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_sqrt_ss, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FSQRTS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_sub_sd_round, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FSUBS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_sub_ss_round, INTR_TYPE_SCALAR_MASK_RM,
 | 
			
		||||
                     X86ISD::FSUBS_RND, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_sqrt_sd, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FSQRTS, X86ISD::FSQRTS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_sqrt_ss, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FSQRTS, X86ISD::FSQRTS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_sub_sd_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FSUBS, X86ISD::FSUBS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_sub_ss_round, INTR_TYPE_SCALAR_MASK,
 | 
			
		||||
                     X86ISD::FSUBS, X86ISD::FSUBS_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_vcvtph2ps_128, INTR_TYPE_1OP_MASK,
 | 
			
		||||
                     X86ISD::CVTPH2PS, 0),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mask_vcvtph2ps_256, INTR_TYPE_1OP_MASK,
 | 
			
		||||
| 
						 | 
				
			
			@ -809,10 +810,10 @@ static const IntrinsicData  IntrinsicsWithoutChain[] = {
 | 
			
		|||
  X86_INTRINSIC_DATA(avx512_maskz_fixupimm_ss, FIXUPIMMS_MASKZ,
 | 
			
		||||
                     X86ISD::VFIXUPIMMS, 0),
 | 
			
		||||
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_max_pd_512, INTR_TYPE_2OP, X86ISD::FMAX, X86ISD::FMAX_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_max_ps_512, INTR_TYPE_2OP, X86ISD::FMAX, X86ISD::FMAX_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_min_pd_512, INTR_TYPE_2OP, X86ISD::FMIN, X86ISD::FMIN_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_min_ps_512, INTR_TYPE_2OP, X86ISD::FMIN, X86ISD::FMIN_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_max_pd_512, INTR_TYPE_2OP_SAE, X86ISD::FMAX, X86ISD::FMAX_SAE),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_max_ps_512, INTR_TYPE_2OP_SAE, X86ISD::FMAX, X86ISD::FMAX_SAE),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_min_pd_512, INTR_TYPE_2OP_SAE, X86ISD::FMIN, X86ISD::FMIN_SAE),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_min_ps_512, INTR_TYPE_2OP_SAE, X86ISD::FMIN, X86ISD::FMIN_SAE),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mul_pd_512, INTR_TYPE_2OP, ISD::FMUL, X86ISD::FMUL_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_mul_ps_512, INTR_TYPE_2OP, ISD::FMUL, X86ISD::FMUL_RND),
 | 
			
		||||
  X86_INTRINSIC_DATA(avx512_packssdw_512, INTR_TYPE_2OP, X86ISD::PACKSS, 0),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue