aboutsummaryrefslogtreecommitdiff
path: root/opcodes/ppc-dis.c
diff options
context:
space:
mode:
Diffstat (limited to 'opcodes/ppc-dis.c')
-rw-r--r--opcodes/ppc-dis.c66
1 files changed, 25 insertions, 41 deletions
diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c
index efa7898..f8b0292 100644
--- a/opcodes/ppc-dis.c
+++ b/opcodes/ppc-dis.c
@@ -380,60 +380,44 @@ static unsigned short spe2_opcd_indices[SPE2_OPCD_SEGS+1];
void
disassemble_init_powerpc (struct disassemble_info *info)
{
- int i;
- unsigned short last;
-
if (powerpc_opcd_indices[PPC_OPCD_SEGS] == 0)
{
- i = powerpc_num_opcodes;
- while (--i >= 0)
- {
- unsigned op = PPC_OP (powerpc_opcodes[i].opcode);
- powerpc_opcd_indices[op] = i;
- }
+ unsigned seg, idx, op;
- last = powerpc_num_opcodes;
- for (i = PPC_OPCD_SEGS; i > 0; --i)
+ /* PPC opcodes */
+ for (seg = 0, idx = 0; seg <= PPC_OPCD_SEGS; seg++)
{
- if (powerpc_opcd_indices[i] == 0)
- powerpc_opcd_indices[i] = last;
- last = powerpc_opcd_indices[i];
+ powerpc_opcd_indices[seg] = idx;
+ for (; idx < powerpc_num_opcodes; idx++)
+ if (seg < PPC_OP (powerpc_opcodes[idx].opcode))
+ break;
}
- i = vle_num_opcodes;
- while (--i >= 0)
+ /* VLE opcodes */
+ for (seg = 0, idx = 0; seg <= VLE_OPCD_SEGS; seg++)
{
- unsigned op = VLE_OP (vle_opcodes[i].opcode, vle_opcodes[i].mask);
- unsigned seg = VLE_OP_TO_SEG (op);
- vle_opcd_indices[seg] = i;
+ vle_opcd_indices[seg] = idx;
+ for (; idx < vle_num_opcodes; idx++)
+ {
+ op = VLE_OP (vle_opcodes[idx].opcode, vle_opcodes[idx].mask);
+ if (seg < VLE_OP_TO_SEG (op))
+ break;
+ }
}
- last = vle_num_opcodes;
- for (i = VLE_OPCD_SEGS; i > 0; --i)
+ /* SPE2 opcodes */
+ for (seg = 0, idx = 0; seg <= SPE2_OPCD_SEGS; seg++)
{
- if (vle_opcd_indices[i] == 0)
- vle_opcd_indices[i] = last;
- last = vle_opcd_indices[i];
+ spe2_opcd_indices[seg] = idx;
+ for (; idx < spe2_num_opcodes; idx++)
+ {
+ op = SPE2_XOP (spe2_opcodes[idx].opcode);
+ if (seg < SPE2_XOP_TO_SEG (op))
+ break;
+ }
}
}
- /* SPE2 opcodes */
- i = spe2_num_opcodes;
- while (--i >= 0)
- {
- unsigned xop = SPE2_XOP (spe2_opcodes[i].opcode);
- unsigned seg = SPE2_XOP_TO_SEG (xop);
- spe2_opcd_indices[seg] = i;
- }
-
- last = spe2_num_opcodes;
- for (i = SPE2_OPCD_SEGS; i > 1; --i)
- {
- if (spe2_opcd_indices[i] == 0)
- spe2_opcd_indices[i] = last;
- last = spe2_opcd_indices[i];
- }
-
powerpc_init_dialect (info);
}