mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-21 02:59:15 +00:00
[ARM] Implement __builtin_thread_pointer.
llvm-svn: 43892
This commit is contained in:
parent
d9bab93a44
commit
d8f2190c19
@ -268,3 +268,4 @@ def int_init_trampoline : Intrinsic<[llvm_ptr_ty, llvm_ptr_ty, llvm_ptr_ty,
|
||||
|
||||
include "llvm/IntrinsicsPowerPC.td"
|
||||
include "llvm/IntrinsicsX86.td"
|
||||
include "llvm/IntrinsicsARM.td"
|
||||
|
21
include/llvm/IntrinsicsARM.td
Normal file
21
include/llvm/IntrinsicsARM.td
Normal file
@ -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]>;
|
||||
}
|
@ -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 @@ ARMTargetLowering::ARMTargetLowering(TargetMachine &TM)
|
||||
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 @@ SDOperand ARMTargetLowering::LowerGLOBAL_OFFSET_TABLE(SDOperand Op,
|
||||
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 @@ SDOperand ARMTargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) {
|
||||
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();
|
||||
}
|
||||
|
10
test/CodeGen/ARM/thread_pointer.ll
Normal file
10
test/CodeGen/ARM/thread_pointer.ll
Normal file
@ -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()
|
Loading…
Reference in New Issue
Block a user