Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions src/coreclr/src/jit/emitarm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3513,8 +3513,10 @@ void emitter::emitIns_S(instruction ins, emitAttr attr, int varx, int offs)
/*****************************************************************************
*
* Add an instruction referencing a register and a stack-based local variable.
*
* Stores the base register used for accessing the offset of stack in "pBaseReg".
*/
void emitter::emitIns_R_S(instruction ins, emitAttr attr, regNumber reg1, int varx, int offs, regNumber* baseReg)
void emitter::emitIns_R_S(instruction ins, emitAttr attr, regNumber reg1, int varx, int offs, regNumber* pBaseReg)
{
if (ins == INS_mov)
{
Expand Down Expand Up @@ -3556,9 +3558,9 @@ void emitter::emitIns_R_S(instruction ins, emitAttr attr, regNumber reg1, int va

base = emitComp->lvaFrameAddress(varx, emitComp->funCurrentFunc()->funKind != FUNC_ROOT, &reg2, offs,
CodeGen::instIsFP(ins));
if (baseReg != nullptr)
if (pBaseReg != nullptr)
{
*baseReg = reg2;
*pBaseReg = reg2;
}

disp = base + offs;
Expand Down Expand Up @@ -3673,9 +3675,13 @@ void emitter::emitIns_R_S(instruction ins, emitAttr attr, regNumber reg1, int va
appendToCurIG(id);
}

// generate the offset of &varx + offs into a register
// also capture the 'baseReg' used for generating movw/movt
void emitter::emitIns_genStackOffset(regNumber r, int varx, int offs, bool isFloatUsage, regNumber* baseReg)
/*****************************************************************************
*
* Generate the offset of &varx + offs into a register
*
* Stores the base register used for accessing the offset of stack in "pBaseReg".
*/
void emitter::emitIns_genStackOffset(regNumber r, int varx, int offs, bool isFloatUsage, regNumber* pBaseReg)
{
regNumber regBase;
int base;
Expand All @@ -3685,13 +3691,13 @@ void emitter::emitIns_genStackOffset(regNumber r, int varx, int offs, bool isFlo
emitComp->lvaFrameAddress(varx, emitComp->funCurrentFunc()->funKind != FUNC_ROOT, &regBase, offs, isFloatUsage);
disp = base + offs;

emitIns_R_S(INS_movw, EA_4BYTE, r, varx, offs, baseReg);
emitIns_R_S(INS_movw, EA_4BYTE, r, varx, offs, pBaseReg);

if ((disp & 0xffff) != disp)
{
regNumber regBaseUsedInMovT;
emitIns_R_S(INS_movt, EA_4BYTE, r, varx, offs, &regBaseUsedInMovT);
assert(*baseReg == regBaseUsedInMovT);
assert(*pBaseReg == regBaseUsedInMovT);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/coreclr/src/jit/emitarm.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,11 +267,11 @@ void emitIns_C(instruction ins, emitAttr attr, CORINFO_FIELD_HANDLE fdlHnd, int

void emitIns_S(instruction ins, emitAttr attr, int varx, int offs);

void emitIns_genStackOffset(regNumber r, int varx, int offs, bool isFloatUsage, regNumber* baseReg);
void emitIns_genStackOffset(regNumber r, int varx, int offs, bool isFloatUsage, regNumber* pBaseReg);

void emitIns_S_R(instruction ins, emitAttr attr, regNumber ireg, int varx, int offs);

void emitIns_R_S(instruction ins, emitAttr attr, regNumber ireg, int varx, int offs, regNumber* baseReg = nullptr);
void emitIns_R_S(instruction ins, emitAttr attr, regNumber ireg, int varx, int offs, regNumber* pBaseReg = nullptr);

void emitIns_S_I(instruction ins, emitAttr attr, int varx, int offs, int val);

Expand Down