@@ -5989,7 +5989,7 @@ void HWConformity::conformBB(G4_BB* bb)
5989
5989
}
5990
5990
// do this early since otherwise the moves inserted by other passes may still
5991
5991
// inherit bad regions from the original inst
5992
- fixSrcRegion (i, bb );
5992
+ fixSrcRegion (inst );
5993
5993
5994
5994
bool changed = fixMov (i, bb);
5995
5995
if (changed)
@@ -6249,6 +6249,20 @@ void HWConformity::conformBB(G4_BB* bb)
6249
6249
#endif
6250
6250
}
6251
6251
6252
+ if (builder.hasBDstWSrc1EvenAlignIssue ())
6253
+ {
6254
+ i = bb->begin (), iEnd = bb->end ();
6255
+ next_iter = i;
6256
+ for (; i != iEnd; i = next_iter)
6257
+ {
6258
+ ++next_iter;
6259
+ fixOddAlignSrc1Region (i, bb);
6260
+ #ifdef _DEBUG
6261
+ verifyG4Kernel (kernel, Optimizer::PI_HWConformityChk, false );
6262
+ #endif
6263
+ }
6264
+ }
6265
+
6252
6266
if (VISA_WA_CHECK (builder.getPWaTable (), Wa_16012725276))
6253
6267
{
6254
6268
for (auto it = bb->begin (), itEnd = bb->end (); it != itEnd; ++it)
@@ -7298,8 +7312,8 @@ G4_INST* HWConformity::splitInstWithByteDst(G4_INST* expand_op)
7298
7312
// 7. Dst.HorzStride must not be 0. -- this needs not to be checked.
7299
7313
// 8. VertStride must be used to cross GRF register boundaries. This rule implies that
7300
7314
// elements within a 'Width' cannot cross GRF boundaries.
7301
- void HWConformity::fixSrcRegion (INST_LIST_ITER i, G4_BB *bb ) {
7302
- G4_INST *inst = *i;
7315
+ void HWConformity::fixSrcRegion (G4_INST *inst ) {
7316
+
7303
7317
bool comprInst = isCompressedInst (inst);
7304
7318
for (int i = 0 ; i < G4_MAX_SRCS; i++)
7305
7319
{
@@ -7411,25 +7425,32 @@ void HWConformity::fixSrcRegion(INST_LIST_ITER i, G4_BB *bb) {
7411
7425
}
7412
7426
}
7413
7427
}
7414
-
7415
7428
if (inst->getDst () && !inst->hasNULLDst ())
7416
7429
{
7417
7430
MUST_BE_TRUE (inst->getDst ()->getHorzStride () != 0 ,
7418
7431
" Bad source region: Width is greater than execution size." );
7432
+ }
7433
+ }
7419
7434
7420
- if (builder.hasBDstWSrc1EvenAlignIssue ()) {
7421
- G4_Operand *src1 = inst->getSrc (1 );
7422
- if (src1 && src1->isSrcRegRegion ()) {
7423
- G4_Operand *dst = inst->getDst ();
7424
- if (dst && dst->isDstRegRegion () &&
7425
- dst->asDstRegRegion ()->getHorzStride () > 2 &&
7426
- (dst->getType () == Type_B || dst->getType () == Type_UB) &&
7427
- (src1->getType () == Type_W || src1->getType () == Type_UW) &&
7428
- (src1->asSrcRegRegion ()->getSubRegOff () % 2 )) {
7429
- G4_Operand *new_src1 =
7430
- insertMovBefore (i, 1 , src1->getType (), bb, Even_Word);
7431
- inst->setSrc (new_src1, 1 );
7432
- }
7435
+ void HWConformity::fixOddAlignSrc1Region (INST_LIST_ITER i, G4_BB *bb)
7436
+ {
7437
+ G4_INST *inst = *i;
7438
+
7439
+ if (inst->getDst () && !inst->hasNULLDst ())
7440
+ {
7441
+ G4_Operand *src1 = inst->getSrc (1 );
7442
+ if (src1 && src1->isSrcRegRegion ())
7443
+ {
7444
+ G4_Operand *dst = inst->getDst ();
7445
+ if (dst && dst->isDstRegRegion () &&
7446
+ dst->asDstRegRegion ()->getHorzStride () > 2 &&
7447
+ (dst->getType () == Type_B || dst->getType () == Type_UB) &&
7448
+ (src1->getType () == Type_W || src1->getType () == Type_UW) &&
7449
+ (src1->asSrcRegRegion ()->getSubRegOff () % 2 ))
7450
+ {
7451
+ G4_Operand *new_src1 =
7452
+ insertMovBefore (i, 1 , src1->getType (), bb, Even_Word);
7453
+ inst->setSrc (new_src1, 1 );
7433
7454
}
7434
7455
}
7435
7456
}
0 commit comments