Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Form and contain address mode
Browse files Browse the repository at this point in the history
  • Loading branch information
mikedn committed Oct 2, 2019
1 parent 083cbff commit 8c0f467
Show file tree
Hide file tree
Showing 10 changed files with 381 additions and 82 deletions.
64 changes: 54 additions & 10 deletions src/jit/codegenarmarch.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1927,26 +1927,36 @@ void CodeGen::genCodeForCpBlkHelper(GenTreeBlk* cpBlkNode)
// genCodeForInitBlkUnroll: Generate unrolled block initialization code.
//
// Arguments:
// node - the GT_STORE_BLK or GT_STORE_OBJ node to generate code for
// node - the GT_STORE_BLK node to generate code for
//
void CodeGen::genCodeForInitBlkUnroll(GenTreeBlk* node)
{
assert(node->OperIs(GT_STORE_BLK, GT_STORE_OBJ));
assert(node->OperIs(GT_STORE_BLK));

unsigned dstLclNum = BAD_VAR_NUM;
regNumber dstAddrBaseReg = REG_NA;
unsigned dstOffset = 0;
int dstOffset = 0;
GenTree* dstAddr = node->Addr();

if (!dstAddr->isContained())
{
dstAddrBaseReg = genConsumeReg(dstAddr);
}
else if (dstAddr->OperIsAddrMode())
{
dstAddrBaseReg = genConsumeReg(dstAddr->AsAddrMode()->Base());
dstOffset = dstAddr->AsAddrMode()->Offset();
}
else
{
assert(dstAddr->OperIsLocalAddr());
dstLclNum = dstAddr->AsLclVarCommon()->GetLclNum();
dstOffset = dstAddr->OperIs(GT_LCL_FLD_ADDR) ? dstAddr->AsLclFld()->gtLclOffs : 0;

if (dstAddr->OperIs(GT_LCL_FLD_ADDR))
{
assert(dstAddr->AsLclFld()->gtLclOffs <= INT32_MAX);
dstOffset = dstAddr->AsLclFld()->gtLclOffs;
}
}

regNumber srcReg;
Expand Down Expand Up @@ -1980,6 +1990,9 @@ void CodeGen::genCodeForInitBlkUnroll(GenTreeBlk* node)
emitter* emit = GetEmitter();
unsigned size = node->GetLayout()->GetSize();

assert(size <= INT32_MAX);
assert(dstOffset < INT32_MAX - static_cast<int>(size));

#ifdef _TARGET_ARM64_
for (unsigned regSize = 2 * REGSIZE_BYTES; size >= regSize; size -= regSize, dstOffset += regSize)
{
Expand Down Expand Up @@ -2051,31 +2064,46 @@ void CodeGen::genCodeForCpBlkUnroll(GenTreeBlk* node)

unsigned dstLclNum = BAD_VAR_NUM;
regNumber dstAddrBaseReg = REG_NA;
unsigned dstOffset = 0;
int dstOffset = 0;
GenTree* dstAddr = node->Addr();

if (!dstAddr->isContained())
{
dstAddrBaseReg = genConsumeReg(dstAddr);
}
else if (dstAddr->OperIsAddrMode())
{
dstAddrBaseReg = genConsumeReg(dstAddr->AsAddrMode()->Base());
dstOffset = dstAddr->AsAddrMode()->Offset();
}
else
{
assert(dstAddr->OperIsLocalAddr());
dstLclNum = dstAddr->AsLclVarCommon()->GetLclNum();
dstOffset = dstAddr->OperIs(GT_LCL_FLD_ADDR) ? dstAddr->AsLclFld()->gtLclOffs : 0;

if (dstAddr->OperIs(GT_LCL_FLD_ADDR))
{
assert(dstAddr->AsLclFld()->gtLclOffs <= INT32_MAX);
dstOffset = dstAddr->AsLclFld()->gtLclOffs;
}
}

unsigned srcLclNum = BAD_VAR_NUM;
regNumber srcAddrBaseReg = REG_NA;
unsigned srcOffset = 0;
int srcOffset = 0;
GenTree* src = node->Data();

assert(src->isContained());

if (src->OperIs(GT_LCL_VAR, GT_LCL_FLD))
{
srcLclNum = src->AsLclVarCommon()->GetLclNum();
srcOffset = src->OperIs(GT_LCL_FLD) ? src->AsLclFld()->gtLclOffs : 0;

if (src->OperIs(GT_LCL_FLD))
{
assert(src->AsLclFld()->gtLclOffs <= INT32_MAX);
srcOffset = src->AsLclFld()->gtLclOffs;
}
}
else
{
Expand All @@ -2086,11 +2114,21 @@ void CodeGen::genCodeForCpBlkUnroll(GenTreeBlk* node)
{
srcAddrBaseReg = genConsumeReg(srcAddr);
}
else if (srcAddr->OperIsAddrMode())
{
srcAddrBaseReg = genConsumeReg(srcAddr->AsAddrMode()->Base());
srcOffset = srcAddr->AsAddrMode()->Offset();
}
else
{
assert(srcAddr->OperIsLocalAddr());
srcLclNum = srcAddr->AsLclVarCommon()->GetLclNum();
srcOffset = srcAddr->OperIs(GT_LCL_FLD_ADDR) ? srcAddr->AsLclFld()->gtLclOffs : 0;

if (srcAddr->OperIs(GT_LCL_FLD_ADDR))
{
assert(srcAddr->AsLclFld()->gtLclOffs <= INT32_MAX);
srcOffset = srcAddr->AsLclFld()->gtLclOffs;
}
}
}

Expand All @@ -2102,6 +2140,10 @@ void CodeGen::genCodeForCpBlkUnroll(GenTreeBlk* node)
emitter* emit = GetEmitter();
unsigned size = node->GetLayout()->GetSize();

assert(size <= INT32_MAX);
assert(srcOffset < INT32_MAX - static_cast<int>(size));
assert(dstOffset < INT32_MAX - static_cast<int>(size));

regNumber tempReg = node->ExtractTempReg(RBM_ALLINT);

#ifdef _TARGET_ARM64_
Expand Down Expand Up @@ -3456,8 +3498,10 @@ void CodeGen::genCodeForStoreBlk(GenTreeBlk* blkOp)
{
assert(blkOp->OperIs(GT_STORE_OBJ, GT_STORE_DYN_BLK, GT_STORE_BLK));

if (blkOp->OperIs(GT_STORE_OBJ) && blkOp->OperIsCopyBlkOp())
if (blkOp->OperIs(GT_STORE_OBJ))
{
assert(blkOp->OperIsCopyBlkOp());
assert(!blkOp->gtBlkOpGcUnsafe);
assert(blkOp->AsObj()->GetLayout()->HasGCPtr());
genCodeForCpObj(blkOp->AsObj());
return;
Expand Down
Loading

0 comments on commit 8c0f467

Please sign in to comment.