@@ -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_SrcRegRegion *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_Operand *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,9 +8705,16 @@ 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
-
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);
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 ;
8711
8718
8712
8719
for (size_t i = 0 ; i < splitDclList.size (); i++)
8713
8720
{
@@ -8718,16 +8725,32 @@ void VarSplit::insertMovesFromTemp(G4_Kernel& kernel, G4_Declare* oldDcl, int in
8718
8725
if (!(srcOpnd->getRightBound () < leftBound || rightBound < srcOpnd->getLeftBound ()))
8719
8726
{
8720
8727
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 ;
8728
- }
8729
- }
8730
-
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);
8747
+ }
8748
+ }
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);
8731
8754
}
8732
8755
else
8733
8756
{
@@ -8953,7 +8976,7 @@ void VarSplit::globalSplit(IR_Builder& builder, G4_Kernel &kernel)
8953
8976
8954
8977
if (opnd->isSrcRegRegion ())
8955
8978
{
8956
- insertMovesFromTemp (kernel, topDcl, srcIndex, opnd-> asSrcRegRegion () , pos, bb, instIter, splitDclList);
8979
+ insertMovesFromTemp (kernel, topDcl, srcIndex, opnd, pos, bb, instIter, splitDclList);
8957
8980
}
8958
8981
8959
8982
srcIndex++;
0 commit comments