<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <p>Hi Eric,</p>
    <p>Could you give  me the reproducer of the issue? What existing
      cases are you speaking about?<br>
    </p>
    Andrew<br>
    <br>
    <div class="moz-cite-prefix">On 29.08.2017 11:25, Eric Christopher
      wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:CALehDX67VEQiA+c1OZpZ85G9kg2ksmvv9sq5NEYQSp8W3ns8HQ@mail.gmail.com">
      <div dir="ltr">Hi Andrew,
        <div><br>
        </div>
        <div>This breaks some existing cases of <span style="color:rgb(51,51,51);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;white-space:pre-wrap">0xf2666d and </span><span style="color:rgb(51,51,51);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;white-space:pre-wrap">0xf3666d - I've gone ahead and reverted this in </span><font
            face="Helvetica Neue, Helvetica, Arial, sans-serif"
            color="#333333"><span style="font-size:14px;white-space:pre-wrap">r311987</span></font><span style="color:rgb(51,51,51);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;white-space:pre-wrap"> for now. When we go forward with recommitting would you add some testcases to cover the next byte of 0x66 while you're there?</span></div>
        <div><span style="color:rgb(51,51,51);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;white-space:pre-wrap">
</span></div>
        <div><span style="color:rgb(51,51,51);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;white-space:pre-wrap">Thanks!</span></div>
        <div><span style="color:rgb(51,51,51);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;white-space:pre-wrap">
</span></div>
        <div><span style="color:rgb(51,51,51);font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;white-space:pre-wrap">-eric</span></div>
        <br>
        <div class="gmail_quote">
          <div dir="ltr">On Mon, Aug 28, 2017 at 3:44 AM Andrew V.
            Tischenko via llvm-commits <<a
              href="mailto:llvm-commits@lists.llvm.org"
              moz-do-not-send="true">llvm-commits@lists.llvm.org</a>>
            wrote:<br>
          </div>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">Author:
            avt77<br>
            Date: Mon Aug 28 03:43:14 2017<br>
            New Revision: 311882<br>
            <br>
            URL: <a
              href="http://llvm.org/viewvc/llvm-project?rev=311882&view=rev"
              rel="noreferrer" target="_blank" moz-do-not-send="true">http://llvm.org/viewvc/llvm-project?rev=311882&view=rev</a><br>
            Log:<br>
            The current version of LLVM X86 disassembler incorrectly
            interprets some possible sets of x86 prefixes. This patch is
            the first step to close PR7709 and PR17697. There will be
            next patch(es) to close relative PRs.<br>
            Differential Revision: <a
              href="https://reviews.llvm.org/D36788" rel="noreferrer"
              target="_blank" moz-do-not-send="true">https://reviews.llvm.org/D36788</a><br>
            <br>
            M    lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp<br>
            M    lib/Target/X86/Disassembler/X86DisassemblerDecoder.h<br>
            A    test/MC/Disassembler/X86/prefixes-i386.s<br>
            A    test/MC/Disassembler/X86/prefixes-x86_64.s<br>
            M    test/MC/Disassembler/X86/prefixes.txt<br>
            <br>
            Added:<br>
                llvm/trunk/test/MC/Disassembler/X86/prefixes-i386.s<br>
                llvm/trunk/test/MC/Disassembler/X86/prefixes-x86_64.s<br>
            Modified:<br>
               
            llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp<br>
               
            llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h<br>
                llvm/trunk/test/MC/Disassembler/X86/prefixes.txt<br>
            <br>
            Modified:
            llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp<br>
            URL: <a
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp?rev=311882&r1=311881&r2=311882&view=diff"
              rel="noreferrer" target="_blank" moz-do-not-send="true">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp?rev=311882&r1=311881&r2=311882&view=diff</a><br>
==============================================================================<br>
            ---
            llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
            (original)<br>
            +++
            llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.cpp
            Mon Aug 28 03:43:14 2017<br>
            @@ -277,6 +277,12 @@ static void dbgprintf(struct
            InternalIns<br>
               insn->dlog(insn->dlogArg, buffer);<br>
             }<br>
            <br>
            +static bool isREX(struct InternalInstruction *insn, uint8_t
            prefix) {<br>
            +  if (insn->mode == MODE_64BIT)<br>
            +    return prefix >= 0x40 && prefix <= 0x4f;<br>
            +  return false;<br>
            +}<br>
            +<br>
             /*<br>
              * setPrefixPresent - Marks that a particular prefix is
            present at a particular<br>
              *   location.<br>
            @@ -290,6 +296,38 @@ static void setPrefixPresent(struct
            Inte<br>
                                                 uint8_t prefix,<br>
                                                 uint64_t location)<br>
             {<br>
            +  uint8_t nextByte;<br>
            +  switch (prefix) {<br>
            +  case 0xf2:<br>
            +  case 0xf3:<br>
            +    if (lookAtByte(insn, &nextByte))<br>
            +      break;<br>
            +    // TODO:<br>
            +    //  1. There could be several 0x66<br>
            +    //  2. if (nextByte == 0x66) and nextNextByte != 0x0f
            then<br>
            +    //      it's not mandatory prefix<br>
            +    //  3. if (nextByte >= 0x40 && nextByte
            <= 0x4f) it's REX and we need<br>
            +    //     0x0f exactly after it to be mandatory prefix<br>
            +    if (isREX(insn, nextByte) || nextByte == 0x0f ||
            nextByte == 0x66) {<br>
            +      // The last of 0xf2 /0xf3 is mandatory prefix<br>
            +      insn->mandatory_prefix = prefix;<br>
            +      insn->necessaryPrefixLocation = location;<br>
            +      break;<br>
            +    }<br>
            +    break;<br>
            +  case 0x66:<br>
            +    if (lookAtByte(insn, &nextByte))<br>
            +      break;<br>
            +    // 0x66 can't overwrite existing mandatory prefix and
            should be ignored<br>
            +    if (!insn->mandatory_prefix &&<br>
            +        (nextByte == 0x0f || isREX(insn, nextByte))) {<br>
            +      insn->mandatory_prefix = prefix;<br>
            +      insn->necessaryPrefixLocation = location;<br>
            +    }<br>
            +    break;<br>
            +  }<br>
            +  if (!insn->mandatory_prefix)<br>
            +    insn->necessaryPrefixLocation = location;<br>
               insn->prefixPresent[prefix] = 1;<br>
               insn->prefixLocations[prefix] = location;<br>
             }<br>
            @@ -343,13 +381,10 @@ static int readPrefixes(struct
            InternalI<br>
                  * If the byte is a LOCK/REP/REPNE prefix and not a
            part of the opcode, then<br>
                  * break and let it be disassembled as a normal
            "instruction".<br>
                  */<br>
            -    if (insn->readerCursor - 1 == insn->startLocation
            && byte == 0xf0)<br>
            +    if (insn->readerCursor - 1 == insn->startLocation
            && byte == 0xf0) // LOCK<br>
                   break;<br>
            <br>
            -    if (insn->readerCursor - 1 == insn->startLocation<br>
            -        && (byte == 0xf2 || byte == 0xf3)<br>
            -        && !lookAtByte(insn, &nextByte))<br>
            -    {<br>
            +    if ((byte == 0xf2 || byte == 0xf3) &&
            !lookAtByte(insn, &nextByte)) {<br>
                   /*<br>
                    * If the byte is 0xf2 or 0xf3, and any of the
            following conditions are<br>
                    * met:<br>
            @@ -357,9 +392,8 @@ static int readPrefixes(struct InternalI<br>
                    * - it is followed by an xchg instruction<br>
                    * then it should be disassembled as a
            xacquire/xrelease not repne/rep.<br>
                    */<br>
            -      if ((byte == 0xf2 || byte == 0xf3) &&<br>
            -          ((nextByte == 0xf0) ||<br>
            -          ((nextByte & 0xfe) == 0x86 || (nextByte &
            0xf8) == 0x90)))<br>
            +      if (((nextByte == 0xf0) ||<br>
            +           ((nextByte & 0xfe) == 0x86 || (nextByte
            & 0xf8) == 0x90)))<br>
                     insn->xAcquireRelease = true;<br>
                   /*<br>
                    * Also if the byte is 0xf3, and the following
            condition is met:<br>
            @@ -378,7 +412,13 @@ static int readPrefixes(struct
            InternalI<br>
                       return -1;<br>
                     unconsumeByte(insn);<br>
                   }<br>
            -      if (nextByte != 0x0f && nextByte != 0x90)<br>
            +      // If the current byte can't be mandatory prefix then
            it's a simple repeat<br>
            +      // prefix and should be elaborated as a separated
            instr<br>
            +      if (nextByte != 0x0f &&<br>
            +          // We can have f2 f3 f2 66 f2 0f (in any order)
            as a valid set<br>
            +          // of prefixes with the last one as a mandatory
            prefix (SSE/SSE2...)<br>
            +          nextByte != 0xf2 && nextByte != 0xf3
            && nextByte != 0x66 &&<br>
            +          nextByte != 0x90 && !isREX(insn,
            nextByte))<br>
                     break;<br>
                 }<br>
            <br>
            @@ -426,11 +466,13 @@ static int readPrefixes(struct
            InternalI<br>
                   setPrefixPresent(insn, byte, prefixLocation);<br>
                   break;<br>
                 case 0x66:  /* Operand-size override */<br>
            -      if (prefixGroups[2])<br>
            -        dbgprintf(insn, "Redundant Group 3 prefix");<br>
            -      prefixGroups[2] = true;<br>
            -      hasOpSize = true;<br>
                   setPrefixPresent(insn, byte, prefixLocation);<br>
            +      if (!insn->mandatory_prefix) {<br>
            +        if (prefixGroups[2])<br>
            +          dbgprintf(insn, "Redundant Group 3 prefix");<br>
            +        prefixGroups[2] = true;<br>
            +      }<br>
            +      hasOpSize = true;<br>
                   break;<br>
                 case 0x67:  /* Address-size override */<br>
                   if (prefixGroups[3])<br>
            @@ -624,10 +666,8 @@ static int readPrefixes(struct
            InternalI<br>
                     insn->necessaryPrefixLocation =
            insn->readerCursor - 2;<br>
            <br>
                     dbgprintf(insn, "Found REX prefix 0x%hhx", byte);<br>
            -      } else {<br>
            +      } else<br>
                     unconsumeByte(insn);<br>
            -        insn->necessaryPrefixLocation =
            insn->readerCursor - 1;<br>
            -      }<br>
                 } else {<br>
                   unconsumeByte(insn);<br>
                   insn->necessaryPrefixLocation =
            insn->readerCursor - 1;<br>
            @@ -950,8 +990,19 @@ static int getID(struct
            InternalInstruct<br>
                 } else {<br>
                   return -1;<br>
                 }<br>
            +  } else if (insn->mode != MODE_16BIT &&
            !insn->mandatory_prefix) {<br>
            +    // If we don't have mandatory prefix we should use
            "standard" prefixes here<br>
            +    if (insn->prefixPresent[0x66])<br>
            +      attrMask |= ATTR_OPSIZE;<br>
            +    if (insn->prefixPresent[0x67])<br>
            +      attrMask |= ATTR_ADSIZE;<br>
            +    if (insn->prefixPresent[0xf2])<br>
            +      attrMask |= ATTR_XD;<br>
            +    if (insn->prefixPresent[0xf3])<br>
            +      attrMask |= ATTR_XS;<br>
               } else {<br>
            -    if (insn->mode != MODE_16BIT &&
            isPrefixAtLocation(insn, 0x66,
            insn->necessaryPrefixLocation))<br>
            +    if (insn->mode != MODE_16BIT &&<br>
            +        isPrefixAtLocation(insn, 0x66,
            insn->necessaryPrefixLocation))<br>
                   attrMask |= ATTR_OPSIZE;<br>
                 else if (isPrefixAtLocation(insn, 0x67,
            insn->necessaryPrefixLocation))<br>
                   attrMask |= ATTR_ADSIZE;<br>
            <br>
            Modified:
            llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h<br>
            URL: <a
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h?rev=311882&r1=311881&r2=311882&view=diff"
              rel="noreferrer" target="_blank" moz-do-not-send="true">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h?rev=311882&r1=311881&r2=311882&view=diff</a><br>
==============================================================================<br>
            ---
            llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
            (original)<br>
            +++
            llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.h
            Mon Aug 28 03:43:14 2017<br>
            @@ -546,10 +546,13 @@ struct InternalInstruction {<br>
            <br>
               // Prefix state<br>
            <br>
            +  // TODO: we're able to get rid off the following 2 arrays<br>
               // 1 if the prefix byte corresponding to the entry is
            present; 0 if not<br>
               uint8_t prefixPresent[0x100];<br>
               // contains the location (for use with the reader) of the
            prefix byte<br>
               uint64_t prefixLocations[0x100];<br>
            +  // The possible mandatory prefix<br>
            +  uint8_t mandatory_prefix;<br>
               // The value of the vector extension
            prefix(EVEX/VEX/XOP), if present<br>
               uint8_t vectorExtensionPrefix[4];<br>
               // The type of the vector extension prefix<br>
            <br>
            Added: llvm/trunk/test/MC/Disassembler/X86/prefixes-i386.s<br>
            URL: <a
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/X86/prefixes-i386.s?rev=311882&view=auto"
              rel="noreferrer" target="_blank" moz-do-not-send="true">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/X86/prefixes-i386.s?rev=311882&view=auto</a><br>
==============================================================================<br>
            --- llvm/trunk/test/MC/Disassembler/X86/prefixes-i386.s
            (added)<br>
            +++ llvm/trunk/test/MC/Disassembler/X86/prefixes-i386.s Mon
            Aug 28 03:43:14 2017<br>
            @@ -0,0 +1,68 @@<br>
            +// RUN: llvm-mc -disassemble %s -triple=i386-apple-darwin9<br>
            +<br>
            +// CHECK:  movl    %fs:24, %eax<br>
            +0x64 0xa1 0x18 0x00 0x00 0x00 # mov eax, dword ptr fs:[18h]<br>
            +<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: insb    %dx, %es:(%rdi)<br>
            +0xf3 0x6c #rep ins<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: insl    %dx, %es:(%rdi)<br>
            +0xf3 0x6d #rep ins<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: movsb   (%rsi), %es:(%rdi)<br>
            +0xf3 0xa4 #rep movs<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: movsl   (%rsi), %es:(%rdi)<br>
            +0xf3 0xa5 #rep movs<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: outsb   (%rsi), %dx<br>
            +0xf3 0x6e #rep outs<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: outsl   (%rsi), %dx<br>
            +0xf3 0x6f #rep outs<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: lodsb   (%rsi), %al<br>
            +0xf3 0xac #rep lods<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: lodsl   (%rsi), %eax<br>
            +0xf3 0xad #rep lods<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: stosb   %al, %es:(%rdi)<br>
            +0xf3 0xaa #rep stos<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: stosl   %eax, %es:(%rdi)<br>
            +0xf3 0xab #rep stos<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: cmpsb   %es:(%rdi), (%rsi)<br>
            +0xf3 0xa6 #rep cmps<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: cmpsl   %es:(%rdi), (%rsi)<br>
            +0xf3 0xa7 #repe cmps<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: scasb   %es:(%rdi), %al<br>
            +0xf3 0xae #repe scas<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: scasl   %es:(%rdi), %eax<br>
            +0xf3 0xaf #repe scas<br>
            +# CHECK: repne<br>
            +# CHECK-NEXT: cmpsb   %es:(%rdi), (%rsi)<br>
            +0xf2 0xa6 #repne cmps<br>
            +# CHECK: repne<br>
            +# CHECK-NEXT: cmpsl   %es:(%rdi), (%rsi)<br>
            +0xf2 0xa7 #repne cmps<br>
            +# CHECK: repne<br>
            +# CHECK-NEXT: scasb   %es:(%rdi), %al<br>
            +0xf2 0xae #repne scas<br>
            +# CHECK: repne<br>
            +# CHECK-NEXT: scasl   %es:(%rdi), %eax<br>
            +0xf2 0xaf #repne scas<br>
            +<br>
            +// CHECK: mulsd   %xmm7, %xmm7<br>
            +0x66 0xF3 0xF2 0x0F 0x59 0xFF<br>
            +// CHECK: mulss   %xmm7, %xmm7<br>
            +0x66 0xF2 0xF3 0x0F 0x59 0xFF<br>
            +// CHECK: mulpd   %xmm7, %xmm7<br>
            +0x66 0x0F 0x59 0xFF<br>
            +// CHECK: mulsd   %xmm7, %xmm7<br>
            +0xf2 0x66 0x0f 0x59 0xff<br>
            <br>
            Added: llvm/trunk/test/MC/Disassembler/X86/prefixes-x86_64.s<br>
            URL: <a
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/X86/prefixes-x86_64.s?rev=311882&view=auto"
              rel="noreferrer" target="_blank" moz-do-not-send="true">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/X86/prefixes-x86_64.s?rev=311882&view=auto</a><br>
==============================================================================<br>
            --- llvm/trunk/test/MC/Disassembler/X86/prefixes-x86_64.s
            (added)<br>
            +++ llvm/trunk/test/MC/Disassembler/X86/prefixes-x86_64.s
            Mon Aug 28 03:43:14 2017<br>
            @@ -0,0 +1,10 @@<br>
            +// RUN: llvm-mc -disassemble %s
            -triple=x86_64-apple-darwin9<br>
            +<br>
            +// CHECK: mulsd   %xmm7, %xmm7<br>
            +0x66 0xF3 0xF2 0x0F 0x59 0xFF<br>
            +// CHECK: mulss   %xmm7, %xmm7<br>
            +0x66 0xF2 0xF3 0x0F 0x59 0xFF<br>
            +// CHECK: mulpd   %xmm7, %xmm7<br>
            +0x66 0x0F 0x59 0xFF<br>
            +// CHECK: mulsd   %xmm7, %xmm7<br>
            +0xf2 0x66 0x0f 0x59 0xff<br>
            <br>
            Modified: llvm/trunk/test/MC/Disassembler/X86/prefixes.txt<br>
            URL: <a
href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/X86/prefixes.txt?rev=311882&r1=311881&r2=311882&view=diff"
              rel="noreferrer" target="_blank" moz-do-not-send="true">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/Disassembler/X86/prefixes.txt?rev=311882&r1=311881&r2=311882&view=diff</a><br>
==============================================================================<br>
            --- llvm/trunk/test/MC/Disassembler/X86/prefixes.txt
            (original)<br>
            +++ llvm/trunk/test/MC/Disassembler/X86/prefixes.txt Mon Aug
            28 03:43:14 2017<br>
            @@ -1,5 +1,60 @@<br>
             # RUN: llvm-mc --disassemble %s -triple=x86_64 | FileCheck
            %s<br>
            <br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: insb    %dx, %es:(%rdi)<br>
            +0xf3 0x6c #rep ins<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: insl    %dx, %es:(%rdi)<br>
            +0xf3 0x6d #rep ins<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: movsb   (%rsi), %es:(%rdi)<br>
            +0xf3 0xa4 #rep movs<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: movsl   (%rsi), %es:(%rdi)<br>
            +0xf3 0xa5 #rep movs<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: outsb   (%rsi), %dx<br>
            +0xf3 0x6e #rep outs<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: outsl   (%rsi), %dx<br>
            +0xf3 0x6f #rep outs<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: lodsb   (%rsi), %al<br>
            +0xf3 0xac #rep lods<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: lodsl   (%rsi), %eax<br>
            +0xf3 0xad #rep lods<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: stosb   %al, %es:(%rdi)<br>
            +0xf3 0xaa #rep stos<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: stosl   %eax, %es:(%rdi)<br>
            +0xf3 0xab #rep stos<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: cmpsb   %es:(%rdi), (%rsi)<br>
            +0xf3 0xa6 #rep cmps<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: cmpsl   %es:(%rdi), (%rsi)<br>
            +0xf3 0xa7 #repe cmps<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: scasb   %es:(%rdi), %al<br>
            +0xf3 0xae #repe scas<br>
            +# CHECK: rep<br>
            +# CHECK-NEXT: scasl   %es:(%rdi), %eax<br>
            +0xf3 0xaf #repe scas<br>
            +# CHECK: repne<br>
            +# CHECK-NEXT: cmpsb   %es:(%rdi), (%rsi)<br>
            +0xf2 0xa6 #repne cmps<br>
            +# CHECK: repne<br>
            +# CHECK-NEXT: cmpsl   %es:(%rdi), (%rsi)<br>
            +0xf2 0xa7 #repne cmps<br>
            +# CHECK: repne<br>
            +# CHECK-NEXT: scasb   %es:(%rdi), %al<br>
            +0xf2 0xae #repne scas<br>
            +# CHECK: repne<br>
            +# CHECK-NEXT: scasl   %es:(%rdi), %eax<br>
            +0xf2 0xaf #repne scas<br>
            +<br>
             # CHECK: lock<br>
             # CHECK-NEXT:  orl     $16, %fs:776<br>
             0xf0 0x64 0x83 0x0c 0x25 0x08 0x03 0x00 0x00 0x10<br>
            @@ -50,7 +105,6 @@<br>
            <br>
             # Test that multiple redundant prefixes work (redundant,
            but valid x86).<br>
             # CHECK: rep<br>
            -# CHECK-NEXT: rep<br>
             # CHECK-NEXT: stosq<br>
             0xf3 0xf3 0x48 0xab<br>
            <br>
            <br>
            <br>
            _______________________________________________<br>
            llvm-commits mailing list<br>
            <a href="mailto:llvm-commits@lists.llvm.org" target="_blank"
              moz-do-not-send="true">llvm-commits@lists.llvm.org</a><br>
            <a
              href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits"
              rel="noreferrer" target="_blank" moz-do-not-send="true">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
          </blockquote>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>