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 712 and 713

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

Rev 712 Rev 713
Line 59... Line 59...
  fflush(stdout);
  fflush(stdout);
  free(p);
  free(p);
#endif
#endif
}
}
 
 
 
/* Whether this instruction stores something in register */
 
static int write_to_reg = 0;
 
 
static int olevel;
static int olevel;
 
 
 
/* Following functions recursivelly searches for substrings eval_operand and
 
   set_operand (see functions with the same name in execute.c) and replaces
 
   them with optimized code. */
char *replace_operands (FILE *fo, char *str) {
char *replace_operands (FILE *fo, char *str) {
  int replace = 0;
  int replace = 0;
  if (*str == '}') {olevel--;}
  if (*str == '}') {olevel--;}
  else if (*str == '{') {olevel++;}
  else if (*str == '{') {olevel++;}
  else if (strncmp ("eval_operand", str, 12) == 0) {
  else if (strncmp ("eval_operand", str, 12) == 0) {
Line 81... Line 87...
    if (replace == 1) {
    if (replace == 1) {
      if (op[oper] & OPTYPE_DIS) {
      if (op[oper] & OPTYPE_DIS) {
        fprintf (fo, "eval_mem%i (%c", width, 'a' + oper);
        fprintf (fo, "eval_mem%i (%c", width, 'a' + oper);
      } else {
      } else {
        if (op[oper] & OPTYPE_REG) {
        if (op[oper] & OPTYPE_REG) {
          fprintf (fo, "eval_reg%i (%c", width, 'a' + oper);
          fprintf (fo, "(reg[%c]", 'a' + oper);
        } else {
        } else {
          fprintf (fo, "(%c", 'a' + oper);
          fprintf (fo, "(%c", 'a' + oper);
        }
        }
      }
      }
    } else {
    } else {
      op[oper] |= OPTYPE_DST;
      op[oper] |= OPTYPE_DST;
      if (op[oper] & OPTYPE_DIS) {
      if (op[oper] & OPTYPE_DIS) {
        fprintf (fo, "set_mem%i(%c,", width, 'a' + oper);
        fprintf (fo, "set_mem%i(%c,", width, 'a' + oper);
      } else if (op[oper] & OPTYPE_REG) {
      } else if (op[oper] & OPTYPE_REG) {
        fprintf (fo, "set_reg%i(%c,",width, 'a' + oper);
        fprintf (fo, "reg[%c] = (", 'a' + oper);
 
        write_to_reg = 1;
      } else {
      } else {
        fprintf (stderr, "Invalid operand type.\n");
        fprintf (stderr, "Invalid operand type.\n");
        exit (1);
        exit (1);
      }
      }
      while (*str != ',') str = replace_operands (fo, str) + 1;
      while (*str != ',') str = replace_operands (fo, str) + 1;
Line 107... Line 114...
    fputc (*str, fo);
    fputc (*str, fo);
  }
  }
  return str;
  return str;
}
}
 
 
 
/* Generates a execute sequence for one instruction */
int output_function (FILE *fo, const char *func_name, int level)
int output_function (FILE *fo, const char *func_name, int level)
{
{
  FILE *fi;
  FILE *fi;
  if ((fi = fopen (in_file, "rt")) == NULL) return 1;
  if ((fi = fopen (in_file, "rt")) == NULL) return 1;
  while (!feof (fi)) {
  while (!feof (fi)) {
Line 194... Line 202...
        firstd = 0;
        firstd = 0;
        dis = 1;
        dis = 1;
      } else
      } else
        {
        {
          if (dis && (opd->type & OPTYPE_REG)) {
          if (dis && (opd->type & OPTYPE_REG)) {
 
            if (MAX_GPRS == (1 << nbits)) {
 
              SHIFT; fprintf (fo, "op[%i] = %c = data + reg [tmp];\n", no, 'a' + no);
 
            }else {
            SHIFT; fprintf (fo, "op[%i] = %c = data + eval_reg32 (tmp);\n", no, 'a' + no);
            SHIFT; fprintf (fo, "op[%i] = %c = data + eval_reg32 (tmp);\n", no, 'a' + no);
 
            }
          } else {
          } else {
            SHIFT; fprintf (fo, "op[%i] = %c = tmp;\n", no, 'a' + no);
            SHIFT; fprintf (fo, "op[%i] = %c = tmp;\n", no, 'a' + no);
          }
          }
          SHIFT; fprintf (fo, "op[%i + MAX_OPERANDS] = 0x%08x;\n", no, opd->type | (dis ? OPTYPE_DIS : 0));
          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);
Line 214... Line 226...
      opd++;
      opd++;
    }
    }
  SHIFT; fprintf (fo, "num_op = %i;\n", no);
  SHIFT; fprintf (fo, "num_op = %i;\n", no);
}
}
 
 
 
/* 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)
{
{
  int i;
  int i;
  printf ("%i:%s\n", index, insn_name (index));
  printf ("%i:%s\n", index, insn_name (index));
  fprintf (fo, "{\n");
  fprintf (fo, "{\n");
  level++;
  level++;
  if (index >= 0) {
  if (index >= 0) {
    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;
  if (index >= 0) {
  if (index >= 0) {
    SHIFT; fprintf (fo, "insn_index = %i;   /* \"%s\" */\n", index, insn_name (index));
    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, "/* insn_index = -1 by default */\n");
    SHIFT; fprintf (fo, "insn_index = -1;\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);
  printf ("\n");
  fprintf (fo, "\n");
  for (i = 0; i < num_op; i++)
  for (i = 0; i < num_op; i++)
    if (op[i] & OPTYPE_DST) {
    if (op[i] & OPTYPE_DST) {
      SHIFT; fprintf (fo, "IFF (config.cpu.dependstats) op[%i + MAX_OPERANDS] |= OPTYPE_DST;\n", i);
      SHIFT; fprintf (fo, "IFF (config.cpu.dependstats) op[%i + MAX_OPERANDS] |= OPTYPE_DST;\n", i);
    }
    }
 
  if (write_to_reg) {
 
    SHIFT; fprintf (fo, "reg[0] = 0; /* Repair in case we changed it */\n", i);
 
  }
  level--;
  level--;
  SHIFT; fprintf (fo, "}");
  SHIFT; fprintf (fo, "}");
  return 0;
  return 0;
}
}
 
 
 
/* Generates .c file header */
static int generate_header (FILE *fo)
static int generate_header (FILE *fo)
{
{
  fprintf (fo, "/* This file was automatically generated by generate (see cpu/or32/generate.c) */\n\n");
  fprintf (fo, "/* This file was automatically generated by generate (see cpu/or32/generate.c) */\n\n");
  fprintf (fo, "static inline void decode_execute (struct iqueue_entry *current)\n{\n");
  fprintf (fo, "static inline void decode_execute (struct iqueue_entry *current)\n{\n");
  fprintf (fo, "  unsigned long insn = current->insn;\n");
  fprintf (fo, "  unsigned long insn = current->insn;\n");
  fprintf (fo, "  int insn_index = -1;\n");
  fprintf (fo, "  int insn_index;\n");
  fprintf (fo, "  op = &cur->op[0];\n");
  fprintf (fo, "  op = &current->op[0];\n");
  return 0;
  return 0;
}
}
 
 
 
/* Generates .c file footer */
int generate_footer (FILE *fo)
int generate_footer (FILE *fo)
{
{
  fprintf (fo, "  current->insn_index = insn_index;\n");
  fprintf (fo, "  current->insn_index = insn_index;\n");
  fprintf (fo, "}\n");
  fprintf (fo, "}\n");
  return 0;
  return 0;
Line 348... Line 367...
  fclose (fo);
  fclose (fo);
  destruct_automata ();
  destruct_automata ();
  return 0;
  return 0;
}
}
 
 
 No newline at end of file
 No newline at end of file
 
 
 No newline at end of file
 No newline at end of file

powered by: WebSVN 2.1.0

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