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");
|