const char *args;
int match = FALSE;
int comma = 0;
- int cmpltr, nullif, flag, cond, num;
+ int cmpltr, nullif, flag, cond, need_cond, num;
int immediate_check = 0, pos = -1, len = -1;
unsigned long opcode;
struct pa_opcode *insn;
opcode = insn->match;
strict = (insn->flags & FLAG_STRICT);
memset (&the_insn, 0, sizeof (the_insn));
+ need_cond = 1;
the_insn.reloc = R_HPPA_NONE;
else
break;
+ /* Condition is not required with "dc". */
+ need_cond = 0;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
/* Handle 32 bit carry for ADD. */
else
break;
+ /* Condition is not required with "db". */
+ need_cond = 0;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 11);
/* Handle 32 bit borrow for SUB. */
/* Handle an add condition. */
case 'A':
- /* PR gas/11395
- If we are looking for 64-bit add conditions and we
- do not have the ",*" prefix, then we have no match. */
- if (*s != ',')
- break;
- /* Fall through. */
case 'a':
cmpltr = 0;
flag = 0;
as_bad (_("Invalid Add Condition: %s"), name);
*s = c;
}
+ /* Except with "dc", we have a match failure with
+ 'A' if we don't have a doubleword condition. */
+ else if (*args == 'A' && need_cond)
+ break;
+
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
s += 2;
}
else
- as_bad (_("Invalid Bit Branch Condition: %c"), *s);
+ as_bad (_("Invalid Branch On Bit Condition: %c"), *s);
}
+ else
+ as_bad (_("Missing Branch On Bit Condition"));
+
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 15);
/* Handle a compare/subtract condition. */
name);
*s = c;
}
+ /* Except with "db", we have a match failure with
+ 'S' if we don't have a doubleword condition. */
+ else if (*args == 'S' && need_cond)
+ break;
+
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
- /* Handle a logical instruction condition. */
+ /* Handle a logical instruction condition. */
case 'L':
case 'l':
cmpltr = 0;
as_bad (_("Invalid Logical Instruction Condition."));
*s = c;
}
+ /* 32-bit is default for no condition. */
+ else if (*args == 'L')
+ break;
+
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);
as_bad (_("Invalid Shift/Extract/Deposit Condition."));
*s = c;
}
+
INSERT_FIELD_AND_CONTINUE (opcode, cmpltr, 13);
/* Handle a unit instruction condition. */
else if (*args != 'U' || (*s != ' ' && *s != '\t'))
as_bad (_("Invalid Unit Instruction Condition."));
}
+ /* 32-bit is default for no condition. */
+ else if (*args == 'U')
+ break;
+
opcode |= cmpltr << 13;
INSERT_FIELD_AND_CONTINUE (opcode, flag, 12);