mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-23 20:34:58 +00:00
X86-64 TLS support for local exec and initial exec.
llvm-svn: 68947
This commit is contained in:
parent
04a7716d62
commit
72347bffce
@ -454,14 +454,16 @@ void X86ATTAsmPrinter::printOperand(const MachineInstr *MI, unsigned OpNo,
|
||||
O << "@TLSGD";
|
||||
break;
|
||||
case TLSModel::InitialExec:
|
||||
if (Subtarget->is64Bit())
|
||||
O << "@TLSGD"; // 64 bit intial exec not implemented
|
||||
else
|
||||
if (Subtarget->is64Bit()) {
|
||||
assert (!NotRIPRel);
|
||||
O << "@GOTTPOFF(%rip)";
|
||||
} else {
|
||||
O << "@INDNTPOFF";
|
||||
}
|
||||
break;
|
||||
case TLSModel::LocalExec:
|
||||
if (Subtarget->is64Bit())
|
||||
O << "@TLSGD"; // 64 bit local exec not implemented
|
||||
O << "@TPOFF";
|
||||
else
|
||||
O << "@NTPOFF";
|
||||
break;
|
||||
|
@ -808,9 +808,16 @@ bool X86DAGToDAGISel::MatchWrapper(SDValue N, X86ISelAddressMode &AM) {
|
||||
uint64_t Offset = G->getOffset();
|
||||
if (!is64Bit || isInt32(AM.Disp + Offset)) {
|
||||
GlobalValue *GV = G->getGlobal();
|
||||
bool isRIPRel = TM.symbolicAddressesAreRIPRel();
|
||||
if (N0.getOpcode() == llvm::ISD::TargetGlobalTLSAddress) {
|
||||
TLSModel::Model model =
|
||||
getTLSModel (GV, TM.getRelocationModel());
|
||||
if (is64Bit && model == TLSModel::InitialExec)
|
||||
isRIPRel = true;
|
||||
}
|
||||
AM.GV = GV;
|
||||
AM.Disp += Offset;
|
||||
AM.isRIPRel = TM.symbolicAddressesAreRIPRel();
|
||||
AM.isRIPRel = isRIPRel;
|
||||
return false;
|
||||
}
|
||||
} else if (ConstantPoolSDNode *CP = dyn_cast<ConstantPoolSDNode>(N0)) {
|
||||
|
@ -4831,12 +4831,14 @@ LowerToTLSGeneralDynamicModel64(GlobalAddressSDNode *GA, SelectionDAG &DAG,
|
||||
// Lower ISD::GlobalTLSAddress using the "initial exec" (for no-pic) or
|
||||
// "local exec" model.
|
||||
static SDValue LowerToTLSExecModel(GlobalAddressSDNode *GA, SelectionDAG &DAG,
|
||||
const MVT PtrVT, TLSModel::Model model) {
|
||||
const MVT PtrVT, TLSModel::Model model,
|
||||
bool is64Bit) {
|
||||
DebugLoc dl = GA->getDebugLoc();
|
||||
// Get the Thread Pointer
|
||||
SDValue Base = DAG.getNode(X86ISD::SegmentBaseAddress,
|
||||
DebugLoc::getUnknownLoc(), PtrVT,
|
||||
DAG.getRegister(X86::GS, MVT::i32));
|
||||
DAG.getRegister(is64Bit? X86::FS : X86::GS,
|
||||
MVT::i32));
|
||||
|
||||
SDValue ThreadPointer = DAG.getLoad(PtrVT, dl, DAG.getEntryNode(), Base,
|
||||
NULL, 0);
|
||||
@ -4871,9 +4873,11 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) {
|
||||
switch (model) {
|
||||
case TLSModel::GeneralDynamic:
|
||||
case TLSModel::LocalDynamic: // not implemented
|
||||
case TLSModel::InitialExec: // not implemented
|
||||
case TLSModel::LocalExec: // not implemented
|
||||
return LowerToTLSGeneralDynamicModel64(GA, DAG, getPointerTy());
|
||||
|
||||
case TLSModel::InitialExec:
|
||||
case TLSModel::LocalExec:
|
||||
return LowerToTLSExecModel(GA, DAG, getPointerTy(), model, true);
|
||||
}
|
||||
} else {
|
||||
switch (model) {
|
||||
@ -4883,7 +4887,7 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) {
|
||||
|
||||
case TLSModel::InitialExec:
|
||||
case TLSModel::LocalExec:
|
||||
return LowerToTLSExecModel(GA, DAG, getPointerTy(), model);
|
||||
return LowerToTLSExecModel(GA, DAG, getPointerTy(), model, false);
|
||||
}
|
||||
}
|
||||
assert(0 && "Unreachable");
|
||||
|
@ -1,5 +1,7 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:i@NTPOFF, %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movl %fs:i@TPOFF, %eax} %t2
|
||||
|
||||
@i = thread_local global i32 15
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:0, %eax} %t
|
||||
; RUN: grep {leal i@NTPOFF(%eax), %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movq %fs:0, %rax} %t2
|
||||
; RUN: grep {leaq i@TPOFF(%rax), %rax} %t2
|
||||
|
||||
@i = external hidden thread_local global i32
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movw %gs:i@NTPOFF, %ax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movw %fs:i@TPOFF, %ax} %t2
|
||||
|
||||
@i = thread_local global i16 15
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movb %gs:i@NTPOFF, %al} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movb %fs:i@TPOFF, %al} %t2
|
||||
|
||||
@i = thread_local global i8 15
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movswl %gs:i@NTPOFF, %eax} %t
|
||||
; RUN: grep {movzwl %gs:j@NTPOFF, %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movswl %fs:i@TPOFF, %edi} %t2
|
||||
; RUN: grep {movzwl %fs:j@TPOFF, %edi} %t2
|
||||
|
||||
@i = thread_local global i16 0
|
||||
@j = thread_local global i16 0
|
||||
|
@ -1,6 +1,9 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movsbl %gs:i@NTPOFF, %eax} %t
|
||||
; RUN: grep {movzbl %gs:j@NTPOFF, %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movsbl %fs:i@TPOFF, %edi} %t2
|
||||
; RUN: grep {movzbl %fs:j@TPOFF, %edi} %t2
|
||||
|
||||
@i = thread_local global i8 0
|
||||
@j = thread_local global i8 0
|
||||
|
@ -2,6 +2,10 @@
|
||||
; RUN: grep {movl %gs:0, %eax} %t | count 1
|
||||
; RUN: grep {leal i@NTPOFF(%eax), %ecx} %t
|
||||
; RUN: grep {leal j@NTPOFF(%eax), %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movq %fs:0, %rax} %t2 | count 1
|
||||
; RUN: grep {leaq i@TPOFF(%rax), %rcx} %t2
|
||||
; RUN: grep {leaq j@TPOFF(%rax), %rax} %t2
|
||||
|
||||
@i = thread_local global i32 0
|
||||
@j = thread_local global i32 0
|
||||
|
@ -1,6 +1,9 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:0, %eax} %t
|
||||
; RUN: grep {leal i@NTPOFF(%eax), %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movq %fs:0, %rax} %t2
|
||||
; RUN: grep {leaq i@TPOFF(%rax), %rax} %t2
|
||||
|
||||
@i = thread_local global i32 15
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl i@INDNTPOFF, %eax} %t
|
||||
; RUN: grep {movl %gs:(%eax), %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movq i@GOTTPOFF(%rip), %rax} %t2
|
||||
; RUN: grep {movl %fs:(%rax), %eax} %t2
|
||||
|
||||
@i = external thread_local global i32 ; <i32*> [#uses=2]
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:0, %eax} %t
|
||||
; RUN: grep {addl i@INDNTPOFF, %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movq %fs:0, %rax} %t2
|
||||
; RUN: grep {addq i@GOTTPOFF(%rip), %rax} %t2
|
||||
|
||||
@i = external thread_local global i32 ; <i32*> [#uses=2]
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:i@NTPOFF, %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movl %fs:i@TPOFF, %eax} %t2
|
||||
|
||||
@i = internal thread_local global i32 15
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:0, %eax} %t
|
||||
; RUN: grep {leal i@NTPOFF(%eax), %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movq %fs:0, %rax} %t2
|
||||
; RUN: grep {leaq i@TPOFF(%rax), %rax} %t2
|
||||
|
||||
@i = internal thread_local global i32 15
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:i@NTPOFF, %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movl %fs:i@TPOFF, %eax} %t2
|
||||
|
||||
@i = hidden thread_local global i32 15
|
||||
|
||||
|
@ -1,6 +1,9 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:0, %eax} %t
|
||||
; RUN: grep {leal i@NTPOFF(%eax), %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movq %fs:0, %rax} %t2
|
||||
; RUN: grep {leaq i@TPOFF(%rax), %rax} %t2
|
||||
|
||||
@i = hidden thread_local global i32 15
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
; RUN: llvm-as < %s | llc -march=x86 -mtriple=i386-linux-gnu > %t
|
||||
; RUN: grep {movl %gs:i@NTPOFF, %eax} %t
|
||||
; RUN: llvm-as < %s | llc -march=x86-64 -mtriple=x86_64-linux-gnu > %t2
|
||||
; RUN: grep {movl %fs:i@TPOFF, %eax} %t2
|
||||
|
||||
@i = external hidden thread_local global i32
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user