mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Implement __builtin_thread_pointer
This path add the aarch64 lowering of __builtin_thread_pointer. It uses the already implemented AArch64ISD::THREAD_POINTER used in TLS generation. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243412 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ce1116eeb8
commit
fb3d3bb963
@ -13,6 +13,9 @@
|
||||
|
||||
let TargetPrefix = "aarch64" in {
|
||||
|
||||
def int_aarch64_thread_pointer : GCCBuiltin<"__builtin_thread_pointer">,
|
||||
Intrinsic<[llvm_ptr_ty], [], [IntrNoMem]>;
|
||||
|
||||
def int_aarch64_ldxr : Intrinsic<[llvm_i64_ty], [llvm_anyptr_ty]>;
|
||||
def int_aarch64_ldaxr : Intrinsic<[llvm_i64_ty], [llvm_anyptr_ty]>;
|
||||
def int_aarch64_stxr : Intrinsic<[llvm_i32_ty], [llvm_i64_ty, llvm_anyptr_ty]>;
|
||||
|
@ -519,6 +519,8 @@ AArch64TargetLowering::AArch64TargetLowering(const TargetMachine &TM,
|
||||
|
||||
setHasExtractBitsInsn(true);
|
||||
|
||||
setOperationAction(ISD::INTRINSIC_WO_CHAIN, MVT::Other, Custom);
|
||||
|
||||
if (Subtarget->hasNEON()) {
|
||||
// FIXME: v1f64 shouldn't be legal if we can avoid it, because it leads to
|
||||
// silliness like this:
|
||||
@ -2158,6 +2160,19 @@ static SDValue LowerMUL(SDValue Op, SelectionDAG &DAG) {
|
||||
DAG.getNode(ISD::BITCAST, DL, Op1VT, N01), Op1));
|
||||
}
|
||||
|
||||
SDValue AArch64TargetLowering::LowerINTRINSIC_WO_CHAIN(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
unsigned IntNo = cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue();
|
||||
SDLoc dl(Op);
|
||||
switch (IntNo) {
|
||||
default: return SDValue(); // Don't custom lower most intrinsics.
|
||||
case Intrinsic::aarch64_thread_pointer: {
|
||||
EVT PtrVT = getPointerTy(DAG.getDataLayout());
|
||||
return DAG.getNode(AArch64ISD::THREAD_POINTER, dl, PtrVT);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
switch (Op.getOpcode()) {
|
||||
@ -2259,6 +2274,8 @@ SDValue AArch64TargetLowering::LowerOperation(SDValue Op,
|
||||
return LowerFSINCOS(Op, DAG);
|
||||
case ISD::MUL:
|
||||
return LowerMUL(Op, DAG);
|
||||
case ISD::INTRINSIC_WO_CHAIN:
|
||||
return LowerINTRINSIC_WO_CHAIN(Op, DAG);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -397,6 +397,8 @@ private:
|
||||
SelectionDAG &DAG, SmallVectorImpl<SDValue> &InVals,
|
||||
bool isThisReturn, SDValue ThisVal) const;
|
||||
|
||||
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
||||
|
||||
bool isEligibleForTailCallOptimization(
|
||||
SDValue Callee, CallingConv::ID CalleeCC, bool isVarArg,
|
||||
bool isCalleeStructRet, bool isCallerStructRet,
|
||||
|
11
test/CodeGen/AArch64/arm64-builtins-linux.ll
Normal file
11
test/CodeGen/AArch64/arm64-builtins-linux.ll
Normal file
@ -0,0 +1,11 @@
|
||||
; RUN: llc < %s -march=aarch64 -mtriple=aarch64-linux-gnu | FileCheck %s
|
||||
|
||||
; Function Attrs: nounwind readnone
|
||||
declare i8* @llvm.aarch64.thread.pointer() #1
|
||||
|
||||
define i8* @thread_pointer() {
|
||||
; CHECK: thread_pointer:
|
||||
; CHECK: mrs {{x[0-9]+}}, TPIDR_EL0
|
||||
%1 = tail call i8* @llvm.aarch64.thread.pointer()
|
||||
ret i8* %1
|
||||
}
|
Loading…
Reference in New Issue
Block a user