x86: correct abort check
authorJan Beulich <jbeulich@novell.com>
Fri, 15 Dec 2017 08:12:37 +0000 (09:12 +0100)
committerJan Beulich <jbeulich@suse.com>
Fri, 15 Dec 2017 08:12:37 +0000 (09:12 +0100)
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.

gas/ChangeLog
gas/config/tc-i386.c

index a3854ab136c1f8d5bf19a9c4fc3632729cfa8854..96ceb582a70fab4bfd8259d47ac41847d353652e 100644 (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>
 
        * config/tc-m32c.c: Update address of FSF in copyright notice.
index 092b99ed3a59d51bdf004de97e37e4a907d144e1..36e5b1958a302665cceaa4151c7d76c5d6128391 100644 (file)
@@ -6437,7 +6437,7 @@ build_modrm_byte (void)
          if (i.tm.opcode_modifier.vexvvvv == VEXXDS)
            {
              /* 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
                 clear RegMem bit before calling operand_type_equal.  */
 
@@ -6459,7 +6459,7 @@ build_modrm_byte (void)
              op.bitfield.regmem = 0;
              if ((dest + 1) >= i.operands
                  || (!op.bitfield.reg32
-                     && op.bitfield.reg64
+                     && !op.bitfield.reg64
                      && !operand_type_equal (&op, &regxmm)
                      && !operand_type_equal (&op, &regymm)
                      && !operand_type_equal (&op, &regzmm)