Index: X86ISelLowering.cpp =================================================================== --- X86ISelLowering.cpp (revision 261121) +++ X86ISelLowering.cpp (working copy) @@ -22655,6 +22655,26 @@ } MachineBasicBlock * +X86TargetLowering::EmitLoweredTLSAddr(MachineInstr *MI, + MachineBasicBlock *BB) const { + const TargetInstrInfo &TII = *Subtarget.getInstrInfo(); + DebugLoc DL = MI->getDebugLoc(); + + // Emit CALLSEQ_START. + unsigned AdjStackDown = TII.getCallFrameSetupOpcode(); + BuildMI(*BB, MI, DL, TII.get(AdjStackDown)).addImm(0); + + BuildMI(*BB, MI, DL, TII.get(MI->getOpcode())); // XXX: FIXME + + // Emit CALLSEQ_END. + unsigned AdjStackUp = TII.getCallFrameDestroyOpcode(); + BuildMI(*BB, MI, DL, TII.get(AdjStackUp)).addImm(0).addImm(0); + + MI->eraseFromParent(); + return BB; +} + +MachineBasicBlock * X86TargetLowering::EmitLoweredTLSCall(MachineInstr *MI, MachineBasicBlock *BB) const { // This is pretty easy. We're taking the value that we received from @@ -23034,6 +23054,11 @@ case X86::TCRETURNri64: case X86::TCRETURNmi64: return BB; + case X86::TLS_addr32: + case X86::TLS_addr64: + case X86::TLS_base_addr32: + case X86::TLS_base_addr64: + return EmitLoweredTLSAddr(MI, BB); case X86::WIN_ALLOCA: return EmitLoweredWinAlloca(MI, BB); case X86::CATCHRET: Index: X86ISelLowering.h =================================================================== --- X86ISelLowering.h (revision 261121) +++ X86ISelLowering.h (working copy) @@ -1138,6 +1138,9 @@ MachineBasicBlock *EmitLoweredSegAlloca(MachineInstr *MI, MachineBasicBlock *BB) const; + MachineBasicBlock *EmitLoweredTLSAddr(MachineInstr *MI, + MachineBasicBlock *BB) const; + MachineBasicBlock *EmitLoweredTLSCall(MachineInstr *MI, MachineBasicBlock *BB) const; Index: X86InstrCompiler.td =================================================================== --- X86InstrCompiler.td (revision 261121) +++ X86InstrCompiler.td (working copy) @@ -436,7 +436,7 @@ MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS], - Uses = [ESP] in { + usesCustomInserter = 1, Uses = [ESP] in { def TLS_addr32 : I<0, Pseudo, (outs), (ins i32mem:$sym), "# TLS_addr32", [(X86tlsaddr tls32addr:$sym)]>, @@ -456,7 +456,7 @@ MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7, XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS], - Uses = [RSP] in { + usesCustomInserter = 1, Uses = [RSP] in { def TLS_addr64 : I<0, Pseudo, (outs), (ins i64mem:$sym), "# TLS_addr64", [(X86tlsaddr tls64addr:$sym)]>,