diff options
| -rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp | 12 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86InstrSystem.td | 7 | ||||
| -rw-r--r-- | llvm/test/MC/X86/x86-64.s | 4 | 
3 files changed, 23 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp index e0989b081e4..c352bfcd8cc 100644 --- a/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -928,6 +928,18 @@ ParseInstruction(StringRef Name, SMLoc NameLoc,        Operands.erase(Operands.begin() + 1);      }    } +   +  // Transforms "int $3" into "int3" as a size optimization.  We can't write an +  // instalias with an immediate operand yet. +  if (Name == "int" && Operands.size() == 2) { +    X86Operand *Op1 = static_cast<X86Operand*>(Operands[1]); +    if (Op1->isImm() && isa<MCConstantExpr>(Op1->getImm()) && +        cast<MCConstantExpr>(Op1->getImm())->getValue() == 3) { +      delete Operands[1]; +      Operands.erase(Operands.begin() + 1); +      static_cast<X86Operand*>(Operands[0])->setTokenValue("int3"); +    } +  }    return false;  } diff --git a/llvm/lib/Target/X86/X86InstrSystem.td b/llvm/lib/Target/X86/X86InstrSystem.td index 2710425628a..f73cff39e86 100644 --- a/llvm/lib/Target/X86/X86InstrSystem.td +++ b/llvm/lib/Target/X86/X86InstrSystem.td @@ -34,9 +34,16 @@ let Uses = [EFLAGS] in    def INTO : I<0xce, RawFrm, (outs), (ins), "into", []>;  def INT3 : I<0xcc, RawFrm, (outs), (ins), "int3",                [(int_x86_int (i8 3))]>; + +// The long form of "int $3" turns into int3 as a size optimization. +// FIXME: This doesn't work because InstAlias can't match immediate constants. +//def : InstAlias<"int\t$3", (INT3)>; + +  def INT : Ii8<0xcd, RawFrm, (outs), (ins i8imm:$trap), "int\t$trap",                [(int_x86_int imm:$trap)]>; +  def SYSCALL  : I<0x05, RawFrm, (outs), (ins), "syscall", []>, TB;  def SYSRETL  : I<0x07, RawFrm, (outs), (ins), "sysretl", []>, TB;  def SYSRETQ  :RI<0x07, RawFrm, (outs), (ins), "sysretq", []>, TB, diff --git a/llvm/test/MC/X86/x86-64.s b/llvm/test/MC/X86/x86-64.s index 1d41d5b2d5f..80b12dbfc2f 100644 --- a/llvm/test/MC/X86/x86-64.s +++ b/llvm/test/MC/X86/x86-64.s @@ -190,6 +190,10 @@ fadd %st(7)  // CHECK: int3  INT3 +// rdar://8735979 - int $3 -> int3 +// CHECK: int3 +int	$3 +  // Allow scale factor without index register.  // CHECK: movaps	%xmm3, (%esi)  | 

