[PATCH v2 5/9] x86: improve handling of insns with ambiguous operand sizes

Jan Beulich jbeulich@suse.com
Wed Nov 13 13:23:00 GMT 2019


On 12.11.2019 21:47,  H.J. Lu  wrote:
> On Mon, Nov 11, 2019 at 11:23 PM Jan Beulich <jbeulich@suse.com> wrote:
>>
>> On 11.11.2019 19:27,  H.J. Lu  wrote:
>>> On Mon, Nov 11, 2019 at 1:29 AM Jan Beulich <jbeulich@suse.com> wrote:
>>>>
>>>> On 08.11.2019 16:54,  H.J. Lu  wrote:
>>>>> On Fri, Nov 8, 2019 at 12:09 AM Jan Beulich <jbeulich@suse.com> wrote:
>>>>>> On 07.11.2019 18:47,  H.J. Lu  wrote:
>>>>>>> I don't think DefaultSize matters for them either in AT&T syntax.
>>>>>>> and I don't think we should add DefaultSize to more instructions.
>>>>>>
>>>>>> Then _again_ - what is your alternative suggestion?
>>>>>
>>>>> Don't add DefaultSize to more instructions.
>>>>
>>>> So I think I've recalled meanwhile: The issue is with us not wanting
>>>> to issue diagnostics on e.g. LGDT despite it allowing multiple
>>>> operand sizes. Instead, just like for PUSH/POP etc we want to silently
>>>> default to the most appropriate operand size for the mode. Hence
>>>> adding DefaultSize seems very applicable to me here.
>>>>
>>>
>>> This is a problem only for Intel syntax and DefaultSize affects both
>>> Intel syntax and AT&T syntax.
>>
>> Are you talking about before or after this patch? Recall that the
>> changes here bring AT&T syntax handling more in line with Intel
>> one, just that for AT&T talk is about absent suffixes while for
>> Intel talk is about absent operand size modifiers.
>>
>>>  Since we can't have both DefaultSize
>>> and IgnoreSize at the same time, can they be merged and leave it
>>> for Intel syntax to deal with it?
>>
>> I don't think they can be merged. See the draft patch you've sent
>> the other day actually splitting DefaultSize into two bits.
>>
> 
> The current code has
> 
>   else if (i.tm.opcode_modifier.defaultsize
>            && !i.suffix
>            /* exclude fldenv/frstor/fsave/fstenv */
>            && i.tm.opcode_modifier.no_ssuf)
>     {
>       if (stackop_size == LONG_MNEM_SUFFIX
>           && i.tm.base_opcode == 0xcf)
>         {
>           /* stackop_size is set to LONG_MNEM_SUFFIX for the
>              .code16gcc directive to support 16-bit mode with
>              32-bit address.  For IRET without a suffix, generate
>              16-bit IRET (opcode 0xcf) to return from an interrupt
>              handler.  */
>           i.suffix = WORD_MNEM_SUFFIX;
>           as_warn (_("generating 16-bit `iret' for .code16gcc directive"));
>         }
>       else
>         i.suffix = stackop_size;
>     }
>   else if (intel_syntax
>            && !i.suffix
>            && (i.tm.operand_types[0].bitfield.jumpabsolute
>                || i.tm.opcode_modifier.jumpbyte
>                || i.tm.opcode_modifier.jumpintersegment
>                || (i.tm.base_opcode == 0x0f01 /* [ls][gi]dt */
>                    && i.tm.extension_opcode <= 3)))
>     {
> 
> What you did was to move Intel syntax specific check to generic.
> We shouldn't do that.

Why not? That's the main purpose of this patch. (FAOD it's not the
"move Intel syntax specific check to generic" aspect as such, but
the improved checking in AT&T syntax. It just so happens that this
is easiest expressed by folding the logic.)

Jan



More information about the Binutils mailing list