@@ -5749,31 +5749,33 @@ void HWConformity::fixSendInst(G4_BB* bb)
5749
5749
dcl->getRegVar ()->getPhyReg ()->asGreg ()->getRegNum () < 2 ));
5750
5750
};
5751
5751
5752
- if ( needsTempSrc ( inst, src0TopDcl) )
5752
+ auto fixSrc = [&](G4_INST* inst, bool isSrc0 )
5753
5753
{
5754
- uint16_t rows = inst->getMsgDesc ()->MessageLength ();
5755
- G4_Type type = src0->getType ();
5756
- G4_Declare* dcl = builder.createTempVar (rows * 8 , type, GRFALIGN);
5754
+ auto sendSrc = isSrc0 ? inst->getSrc (0 )->asSrcRegRegion () : inst->getSrc (1 )->asSrcRegRegion ();
5755
+ uint16_t rows = isSrc0 ? inst->getMsgDesc ()->MessageLength () : inst->getMsgDesc ()->extMessageLength ();
5756
+ G4_Type type = sendSrc->getType ();
5757
+ G4_Declare* dcl = builder.createTempVar (rows * builder.getNativeExecSize (), type, GRFALIGN);
5757
5758
5758
- MUST_BE_TRUE (G4_Type_Table[type].byteSize == 4 , " Invalid src0 opnd type for send." );
5759
+ MUST_BE_TRUE (G4_Type_Table[type].byteSize == 4 , " Invalid src opnd type for send." );
5759
5760
5760
5761
const RegionDesc* region = builder.getRegionStride1 ();
5761
- G4_VarBase* base = src0-> asSrcRegRegion () ->getBase ();
5762
- short baseOff = src0-> asSrcRegRegion () ->getRegOff ();
5763
- short baseSubOff = src0-> asSrcRegRegion () ->getSubRegOff ();
5762
+ G4_VarBase* base = sendSrc ->getBase ();
5763
+ short baseOff = sendSrc ->getRegOff ();
5764
+ short baseSubOff = sendSrc ->getSubRegOff ();
5764
5765
for (uint16_t idx = 0 ; idx != rows; ++idx) {
5765
5766
G4_SrcRegRegion* src = builder.createSrcRegRegion (Mod_src_undef, Direct, base, baseOff + idx, baseSubOff + 0 , region, type);
5766
5767
G4_DstRegRegion* dst = builder.createDst (dcl->getRegVar (), idx, 0 , 1 , type);
5767
-
5768
- G4_INST* newInst = builder.createMov (8 , dst, src, InstOpt_WriteEnable, false );
5769
-
5768
+ G4_INST* newInst = builder.createMov (builder.getNativeExecSize (), dst, src, InstOpt_WriteEnable, false );
5770
5769
bb->insert (i, newInst);
5771
- inst->transferDef (newInst, Opnd_src0, Opnd_src0);
5772
- newInst->addDefUse (inst, Opnd_src0);
5773
5770
}
5774
5771
5775
5772
G4_Operand* newSrc = builder.Create_Src_Opnd_From_Dcl (dcl, builder.getRegionStride1 ());
5776
- inst->setSrc (newSrc, 0 );
5773
+ inst->setSrc (newSrc, isSrc0 ? 0 : 1 );
5774
+ };
5775
+
5776
+ if (needsTempSrc (inst, src0TopDcl))
5777
+ {
5778
+ fixSrc (inst, true );
5777
5779
}
5778
5780
5779
5781
if (inst->isSplitSend () && !inst->getSrc (1 )->isNullReg ())
@@ -5788,30 +5790,7 @@ void HWConformity::fixSendInst(G4_BB* bb)
5788
5790
5789
5791
if (needsTempSrc (inst, src1TopDcl))
5790
5792
{
5791
- uint16_t rows = inst->getMsgDesc ()->extMessageLength ();
5792
- G4_Type type = src1->getType ();
5793
- G4_Declare* dcl = builder.createTempVar (rows * 8 , type, GRFALIGN);
5794
-
5795
- MUST_BE_TRUE (G4_Type_Table[type].byteSize == 4 , " Invalid src1 opnd type for send." );
5796
-
5797
- const RegionDesc* region = builder.getRegionStride1 ();
5798
- G4_VarBase* base = src1->asSrcRegRegion ()->getBase ();
5799
- short baseOff = src1->asSrcRegRegion ()->getRegOff ();
5800
- short baseSubOff = src1->asSrcRegRegion ()->getSubRegOff ();
5801
- for (uint16_t idx = 0 ; idx != rows; ++idx)
5802
- {
5803
- G4_SrcRegRegion* src = builder.createSrcRegRegion (Mod_src_undef, Direct, base, baseOff + idx, baseSubOff + 0 , region, type);
5804
- G4_DstRegRegion* dst = builder.createDst (dcl->getRegVar (), idx, 0 , 1 , type);
5805
-
5806
- G4_INST* newInst = builder.createMov (8 , dst, src, InstOpt_WriteEnable, false );
5807
-
5808
- bb->insert (i, newInst);
5809
- inst->transferDef (newInst, Opnd_src1, Opnd_src1);
5810
- newInst->addDefUse (inst, Opnd_src1);
5811
- }
5812
-
5813
- G4_Operand* newSrc = builder.Create_Src_Opnd_From_Dcl (dcl, region);
5814
- inst->setSrc (newSrc, 1 );
5793
+ fixSrc (inst, false );
5815
5794
}
5816
5795
}
5817
5796
@@ -6171,10 +6150,10 @@ bool HWConformity::fixAddcSubb(G4_BB* bb)
6171
6150
{
6172
6151
G4_INST* inst = *iter;
6173
6152
if ((inst->opcode () == G4_addc || inst->opcode () == G4_subb) &&
6174
- inst->getExecSize () != 8 )
6153
+ inst->getExecSize () != builder. getNativeExecSize () )
6175
6154
{
6176
6155
// find the matching carry move
6177
- G4_INST* carryMov = NULL ;
6156
+ G4_INST* carryMov = nullptr ;
6178
6157
auto movIter = iter;
6179
6158
for (++movIter; movIter != iterEnd; ++movIter)
6180
6159
{
0 commit comments