@@ -6474,10 +6474,10 @@ bool Optimizer::foldPseudoAndOr(G4_BB* bb, INST_LIST_ITER& ii)
64746474 if (start > 0 )
64756475 {
64766476 // just change immediate offset
6477- uint16_t subRegOff = src->getSubRegOff () + start ;
6478- G4_SrcRegRegion* newSrc = createSrcRegRegion ( src->getModifier (), src->getRegAccess (), src-> getBase (),
6479- src->getRegOff (), subRegOff, src->getRegion (), src->getType (), src->getAccRegSel ());
6480- newSrc-> setImmAddrOff ( src->getAddrImm ());
6477+ assert ((start % src->getRegion ()-> width == 0 ) && " illegal starting offset and width combination " ) ;
6478+ uint16_t subRegOff = src->getSubRegOff () + start / src->getRegion ()-> width ;
6479+ auto newSrc = createIndirectSrc ( src->getModifier (), src->getBase (), src->getRegOff (), subRegOff, src->getRegion (),
6480+ src-> getType (), src->getAddrImm ());
64816481 return newSrc;
64826482 }
64836483 else
@@ -6492,10 +6492,8 @@ bool Optimizer::foldPseudoAndOr(G4_BB* bb, INST_LIST_ITER& ii)
64926492 short numRows = start / wd;
64936493 short numCols = start % wd;
64946494 short newOff = (numRows * vs + numCols * hs) * G4_Type_Table[src->getType ()].byteSize ;
6495-
6496- G4_SrcRegRegion* newSrc = createSrcRegRegion (src->getModifier (), src->getRegAccess (), src->getBase (),
6497- src->getRegOff (), src->getSubRegOff (), rd, src->getType (), src->getAccRegSel ());
6498- newSrc->setImmAddrOff (src->getAddrImm () + newOff);
6495+ auto newSrc = createIndirectSrc (src->getModifier (), src->getBase (), src->getRegOff (), src->getSubRegOff (), rd,
6496+ src->getType (), src->getAddrImm () + newOff);
64996497 return newSrc;
65006498
65016499 }
0 commit comments