diff options
author | Bruce Forstall <brucefo@microsoft.com> | 2019-05-17 10:16:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-17 10:16:31 -0700 |
commit | e03923c09ea8e2eaf32d69bee4f4f7486b7d6a51 (patch) | |
tree | 24192a3ecb8bcfc29a5b0910488af45b5f768169 | |
parent | 21ac0ede7ecb3eaacd99814273ed8f551572b1dd (diff) | |
download | coreclr-e03923c09ea8e2eaf32d69bee4f4f7486b7d6a51.tar.gz coreclr-e03923c09ea8e2eaf32d69bee4f4f7486b7d6a51.tar.bz2 coreclr-e03923c09ea8e2eaf32d69bee4f4f7486b7d6a51.zip |
Fix localloc with large out arg space (#24388)
Add stack probing in localloc with fixed outgoing arg frames
The SP adjustment when we re-establish the outgoing argument
space after doing a localloc must be probed. This is true for
all architectures with fixed outgoing argument space, namely,
everything but x86.
Add new tests for this.
Fixes #23915
-rw-r--r-- | src/jit/codegen.h | 18 | ||||
-rw-r--r-- | src/jit/codegenarm.cpp | 154 | ||||
-rw-r--r-- | src/jit/codegenarm64.cpp | 46 | ||||
-rw-r--r-- | src/jit/codegenarmarch.cpp | 85 | ||||
-rw-r--r-- | src/jit/codegenxarch.cpp | 127 | ||||
-rw-r--r-- | src/jit/lsraarm.cpp | 14 | ||||
-rw-r--r-- | src/jit/target.h | 5 | ||||
-rw-r--r-- | tests/src/JIT/Methodical/largeframes/skip6/skippage6.cs | 12108 | ||||
-rw-r--r-- | tests/src/JIT/Methodical/largeframes/skip6/skippage6.csproj | 36 | ||||
-rw-r--r-- | tests/src/JIT/Methodical/largeframes/skip7/skippage7.cs | 101 | ||||
-rw-r--r-- | tests/src/JIT/Methodical/largeframes/skip7/skippage7.csproj | 36 |
11 files changed, 12648 insertions, 82 deletions
diff --git a/src/jit/codegen.h b/src/jit/codegen.h index 9acd910e96..7919d07857 100644 --- a/src/jit/codegen.h +++ b/src/jit/codegen.h @@ -317,6 +317,11 @@ protected: #if defined(_TARGET_ARM_) + bool genInstrWithConstant( + instruction ins, emitAttr attr, regNumber reg1, regNumber reg2, ssize_t imm, insFlags flags, regNumber tmpReg); + + bool genStackPointerAdjustment(ssize_t spAdjustment, regNumber tmpReg); + void genPushFltRegs(regMaskTP regMask); void genPopFltRegs(regMaskTP regMask); regMaskTP genStackAllocRegisterMask(unsigned frameSize, regMaskTP maskCalleeSavedFloat); @@ -1211,11 +1216,16 @@ protected: void genReturn(GenTree* treeNode); +#ifdef _TARGET_ARMARCH_ + void genStackPointerConstantAdjustment(ssize_t spDelta); +#else // !_TARGET_ARMARCH_ + void genStackPointerConstantAdjustment(ssize_t spDelta, regNumber regTmp); +#endif // !_TARGET_ARMARCH_ + + void genStackPointerConstantAdjustmentWithProbe(ssize_t spDelta, regNumber regTmp); + target_ssize_t genStackPointerConstantAdjustmentLoopWithProbe(ssize_t spDelta, regNumber regTmp); + #if defined(_TARGET_XARCH_) - void genStackPointerConstantAdjustmentWithProbe(ssize_t spDelta, bool hideSpChangeFromEmitter, regNumber regTmp); - void genStackPointerConstantAdjustmentLoopWithProbe(ssize_t spDelta, - bool hideSpChangeFromEmitter, - regNumber regTmp); void genStackPointerDynamicAdjustmentWithProbe(regNumber regSpDelta, regNumber regTmp); #endif // defined(_TARGET_XARCH_) diff --git a/src/jit/codegenarm.cpp b/src/jit/codegenarm.cpp index 06732fb638..99ea6ba9b0 100644 --- a/src/jit/codegenarm.cpp +++ b/src/jit/codegenarm.cpp @@ -22,6 +22,96 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX #include "emit.h" //------------------------------------------------------------------------ +// genInstrWithConstant: We will typically generate one instruction +// +// ins reg1, reg2, imm +// +// However the imm might not fit as a directly encodable immediate. +// When it doesn't fit we generate extra instruction(s) that sets up +// the 'regTmp' with the proper immediate value. +// +// mov regTmp, imm +// ins reg1, reg2, regTmp +// +// Generally, codegen constants are marked non-containable if they don't fit. This function +// is used for cases that aren't mirrored in the IR, such as in the prolog. +// +// Arguments: +// ins - instruction +// attr - operation size and GC attribute +// reg1, reg2 - first and second register operands +// imm - immediate value (third operand when it fits) +// flags - whether flags are set +// tmpReg - temp register to use when the 'imm' doesn't fit. Can be REG_NA +// if caller knows for certain the constant will fit. +// +// Return Value: +// returns true if the immediate was too large and tmpReg was used and modified. +// +bool CodeGen::genInstrWithConstant( + instruction ins, emitAttr attr, regNumber reg1, regNumber reg2, ssize_t imm, insFlags flags, regNumber tmpReg) +{ + bool immFitsInIns = false; + + // reg1 is usually a dest register + // reg2 is always source register + assert(tmpReg != reg2); // regTmp cannot match any source register + + switch (ins) + { + case INS_add: + case INS_sub: + immFitsInIns = validImmForInstr(ins, imm, flags); + break; + + default: + assert(!"Unexpected instruction in genInstrWithConstant"); + break; + } + + if (immFitsInIns) + { + // generate a single instruction that encodes the immediate directly + getEmitter()->emitIns_R_R_I(ins, attr, reg1, reg2, imm); + } + else + { + // caller can specify REG_NA for tmpReg, when it "knows" that the immediate will always fit + assert(tmpReg != REG_NA); + + // generate two or more instructions + + // first we load the immediate into tmpReg + instGen_Set_Reg_To_Imm(attr, tmpReg, imm); + + // generate the instruction using a three register encoding with the immediate in tmpReg + getEmitter()->emitIns_R_R_R(ins, attr, reg1, reg2, tmpReg); + } + return immFitsInIns; +} + +//------------------------------------------------------------------------ +// genStackPointerAdjustment: add a specified constant value to the stack pointer. +// An available temporary register is required to be specified, in case the constant +// is too large to encode in an "add" instruction (or "sub" instruction if we choose +// to use one), such that we need to load the constant into a register first, before using it. +// +// Arguments: +// spDelta - the value to add to SP (can be negative) +// tmpReg - an available temporary register +// +// Return Value: +// true if `tmpReg` was used. +// +bool CodeGen::genStackPointerAdjustment(ssize_t spDelta, regNumber tmpReg) +{ + // Even though INS_add is specified here, the encoder will choose either + // an INS_add or an INS_sub and encode the immediate as a positive value + // + return genInstrWithConstant(INS_add, EA_PTRSIZE, REG_SPBASE, REG_SPBASE, spDelta, INS_FLAGS_DONT_CARE, tmpReg); +} + +//------------------------------------------------------------------------ // genCallFinally: Generate a call to the finally block. // BasicBlock* CodeGen::genCallFinally(BasicBlock* block) @@ -271,11 +361,15 @@ void CodeGen::genLclHeap(GenTree* tree) // Result of localloc will be returned in regCnt. // Also it used as temporary register in code generation // for storing allocation size - regNumber regCnt = tree->gtRegNum; - var_types type = genActualType(size->gtType); - emitAttr easz = emitTypeSize(type); - BasicBlock* endLabel = nullptr; - unsigned stackAdjustment = 0; + regNumber regCnt = tree->gtRegNum; + var_types type = genActualType(size->gtType); + emitAttr easz = emitTypeSize(type); + BasicBlock* endLabel = nullptr; + unsigned stackAdjustment = 0; + regNumber regTmp = REG_NA; + const target_ssize_t ILLEGAL_LAST_TOUCH_DELTA = (target_ssize_t)-1; + target_ssize_t lastTouchDelta = + ILLEGAL_LAST_TOUCH_DELTA; // The number of bytes from SP to the last stack address probed. noway_assert(isFramePointerUsed()); // localloc requires Frame Pointer to be established since SP changes noway_assert(genStackLevel == 0); // Can't have anything on the stack @@ -304,15 +398,22 @@ void CodeGen::genLclHeap(GenTree* tree) inst_JMP(EJ_eq, endLabel); } - stackAdjustment = 0; + // Setup the regTmp, if there is one. + if (tree->AvailableTempRegCount() > 0) + { + regTmp = tree->ExtractTempReg(); + } // If we have an outgoing arg area then we must adjust the SP by popping off the // outgoing arg area. We will restore it right before we return from this method. if (compiler->lvaOutgoingArgSpaceSize > 0) { - assert((compiler->lvaOutgoingArgSpaceSize % STACK_ALIGN) == 0); // This must be true for the stack to remain - // aligned - inst_RV_IV(INS_add, REG_SPBASE, compiler->lvaOutgoingArgSpaceSize, EA_PTRSIZE); + // This must be true for the stack to remain aligned + assert((compiler->lvaOutgoingArgSpaceSize % STACK_ALIGN) == 0); + + // We're guaranteed (by LinearScan::BuildLclHeap()) to have a legal regTmp if we need one. + genStackPointerAdjustment(compiler->lvaOutgoingArgSpaceSize, regTmp); + stackAdjustment += compiler->lvaOutgoingArgSpaceSize; } @@ -338,6 +439,8 @@ void CodeGen::genLclHeap(GenTree* tree) pushCount -= 1; } + lastTouchDelta = 0; + goto ALLOC_DONE; } else if (!compiler->info.compInitMem && (amount < compiler->eeGetPageSize())) // must be < not <= @@ -347,6 +450,9 @@ void CodeGen::genLclHeap(GenTree* tree) // the alloc, not after. getEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, regCnt, REG_SP, 0); inst_RV_IV(INS_sub, REG_SP, amount, EA_PTRSIZE); + + lastTouchDelta = amount; + goto ALLOC_DONE; } @@ -367,7 +473,6 @@ void CodeGen::genLclHeap(GenTree* tree) // Since we have to zero out the allocated memory AND ensure that the stack pointer is always valid // by tickling the pages, we will just push 0's on the stack. - regNumber regTmp = tree->ExtractTempReg(); instGen_Set_Reg_To_Zero(EA_PTRSIZE, regTmp); // Loop: @@ -383,6 +488,8 @@ void CodeGen::genLclHeap(GenTree* tree) assert(genIsValidIntReg(regCnt)); getEmitter()->emitIns_R_I(INS_sub, EA_PTRSIZE, regCnt, STACK_ALIGN, INS_FLAGS_SET); inst_JMP(EJ_ne, loop); + + lastTouchDelta = 0; } else { @@ -417,9 +524,6 @@ void CodeGen::genLclHeap(GenTree* tree) // mov SP, regCnt // - // Setup the regTmp - regNumber regTmp = tree->ExtractTempReg(); - BasicBlock* loop = genCreateTempLabel(); BasicBlock* done = genCreateTempLabel(); @@ -453,19 +557,33 @@ void CodeGen::genLclHeap(GenTree* tree) // Now just move the final value to SP getEmitter()->emitIns_R_R(INS_mov, EA_PTRSIZE, REG_SPBASE, regCnt); + + // lastTouchDelta is dynamic, and can be up to a page. So if we have outgoing arg space, + // we're going to assume the worst and probe. } ALLOC_DONE: - // Re-adjust SP to allocate out-going arg area + // Re-adjust SP to allocate outgoing arg area. We must probe this adjustment. if (stackAdjustment != 0) { assert((stackAdjustment % STACK_ALIGN) == 0); // This must be true for the stack to remain aligned - assert(stackAdjustment > 0); - getEmitter()->emitIns_R_R_I(INS_sub, EA_PTRSIZE, REG_SPBASE, REG_SPBASE, (int)stackAdjustment); + assert((lastTouchDelta == ILLEGAL_LAST_TOUCH_DELTA) || (lastTouchDelta >= 0)); + + if ((lastTouchDelta == ILLEGAL_LAST_TOUCH_DELTA) || + (stackAdjustment + (unsigned)lastTouchDelta + STACK_PROBE_BOUNDARY_THRESHOLD_BYTES > + compiler->eeGetPageSize())) + { + genStackPointerConstantAdjustmentLoopWithProbe(-(ssize_t)stackAdjustment, regTmp); + } + else + { + genStackPointerConstantAdjustment(-(ssize_t)stackAdjustment); + } // Return the stackalloc'ed address in result register. - // regCnt = RSP + stackAdjustment. - getEmitter()->emitIns_R_R_I(INS_add, EA_PTRSIZE, regCnt, REG_SPBASE, (int)stackAdjustment); + // regCnt = SP + stackAdjustment. + genInstrWithConstant(INS_add, EA_PTRSIZE, regCnt, REG_SPBASE, (ssize_t)stackAdjustment, INS_FLAGS_DONT_CARE, + regTmp); } else // stackAdjustment == 0 { diff --git a/src/jit/codegenarm64.cpp b/src/jit/codegenarm64.cpp index ec54b4302d..96222cfc87 100644 --- a/src/jit/codegenarm64.cpp +++ b/src/jit/codegenarm64.cpp @@ -2070,14 +2070,17 @@ void CodeGen::genLclHeap(GenTree* tree) GenTree* size = tree->gtOp.gtOp1; noway_assert((genActualType(size->gtType) == TYP_INT) || (genActualType(size->gtType) == TYP_I_IMPL)); - regNumber targetReg = tree->gtRegNum; - regNumber regCnt = REG_NA; - regNumber pspSymReg = REG_NA; - var_types type = genActualType(size->gtType); - emitAttr easz = emitTypeSize(type); - BasicBlock* endLabel = nullptr; - BasicBlock* loop = nullptr; - unsigned stackAdjustment = 0; + regNumber targetReg = tree->gtRegNum; + regNumber regCnt = REG_NA; + regNumber pspSymReg = REG_NA; + var_types type = genActualType(size->gtType); + emitAttr easz = emitTypeSize(type); + BasicBlock* endLabel = nullptr; + BasicBlock* loop = nullptr; + unsigned stackAdjustment = 0; + const target_ssize_t ILLEGAL_LAST_TOUCH_DELTA = (target_ssize_t)-1; + target_ssize_t lastTouchDelta = + ILLEGAL_LAST_TOUCH_DELTA; // The number of bytes from SP to the last stack address probed. noway_assert(isFramePointerUsed()); // localloc requires Frame Pointer to be established since SP changes noway_assert(genStackLevel == 0); // Can't have anything on the stack @@ -2131,8 +2134,6 @@ void CodeGen::genLclHeap(GenTree* tree) inst_RV_IV(INS_and, regCnt, ~(STACK_ALIGN - 1), emitActualTypeSize(type)); } - stackAdjustment = 0; - // If we have an outgoing arg area then we must adjust the SP by popping off the // outgoing arg area. We will restore it right before we return from this method. // @@ -2172,6 +2173,8 @@ void CodeGen::genLclHeap(GenTree* tree) stpCount -= 1; } + lastTouchDelta = 0; + goto ALLOC_DONE; } else if (!compiler->info.compInitMem && (amount < compiler->eeGetPageSize())) // must be < not <= @@ -2185,6 +2188,8 @@ void CodeGen::genLclHeap(GenTree* tree) inst_RV_IV(INS_sub, REG_SP, amount, EA_PTRSIZE); + lastTouchDelta = amount; + goto ALLOC_DONE; } @@ -2228,6 +2233,8 @@ void CodeGen::genLclHeap(GenTree* tree) assert(genIsValidIntReg(regCnt)); inst_RV_IV(INS_subs, regCnt, 16, emitActualTypeSize(type)); inst_JMP(EJ_ne, loop); + + lastTouchDelta = 0; } else { @@ -2296,15 +2303,28 @@ void CodeGen::genLclHeap(GenTree* tree) // Now just move the final value to SP getEmitter()->emitIns_R_R(INS_mov, EA_PTRSIZE, REG_SPBASE, regCnt); + + // lastTouchDelta is dynamic, and can be up to a page. So if we have outgoing arg space, + // we're going to assume the worst and probe. } ALLOC_DONE: - // Re-adjust SP to allocate out-going arg area + // Re-adjust SP to allocate outgoing arg area. We must probe this adjustment. if (stackAdjustment != 0) { assert((stackAdjustment % STACK_ALIGN) == 0); // This must be true for the stack to remain aligned - assert(stackAdjustment > 0); - genInstrWithConstant(INS_sub, EA_PTRSIZE, REG_SPBASE, REG_SPBASE, (ssize_t)stackAdjustment, rsGetRsvdReg()); + assert((lastTouchDelta == ILLEGAL_LAST_TOUCH_DELTA) || (lastTouchDelta >= 0)); + + if ((lastTouchDelta == ILLEGAL_LAST_TOUCH_DELTA) || + (stackAdjustment + (unsigned)lastTouchDelta + STACK_PROBE_BOUNDARY_THRESHOLD_BYTES > + compiler->eeGetPageSize())) + { + genStackPointerConstantAdjustmentLoopWithProbe(-(ssize_t)stackAdjustment, REG_ZR); + } + else + { + genStackPointerConstantAdjustment(-(ssize_t)stackAdjustment); + } // Return the stackalloc'ed address in result register. // TargetReg = SP + stackAdjustment. diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp index c57ce472e0..048e0e3ad3 100644 --- a/src/jit/codegenarmarch.cpp +++ b/src/jit/codegenarmarch.cpp @@ -23,6 +23,91 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX #include "emit.h" //------------------------------------------------------------------------ +// genStackPointerConstantAdjustment: add a specified constant value to the stack pointer. +// No probe is done. +// +// Arguments: +// spDelta - the value to add to SP. Must be negative or zero. +// +// Return Value: +// None. +// +void CodeGen::genStackPointerConstantAdjustment(ssize_t spDelta) +{ + assert(spDelta < 0); + + // We assert that the SP change is less than one page. If it's greater, you should have called a + // function that does a probe, which will in turn call this function. + assert((target_size_t)(-spDelta) <= compiler->eeGetPageSize()); + + inst_RV_IV(INS_sub, REG_SPBASE, -spDelta, EA_PTRSIZE); +} + +//------------------------------------------------------------------------ +// genStackPointerConstantAdjustmentWithProbe: add a specified constant value to the stack pointer, +// and probe the stack as appropriate. Should only be called as a helper for +// genStackPointerConstantAdjustmentLoopWithProbe. +// +// Arguments: +// spDelta - the value to add to SP. Must be negative or zero. If zero, the probe happens, +// but the stack pointer doesn't move. +// regTmp - temporary register to use as target for probe load instruction +// +// Return Value: +// None. +// +void CodeGen::genStackPointerConstantAdjustmentWithProbe(ssize_t spDelta, regNumber regTmp) +{ + getEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, regTmp, REG_SP, 0); + genStackPointerConstantAdjustment(spDelta); +} + +//------------------------------------------------------------------------ +// genStackPointerConstantAdjustmentLoopWithProbe: Add a specified constant value to the stack pointer, +// and probe the stack as appropriate. Generates one probe per page, up to the total amount required. +// This will generate a sequence of probes in-line. +// +// Arguments: +// spDelta - the value to add to SP. Must be negative. +// regTmp - temporary register to use as target for probe load instruction +// +// Return Value: +// Offset in bytes from SP to last probed address. +// +target_ssize_t CodeGen::genStackPointerConstantAdjustmentLoopWithProbe(ssize_t spDelta, regNumber regTmp) +{ + assert(spDelta < 0); + + const target_size_t pageSize = compiler->eeGetPageSize(); + + ssize_t spRemainingDelta = spDelta; + do + { + ssize_t spOneDelta = -(ssize_t)min((target_size_t)-spRemainingDelta, pageSize); + genStackPointerConstantAdjustmentWithProbe(spOneDelta, regTmp); + spRemainingDelta -= spOneDelta; + } while (spRemainingDelta < 0); + + // What offset from the final SP was the last probe? This depends on the fact that + // genStackPointerConstantAdjustmentWithProbe() probes first, then does "SUB SP". + target_size_t lastTouchDelta = (target_size_t)(-spDelta) % pageSize; + if ((lastTouchDelta == 0) || (lastTouchDelta + STACK_PROBE_BOUNDARY_THRESHOLD_BYTES > pageSize)) + { + // We haven't probed almost a complete page. If lastTouchDelta==0, then spDelta was an exact + // multiple of pageSize, which means we last probed exactly one page back. Otherwise, we probed + // the page, but very far from the end. If the next action on the stack might subtract from SP + // first, before touching the current SP, then we do one more probe at the very bottom. This can + // happen on x86, for example, when we copy an argument to the stack using a "SUB ESP; REP MOV" + // strategy. + + getEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, regTmp, REG_SP, 0); + lastTouchDelta = 0; + } + + return lastTouchDelta; +} + +//------------------------------------------------------------------------ // genCodeForTreeNode Generate code for a single node in the tree. // // Preconditions: diff --git a/src/jit/codegenxarch.cpp b/src/jit/codegenxarch.cpp index 7a67043dfc..2361fd8b22 100644 --- a/src/jit/codegenxarch.cpp +++ b/src/jit/codegenxarch.cpp @@ -2330,7 +2330,7 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni getEmitter()->emitIns_R_AR(INS_lea, EA_PTRSIZE, REG_SPBASE, initReg, frameSize); // restore stack pointer - lastTouchDelta = 0; // The loop code above actually over-probes: it always probes beyond the final SP we need. + lastTouchDelta = 0; // The loop code above actually over-probes: it always probes beyond the final SP we need. #endif // _TARGET_UNIX_ @@ -2368,50 +2368,65 @@ void CodeGen::genAllocLclFrame(unsigned frameSize, regNumber initReg, bool* pIni } //------------------------------------------------------------------------ -// genStackPointerConstantAdjustmentWithProbe: add a specified constant value to the stack pointer, -// and probe the stack as appropriate. Should only be called as a helper for -// genStackPointerConstantAdjustmentLoopWithProbe. +// genStackPointerConstantAdjustment: add a specified constant value to the stack pointer. +// No probe is done. // // Arguments: -// spDelta - the value to add to SP. Must be negative or zero. If zero, the probe happens, -// but the stack pointer doesn't move. -// hideSpChangeFromEmitter - if true, hide the SP adjustment from the emitter. This only applies to x86, -// and requires that `regTmp` be valid. -// regTmp - an available temporary register. Will be trashed. Only used on x86. -// Must be REG_NA on non-x86 platforms. +// spDelta - the value to add to SP. Must be negative or zero. +// regTmp - x86 only: an available temporary register. If not REG_NA, hide the SP +// adjustment from the emitter, using this register. // // Return Value: // None. // -void CodeGen::genStackPointerConstantAdjustmentWithProbe(ssize_t spDelta, - bool hideSpChangeFromEmitter, - regNumber regTmp) +void CodeGen::genStackPointerConstantAdjustment(ssize_t spDelta, regNumber regTmp) { assert(spDelta < 0); - assert((target_size_t)(-spDelta) <= compiler->eeGetPageSize()); - getEmitter()->emitIns_AR_R(INS_TEST, EA_4BYTE, REG_SPBASE, REG_SPBASE, 0); + // We assert that the SP change is less than one page. If it's greater, you should have called a + // function that does a probe, which will in turn call this function. + assert((target_size_t)(-spDelta) <= compiler->eeGetPageSize()); - if (hideSpChangeFromEmitter) +#ifdef _TARGET_X86_ + if (regTmp != REG_NA) { // For x86, some cases don't want to use "sub ESP" because we don't want the emitter to track the adjustment // to ESP. So do the work in the count register. // TODO-CQ: manipulate ESP directly, to share code, reduce #ifdefs, and improve CQ. This would require // creating a way to temporarily turn off the emitter's tracking of ESP, maybe marking instrDescs as "don't // track". - assert(regTmp != REG_NA); inst_RV_RV(INS_mov, regTmp, REG_SPBASE, TYP_I_IMPL); inst_RV_IV(INS_sub, regTmp, -spDelta, EA_PTRSIZE); inst_RV_RV(INS_mov, REG_SPBASE, regTmp, TYP_I_IMPL); } else +#endif // _TARGET_X86_ { - assert(regTmp == REG_NA); inst_RV_IV(INS_sub, REG_SPBASE, -spDelta, EA_PTRSIZE); } } //------------------------------------------------------------------------ +// genStackPointerConstantAdjustmentWithProbe: add a specified constant value to the stack pointer, +// and probe the stack as appropriate. Should only be called as a helper for +// genStackPointerConstantAdjustmentLoopWithProbe. +// +// Arguments: +// spDelta - the value to add to SP. Must be negative or zero. If zero, the probe happens, +// but the stack pointer doesn't move. +// regTmp - x86 only: an available temporary register. If not REG_NA, hide the SP +// adjustment from the emitter, using this register. +// +// Return Value: +// None. +// +void CodeGen::genStackPointerConstantAdjustmentWithProbe(ssize_t spDelta, regNumber regTmp) +{ + getEmitter()->emitIns_AR_R(INS_TEST, EA_4BYTE, REG_SPBASE, REG_SPBASE, 0); + genStackPointerConstantAdjustment(spDelta, regTmp); +} + +//------------------------------------------------------------------------ // genStackPointerConstantAdjustmentLoopWithProbe: Add a specified constant value to the stack pointer, // and probe the stack as appropriate. Generates one probe per page, up to the total amount required. // This will generate a sequence of probes in-line. It is required for the case where we need to expose @@ -2422,17 +2437,13 @@ void CodeGen::genStackPointerConstantAdjustmentWithProbe(ssize_t spDelta, // // Arguments: // spDelta - the value to add to SP. Must be negative. -// hideSpChangeFromEmitter - if true, hide the SP adjustment from the emitter. This only applies to x86, -// and requires that `regTmp` be valid. -// regTmp - an available temporary register. Will be trashed. Only used on x86. -// Must be REG_NA on non-x86 platforms. +// regTmp - x86 only: an available temporary register. If not REG_NA, hide the SP +// adjustment from the emitter, using this register. // // Return Value: -// None. +// Offset in bytes from SP to last probed address. // -void CodeGen::genStackPointerConstantAdjustmentLoopWithProbe(ssize_t spDelta, - bool hideSpChangeFromEmitter, - regNumber regTmp) +target_ssize_t CodeGen::genStackPointerConstantAdjustmentLoopWithProbe(ssize_t spDelta, regNumber regTmp) { assert(spDelta < 0); @@ -2442,7 +2453,7 @@ void CodeGen::genStackPointerConstantAdjustmentLoopWithProbe(ssize_t spDelta, do { ssize_t spOneDelta = -(ssize_t)min((target_size_t)-spRemainingDelta, pageSize); - genStackPointerConstantAdjustmentWithProbe(spOneDelta, hideSpChangeFromEmitter, regTmp); + genStackPointerConstantAdjustmentWithProbe(spOneDelta, regTmp); spRemainingDelta -= spOneDelta; } while (spRemainingDelta < 0); @@ -2459,7 +2470,10 @@ void CodeGen::genStackPointerConstantAdjustmentLoopWithProbe(ssize_t spDelta, // strategy. getEmitter()->emitIns_AR_R(INS_test, EA_PTRSIZE, REG_EAX, REG_SPBASE, 0); + lastTouchDelta = 0; } + + return lastTouchDelta; } //------------------------------------------------------------------------ @@ -2472,8 +2486,7 @@ void CodeGen::genStackPointerConstantAdjustmentLoopWithProbe(ssize_t spDelta, // Arguments: // regSpDelta - the register value to add to SP. The value in this register must be negative. // This register might be trashed. -// regTmp - an available temporary register. Will be trashed. Only used on x86. -// Must be REG_NA on non-x86 platforms. +// regTmp - an available temporary register. Will be trashed. // // Return Value: // None. @@ -2559,11 +2572,12 @@ void CodeGen::genLclHeap(GenTree* tree) GenTree* size = tree->gtOp.gtOp1; noway_assert((genActualType(size->gtType) == TYP_INT) || (genActualType(size->gtType) == TYP_I_IMPL)); - regNumber targetReg = tree->gtRegNum; - regNumber regCnt = REG_NA; - var_types type = genActualType(size->gtType); - emitAttr easz = emitTypeSize(type); - BasicBlock* endLabel = nullptr; + regNumber targetReg = tree->gtRegNum; + regNumber regCnt = REG_NA; + var_types type = genActualType(size->gtType); + emitAttr easz = emitTypeSize(type); + BasicBlock* endLabel = nullptr; + target_ssize_t lastTouchDelta = (target_ssize_t)-1; #ifdef DEBUG genStackPointerCheck(compiler->opts.compStackCheckOnRet, compiler->lvaReturnSpCheck); @@ -2687,18 +2701,19 @@ void CodeGen::genLclHeap(GenTree* tree) { inst_IV(INS_push_hide, 0); // push_hide means don't track the stack } + + lastTouchDelta = 0; + goto ALLOC_DONE; } - bool doNoInitLessThanOnePageAlloc = - !compiler->info.compInitMem && (amount < compiler->eeGetPageSize()); // must be < not <= + bool initMemOrLargeAlloc = + compiler->info.compInitMem || (amount >= compiler->eeGetPageSize()); // must be >= not > #ifdef _TARGET_X86_ - bool needRegCntRegister = true; - bool hideSpChangeFromEmitter = true; + bool needRegCntRegister = true; #else // !_TARGET_X86_ - bool needRegCntRegister = !doNoInitLessThanOnePageAlloc; - bool hideSpChangeFromEmitter = false; + bool needRegCntRegister = initMemOrLargeAlloc; #endif // !_TARGET_X86_ if (needRegCntRegister) @@ -2717,14 +2732,14 @@ void CodeGen::genLclHeap(GenTree* tree) } } - if (doNoInitLessThanOnePageAlloc) + if (!initMemOrLargeAlloc) { - // Since the size is less than a page, simply adjust ESP. + // Since the size is less than a page, and we don't need to zero init memory, simply adjust ESP. // ESP might already be in the guard page, so we must touch it BEFORE // the alloc, not after. assert(amount < compiler->eeGetPageSize()); // must be < not <= - genStackPointerConstantAdjustmentLoopWithProbe(-(ssize_t)amount, hideSpChangeFromEmitter, regCnt); + lastTouchDelta = genStackPointerConstantAdjustmentLoopWithProbe(-(ssize_t)amount, regCnt); goto ALLOC_DONE; } @@ -2765,6 +2780,8 @@ void CodeGen::genLclHeap(GenTree* tree) // Decrement the loop counter and loop if not done. inst_RV(INS_dec, regCnt, TYP_I_IMPL); inst_JMP(EJ_jne, loop); + + lastTouchDelta = 0; } else { @@ -2775,14 +2792,31 @@ void CodeGen::genLclHeap(GenTree* tree) inst_RV(INS_NEG, regCnt, TYP_I_IMPL); regNumber regTmp = tree->GetSingleTempReg(); genStackPointerDynamicAdjustmentWithProbe(regCnt, regTmp); + + // lastTouchDelta is dynamic, and can be up to a page. So if we have outgoing arg space, + // we're going to assume the worst and probe. } ALLOC_DONE: - // Re-adjust SP to allocate out-going arg area + // Re-adjust SP to allocate out-going arg area. Note: this also requires probes, if we have + // a very large stack adjustment! For simplicity, we use the same function used elsewhere, + // which probes the current address before subtracting. We may end up probing multiple + // times relatively "nearby". if (stackAdjustment > 0) { assert((stackAdjustment % STACK_ALIGN) == 0); // This must be true for the stack to remain aligned - inst_RV_IV(INS_sub, REG_SPBASE, stackAdjustment, EA_PTRSIZE); + assert(lastTouchDelta >= -1); + + if ((lastTouchDelta == (target_ssize_t)-1) || + (stackAdjustment + (unsigned)lastTouchDelta + STACK_PROBE_BOUNDARY_THRESHOLD_BYTES > + compiler->eeGetPageSize())) + { + genStackPointerConstantAdjustmentLoopWithProbe(-(ssize_t)stackAdjustment, REG_NA); + } + else + { + genStackPointerConstantAdjustment(-(ssize_t)stackAdjustment, REG_NA); + } } // Return the stackalloc'ed address in result register. @@ -7652,8 +7686,7 @@ bool CodeGen::genAdjustStackForPutArgStk(GenTreePutArgStk* putArgStk) if ((argSize >= ARG_STACK_PROBE_THRESHOLD_BYTES) || compiler->compStressCompile(Compiler::STRESS_GENERIC_VARN, 5)) { - genStackPointerConstantAdjustmentLoopWithProbe(-(ssize_t)argSize, /* hideSpChangeFromEmitter */ false, - REG_NA); + genStackPointerConstantAdjustmentLoopWithProbe(-(ssize_t)argSize, REG_NA); } else { diff --git a/src/jit/lsraarm.cpp b/src/jit/lsraarm.cpp index 27e5e99111..b999bd50f6 100644 --- a/src/jit/lsraarm.cpp +++ b/src/jit/lsraarm.cpp @@ -41,6 +41,11 @@ int LinearScan::BuildLclHeap(GenTree* tree) // >4 ptr words Yes 1 // Non-const Yes 1 // Non-const No 1 + // + // If the outgoing argument space is too large to encode in an "add/sub sp, icon" + // instruction, we also need a temp (we can use the same temp register needed + // for the other cases above, if there are multiple conditions that require a + // temp register). GenTree* size = tree->gtGetOp1(); int internalIntCount; @@ -90,6 +95,15 @@ int LinearScan::BuildLclHeap(GenTree* tree) BuildUse(size); } + // If we have an outgoing argument space, we are going to probe that SP change, and we require + // a temporary register for doing the probe. Note also that if the outgoing argument space is + // large enough that it can't be directly encoded in SUB/ADD instructions, we also need a temp + // register to load the large sized constant into a register. + if (compiler->lvaOutgoingArgSpaceSize > 0) + { + internalIntCount = 1; + } + // If we are needed in temporary registers we should be sure that // it's different from target (regCnt) if (internalIntCount > 0) diff --git a/src/jit/target.h b/src/jit/target.h index a225d1a4bb..b7ae79b4f7 100644 --- a/src/jit/target.h +++ b/src/jit/target.h @@ -1209,6 +1209,9 @@ typedef unsigned char regNumberSmall; #define JCC_SIZE_MEDIUM (4) #define JCC_SIZE_LARGE (6) + // The first thing in an ARM32 prolog pushes LR to the stack, so this can be 0. + #define STACK_PROBE_BOUNDARY_THRESHOLD_BYTES 0 + #elif defined(_TARGET_ARM64_) #define CPU_LOAD_STORE_ARCH 1 @@ -1545,6 +1548,8 @@ typedef unsigned char regNumberSmall; #define JMP_SIZE_SMALL (4) + #define STACK_PROBE_BOUNDARY_THRESHOLD_BYTES 504 + #else #error Unsupported or unset target architecture #endif diff --git a/tests/src/JIT/Methodical/largeframes/skip6/skippage6.cs b/tests/src/JIT/Methodical/largeframes/skip6/skippage6.cs new file mode 100644 index 0000000000..caa203b37d --- /dev/null +++ b/tests/src/JIT/Methodical/largeframes/skip6/skippage6.cs @@ -0,0 +1,12108 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Exercise stack probing after localloc, on architectures with fixed outgoing argument +// space. Some implementations did not probe after re-establishing the outgoing argument +// space after a localloc. +// +// We need to create a large enough outgoing argument space to skip a guard page. To actually +// see a problem on Windows, we need to skip 3 guard pages. Since structs are passed by +// reference on arm64/x64, we have to have a huge number of small arguments: over 1536 +// "long" arguments. + +namespace BigFrames +{ + + [StructLayout(LayoutKind.Explicit)] + public struct LargeStruct + { + [FieldOffset(0)] + public int i1; + [FieldOffset(65512)] + public int i2; + } + + public class Test + { + public static int iret = 1; + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + public static void BigArgSpace( + + long i0, + long i1, + long i2, + long i3, + long i4, + long i5, + long i6, + long i7, + long i8, + long i9, + long i10, + long i11, + long i12, + long i13, + long i14, + long i15, + long i16, + long i17, + long i18, + long i19, + long i20, + long i21, + long i22, + long i23, + long i24, + long i25, + long i26, + long i27, + long i28, + long i29, + long i30, + long i31, + long i32, + long i33, + long i34, + long i35, + long i36, + long i37, + long i38, + long i39, + long i40, + long i41, + long i42, + long i43, + long i44, + long i45, + long i46, + long i47, + long i48, + long i49, + long i50, + long i51, + long i52, + long i53, + long i54, + long i55, + long i56, + long i57, + long i58, + long i59, + long i60, + long i61, + long i62, + long i63, + long i64, + long i65, + long i66, + long i67, + long i68, + long i69, + long i70, + long i71, + long i72, + long i73, + long i74, + long i75, + long i76, + long i77, + long i78, + long i79, + long i80, + long i81, + long i82, + long i83, + long i84, + long i85, + long i86, + long i87, + long i88, + long i89, + long i90, + long i91, + long i92, + long i93, + long i94, + long i95, + long i96, + long i97, + long i98, + long i99, + long i100, + long i101, + long i102, + long i103, + long i104, + long i105, + long i106, + long i107, + long i108, + long i109, + long i110, + long i111, + long i112, + long i113, + long i114, + long i115, + long i116, + long i117, + long i118, + long i119, + long i120, + long i121, + long i122, + long i123, + long i124, + long i125, + long i126, + long i127, + long i128, + long i129, + long i130, + long i131, + long i132, + long i133, + long i134, + long i135, + long i136, + long i137, + long i138, + long i139, + long i140, + long i141, + long i142, + long i143, + long i144, + long i145, + long i146, + long i147, + long i148, + long i149, + long i150, + long i151, + long i152, + long i153, + long i154, + long i155, + long i156, + long i157, + long i158, + long i159, + long i160, + long i161, + long i162, + long i163, + long i164, + long i165, + long i166, + long i167, + long i168, + long i169, + long i170, + long i171, + long i172, + long i173, + long i174, + long i175, + long i176, + long i177, + long i178, + long i179, + long i180, + long i181, + long i182, + long i183, + long i184, + long i185, + long i186, + long i187, + long i188, + long i189, + long i190, + long i191, + long i192, + long i193, + long i194, + long i195, + long i196, + long i197, + long i198, + long i199, + long i200, + long i201, + long i202, + long i203, + long i204, + long i205, + long i206, + long i207, + long i208, + long i209, + long i210, + long i211, + long i212, + long i213, + long i214, + long i215, + long i216, + long i217, + long i218, + long i219, + long i220, + long i221, + long i222, + long i223, + long i224, + long i225, + long i226, + long i227, + long i228, + long i229, + long i230, + long i231, + long i232, + long i233, + long i234, + long i235, + long i236, + long i237, + long i238, + long i239, + long i240, + long i241, + long i242, + long i243, + long i244, + long i245, + long i246, + long i247, + long i248, + long i249, + long i250, + long i251, + long i252, + long i253, + long i254, + long i255, + long i256, + long i257, + long i258, + long i259, + long i260, + long i261, + long i262, + long i263, + long i264, + long i265, + long i266, + long i267, + long i268, + long i269, + long i270, + long i271, + long i272, + long i273, + long i274, + long i275, + long i276, + long i277, + long i278, + long i279, + long i280, + long i281, + long i282, + long i283, + long i284, + long i285, + long i286, + long i287, + long i288, + long i289, + long i290, + long i291, + long i292, + long i293, + long i294, + long i295, + long i296, + long i297, + long i298, + long i299, + long i300, + long i301, + long i302, + long i303, + long i304, + long i305, + long i306, + long i307, + long i308, + long i309, + long i310, + long i311, + long i312, + long i313, + long i314, + long i315, + long i316, + long i317, + long i318, + long i319, + long i320, + long i321, + long i322, + long i323, + long i324, + long i325, + long i326, + long i327, + long i328, + long i329, + long i330, + long i331, + long i332, + long i333, + long i334, + long i335, + long i336, + long i337, + long i338, + long i339, + long i340, + long i341, + long i342, + long i343, + long i344, + long i345, + long i346, + long i347, + long i348, + long i349, + long i350, + long i351, + long i352, + long i353, + long i354, + long i355, + long i356, + long i357, + long i358, + long i359, + long i360, + long i361, + long i362, + long i363, + long i364, + long i365, + long i366, + long i367, + long i368, + long i369, + long i370, + long i371, + long i372, + long i373, + long i374, + long i375, + long i376, + long i377, + long i378, + long i379, + long i380, + long i381, + long i382, + long i383, + long i384, + long i385, + long i386, + long i387, + long i388, + long i389, + long i390, + long i391, + long i392, + long i393, + long i394, + long i395, + long i396, + long i397, + long i398, + long i399, + long i400, + long i401, + long i402, + long i403, + long i404, + long i405, + long i406, + long i407, + long i408, + long i409, + long i410, + long i411, + long i412, + long i413, + long i414, + long i415, + long i416, + long i417, + long i418, + long i419, + long i420, + long i421, + long i422, + long i423, + long i424, + long i425, + long i426, + long i427, + long i428, + long i429, + long i430, + long i431, + long i432, + long i433, + long i434, + long i435, + long i436, + long i437, + long i438, + long i439, + long i440, + long i441, + long i442, + long i443, + long i444, + long i445, + long i446, + long i447, + long i448, + long i449, + long i450, + long i451, + long i452, + long i453, + long i454, + long i455, + long i456, + long i457, + long i458, + long i459, + long i460, + long i461, + long i462, + long i463, + long i464, + long i465, + long i466, + long i467, + long i468, + long i469, + long i470, + long i471, + long i472, + long i473, + long i474, + long i475, + long i476, + long i477, + long i478, + long i479, + long i480, + long i481, + long i482, + long i483, + long i484, + long i485, + long i486, + long i487, + long i488, + long i489, + long i490, + long i491, + long i492, + long i493, + long i494, + long i495, + long i496, + long i497, + long i498, + long i499, + long i500, + long i501, + long i502, + long i503, + long i504, + long i505, + long i506, + long i507, + long i508, + long i509, + long i510, + long i511, + long i512, + long i513, + long i514, + long i515, + long i516, + long i517, + long i518, + long i519, + long i520, + long i521, + long i522, + long i523, + long i524, + long i525, + long i526, + long i527, + long i528, + long i529, + long i530, + long i531, + long i532, + long i533, + long i534, + long i535, + long i536, + long i537, + long i538, + long i539, + long i540, + long i541, + long i542, + long i543, + long i544, + long i545, + long i546, + long i547, + long i548, + long i549, + long i550, + long i551, + long i552, + long i553, + long i554, + long i555, + long i556, + long i557, + long i558, + long i559, + long i560, + long i561, + long i562, + long i563, + long i564, + long i565, + long i566, + long i567, + long i568, + long i569, + long i570, + long i571, + long i572, + long i573, + long i574, + long i575, + long i576, + long i577, + long i578, + long i579, + long i580, + long i581, + long i582, + long i583, + long i584, + long i585, + long i586, + long i587, + long i588, + long i589, + long i590, + long i591, + long i592, + long i593, + long i594, + long i595, + long i596, + long i597, + long i598, + long i599, + long i600, + long i601, + long i602, + long i603, + long i604, + long i605, + long i606, + long i607, + long i608, + long i609, + long i610, + long i611, + long i612, + long i613, + long i614, + long i615, + long i616, + long i617, + long i618, + long i619, + long i620, + long i621, + long i622, + long i623, + long i624, + long i625, + long i626, + long i627, + long i628, + long i629, + long i630, + long i631, + long i632, + long i633, + long i634, + long i635, + long i636, + long i637, + long i638, + long i639, + long i640, + long i641, + long i642, + long i643, + long i644, + long i645, + long i646, + long i647, + long i648, + long i649, + long i650, + long i651, + long i652, + long i653, + long i654, + long i655, + long i656, + long i657, + long i658, + long i659, + long i660, + long i661, + long i662, + long i663, + long i664, + long i665, + long i666, + long i667, + long i668, + long i669, + long i670, + long i671, + long i672, + long i673, + long i674, + long i675, + long i676, + long i677, + long i678, + long i679, + long i680, + long i681, + long i682, + long i683, + long i684, + long i685, + long i686, + long i687, + long i688, + long i689, + long i690, + long i691, + long i692, + long i693, + long i694, + long i695, + long i696, + long i697, + long i698, + long i699, + long i700, + long i701, + long i702, + long i703, + long i704, + long i705, + long i706, + long i707, + long i708, + long i709, + long i710, + long i711, + long i712, + long i713, + long i714, + long i715, + long i716, + long i717, + long i718, + long i719, + long i720, + long i721, + long i722, + long i723, + long i724, + long i725, + long i726, + long i727, + long i728, + long i729, + long i730, + long i731, + long i732, + long i733, + long i734, + long i735, + long i736, + long i737, + long i738, + long i739, + long i740, + long i741, + long i742, + long i743, + long i744, + long i745, + long i746, + long i747, + long i748, + long i749, + long i750, + long i751, + long i752, + long i753, + long i754, + long i755, + long i756, + long i757, + long i758, + long i759, + long i760, + long i761, + long i762, + long i763, + long i764, + long i765, + long i766, + long i767, + long i768, + long i769, + long i770, + long i771, + long i772, + long i773, + long i774, + long i775, + long i776, + long i777, + long i778, + long i779, + long i780, + long i781, + long i782, + long i783, + long i784, + long i785, + long i786, + long i787, + long i788, + long i789, + long i790, + long i791, + long i792, + long i793, + long i794, + long i795, + long i796, + long i797, + long i798, + long i799, + long i800, + long i801, + long i802, + long i803, + long i804, + long i805, + long i806, + long i807, + long i808, + long i809, + long i810, + long i811, + long i812, + long i813, + long i814, + long i815, + long i816, + long i817, + long i818, + long i819, + long i820, + long i821, + long i822, + long i823, + long i824, + long i825, + long i826, + long i827, + long i828, + long i829, + long i830, + long i831, + long i832, + long i833, + long i834, + long i835, + long i836, + long i837, + long i838, + long i839, + long i840, + long i841, + long i842, + long i843, + long i844, + long i845, + long i846, + long i847, + long i848, + long i849, + long i850, + long i851, + long i852, + long i853, + long i854, + long i855, + long i856, + long i857, + long i858, + long i859, + long i860, + long i861, + long i862, + long i863, + long i864, + long i865, + long i866, + long i867, + long i868, + long i869, + long i870, + long i871, + long i872, + long i873, + long i874, + long i875, + long i876, + long i877, + long i878, + long i879, + long i880, + long i881, + long i882, + long i883, + long i884, + long i885, + long i886, + long i887, + long i888, + long i889, + long i890, + long i891, + long i892, + long i893, + long i894, + long i895, + long i896, + long i897, + long i898, + long i899, + long i900, + long i901, + long i902, + long i903, + long i904, + long i905, + long i906, + long i907, + long i908, + long i909, + long i910, + long i911, + long i912, + long i913, + long i914, + long i915, + long i916, + long i917, + long i918, + long i919, + long i920, + long i921, + long i922, + long i923, + long i924, + long i925, + long i926, + long i927, + long i928, + long i929, + long i930, + long i931, + long i932, + long i933, + long i934, + long i935, + long i936, + long i937, + long i938, + long i939, + long i940, + long i941, + long i942, + long i943, + long i944, + long i945, + long i946, + long i947, + long i948, + long i949, + long i950, + long i951, + long i952, + long i953, + long i954, + long i955, + long i956, + long i957, + long i958, + long i959, + long i960, + long i961, + long i962, + long i963, + long i964, + long i965, + long i966, + long i967, + long i968, + long i969, + long i970, + long i971, + long i972, + long i973, + long i974, + long i975, + long i976, + long i977, + long i978, + long i979, + long i980, + long i981, + long i982, + long i983, + long i984, + long i985, + long i986, + long i987, + long i988, + long i989, + long i990, + long i991, + long i992, + long i993, + long i994, + long i995, + long i996, + long i997, + long i998, + long i999, + long i1000, + long i1001, + long i1002, + long i1003, + long i1004, + long i1005, + long i1006, + long i1007, + long i1008, + long i1009, + long i1010, + long i1011, + long i1012, + long i1013, + long i1014, + long i1015, + long i1016, + long i1017, + long i1018, + long i1019, + long i1020, + long i1021, + long i1022, + long i1023, + long i1024, + long i1025, + long i1026, + long i1027, + long i1028, + long i1029, + long i1030, + long i1031, + long i1032, + long i1033, + long i1034, + long i1035, + long i1036, + long i1037, + long i1038, + long i1039, + long i1040, + long i1041, + long i1042, + long i1043, + long i1044, + long i1045, + long i1046, + long i1047, + long i1048, + long i1049, + long i1050, + long i1051, + long i1052, + long i1053, + long i1054, + long i1055, + long i1056, + long i1057, + long i1058, + long i1059, + long i1060, + long i1061, + long i1062, + long i1063, + long i1064, + long i1065, + long i1066, + long i1067, + long i1068, + long i1069, + long i1070, + long i1071, + long i1072, + long i1073, + long i1074, + long i1075, + long i1076, + long i1077, + long i1078, + long i1079, + long i1080, + long i1081, + long i1082, + long i1083, + long i1084, + long i1085, + long i1086, + long i1087, + long i1088, + long i1089, + long i1090, + long i1091, + long i1092, + long i1093, + long i1094, + long i1095, + long i1096, + long i1097, + long i1098, + long i1099, + long i1100, + long i1101, + long i1102, + long i1103, + long i1104, + long i1105, + long i1106, + long i1107, + long i1108, + long i1109, + long i1110, + long i1111, + long i1112, + long i1113, + long i1114, + long i1115, + long i1116, + long i1117, + long i1118, + long i1119, + long i1120, + long i1121, + long i1122, + long i1123, + long i1124, + long i1125, + long i1126, + long i1127, + long i1128, + long i1129, + long i1130, + long i1131, + long i1132, + long i1133, + long i1134, + long i1135, + long i1136, + long i1137, + long i1138, + long i1139, + long i1140, + long i1141, + long i1142, + long i1143, + long i1144, + long i1145, + long i1146, + long i1147, + long i1148, + long i1149, + long i1150, + long i1151, + long i1152, + long i1153, + long i1154, + long i1155, + long i1156, + long i1157, + long i1158, + long i1159, + long i1160, + long i1161, + long i1162, + long i1163, + long i1164, + long i1165, + long i1166, + long i1167, + long i1168, + long i1169, + long i1170, + long i1171, + long i1172, + long i1173, + long i1174, + long i1175, + long i1176, + long i1177, + long i1178, + long i1179, + long i1180, + long i1181, + long i1182, + long i1183, + long i1184, + long i1185, + long i1186, + long i1187, + long i1188, + long i1189, + long i1190, + long i1191, + long i1192, + long i1193, + long i1194, + long i1195, + long i1196, + long i1197, + long i1198, + long i1199, + long i1200, + long i1201, + long i1202, + long i1203, + long i1204, + long i1205, + long i1206, + long i1207, + long i1208, + long i1209, + long i1210, + long i1211, + long i1212, + long i1213, + long i1214, + long i1215, + long i1216, + long i1217, + long i1218, + long i1219, + long i1220, + long i1221, + long i1222, + long i1223, + long i1224, + long i1225, + long i1226, + long i1227, + long i1228, + long i1229, + long i1230, + long i1231, + long i1232, + long i1233, + long i1234, + long i1235, + long i1236, + long i1237, + long i1238, + long i1239, + long i1240, + long i1241, + long i1242, + long i1243, + long i1244, + long i1245, + long i1246, + long i1247, + long i1248, + long i1249, + long i1250, + long i1251, + long i1252, + long i1253, + long i1254, + long i1255, + long i1256, + long i1257, + long i1258, + long i1259, + long i1260, + long i1261, + long i1262, + long i1263, + long i1264, + long i1265, + long i1266, + long i1267, + long i1268, + long i1269, + long i1270, + long i1271, + long i1272, + long i1273, + long i1274, + long i1275, + long i1276, + long i1277, + long i1278, + long i1279, + long i1280, + long i1281, + long i1282, + long i1283, + long i1284, + long i1285, + long i1286, + long i1287, + long i1288, + long i1289, + long i1290, + long i1291, + long i1292, + long i1293, + long i1294, + long i1295, + long i1296, + long i1297, + long i1298, + long i1299, + long i1300, + long i1301, + long i1302, + long i1303, + long i1304, + long i1305, + long i1306, + long i1307, + long i1308, + long i1309, + long i1310, + long i1311, + long i1312, + long i1313, + long i1314, + long i1315, + long i1316, + long i1317, + long i1318, + long i1319, + long i1320, + long i1321, + long i1322, + long i1323, + long i1324, + long i1325, + long i1326, + long i1327, + long i1328, + long i1329, + long i1330, + long i1331, + long i1332, + long i1333, + long i1334, + long i1335, + long i1336, + long i1337, + long i1338, + long i1339, + long i1340, + long i1341, + long i1342, + long i1343, + long i1344, + long i1345, + long i1346, + long i1347, + long i1348, + long i1349, + long i1350, + long i1351, + long i1352, + long i1353, + long i1354, + long i1355, + long i1356, + long i1357, + long i1358, + long i1359, + long i1360, + long i1361, + long i1362, + long i1363, + long i1364, + long i1365, + long i1366, + long i1367, + long i1368, + long i1369, + long i1370, + long i1371, + long i1372, + long i1373, + long i1374, + long i1375, + long i1376, + long i1377, + long i1378, + long i1379, + long i1380, + long i1381, + long i1382, + long i1383, + long i1384, + long i1385, + long i1386, + long i1387, + long i1388, + long i1389, + long i1390, + long i1391, + long i1392, + long i1393, + long i1394, + long i1395, + long i1396, + long i1397, + long i1398, + long i1399, + long i1400, + long i1401, + long i1402, + long i1403, + long i1404, + long i1405, + long i1406, + long i1407, + long i1408, + long i1409, + long i1410, + long i1411, + long i1412, + long i1413, + long i1414, + long i1415, + long i1416, + long i1417, + long i1418, + long i1419, + long i1420, + long i1421, + long i1422, + long i1423, + long i1424, + long i1425, + long i1426, + long i1427, + long i1428, + long i1429, + long i1430, + long i1431, + long i1432, + long i1433, + long i1434, + long i1435, + long i1436, + long i1437, + long i1438, + long i1439, + long i1440, + long i1441, + long i1442, + long i1443, + long i1444, + long i1445, + long i1446, + long i1447, + long i1448, + long i1449, + long i1450, + long i1451, + long i1452, + long i1453, + long i1454, + long i1455, + long i1456, + long i1457, + long i1458, + long i1459, + long i1460, + long i1461, + long i1462, + long i1463, + long i1464, + long i1465, + long i1466, + long i1467, + long i1468, + long i1469, + long i1470, + long i1471, + long i1472, + long i1473, + long i1474, + long i1475, + long i1476, + long i1477, + long i1478, + long i1479, + long i1480, + long i1481, + long i1482, + long i1483, + long i1484, + long i1485, + long i1486, + long i1487, + long i1488, + long i1489, + long i1490, + long i1491, + long i1492, + long i1493, + long i1494, + long i1495, + long i1496, + long i1497, + long i1498, + long i1499, + long i1500, + long i1501, + long i1502, + long i1503, + long i1504, + long i1505, + long i1506, + long i1507, + long i1508, + long i1509, + long i1510, + long i1511, + long i1512, + long i1513, + long i1514, + long i1515, + long i1516, + long i1517, + long i1518, + long i1519, + long i1520, + long i1521, + long i1522, + long i1523, + long i1524, + long i1525, + long i1526, + long i1527, + long i1528, + long i1529, + long i1530, + long i1531, + long i1532, + long i1533, + long i1534, + long i1535, + long i1536, + long i1537, + long i1538, + long i1539, + long i1540, + long i1541, + long i1542, + long i1543, + long i1544, + long i1545, + long i1546, + long i1547, + long i1548, + long i1549, + long i1550, + long i1551, + long i1552, + long i1553, + long i1554, + long i1555, + long i1556, + long i1557, + long i1558, + long i1559, + long i1560, + long i1561, + long i1562, + long i1563, + long i1564, + long i1565, + long i1566, + long i1567, + long i1568, + long i1569, + long i1570, + long i1571, + long i1572, + long i1573, + long i1574, + long i1575, + long i1576, + long i1577, + long i1578, + long i1579, + long i1580, + long i1581, + long i1582, + long i1583, + long i1584, + long i1585, + long i1586, + long i1587, + long i1588, + long i1589, + long i1590, + long i1591, + long i1592, + long i1593, + long i1594, + long i1595, + long i1596, + long i1597, + long i1598, + long i1599, + long i1600, + long i1601, + long i1602, + long i1603, + long i1604, + long i1605, + long i1606, + long i1607, + long i1608, + long i1609, + long i1610, + long i1611, + long i1612, + long i1613, + long i1614, + long i1615, + long i1616, + long i1617, + long i1618, + long i1619, + long i1620, + long i1621, + long i1622, + long i1623, + long i1624, + long i1625, + long i1626, + long i1627, + long i1628, + long i1629, + long i1630, + long i1631, + long i1632, + long i1633, + long i1634, + long i1635, + long i1636, + long i1637, + long i1638, + long i1639, + long i1640, + long i1641, + long i1642, + long i1643, + long i1644, + long i1645, + long i1646, + long i1647, + long i1648, + long i1649, + long i1650, + long i1651, + long i1652, + long i1653, + long i1654, + long i1655, + long i1656, + long i1657, + long i1658, + long i1659, + long i1660, + long i1661, + long i1662, + long i1663, + long i1664, + long i1665, + long i1666, + long i1667, + long i1668, + long i1669, + long i1670, + long i1671, + long i1672, + long i1673, + long i1674, + long i1675, + long i1676, + long i1677, + long i1678, + long i1679, + long i1680, + long i1681, + long i1682, + long i1683, + long i1684, + long i1685, + long i1686, + long i1687, + long i1688, + long i1689, + long i1690, + long i1691, + long i1692, + long i1693, + long i1694, + long i1695, + long i1696, + long i1697, + long i1698, + long i1699, + long i1700, + long i1701, + long i1702, + long i1703, + long i1704, + long i1705, + long i1706, + long i1707, + long i1708, + long i1709, + long i1710, + long i1711, + long i1712, + long i1713, + long i1714, + long i1715, + long i1716, + long i1717, + long i1718, + long i1719, + long i1720, + long i1721, + long i1722, + long i1723, + long i1724, + long i1725, + long i1726, + long i1727, + long i1728, + long i1729, + long i1730, + long i1731, + long i1732, + long i1733, + long i1734, + long i1735, + long i1736, + long i1737, + long i1738, + long i1739, + long i1740, + long i1741, + long i1742, + long i1743, + long i1744, + long i1745, + long i1746, + long i1747, + long i1748, + long i1749, + long i1750, + long i1751, + long i1752, + long i1753, + long i1754, + long i1755, + long i1756, + long i1757, + long i1758, + long i1759, + long i1760, + long i1761, + long i1762, + long i1763, + long i1764, + long i1765, + long i1766, + long i1767, + long i1768, + long i1769, + long i1770, + long i1771, + long i1772, + long i1773, + long i1774, + long i1775, + long i1776, + long i1777, + long i1778, + long i1779, + long i1780, + long i1781, + long i1782, + long i1783, + long i1784, + long i1785, + long i1786, + long i1787, + long i1788, + long i1789, + long i1790, + long i1791, + long i1792, + long i1793, + long i1794, + long i1795, + long i1796, + long i1797, + long i1798, + long i1799, + long i1800, + long i1801, + long i1802, + long i1803, + long i1804, + long i1805, + long i1806, + long i1807, + long i1808, + long i1809, + long i1810, + long i1811, + long i1812, + long i1813, + long i1814, + long i1815, + long i1816, + long i1817, + long i1818, + long i1819, + long i1820, + long i1821, + long i1822, + long i1823, + long i1824, + long i1825, + long i1826, + long i1827, + long i1828, + long i1829, + long i1830, + long i1831, + long i1832, + long i1833, + long i1834, + long i1835, + long i1836, + long i1837, + long i1838, + long i1839, + long i1840, + long i1841, + long i1842, + long i1843, + long i1844, + long i1845, + long i1846, + long i1847, + long i1848, + long i1849, + long i1850, + long i1851, + long i1852, + long i1853, + long i1854, + long i1855, + long i1856, + long i1857, + long i1858, + long i1859, + long i1860, + long i1861, + long i1862, + long i1863, + long i1864, + long i1865, + long i1866, + long i1867, + long i1868, + long i1869, + long i1870, + long i1871, + long i1872, + long i1873, + long i1874, + long i1875, + long i1876, + long i1877, + long i1878, + long i1879, + long i1880, + long i1881, + long i1882, + long i1883, + long i1884, + long i1885, + long i1886, + long i1887, + long i1888, + long i1889, + long i1890, + long i1891, + long i1892, + long i1893, + long i1894, + long i1895, + long i1896, + long i1897, + long i1898, + long i1899, + long i1900, + long i1901, + long i1902, + long i1903, + long i1904, + long i1905, + long i1906, + long i1907, + long i1908, + long i1909, + long i1910, + long i1911, + long i1912, + long i1913, + long i1914, + long i1915, + long i1916, + long i1917, + long i1918, + long i1919, + long i1920, + long i1921, + long i1922, + long i1923, + long i1924, + long i1925, + long i1926, + long i1927, + long i1928, + long i1929, + long i1930, + long i1931, + long i1932, + long i1933, + long i1934, + long i1935, + long i1936, + long i1937, + long i1938, + long i1939, + long i1940, + long i1941, + long i1942, + long i1943, + long i1944, + long i1945, + long i1946, + long i1947, + long i1948, + long i1949, + long i1950, + long i1951, + long i1952, + long i1953, + long i1954, + long i1955, + long i1956, + long i1957, + long i1958, + long i1959, + long i1960, + long i1961, + long i1962, + long i1963, + long i1964, + long i1965, + long i1966, + long i1967, + long i1968, + long i1969, + long i1970, + long i1971, + long i1972, + long i1973, + long i1974, + long i1975, + long i1976, + long i1977, + long i1978, + long i1979, + long i1980, + long i1981, + long i1982, + long i1983, + long i1984, + long i1985, + long i1986, + long i1987, + long i1988, + long i1989, + long i1990, + long i1991, + long i1992, + long i1993, + long i1994, + long i1995, + long i1996, + long i1997, + long i1998, + long i1999, + long i2000, + long i2001, + long i2002, + long i2003, + long i2004, + long i2005, + long i2006, + long i2007, + long i2008, + long i2009, + long i2010, + long i2011, + long i2012, + long i2013, + long i2014, + long i2015, + long i2016, + long i2017, + long i2018, + long i2019, + long i2020, + long i2021, + long i2022, + long i2023, + long i2024, + long i2025, + long i2026, + long i2027, + long i2028, + long i2029, + long i2030, + long i2031, + long i2032, + long i2033, + long i2034, + long i2035, + long i2036, + long i2037, + long i2038, + long i2039, + long i2040, + long i2041, + long i2042, + long i2043, + long i2044, + long i2045, + long i2046, + long i2047, + long i2048, + long i2049, + long i2050, + long i2051, + long i2052, + long i2053, + long i2054, + long i2055, + long i2056, + long i2057, + long i2058, + long i2059, + long i2060, + long i2061, + long i2062, + long i2063, + long i2064, + long i2065, + long i2066, + long i2067, + long i2068, + long i2069, + long i2070, + long i2071, + long i2072, + long i2073, + long i2074, + long i2075, + long i2076, + long i2077, + long i2078, + long i2079, + long i2080, + long i2081, + long i2082, + long i2083, + long i2084, + long i2085, + long i2086, + long i2087, + long i2088, + long i2089, + long i2090, + long i2091, + long i2092, + long i2093, + long i2094, + long i2095, + long i2096, + long i2097, + long i2098, + long i2099, + long i2100, + long i2101, + long i2102, + long i2103, + long i2104, + long i2105, + long i2106, + long i2107, + long i2108, + long i2109, + long i2110, + long i2111, + long i2112, + long i2113, + long i2114, + long i2115, + long i2116, + long i2117, + long i2118, + long i2119, + long i2120, + long i2121, + long i2122, + long i2123, + long i2124, + long i2125, + long i2126, + long i2127, + long i2128, + long i2129, + long i2130, + long i2131, + long i2132, + long i2133, + long i2134, + long i2135, + long i2136, + long i2137, + long i2138, + long i2139, + long i2140, + long i2141, + long i2142, + long i2143, + long i2144, + long i2145, + long i2146, + long i2147, + long i2148, + long i2149, + long i2150, + long i2151, + long i2152, + long i2153, + long i2154, + long i2155, + long i2156, + long i2157, + long i2158, + long i2159, + long i2160, + long i2161, + long i2162, + long i2163, + long i2164, + long i2165, + long i2166, + long i2167, + long i2168, + long i2169, + long i2170, + long i2171, + long i2172, + long i2173, + long i2174, + long i2175, + long i2176, + long i2177, + long i2178, + long i2179, + long i2180, + long i2181, + long i2182, + long i2183, + long i2184, + long i2185, + long i2186, + long i2187, + long i2188, + long i2189, + long i2190, + long i2191, + long i2192, + long i2193, + long i2194, + long i2195, + long i2196, + long i2197, + long i2198, + long i2199, + long i2200, + long i2201, + long i2202, + long i2203, + long i2204, + long i2205, + long i2206, + long i2207, + long i2208, + long i2209, + long i2210, + long i2211, + long i2212, + long i2213, + long i2214, + long i2215, + long i2216, + long i2217, + long i2218, + long i2219, + long i2220, + long i2221, + long i2222, + long i2223, + long i2224, + long i2225, + long i2226, + long i2227, + long i2228, + long i2229, + long i2230, + long i2231, + long i2232, + long i2233, + long i2234, + long i2235, + long i2236, + long i2237, + long i2238, + long i2239, + long i2240, + long i2241, + long i2242, + long i2243, + long i2244, + long i2245, + long i2246, + long i2247, + long i2248, + long i2249, + long i2250, + long i2251, + long i2252, + long i2253, + long i2254, + long i2255, + long i2256, + long i2257, + long i2258, + long i2259, + long i2260, + long i2261, + long i2262, + long i2263, + long i2264, + long i2265, + long i2266, + long i2267, + long i2268, + long i2269, + long i2270, + long i2271, + long i2272, + long i2273, + long i2274, + long i2275, + long i2276, + long i2277, + long i2278, + long i2279, + long i2280, + long i2281, + long i2282, + long i2283, + long i2284, + long i2285, + long i2286, + long i2287, + long i2288, + long i2289, + long i2290, + long i2291, + long i2292, + long i2293, + long i2294, + long i2295, + long i2296, + long i2297, + long i2298, + long i2299, + long i2300, + long i2301, + long i2302, + long i2303, + long i2304, + long i2305, + long i2306, + long i2307, + long i2308, + long i2309, + long i2310, + long i2311, + long i2312, + long i2313, + long i2314, + long i2315, + long i2316, + long i2317, + long i2318, + long i2319, + long i2320, + long i2321, + long i2322, + long i2323, + long i2324, + long i2325, + long i2326, + long i2327, + long i2328, + long i2329, + long i2330, + long i2331, + long i2332, + long i2333, + long i2334, + long i2335, + long i2336, + long i2337, + long i2338, + long i2339, + long i2340, + long i2341, + long i2342, + long i2343, + long i2344, + long i2345, + long i2346, + long i2347, + long i2348, + long i2349, + long i2350, + long i2351, + long i2352, + long i2353, + long i2354, + long i2355, + long i2356, + long i2357, + long i2358, + long i2359, + long i2360, + long i2361, + long i2362, + long i2363, + long i2364, + long i2365, + long i2366, + long i2367, + long i2368, + long i2369, + long i2370, + long i2371, + long i2372, + long i2373, + long i2374, + long i2375, + long i2376, + long i2377, + long i2378, + long i2379, + long i2380, + long i2381, + long i2382, + long i2383, + long i2384, + long i2385, + long i2386, + long i2387, + long i2388, + long i2389, + long i2390, + long i2391, + long i2392, + long i2393, + long i2394, + long i2395, + long i2396, + long i2397, + long i2398, + long i2399, + long i2400, + long i2401, + long i2402, + long i2403, + long i2404, + long i2405, + long i2406, + long i2407, + long i2408, + long i2409, + long i2410, + long i2411, + long i2412, + long i2413, + long i2414, + long i2415, + long i2416, + long i2417, + long i2418, + long i2419, + long i2420, + long i2421, + long i2422, + long i2423, + long i2424, + long i2425, + long i2426, + long i2427, + long i2428, + long i2429, + long i2430, + long i2431, + long i2432, + long i2433, + long i2434, + long i2435, + long i2436, + long i2437, + long i2438, + long i2439, + long i2440, + long i2441, + long i2442, + long i2443, + long i2444, + long i2445, + long i2446, + long i2447, + long i2448, + long i2449, + long i2450, + long i2451, + long i2452, + long i2453, + long i2454, + long i2455, + long i2456, + long i2457, + long i2458, + long i2459, + long i2460, + long i2461, + long i2462, + long i2463, + long i2464, + long i2465, + long i2466, + long i2467, + long i2468, + long i2469, + long i2470, + long i2471, + long i2472, + long i2473, + long i2474, + long i2475, + long i2476, + long i2477, + long i2478, + long i2479, + long i2480, + long i2481, + long i2482, + long i2483, + long i2484, + long i2485, + long i2486, + long i2487, + long i2488, + long i2489, + long i2490, + long i2491, + long i2492, + long i2493, + long i2494, + long i2495, + long i2496, + long i2497, + long i2498, + long i2499, + long i2500, + long i2501, + long i2502, + long i2503, + long i2504, + long i2505, + long i2506, + long i2507, + long i2508, + long i2509, + long i2510, + long i2511, + long i2512, + long i2513, + long i2514, + long i2515, + long i2516, + long i2517, + long i2518, + long i2519, + long i2520, + long i2521, + long i2522, + long i2523, + long i2524, + long i2525, + long i2526, + long i2527, + long i2528, + long i2529, + long i2530, + long i2531, + long i2532, + long i2533, + long i2534, + long i2535, + long i2536, + long i2537, + long i2538, + long i2539, + long i2540, + long i2541, + long i2542, + long i2543, + long i2544, + long i2545, + long i2546, + long i2547, + long i2548, + long i2549, + long i2550, + long i2551, + long i2552, + long i2553, + long i2554, + long i2555, + long i2556, + long i2557, + long i2558, + long i2559, + long i2560, + long i2561, + long i2562, + long i2563, + long i2564, + long i2565, + long i2566, + long i2567, + long i2568, + long i2569, + long i2570, + long i2571, + long i2572, + long i2573, + long i2574, + long i2575, + long i2576, + long i2577, + long i2578, + long i2579, + long i2580, + long i2581, + long i2582, + long i2583, + long i2584, + long i2585, + long i2586, + long i2587, + long i2588, + long i2589, + long i2590, + long i2591, + long i2592, + long i2593, + long i2594, + long i2595, + long i2596, + long i2597, + long i2598, + long i2599, + long i2600, + long i2601, + long i2602, + long i2603, + long i2604, + long i2605, + long i2606, + long i2607, + long i2608, + long i2609, + long i2610, + long i2611, + long i2612, + long i2613, + long i2614, + long i2615, + long i2616, + long i2617, + long i2618, + long i2619, + long i2620, + long i2621, + long i2622, + long i2623, + long i2624, + long i2625, + long i2626, + long i2627, + long i2628, + long i2629, + long i2630, + long i2631, + long i2632, + long i2633, + long i2634, + long i2635, + long i2636, + long i2637, + long i2638, + long i2639, + long i2640, + long i2641, + long i2642, + long i2643, + long i2644, + long i2645, + long i2646, + long i2647, + long i2648, + long i2649, + long i2650, + long i2651, + long i2652, + long i2653, + long i2654, + long i2655, + long i2656, + long i2657, + long i2658, + long i2659, + long i2660, + long i2661, + long i2662, + long i2663, + long i2664, + long i2665, + long i2666, + long i2667, + long i2668, + long i2669, + long i2670, + long i2671, + long i2672, + long i2673, + long i2674, + long i2675, + long i2676, + long i2677, + long i2678, + long i2679, + long i2680, + long i2681, + long i2682, + long i2683, + long i2684, + long i2685, + long i2686, + long i2687, + long i2688, + long i2689, + long i2690, + long i2691, + long i2692, + long i2693, + long i2694, + long i2695, + long i2696, + long i2697, + long i2698, + long i2699, + long i2700, + long i2701, + long i2702, + long i2703, + long i2704, + long i2705, + long i2706, + long i2707, + long i2708, + long i2709, + long i2710, + long i2711, + long i2712, + long i2713, + long i2714, + long i2715, + long i2716, + long i2717, + long i2718, + long i2719, + long i2720, + long i2721, + long i2722, + long i2723, + long i2724, + long i2725, + long i2726, + long i2727, + long i2728, + long i2729, + long i2730, + long i2731, + long i2732, + long i2733, + long i2734, + long i2735, + long i2736, + long i2737, + long i2738, + long i2739, + long i2740, + long i2741, + long i2742, + long i2743, + long i2744, + long i2745, + long i2746, + long i2747, + long i2748, + long i2749, + long i2750, + long i2751, + long i2752, + long i2753, + long i2754, + long i2755, + long i2756, + long i2757, + long i2758, + long i2759, + long i2760, + long i2761, + long i2762, + long i2763, + long i2764, + long i2765, + long i2766, + long i2767, + long i2768, + long i2769, + long i2770, + long i2771, + long i2772, + long i2773, + long i2774, + long i2775, + long i2776, + long i2777, + long i2778, + long i2779, + long i2780, + long i2781, + long i2782, + long i2783, + long i2784, + long i2785, + long i2786, + long i2787, + long i2788, + long i2789, + long i2790, + long i2791, + long i2792, + long i2793, + long i2794, + long i2795, + long i2796, + long i2797, + long i2798, + long i2799, + long i2800, + long i2801, + long i2802, + long i2803, + long i2804, + long i2805, + long i2806, + long i2807, + long i2808, + long i2809, + long i2810, + long i2811, + long i2812, + long i2813, + long i2814, + long i2815, + long i2816, + long i2817, + long i2818, + long i2819, + long i2820, + long i2821, + long i2822, + long i2823, + long i2824, + long i2825, + long i2826, + long i2827, + long i2828, + long i2829, + long i2830, + long i2831, + long i2832, + long i2833, + long i2834, + long i2835, + long i2836, + long i2837, + long i2838, + long i2839, + long i2840, + long i2841, + long i2842, + long i2843, + long i2844, + long i2845, + long i2846, + long i2847, + long i2848, + long i2849, + long i2850, + long i2851, + long i2852, + long i2853, + long i2854, + long i2855, + long i2856, + long i2857, + long i2858, + long i2859, + long i2860, + long i2861, + long i2862, + long i2863, + long i2864, + long i2865, + long i2866, + long i2867, + long i2868, + long i2869, + long i2870, + long i2871, + long i2872, + long i2873, + long i2874, + long i2875, + long i2876, + long i2877, + long i2878, + long i2879, + long i2880, + long i2881, + long i2882, + long i2883, + long i2884, + long i2885, + long i2886, + long i2887, + long i2888, + long i2889, + long i2890, + long i2891, + long i2892, + long i2893, + long i2894, + long i2895, + long i2896, + long i2897, + long i2898, + long i2899, + long i2900, + long i2901, + long i2902, + long i2903, + long i2904, + long i2905, + long i2906, + long i2907, + long i2908, + long i2909, + long i2910, + long i2911, + long i2912, + long i2913, + long i2914, + long i2915, + long i2916, + long i2917, + long i2918, + long i2919, + long i2920, + long i2921, + long i2922, + long i2923, + long i2924, + long i2925, + long i2926, + long i2927, + long i2928, + long i2929, + long i2930, + long i2931, + long i2932, + long i2933, + long i2934, + long i2935, + long i2936, + long i2937, + long i2938, + long i2939, + long i2940, + long i2941, + long i2942, + long i2943, + long i2944, + long i2945, + long i2946, + long i2947, + long i2948, + long i2949, + long i2950, + long i2951, + long i2952, + long i2953, + long i2954, + long i2955, + long i2956, + long i2957, + long i2958, + long i2959, + long i2960, + long i2961, + long i2962, + long i2963, + long i2964, + long i2965, + long i2966, + long i2967, + long i2968, + long i2969, + long i2970, + long i2971, + long i2972, + long i2973, + long i2974, + long i2975, + long i2976, + long i2977, + long i2978, + long i2979, + long i2980, + long i2981, + long i2982, + long i2983, + long i2984, + long i2985, + long i2986, + long i2987, + long i2988, + long i2989, + long i2990, + long i2991, + long i2992, + long i2993, + long i2994, + long i2995, + long i2996, + long i2997, + long i2998, + long i2999, + long i3000, + long i3001, + long i3002, + long i3003, + long i3004, + long i3005, + long i3006, + long i3007, + long i3008, + long i3009, + long i3010, + long i3011, + long i3012, + long i3013, + long i3014, + long i3015, + long i3016, + long i3017, + long i3018, + long i3019, + long i3020, + long i3021, + long i3022, + long i3023, + long i3024, + long i3025, + long i3026, + long i3027, + long i3028, + long i3029, + long i3030, + long i3031, + long i3032, + long i3033, + long i3034, + long i3035, + long i3036, + long i3037, + long i3038, + long i3039, + long i3040, + long i3041, + long i3042, + long i3043, + long i3044, + long i3045, + long i3046, + long i3047, + long i3048, + long i3049, + long i3050, + long i3051, + long i3052, + long i3053, + long i3054, + long i3055, + long i3056, + long i3057, + long i3058, + long i3059, + long i3060, + long i3061, + long i3062, + long i3063, + long i3064, + long i3065, + long i3066, + long i3067, + long i3068, + long i3069, + long i3070, + long i3071, + long i3072, + long i3073, + long i3074, + long i3075, + long i3076, + long i3077, + long i3078, + long i3079, + long i3080, + long i3081, + long i3082, + long i3083, + long i3084, + long i3085, + long i3086, + long i3087, + long i3088, + long i3089, + long i3090, + long i3091, + long i3092, + long i3093, + long i3094, + long i3095, + long i3096, + long i3097, + long i3098, + long i3099, + long i3100, + long i3101, + long i3102, + long i3103, + long i3104, + long i3105, + long i3106, + long i3107, + long i3108, + long i3109, + long i3110, + long i3111, + long i3112, + long i3113, + long i3114, + long i3115, + long i3116, + long i3117, + long i3118, + long i3119, + long i3120, + long i3121, + long i3122, + long i3123, + long i3124, + long i3125, + long i3126, + long i3127, + long i3128, + long i3129, + long i3130, + long i3131, + long i3132, + long i3133, + long i3134, + long i3135, + long i3136, + long i3137, + long i3138, + long i3139, + long i3140, + long i3141, + long i3142, + long i3143, + long i3144, + long i3145, + long i3146, + long i3147, + long i3148, + long i3149, + long i3150, + long i3151, + long i3152, + long i3153, + long i3154, + long i3155, + long i3156, + long i3157, + long i3158, + long i3159, + long i3160, + long i3161, + long i3162, + long i3163, + long i3164, + long i3165, + long i3166, + long i3167, + long i3168, + long i3169, + long i3170, + long i3171, + long i3172, + long i3173, + long i3174, + long i3175, + long i3176, + long i3177, + long i3178, + long i3179, + long i3180, + long i3181, + long i3182, + long i3183, + long i3184, + long i3185, + long i3186, + long i3187, + long i3188, + long i3189, + long i3190, + long i3191, + long i3192, + long i3193, + long i3194, + long i3195, + long i3196, + long i3197, + long i3198, + long i3199, + long i3200, + long i3201, + long i3202, + long i3203, + long i3204, + long i3205, + long i3206, + long i3207, + long i3208, + long i3209, + long i3210, + long i3211, + long i3212, + long i3213, + long i3214, + long i3215, + long i3216, + long i3217, + long i3218, + long i3219, + long i3220, + long i3221, + long i3222, + long i3223, + long i3224, + long i3225, + long i3226, + long i3227, + long i3228, + long i3229, + long i3230, + long i3231, + long i3232, + long i3233, + long i3234, + long i3235, + long i3236, + long i3237, + long i3238, + long i3239, + long i3240, + long i3241, + long i3242, + long i3243, + long i3244, + long i3245, + long i3246, + long i3247, + long i3248, + long i3249, + long i3250, + long i3251, + long i3252, + long i3253, + long i3254, + long i3255, + long i3256, + long i3257, + long i3258, + long i3259, + long i3260, + long i3261, + long i3262, + long i3263, + long i3264, + long i3265, + long i3266, + long i3267, + long i3268, + long i3269, + long i3270, + long i3271, + long i3272, + long i3273, + long i3274, + long i3275, + long i3276, + long i3277, + long i3278, + long i3279, + long i3280, + long i3281, + long i3282, + long i3283, + long i3284, + long i3285, + long i3286, + long i3287, + long i3288, + long i3289, + long i3290, + long i3291, + long i3292, + long i3293, + long i3294, + long i3295, + long i3296, + long i3297, + long i3298, + long i3299, + long i3300, + long i3301, + long i3302, + long i3303, + long i3304, + long i3305, + long i3306, + long i3307, + long i3308, + long i3309, + long i3310, + long i3311, + long i3312, + long i3313, + long i3314, + long i3315, + long i3316, + long i3317, + long i3318, + long i3319, + long i3320, + long i3321, + long i3322, + long i3323, + long i3324, + long i3325, + long i3326, + long i3327, + long i3328, + long i3329, + long i3330, + long i3331, + long i3332, + long i3333, + long i3334, + long i3335, + long i3336, + long i3337, + long i3338, + long i3339, + long i3340, + long i3341, + long i3342, + long i3343, + long i3344, + long i3345, + long i3346, + long i3347, + long i3348, + long i3349, + long i3350, + long i3351, + long i3352, + long i3353, + long i3354, + long i3355, + long i3356, + long i3357, + long i3358, + long i3359, + long i3360, + long i3361, + long i3362, + long i3363, + long i3364, + long i3365, + long i3366, + long i3367, + long i3368, + long i3369, + long i3370, + long i3371, + long i3372, + long i3373, + long i3374, + long i3375, + long i3376, + long i3377, + long i3378, + long i3379, + long i3380, + long i3381, + long i3382, + long i3383, + long i3384, + long i3385, + long i3386, + long i3387, + long i3388, + long i3389, + long i3390, + long i3391, + long i3392, + long i3393, + long i3394, + long i3395, + long i3396, + long i3397, + long i3398, + long i3399, + long i3400, + long i3401, + long i3402, + long i3403, + long i3404, + long i3405, + long i3406, + long i3407, + long i3408, + long i3409, + long i3410, + long i3411, + long i3412, + long i3413, + long i3414, + long i3415, + long i3416, + long i3417, + long i3418, + long i3419, + long i3420, + long i3421, + long i3422, + long i3423, + long i3424, + long i3425, + long i3426, + long i3427, + long i3428, + long i3429, + long i3430, + long i3431, + long i3432, + long i3433, + long i3434, + long i3435, + long i3436, + long i3437, + long i3438, + long i3439, + long i3440, + long i3441, + long i3442, + long i3443, + long i3444, + long i3445, + long i3446, + long i3447, + long i3448, + long i3449, + long i3450, + long i3451, + long i3452, + long i3453, + long i3454, + long i3455, + long i3456, + long i3457, + long i3458, + long i3459, + long i3460, + long i3461, + long i3462, + long i3463, + long i3464, + long i3465, + long i3466, + long i3467, + long i3468, + long i3469, + long i3470, + long i3471, + long i3472, + long i3473, + long i3474, + long i3475, + long i3476, + long i3477, + long i3478, + long i3479, + long i3480, + long i3481, + long i3482, + long i3483, + long i3484, + long i3485, + long i3486, + long i3487, + long i3488, + long i3489, + long i3490, + long i3491, + long i3492, + long i3493, + long i3494, + long i3495, + long i3496, + long i3497, + long i3498, + long i3499, + long i3500, + long i3501, + long i3502, + long i3503, + long i3504, + long i3505, + long i3506, + long i3507, + long i3508, + long i3509, + long i3510, + long i3511, + long i3512, + long i3513, + long i3514, + long i3515, + long i3516, + long i3517, + long i3518, + long i3519, + long i3520, + long i3521, + long i3522, + long i3523, + long i3524, + long i3525, + long i3526, + long i3527, + long i3528, + long i3529, + long i3530, + long i3531, + long i3532, + long i3533, + long i3534, + long i3535, + long i3536, + long i3537, + long i3538, + long i3539, + long i3540, + long i3541, + long i3542, + long i3543, + long i3544, + long i3545, + long i3546, + long i3547, + long i3548, + long i3549, + long i3550, + long i3551, + long i3552, + long i3553, + long i3554, + long i3555, + long i3556, + long i3557, + long i3558, + long i3559, + long i3560, + long i3561, + long i3562, + long i3563, + long i3564, + long i3565, + long i3566, + long i3567, + long i3568, + long i3569, + long i3570, + long i3571, + long i3572, + long i3573, + long i3574, + long i3575, + long i3576, + long i3577, + long i3578, + long i3579, + long i3580, + long i3581, + long i3582, + long i3583, + long i3584, + long i3585, + long i3586, + long i3587, + long i3588, + long i3589, + long i3590, + long i3591, + long i3592, + long i3593, + long i3594, + long i3595, + long i3596, + long i3597, + long i3598, + long i3599, + long i3600, + long i3601, + long i3602, + long i3603, + long i3604, + long i3605, + long i3606, + long i3607, + long i3608, + long i3609, + long i3610, + long i3611, + long i3612, + long i3613, + long i3614, + long i3615, + long i3616, + long i3617, + long i3618, + long i3619, + long i3620, + long i3621, + long i3622, + long i3623, + long i3624, + long i3625, + long i3626, + long i3627, + long i3628, + long i3629, + long i3630, + long i3631, + long i3632, + long i3633, + long i3634, + long i3635, + long i3636, + long i3637, + long i3638, + long i3639, + long i3640, + long i3641, + long i3642, + long i3643, + long i3644, + long i3645, + long i3646, + long i3647, + long i3648, + long i3649, + long i3650, + long i3651, + long i3652, + long i3653, + long i3654, + long i3655, + long i3656, + long i3657, + long i3658, + long i3659, + long i3660, + long i3661, + long i3662, + long i3663, + long i3664, + long i3665, + long i3666, + long i3667, + long i3668, + long i3669, + long i3670, + long i3671, + long i3672, + long i3673, + long i3674, + long i3675, + long i3676, + long i3677, + long i3678, + long i3679, + long i3680, + long i3681, + long i3682, + long i3683, + long i3684, + long i3685, + long i3686, + long i3687, + long i3688, + long i3689, + long i3690, + long i3691, + long i3692, + long i3693, + long i3694, + long i3695, + long i3696, + long i3697, + long i3698, + long i3699, + long i3700, + long i3701, + long i3702, + long i3703, + long i3704, + long i3705, + long i3706, + long i3707, + long i3708, + long i3709, + long i3710, + long i3711, + long i3712, + long i3713, + long i3714, + long i3715, + long i3716, + long i3717, + long i3718, + long i3719, + long i3720, + long i3721, + long i3722, + long i3723, + long i3724, + long i3725, + long i3726, + long i3727, + long i3728, + long i3729, + long i3730, + long i3731, + long i3732, + long i3733, + long i3734, + long i3735, + long i3736, + long i3737, + long i3738, + long i3739, + long i3740, + long i3741, + long i3742, + long i3743, + long i3744, + long i3745, + long i3746, + long i3747, + long i3748, + long i3749, + long i3750, + long i3751, + long i3752, + long i3753, + long i3754, + long i3755, + long i3756, + long i3757, + long i3758, + long i3759, + long i3760, + long i3761, + long i3762, + long i3763, + long i3764, + long i3765, + long i3766, + long i3767, + long i3768, + long i3769, + long i3770, + long i3771, + long i3772, + long i3773, + long i3774, + long i3775, + long i3776, + long i3777, + long i3778, + long i3779, + long i3780, + long i3781, + long i3782, + long i3783, + long i3784, + long i3785, + long i3786, + long i3787, + long i3788, + long i3789, + long i3790, + long i3791, + long i3792, + long i3793, + long i3794, + long i3795, + long i3796, + long i3797, + long i3798, + long i3799, + long i3800, + long i3801, + long i3802, + long i3803, + long i3804, + long i3805, + long i3806, + long i3807, + long i3808, + long i3809, + long i3810, + long i3811, + long i3812, + long i3813, + long i3814, + long i3815, + long i3816, + long i3817, + long i3818, + long i3819, + long i3820, + long i3821, + long i3822, + long i3823, + long i3824, + long i3825, + long i3826, + long i3827, + long i3828, + long i3829, + long i3830, + long i3831, + long i3832, + long i3833, + long i3834, + long i3835, + long i3836, + long i3837, + long i3838, + long i3839, + long i3840, + long i3841, + long i3842, + long i3843, + long i3844, + long i3845, + long i3846, + long i3847, + long i3848, + long i3849, + long i3850, + long i3851, + long i3852, + long i3853, + long i3854, + long i3855, + long i3856, + long i3857, + long i3858, + long i3859, + long i3860, + long i3861, + long i3862, + long i3863, + long i3864, + long i3865, + long i3866, + long i3867, + long i3868, + long i3869, + long i3870, + long i3871, + long i3872, + long i3873, + long i3874, + long i3875, + long i3876, + long i3877, + long i3878, + long i3879, + long i3880, + long i3881, + long i3882, + long i3883, + long i3884, + long i3885, + long i3886, + long i3887, + long i3888, + long i3889, + long i3890, + long i3891, + long i3892, + long i3893, + long i3894, + long i3895, + long i3896, + long i3897, + long i3898, + long i3899, + long i3900, + long i3901, + long i3902, + long i3903, + long i3904, + long i3905, + long i3906, + long i3907, + long i3908, + long i3909, + long i3910, + long i3911, + long i3912, + long i3913, + long i3914, + long i3915, + long i3916, + long i3917, + long i3918, + long i3919, + long i3920, + long i3921, + long i3922, + long i3923, + long i3924, + long i3925, + long i3926, + long i3927, + long i3928, + long i3929, + long i3930, + long i3931, + long i3932, + long i3933, + long i3934, + long i3935, + long i3936, + long i3937, + long i3938, + long i3939, + long i3940, + long i3941, + long i3942, + long i3943, + long i3944, + long i3945, + long i3946, + long i3947, + long i3948, + long i3949, + long i3950, + long i3951, + long i3952, + long i3953, + long i3954, + long i3955, + long i3956, + long i3957, + long i3958, + long i3959, + long i3960, + long i3961, + long i3962, + long i3963, + long i3964, + long i3965, + long i3966, + long i3967, + long i3968, + long i3969, + long i3970, + long i3971, + long i3972, + long i3973, + long i3974, + long i3975, + long i3976, + long i3977, + long i3978, + long i3979, + long i3980, + long i3981, + long i3982, + long i3983, + long i3984, + long i3985, + long i3986, + long i3987, + long i3988, + long i3989, + long i3990, + long i3991, + long i3992, + long i3993, + long i3994, + long i3995, + long i3996, + long i3997, + long i3998, + long i3999 + + ) + { + long result = + + i0 + + i1 + + i2 + + i3 + + i4 + + i5 + + i6 + + i7 + + i8 + + i9 + + i10 + + i11 + + i12 + + i13 + + i14 + + i15 + + i16 + + i17 + + i18 + + i19 + + i20 + + i21 + + i22 + + i23 + + i24 + + i25 + + i26 + + i27 + + i28 + + i29 + + i30 + + i31 + + i32 + + i33 + + i34 + + i35 + + i36 + + i37 + + i38 + + i39 + + i40 + + i41 + + i42 + + i43 + + i44 + + i45 + + i46 + + i47 + + i48 + + i49 + + i50 + + i51 + + i52 + + i53 + + i54 + + i55 + + i56 + + i57 + + i58 + + i59 + + i60 + + i61 + + i62 + + i63 + + i64 + + i65 + + i66 + + i67 + + i68 + + i69 + + i70 + + i71 + + i72 + + i73 + + i74 + + i75 + + i76 + + i77 + + i78 + + i79 + + i80 + + i81 + + i82 + + i83 + + i84 + + i85 + + i86 + + i87 + + i88 + + i89 + + i90 + + i91 + + i92 + + i93 + + i94 + + i95 + + i96 + + i97 + + i98 + + i99 + + i100 + + i101 + + i102 + + i103 + + i104 + + i105 + + i106 + + i107 + + i108 + + i109 + + i110 + + i111 + + i112 + + i113 + + i114 + + i115 + + i116 + + i117 + + i118 + + i119 + + i120 + + i121 + + i122 + + i123 + + i124 + + i125 + + i126 + + i127 + + i128 + + i129 + + i130 + + i131 + + i132 + + i133 + + i134 + + i135 + + i136 + + i137 + + i138 + + i139 + + i140 + + i141 + + i142 + + i143 + + i144 + + i145 + + i146 + + i147 + + i148 + + i149 + + i150 + + i151 + + i152 + + i153 + + i154 + + i155 + + i156 + + i157 + + i158 + + i159 + + i160 + + i161 + + i162 + + i163 + + i164 + + i165 + + i166 + + i167 + + i168 + + i169 + + i170 + + i171 + + i172 + + i173 + + i174 + + i175 + + i176 + + i177 + + i178 + + i179 + + i180 + + i181 + + i182 + + i183 + + i184 + + i185 + + i186 + + i187 + + i188 + + i189 + + i190 + + i191 + + i192 + + i193 + + i194 + + i195 + + i196 + + i197 + + i198 + + i199 + + i200 + + i201 + + i202 + + i203 + + i204 + + i205 + + i206 + + i207 + + i208 + + i209 + + i210 + + i211 + + i212 + + i213 + + i214 + + i215 + + i216 + + i217 + + i218 + + i219 + + i220 + + i221 + + i222 + + i223 + + i224 + + i225 + + i226 + + i227 + + i228 + + i229 + + i230 + + i231 + + i232 + + i233 + + i234 + + i235 + + i236 + + i237 + + i238 + + i239 + + i240 + + i241 + + i242 + + i243 + + i244 + + i245 + + i246 + + i247 + + i248 + + i249 + + i250 + + i251 + + i252 + + i253 + + i254 + + i255 + + i256 + + i257 + + i258 + + i259 + + i260 + + i261 + + i262 + + i263 + + i264 + + i265 + + i266 + + i267 + + i268 + + i269 + + i270 + + i271 + + i272 + + i273 + + i274 + + i275 + + i276 + + i277 + + i278 + + i279 + + i280 + + i281 + + i282 + + i283 + + i284 + + i285 + + i286 + + i287 + + i288 + + i289 + + i290 + + i291 + + i292 + + i293 + + i294 + + i295 + + i296 + + i297 + + i298 + + i299 + + i300 + + i301 + + i302 + + i303 + + i304 + + i305 + + i306 + + i307 + + i308 + + i309 + + i310 + + i311 + + i312 + + i313 + + i314 + + i315 + + i316 + + i317 + + i318 + + i319 + + i320 + + i321 + + i322 + + i323 + + i324 + + i325 + + i326 + + i327 + + i328 + + i329 + + i330 + + i331 + + i332 + + i333 + + i334 + + i335 + + i336 + + i337 + + i338 + + i339 + + i340 + + i341 + + i342 + + i343 + + i344 + + i345 + + i346 + + i347 + + i348 + + i349 + + i350 + + i351 + + i352 + + i353 + + i354 + + i355 + + i356 + + i357 + + i358 + + i359 + + i360 + + i361 + + i362 + + i363 + + i364 + + i365 + + i366 + + i367 + + i368 + + i369 + + i370 + + i371 + + i372 + + i373 + + i374 + + i375 + + i376 + + i377 + + i378 + + i379 + + i380 + + i381 + + i382 + + i383 + + i384 + + i385 + + i386 + + i387 + + i388 + + i389 + + i390 + + i391 + + i392 + + i393 + + i394 + + i395 + + i396 + + i397 + + i398 + + i399 + + i400 + + i401 + + i402 + + i403 + + i404 + + i405 + + i406 + + i407 + + i408 + + i409 + + i410 + + i411 + + i412 + + i413 + + i414 + + i415 + + i416 + + i417 + + i418 + + i419 + + i420 + + i421 + + i422 + + i423 + + i424 + + i425 + + i426 + + i427 + + i428 + + i429 + + i430 + + i431 + + i432 + + i433 + + i434 + + i435 + + i436 + + i437 + + i438 + + i439 + + i440 + + i441 + + i442 + + i443 + + i444 + + i445 + + i446 + + i447 + + i448 + + i449 + + i450 + + i451 + + i452 + + i453 + + i454 + + i455 + + i456 + + i457 + + i458 + + i459 + + i460 + + i461 + + i462 + + i463 + + i464 + + i465 + + i466 + + i467 + + i468 + + i469 + + i470 + + i471 + + i472 + + i473 + + i474 + + i475 + + i476 + + i477 + + i478 + + i479 + + i480 + + i481 + + i482 + + i483 + + i484 + + i485 + + i486 + + i487 + + i488 + + i489 + + i490 + + i491 + + i492 + + i493 + + i494 + + i495 + + i496 + + i497 + + i498 + + i499 + + i500 + + i501 + + i502 + + i503 + + i504 + + i505 + + i506 + + i507 + + i508 + + i509 + + i510 + + i511 + + i512 + + i513 + + i514 + + i515 + + i516 + + i517 + + i518 + + i519 + + i520 + + i521 + + i522 + + i523 + + i524 + + i525 + + i526 + + i527 + + i528 + + i529 + + i530 + + i531 + + i532 + + i533 + + i534 + + i535 + + i536 + + i537 + + i538 + + i539 + + i540 + + i541 + + i542 + + i543 + + i544 + + i545 + + i546 + + i547 + + i548 + + i549 + + i550 + + i551 + + i552 + + i553 + + i554 + + i555 + + i556 + + i557 + + i558 + + i559 + + i560 + + i561 + + i562 + + i563 + + i564 + + i565 + + i566 + + i567 + + i568 + + i569 + + i570 + + i571 + + i572 + + i573 + + i574 + + i575 + + i576 + + i577 + + i578 + + i579 + + i580 + + i581 + + i582 + + i583 + + i584 + + i585 + + i586 + + i587 + + i588 + + i589 + + i590 + + i591 + + i592 + + i593 + + i594 + + i595 + + i596 + + i597 + + i598 + + i599 + + i600 + + i601 + + i602 + + i603 + + i604 + + i605 + + i606 + + i607 + + i608 + + i609 + + i610 + + i611 + + i612 + + i613 + + i614 + + i615 + + i616 + + i617 + + i618 + + i619 + + i620 + + i621 + + i622 + + i623 + + i624 + + i625 + + i626 + + i627 + + i628 + + i629 + + i630 + + i631 + + i632 + + i633 + + i634 + + i635 + + i636 + + i637 + + i638 + + i639 + + i640 + + i641 + + i642 + + i643 + + i644 + + i645 + + i646 + + i647 + + i648 + + i649 + + i650 + + i651 + + i652 + + i653 + + i654 + + i655 + + i656 + + i657 + + i658 + + i659 + + i660 + + i661 + + i662 + + i663 + + i664 + + i665 + + i666 + + i667 + + i668 + + i669 + + i670 + + i671 + + i672 + + i673 + + i674 + + i675 + + i676 + + i677 + + i678 + + i679 + + i680 + + i681 + + i682 + + i683 + + i684 + + i685 + + i686 + + i687 + + i688 + + i689 + + i690 + + i691 + + i692 + + i693 + + i694 + + i695 + + i696 + + i697 + + i698 + + i699 + + i700 + + i701 + + i702 + + i703 + + i704 + + i705 + + i706 + + i707 + + i708 + + i709 + + i710 + + i711 + + i712 + + i713 + + i714 + + i715 + + i716 + + i717 + + i718 + + i719 + + i720 + + i721 + + i722 + + i723 + + i724 + + i725 + + i726 + + i727 + + i728 + + i729 + + i730 + + i731 + + i732 + + i733 + + i734 + + i735 + + i736 + + i737 + + i738 + + i739 + + i740 + + i741 + + i742 + + i743 + + i744 + + i745 + + i746 + + i747 + + i748 + + i749 + + i750 + + i751 + + i752 + + i753 + + i754 + + i755 + + i756 + + i757 + + i758 + + i759 + + i760 + + i761 + + i762 + + i763 + + i764 + + i765 + + i766 + + i767 + + i768 + + i769 + + i770 + + i771 + + i772 + + i773 + + i774 + + i775 + + i776 + + i777 + + i778 + + i779 + + i780 + + i781 + + i782 + + i783 + + i784 + + i785 + + i786 + + i787 + + i788 + + i789 + + i790 + + i791 + + i792 + + i793 + + i794 + + i795 + + i796 + + i797 + + i798 + + i799 + + i800 + + i801 + + i802 + + i803 + + i804 + + i805 + + i806 + + i807 + + i808 + + i809 + + i810 + + i811 + + i812 + + i813 + + i814 + + i815 + + i816 + + i817 + + i818 + + i819 + + i820 + + i821 + + i822 + + i823 + + i824 + + i825 + + i826 + + i827 + + i828 + + i829 + + i830 + + i831 + + i832 + + i833 + + i834 + + i835 + + i836 + + i837 + + i838 + + i839 + + i840 + + i841 + + i842 + + i843 + + i844 + + i845 + + i846 + + i847 + + i848 + + i849 + + i850 + + i851 + + i852 + + i853 + + i854 + + i855 + + i856 + + i857 + + i858 + + i859 + + i860 + + i861 + + i862 + + i863 + + i864 + + i865 + + i866 + + i867 + + i868 + + i869 + + i870 + + i871 + + i872 + + i873 + + i874 + + i875 + + i876 + + i877 + + i878 + + i879 + + i880 + + i881 + + i882 + + i883 + + i884 + + i885 + + i886 + + i887 + + i888 + + i889 + + i890 + + i891 + + i892 + + i893 + + i894 + + i895 + + i896 + + i897 + + i898 + + i899 + + i900 + + i901 + + i902 + + i903 + + i904 + + i905 + + i906 + + i907 + + i908 + + i909 + + i910 + + i911 + + i912 + + i913 + + i914 + + i915 + + i916 + + i917 + + i918 + + i919 + + i920 + + i921 + + i922 + + i923 + + i924 + + i925 + + i926 + + i927 + + i928 + + i929 + + i930 + + i931 + + i932 + + i933 + + i934 + + i935 + + i936 + + i937 + + i938 + + i939 + + i940 + + i941 + + i942 + + i943 + + i944 + + i945 + + i946 + + i947 + + i948 + + i949 + + i950 + + i951 + + i952 + + i953 + + i954 + + i955 + + i956 + + i957 + + i958 + + i959 + + i960 + + i961 + + i962 + + i963 + + i964 + + i965 + + i966 + + i967 + + i968 + + i969 + + i970 + + i971 + + i972 + + i973 + + i974 + + i975 + + i976 + + i977 + + i978 + + i979 + + i980 + + i981 + + i982 + + i983 + + i984 + + i985 + + i986 + + i987 + + i988 + + i989 + + i990 + + i991 + + i992 + + i993 + + i994 + + i995 + + i996 + + i997 + + i998 + + i999 + + i1000 + + i1001 + + i1002 + + i1003 + + i1004 + + i1005 + + i1006 + + i1007 + + i1008 + + i1009 + + i1010 + + i1011 + + i1012 + + i1013 + + i1014 + + i1015 + + i1016 + + i1017 + + i1018 + + i1019 + + i1020 + + i1021 + + i1022 + + i1023 + + i1024 + + i1025 + + i1026 + + i1027 + + i1028 + + i1029 + + i1030 + + i1031 + + i1032 + + i1033 + + i1034 + + i1035 + + i1036 + + i1037 + + i1038 + + i1039 + + i1040 + + i1041 + + i1042 + + i1043 + + i1044 + + i1045 + + i1046 + + i1047 + + i1048 + + i1049 + + i1050 + + i1051 + + i1052 + + i1053 + + i1054 + + i1055 + + i1056 + + i1057 + + i1058 + + i1059 + + i1060 + + i1061 + + i1062 + + i1063 + + i1064 + + i1065 + + i1066 + + i1067 + + i1068 + + i1069 + + i1070 + + i1071 + + i1072 + + i1073 + + i1074 + + i1075 + + i1076 + + i1077 + + i1078 + + i1079 + + i1080 + + i1081 + + i1082 + + i1083 + + i1084 + + i1085 + + i1086 + + i1087 + + i1088 + + i1089 + + i1090 + + i1091 + + i1092 + + i1093 + + i1094 + + i1095 + + i1096 + + i1097 + + i1098 + + i1099 + + i1100 + + i1101 + + i1102 + + i1103 + + i1104 + + i1105 + + i1106 + + i1107 + + i1108 + + i1109 + + i1110 + + i1111 + + i1112 + + i1113 + + i1114 + + i1115 + + i1116 + + i1117 + + i1118 + + i1119 + + i1120 + + i1121 + + i1122 + + i1123 + + i1124 + + i1125 + + i1126 + + i1127 + + i1128 + + i1129 + + i1130 + + i1131 + + i1132 + + i1133 + + i1134 + + i1135 + + i1136 + + i1137 + + i1138 + + i1139 + + i1140 + + i1141 + + i1142 + + i1143 + + i1144 + + i1145 + + i1146 + + i1147 + + i1148 + + i1149 + + i1150 + + i1151 + + i1152 + + i1153 + + i1154 + + i1155 + + i1156 + + i1157 + + i1158 + + i1159 + + i1160 + + i1161 + + i1162 + + i1163 + + i1164 + + i1165 + + i1166 + + i1167 + + i1168 + + i1169 + + i1170 + + i1171 + + i1172 + + i1173 + + i1174 + + i1175 + + i1176 + + i1177 + + i1178 + + i1179 + + i1180 + + i1181 + + i1182 + + i1183 + + i1184 + + i1185 + + i1186 + + i1187 + + i1188 + + i1189 + + i1190 + + i1191 + + i1192 + + i1193 + + i1194 + + i1195 + + i1196 + + i1197 + + i1198 + + i1199 + + i1200 + + i1201 + + i1202 + + i1203 + + i1204 + + i1205 + + i1206 + + i1207 + + i1208 + + i1209 + + i1210 + + i1211 + + i1212 + + i1213 + + i1214 + + i1215 + + i1216 + + i1217 + + i1218 + + i1219 + + i1220 + + i1221 + + i1222 + + i1223 + + i1224 + + i1225 + + i1226 + + i1227 + + i1228 + + i1229 + + i1230 + + i1231 + + i1232 + + i1233 + + i1234 + + i1235 + + i1236 + + i1237 + + i1238 + + i1239 + + i1240 + + i1241 + + i1242 + + i1243 + + i1244 + + i1245 + + i1246 + + i1247 + + i1248 + + i1249 + + i1250 + + i1251 + + i1252 + + i1253 + + i1254 + + i1255 + + i1256 + + i1257 + + i1258 + + i1259 + + i1260 + + i1261 + + i1262 + + i1263 + + i1264 + + i1265 + + i1266 + + i1267 + + i1268 + + i1269 + + i1270 + + i1271 + + i1272 + + i1273 + + i1274 + + i1275 + + i1276 + + i1277 + + i1278 + + i1279 + + i1280 + + i1281 + + i1282 + + i1283 + + i1284 + + i1285 + + i1286 + + i1287 + + i1288 + + i1289 + + i1290 + + i1291 + + i1292 + + i1293 + + i1294 + + i1295 + + i1296 + + i1297 + + i1298 + + i1299 + + i1300 + + i1301 + + i1302 + + i1303 + + i1304 + + i1305 + + i1306 + + i1307 + + i1308 + + i1309 + + i1310 + + i1311 + + i1312 + + i1313 + + i1314 + + i1315 + + i1316 + + i1317 + + i1318 + + i1319 + + i1320 + + i1321 + + i1322 + + i1323 + + i1324 + + i1325 + + i1326 + + i1327 + + i1328 + + i1329 + + i1330 + + i1331 + + i1332 + + i1333 + + i1334 + + i1335 + + i1336 + + i1337 + + i1338 + + i1339 + + i1340 + + i1341 + + i1342 + + i1343 + + i1344 + + i1345 + + i1346 + + i1347 + + i1348 + + i1349 + + i1350 + + i1351 + + i1352 + + i1353 + + i1354 + + i1355 + + i1356 + + i1357 + + i1358 + + i1359 + + i1360 + + i1361 + + i1362 + + i1363 + + i1364 + + i1365 + + i1366 + + i1367 + + i1368 + + i1369 + + i1370 + + i1371 + + i1372 + + i1373 + + i1374 + + i1375 + + i1376 + + i1377 + + i1378 + + i1379 + + i1380 + + i1381 + + i1382 + + i1383 + + i1384 + + i1385 + + i1386 + + i1387 + + i1388 + + i1389 + + i1390 + + i1391 + + i1392 + + i1393 + + i1394 + + i1395 + + i1396 + + i1397 + + i1398 + + i1399 + + i1400 + + i1401 + + i1402 + + i1403 + + i1404 + + i1405 + + i1406 + + i1407 + + i1408 + + i1409 + + i1410 + + i1411 + + i1412 + + i1413 + + i1414 + + i1415 + + i1416 + + i1417 + + i1418 + + i1419 + + i1420 + + i1421 + + i1422 + + i1423 + + i1424 + + i1425 + + i1426 + + i1427 + + i1428 + + i1429 + + i1430 + + i1431 + + i1432 + + i1433 + + i1434 + + i1435 + + i1436 + + i1437 + + i1438 + + i1439 + + i1440 + + i1441 + + i1442 + + i1443 + + i1444 + + i1445 + + i1446 + + i1447 + + i1448 + + i1449 + + i1450 + + i1451 + + i1452 + + i1453 + + i1454 + + i1455 + + i1456 + + i1457 + + i1458 + + i1459 + + i1460 + + i1461 + + i1462 + + i1463 + + i1464 + + i1465 + + i1466 + + i1467 + + i1468 + + i1469 + + i1470 + + i1471 + + i1472 + + i1473 + + i1474 + + i1475 + + i1476 + + i1477 + + i1478 + + i1479 + + i1480 + + i1481 + + i1482 + + i1483 + + i1484 + + i1485 + + i1486 + + i1487 + + i1488 + + i1489 + + i1490 + + i1491 + + i1492 + + i1493 + + i1494 + + i1495 + + i1496 + + i1497 + + i1498 + + i1499 + + i1500 + + i1501 + + i1502 + + i1503 + + i1504 + + i1505 + + i1506 + + i1507 + + i1508 + + i1509 + + i1510 + + i1511 + + i1512 + + i1513 + + i1514 + + i1515 + + i1516 + + i1517 + + i1518 + + i1519 + + i1520 + + i1521 + + i1522 + + i1523 + + i1524 + + i1525 + + i1526 + + i1527 + + i1528 + + i1529 + + i1530 + + i1531 + + i1532 + + i1533 + + i1534 + + i1535 + + i1536 + + i1537 + + i1538 + + i1539 + + i1540 + + i1541 + + i1542 + + i1543 + + i1544 + + i1545 + + i1546 + + i1547 + + i1548 + + i1549 + + i1550 + + i1551 + + i1552 + + i1553 + + i1554 + + i1555 + + i1556 + + i1557 + + i1558 + + i1559 + + i1560 + + i1561 + + i1562 + + i1563 + + i1564 + + i1565 + + i1566 + + i1567 + + i1568 + + i1569 + + i1570 + + i1571 + + i1572 + + i1573 + + i1574 + + i1575 + + i1576 + + i1577 + + i1578 + + i1579 + + i1580 + + i1581 + + i1582 + + i1583 + + i1584 + + i1585 + + i1586 + + i1587 + + i1588 + + i1589 + + i1590 + + i1591 + + i1592 + + i1593 + + i1594 + + i1595 + + i1596 + + i1597 + + i1598 + + i1599 + + i1600 + + i1601 + + i1602 + + i1603 + + i1604 + + i1605 + + i1606 + + i1607 + + i1608 + + i1609 + + i1610 + + i1611 + + i1612 + + i1613 + + i1614 + + i1615 + + i1616 + + i1617 + + i1618 + + i1619 + + i1620 + + i1621 + + i1622 + + i1623 + + i1624 + + i1625 + + i1626 + + i1627 + + i1628 + + i1629 + + i1630 + + i1631 + + i1632 + + i1633 + + i1634 + + i1635 + + i1636 + + i1637 + + i1638 + + i1639 + + i1640 + + i1641 + + i1642 + + i1643 + + i1644 + + i1645 + + i1646 + + i1647 + + i1648 + + i1649 + + i1650 + + i1651 + + i1652 + + i1653 + + i1654 + + i1655 + + i1656 + + i1657 + + i1658 + + i1659 + + i1660 + + i1661 + + i1662 + + i1663 + + i1664 + + i1665 + + i1666 + + i1667 + + i1668 + + i1669 + + i1670 + + i1671 + + i1672 + + i1673 + + i1674 + + i1675 + + i1676 + + i1677 + + i1678 + + i1679 + + i1680 + + i1681 + + i1682 + + i1683 + + i1684 + + i1685 + + i1686 + + i1687 + + i1688 + + i1689 + + i1690 + + i1691 + + i1692 + + i1693 + + i1694 + + i1695 + + i1696 + + i1697 + + i1698 + + i1699 + + i1700 + + i1701 + + i1702 + + i1703 + + i1704 + + i1705 + + i1706 + + i1707 + + i1708 + + i1709 + + i1710 + + i1711 + + i1712 + + i1713 + + i1714 + + i1715 + + i1716 + + i1717 + + i1718 + + i1719 + + i1720 + + i1721 + + i1722 + + i1723 + + i1724 + + i1725 + + i1726 + + i1727 + + i1728 + + i1729 + + i1730 + + i1731 + + i1732 + + i1733 + + i1734 + + i1735 + + i1736 + + i1737 + + i1738 + + i1739 + + i1740 + + i1741 + + i1742 + + i1743 + + i1744 + + i1745 + + i1746 + + i1747 + + i1748 + + i1749 + + i1750 + + i1751 + + i1752 + + i1753 + + i1754 + + i1755 + + i1756 + + i1757 + + i1758 + + i1759 + + i1760 + + i1761 + + i1762 + + i1763 + + i1764 + + i1765 + + i1766 + + i1767 + + i1768 + + i1769 + + i1770 + + i1771 + + i1772 + + i1773 + + i1774 + + i1775 + + i1776 + + i1777 + + i1778 + + i1779 + + i1780 + + i1781 + + i1782 + + i1783 + + i1784 + + i1785 + + i1786 + + i1787 + + i1788 + + i1789 + + i1790 + + i1791 + + i1792 + + i1793 + + i1794 + + i1795 + + i1796 + + i1797 + + i1798 + + i1799 + + i1800 + + i1801 + + i1802 + + i1803 + + i1804 + + i1805 + + i1806 + + i1807 + + i1808 + + i1809 + + i1810 + + i1811 + + i1812 + + i1813 + + i1814 + + i1815 + + i1816 + + i1817 + + i1818 + + i1819 + + i1820 + + i1821 + + i1822 + + i1823 + + i1824 + + i1825 + + i1826 + + i1827 + + i1828 + + i1829 + + i1830 + + i1831 + + i1832 + + i1833 + + i1834 + + i1835 + + i1836 + + i1837 + + i1838 + + i1839 + + i1840 + + i1841 + + i1842 + + i1843 + + i1844 + + i1845 + + i1846 + + i1847 + + i1848 + + i1849 + + i1850 + + i1851 + + i1852 + + i1853 + + i1854 + + i1855 + + i1856 + + i1857 + + i1858 + + i1859 + + i1860 + + i1861 + + i1862 + + i1863 + + i1864 + + i1865 + + i1866 + + i1867 + + i1868 + + i1869 + + i1870 + + i1871 + + i1872 + + i1873 + + i1874 + + i1875 + + i1876 + + i1877 + + i1878 + + i1879 + + i1880 + + i1881 + + i1882 + + i1883 + + i1884 + + i1885 + + i1886 + + i1887 + + i1888 + + i1889 + + i1890 + + i1891 + + i1892 + + i1893 + + i1894 + + i1895 + + i1896 + + i1897 + + i1898 + + i1899 + + i1900 + + i1901 + + i1902 + + i1903 + + i1904 + + i1905 + + i1906 + + i1907 + + i1908 + + i1909 + + i1910 + + i1911 + + i1912 + + i1913 + + i1914 + + i1915 + + i1916 + + i1917 + + i1918 + + i1919 + + i1920 + + i1921 + + i1922 + + i1923 + + i1924 + + i1925 + + i1926 + + i1927 + + i1928 + + i1929 + + i1930 + + i1931 + + i1932 + + i1933 + + i1934 + + i1935 + + i1936 + + i1937 + + i1938 + + i1939 + + i1940 + + i1941 + + i1942 + + i1943 + + i1944 + + i1945 + + i1946 + + i1947 + + i1948 + + i1949 + + i1950 + + i1951 + + i1952 + + i1953 + + i1954 + + i1955 + + i1956 + + i1957 + + i1958 + + i1959 + + i1960 + + i1961 + + i1962 + + i1963 + + i1964 + + i1965 + + i1966 + + i1967 + + i1968 + + i1969 + + i1970 + + i1971 + + i1972 + + i1973 + + i1974 + + i1975 + + i1976 + + i1977 + + i1978 + + i1979 + + i1980 + + i1981 + + i1982 + + i1983 + + i1984 + + i1985 + + i1986 + + i1987 + + i1988 + + i1989 + + i1990 + + i1991 + + i1992 + + i1993 + + i1994 + + i1995 + + i1996 + + i1997 + + i1998 + + i1999 + + i2000 + + i2001 + + i2002 + + i2003 + + i2004 + + i2005 + + i2006 + + i2007 + + i2008 + + i2009 + + i2010 + + i2011 + + i2012 + + i2013 + + i2014 + + i2015 + + i2016 + + i2017 + + i2018 + + i2019 + + i2020 + + i2021 + + i2022 + + i2023 + + i2024 + + i2025 + + i2026 + + i2027 + + i2028 + + i2029 + + i2030 + + i2031 + + i2032 + + i2033 + + i2034 + + i2035 + + i2036 + + i2037 + + i2038 + + i2039 + + i2040 + + i2041 + + i2042 + + i2043 + + i2044 + + i2045 + + i2046 + + i2047 + + i2048 + + i2049 + + i2050 + + i2051 + + i2052 + + i2053 + + i2054 + + i2055 + + i2056 + + i2057 + + i2058 + + i2059 + + i2060 + + i2061 + + i2062 + + i2063 + + i2064 + + i2065 + + i2066 + + i2067 + + i2068 + + i2069 + + i2070 + + i2071 + + i2072 + + i2073 + + i2074 + + i2075 + + i2076 + + i2077 + + i2078 + + i2079 + + i2080 + + i2081 + + i2082 + + i2083 + + i2084 + + i2085 + + i2086 + + i2087 + + i2088 + + i2089 + + i2090 + + i2091 + + i2092 + + i2093 + + i2094 + + i2095 + + i2096 + + i2097 + + i2098 + + i2099 + + i2100 + + i2101 + + i2102 + + i2103 + + i2104 + + i2105 + + i2106 + + i2107 + + i2108 + + i2109 + + i2110 + + i2111 + + i2112 + + i2113 + + i2114 + + i2115 + + i2116 + + i2117 + + i2118 + + i2119 + + i2120 + + i2121 + + i2122 + + i2123 + + i2124 + + i2125 + + i2126 + + i2127 + + i2128 + + i2129 + + i2130 + + i2131 + + i2132 + + i2133 + + i2134 + + i2135 + + i2136 + + i2137 + + i2138 + + i2139 + + i2140 + + i2141 + + i2142 + + i2143 + + i2144 + + i2145 + + i2146 + + i2147 + + i2148 + + i2149 + + i2150 + + i2151 + + i2152 + + i2153 + + i2154 + + i2155 + + i2156 + + i2157 + + i2158 + + i2159 + + i2160 + + i2161 + + i2162 + + i2163 + + i2164 + + i2165 + + i2166 + + i2167 + + i2168 + + i2169 + + i2170 + + i2171 + + i2172 + + i2173 + + i2174 + + i2175 + + i2176 + + i2177 + + i2178 + + i2179 + + i2180 + + i2181 + + i2182 + + i2183 + + i2184 + + i2185 + + i2186 + + i2187 + + i2188 + + i2189 + + i2190 + + i2191 + + i2192 + + i2193 + + i2194 + + i2195 + + i2196 + + i2197 + + i2198 + + i2199 + + i2200 + + i2201 + + i2202 + + i2203 + + i2204 + + i2205 + + i2206 + + i2207 + + i2208 + + i2209 + + i2210 + + i2211 + + i2212 + + i2213 + + i2214 + + i2215 + + i2216 + + i2217 + + i2218 + + i2219 + + i2220 + + i2221 + + i2222 + + i2223 + + i2224 + + i2225 + + i2226 + + i2227 + + i2228 + + i2229 + + i2230 + + i2231 + + i2232 + + i2233 + + i2234 + + i2235 + + i2236 + + i2237 + + i2238 + + i2239 + + i2240 + + i2241 + + i2242 + + i2243 + + i2244 + + i2245 + + i2246 + + i2247 + + i2248 + + i2249 + + i2250 + + i2251 + + i2252 + + i2253 + + i2254 + + i2255 + + i2256 + + i2257 + + i2258 + + i2259 + + i2260 + + i2261 + + i2262 + + i2263 + + i2264 + + i2265 + + i2266 + + i2267 + + i2268 + + i2269 + + i2270 + + i2271 + + i2272 + + i2273 + + i2274 + + i2275 + + i2276 + + i2277 + + i2278 + + i2279 + + i2280 + + i2281 + + i2282 + + i2283 + + i2284 + + i2285 + + i2286 + + i2287 + + i2288 + + i2289 + + i2290 + + i2291 + + i2292 + + i2293 + + i2294 + + i2295 + + i2296 + + i2297 + + i2298 + + i2299 + + i2300 + + i2301 + + i2302 + + i2303 + + i2304 + + i2305 + + i2306 + + i2307 + + i2308 + + i2309 + + i2310 + + i2311 + + i2312 + + i2313 + + i2314 + + i2315 + + i2316 + + i2317 + + i2318 + + i2319 + + i2320 + + i2321 + + i2322 + + i2323 + + i2324 + + i2325 + + i2326 + + i2327 + + i2328 + + i2329 + + i2330 + + i2331 + + i2332 + + i2333 + + i2334 + + i2335 + + i2336 + + i2337 + + i2338 + + i2339 + + i2340 + + i2341 + + i2342 + + i2343 + + i2344 + + i2345 + + i2346 + + i2347 + + i2348 + + i2349 + + i2350 + + i2351 + + i2352 + + i2353 + + i2354 + + i2355 + + i2356 + + i2357 + + i2358 + + i2359 + + i2360 + + i2361 + + i2362 + + i2363 + + i2364 + + i2365 + + i2366 + + i2367 + + i2368 + + i2369 + + i2370 + + i2371 + + i2372 + + i2373 + + i2374 + + i2375 + + i2376 + + i2377 + + i2378 + + i2379 + + i2380 + + i2381 + + i2382 + + i2383 + + i2384 + + i2385 + + i2386 + + i2387 + + i2388 + + i2389 + + i2390 + + i2391 + + i2392 + + i2393 + + i2394 + + i2395 + + i2396 + + i2397 + + i2398 + + i2399 + + i2400 + + i2401 + + i2402 + + i2403 + + i2404 + + i2405 + + i2406 + + i2407 + + i2408 + + i2409 + + i2410 + + i2411 + + i2412 + + i2413 + + i2414 + + i2415 + + i2416 + + i2417 + + i2418 + + i2419 + + i2420 + + i2421 + + i2422 + + i2423 + + i2424 + + i2425 + + i2426 + + i2427 + + i2428 + + i2429 + + i2430 + + i2431 + + i2432 + + i2433 + + i2434 + + i2435 + + i2436 + + i2437 + + i2438 + + i2439 + + i2440 + + i2441 + + i2442 + + i2443 + + i2444 + + i2445 + + i2446 + + i2447 + + i2448 + + i2449 + + i2450 + + i2451 + + i2452 + + i2453 + + i2454 + + i2455 + + i2456 + + i2457 + + i2458 + + i2459 + + i2460 + + i2461 + + i2462 + + i2463 + + i2464 + + i2465 + + i2466 + + i2467 + + i2468 + + i2469 + + i2470 + + i2471 + + i2472 + + i2473 + + i2474 + + i2475 + + i2476 + + i2477 + + i2478 + + i2479 + + i2480 + + i2481 + + i2482 + + i2483 + + i2484 + + i2485 + + i2486 + + i2487 + + i2488 + + i2489 + + i2490 + + i2491 + + i2492 + + i2493 + + i2494 + + i2495 + + i2496 + + i2497 + + i2498 + + i2499 + + i2500 + + i2501 + + i2502 + + i2503 + + i2504 + + i2505 + + i2506 + + i2507 + + i2508 + + i2509 + + i2510 + + i2511 + + i2512 + + i2513 + + i2514 + + i2515 + + i2516 + + i2517 + + i2518 + + i2519 + + i2520 + + i2521 + + i2522 + + i2523 + + i2524 + + i2525 + + i2526 + + i2527 + + i2528 + + i2529 + + i2530 + + i2531 + + i2532 + + i2533 + + i2534 + + i2535 + + i2536 + + i2537 + + i2538 + + i2539 + + i2540 + + i2541 + + i2542 + + i2543 + + i2544 + + i2545 + + i2546 + + i2547 + + i2548 + + i2549 + + i2550 + + i2551 + + i2552 + + i2553 + + i2554 + + i2555 + + i2556 + + i2557 + + i2558 + + i2559 + + i2560 + + i2561 + + i2562 + + i2563 + + i2564 + + i2565 + + i2566 + + i2567 + + i2568 + + i2569 + + i2570 + + i2571 + + i2572 + + i2573 + + i2574 + + i2575 + + i2576 + + i2577 + + i2578 + + i2579 + + i2580 + + i2581 + + i2582 + + i2583 + + i2584 + + i2585 + + i2586 + + i2587 + + i2588 + + i2589 + + i2590 + + i2591 + + i2592 + + i2593 + + i2594 + + i2595 + + i2596 + + i2597 + + i2598 + + i2599 + + i2600 + + i2601 + + i2602 + + i2603 + + i2604 + + i2605 + + i2606 + + i2607 + + i2608 + + i2609 + + i2610 + + i2611 + + i2612 + + i2613 + + i2614 + + i2615 + + i2616 + + i2617 + + i2618 + + i2619 + + i2620 + + i2621 + + i2622 + + i2623 + + i2624 + + i2625 + + i2626 + + i2627 + + i2628 + + i2629 + + i2630 + + i2631 + + i2632 + + i2633 + + i2634 + + i2635 + + i2636 + + i2637 + + i2638 + + i2639 + + i2640 + + i2641 + + i2642 + + i2643 + + i2644 + + i2645 + + i2646 + + i2647 + + i2648 + + i2649 + + i2650 + + i2651 + + i2652 + + i2653 + + i2654 + + i2655 + + i2656 + + i2657 + + i2658 + + i2659 + + i2660 + + i2661 + + i2662 + + i2663 + + i2664 + + i2665 + + i2666 + + i2667 + + i2668 + + i2669 + + i2670 + + i2671 + + i2672 + + i2673 + + i2674 + + i2675 + + i2676 + + i2677 + + i2678 + + i2679 + + i2680 + + i2681 + + i2682 + + i2683 + + i2684 + + i2685 + + i2686 + + i2687 + + i2688 + + i2689 + + i2690 + + i2691 + + i2692 + + i2693 + + i2694 + + i2695 + + i2696 + + i2697 + + i2698 + + i2699 + + i2700 + + i2701 + + i2702 + + i2703 + + i2704 + + i2705 + + i2706 + + i2707 + + i2708 + + i2709 + + i2710 + + i2711 + + i2712 + + i2713 + + i2714 + + i2715 + + i2716 + + i2717 + + i2718 + + i2719 + + i2720 + + i2721 + + i2722 + + i2723 + + i2724 + + i2725 + + i2726 + + i2727 + + i2728 + + i2729 + + i2730 + + i2731 + + i2732 + + i2733 + + i2734 + + i2735 + + i2736 + + i2737 + + i2738 + + i2739 + + i2740 + + i2741 + + i2742 + + i2743 + + i2744 + + i2745 + + i2746 + + i2747 + + i2748 + + i2749 + + i2750 + + i2751 + + i2752 + + i2753 + + i2754 + + i2755 + + i2756 + + i2757 + + i2758 + + i2759 + + i2760 + + i2761 + + i2762 + + i2763 + + i2764 + + i2765 + + i2766 + + i2767 + + i2768 + + i2769 + + i2770 + + i2771 + + i2772 + + i2773 + + i2774 + + i2775 + + i2776 + + i2777 + + i2778 + + i2779 + + i2780 + + i2781 + + i2782 + + i2783 + + i2784 + + i2785 + + i2786 + + i2787 + + i2788 + + i2789 + + i2790 + + i2791 + + i2792 + + i2793 + + i2794 + + i2795 + + i2796 + + i2797 + + i2798 + + i2799 + + i2800 + + i2801 + + i2802 + + i2803 + + i2804 + + i2805 + + i2806 + + i2807 + + i2808 + + i2809 + + i2810 + + i2811 + + i2812 + + i2813 + + i2814 + + i2815 + + i2816 + + i2817 + + i2818 + + i2819 + + i2820 + + i2821 + + i2822 + + i2823 + + i2824 + + i2825 + + i2826 + + i2827 + + i2828 + + i2829 + + i2830 + + i2831 + + i2832 + + i2833 + + i2834 + + i2835 + + i2836 + + i2837 + + i2838 + + i2839 + + i2840 + + i2841 + + i2842 + + i2843 + + i2844 + + i2845 + + i2846 + + i2847 + + i2848 + + i2849 + + i2850 + + i2851 + + i2852 + + i2853 + + i2854 + + i2855 + + i2856 + + i2857 + + i2858 + + i2859 + + i2860 + + i2861 + + i2862 + + i2863 + + i2864 + + i2865 + + i2866 + + i2867 + + i2868 + + i2869 + + i2870 + + i2871 + + i2872 + + i2873 + + i2874 + + i2875 + + i2876 + + i2877 + + i2878 + + i2879 + + i2880 + + i2881 + + i2882 + + i2883 + + i2884 + + i2885 + + i2886 + + i2887 + + i2888 + + i2889 + + i2890 + + i2891 + + i2892 + + i2893 + + i2894 + + i2895 + + i2896 + + i2897 + + i2898 + + i2899 + + i2900 + + i2901 + + i2902 + + i2903 + + i2904 + + i2905 + + i2906 + + i2907 + + i2908 + + i2909 + + i2910 + + i2911 + + i2912 + + i2913 + + i2914 + + i2915 + + i2916 + + i2917 + + i2918 + + i2919 + + i2920 + + i2921 + + i2922 + + i2923 + + i2924 + + i2925 + + i2926 + + i2927 + + i2928 + + i2929 + + i2930 + + i2931 + + i2932 + + i2933 + + i2934 + + i2935 + + i2936 + + i2937 + + i2938 + + i2939 + + i2940 + + i2941 + + i2942 + + i2943 + + i2944 + + i2945 + + i2946 + + i2947 + + i2948 + + i2949 + + i2950 + + i2951 + + i2952 + + i2953 + + i2954 + + i2955 + + i2956 + + i2957 + + i2958 + + i2959 + + i2960 + + i2961 + + i2962 + + i2963 + + i2964 + + i2965 + + i2966 + + i2967 + + i2968 + + i2969 + + i2970 + + i2971 + + i2972 + + i2973 + + i2974 + + i2975 + + i2976 + + i2977 + + i2978 + + i2979 + + i2980 + + i2981 + + i2982 + + i2983 + + i2984 + + i2985 + + i2986 + + i2987 + + i2988 + + i2989 + + i2990 + + i2991 + + i2992 + + i2993 + + i2994 + + i2995 + + i2996 + + i2997 + + i2998 + + i2999 + + i3000 + + i3001 + + i3002 + + i3003 + + i3004 + + i3005 + + i3006 + + i3007 + + i3008 + + i3009 + + i3010 + + i3011 + + i3012 + + i3013 + + i3014 + + i3015 + + i3016 + + i3017 + + i3018 + + i3019 + + i3020 + + i3021 + + i3022 + + i3023 + + i3024 + + i3025 + + i3026 + + i3027 + + i3028 + + i3029 + + i3030 + + i3031 + + i3032 + + i3033 + + i3034 + + i3035 + + i3036 + + i3037 + + i3038 + + i3039 + + i3040 + + i3041 + + i3042 + + i3043 + + i3044 + + i3045 + + i3046 + + i3047 + + i3048 + + i3049 + + i3050 + + i3051 + + i3052 + + i3053 + + i3054 + + i3055 + + i3056 + + i3057 + + i3058 + + i3059 + + i3060 + + i3061 + + i3062 + + i3063 + + i3064 + + i3065 + + i3066 + + i3067 + + i3068 + + i3069 + + i3070 + + i3071 + + i3072 + + i3073 + + i3074 + + i3075 + + i3076 + + i3077 + + i3078 + + i3079 + + i3080 + + i3081 + + i3082 + + i3083 + + i3084 + + i3085 + + i3086 + + i3087 + + i3088 + + i3089 + + i3090 + + i3091 + + i3092 + + i3093 + + i3094 + + i3095 + + i3096 + + i3097 + + i3098 + + i3099 + + i3100 + + i3101 + + i3102 + + i3103 + + i3104 + + i3105 + + i3106 + + i3107 + + i3108 + + i3109 + + i3110 + + i3111 + + i3112 + + i3113 + + i3114 + + i3115 + + i3116 + + i3117 + + i3118 + + i3119 + + i3120 + + i3121 + + i3122 + + i3123 + + i3124 + + i3125 + + i3126 + + i3127 + + i3128 + + i3129 + + i3130 + + i3131 + + i3132 + + i3133 + + i3134 + + i3135 + + i3136 + + i3137 + + i3138 + + i3139 + + i3140 + + i3141 + + i3142 + + i3143 + + i3144 + + i3145 + + i3146 + + i3147 + + i3148 + + i3149 + + i3150 + + i3151 + + i3152 + + i3153 + + i3154 + + i3155 + + i3156 + + i3157 + + i3158 + + i3159 + + i3160 + + i3161 + + i3162 + + i3163 + + i3164 + + i3165 + + i3166 + + i3167 + + i3168 + + i3169 + + i3170 + + i3171 + + i3172 + + i3173 + + i3174 + + i3175 + + i3176 + + i3177 + + i3178 + + i3179 + + i3180 + + i3181 + + i3182 + + i3183 + + i3184 + + i3185 + + i3186 + + i3187 + + i3188 + + i3189 + + i3190 + + i3191 + + i3192 + + i3193 + + i3194 + + i3195 + + i3196 + + i3197 + + i3198 + + i3199 + + i3200 + + i3201 + + i3202 + + i3203 + + i3204 + + i3205 + + i3206 + + i3207 + + i3208 + + i3209 + + i3210 + + i3211 + + i3212 + + i3213 + + i3214 + + i3215 + + i3216 + + i3217 + + i3218 + + i3219 + + i3220 + + i3221 + + i3222 + + i3223 + + i3224 + + i3225 + + i3226 + + i3227 + + i3228 + + i3229 + + i3230 + + i3231 + + i3232 + + i3233 + + i3234 + + i3235 + + i3236 + + i3237 + + i3238 + + i3239 + + i3240 + + i3241 + + i3242 + + i3243 + + i3244 + + i3245 + + i3246 + + i3247 + + i3248 + + i3249 + + i3250 + + i3251 + + i3252 + + i3253 + + i3254 + + i3255 + + i3256 + + i3257 + + i3258 + + i3259 + + i3260 + + i3261 + + i3262 + + i3263 + + i3264 + + i3265 + + i3266 + + i3267 + + i3268 + + i3269 + + i3270 + + i3271 + + i3272 + + i3273 + + i3274 + + i3275 + + i3276 + + i3277 + + i3278 + + i3279 + + i3280 + + i3281 + + i3282 + + i3283 + + i3284 + + i3285 + + i3286 + + i3287 + + i3288 + + i3289 + + i3290 + + i3291 + + i3292 + + i3293 + + i3294 + + i3295 + + i3296 + + i3297 + + i3298 + + i3299 + + i3300 + + i3301 + + i3302 + + i3303 + + i3304 + + i3305 + + i3306 + + i3307 + + i3308 + + i3309 + + i3310 + + i3311 + + i3312 + + i3313 + + i3314 + + i3315 + + i3316 + + i3317 + + i3318 + + i3319 + + i3320 + + i3321 + + i3322 + + i3323 + + i3324 + + i3325 + + i3326 + + i3327 + + i3328 + + i3329 + + i3330 + + i3331 + + i3332 + + i3333 + + i3334 + + i3335 + + i3336 + + i3337 + + i3338 + + i3339 + + i3340 + + i3341 + + i3342 + + i3343 + + i3344 + + i3345 + + i3346 + + i3347 + + i3348 + + i3349 + + i3350 + + i3351 + + i3352 + + i3353 + + i3354 + + i3355 + + i3356 + + i3357 + + i3358 + + i3359 + + i3360 + + i3361 + + i3362 + + i3363 + + i3364 + + i3365 + + i3366 + + i3367 + + i3368 + + i3369 + + i3370 + + i3371 + + i3372 + + i3373 + + i3374 + + i3375 + + i3376 + + i3377 + + i3378 + + i3379 + + i3380 + + i3381 + + i3382 + + i3383 + + i3384 + + i3385 + + i3386 + + i3387 + + i3388 + + i3389 + + i3390 + + i3391 + + i3392 + + i3393 + + i3394 + + i3395 + + i3396 + + i3397 + + i3398 + + i3399 + + i3400 + + i3401 + + i3402 + + i3403 + + i3404 + + i3405 + + i3406 + + i3407 + + i3408 + + i3409 + + i3410 + + i3411 + + i3412 + + i3413 + + i3414 + + i3415 + + i3416 + + i3417 + + i3418 + + i3419 + + i3420 + + i3421 + + i3422 + + i3423 + + i3424 + + i3425 + + i3426 + + i3427 + + i3428 + + i3429 + + i3430 + + i3431 + + i3432 + + i3433 + + i3434 + + i3435 + + i3436 + + i3437 + + i3438 + + i3439 + + i3440 + + i3441 + + i3442 + + i3443 + + i3444 + + i3445 + + i3446 + + i3447 + + i3448 + + i3449 + + i3450 + + i3451 + + i3452 + + i3453 + + i3454 + + i3455 + + i3456 + + i3457 + + i3458 + + i3459 + + i3460 + + i3461 + + i3462 + + i3463 + + i3464 + + i3465 + + i3466 + + i3467 + + i3468 + + i3469 + + i3470 + + i3471 + + i3472 + + i3473 + + i3474 + + i3475 + + i3476 + + i3477 + + i3478 + + i3479 + + i3480 + + i3481 + + i3482 + + i3483 + + i3484 + + i3485 + + i3486 + + i3487 + + i3488 + + i3489 + + i3490 + + i3491 + + i3492 + + i3493 + + i3494 + + i3495 + + i3496 + + i3497 + + i3498 + + i3499 + + i3500 + + i3501 + + i3502 + + i3503 + + i3504 + + i3505 + + i3506 + + i3507 + + i3508 + + i3509 + + i3510 + + i3511 + + i3512 + + i3513 + + i3514 + + i3515 + + i3516 + + i3517 + + i3518 + + i3519 + + i3520 + + i3521 + + i3522 + + i3523 + + i3524 + + i3525 + + i3526 + + i3527 + + i3528 + + i3529 + + i3530 + + i3531 + + i3532 + + i3533 + + i3534 + + i3535 + + i3536 + + i3537 + + i3538 + + i3539 + + i3540 + + i3541 + + i3542 + + i3543 + + i3544 + + i3545 + + i3546 + + i3547 + + i3548 + + i3549 + + i3550 + + i3551 + + i3552 + + i3553 + + i3554 + + i3555 + + i3556 + + i3557 + + i3558 + + i3559 + + i3560 + + i3561 + + i3562 + + i3563 + + i3564 + + i3565 + + i3566 + + i3567 + + i3568 + + i3569 + + i3570 + + i3571 + + i3572 + + i3573 + + i3574 + + i3575 + + i3576 + + i3577 + + i3578 + + i3579 + + i3580 + + i3581 + + i3582 + + i3583 + + i3584 + + i3585 + + i3586 + + i3587 + + i3588 + + i3589 + + i3590 + + i3591 + + i3592 + + i3593 + + i3594 + + i3595 + + i3596 + + i3597 + + i3598 + + i3599 + + i3600 + + i3601 + + i3602 + + i3603 + + i3604 + + i3605 + + i3606 + + i3607 + + i3608 + + i3609 + + i3610 + + i3611 + + i3612 + + i3613 + + i3614 + + i3615 + + i3616 + + i3617 + + i3618 + + i3619 + + i3620 + + i3621 + + i3622 + + i3623 + + i3624 + + i3625 + + i3626 + + i3627 + + i3628 + + i3629 + + i3630 + + i3631 + + i3632 + + i3633 + + i3634 + + i3635 + + i3636 + + i3637 + + i3638 + + i3639 + + i3640 + + i3641 + + i3642 + + i3643 + + i3644 + + i3645 + + i3646 + + i3647 + + i3648 + + i3649 + + i3650 + + i3651 + + i3652 + + i3653 + + i3654 + + i3655 + + i3656 + + i3657 + + i3658 + + i3659 + + i3660 + + i3661 + + i3662 + + i3663 + + i3664 + + i3665 + + i3666 + + i3667 + + i3668 + + i3669 + + i3670 + + i3671 + + i3672 + + i3673 + + i3674 + + i3675 + + i3676 + + i3677 + + i3678 + + i3679 + + i3680 + + i3681 + + i3682 + + i3683 + + i3684 + + i3685 + + i3686 + + i3687 + + i3688 + + i3689 + + i3690 + + i3691 + + i3692 + + i3693 + + i3694 + + i3695 + + i3696 + + i3697 + + i3698 + + i3699 + + i3700 + + i3701 + + i3702 + + i3703 + + i3704 + + i3705 + + i3706 + + i3707 + + i3708 + + i3709 + + i3710 + + i3711 + + i3712 + + i3713 + + i3714 + + i3715 + + i3716 + + i3717 + + i3718 + + i3719 + + i3720 + + i3721 + + i3722 + + i3723 + + i3724 + + i3725 + + i3726 + + i3727 + + i3728 + + i3729 + + i3730 + + i3731 + + i3732 + + i3733 + + i3734 + + i3735 + + i3736 + + i3737 + + i3738 + + i3739 + + i3740 + + i3741 + + i3742 + + i3743 + + i3744 + + i3745 + + i3746 + + i3747 + + i3748 + + i3749 + + i3750 + + i3751 + + i3752 + + i3753 + + i3754 + + i3755 + + i3756 + + i3757 + + i3758 + + i3759 + + i3760 + + i3761 + + i3762 + + i3763 + + i3764 + + i3765 + + i3766 + + i3767 + + i3768 + + i3769 + + i3770 + + i3771 + + i3772 + + i3773 + + i3774 + + i3775 + + i3776 + + i3777 + + i3778 + + i3779 + + i3780 + + i3781 + + i3782 + + i3783 + + i3784 + + i3785 + + i3786 + + i3787 + + i3788 + + i3789 + + i3790 + + i3791 + + i3792 + + i3793 + + i3794 + + i3795 + + i3796 + + i3797 + + i3798 + + i3799 + + i3800 + + i3801 + + i3802 + + i3803 + + i3804 + + i3805 + + i3806 + + i3807 + + i3808 + + i3809 + + i3810 + + i3811 + + i3812 + + i3813 + + i3814 + + i3815 + + i3816 + + i3817 + + i3818 + + i3819 + + i3820 + + i3821 + + i3822 + + i3823 + + i3824 + + i3825 + + i3826 + + i3827 + + i3828 + + i3829 + + i3830 + + i3831 + + i3832 + + i3833 + + i3834 + + i3835 + + i3836 + + i3837 + + i3838 + + i3839 + + i3840 + + i3841 + + i3842 + + i3843 + + i3844 + + i3845 + + i3846 + + i3847 + + i3848 + + i3849 + + i3850 + + i3851 + + i3852 + + i3853 + + i3854 + + i3855 + + i3856 + + i3857 + + i3858 + + i3859 + + i3860 + + i3861 + + i3862 + + i3863 + + i3864 + + i3865 + + i3866 + + i3867 + + i3868 + + i3869 + + i3870 + + i3871 + + i3872 + + i3873 + + i3874 + + i3875 + + i3876 + + i3877 + + i3878 + + i3879 + + i3880 + + i3881 + + i3882 + + i3883 + + i3884 + + i3885 + + i3886 + + i3887 + + i3888 + + i3889 + + i3890 + + i3891 + + i3892 + + i3893 + + i3894 + + i3895 + + i3896 + + i3897 + + i3898 + + i3899 + + i3900 + + i3901 + + i3902 + + i3903 + + i3904 + + i3905 + + i3906 + + i3907 + + i3908 + + i3909 + + i3910 + + i3911 + + i3912 + + i3913 + + i3914 + + i3915 + + i3916 + + i3917 + + i3918 + + i3919 + + i3920 + + i3921 + + i3922 + + i3923 + + i3924 + + i3925 + + i3926 + + i3927 + + i3928 + + i3929 + + i3930 + + i3931 + + i3932 + + i3933 + + i3934 + + i3935 + + i3936 + + i3937 + + i3938 + + i3939 + + i3940 + + i3941 + + i3942 + + i3943 + + i3944 + + i3945 + + i3946 + + i3947 + + i3948 + + i3949 + + i3950 + + i3951 + + i3952 + + i3953 + + i3954 + + i3955 + + i3956 + + i3957 + + i3958 + + i3959 + + i3960 + + i3961 + + i3962 + + i3963 + + i3964 + + i3965 + + i3966 + + i3967 + + i3968 + + i3969 + + i3970 + + i3971 + + i3972 + + i3973 + + i3974 + + i3975 + + i3976 + + i3977 + + i3978 + + i3979 + + i3980 + + i3981 + + i3982 + + i3983 + + i3984 + + i3985 + + i3986 + + i3987 + + i3988 + + i3989 + + i3990 + + i3991 + + i3992 + + i3993 + + i3994 + + i3995 + + i3996 + + i3997 + + i3998 + + i3999 + + ; + + Console.Write("BigArgSpace: "); + Console.WriteLine(result); + } + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + public static void SmallArgSpace(long i1, long i2, long i3, long i4, long i5, long i6, long i7, long i8, long i9, long i10) + { + long result = i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10; + Console.Write("SmallArgSpace: "); + Console.WriteLine(result); + } + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + public unsafe static void Test1(int n) + { + Console.WriteLine("Enter Test1"); + + BigArgSpace( + + 0, + 1, + 2, + 3, + 4, + 5, + 6, + 7, + 8, + 9, + 10, + 11, + 12, + 13, + 14, + 15, + 16, + 17, + 18, + 19, + 20, + 21, + 22, + 23, + 24, + 25, + 26, + 27, + 28, + 29, + 30, + 31, + 32, + 33, + 34, + 35, + 36, + 37, + 38, + 39, + 40, + 41, + 42, + 43, + 44, + 45, + 46, + 47, + 48, + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57, + 58, + 59, + 60, + 61, + 62, + 63, + 64, + 65, + 66, + 67, + 68, + 69, + 70, + 71, + 72, + 73, + 74, + 75, + 76, + 77, + 78, + 79, + 80, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89, + 90, + 91, + 92, + 93, + 94, + 95, + 96, + 97, + 98, + 99, + 100, + 101, + 102, + 103, + 104, + 105, + 106, + 107, + 108, + 109, + 110, + 111, + 112, + 113, + 114, + 115, + 116, + 117, + 118, + 119, + 120, + 121, + 122, + 123, + 124, + 125, + 126, + 127, + 128, + 129, + 130, + 131, + 132, + 133, + 134, + 135, + 136, + 137, + 138, + 139, + 140, + 141, + 142, + 143, + 144, + 145, + 146, + 147, + 148, + 149, + 150, + 151, + 152, + 153, + 154, + 155, + 156, + 157, + 158, + 159, + 160, + 161, + 162, + 163, + 164, + 165, + 166, + 167, + 168, + 169, + 170, + 171, + 172, + 173, + 174, + 175, + 176, + 177, + 178, + 179, + 180, + 181, + 182, + 183, + 184, + 185, + 186, + 187, + 188, + 189, + 190, + 191, + 192, + 193, + 194, + 195, + 196, + 197, + 198, + 199, + 200, + 201, + 202, + 203, + 204, + 205, + 206, + 207, + 208, + 209, + 210, + 211, + 212, + 213, + 214, + 215, + 216, + 217, + 218, + 219, + 220, + 221, + 222, + 223, + 224, + 225, + 226, + 227, + 228, + 229, + 230, + 231, + 232, + 233, + 234, + 235, + 236, + 237, + 238, + 239, + 240, + 241, + 242, + 243, + 244, + 245, + 246, + 247, + 248, + 249, + 250, + 251, + 252, + 253, + 254, + 255, + 256, + 257, + 258, + 259, + 260, + 261, + 262, + 263, + 264, + 265, + 266, + 267, + 268, + 269, + 270, + 271, + 272, + 273, + 274, + 275, + 276, + 277, + 278, + 279, + 280, + 281, + 282, + 283, + 284, + 285, + 286, + 287, + 288, + 289, + 290, + 291, + 292, + 293, + 294, + 295, + 296, + 297, + 298, + 299, + 300, + 301, + 302, + 303, + 304, + 305, + 306, + 307, + 308, + 309, + 310, + 311, + 312, + 313, + 314, + 315, + 316, + 317, + 318, + 319, + 320, + 321, + 322, + 323, + 324, + 325, + 326, + 327, + 328, + 329, + 330, + 331, + 332, + 333, + 334, + 335, + 336, + 337, + 338, + 339, + 340, + 341, + 342, + 343, + 344, + 345, + 346, + 347, + 348, + 349, + 350, + 351, + 352, + 353, + 354, + 355, + 356, + 357, + 358, + 359, + 360, + 361, + 362, + 363, + 364, + 365, + 366, + 367, + 368, + 369, + 370, + 371, + 372, + 373, + 374, + 375, + 376, + 377, + 378, + 379, + 380, + 381, + 382, + 383, + 384, + 385, + 386, + 387, + 388, + 389, + 390, + 391, + 392, + 393, + 394, + 395, + 396, + 397, + 398, + 399, + 400, + 401, + 402, + 403, + 404, + 405, + 406, + 407, + 408, + 409, + 410, + 411, + 412, + 413, + 414, + 415, + 416, + 417, + 418, + 419, + 420, + 421, + 422, + 423, + 424, + 425, + 426, + 427, + 428, + 429, + 430, + 431, + 432, + 433, + 434, + 435, + 436, + 437, + 438, + 439, + 440, + 441, + 442, + 443, + 444, + 445, + 446, + 447, + 448, + 449, + 450, + 451, + 452, + 453, + 454, + 455, + 456, + 457, + 458, + 459, + 460, + 461, + 462, + 463, + 464, + 465, + 466, + 467, + 468, + 469, + 470, + 471, + 472, + 473, + 474, + 475, + 476, + 477, + 478, + 479, + 480, + 481, + 482, + 483, + 484, + 485, + 486, + 487, + 488, + 489, + 490, + 491, + 492, + 493, + 494, + 495, + 496, + 497, + 498, + 499, + 500, + 501, + 502, + 503, + 504, + 505, + 506, + 507, + 508, + 509, + 510, + 511, + 512, + 513, + 514, + 515, + 516, + 517, + 518, + 519, + 520, + 521, + 522, + 523, + 524, + 525, + 526, + 527, + 528, + 529, + 530, + 531, + 532, + 533, + 534, + 535, + 536, + 537, + 538, + 539, + 540, + 541, + 542, + 543, + 544, + 545, + 546, + 547, + 548, + 549, + 550, + 551, + 552, + 553, + 554, + 555, + 556, + 557, + 558, + 559, + 560, + 561, + 562, + 563, + 564, + 565, + 566, + 567, + 568, + 569, + 570, + 571, + 572, + 573, + 574, + 575, + 576, + 577, + 578, + 579, + 580, + 581, + 582, + 583, + 584, + 585, + 586, + 587, + 588, + 589, + 590, + 591, + 592, + 593, + 594, + 595, + 596, + 597, + 598, + 599, + 600, + 601, + 602, + 603, + 604, + 605, + 606, + 607, + 608, + 609, + 610, + 611, + 612, + 613, + 614, + 615, + 616, + 617, + 618, + 619, + 620, + 621, + 622, + 623, + 624, + 625, + 626, + 627, + 628, + 629, + 630, + 631, + 632, + 633, + 634, + 635, + 636, + 637, + 638, + 639, + 640, + 641, + 642, + 643, + 644, + 645, + 646, + 647, + 648, + 649, + 650, + 651, + 652, + 653, + 654, + 655, + 656, + 657, + 658, + 659, + 660, + 661, + 662, + 663, + 664, + 665, + 666, + 667, + 668, + 669, + 670, + 671, + 672, + 673, + 674, + 675, + 676, + 677, + 678, + 679, + 680, + 681, + 682, + 683, + 684, + 685, + 686, + 687, + 688, + 689, + 690, + 691, + 692, + 693, + 694, + 695, + 696, + 697, + 698, + 699, + 700, + 701, + 702, + 703, + 704, + 705, + 706, + 707, + 708, + 709, + 710, + 711, + 712, + 713, + 714, + 715, + 716, + 717, + 718, + 719, + 720, + 721, + 722, + 723, + 724, + 725, + 726, + 727, + 728, + 729, + 730, + 731, + 732, + 733, + 734, + 735, + 736, + 737, + 738, + 739, + 740, + 741, + 742, + 743, + 744, + 745, + 746, + 747, + 748, + 749, + 750, + 751, + 752, + 753, + 754, + 755, + 756, + 757, + 758, + 759, + 760, + 761, + 762, + 763, + 764, + 765, + 766, + 767, + 768, + 769, + 770, + 771, + 772, + 773, + 774, + 775, + 776, + 777, + 778, + 779, + 780, + 781, + 782, + 783, + 784, + 785, + 786, + 787, + 788, + 789, + 790, + 791, + 792, + 793, + 794, + 795, + 796, + 797, + 798, + 799, + 800, + 801, + 802, + 803, + 804, + 805, + 806, + 807, + 808, + 809, + 810, + 811, + 812, + 813, + 814, + 815, + 816, + 817, + 818, + 819, + 820, + 821, + 822, + 823, + 824, + 825, + 826, + 827, + 828, + 829, + 830, + 831, + 832, + 833, + 834, + 835, + 836, + 837, + 838, + 839, + 840, + 841, + 842, + 843, + 844, + 845, + 846, + 847, + 848, + 849, + 850, + 851, + 852, + 853, + 854, + 855, + 856, + 857, + 858, + 859, + 860, + 861, + 862, + 863, + 864, + 865, + 866, + 867, + 868, + 869, + 870, + 871, + 872, + 873, + 874, + 875, + 876, + 877, + 878, + 879, + 880, + 881, + 882, + 883, + 884, + 885, + 886, + 887, + 888, + 889, + 890, + 891, + 892, + 893, + 894, + 895, + 896, + 897, + 898, + 899, + 900, + 901, + 902, + 903, + 904, + 905, + 906, + 907, + 908, + 909, + 910, + 911, + 912, + 913, + 914, + 915, + 916, + 917, + 918, + 919, + 920, + 921, + 922, + 923, + 924, + 925, + 926, + 927, + 928, + 929, + 930, + 931, + 932, + 933, + 934, + 935, + 936, + 937, + 938, + 939, + 940, + 941, + 942, + 943, + 944, + 945, + 946, + 947, + 948, + 949, + 950, + 951, + 952, + 953, + 954, + 955, + 956, + 957, + 958, + 959, + 960, + 961, + 962, + 963, + 964, + 965, + 966, + 967, + 968, + 969, + 970, + 971, + 972, + 973, + 974, + 975, + 976, + 977, + 978, + 979, + 980, + 981, + 982, + 983, + 984, + 985, + 986, + 987, + 988, + 989, + 990, + 991, + 992, + 993, + 994, + 995, + 996, + 997, + 998, + 999, + 1000, + 1001, + 1002, + 1003, + 1004, + 1005, + 1006, + 1007, + 1008, + 1009, + 1010, + 1011, + 1012, + 1013, + 1014, + 1015, + 1016, + 1017, + 1018, + 1019, + 1020, + 1021, + 1022, + 1023, + 1024, + 1025, + 1026, + 1027, + 1028, + 1029, + 1030, + 1031, + 1032, + 1033, + 1034, + 1035, + 1036, + 1037, + 1038, + 1039, + 1040, + 1041, + 1042, + 1043, + 1044, + 1045, + 1046, + 1047, + 1048, + 1049, + 1050, + 1051, + 1052, + 1053, + 1054, + 1055, + 1056, + 1057, + 1058, + 1059, + 1060, + 1061, + 1062, + 1063, + 1064, + 1065, + 1066, + 1067, + 1068, + 1069, + 1070, + 1071, + 1072, + 1073, + 1074, + 1075, + 1076, + 1077, + 1078, + 1079, + 1080, + 1081, + 1082, + 1083, + 1084, + 1085, + 1086, + 1087, + 1088, + 1089, + 1090, + 1091, + 1092, + 1093, + 1094, + 1095, + 1096, + 1097, + 1098, + 1099, + 1100, + 1101, + 1102, + 1103, + 1104, + 1105, + 1106, + 1107, + 1108, + 1109, + 1110, + 1111, + 1112, + 1113, + 1114, + 1115, + 1116, + 1117, + 1118, + 1119, + 1120, + 1121, + 1122, + 1123, + 1124, + 1125, + 1126, + 1127, + 1128, + 1129, + 1130, + 1131, + 1132, + 1133, + 1134, + 1135, + 1136, + 1137, + 1138, + 1139, + 1140, + 1141, + 1142, + 1143, + 1144, + 1145, + 1146, + 1147, + 1148, + 1149, + 1150, + 1151, + 1152, + 1153, + 1154, + 1155, + 1156, + 1157, + 1158, + 1159, + 1160, + 1161, + 1162, + 1163, + 1164, + 1165, + 1166, + 1167, + 1168, + 1169, + 1170, + 1171, + 1172, + 1173, + 1174, + 1175, + 1176, + 1177, + 1178, + 1179, + 1180, + 1181, + 1182, + 1183, + 1184, + 1185, + 1186, + 1187, + 1188, + 1189, + 1190, + 1191, + 1192, + 1193, + 1194, + 1195, + 1196, + 1197, + 1198, + 1199, + 1200, + 1201, + 1202, + 1203, + 1204, + 1205, + 1206, + 1207, + 1208, + 1209, + 1210, + 1211, + 1212, + 1213, + 1214, + 1215, + 1216, + 1217, + 1218, + 1219, + 1220, + 1221, + 1222, + 1223, + 1224, + 1225, + 1226, + 1227, + 1228, + 1229, + 1230, + 1231, + 1232, + 1233, + 1234, + 1235, + 1236, + 1237, + 1238, + 1239, + 1240, + 1241, + 1242, + 1243, + 1244, + 1245, + 1246, + 1247, + 1248, + 1249, + 1250, + 1251, + 1252, + 1253, + 1254, + 1255, + 1256, + 1257, + 1258, + 1259, + 1260, + 1261, + 1262, + 1263, + 1264, + 1265, + 1266, + 1267, + 1268, + 1269, + 1270, + 1271, + 1272, + 1273, + 1274, + 1275, + 1276, + 1277, + 1278, + 1279, + 1280, + 1281, + 1282, + 1283, + 1284, + 1285, + 1286, + 1287, + 1288, + 1289, + 1290, + 1291, + 1292, + 1293, + 1294, + 1295, + 1296, + 1297, + 1298, + 1299, + 1300, + 1301, + 1302, + 1303, + 1304, + 1305, + 1306, + 1307, + 1308, + 1309, + 1310, + 1311, + 1312, + 1313, + 1314, + 1315, + 1316, + 1317, + 1318, + 1319, + 1320, + 1321, + 1322, + 1323, + 1324, + 1325, + 1326, + 1327, + 1328, + 1329, + 1330, + 1331, + 1332, + 1333, + 1334, + 1335, + 1336, + 1337, + 1338, + 1339, + 1340, + 1341, + 1342, + 1343, + 1344, + 1345, + 1346, + 1347, + 1348, + 1349, + 1350, + 1351, + 1352, + 1353, + 1354, + 1355, + 1356, + 1357, + 1358, + 1359, + 1360, + 1361, + 1362, + 1363, + 1364, + 1365, + 1366, + 1367, + 1368, + 1369, + 1370, + 1371, + 1372, + 1373, + 1374, + 1375, + 1376, + 1377, + 1378, + 1379, + 1380, + 1381, + 1382, + 1383, + 1384, + 1385, + 1386, + 1387, + 1388, + 1389, + 1390, + 1391, + 1392, + 1393, + 1394, + 1395, + 1396, + 1397, + 1398, + 1399, + 1400, + 1401, + 1402, + 1403, + 1404, + 1405, + 1406, + 1407, + 1408, + 1409, + 1410, + 1411, + 1412, + 1413, + 1414, + 1415, + 1416, + 1417, + 1418, + 1419, + 1420, + 1421, + 1422, + 1423, + 1424, + 1425, + 1426, + 1427, + 1428, + 1429, + 1430, + 1431, + 1432, + 1433, + 1434, + 1435, + 1436, + 1437, + 1438, + 1439, + 1440, + 1441, + 1442, + 1443, + 1444, + 1445, + 1446, + 1447, + 1448, + 1449, + 1450, + 1451, + 1452, + 1453, + 1454, + 1455, + 1456, + 1457, + 1458, + 1459, + 1460, + 1461, + 1462, + 1463, + 1464, + 1465, + 1466, + 1467, + 1468, + 1469, + 1470, + 1471, + 1472, + 1473, + 1474, + 1475, + 1476, + 1477, + 1478, + 1479, + 1480, + 1481, + 1482, + 1483, + 1484, + 1485, + 1486, + 1487, + 1488, + 1489, + 1490, + 1491, + 1492, + 1493, + 1494, + 1495, + 1496, + 1497, + 1498, + 1499, + 1500, + 1501, + 1502, + 1503, + 1504, + 1505, + 1506, + 1507, + 1508, + 1509, + 1510, + 1511, + 1512, + 1513, + 1514, + 1515, + 1516, + 1517, + 1518, + 1519, + 1520, + 1521, + 1522, + 1523, + 1524, + 1525, + 1526, + 1527, + 1528, + 1529, + 1530, + 1531, + 1532, + 1533, + 1534, + 1535, + 1536, + 1537, + 1538, + 1539, + 1540, + 1541, + 1542, + 1543, + 1544, + 1545, + 1546, + 1547, + 1548, + 1549, + 1550, + 1551, + 1552, + 1553, + 1554, + 1555, + 1556, + 1557, + 1558, + 1559, + 1560, + 1561, + 1562, + 1563, + 1564, + 1565, + 1566, + 1567, + 1568, + 1569, + 1570, + 1571, + 1572, + 1573, + 1574, + 1575, + 1576, + 1577, + 1578, + 1579, + 1580, + 1581, + 1582, + 1583, + 1584, + 1585, + 1586, + 1587, + 1588, + 1589, + 1590, + 1591, + 1592, + 1593, + 1594, + 1595, + 1596, + 1597, + 1598, + 1599, + 1600, + 1601, + 1602, + 1603, + 1604, + 1605, + 1606, + 1607, + 1608, + 1609, + 1610, + 1611, + 1612, + 1613, + 1614, + 1615, + 1616, + 1617, + 1618, + 1619, + 1620, + 1621, + 1622, + 1623, + 1624, + 1625, + 1626, + 1627, + 1628, + 1629, + 1630, + 1631, + 1632, + 1633, + 1634, + 1635, + 1636, + 1637, + 1638, + 1639, + 1640, + 1641, + 1642, + 1643, + 1644, + 1645, + 1646, + 1647, + 1648, + 1649, + 1650, + 1651, + 1652, + 1653, + 1654, + 1655, + 1656, + 1657, + 1658, + 1659, + 1660, + 1661, + 1662, + 1663, + 1664, + 1665, + 1666, + 1667, + 1668, + 1669, + 1670, + 1671, + 1672, + 1673, + 1674, + 1675, + 1676, + 1677, + 1678, + 1679, + 1680, + 1681, + 1682, + 1683, + 1684, + 1685, + 1686, + 1687, + 1688, + 1689, + 1690, + 1691, + 1692, + 1693, + 1694, + 1695, + 1696, + 1697, + 1698, + 1699, + 1700, + 1701, + 1702, + 1703, + 1704, + 1705, + 1706, + 1707, + 1708, + 1709, + 1710, + 1711, + 1712, + 1713, + 1714, + 1715, + 1716, + 1717, + 1718, + 1719, + 1720, + 1721, + 1722, + 1723, + 1724, + 1725, + 1726, + 1727, + 1728, + 1729, + 1730, + 1731, + 1732, + 1733, + 1734, + 1735, + 1736, + 1737, + 1738, + 1739, + 1740, + 1741, + 1742, + 1743, + 1744, + 1745, + 1746, + 1747, + 1748, + 1749, + 1750, + 1751, + 1752, + 1753, + 1754, + 1755, + 1756, + 1757, + 1758, + 1759, + 1760, + 1761, + 1762, + 1763, + 1764, + 1765, + 1766, + 1767, + 1768, + 1769, + 1770, + 1771, + 1772, + 1773, + 1774, + 1775, + 1776, + 1777, + 1778, + 1779, + 1780, + 1781, + 1782, + 1783, + 1784, + 1785, + 1786, + 1787, + 1788, + 1789, + 1790, + 1791, + 1792, + 1793, + 1794, + 1795, + 1796, + 1797, + 1798, + 1799, + 1800, + 1801, + 1802, + 1803, + 1804, + 1805, + 1806, + 1807, + 1808, + 1809, + 1810, + 1811, + 1812, + 1813, + 1814, + 1815, + 1816, + 1817, + 1818, + 1819, + 1820, + 1821, + 1822, + 1823, + 1824, + 1825, + 1826, + 1827, + 1828, + 1829, + 1830, + 1831, + 1832, + 1833, + 1834, + 1835, + 1836, + 1837, + 1838, + 1839, + 1840, + 1841, + 1842, + 1843, + 1844, + 1845, + 1846, + 1847, + 1848, + 1849, + 1850, + 1851, + 1852, + 1853, + 1854, + 1855, + 1856, + 1857, + 1858, + 1859, + 1860, + 1861, + 1862, + 1863, + 1864, + 1865, + 1866, + 1867, + 1868, + 1869, + 1870, + 1871, + 1872, + 1873, + 1874, + 1875, + 1876, + 1877, + 1878, + 1879, + 1880, + 1881, + 1882, + 1883, + 1884, + 1885, + 1886, + 1887, + 1888, + 1889, + 1890, + 1891, + 1892, + 1893, + 1894, + 1895, + 1896, + 1897, + 1898, + 1899, + 1900, + 1901, + 1902, + 1903, + 1904, + 1905, + 1906, + 1907, + 1908, + 1909, + 1910, + 1911, + 1912, + 1913, + 1914, + 1915, + 1916, + 1917, + 1918, + 1919, + 1920, + 1921, + 1922, + 1923, + 1924, + 1925, + 1926, + 1927, + 1928, + 1929, + 1930, + 1931, + 1932, + 1933, + 1934, + 1935, + 1936, + 1937, + 1938, + 1939, + 1940, + 1941, + 1942, + 1943, + 1944, + 1945, + 1946, + 1947, + 1948, + 1949, + 1950, + 1951, + 1952, + 1953, + 1954, + 1955, + 1956, + 1957, + 1958, + 1959, + 1960, + 1961, + 1962, + 1963, + 1964, + 1965, + 1966, + 1967, + 1968, + 1969, + 1970, + 1971, + 1972, + 1973, + 1974, + 1975, + 1976, + 1977, + 1978, + 1979, + 1980, + 1981, + 1982, + 1983, + 1984, + 1985, + 1986, + 1987, + 1988, + 1989, + 1990, + 1991, + 1992, + 1993, + 1994, + 1995, + 1996, + 1997, + 1998, + 1999, + 2000, + 2001, + 2002, + 2003, + 2004, + 2005, + 2006, + 2007, + 2008, + 2009, + 2010, + 2011, + 2012, + 2013, + 2014, + 2015, + 2016, + 2017, + 2018, + 2019, + 2020, + 2021, + 2022, + 2023, + 2024, + 2025, + 2026, + 2027, + 2028, + 2029, + 2030, + 2031, + 2032, + 2033, + 2034, + 2035, + 2036, + 2037, + 2038, + 2039, + 2040, + 2041, + 2042, + 2043, + 2044, + 2045, + 2046, + 2047, + 2048, + 2049, + 2050, + 2051, + 2052, + 2053, + 2054, + 2055, + 2056, + 2057, + 2058, + 2059, + 2060, + 2061, + 2062, + 2063, + 2064, + 2065, + 2066, + 2067, + 2068, + 2069, + 2070, + 2071, + 2072, + 2073, + 2074, + 2075, + 2076, + 2077, + 2078, + 2079, + 2080, + 2081, + 2082, + 2083, + 2084, + 2085, + 2086, + 2087, + 2088, + 2089, + 2090, + 2091, + 2092, + 2093, + 2094, + 2095, + 2096, + 2097, + 2098, + 2099, + 2100, + 2101, + 2102, + 2103, + 2104, + 2105, + 2106, + 2107, + 2108, + 2109, + 2110, + 2111, + 2112, + 2113, + 2114, + 2115, + 2116, + 2117, + 2118, + 2119, + 2120, + 2121, + 2122, + 2123, + 2124, + 2125, + 2126, + 2127, + 2128, + 2129, + 2130, + 2131, + 2132, + 2133, + 2134, + 2135, + 2136, + 2137, + 2138, + 2139, + 2140, + 2141, + 2142, + 2143, + 2144, + 2145, + 2146, + 2147, + 2148, + 2149, + 2150, + 2151, + 2152, + 2153, + 2154, + 2155, + 2156, + 2157, + 2158, + 2159, + 2160, + 2161, + 2162, + 2163, + 2164, + 2165, + 2166, + 2167, + 2168, + 2169, + 2170, + 2171, + 2172, + 2173, + 2174, + 2175, + 2176, + 2177, + 2178, + 2179, + 2180, + 2181, + 2182, + 2183, + 2184, + 2185, + 2186, + 2187, + 2188, + 2189, + 2190, + 2191, + 2192, + 2193, + 2194, + 2195, + 2196, + 2197, + 2198, + 2199, + 2200, + 2201, + 2202, + 2203, + 2204, + 2205, + 2206, + 2207, + 2208, + 2209, + 2210, + 2211, + 2212, + 2213, + 2214, + 2215, + 2216, + 2217, + 2218, + 2219, + 2220, + 2221, + 2222, + 2223, + 2224, + 2225, + 2226, + 2227, + 2228, + 2229, + 2230, + 2231, + 2232, + 2233, + 2234, + 2235, + 2236, + 2237, + 2238, + 2239, + 2240, + 2241, + 2242, + 2243, + 2244, + 2245, + 2246, + 2247, + 2248, + 2249, + 2250, + 2251, + 2252, + 2253, + 2254, + 2255, + 2256, + 2257, + 2258, + 2259, + 2260, + 2261, + 2262, + 2263, + 2264, + 2265, + 2266, + 2267, + 2268, + 2269, + 2270, + 2271, + 2272, + 2273, + 2274, + 2275, + 2276, + 2277, + 2278, + 2279, + 2280, + 2281, + 2282, + 2283, + 2284, + 2285, + 2286, + 2287, + 2288, + 2289, + 2290, + 2291, + 2292, + 2293, + 2294, + 2295, + 2296, + 2297, + 2298, + 2299, + 2300, + 2301, + 2302, + 2303, + 2304, + 2305, + 2306, + 2307, + 2308, + 2309, + 2310, + 2311, + 2312, + 2313, + 2314, + 2315, + 2316, + 2317, + 2318, + 2319, + 2320, + 2321, + 2322, + 2323, + 2324, + 2325, + 2326, + 2327, + 2328, + 2329, + 2330, + 2331, + 2332, + 2333, + 2334, + 2335, + 2336, + 2337, + 2338, + 2339, + 2340, + 2341, + 2342, + 2343, + 2344, + 2345, + 2346, + 2347, + 2348, + 2349, + 2350, + 2351, + 2352, + 2353, + 2354, + 2355, + 2356, + 2357, + 2358, + 2359, + 2360, + 2361, + 2362, + 2363, + 2364, + 2365, + 2366, + 2367, + 2368, + 2369, + 2370, + 2371, + 2372, + 2373, + 2374, + 2375, + 2376, + 2377, + 2378, + 2379, + 2380, + 2381, + 2382, + 2383, + 2384, + 2385, + 2386, + 2387, + 2388, + 2389, + 2390, + 2391, + 2392, + 2393, + 2394, + 2395, + 2396, + 2397, + 2398, + 2399, + 2400, + 2401, + 2402, + 2403, + 2404, + 2405, + 2406, + 2407, + 2408, + 2409, + 2410, + 2411, + 2412, + 2413, + 2414, + 2415, + 2416, + 2417, + 2418, + 2419, + 2420, + 2421, + 2422, + 2423, + 2424, + 2425, + 2426, + 2427, + 2428, + 2429, + 2430, + 2431, + 2432, + 2433, + 2434, + 2435, + 2436, + 2437, + 2438, + 2439, + 2440, + 2441, + 2442, + 2443, + 2444, + 2445, + 2446, + 2447, + 2448, + 2449, + 2450, + 2451, + 2452, + 2453, + 2454, + 2455, + 2456, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462, + 2463, + 2464, + 2465, + 2466, + 2467, + 2468, + 2469, + 2470, + 2471, + 2472, + 2473, + 2474, + 2475, + 2476, + 2477, + 2478, + 2479, + 2480, + 2481, + 2482, + 2483, + 2484, + 2485, + 2486, + 2487, + 2488, + 2489, + 2490, + 2491, + 2492, + 2493, + 2494, + 2495, + 2496, + 2497, + 2498, + 2499, + 2500, + 2501, + 2502, + 2503, + 2504, + 2505, + 2506, + 2507, + 2508, + 2509, + 2510, + 2511, + 2512, + 2513, + 2514, + 2515, + 2516, + 2517, + 2518, + 2519, + 2520, + 2521, + 2522, + 2523, + 2524, + 2525, + 2526, + 2527, + 2528, + 2529, + 2530, + 2531, + 2532, + 2533, + 2534, + 2535, + 2536, + 2537, + 2538, + 2539, + 2540, + 2541, + 2542, + 2543, + 2544, + 2545, + 2546, + 2547, + 2548, + 2549, + 2550, + 2551, + 2552, + 2553, + 2554, + 2555, + 2556, + 2557, + 2558, + 2559, + 2560, + 2561, + 2562, + 2563, + 2564, + 2565, + 2566, + 2567, + 2568, + 2569, + 2570, + 2571, + 2572, + 2573, + 2574, + 2575, + 2576, + 2577, + 2578, + 2579, + 2580, + 2581, + 2582, + 2583, + 2584, + 2585, + 2586, + 2587, + 2588, + 2589, + 2590, + 2591, + 2592, + 2593, + 2594, + 2595, + 2596, + 2597, + 2598, + 2599, + 2600, + 2601, + 2602, + 2603, + 2604, + 2605, + 2606, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612, + 2613, + 2614, + 2615, + 2616, + 2617, + 2618, + 2619, + 2620, + 2621, + 2622, + 2623, + 2624, + 2625, + 2626, + 2627, + 2628, + 2629, + 2630, + 2631, + 2632, + 2633, + 2634, + 2635, + 2636, + 2637, + 2638, + 2639, + 2640, + 2641, + 2642, + 2643, + 2644, + 2645, + 2646, + 2647, + 2648, + 2649, + 2650, + 2651, + 2652, + 2653, + 2654, + 2655, + 2656, + 2657, + 2658, + 2659, + 2660, + 2661, + 2662, + 2663, + 2664, + 2665, + 2666, + 2667, + 2668, + 2669, + 2670, + 2671, + 2672, + 2673, + 2674, + 2675, + 2676, + 2677, + 2678, + 2679, + 2680, + 2681, + 2682, + 2683, + 2684, + 2685, + 2686, + 2687, + 2688, + 2689, + 2690, + 2691, + 2692, + 2693, + 2694, + 2695, + 2696, + 2697, + 2698, + 2699, + 2700, + 2701, + 2702, + 2703, + 2704, + 2705, + 2706, + 2707, + 2708, + 2709, + 2710, + 2711, + 2712, + 2713, + 2714, + 2715, + 2716, + 2717, + 2718, + 2719, + 2720, + 2721, + 2722, + 2723, + 2724, + 2725, + 2726, + 2727, + 2728, + 2729, + 2730, + 2731, + 2732, + 2733, + 2734, + 2735, + 2736, + 2737, + 2738, + 2739, + 2740, + 2741, + 2742, + 2743, + 2744, + 2745, + 2746, + 2747, + 2748, + 2749, + 2750, + 2751, + 2752, + 2753, + 2754, + 2755, + 2756, + 2757, + 2758, + 2759, + 2760, + 2761, + 2762, + 2763, + 2764, + 2765, + 2766, + 2767, + 2768, + 2769, + 2770, + 2771, + 2772, + 2773, + 2774, + 2775, + 2776, + 2777, + 2778, + 2779, + 2780, + 2781, + 2782, + 2783, + 2784, + 2785, + 2786, + 2787, + 2788, + 2789, + 2790, + 2791, + 2792, + 2793, + 2794, + 2795, + 2796, + 2797, + 2798, + 2799, + 2800, + 2801, + 2802, + 2803, + 2804, + 2805, + 2806, + 2807, + 2808, + 2809, + 2810, + 2811, + 2812, + 2813, + 2814, + 2815, + 2816, + 2817, + 2818, + 2819, + 2820, + 2821, + 2822, + 2823, + 2824, + 2825, + 2826, + 2827, + 2828, + 2829, + 2830, + 2831, + 2832, + 2833, + 2834, + 2835, + 2836, + 2837, + 2838, + 2839, + 2840, + 2841, + 2842, + 2843, + 2844, + 2845, + 2846, + 2847, + 2848, + 2849, + 2850, + 2851, + 2852, + 2853, + 2854, + 2855, + 2856, + 2857, + 2858, + 2859, + 2860, + 2861, + 2862, + 2863, + 2864, + 2865, + 2866, + 2867, + 2868, + 2869, + 2870, + 2871, + 2872, + 2873, + 2874, + 2875, + 2876, + 2877, + 2878, + 2879, + 2880, + 2881, + 2882, + 2883, + 2884, + 2885, + 2886, + 2887, + 2888, + 2889, + 2890, + 2891, + 2892, + 2893, + 2894, + 2895, + 2896, + 2897, + 2898, + 2899, + 2900, + 2901, + 2902, + 2903, + 2904, + 2905, + 2906, + 2907, + 2908, + 2909, + 2910, + 2911, + 2912, + 2913, + 2914, + 2915, + 2916, + 2917, + 2918, + 2919, + 2920, + 2921, + 2922, + 2923, + 2924, + 2925, + 2926, + 2927, + 2928, + 2929, + 2930, + 2931, + 2932, + 2933, + 2934, + 2935, + 2936, + 2937, + 2938, + 2939, + 2940, + 2941, + 2942, + 2943, + 2944, + 2945, + 2946, + 2947, + 2948, + 2949, + 2950, + 2951, + 2952, + 2953, + 2954, + 2955, + 2956, + 2957, + 2958, + 2959, + 2960, + 2961, + 2962, + 2963, + 2964, + 2965, + 2966, + 2967, + 2968, + 2969, + 2970, + 2971, + 2972, + 2973, + 2974, + 2975, + 2976, + 2977, + 2978, + 2979, + 2980, + 2981, + 2982, + 2983, + 2984, + 2985, + 2986, + 2987, + 2988, + 2989, + 2990, + 2991, + 2992, + 2993, + 2994, + 2995, + 2996, + 2997, + 2998, + 2999, + 3000, + 3001, + 3002, + 3003, + 3004, + 3005, + 3006, + 3007, + 3008, + 3009, + 3010, + 3011, + 3012, + 3013, + 3014, + 3015, + 3016, + 3017, + 3018, + 3019, + 3020, + 3021, + 3022, + 3023, + 3024, + 3025, + 3026, + 3027, + 3028, + 3029, + 3030, + 3031, + 3032, + 3033, + 3034, + 3035, + 3036, + 3037, + 3038, + 3039, + 3040, + 3041, + 3042, + 3043, + 3044, + 3045, + 3046, + 3047, + 3048, + 3049, + 3050, + 3051, + 3052, + 3053, + 3054, + 3055, + 3056, + 3057, + 3058, + 3059, + 3060, + 3061, + 3062, + 3063, + 3064, + 3065, + 3066, + 3067, + 3068, + 3069, + 3070, + 3071, + 3072, + 3073, + 3074, + 3075, + 3076, + 3077, + 3078, + 3079, + 3080, + 3081, + 3082, + 3083, + 3084, + 3085, + 3086, + 3087, + 3088, + 3089, + 3090, + 3091, + 3092, + 3093, + 3094, + 3095, + 3096, + 3097, + 3098, + 3099, + 3100, + 3101, + 3102, + 3103, + 3104, + 3105, + 3106, + 3107, + 3108, + 3109, + 3110, + 3111, + 3112, + 3113, + 3114, + 3115, + 3116, + 3117, + 3118, + 3119, + 3120, + 3121, + 3122, + 3123, + 3124, + 3125, + 3126, + 3127, + 3128, + 3129, + 3130, + 3131, + 3132, + 3133, + 3134, + 3135, + 3136, + 3137, + 3138, + 3139, + 3140, + 3141, + 3142, + 3143, + 3144, + 3145, + 3146, + 3147, + 3148, + 3149, + 3150, + 3151, + 3152, + 3153, + 3154, + 3155, + 3156, + 3157, + 3158, + 3159, + 3160, + 3161, + 3162, + 3163, + 3164, + 3165, + 3166, + 3167, + 3168, + 3169, + 3170, + 3171, + 3172, + 3173, + 3174, + 3175, + 3176, + 3177, + 3178, + 3179, + 3180, + 3181, + 3182, + 3183, + 3184, + 3185, + 3186, + 3187, + 3188, + 3189, + 3190, + 3191, + 3192, + 3193, + 3194, + 3195, + 3196, + 3197, + 3198, + 3199, + 3200, + 3201, + 3202, + 3203, + 3204, + 3205, + 3206, + 3207, + 3208, + 3209, + 3210, + 3211, + 3212, + 3213, + 3214, + 3215, + 3216, + 3217, + 3218, + 3219, + 3220, + 3221, + 3222, + 3223, + 3224, + 3225, + 3226, + 3227, + 3228, + 3229, + 3230, + 3231, + 3232, + 3233, + 3234, + 3235, + 3236, + 3237, + 3238, + 3239, + 3240, + 3241, + 3242, + 3243, + 3244, + 3245, + 3246, + 3247, + 3248, + 3249, + 3250, + 3251, + 3252, + 3253, + 3254, + 3255, + 3256, + 3257, + 3258, + 3259, + 3260, + 3261, + 3262, + 3263, + 3264, + 3265, + 3266, + 3267, + 3268, + 3269, + 3270, + 3271, + 3272, + 3273, + 3274, + 3275, + 3276, + 3277, + 3278, + 3279, + 3280, + 3281, + 3282, + 3283, + 3284, + 3285, + 3286, + 3287, + 3288, + 3289, + 3290, + 3291, + 3292, + 3293, + 3294, + 3295, + 3296, + 3297, + 3298, + 3299, + 3300, + 3301, + 3302, + 3303, + 3304, + 3305, + 3306, + 3307, + 3308, + 3309, + 3310, + 3311, + 3312, + 3313, + 3314, + 3315, + 3316, + 3317, + 3318, + 3319, + 3320, + 3321, + 3322, + 3323, + 3324, + 3325, + 3326, + 3327, + 3328, + 3329, + 3330, + 3331, + 3332, + 3333, + 3334, + 3335, + 3336, + 3337, + 3338, + 3339, + 3340, + 3341, + 3342, + 3343, + 3344, + 3345, + 3346, + 3347, + 3348, + 3349, + 3350, + 3351, + 3352, + 3353, + 3354, + 3355, + 3356, + 3357, + 3358, + 3359, + 3360, + 3361, + 3362, + 3363, + 3364, + 3365, + 3366, + 3367, + 3368, + 3369, + 3370, + 3371, + 3372, + 3373, + 3374, + 3375, + 3376, + 3377, + 3378, + 3379, + 3380, + 3381, + 3382, + 3383, + 3384, + 3385, + 3386, + 3387, + 3388, + 3389, + 3390, + 3391, + 3392, + 3393, + 3394, + 3395, + 3396, + 3397, + 3398, + 3399, + 3400, + 3401, + 3402, + 3403, + 3404, + 3405, + 3406, + 3407, + 3408, + 3409, + 3410, + 3411, + 3412, + 3413, + 3414, + 3415, + 3416, + 3417, + 3418, + 3419, + 3420, + 3421, + 3422, + 3423, + 3424, + 3425, + 3426, + 3427, + 3428, + 3429, + 3430, + 3431, + 3432, + 3433, + 3434, + 3435, + 3436, + 3437, + 3438, + 3439, + 3440, + 3441, + 3442, + 3443, + 3444, + 3445, + 3446, + 3447, + 3448, + 3449, + 3450, + 3451, + 3452, + 3453, + 3454, + 3455, + 3456, + 3457, + 3458, + 3459, + 3460, + 3461, + 3462, + 3463, + 3464, + 3465, + 3466, + 3467, + 3468, + 3469, + 3470, + 3471, + 3472, + 3473, + 3474, + 3475, + 3476, + 3477, + 3478, + 3479, + 3480, + 3481, + 3482, + 3483, + 3484, + 3485, + 3486, + 3487, + 3488, + 3489, + 3490, + 3491, + 3492, + 3493, + 3494, + 3495, + 3496, + 3497, + 3498, + 3499, + 3500, + 3501, + 3502, + 3503, + 3504, + 3505, + 3506, + 3507, + 3508, + 3509, + 3510, + 3511, + 3512, + 3513, + 3514, + 3515, + 3516, + 3517, + 3518, + 3519, + 3520, + 3521, + 3522, + 3523, + 3524, + 3525, + 3526, + 3527, + 3528, + 3529, + 3530, + 3531, + 3532, + 3533, + 3534, + 3535, + 3536, + 3537, + 3538, + 3539, + 3540, + 3541, + 3542, + 3543, + 3544, + 3545, + 3546, + 3547, + 3548, + 3549, + 3550, + 3551, + 3552, + 3553, + 3554, + 3555, + 3556, + 3557, + 3558, + 3559, + 3560, + 3561, + 3562, + 3563, + 3564, + 3565, + 3566, + 3567, + 3568, + 3569, + 3570, + 3571, + 3572, + 3573, + 3574, + 3575, + 3576, + 3577, + 3578, + 3579, + 3580, + 3581, + 3582, + 3583, + 3584, + 3585, + 3586, + 3587, + 3588, + 3589, + 3590, + 3591, + 3592, + 3593, + 3594, + 3595, + 3596, + 3597, + 3598, + 3599, + 3600, + 3601, + 3602, + 3603, + 3604, + 3605, + 3606, + 3607, + 3608, + 3609, + 3610, + 3611, + 3612, + 3613, + 3614, + 3615, + 3616, + 3617, + 3618, + 3619, + 3620, + 3621, + 3622, + 3623, + 3624, + 3625, + 3626, + 3627, + 3628, + 3629, + 3630, + 3631, + 3632, + 3633, + 3634, + 3635, + 3636, + 3637, + 3638, + 3639, + 3640, + 3641, + 3642, + 3643, + 3644, + 3645, + 3646, + 3647, + 3648, + 3649, + 3650, + 3651, + 3652, + 3653, + 3654, + 3655, + 3656, + 3657, + 3658, + 3659, + 3660, + 3661, + 3662, + 3663, + 3664, + 3665, + 3666, + 3667, + 3668, + 3669, + 3670, + 3671, + 3672, + 3673, + 3674, + 3675, + 3676, + 3677, + 3678, + 3679, + 3680, + 3681, + 3682, + 3683, + 3684, + 3685, + 3686, + 3687, + 3688, + 3689, + 3690, + 3691, + 3692, + 3693, + 3694, + 3695, + 3696, + 3697, + 3698, + 3699, + 3700, + 3701, + 3702, + 3703, + 3704, + 3705, + 3706, + 3707, + 3708, + 3709, + 3710, + 3711, + 3712, + 3713, + 3714, + 3715, + 3716, + 3717, + 3718, + 3719, + 3720, + 3721, + 3722, + 3723, + 3724, + 3725, + 3726, + 3727, + 3728, + 3729, + 3730, + 3731, + 3732, + 3733, + 3734, + 3735, + 3736, + 3737, + 3738, + 3739, + 3740, + 3741, + 3742, + 3743, + 3744, + 3745, + 3746, + 3747, + 3748, + 3749, + 3750, + 3751, + 3752, + 3753, + 3754, + 3755, + 3756, + 3757, + 3758, + 3759, + 3760, + 3761, + 3762, + 3763, + 3764, + 3765, + 3766, + 3767, + 3768, + 3769, + 3770, + 3771, + 3772, + 3773, + 3774, + 3775, + 3776, + 3777, + 3778, + 3779, + 3780, + 3781, + 3782, + 3783, + 3784, + 3785, + 3786, + 3787, + 3788, + 3789, + 3790, + 3791, + 3792, + 3793, + 3794, + 3795, + 3796, + 3797, + 3798, + 3799, + 3800, + 3801, + 3802, + 3803, + 3804, + 3805, + 3806, + 3807, + 3808, + 3809, + 3810, + 3811, + 3812, + 3813, + 3814, + 3815, + 3816, + 3817, + 3818, + 3819, + 3820, + 3821, + 3822, + 3823, + 3824, + 3825, + 3826, + 3827, + 3828, + 3829, + 3830, + 3831, + 3832, + 3833, + 3834, + 3835, + 3836, + 3837, + 3838, + 3839, + 3840, + 3841, + 3842, + 3843, + 3844, + 3845, + 3846, + 3847, + 3848, + 3849, + 3850, + 3851, + 3852, + 3853, + 3854, + 3855, + 3856, + 3857, + 3858, + 3859, + 3860, + 3861, + 3862, + 3863, + 3864, + 3865, + 3866, + 3867, + 3868, + 3869, + 3870, + 3871, + 3872, + 3873, + 3874, + 3875, + 3876, + 3877, + 3878, + 3879, + 3880, + 3881, + 3882, + 3883, + 3884, + 3885, + 3886, + 3887, + 3888, + 3889, + 3890, + 3891, + 3892, + 3893, + 3894, + 3895, + 3896, + 3897, + 3898, + 3899, + 3900, + 3901, + 3902, + 3903, + 3904, + 3905, + 3906, + 3907, + 3908, + 3909, + 3910, + 3911, + 3912, + 3913, + 3914, + 3915, + 3916, + 3917, + 3918, + 3919, + 3920, + 3921, + 3922, + 3923, + 3924, + 3925, + 3926, + 3927, + 3928, + 3929, + 3930, + 3931, + 3932, + 3933, + 3934, + 3935, + 3936, + 3937, + 3938, + 3939, + 3940, + 3941, + 3942, + 3943, + 3944, + 3945, + 3946, + 3947, + 3948, + 3949, + 3950, + 3951, + 3952, + 3953, + 3954, + 3955, + 3956, + 3957, + 3958, + 3959, + 3960, + 3961, + 3962, + 3963, + 3964, + 3965, + 3966, + 3967, + 3968, + 3969, + 3970, + 3971, + 3972, + 3973, + 3974, + 3975, + 3976, + 3977, + 3978, + 3979, + 3980, + 3981, + 3982, + 3983, + 3984, + 3985, + 3986, + 3987, + 3988, + 3989, + 3990, + 3991, + 3992, + 3993, + 3994, + 3995, + 3996, + 3997, + 3998, + 3999 + + ); + + // Localloc some space; this moves the outgoing argument space. + + if (n < 1) n = 1; + int* a = stackalloc int[n * 4096]; + a[0] = 7; + int i; + + for (i=1; i < 5; ++i) + { + a[i] = i + a[i - 1]; + } + + // Now call a function that touches the potentially un-probed + // outgoing argument space. + + SmallArgSpace(1, 2, 3, 4, 5, 6, 7, 8, 9, a[4]); + + iret = 100; + } + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + public static void Escape(ref LargeStruct s) + { + } + + public static int Main() + { + Test1(1); // force JIT of this + Test1(80); + + if (iret == 100) + { + Console.WriteLine("TEST PASSED"); + } + else + { + Console.WriteLine("TEST FAILED"); + } + return iret; + } + } +} diff --git a/tests/src/JIT/Methodical/largeframes/skip6/skippage6.csproj b/tests/src/JIT/Methodical/largeframes/skip6/skippage6.csproj new file mode 100644 index 0000000000..a9679696c6 --- /dev/null +++ b/tests/src/JIT/Methodical/largeframes/skip6/skippage6.csproj @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <AssemblyName>$(MSBuildProjectName)</AssemblyName> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{43F24741-6FD9-4593-92FA-D3252B540A92}</ProjectGuid> + <OutputType>Exe</OutputType> + <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir> + <CLRTestPriority>1</CLRTestPriority> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> + </PropertyGroup> + <!-- Default configurations to help VS understand the configurations --> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "></PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "></PropertyGroup> + <ItemGroup> + <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies"> + <Visible>False</Visible> + </CodeAnalysisDependentAssemblyPaths> + </ItemGroup> + <PropertyGroup> + <DebugType>PdbOnly</DebugType> + <Optimize>True</Optimize> + </PropertyGroup> + <ItemGroup> + <Compile Include="skippage6.cs" /> + </ItemGroup> + <ItemGroup> + <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> + </ItemGroup> + <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> + <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "></PropertyGroup> +</Project> diff --git a/tests/src/JIT/Methodical/largeframes/skip7/skippage7.cs b/tests/src/JIT/Methodical/largeframes/skip7/skippage7.cs new file mode 100644 index 0000000000..0949ca7db5 --- /dev/null +++ b/tests/src/JIT/Methodical/largeframes/skip7/skippage7.cs @@ -0,0 +1,101 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Exercise stack probing after localloc, on architectures with fixed outgoing argument +// space. Some implementations did not probe after re-establishing the outgoing argument +// space after a localloc. +// +// We need to create a large enough outgoing argument space to skip a guard page. To actually +// see a problem on Windows, we need to skip 3 guard pages. Since structs are passed by +// reference on arm64/x64, we have to have a huge number of small arguments: over 1536 +// "long" arguments. For arm32, structs are passed by value, so we can just pass a very large +// struct. This test case is for the arm32 case. + +namespace BigFrames +{ + + [StructLayout(LayoutKind.Explicit)] + public struct LargeStruct + { + [FieldOffset(0)] + public int i1; + [FieldOffset(65512)] + public int i2; + } + + public class Test + { + public static int iret = 1; + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + public static void BigArgSpace(LargeStruct s) + { + long result = s.i1 + s.i2; + Console.Write("BigArgSpace: "); + Console.WriteLine(result); + } + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + public static void SmallArgSpace(long i1, long i2, long i3, long i4, long i5, long i6, long i7, long i8, long i9, long i10) + { + long result = i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9 + i10; + Console.Write("SmallArgSpace: "); + Console.WriteLine(result); + } + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + public unsafe static void Test1(int n) + { + Console.WriteLine("Enter Test1"); + LargeStruct s = new LargeStruct(); + s.i1 = 7; + s.i2 = 9; + BigArgSpace(s); + + // Localloc some space; this moves the outgoing argument space. + + if (n < 1) n = 1; + int* a = stackalloc int[n * 4096]; + a[0] = 7; + int i; + + for (i=1; i < 5; ++i) + { + a[i] = i + a[i - 1]; + } + + // Now call a function that touches the potentially un-probed + // outgoing argument space. + + SmallArgSpace(1, 2, 3, 4, 5, 6, 7, 8, 9, a[4]); + + iret = 100; + } + + [MethodImplAttribute(MethodImplOptions.NoInlining)] + public static void Escape(ref LargeStruct s) + { + } + + public static int Main() + { + Test1(1); // force JIT of this + Test1(80); + + if (iret == 100) + { + Console.WriteLine("TEST PASSED"); + } + else + { + Console.WriteLine("TEST FAILED"); + } + return iret; + } + } +} diff --git a/tests/src/JIT/Methodical/largeframes/skip7/skippage7.csproj b/tests/src/JIT/Methodical/largeframes/skip7/skippage7.csproj new file mode 100644 index 0000000000..2fe611b038 --- /dev/null +++ b/tests/src/JIT/Methodical/largeframes/skip7/skippage7.csproj @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" /> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <AssemblyName>$(MSBuildProjectName)</AssemblyName> + <SchemaVersion>2.0</SchemaVersion> + <ProjectGuid>{43F24741-6FD9-4593-92FA-D3252B540A92}</ProjectGuid> + <OutputType>Exe</OutputType> + <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> + <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir> + <CLRTestPriority>1</CLRTestPriority> + <AllowUnsafeBlocks>true</AllowUnsafeBlocks> + </PropertyGroup> + <!-- Default configurations to help VS understand the configurations --> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "></PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "></PropertyGroup> + <ItemGroup> + <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies"> + <Visible>False</Visible> + </CodeAnalysisDependentAssemblyPaths> + </ItemGroup> + <PropertyGroup> + <DebugType>PdbOnly</DebugType> + <Optimize>True</Optimize> + </PropertyGroup> + <ItemGroup> + <Compile Include="skippage7.cs" /> + </ItemGroup> + <ItemGroup> + <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" /> + </ItemGroup> + <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" /> + <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' "></PropertyGroup> +</Project> |