@@ -8696,7 +8696,7 @@ void VarSplit::insertMovesToTemp(IR_Builder& builder, G4_Declare* oldDcl, G4_Ope
8696
8696
return ;
8697
8697
}
8698
8698
8699
- void VarSplit::insertMovesFromTemp (G4_Kernel& kernel, G4_Declare* oldDcl, int index, G4_Operand *srcOpnd, int pos, G4_BB* bb, INST_LIST_ITER instIter, std::vector<G4_Declare*> &splitDclList)
8699
+ void VarSplit::insertMovesFromTemp (G4_Kernel& kernel, G4_Declare* oldDcl, int index, G4_SrcRegRegion *srcOpnd, int pos, G4_BB* bb, INST_LIST_ITER instIter, std::vector<G4_Declare*> &splitDclList)
8700
8700
{
8701
8701
G4_INST *inst = (*instIter);
8702
8702
@@ -8705,16 +8705,9 @@ void VarSplit::insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int in
8705
8705
int splitSize = kernel.getSimdSize () == 8 ? 1 : 2 ;
8706
8706
if (sizeInGRF != splitSize)
8707
8707
{
8708
- unsigned short dclWidth = 0 ;
8709
- unsigned short dclHeight = 0 ;
8710
- int dclTotalSize = 0 ;
8711
- G4_SrcRegRegion* oldSrc = srcOpnd->asSrcRegRegion ();
8712
- getHeightWidth (oldSrc->getType (), (srcOpnd->getRightBound () - srcOpnd->getLeftBound () + 1 ) / oldSrc->getElemSize (), dclWidth, dclHeight, dclTotalSize);
8713
- char * newDclName = kernel.fg .builder ->getNameString (kernel.fg .builder ->mem , 16 , " copy_%d_%s" , index, oldDcl->getName ());
8714
- G4_Declare * newDcl = kernel.fg .builder ->createDeclareNoLookup (newDclName, G4_GRF, dclWidth, dclHeight, oldSrc->getType ());
8715
- newDcl->setAlign (oldDcl->getAlign ());
8716
- newDcl->setSubRegAlign (oldDcl->getSubRegAlign ());
8717
- unsigned newLeftBound = 0 ;
8708
+
8709
+ int numElt = getTypeSize (srcOpnd->getType ()) > 4 ? 4 : (4 / getTypeSize (srcOpnd->getType ()));
8710
+ G4_Declare* newDcl = kernel.fg .builder ->createTempVar (numElt * splitSize, srcOpnd->getType (), Either, Any);
8718
8711
8719
8712
for (size_t i = 0 ; i < splitDclList.size (); i++)
8720
8713
{
@@ -8725,32 +8718,16 @@ void VarSplit::insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int in
8725
8718
if (!(srcOpnd->getRightBound () < leftBound || rightBound < srcOpnd->getLeftBound ()))
8726
8719
{
8727
8720
8728
- G4_DstRegRegion* dst = kernel.fg .builder ->createDstRegRegion (Direct,
8729
- newDcl->getRegVar (),
8730
- newLeftBound / G4_GRF_REG_NBYTES,
8731
- 0 ,
8732
- 1 ,
8733
- oldSrc->getType ());
8734
- newLeftBound += subDcl->getByteSize ();
8735
- G4_SrcRegRegion* src = kernel.fg .builder ->createSrcRegRegion (
8736
- Mod_src_undef,
8737
- Direct,
8738
- subDcl->getRegVar (),
8739
- 0 ,
8740
- 0 ,
8741
- kernel.fg .builder ->getRegionStride1 (),
8742
- oldSrc->getType ());
8743
- G4_INST* movInst = kernel.fg .builder ->createInternalInst (nullptr , G4_mov, nullptr , false ,
8744
- (unsigned char )subDcl->getTotalElems (), dst, src, nullptr , InstOpt_WriteEnable,
8745
- inst->getLineNo (), inst->getCISAOff (), inst->getSrcFilename ());
8746
- bb->insert (instIter, movInst);
8721
+ newDcl->setAliasDeclare (subDcl, 0 );
8722
+ G4_SrcRegRegion* newSrc = kernel.fg .builder ->Create_Src_Opnd_From_Dcl (newDcl, srcOpnd->getRegion ());
8723
+ newSrc->setRegOff (srcOpnd->getRegOff () % splitSize);
8724
+ newSrc->setSubRegOff (srcOpnd->getSubRegOff ());
8725
+ newSrc->setModifier (srcOpnd->getModifier ());
8726
+ inst->setSrc (newSrc, pos);
8727
+ break ;
8747
8728
}
8748
8729
}
8749
- G4_SrcRegRegion* newSrc = kernel.fg .builder ->Create_Src_Opnd_From_Dcl (newDcl, oldSrc->getRegion ());
8750
- newSrc->setRegOff (0 );
8751
- newSrc->setSubRegOff (oldSrc->getSubRegOff ());
8752
- newSrc->setModifier (oldSrc->getModifier ());
8753
- inst->setSrc (newSrc, pos);
8730
+
8754
8731
}
8755
8732
else
8756
8733
{
@@ -8976,7 +8953,7 @@ void VarSplit::globalSplit(IR_Builder& builder, G4_Kernel &kernel)
8976
8953
8977
8954
if (opnd->isSrcRegRegion ())
8978
8955
{
8979
- insertMovesFromTemp (kernel, topDcl, srcIndex, opnd, pos, bb, instIter, splitDclList);
8956
+ insertMovesFromTemp (kernel, topDcl, srcIndex, opnd-> asSrcRegRegion () , pos, bb, instIter, splitDclList);
8980
8957
}
8981
8958
8982
8959
srcIndex++;
0 commit comments