mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-18 00:32:30 +08:00
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:

committed by
Alan Modra

parent
33ae8a3ae3
commit
59f08271dd
@ -1657,9 +1657,14 @@ ppc_setup_opcodes (void)
|
|||||||
for (i = 0; i < num_powerpc_operands; ++i)
|
for (i = 0; i < num_powerpc_operands; ++i)
|
||||||
{
|
{
|
||||||
uint64_t mask = powerpc_operands[i].bitm;
|
uint64_t mask = powerpc_operands[i].bitm;
|
||||||
|
unsigned long flags = powerpc_operands[i].flags;
|
||||||
uint64_t right_bit;
|
uint64_t right_bit;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
|
||||||
|
if ((flags & PPC_OPERAND_PLUS1) != 0
|
||||||
|
&& (flags & PPC_OPERAND_NONZERO) != 0)
|
||||||
|
as_bad ("mutually exclusive operand flags");
|
||||||
|
|
||||||
right_bit = mask & -mask;
|
right_bit = mask & -mask;
|
||||||
mask += right_bit;
|
mask += right_bit;
|
||||||
right_bit = mask & -mask;
|
right_bit = mask & -mask;
|
||||||
@ -1992,6 +1997,11 @@ ppc_insert_operand (uint64_t insn,
|
|||||||
max = (max >> 1) & -right;
|
max = (max >> 1) & -right;
|
||||||
min = ~max & -right;
|
min = ~max & -right;
|
||||||
}
|
}
|
||||||
|
else if ((operand->flags & PPC_OPERAND_NONZERO) != 0)
|
||||||
|
{
|
||||||
|
++min;
|
||||||
|
++max;
|
||||||
|
}
|
||||||
|
|
||||||
if ((operand->flags & PPC_OPERAND_PLUS1) != 0)
|
if ((operand->flags & PPC_OPERAND_PLUS1) != 0)
|
||||||
max++;
|
max++;
|
||||||
@ -2042,10 +2052,15 @@ ppc_insert_operand (uint64_t insn,
|
|||||||
if (errmsg != (const char *) NULL)
|
if (errmsg != (const char *) NULL)
|
||||||
as_bad_where (file, line, "%s", errmsg);
|
as_bad_where (file, line, "%s", errmsg);
|
||||||
}
|
}
|
||||||
else if (operand->shift >= 0)
|
else
|
||||||
|
{
|
||||||
|
if ((operand->flags & PPC_OPERAND_NONZERO) != 0)
|
||||||
|
--val;
|
||||||
|
if (operand->shift >= 0)
|
||||||
insn |= (val & operand->bitm) << operand->shift;
|
insn |= (val & operand->bitm) << operand->shift;
|
||||||
else
|
else
|
||||||
insn |= (val & operand->bitm) >> -operand->shift;
|
insn |= (val & operand->bitm) >> -operand->shift;
|
||||||
|
}
|
||||||
|
|
||||||
return insn;
|
return insn;
|
||||||
}
|
}
|
||||||
|
@ -463,6 +463,11 @@ extern const unsigned int num_powerpc_operands;
|
|||||||
#define PPC_OPERAND_FCR (0x1000000)
|
#define PPC_OPERAND_FCR (0x1000000)
|
||||||
#define PPC_OPERAND_UDI (0x2000000)
|
#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 *);
|
extern ppc_cpu_t ppc_parse_cpu (ppc_cpu_t, ppc_cpu_t *, const char *);
|
||||||
|
|
||||||
static inline int64_t
|
static inline int64_t
|
||||||
|
@ -545,6 +545,9 @@ operand_value_powerpc (const struct powerpc_operand *operand,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((operand->flags & PPC_OPERAND_NONZERO) != 0)
|
||||||
|
++value;
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user