Fix calling stack probe through a register on Win64.

The __chkstk function can be at a greater than 4 GiB offset from our
generated function. Fix derived from https://reviews.llvm.org/D7267

Change-Id: Ife87dcd42541676828c4a0ca77dcded6649ce278
Reviewed-on: https://swiftshader-review.googlesource.com/8932
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/third_party/LLVM/lib/Target/X86/X86FrameLowering.cpp b/third_party/LLVM/lib/Target/X86/X86FrameLowering.cpp
index d54f4ae..d751a32 100644
--- a/third_party/LLVM/lib/Target/X86/X86FrameLowering.cpp
+++ b/third_party/LLVM/lib/Target/X86/X86FrameLowering.cpp
@@ -850,12 +850,24 @@
         .setMIFlag(MachineInstr::FrameSetup);
     }
 
-    BuildMI(MBB, MBBI, DL,
-            TII.get(Is64Bit ? X86::W64ALLOCA : X86::CALLpcrel32))
-      .addExternalSymbol(StackProbeSymbol)
-      .addReg(StackPtr,    RegState::Define | RegState::Implicit)
-      .addReg(X86::EFLAGS, RegState::Define | RegState::Implicit)
-      .setMIFlag(MachineInstr::FrameSetup);
+    if (Is64Bit && MF.getTarget().getCodeModel() == CodeModel::Large) {
+      // For the large code model, we have to call through a register. Use R11,
+      // as it is unused and clobbered by all probe functions.
+      BuildMI(MBB, MBBI, DL, TII.get(X86::MOV64ri), X86::R11)
+          .addExternalSymbol(StackProbeSymbol);
+      BuildMI(MBB, MBBI, DL, TII.get(X86::CALL64r))
+          .addReg(X86::R11)
+          .addReg(StackPtr, RegState::Define | RegState::Implicit)
+          .addReg(X86::EFLAGS, RegState::Define | RegState::Implicit)
+          .setMIFlag(MachineInstr::FrameSetup);
+    } else {
+      BuildMI(MBB, MBBI, DL,
+              TII.get(STI.is64Bit() ? X86::CALL64pcrel32 : X86::CALLpcrel32))
+          .addExternalSymbol(StackProbeSymbol)
+          .addReg(StackPtr, RegState::Define | RegState::Implicit)
+          .addReg(X86::EFLAGS, RegState::Define | RegState::Implicit)
+          .setMIFlag(MachineInstr::FrameSetup);
+    }
 
     // MSVC x64's __chkstk needs to adjust %rsp.
     // FIXME: %rax preserves the offset and should be available.