summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-08-23 19:39:25 +0000
committerChris Lattner <sabre@nondot.org>2010-08-23 19:39:25 +0000
commitd80c7e12322e60969b04fa5e0fb806857a3d12c4 (patch)
tree28a2f2ae1d142ca83e1d680e36e3bf406d754271
parent00a5b5b2e97118e49aea0ad838eb2b249223a677 (diff)
downloadllvm-d80c7e12322e60969b04fa5e0fb806857a3d12c4.tar.gz
llvm-d80c7e12322e60969b04fa5e0fb806857a3d12c4.tar.bz2
llvm-d80c7e12322e60969b04fa5e0fb806857a3d12c4.tar.xz
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
-rw-r--r--include/llvm/IntrinsicsX86.td5
-rw-r--r--lib/Target/X86/X86InstrInfo.td10
-rw-r--r--test/CodeGen/X86/int-intrinsic.ll20
3 files changed, 32 insertions, 3 deletions
diff --git a/include/llvm/IntrinsicsX86.td b/include/llvm/IntrinsicsX86.td
index b1ee9dc7a0..c765d8536c 100644
--- a/include/llvm/IntrinsicsX86.td
+++ b/include/llvm/IntrinsicsX86.td
@@ -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
diff --git a/lib/Target/X86/X86InstrInfo.td b/lib/Target/X86/X86InstrInfo.td
index 73788a1972..60af8ed4c5 100644
--- a/lib/Target/X86/X86InstrInfo.td
+++ b/lib/Target/X86/X86InstrInfo.td
@@ -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}", []>;
diff --git a/test/CodeGen/X86/int-intrinsic.ll b/test/CodeGen/X86/int-intrinsic.ll
new file mode 100644
index 0000000000..45a9b0f15c
--- /dev/null
+++ b/test/CodeGen/X86/int-intrinsic.ll
@@ -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
+}