[llvm-commits] [llvm] r43892 - in /llvm/trunk: include/llvm/Intrinsics.td include/llvm/IntrinsicsARM.td lib/Target/ARM/ARMISelLowering.cpp test/CodeGen/ARM/thread_pointer.ll
Lauro Ramos Venancio
lauro.venancio at gmail.com
Thu Nov 8 09:20:07 PST 2007
Author: laurov
Date: Thu Nov 8 11:20:05 2007
New Revision: 43892
URL: http://llvm.org/viewvc/llvm-project?rev=43892&view=rev
Log:
[ARM] Implement __builtin_thread_pointer.
Added:
llvm/trunk/include/llvm/IntrinsicsARM.td
llvm/trunk/test/CodeGen/ARM/thread_pointer.ll
Modified:
llvm/trunk/include/llvm/Intrinsics.td
llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
Modified: llvm/trunk/include/llvm/Intrinsics.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Intrinsics.td?rev=43892&r1=43891&r2=43892&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Intrinsics.td (original)
+++ llvm/trunk/include/llvm/Intrinsics.td Thu Nov 8 11:20:05 2007
@@ -268,3 +268,4 @@
include "llvm/IntrinsicsPowerPC.td"
include "llvm/IntrinsicsX86.td"
+include "llvm/IntrinsicsARM.td"
Added: llvm/trunk/include/llvm/IntrinsicsARM.td
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IntrinsicsARM.td?rev=43892&view=auto
==============================================================================
--- llvm/trunk/include/llvm/IntrinsicsARM.td (added)
+++ llvm/trunk/include/llvm/IntrinsicsARM.td Thu Nov 8 11:20:05 2007
@@ -0,0 +1,21 @@
+//===- IntrinsicsARM.td - Defines ARM intrinsics -----------*- tablegen -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Lauro Ramos Venancio and is distributed under the
+// University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines all of the ARM-specific intrinsics.
+//
+//===----------------------------------------------------------------------===//
+
+
+//===----------------------------------------------------------------------===//
+// TLS
+
+let TargetPrefix = "arm" in { // All intrinsics start with "llvm.arm.".
+ def int_arm_thread_pointer : GCCBuiltin<"__builtin_thread_pointer">,
+ Intrinsic<[llvm_ptr_ty],[IntrNoMem]>;
+}
Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=43892&r1=43891&r2=43892&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Thu Nov 8 11:20:05 2007
@@ -23,6 +23,7 @@
#include "llvm/CallingConv.h"
#include "llvm/Constants.h"
#include "llvm/Instruction.h"
+#include "llvm/Intrinsics.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
@@ -213,7 +214,10 @@
if (!UseSoftFloat && Subtarget->hasVFP2() && !Subtarget->isThumb())
// Turn f64->i64 into FMRRD iff target supports vfp2.
setOperationAction(ISD::BIT_CONVERT, MVT::i64, Custom);
-
+
+ // We want to custom lower some of our intrinsics.
+ setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
+
setOperationAction(ISD::SETCC , MVT::i32, Expand);
setOperationAction(ISD::SETCC , MVT::f32, Expand);
setOperationAction(ISD::SETCC , MVT::f64, Expand);
@@ -882,6 +886,16 @@
return DAG.getNode(ARMISD::PIC_ADD, PtrVT, Result, PICLabel);
}
+static SDOperand LowerINTRINSIC_WO_CHAIN(SDOperand Op, SelectionDAG &DAG) {
+ MVT::ValueType PtrVT = DAG.getTargetLoweringInfo().getPointerTy();
+ unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))->getValue();
+ switch (IntNo) {
+ default: return SDOperand(); // Don't custom lower most intrinsics.
+ case Intrinsic::arm_thread_pointer:
+ return DAG.getNode(ARMISD::THREAD_POINTER, PtrVT);
+ }
+}
+
static SDOperand LowerVASTART(SDOperand Op, SelectionDAG &DAG,
unsigned VarArgsFrameIndex) {
// vastart just stores the address of the VarArgsFrameIndex slot into the
@@ -1410,6 +1424,7 @@
case ISD::FRAMEADDR: break;
case ISD::GLOBAL_OFFSET_TABLE: return LowerGLOBAL_OFFSET_TABLE(Op, DAG);
case ISD::MEMCPY: return LowerMEMCPY(Op, DAG);
+ case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
}
return SDOperand();
}
Added: llvm/trunk/test/CodeGen/ARM/thread_pointer.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/thread_pointer.ll?rev=43892&view=auto
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/thread_pointer.ll (added)
+++ llvm/trunk/test/CodeGen/ARM/thread_pointer.ll Thu Nov 8 11:20:05 2007
@@ -0,0 +1,10 @@
+; RUN: llvm-as < %s | llc -march=arm -mtriple=arm-linux-gnueabi | \
+; RUN: grep {__aeabi_read_tp}
+
+define i8* @test() {
+entry:
+ %tmp1 = call i8* @llvm.arm.thread.pointer( ) ; <i8*> [#uses=0]
+ ret i8* %tmp1
+}
+
+declare i8* @llvm.arm.thread.pointer()
More information about the llvm-commits
mailing list