diff --git a/js/src/jit/CodeGenerator.cpp b/js/src/jit/CodeGenerator.cpp
--- a/js/src/jit/CodeGenerator.cpp
+++ b/js/src/jit/CodeGenerator.cpp
@@ -2676,17 +2676,35 @@ CodeGenerator::generateArgumentsChecks(b
     // arguments are correct. Upon fail it will hit a breakpoint.
 
     MIRGraph &mir = gen->graph();
     MResumePoint *rp = mir.entryResumePoint();
 
     // Reserve the amount of stack the actual frame will use. We have to undo
     // this before falling through to the method proper though, because the
     // monomorphic call case will bypass this entire path.
-    masm.reserveStack(frameSize());
+    if (frameSize() < 1024) {
+        masm.reserveStack(frameSize());
+    } else {
+        // On windows, we cannot skip far down the stack without touching the
+        // memory pages on the stack.
+        // This is corner-case code for situations where the Ion frame data for a piece
+        // of code is very large.  In this case, we just incrementally adjust the stack
+        // using multiple instructions, touching the stack along the way.
+        uint32_t sizeLeft = frameSize();
+        while (sizeLeft > 1024) {
+            masm.reserveStack(1024);
+            masm.store32(Imm32(0), Address(StackPointer, 0));
+            sizeLeft -= 1024;
+        }
+        if (sizeLeft > 0) {
+            masm.reserveStack(sizeLeft);
+            masm.store32(Imm32(0), Address(StackPointer, 0));
+        }
+    }
 
     // No registers are allocated yet, so it's safe to grab anything.
     Register temp = GeneralRegisterSet(EntryTempMask).getAny();
 
     CompileInfo &info = gen->info();
 
     Label miss;
     for (uint32_t i = info.startArgSlot(); i < info.endArgSlot(); i++) {
