Add a new llvm.x86.int intrinsic, allowing access to the

x86 int and int3 instructions.  Patch by Peter Housel!


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@111831 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-08-23 19:39:25 +00:00
parent 00a5b5b2e9
commit d80c7e1232
3 changed files with 32 additions and 3 deletions

View File

@ -11,6 +11,11 @@
//
//===----------------------------------------------------------------------===//
//===----------------------------------------------------------------------===//
// Interrupt traps
let TargetPrefix = "x86" in { // All intrinsics start with "llvm.x86.".
def int_x86_int : Intrinsic<[], [llvm_i8_ty]>;
}
//===----------------------------------------------------------------------===//
// SSE1

View File

@ -595,10 +595,14 @@ let neverHasSideEffects = 1 in {
}
// Trap
def INTO : I<0xce, RawFrm, (outs), (ins), "into", []>;
def INT3 : I<0xcc, RawFrm, (outs), (ins), "int3", []>;
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))]>;
// FIXME: need to make sure that "int $3" matches int3
def INT : Ii8<0xcd, RawFrm, (outs), (ins i8imm:$trap), "int\t$trap", []>;
def INT : Ii8<0xcd, RawFrm, (outs), (ins i8imm:$trap), "int\t$trap",
[(int_x86_int imm:$trap)]>;
def IRET16 : I<0xcf, RawFrm, (outs), (ins), "iret{w}", []>, OpSize;
def IRET32 : I<0xcf, RawFrm, (outs), (ins), "iret{l}", []>;

View File

@ -0,0 +1,20 @@
; RUN: llc < %s -march=x86 | FileCheck %s
; RUN: llc < %s -march=x86-64 | FileCheck %s
declare void @llvm.x86.int(i8) nounwind
; CHECK: int3
; CHECK: ret
define void @primitive_int3 () {
bb.entry:
call void @llvm.x86.int(i8 3) nounwind
ret void
}
; CHECK: int $-128
; CHECK: ret
define void @primitive_int128 () {
bb.entry:
call void @llvm.x86.int(i8 128) nounwind
ret void
}