If non-null INSN is the insn table entry.
Otherwise INSN_VALUE is examined to compute it.
LENGTH is the bit length of INSN_VALUE if known, otherwise 0.
+ ALIAS_P is non-zero if alias insns are to be included in the search.
The result a pointer to the insn table entry, or NULL if the instruction
wasn't recognized. */
const CGEN_INSN *
-@arch@_cgen_lookup_insn (insn, insn_value, length, fields)
+@arch@_cgen_lookup_insn (insn, insn_value, length, fields, alias_p)
const CGEN_INSN *insn;
cgen_insn_t insn_value;
int length;
CGEN_FIELDS *fields;
{
- char buf[4];
+ char buf[16];
if (!insn)
{
{
insn = insn_list->insn;
- /* Basic bit mask must be correct. */
- /* ??? May wish to allow target to defer this check until the extract
- handler. */
- if ((insn_value & CGEN_INSN_MASK (insn)) == CGEN_INSN_VALUE (insn))
+ if (alias_p
+ || ! CGEN_INSN_ATTR (insn, CGEN_INSN_ALIAS))
{
- length = (*CGEN_EXTRACT_FN (insn)) (insn, NULL, insn_value, fields);
- if (length > 0)
- return insn;
+ /* Basic bit mask must be correct. */
+ /* ??? May wish to allow target to defer this check until the
+ extract handler. */
+ if ((insn_value & CGEN_INSN_MASK (insn)) == CGEN_INSN_VALUE (insn))
+ {
+ length = (*CGEN_EXTRACT_FN (insn)) (insn, NULL, insn_value, fields);
+ if (length > 0)
+ return insn;
+ }
}
insn_list = CGEN_DIS_NEXT_INSN (insn_list);
}
else
{
+ /* Sanity check: can't pass an alias insn if ! alias_p. */
+ if (! alias_p
+ && CGEN_INSN_ATTR (insn, CGEN_INSN_ALIAS))
+ abort ();
+
length = (*CGEN_EXTRACT_FN (insn)) (insn, NULL, insn_value, fields);
if (length > 0)
return insn;
If non-null INS is the insn table entry.
Otherwise INSN_VALUE is examined to compute it.
LENGTH is the number of bits in INSN_VALUE if known, otherwise 0.
- INDICES is a pointer to a buffer of MAX_OPERANDS ints to be filled in.
+ INDICES is a pointer to a buffer of MAX_OPERAND_INSTANCES ints to be filled
+ in.
The result a pointer to the insn table entry, or NULL if the instruction
wasn't recognized. */
const CGEN_OPERAND_INSTANCE *opinst;
int i;
- insn = @arch@_cgen_lookup_insn (insn, insn_value, length, &fields);
+ /* FIXME: ALIAS insns are in transition from being record in the insn table
+ to being recorded separately as macros. They don't have semantic code
+ so they can't be used here. Thus we currently always ignore the INSN
+ argument. */
+ insn = @arch@_cgen_lookup_insn (NULL, insn_value, length, &fields, 0);
if (! insn)
return NULL;
for (i = 0, opinst = CGEN_INSN_OPERANDS (insn);
- CGEN_OPERAND_INSTANCE_TYPE (opinst) != CGEN_OPERAND_INSTANCE_END;
+ opinst != NULL
+ && CGEN_OPERAND_INSTANCE_TYPE (opinst) != CGEN_OPERAND_INSTANCE_END;
++i, ++opinst)
{
const CGEN_OPERAND *op = CGEN_OPERAND_INSTANCE_OPERAND (opinst);