ppc/svp64: introduce non-zero operand flag

svstep and svshape instructions subtract 1 before encoding some of the
operands. Obviously zero is not supported for these operands. Whilst
PPC_OPERAND_PLUS1 fits perfectly to mark that maximal value should be
incremented, there is no flag which marks the fact that zero values are
not allowed. This patch adds a new flag, PPC_OPERAND_NONZERO, for this
purpose.
This commit is contained in:
Dmitry Selyutin
2022-07-25 16:10:15 +03:00
committed by Alan Modra
parent 33ae8a3ae3
commit 59f08271dd
3 changed files with 26 additions and 3 deletions

View File

@ -1657,9 +1657,14 @@ ppc_setup_opcodes (void)
for (i = 0; i < num_powerpc_operands; ++i)
{
uint64_t mask = powerpc_operands[i].bitm;
unsigned long flags = powerpc_operands[i].flags;
uint64_t right_bit;
unsigned int j;
if ((flags & PPC_OPERAND_PLUS1) != 0
&& (flags & PPC_OPERAND_NONZERO) != 0)
as_bad ("mutually exclusive operand flags");
right_bit = mask & -mask;
mask += right_bit;
right_bit = mask & -mask;
@ -1992,6 +1997,11 @@ ppc_insert_operand (uint64_t insn,
max = (max >> 1) & -right;
min = ~max & -right;
}
else if ((operand->flags & PPC_OPERAND_NONZERO) != 0)
{
++min;
++max;
}
if ((operand->flags & PPC_OPERAND_PLUS1) != 0)
max++;
@ -2042,10 +2052,15 @@ ppc_insert_operand (uint64_t insn,
if (errmsg != (const char *) NULL)
as_bad_where (file, line, "%s", errmsg);
}
else if (operand->shift >= 0)
insn |= (val & operand->bitm) << operand->shift;
else
insn |= (val & operand->bitm) >> -operand->shift;
{
if ((operand->flags & PPC_OPERAND_NONZERO) != 0)
--val;
if (operand->shift >= 0)
insn |= (val & operand->bitm) << operand->shift;
else
insn |= (val & operand->bitm) >> -operand->shift;
}
return insn;
}

View File

@ -463,6 +463,11 @@ extern const unsigned int num_powerpc_operands;
#define PPC_OPERAND_FCR (0x1000000)
#define PPC_OPERAND_UDI (0x2000000)
/* Valid range of operand is 1..n rather than 0..n-1.
Before encoding, the operand value is decremented.
After decoding, the operand value is incremented. */
#define PPC_OPERAND_NONZERO (0x4000000)
extern ppc_cpu_t ppc_parse_cpu (ppc_cpu_t, ppc_cpu_t *, const char *);
static inline int64_t

View File

@ -545,6 +545,9 @@ operand_value_powerpc (const struct powerpc_operand *operand,
}
}
if ((operand->flags & PPC_OPERAND_NONZERO) != 0)
++value;
return value;
}