OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_47/] [or1ksim/] [cpu/] [or32/] [generate.c] - Diff between revs 713 and 714

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 713 Rev 714
Line 172... Line 172...
static void
static void
gen_eval_operands (FILE *fo, int insn_index, int level)
gen_eval_operands (FILE *fo, int insn_index, int level)
{
{
  struct insn_op_struct *opd = op_start[insn_index];
  struct insn_op_struct *opd = op_start[insn_index];
  int dis = 0;
  int dis = 0;
  int no = 0;
  int no = 0, num_op;
  int firstd = 1;
  int firstd = 1;
 
 
  while (1)
  while (1)
    {
    {
      int nbits = 0, first = 1;
      int nbits = 0, first = 1;
Line 203... Line 203...
        dis = 1;
        dis = 1;
      } else
      } else
        {
        {
          if (dis && (opd->type & OPTYPE_REG)) {
          if (dis && (opd->type & OPTYPE_REG)) {
            if (MAX_GPRS == (1 << nbits)) {
            if (MAX_GPRS == (1 << nbits)) {
              SHIFT; fprintf (fo, "op[%i] = %c = data + reg [tmp];\n", no, 'a' + no);
              SHIFT; fprintf (fo, "%c = data + reg [tmp];\n", 'a' + no);
            }else {
            }else {
              SHIFT; fprintf (fo, "op[%i] = %c = data + eval_reg32 (tmp);\n", no, 'a' + no);
              SHIFT; fprintf (fo, "%c = data + eval_reg32 (tmp);\n", 'a' + no);
            }
            }
          } else {
          } else {
            SHIFT; fprintf (fo, "op[%i] = %c = tmp;\n", no, 'a' + no);
            SHIFT; fprintf (fo, "%c = tmp;\n", 'a' + no);
          }
          }
          SHIFT; fprintf (fo, "op[%i + MAX_OPERANDS] = 0x%08x;\n", no, opd->type | (dis ? OPTYPE_DIS : 0));
 
          op[no] = opd->type | (dis ? OPTYPE_DIS : 0);
          op[no] = opd->type | (dis ? OPTYPE_DIS : 0);
          no++;
          no++;
          firstd = 1;
          firstd = 1;
          dis = 0;
          dis = 0;
        }
        }
      if(opd->type & OPTYPE_LAST) {
      if(opd->type & OPTYPE_LAST) goto last;
        SHIFT; fprintf (fo, "num_op = %i;\n", no);
 
        num_op = no;
 
        return;
 
      }
 
      opd++;
      opd++;
    }
    }
 
 
 
last:
 
  num_op = no;
 
  SHIFT; fprintf (fo, "if (do_stats) {\n");
 
  level++;
  SHIFT; fprintf (fo, "num_op = %i;\n", no);
  SHIFT; fprintf (fo, "num_op = %i;\n", no);
 
  SHIFT; fprintf (fo, "insn_index = %i;   /* \"%s\" */\n", insn_index, insn_name (insn_index));
 
  for (no = 0; no < num_op; no++) {
 
    SHIFT; fprintf (fo, "op[%i] = %c;\n", no, 'a' + no);
 
    SHIFT; fprintf (fo, "op[%i + MAX_OPERANDS] = 0x%08x;\n", no, op[no]);
 
  }
 
  level--;
 
  SHIFT; fprintf (fo, "}\n");
}
}
 
 
/* Generates decode and execute for one instruction instance */
/* Generates decode and execute for one instruction instance */
int output_call (FILE *fo, int index, int level)
int output_call (FILE *fo, int index, int level)
{
{
Line 239... Line 246...
    SHIFT; fprintf (fo, "unsigned long data, tmp;\n");
    SHIFT; fprintf (fo, "unsigned long data, tmp;\n");
    SHIFT; fprintf (fo, "unsigned long a, b, c; /* operands */\n");
    SHIFT; fprintf (fo, "unsigned long a, b, c; /* operands */\n");
  }
  }
  write_to_reg = 0;
  write_to_reg = 0;
  if (index >= 0) {
  if (index >= 0) {
    SHIFT; fprintf (fo, "insn_index = %i;   /* \"%s\" */\n", index, insn_name (index));
 
    gen_eval_operands (fo, index, level);
    gen_eval_operands (fo, index, level);
  } else {
  } else {
 
    SHIFT; fprintf (fo, "if (do_stats) {\n");
 
    level++;
 
    SHIFT; fprintf (fo, "num_op = 0;\n");
    SHIFT; fprintf (fo, "insn_index = -1;\n");
    SHIFT; fprintf (fo, "insn_index = -1;\n");
 
    level--;
 
    SHIFT; fprintf (fo, "}\n");
  }
  }
  SHIFT;
  SHIFT;
  if (index < 0) output_function (fo, "l_invalid", level);
  if (index < 0) output_function (fo, "l_invalid", level);
  else output_function (fo, or32_opcodes[index].function_name, level);
  else output_function (fo, or32_opcodes[index].function_name, level);
  fprintf (fo, "\n");
  fprintf (fo, "\n");

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.