ARM: introduce llvm.arm.undefined intrinsic
authorSaleem Abdulrasool <compnerd@compnerd.org>
Thu, 22 May 2014 04:46:46 +0000 (04:46 +0000)
committerSaleem Abdulrasool <compnerd@compnerd.org>
Thu, 22 May 2014 04:46:46 +0000 (04:46 +0000)
This intrinsic permits the emission of platform specific undefined sequences.
ARM has reserved the 0xde opcode which takes a single integer parameter (ignored
by the CPU).  This permits the operating system to implement custom behaviour on
this trap.  The llvm.arm.undefined intrinsic is meant to provide a means for
generating the target specific behaviour from the frontend.  This is
particularly useful for Windows on ARM which has made use of a series of these
special opcodes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209390 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/IntrinsicsARM.td
lib/Target/ARM/ARMInstrInfo.td
lib/Target/ARM/ARMInstrThumb.td
lib/Target/ARM/ARMInstrThumb2.td
test/CodeGen/ARM/undefined.ll [new file with mode: 0644]

index b8ba9291a7afa06b46a0545fbb104fcc6472ecd7..d19d7b82fafe69f9f2318ed35f7ea9a0057b5fb4 100644 (file)
@@ -125,6 +125,11 @@ def int_arm_crc32cw : Intrinsic<[llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
 
 def int_arm_hint : Intrinsic<[], [llvm_i32_ty]>;
 
+//===----------------------------------------------------------------------===//
+// UND (reserved undefined sequence)
+
+def int_arm_undefined : Intrinsic<[], [llvm_i32_ty]>;
+
 //===----------------------------------------------------------------------===//
 // Advanced SIMD (NEON)
 
index f642893161c3ca76da63ce01e12f420d70e77c61..718d5da9d05a67e73cd323cc29fb353ad7e356a0 100644 (file)
@@ -1969,7 +1969,7 @@ def DBG : AI<(outs), (ins imm0_15:$opt), MiscFrm, NoItinerary, "dbg", "\t$opt",
 
 // A8.8.247  UDF - Undefined (Encoding A1)
 def UDF : AInoP<(outs), (ins imm0_65535:$imm16), MiscFrm, NoItinerary,
-                "udf", "\t$imm16", []> {
+                "udf", "\t$imm16", [(int_arm_undefined imm0_65535:$imm16)]> {
   bits<16> imm16;
   let Inst{31-28} = 0b1110; // AL
   let Inst{27-25} = 0b011;
index ff3832d98b5ebd6d9232ee7297de271c695e8583..e17f73af03ec9d6b5ea5395195677db974279ea8 100644 (file)
@@ -1194,8 +1194,8 @@ def tTST :                      // A8.6.230
                Sched<[WriteALU]>;
 
 // A8.8.247  UDF - Undefined (Encoding T1)
-def tUDF : TI<(outs), (ins imm0_255:$imm8), IIC_Br, "udf\t$imm8", []>,
-           Encoding16 {
+def tUDF : TI<(outs), (ins imm0_255:$imm8), IIC_Br, "udf\t$imm8",
+              [(int_arm_undefined imm0_255:$imm8)]>, Encoding16 {
   bits<8> imm8;
   let Inst{15-12} = 0b1101;
   let Inst{11-8} = 0b1110;
index 28f528a510e94ece3d36422572b4b3ee22506306..c30d6abbb299cf489fc085c267d329672bc553fd 100644 (file)
@@ -2408,8 +2408,8 @@ def t2UBFX: T2TwoRegBitFI<
 }
 
 // A8.8.247  UDF - Undefined (Encoding T2)
-def t2UDF
-    : T2XI<(outs), (ins imm0_65535:$imm16), IIC_Br, "udf.w\t$imm16", []> {
+def t2UDF : T2XI<(outs), (ins imm0_65535:$imm16), IIC_Br, "udf.w\t$imm16",
+                 [(int_arm_undefined imm0_65535:$imm16)]> {
   bits<16> imm16;
   let Inst{31-29} = 0b111;
   let Inst{28-27} = 0b10;
diff --git a/test/CodeGen/ARM/undefined.ll b/test/CodeGen/ARM/undefined.ll
new file mode 100644 (file)
index 0000000..86422fb
--- /dev/null
@@ -0,0 +1,14 @@
+; RUN: llc -mtriple armv7-eabi -o - %s | FileCheck %s
+; RUN: llc -mtriple thumbv6m-eabi -o - %s | FileCheck %s
+; RUN: llc -mtriple thumbv7-eabi -o - %s | FileCheck %s
+
+declare void @llvm.arm.undefined(i32) nounwind
+
+define void @undefined_trap() {
+entry:
+  tail call void @llvm.arm.undefined(i32 254)
+  ret void
+}
+
+; CHECK-LABEL: undefined_trap
+; CHECK: udf #254