@@ -5317,14 +5317,14 @@ bool CodeGen::IsSaveFpLrWithAllCalleeSavedRegisters() const
53175317
53185318void CodeGen::genEmitHelperCall (unsigned helper, int argSize, emitAttr retSize, regNumber callTargetReg /* = REG_NA */ )
53195319{
5320- void * addr = nullptr ;
53215320 void * pAddr = nullptr ;
53225321
5323- emitter::EmitCallType callType = emitter::EC_FUNC_TOKEN;
5324- addr = compiler->compGetHelperFtn ((CorInfoHelpFunc)helper, &pAddr);
5325- regNumber callTarget = REG_NA;
5322+ EmitCallParams params;
5323+ params.callType = EC_FUNC_TOKEN;
5324+ params.addr = compiler->compGetHelperFtn ((CorInfoHelpFunc)helper, &pAddr);
5325+ regMaskTP killSet = compiler->compHelperCallKillSet ((CorInfoHelpFunc)helper);
53265326
5327- if (addr == nullptr )
5327+ if (params. addr == nullptr )
53285328 {
53295329 // This is call to a runtime helper.
53305330 // adrp x, [reloc:rel page addr]
@@ -5340,37 +5340,33 @@ void CodeGen::genEmitHelperCall(unsigned helper, int argSize, emitAttr retSize,
53405340 }
53415341
53425342 regMaskTP callTargetMask = genRegMask (callTargetReg);
5343- regMaskTP callKillSet = compiler->compHelperCallKillSet ((CorInfoHelpFunc)helper);
53445343
5345- // assert that all registers in callTargetMask are in the callKillSet
5346- noway_assert ((callTargetMask & callKillSet) == callTargetMask);
5347-
5348- callTarget = callTargetReg;
5344+ noway_assert ((callTargetMask & killSet) == callTargetMask);
53495345
53505346 if (compiler->opts .compReloc )
53515347 {
53525348 // adrp + add with relocations will be emitted
5353- GetEmitter ()->emitIns_R_AI (INS_adrp, EA_PTR_DSP_RELOC, callTarget ,
5349+ GetEmitter ()->emitIns_R_AI (INS_adrp, EA_PTR_DSP_RELOC, callTargetReg ,
53545350 (ssize_t )pAddr DEBUGARG ((size_t )compiler->eeFindHelper (helper))
53555351 DEBUGARG (GTF_ICON_METHOD_HDL));
53565352 }
53575353 else
53585354 {
5359- instGen_Set_Reg_To_Imm (EA_PTRSIZE, callTarget , (ssize_t )addr );
5355+ instGen_Set_Reg_To_Imm (EA_PTRSIZE, callTargetReg , (ssize_t )pAddr );
53605356 }
5361- GetEmitter ()->emitIns_R_R (INS_ldr, EA_PTRSIZE, callTarget, callTarget);
5362- callType = emitter::EC_INDIR_R;
5357+ GetEmitter ()->emitIns_R_R (INS_ldr, EA_PTRSIZE, callTargetReg, callTargetReg);
5358+
5359+ params.callType = EC_INDIR_R;
5360+ params.ireg = callTargetReg;
53635361 }
53645362
5365- GetEmitter ()->emitIns_Call (callType, compiler->eeFindHelper (helper), INDEBUG_LDISASM_COMMA (nullptr ) addr, argSize,
5366- retSize, EA_UNKNOWN, gcInfo.gcVarPtrSetCur , gcInfo.gcRegGCrefSetCur ,
5367- gcInfo.gcRegByrefSetCur , DebugInfo (), callTarget, /* ireg */
5368- REG_NA, 0 , 0 , /* xreg, xmul, disp */
5369- false /* isJump */
5370- );
5363+ params.methHnd = compiler->eeFindHelper (helper);
5364+ params.argSize = argSize;
5365+ params.retSize = retSize;
5366+
5367+ genEmitCallWithCurrentGC (params);
53715368
5372- regMaskTP killMask = compiler->compHelperCallKillSet ((CorInfoHelpFunc)helper);
5373- regSet.verifyRegistersUsed (killMask);
5369+ regSet.verifyRegistersUsed (killSet);
53745370}
53755371
53765372#ifdef FEATURE_SIMD
0 commit comments