x86: correct abort check

I'm rather certain the missing ! was just a typo, the more with the
similar check in mind that's in the same function a few hundred lines
down (in the body of "if (vex_reg != (unsigned int) ~0)"). Of course
this can't be demonstrated by a test case - internal data structure
consistency is being checked here, and neither form of the check
triggers with any current template.

It is also not really clear to me why operand_type_equal() is being used
in the {X,Y,Z}MM register check here, rather than just testing the
respective bits: Just like Reg32|Reg64 is legal in an operand template,
I don't see why e.g. RegXMM|RegYMM wouldn't be. For example it ought to
be possible to combine

vaddpd, 3, 0x6658, None, 1, CpuAVX, Modrm|Vex|VexOpcode=0|VexVVVV=1|VexW=1|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Xmmword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S|RegXMM, RegXMM, RegXMM }
vaddpd, 3, 0x6658, None, 1, CpuAVX, Modrm|Vex=2|VexOpcode=0|VexVVVV=1|VexW=1|IgnoreSize|No_bSuf|No_wSuf|No_lSuf|No_sSuf|No_qSuf|No_ldSuf, { Ymmword|Unspecified|BaseIndex|Disp8|Disp16|Disp32|Disp32S|RegYMM, RegYMM, RegYMM }

into a single template (with setting of VEX.L suitably handled elsewhere
if that's not already happening anyway).

Additionally I don't understand why this uses abort() instead of
gas_assert().

Both of these latter considerations then also apply to the
aforementioned other check in the same function.
This commit is contained in:
Jan Beulich
2017-12-15 09:12:37 +01:00
committed by Jan Beulich
parent 2778747c56
commit c5d0745b0d
2 changed files with 7 additions and 2 deletions

View File

@ -1,3 +1,8 @@
2017-12-15 Jan Beulich <jbeulich@suse.com>
* config/tc-i386.c (build_modrm_byte): Add missing ! to reg64
check leading to abort().
2017-12-14 Nick Clifton <nickc@redhat.com> 2017-12-14 Nick Clifton <nickc@redhat.com>
* config/tc-m32c.c: Update address of FSF in copyright notice. * config/tc-m32c.c: Update address of FSF in copyright notice.

View File

@ -6437,7 +6437,7 @@ build_modrm_byte (void)
if (i.tm.opcode_modifier.vexvvvv == VEXXDS) if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
{ {
/* For instructions with VexNDS, the register-only source /* For instructions with VexNDS, the register-only source
operand must be 32/64bit integer, XMM, YMM or ZMM operand must be a 32/64bit integer, XMM, YMM, ZMM, or mask
register. It is encoded in VEX prefix. We need to register. It is encoded in VEX prefix. We need to
clear RegMem bit before calling operand_type_equal. */ clear RegMem bit before calling operand_type_equal. */
@ -6459,7 +6459,7 @@ build_modrm_byte (void)
op.bitfield.regmem = 0; op.bitfield.regmem = 0;
if ((dest + 1) >= i.operands if ((dest + 1) >= i.operands
|| (!op.bitfield.reg32 || (!op.bitfield.reg32
&& op.bitfield.reg64 && !op.bitfield.reg64
&& !operand_type_equal (&op, &regxmm) && !operand_type_equal (&op, &regxmm)
&& !operand_type_equal (&op, &regymm) && !operand_type_equal (&op, &regymm)
&& !operand_type_equal (&op, &regzmm) && !operand_type_equal (&op, &regzmm)