コード例 #1
0
ファイル: genconfig.c プロジェクト: easyaspi314/agbcc
static void gen_peephole(rtx peep)
{
    int i;

    /* Look through the patterns that are matched
       to compute the maximum operand number.  */
    for (i = 0; i < XVECLEN(peep, 0); i++)
        walk_insn_part(XVECEXP(peep, 0, i), 1, 0);
}
コード例 #2
0
ファイル: genconfig.c プロジェクト: easyaspi314/agbcc
static void gen_split(rtx split)
{
    int i;

    /* Look through the patterns that are matched
       to compute the maximum operand number.  */
    for (i = 0; i < XVECLEN(split, 0); i++)
        walk_insn_part(XVECEXP(split, 0, i), 1, 0);
    /* Look at the number of insns this insn could split into.  */
    if (XVECLEN(split, 2) > max_insns_per_split)
        max_insns_per_split = XVECLEN(split, 2);
}
コード例 #3
0
ファイル: genconfig.c プロジェクト: easyaspi314/agbcc
static void gen_insn(rtx insn)
{
    int i;

    /* Walk the insn pattern to gather the #define's status.  */
    clobbers_seen_this_insn = 0;
    dup_operands_seen_this_insn = 0;
    if (XVEC(insn, 1) != 0)
        for (i = 0; i < XVECLEN(insn, 1); i++)
            walk_insn_part(XVECEXP(insn, 1, i), 1, 0);

    if (clobbers_seen_this_insn > max_clobbers_per_insn)
        max_clobbers_per_insn = clobbers_seen_this_insn;
    if (dup_operands_seen_this_insn > max_dup_operands)
        max_dup_operands = dup_operands_seen_this_insn;
}
コード例 #4
0
ファイル: genconfig.c プロジェクト: wqren/pymc-1
static void
gen_peephole2 (rtx peep)
{
  int i, n;

  /* Look through the patterns that are matched
     to compute the maximum operand number.  */
  for (i = XVECLEN (peep, 0) - 1; i >= 0; --i)
    walk_insn_part (XVECEXP (peep, 0, i), 1, 0);

  /* Look at the number of insns this insn can be matched from.  */
  for (i = XVECLEN (peep, 0) - 1, n = 0; i >= 0; --i)
    if (GET_CODE (XVECEXP (peep, 0, i)) != MATCH_DUP
        && GET_CODE (XVECEXP (peep, 0, i)) != MATCH_SCRATCH)
      n++;
  if (n > max_insns_per_peep2)
    max_insns_per_peep2 = n;
}
コード例 #5
0
ファイル: genconfig.c プロジェクト: easyaspi314/agbcc
static void gen_expand(rtx insn)
{
    int i;

    /* Walk the insn pattern to gather the #define's status.  */

    /* Note that we don't bother recording the number of MATCH_DUPs
       that occur in a gen_expand, because only reload cares about that.  */
    if (XVEC(insn, 1) != 0)
        for (i = 0; i < XVECLEN(insn, 1); i++)
        {
            /* Compute the maximum SETs and CLOBBERS
               in any one of the sub-insns;
               don't sum across all of them.  */
            clobbers_seen_this_insn = 0;

            walk_insn_part(XVECEXP(insn, 1, i), 0, 0);

            if (clobbers_seen_this_insn > max_clobbers_per_insn)
                max_clobbers_per_insn = clobbers_seen_this_insn;
        }
}
コード例 #6
0
ファイル: genconfig.c プロジェクト: markus-oberhumer/gcc
static void
walk_insn_part (rtx part, int recog_p, int non_pc_set_src)
{
  int i, j;
  RTX_CODE code;
  const char *format_ptr;

  if (part == 0)
    return;

  code = GET_CODE (part);
  switch (code)
    {
    case CLOBBER:
      clobbers_seen_this_insn++;
      break;

    case MATCH_OPERAND:
      if (XINT (part, 0) > max_recog_operands)
	max_recog_operands = XINT (part, 0);
      return;

    case MATCH_OP_DUP:
    case MATCH_PAR_DUP:
      ++dup_operands_seen_this_insn;
      /* FALLTHRU */
    case MATCH_SCRATCH:
    case MATCH_PARALLEL:
    case MATCH_OPERATOR:
      if (XINT (part, 0) > max_recog_operands)
	max_recog_operands = XINT (part, 0);
      /* Now scan the rtl's in the vector inside the MATCH_OPERATOR or
	 MATCH_PARALLEL.  */
      break;

    case LABEL_REF:
      if (GET_CODE (LABEL_REF_LABEL (part)) == MATCH_OPERAND
	  || GET_CODE (LABEL_REF_LABEL (part)) == MATCH_DUP)
	break;
      return;

    case MATCH_DUP:
      ++dup_operands_seen_this_insn;
      if (XINT (part, 0) > max_recog_operands)
	max_recog_operands = XINT (part, 0);
      return;

    case CC0:
      if (recog_p)
	have_cc0_flag = 1;
      return;

    case LO_SUM:
      if (recog_p)
	have_lo_sum_flag = 1;
      return;

    case ROTATE:
      if (recog_p)
	have_rotate_flag = 1;
      return;

    case ROTATERT:
      if (recog_p)
	have_rotatert_flag = 1;
      return;

    case SET:
      walk_insn_part (SET_DEST (part), 0, recog_p);
      walk_insn_part (SET_SRC (part), recog_p,
		      GET_CODE (SET_DEST (part)) != PC);
      return;

    case IF_THEN_ELSE:
      /* Only consider this machine as having a conditional move if the
	 two arms of the IF_THEN_ELSE are both MATCH_OPERAND.  Otherwise,
	 we have some specific IF_THEN_ELSE construct (like the doz
	 instruction on the RS/6000) that can't be used in the general
	 context we want it for.  */

      if (recog_p && non_pc_set_src
	  && GET_CODE (XEXP (part, 1)) == MATCH_OPERAND
	  && GET_CODE (XEXP (part, 2)) == MATCH_OPERAND)
	have_cmove_flag = 1;
      break;

    case COND_EXEC:
      if (recog_p)
	have_cond_exec_flag = 1;
      break;

    case REG: case CONST_INT: case SYMBOL_REF:
    case PC:
      return;

    default:
      break;
    }

  format_ptr = GET_RTX_FORMAT (GET_CODE (part));

  for (i = 0; i < GET_RTX_LENGTH (GET_CODE (part)); i++)
    switch (*format_ptr++)
      {
      case 'e':
      case 'u':
	walk_insn_part (XEXP (part, i), recog_p, non_pc_set_src);
	break;
      case 'E':
	if (XVEC (part, i) != NULL)
	  for (j = 0; j < XVECLEN (part, i); j++)
	    walk_insn_part (XVECEXP (part, i, j), recog_p, non_pc_set_src);
	break;
      }
}