From e80e55a1ace4b4de10072b0f6f71f79aca868906 Mon Sep 17 00:00:00 2001 From: Sergey Andreenko Date: Thu, 6 Sep 2018 16:03:09 -0700 Subject: [PATCH] Clean CodeGen::genEmitCall (#19804) * delete isProfLeaveCB from arm signature The previous implementation was done many years ago and I do not why it was done that way. * extract GetSavedSet * add isNoGCHelper * delete isNoGC arg * move declarations closer to their uses * delete isGc from genEmitCall * delete unused method declaration. * add emitNoGChelper that accepts CORINFO_METHOD_HANDLE * fix missed switch cases * add function headers * Fix feedback * Fix feedback2 --- src/jit/codegen.h | 3 +- src/jit/codegenarm.cpp | 12 +++---- src/jit/codegenarm64.cpp | 4 +-- src/jit/codegencommon.cpp | 10 +++--- src/jit/codegenlinear.cpp | 6 ++-- src/jit/codegenxarch.cpp | 4 +-- src/jit/emit.cpp | 89 +++++++++++++++++++++++++++++++++++++++++------ src/jit/emit.h | 5 ++- src/jit/emitarm.cpp | 55 +++++------------------------ src/jit/emitarm.h | 14 ++++---- src/jit/emitarm64.cpp | 55 +++++------------------------ src/jit/emitarm64.h | 14 ++++---- src/jit/emitxarch.cpp | 39 ++++++--------------- src/jit/emitxarch.h | 19 +--------- 14 files changed, 143 insertions(+), 186 deletions(-) diff --git a/src/jit/codegen.h b/src/jit/codegen.h index 9eb1ba3..548044c 100644 --- a/src/jit/codegen.h +++ b/src/jit/codegen.h @@ -425,8 +425,7 @@ protected: MULTIREG_HAS_SECOND_GC_RET_ONLY_ARG(emitAttr secondRetSize), IL_OFFSETX ilOffset, regNumber base = REG_NA, - bool isJump = false, - bool isNoGC = false); + bool isJump = false); // clang-format on // clang-format off diff --git a/src/jit/codegenarm.cpp b/src/jit/codegenarm.cpp index 63ef942..fadc9a5 100644 --- a/src/jit/codegenarm.cpp +++ b/src/jit/codegenarm.cpp @@ -1615,19 +1615,17 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize, BAD_IL_OFFSET, // ilOffset callTargetReg, // ireg REG_NA, 0, 0, // xreg, xmul, disp - false, // isJump - emitter::emitNoGChelper(helper), - (CorInfoHelpFunc)helper == CORINFO_HELP_PROF_FCN_LEAVE); + false // isJump + ); } else { getEmitter()->emitIns_Call(emitter::EC_FUNC_TOKEN, compiler->eeFindHelper(helper), INDEBUG_LDISASM_COMMA(nullptr) addr, argSize, retSize, gcInfo.gcVarPtrSetCur, gcInfo.gcRegGCrefSetCur, gcInfo.gcRegByrefSetCur, BAD_IL_OFFSET, REG_NA, REG_NA, 0, - 0, /* ilOffset, ireg, xreg, xmul, disp */ - false, /* isJump */ - emitter::emitNoGChelper(helper), - (CorInfoHelpFunc)helper == CORINFO_HELP_PROF_FCN_LEAVE); + 0, /* ilOffset, ireg, xreg, xmul, disp */ + false /* isJump */ + ); } regSet.verifyRegistersUsed(RBM_CALLEE_TRASH); diff --git a/src/jit/codegenarm64.cpp b/src/jit/codegenarm64.cpp index e95a192..44e92e2 100644 --- a/src/jit/codegenarm64.cpp +++ b/src/jit/codegenarm64.cpp @@ -3712,8 +3712,8 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize, gcInfo.gcRegByrefSetCur, BAD_IL_OFFSET, /* IL offset */ callTarget, /* ireg */ REG_NA, 0, 0, /* xreg, xmul, disp */ - false, /* isJump */ - emitter::emitNoGChelper(helper)); + false /* isJump */ + ); regMaskTP killMask = compiler->compHelperCallKillSet((CorInfoHelpFunc)helper); regSet.verifyRegistersUsed(killMask); diff --git a/src/jit/codegencommon.cpp b/src/jit/codegencommon.cpp index c967892..72fa3c7 100644 --- a/src/jit/codegencommon.cpp +++ b/src/jit/codegencommon.cpp @@ -506,9 +506,7 @@ void CodeGenInterface::genUpdateRegLife(const LclVarDsc* varDsc, bool isBorn, bo } //---------------------------------------------------------------------- -// compNoGCHelperCallKillSet: -// -// Gets a register mask that represents the kill set for a helper call. +// compHelperCallKillSet: Gets a register mask that represents the kill set for a helper call. // Not all JIT Helper calls follow the standard ABI on the target architecture. // // TODO-CQ: Currently this list is incomplete (not all helpers calls are @@ -667,6 +665,9 @@ regMaskTP Compiler::compNoGCHelperCallKillSet(CorInfoHelpFunc helper) case CORINFO_HELP_ASSIGN_REF: case CORINFO_HELP_CHECKED_ASSIGN_REF: return RBM_CALLEE_GCTRASH_WRITEBARRIER; + case CORINFO_HELP_PROF_FCN_LEAVE: + // In case of Leave profiler callback, we need to preserve liveness of REG_PROFILER_RET_SCRATCH on ARMARCH. + return RBM_CALLEE_TRASH_NOGC & ~RBM_PROFILER_RET_SCRATCH; #endif #if defined(_TARGET_X86_) @@ -9139,7 +9140,8 @@ void CodeGen::genFnEpilog(BasicBlock* block) gcInfo.gcRegGCrefSetCur, gcInfo.gcRegByrefSetCur, BAD_IL_OFFSET, REG_NA, REG_NA, 0, 0, /* iloffset, ireg, xreg, xmul, disp */ - true); /* isJump */ + true /* isJump */ + ); // clang-format on } #if FEATURE_FASTTAILCALL diff --git a/src/jit/codegenlinear.cpp b/src/jit/codegenlinear.cpp index 9962a62..4a478a0 100644 --- a/src/jit/codegenlinear.cpp +++ b/src/jit/codegenlinear.cpp @@ -1849,8 +1849,7 @@ void CodeGen::genEmitCall(int callType, MULTIREG_HAS_SECOND_GC_RET_ONLY_ARG(emitAttr secondRetSize), IL_OFFSETX ilOffset, regNumber base, - bool isJump, - bool isNoGC) + bool isJump) { #if !defined(_TARGET_X86_) int argSize = 0; @@ -1865,8 +1864,7 @@ void CodeGen::genEmitCall(int callType, gcInfo.gcVarPtrSetCur, gcInfo.gcRegGCrefSetCur, gcInfo.gcRegByrefSetCur, - ilOffset, base, REG_NA, 0, 0, isJump, - emitter::emitNoGChelper(compiler->eeGetHelperNum(methHnd))); + ilOffset, base, REG_NA, 0, 0, isJump); } // clang-format on diff --git a/src/jit/codegenxarch.cpp b/src/jit/codegenxarch.cpp index caccf47..a1d0a95 100644 --- a/src/jit/codegenxarch.cpp +++ b/src/jit/codegenxarch.cpp @@ -8625,8 +8625,8 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize, BAD_IL_OFFSET, // IL offset callTarget, // ireg REG_NA, 0, 0, // xreg, xmul, disp - false, // isJump - emitter::emitNoGChelper(helper)); + false // isJump + ); // clang-format on regSet.verifyRegistersUsed(killMask); diff --git a/src/jit/emit.cpp b/src/jit/emit.cpp index 46726f4..f320596 100644 --- a/src/jit/emit.cpp +++ b/src/jit/emit.cpp @@ -2222,17 +2222,22 @@ emitter::instrDesc* emitter::emitNewInstrCnsDsp(emitAttr size, target_ssize_t cn } } -/***************************************************************************** - * - * Returns true if garbage-collection won't happen within the helper call. - * Don't need to record live pointers for such call sites. - */ - -bool emitter::emitNoGChelper(unsigned IHX) +//------------------------------------------------------------------------ +// emitNoGChelper: Returns true if garbage collection won't happen within the helper call. +// +// Notes: +// There is no need to record live pointers for such call sites. +// +// Arguments: +// helpFunc - a helper signature for the call, can be CORINFO_HELP_UNDEF, that means that the call is not a helper. +// +// Return value: +// true if GC can't happen within this call, false otherwise. +bool emitter::emitNoGChelper(CorInfoHelpFunc helpFunc) { // TODO-Throughput: Make this faster (maybe via a simple table of bools?) - switch (IHX) + switch (helpFunc) { case CORINFO_HELP_UNDEF: return false; @@ -2276,11 +2281,32 @@ bool emitter::emitNoGChelper(unsigned IHX) case CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE_NOCTOR: case CORINFO_HELP_INIT_PINVOKE_FRAME: - return true; + + default: + return false; } +} - return false; +//------------------------------------------------------------------------ +// emitNoGChelper: Returns true if garbage collection won't happen within the helper call. +// +// Notes: +// There is no need to record live pointers for such call sites. +// +// Arguments: +// methHnd - a method handle for the call. +// +// Return value: +// true if GC can't happen within this call, false otherwise. +bool emitter::emitNoGChelper(CORINFO_METHOD_HANDLE methHnd) +{ + CorInfoHelpFunc helpFunc = Compiler::eeGetHelperNum(methHnd); + if (helpFunc == CORINFO_HELP_UNDEF) + { + return false; + } + return emitNoGChelper(helpFunc); } /***************************************************************************** @@ -7277,3 +7303,46 @@ const char* emitter::emitOffsetToLabel(unsigned offs) } #endif // DEBUG + +//------------------------------------------------------------------------ +// emitGetGCRegsSavedOrModified: Returns the set of registers that keeps gcrefs and byrefs across the call. +// +// Notes: it returns union of two sets: +// 1) registers that could contain GC/byRefs before the call and call doesn't touch them; +// 2) registers that contain GC/byRefs before the call and call modifies them, but they still +// contain GC/byRefs. +// +// Arguments: +// methHnd - the method handler of the call. +// +// Return value: +// the saved set of registers. +// +regMaskTP emitter::emitGetGCRegsSavedOrModified(CORINFO_METHOD_HANDLE methHnd) +{ + // Is it a helper with a special saved set? + bool isNoGCHelper = emitNoGChelper(methHnd); + if (isNoGCHelper) + { + CorInfoHelpFunc helpFunc = Compiler::eeGetHelperNum(methHnd); + + // Get the set of registers that this call kills and remove it from the saved set. + regMaskTP savedSet = RBM_ALLINT & ~emitComp->compNoGCHelperCallKillSet(helpFunc); + +#ifdef DEBUG + if (emitComp->verbose) + { + printf("NoGC Call: savedSet="); + printRegMaskInt(savedSet); + emitDispRegSet(savedSet); + printf("\n"); + } +#endif + return savedSet; + } + else + { + // This is the saved set of registers after a normal call. + return RBM_CALLEE_SAVED; + } +} diff --git a/src/jit/emit.h b/src/jit/emit.h index fcab878..261302a 100644 --- a/src/jit/emit.h +++ b/src/jit/emit.h @@ -1909,7 +1909,8 @@ public: /* The following is used to distinguish helper vs non-helper calls */ /************************************************************************/ - static bool emitNoGChelper(unsigned IHX); + static bool emitNoGChelper(CorInfoHelpFunc helpFunc); + static bool emitNoGChelper(CORINFO_METHOD_HANDLE methHnd); /************************************************************************/ /* The following logic keeps track of live GC ref values */ @@ -1919,6 +1920,8 @@ public: bool emitFullGCinfo; // full GC pointer maps? bool emitFullyInt; // fully interruptible code? + regMaskTP emitGetGCRegsSavedOrModified(CORINFO_METHOD_HANDLE methHnd); + #if EMIT_TRACK_STACK_DEPTH unsigned emitCntStackDepth; // 0 in prolog/epilog, One DWORD elsewhere unsigned emitMaxStackDepth; // actual computed max. stack depth diff --git a/src/jit/emitarm.cpp b/src/jit/emitarm.cpp index ac6239d..1b8d2af 100644 --- a/src/jit/emitarm.cpp +++ b/src/jit/emitarm.cpp @@ -4415,9 +4415,7 @@ void emitter::emitIns_Call(EmitCallType callType, regNumber xreg /* = REG_NA */, unsigned xmul /* = 0 */, ssize_t disp /* = 0 */, - bool isJump /* = false */, - bool isNoGC /* = false */, - bool isProfLeaveCB /* = false */) + bool isJump /* = false */) { /* Sanity check the arguments depending on callType */ @@ -4434,44 +4432,8 @@ void emitter::emitIns_Call(EmitCallType callType, // a sanity test. assert((unsigned)abs(argSize) <= codeGen->genStackLevel); - int argCnt; - instrDesc* id; - - /* This is the saved set of registers after a normal call */ - regMaskTP savedSet = RBM_CALLEE_SAVED; - - /* some special helper calls have a different saved set registers */ - - if (isNoGC) - { - assert(emitNoGChelper(Compiler::eeGetHelperNum(methHnd))); - - // Get the set of registers that this call kills and remove it from the saved set. - savedSet = RBM_ALLINT & ~emitComp->compNoGCHelperCallKillSet(Compiler::eeGetHelperNum(methHnd)); - - // In case of Leave profiler callback, we need to preserve liveness of REG_PROFILER_RET_SCRATCH - if (isProfLeaveCB) - { - savedSet |= RBM_PROFILER_RET_SCRATCH; - } - -#ifdef DEBUG - if (emitComp->verbose) - { - printf("NOGC Call: savedSet="); - printRegMaskInt(savedSet); - emitDispRegSet(savedSet); - printf("\n"); - } -#endif - } - else - { - assert(!emitNoGChelper(Compiler::eeGetHelperNum(methHnd))); - } - - /* Trim out any callee-trashed registers from the live set */ - + // Trim out any callee-trashed registers from the live set. + regMaskTP savedSet = emitGetGCRegsSavedOrModified(methHnd); gcrefRegs &= savedSet; byrefRegs &= savedSet; @@ -4490,9 +4452,6 @@ void emitter::emitIns_Call(EmitCallType callType, } #endif - assert(argSize % REGSIZE_BYTES == 0); - argCnt = argSize / REGSIZE_BYTES; - /* Managed RetVal: emit sequence point for the call */ if (emitComp->opts.compDbgInfo && ilOffset != BAD_IL_OFFSET) { @@ -4512,6 +4471,10 @@ void emitter::emitIns_Call(EmitCallType callType, Direct call with GC vars 9,440 Indir. call with GC vars 5,768 */ + instrDesc* id; + + assert(argSize % REGSIZE_BYTES == 0); + int argCnt = argSize / REGSIZE_BYTES; if (callType >= EC_INDIR_R) { @@ -4537,12 +4500,12 @@ void emitter::emitIns_Call(EmitCallType callType, emitThisGCrefRegs = gcrefRegs; emitThisByrefRegs = byrefRegs; + id->idSetIsNoGC(emitNoGChelper(methHnd)); + /* Set the instruction - special case jumping a function */ instruction ins; insFormat fmt = IF_NONE; - id->idSetIsNoGC(isNoGC); - /* Record the address: method, indirection, or funcptr */ if (callType > EC_FUNC_ADDR) diff --git a/src/jit/emitarm.h b/src/jit/emitarm.h index b7f2337..fe24007 100644 --- a/src/jit/emitarm.h +++ b/src/jit/emitarm.h @@ -334,14 +334,12 @@ void emitIns_Call(EmitCallType callType, VARSET_VALARG_TP ptrVars, regMaskTP gcrefRegs, regMaskTP byrefRegs, - IL_OFFSETX ilOffset = BAD_IL_OFFSET, - regNumber ireg = REG_NA, - regNumber xreg = REG_NA, - unsigned xmul = 0, - ssize_t disp = 0, - bool isJump = false, - bool isNoGC = false, - bool isProfLeaveCB = false); + IL_OFFSETX ilOffset = BAD_IL_OFFSET, + regNumber ireg = REG_NA, + regNumber xreg = REG_NA, + unsigned xmul = 0, + ssize_t disp = 0, + bool isJump = false); /***************************************************************************** * diff --git a/src/jit/emitarm64.cpp b/src/jit/emitarm64.cpp index 851085a..a87d496 100644 --- a/src/jit/emitarm64.cpp +++ b/src/jit/emitarm64.cpp @@ -7392,9 +7392,7 @@ void emitter::emitIns_Call(EmitCallType callType, regNumber xreg /* = REG_NA */, unsigned xmul /* = 0 */, ssize_t disp /* = 0 */, - bool isJump /* = false */, - bool isNoGC /* = false */, - bool isProfLeaveCB /* = false */) + bool isJump /* = false */) { /* Sanity check the arguments depending on callType */ @@ -7411,44 +7409,8 @@ void emitter::emitIns_Call(EmitCallType callType, // a sanity test. assert((unsigned)abs(argSize) <= codeGen->genStackLevel); - int argCnt; - instrDesc* id; - - /* This is the saved set of registers after a normal call */ - regMaskTP savedSet = RBM_CALLEE_SAVED; - - /* some special helper calls have a different saved set registers */ - - if (isNoGC) - { - assert(emitNoGChelper(Compiler::eeGetHelperNum(methHnd))); - - // Get the set of registers that this call kills and remove it from the saved set. - savedSet = RBM_ALLINT & ~emitComp->compNoGCHelperCallKillSet(Compiler::eeGetHelperNum(methHnd)); - - // In case of Leave profiler callback, we need to preserve liveness of REG_PROFILER_RET_SCRATCH - if (isProfLeaveCB) - { - savedSet |= RBM_PROFILER_RET_SCRATCH; - } - -#ifdef DEBUG - if (emitComp->verbose) - { - printf("NOGC Call: savedSet="); - printRegMaskInt(savedSet); - emitDispRegSet(savedSet); - printf("\n"); - } -#endif - } - else - { - assert(!emitNoGChelper(Compiler::eeGetHelperNum(methHnd))); - } - - /* Trim out any callee-trashed registers from the live set */ - + // Trim out any callee-trashed registers from the live set. + regMaskTP savedSet = emitGetGCRegsSavedOrModified(methHnd); gcrefRegs &= savedSet; byrefRegs &= savedSet; @@ -7467,9 +7429,6 @@ void emitter::emitIns_Call(EmitCallType callType, } #endif - assert(argSize % REGSIZE_BYTES == 0); - argCnt = (int)(argSize / (int)REGSIZE_BYTES); - /* Managed RetVal: emit sequence point for the call */ if (emitComp->opts.compDbgInfo && ilOffset != BAD_IL_OFFSET) { @@ -7481,6 +7440,10 @@ void emitter::emitIns_Call(EmitCallType callType, on whether this is a direct/indirect call, and whether we need to record an updated set of live GC variables. */ + instrDesc* id; + + assert(argSize % REGSIZE_BYTES == 0); + int argCnt = (int)(argSize / (int)REGSIZE_BYTES); if (callType >= EC_INDIR_R) { @@ -7506,12 +7469,12 @@ void emitter::emitIns_Call(EmitCallType callType, emitThisGCrefRegs = gcrefRegs; emitThisByrefRegs = byrefRegs; + id->idSetIsNoGC(emitNoGChelper(methHnd)); + /* Set the instruction - special case jumping a function */ instruction ins; insFormat fmt = IF_NONE; - id->idSetIsNoGC(isNoGC); - /* Record the address: method, indirection, or funcptr */ if (callType > EC_FUNC_ADDR) diff --git a/src/jit/emitarm64.h b/src/jit/emitarm64.h index bf22738..fefee04 100644 --- a/src/jit/emitarm64.h +++ b/src/jit/emitarm64.h @@ -816,14 +816,12 @@ void emitIns_Call(EmitCallType callType, VARSET_VALARG_TP ptrVars, regMaskTP gcrefRegs, regMaskTP byrefRegs, - IL_OFFSETX ilOffset = BAD_IL_OFFSET, - regNumber ireg = REG_NA, - regNumber xreg = REG_NA, - unsigned xmul = 0, - ssize_t disp = 0, - bool isJump = false, - bool isNoGC = false, - bool isProfLeaveCB = false); + IL_OFFSETX ilOffset = BAD_IL_OFFSET, + regNumber ireg = REG_NA, + regNumber xreg = REG_NA, + unsigned xmul = 0, + ssize_t disp = 0, + bool isJump = false); BYTE* emitOutputLJ(insGroup* ig, BYTE* dst, instrDesc* i); unsigned emitOutputCall(insGroup* ig, BYTE* dst, instrDesc* i, code_t code); diff --git a/src/jit/emitxarch.cpp b/src/jit/emitxarch.cpp index 3dff716..9a6d63f 100644 --- a/src/jit/emitxarch.cpp +++ b/src/jit/emitxarch.cpp @@ -6824,8 +6824,7 @@ void emitter::emitIns_Call(EmitCallType callType, regNumber xreg, // = REG_NA unsigned xmul, // = 0 ssize_t disp, // = 0 - bool isJump, // = false - bool isNoGC) // = false + bool isJump) // = false // clang-format on { /* Sanity check the arguments depending on callType */ @@ -6930,28 +6929,8 @@ void emitter::emitIns_Call(EmitCallType callType, } #endif // STACK_PROBES - int argCnt; - - UNATIVE_OFFSET sz; - instrDesc* id; - - /* This is the saved set of registers after a normal call */ - unsigned savedSet = RBM_CALLEE_SAVED; - - /* some special helper calls have a different saved set registers */ - - if (isNoGC) - { - // Get the set of registers that this call kills and remove it from the saved set. - savedSet = RBM_ALLINT & ~emitComp->compNoGCHelperCallKillSet(Compiler::eeGetHelperNum(methHnd)); - } - else - { - assert(!emitNoGChelper(Compiler::eeGetHelperNum(methHnd))); - } - - /* Trim out any callee-trashed registers from the live set */ - + // Trim out any callee-trashed registers from the live set. + regMaskTP savedSet = emitGetGCRegsSavedOrModified(methHnd); gcrefRegs &= savedSet; byrefRegs &= savedSet; @@ -6970,9 +6949,6 @@ void emitter::emitIns_Call(EmitCallType callType, } #endif - assert(argSize % REGSIZE_BYTES == 0); - argCnt = (int)(argSize / (int)REGSIZE_BYTES); // we need a signed-divide - /* Managed RetVal: emit sequence point for the call */ if (emitComp->opts.compDbgInfo && ilOffset != BAD_IL_OFFSET) { @@ -6993,6 +6969,11 @@ void emitter::emitIns_Call(EmitCallType callType, Indir. call with GC vars 5,768 */ + instrDesc* id; + + assert(argSize % REGSIZE_BYTES == 0); + int argCnt = (int)(argSize / (int)REGSIZE_BYTES); // we need a signed-divide + if (callType >= EC_FUNC_VIRTUAL) { /* Indirect call, virtual calls */ @@ -7037,7 +7018,9 @@ void emitter::emitIns_Call(EmitCallType callType, } id->idIns(ins); - id->idSetIsNoGC(isNoGC); + id->idSetIsNoGC(emitNoGChelper(methHnd)); + + UNATIVE_OFFSET sz; // Record the address: method, indirection, or funcptr if (callType >= EC_FUNC_VIRTUAL) diff --git a/src/jit/emitxarch.h b/src/jit/emitxarch.h index 965309d3..a3e25de 100644 --- a/src/jit/emitxarch.h +++ b/src/jit/emitxarch.h @@ -512,22 +512,6 @@ enum EmitCallType // clang-format off void emitIns_Call(EmitCallType callType, CORINFO_METHOD_HANDLE methHnd, - CORINFO_SIG_INFO* sigInfo, // used to report call sites to the EE - void* addr, - ssize_t argSize, - emitAttr retSize - MULTIREG_HAS_SECOND_GC_RET_ONLY_ARG(emitAttr secondRetSize), - VARSET_VALARG_TP ptrVars, - regMaskTP gcrefRegs, - regMaskTP byrefRegs, - GenTreeIndir* indir, - bool isJump = false, - bool isNoGC = false); -// clang-format on - -// clang-format off -void emitIns_Call(EmitCallType callType, - CORINFO_METHOD_HANDLE methHnd, INDEBUG_LDISASM_COMMA(CORINFO_SIG_INFO* sigInfo) // used to report call sites to the EE void* addr, ssize_t argSize, @@ -541,8 +525,7 @@ void emitIns_Call(EmitCallType callType, regNumber xreg = REG_NA, unsigned xmul = 0, ssize_t disp = 0, - bool isJump = false, - bool isNoGC = false); + bool isJump = false); // clang-format on #ifdef _TARGET_AMD64_ -- 2.7.4