@@ -5749,31 +5749,33 @@ void HWConformity::fixSendInst(G4_BB* bb)
57495749 dcl->getRegVar ()->getPhyReg ()->asGreg ()->getRegNum () < 2 ));
57505750 };
57515751
5752- if ( needsTempSrc ( inst, src0TopDcl) )
5752+ auto fixSrc = [&](G4_INST* inst, bool isSrc0 )
57535753 {
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);
57575758
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." );
57595760
57605761 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 ();
57645765 for (uint16_t idx = 0 ; idx != rows; ++idx) {
57655766 G4_SrcRegRegion* src = builder.createSrcRegRegion (Mod_src_undef, Direct, base, baseOff + idx, baseSubOff + 0 , region, type);
57665767 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 );
57705769 bb->insert (i, newInst);
5771- inst->transferDef (newInst, Opnd_src0, Opnd_src0);
5772- newInst->addDefUse (inst, Opnd_src0);
57735770 }
57745771
57755772 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 );
57775779 }
57785780
57795781 if (inst->isSplitSend () && !inst->getSrc (1 )->isNullReg ())
@@ -5788,30 +5790,7 @@ void HWConformity::fixSendInst(G4_BB* bb)
57885790
57895791 if (needsTempSrc (inst, src1TopDcl))
57905792 {
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 );
58155794 }
58165795 }
58175796
@@ -6171,10 +6150,10 @@ bool HWConformity::fixAddcSubb(G4_BB* bb)
61716150 {
61726151 G4_INST* inst = *iter;
61736152 if ((inst->opcode () == G4_addc || inst->opcode () == G4_subb) &&
6174- inst->getExecSize () != 8 )
6153+ inst->getExecSize () != builder. getNativeExecSize () )
61756154 {
61766155 // find the matching carry move
6177- G4_INST* carryMov = NULL ;
6156+ G4_INST* carryMov = nullptr ;
61786157 auto movIter = iter;
61796158 for (++movIter; movIter != iterEnd; ++movIter)
61806159 {
0 commit comments