x86: restrict insn templates accepting negative 8-bit immediates
authorJan Beulich <jbeulich@suse.com>
Fri, 24 Feb 2023 12:56:57 +0000 (13:56 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 24 Feb 2023 12:56:57 +0000 (13:56 +0100)
commitc34d1cc9200ae24dc7572aaf77d80276c0490e9b
tree4b3d2d1fdb36342d2d542d03bbe6daa3dacc6b3b
parentf1c8928395be789ec091d5ff0f3546d7916e00ba
x86: restrict insn templates accepting negative 8-bit immediates

For shifts (but not ordinary rotates) and other cases where an immediate
describes e.g. a bit count or position, allowing negative operands is at
best confusing. An extreme example would be the two rotate-through-carry
insns, where a negative value would _not_ mean rotating the
corresponding number of bits in the other direction. To refuse such,
give meaning to the combination of Imm8 and Imm8S in templates (so far
these weren't used together anywhere). The issue was with
smallest_imm_type() blindly setting .imm8 for signed numbers determined
to fit in a byte.

VPROT{B,W,D,Q} is a little special: The rotate count there is a signed
quantity, so Imm8 is replaced by Imm8S. Adjust affected testcases
accordingly as well.

Another small adjustment to the testsuite is necessary: AAM and AAD were
never sensible to use with 0xffffff90 operands. This should have been an
error.
gas/config/tc-i386.c
gas/testsuite/gas/i386/intel.s
gas/testsuite/gas/i386/opcode.s
gas/testsuite/gas/i386/x86-64-xop.s
gas/testsuite/gas/i386/xop.s
opcodes/i386-opc.tbl
opcodes/i386-tbl.h