[llvm-commits] [llvm] r139591 - /llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c

Bruno Cardoso Lopes bruno.cardoso at gmail.com
Tue Sep 13 09:55:25 PDT 2011


Testcases?

On Tue, Sep 13, 2011 at 12:37 AM, Craig Topper <craig.topper at gmail.com> wrote:
> Author: ctopper
> Date: Tue Sep 13 02:37:44 2011
> New Revision: 139591
>
> URL: http://llvm.org/viewvc/llvm-project?rev=139591&view=rev
> Log:
> Only disassembler instructions with vvvv != 1111 if the instruction actually uses the vvvv field to encode an operand. Fixes PR10851.
>
> Modified:
>    llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
>
> Modified: llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c?rev=139591&r1=139590&r2=139591&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c (original)
> +++ llvm/trunk/lib/Target/X86/Disassembler/X86DisassemblerDecoder.c Tue Sep 13 02:37:44 2011
> @@ -1434,11 +1434,10 @@
>  }
>
>  /*
> - * readVVVV - Consumes an immediate operand from an instruction, given the
> - *   desired operand size.
> + * readVVVV - Consumes vvvv from an instruction if it has a VEX prefix.
>  *
>  * @param insn  - The instruction whose operand is to be read.
> - * @return      - 0 if the immediate was successfully consumed; nonzero
> + * @return      - 0 if the vvvv was successfully consumed; nonzero
>  *                otherwise.
>  */
>  static int readVVVV(struct InternalInstruction* insn) {
> @@ -1463,8 +1462,14 @@
>  */
>  static int readOperands(struct InternalInstruction* insn) {
>   int index;
> +  int hasVVVV, needVVVV;
>
>   dbgprintf(insn, "readOperands()");
> +
> +  /* If non-zero vvvv specified, need to make sure one of the operands
> +     uses it. */
> +  hasVVVV = !readVVVV(insn);
> +  needVVVV = hasVVVV && (insn->vvvv != 0);
>
>   for (index = 0; index < X86_MAX_OPERANDS; ++index) {
>     switch (insn->spec->operands[index].encoding) {
> @@ -1537,7 +1542,8 @@
>         return -1;
>       break;
>     case ENCODING_VVVV:
> -      if (readVVVV(insn))
> +      needVVVV = 0; /* Mark that we have found a VVVV operand. */
> +      if (!hasVVVV)
>         return -1;
>       if (fixupReg(insn, &insn->spec->operands[index]))
>         return -1;
> @@ -1549,6 +1555,9 @@
>       return -1;
>     }
>   }
> +
> +  /* If we didn't find ENCODING_VVVV operand, but non-zero vvvv present, fail */
> +  if (needVVVV) return -1;
>
>   return 0;
>  }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>



-- 
Bruno Cardoso Lopes
http://www.brunocardoso.cc




More information about the llvm-commits mailing list