diff options
| author | Kevin Enderby <enderby@apple.com> | 2011-07-27 23:01:50 +0000 | 
|---|---|---|
| committer | Kevin Enderby <enderby@apple.com> | 2011-07-27 23:01:50 +0000 | 
| commit | 5ef6c453a6fa596180c180ace15dae064853ead1 (patch) | |
| tree | 516c1f7b578dab7b4a6c67baf9757acb3548e6b0 /llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | |
| parent | 16dd4adcbe8d11736932e5c2c3e691b0694eb32d (diff) | |
| download | bcm5719-llvm-5ef6c453a6fa596180c180ace15dae064853ead1.tar.gz bcm5719-llvm-5ef6c453a6fa596180c180ace15dae064853ead1.zip | |
Fix llvm-mc handing of x86 instructions that take 8-bit unsigned immediates.
llvm-mc gives an "invalid operand" error for instructions that take an unsigned
immediate which have the high bit set such as:
    pblendw $0xc5, %xmm2, %xmm1
llvm-mc treats all x86 immediates as signed values and range checks them.
A small number of x86 instructions use the imm8 field as a set of bits.
This change only changes those instructions and where the high bit is not
ignored.  The others remain unchanged.
llvm-svn: 136287
Diffstat (limited to 'llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 15 | 
1 files changed, 15 insertions, 0 deletions
| diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index e4adff6f9fb..efa8a6e1547 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -226,6 +226,21 @@ struct X86Operand : public MCParsedAsmOperand {              (0x00000000FFFFFF80ULL <= Value && Value <= 0x00000000FFFFFFFFULL)||              (0xFFFFFFFFFFFFFF80ULL <= Value && Value <= 0xFFFFFFFFFFFFFFFFULL));    } +  bool isImmZExtu32u8() const { +    if (!isImm()) +      return false; + +    // If this isn't a constant expr, just assume it fits and let relaxation +    // handle it. +    const MCConstantExpr *CE = dyn_cast<MCConstantExpr>(getImm()); +    if (!CE) +      return true; + +    // Otherwise, check the value is in a range that makes sense for this +    // extension. +    uint64_t Value = CE->getValue(); +    return (Value <= 0x00000000000000FFULL); +  }    bool isImmSExti64i8() const {      if (!isImm())        return false; | 

