/* Find an instruction entry in the ia64_dis_names array that matches
opcode OPCODE and is of type TYPE. Returns either a positive index
into the array, or a negative value if an entry for OPCODE could
- not be found. */
+ not be found. Checks all matches and returns the one with the highest
+ priority. */
static int
locate_opcode_ent (opcode, type)
int bitpos[41];
int op_ptr[41];
int currstatenum = 0;
+ short found_disent = -1;
+ short found_priority = -1;
currtest[currstatenum] = 0;
op_ptr[currstatenum] = 0;
if ((next_op >= 0) && (next_op & 32768))
{
short disent = next_op & 32767;
+ short priority = -1;
if (next_op > 65535)
{
{
int place = ia64_dis_names[disent].insn_index;
- if (opcode_verify (opcode, place, type))
+ priority = ia64_dis_names[disent].priority;
+
+ if (opcode_verify (opcode, place, type)
+ && priority > found_priority)
{
break;
}
if (disent >= 0)
{
- return disent;
- }
- else
- {
- /* Failed to match; try the next test in this state. */
- next_op = -2;
+ found_disent = disent;
+ found_priority = priority;
}
+ /* Try the next test in this state, regardless of whether a match
+ was found. */
+ next_op = -2;
}
/* next_op == -1 is "back up to the previous state".
currstatenum--;
if (currstatenum < 0)
{
- return -1;
+ return found_disent;
}
}
else if (next_op >= 0)