@@ -329,17 +329,10 @@ void EncoderBase::encodeInstruction(Instruction& inst)
329329
330330 GED_ENCODE (MaskCtrl, IGAToGEDTranslation::lowerEmask (inst.getMaskCtrl ()));
331331
332- // GED_ExecutionDataType
332+ // Predicate
333333 const Predication &pred = inst.getPredication ();
334- RegRef flagReg = inst.getFlagReg ();
335- if (flagReg != REGREF_INVALID) {
336- GED_ENCODE (FlagRegNum, static_cast <uint32_t >(inst.getFlagReg ().regNum ));
337- GED_ENCODE (FlagSubRegNum, inst.getFlagReg ().subRegNum );
338- }
339-
340334 if (os.supportsPredication ()) {
341335 GED_ENCODE (PredCtrl, IGAToGEDTranslation::lowerPredCtrl (pred.function ));
342- GED_ENCODE (PredInv, pred.inverse ? GED_PRED_INV_Invert : GED_PRED_INV_Normal);
343336 } else {
344337 GED_ENCODE (PredCtrl, GED_PRED_CTRL_Normal);
345338 }
@@ -352,6 +345,18 @@ void EncoderBase::encodeInstruction(Instruction& inst)
352345 }
353346 }
354347
348+ bool hasFlagRegField = true ;
349+
350+ if (os.supportsPredication () && hasFlagRegField)
351+ GED_ENCODE (PredInv, pred.inverse ? GED_PRED_INV_Invert : GED_PRED_INV_Normal);
352+
353+ // GED_ExecutionDataType
354+ RegRef flagReg = inst.getFlagReg ();
355+ if (hasFlagRegField && (flagReg != REGREF_INVALID)) {
356+ GED_ENCODE (FlagRegNum, static_cast <uint32_t >(inst.getFlagReg ().regNum ));
357+ GED_ENCODE (FlagSubRegNum, inst.getFlagReg ().subRegNum );
358+ }
359+
355360 // set AccWrEn where supported
356361 if (inst.hasInstOpt (InstOpt::ACCWREN)) {
357362 GED_ENCODE (AccWrCtrl, GED_ACC_WR_CTRL_AccWrEn);
@@ -428,9 +433,8 @@ void EncoderBase::encodeTernaryDestinationAlign1(
428433 GED_ENCODE (DstMathMacroExt, IGAToGEDTranslation::lowerMathMacroReg (dst.getMathMacroExt ()));
429434 // GED_ENCODE(DstHorzStride, 1);
430435 } else {
431- uint32_t subRegNum = SubRegToBytesOffset (
432- dst.getDirRegRef ().subRegNum , dst.getDirRegName (), dst.getType ());
433- GED_ENCODE (DstSubRegNum, subRegNum);
436+ encodeDstSubRegNum (subRegNumToBinNum (
437+ dst.getDirRegRef ().subRegNum , dst.getDirRegName (), dst.getType ()), true );
434438 bool hasDstRgnHz = true ;
435439 if (hasDstRgnHz) {
436440 GED_ENCODE (DstHorzStride, static_cast <int >(dst.getRegion ().getHz ()));
@@ -495,9 +499,9 @@ void EncoderBase::encodeTernarySourceAlign1(
495499 encodeSrcRegionHorz<S>(Region::Horz::HZ_1);
496500
497501 } else {
498- uint32_t subRegNum = SubRegToBytesOffset (
502+ auto subReg = subRegNumToBinNum (
499503 src.getDirRegRef ().subRegNum , src.getDirRegName (), src.getType ());
500- encodeSrcSubRegNum<S>(subRegNum );
504+ encodeSrcSubRegNum<S>(subReg, true );
501505 }
502506 break ;
503507 }
@@ -841,11 +845,11 @@ void EncoderBase::encodeBranchDestination(
841845 GED_ENCODE (DstRegFile,
842846 IGAToGEDTranslation::lowerRegFile (dst.getDirRegName ()));
843847 encodeDstReg (dst.getDirRegName (), dst.getDirRegRef ().regNum );
844- GED_ENCODE (DstSubRegNum,
845- SubRegToBytesOffset (
846- dst.getDirRegRef (). subRegNum ,
847- dst.getDirRegName ( ),
848- dst. getType ()) );
848+ encodeDstSubRegNum ( subRegNumToBinNum (
849+ dst. getDirRegRef (). subRegNum ,
850+ dst.getDirRegName () ,
851+ dst.getType () ),
852+ true );
849853}
850854
851855void EncoderBase::encodeBasicDestination (
@@ -911,12 +915,14 @@ void EncoderBase::encodeBasicDestination(
911915 encodeDstReg (dst.getDirRegName (), dst.getDirRegRef ().regNum );
912916 GED_ENCODE (DstChanEn, GED_DST_CHAN_EN_xyzw);
913917 }
914- GED_ENCODE (DstSubRegNum,
915- SubRegToBytesOffset (dst.getDirRegRef ().subRegNum , dst.getDirRegName (), dst.getType ()));
918+ encodeDstSubRegNum (
919+ subRegNumToBinNum (dst.getDirRegRef ().subRegNum , dst.getDirRegName (), dst.getType ()),
920+ inst.getOpSpec ().isTernary () || inst.getOpSpec ().isBranching ());
916921 } else { // Align1
917922 encodeDstReg (dst.getDirRegName (), dst.getDirRegRef ().regNum );
918- GED_ENCODE (DstSubRegNum,
919- SubRegToBytesOffset (dst.getDirRegRef ().subRegNum , dst.getDirRegName (), dst.getType ()));
923+ encodeDstSubRegNum (
924+ subRegNumToBinNum (dst.getDirRegRef ().subRegNum , dst.getDirRegName (), dst.getType ()),
925+ inst.getOpSpec ().isTernary () || inst.getOpSpec ().isBranching ());
920926 }
921927 break ;
922928 case Operand::Kind::MACRO:
@@ -971,9 +977,9 @@ void EncoderBase::encodeBranchSource(
971977{
972978 encodeSrcRegFile<SourceIndex::SRC0>(IGAToGEDTranslation::lowerRegFile (src.getDirRegName ()));
973979 encodeSrcReg<SourceIndex::SRC0>(src.getDirRegName (),src.getDirRegRef ().regNum );
974- uint32_t subRegBits = SubRegToBytesOffset (
980+ auto subReg = subRegNumToBinNum (
975981 src.getDirRegRef ().subRegNum , src.getDirRegName (), Type::D);
976- encodeSrcSubRegNum<SourceIndex::SRC0>(subRegBits );
982+ encodeSrcSubRegNum<SourceIndex::SRC0>(subReg, true );
977983}
978984
979985template <SourceIndex S>
@@ -1016,9 +1022,10 @@ void EncoderBase::encodeBasicSource(
10161022 encodeSrcReg<S>(RegName::ARF_MME, 0 );
10171023 } else {
10181024 encodeSrcReg<S>(src.getDirRegName (), src.getDirRegRef ().regNum );
1019- uint32_t subRegBits = SubRegToBytesOffset (
1025+ auto subReg = subRegNumToBinNum (
10201026 src.getDirRegRef ().subRegNum , src.getDirRegName (), src.getType ());
1021- encodeSrcSubRegNum<S>(subRegBits);
1027+ encodeSrcSubRegNum<S>(subReg,
1028+ inst.getOpSpec ().isTernary () || inst.getOpSpec ().isBranching ());
10221029 }
10231030 } else { // (src.getKind() == Operand::Kind::MACRO)
10241031 encodeSrcReg<S>(RegName::GRF_R,src.getDirRegRef ().regNum );
@@ -1216,8 +1223,8 @@ void EncoderBase::encodeSendSource0(const Operand& src)
12161223 else if ( src.getKind () == Operand::Kind::INDIRECT )
12171224 {
12181225 GED_ENCODE (Src0DataType, IGAToGEDTranslation::lowerDataType (t));
1219- GED_ENCODE (Src0AddrImm, src.getIndImmAddr ());
12201226 GED_ENCODE (Src0AddrSubRegNum, src.getIndAddrReg ().subRegNum );
1227+ GED_ENCODE (Src0AddrImm, src.getIndImmAddr ());
12211228 }
12221229}
12231230
@@ -1276,8 +1283,8 @@ void EncoderBase::encodeSendsDestination(const Operand& dst)
12761283
12771284 GED_ENCODE (DstRegNum, dst.getDirRegRef ().regNum );
12781285 // TODO: set correct regType
1279- GED_ENCODE (DstSubRegNum,
1280- SubRegToBytesOffset (dst.getDirRegRef ().subRegNum , RegName::GRF_R, dst.getType ()));
1286+ encodeDstSubRegNum (
1287+ subRegNumToBinNum (dst.getDirRegRef ().subRegNum , RegName::GRF_R, dst.getType ()), true );
12811288}
12821289
12831290template <SourceIndex S>
@@ -1366,9 +1373,9 @@ void EncoderBase::encodeTernarySourceAlign16(const Instruction& inst)
13661373 }
13671374 uint32_t regNum = reg.regNum ;
13681375 encodeSrcReg<S>(RegName::GRF_R,regNum);
1369- uint32_t subRegNum =
1370- SubRegToBytesOffset (subRegNumber, src.getDirRegName (), src.getType ());
1371- encodeSrcSubRegNum<S>(subRegNum );
1376+ auto subReg =
1377+ subRegNumToBinNum (subRegNumber, src.getDirRegName (), src.getType ());
1378+ encodeSrcSubRegNum<S>(subReg, true );
13721379 } else {
13731380 // implicit operand accumulator
13741381 // e.g. madm (4) ... -r14.acc3
@@ -1446,9 +1453,8 @@ void EncoderBase::encodeTernaryDestinationAlign16(const Instruction& inst)
14461453 }
14471454 }
14481455 GED_ENCODE (DstChanEn, chanEn);
1449- uint32_t subRegNum = SubRegToBytesOffset (
1450- reg.subRegNum , dst.getDirRegName (), dst.getType ());
1451- GED_ENCODE (DstSubRegNum, subRegNum);
1456+ encodeDstSubRegNum (subRegNumToBinNum (
1457+ reg.subRegNum , dst.getDirRegName (), dst.getType ()), true );
14521458 }
14531459}
14541460
@@ -1568,6 +1574,16 @@ void EncoderBase::encodeOptionsThreadControl(const Instruction& inst)
15681574 }
15691575}
15701576
1577+ // Translate from subRegNum to num represented in binary encoding
1578+ std::pair<bool , uint32_t > EncoderBase::subRegNumToBinNum (int subRegNum, RegName regName, Type type)
1579+ {
1580+ return std::make_pair (true , SubRegToBytesOffset (subRegNum, regName, type));
1581+ }
1582+
1583+ void EncoderBase::encodeDstSubRegNum (std::pair<bool , uint32_t > subReg, bool isTernaryOrBranch)
1584+ {
1585+ GED_ENCODE (DstSubRegNum, subReg.second );
1586+ }
15711587
15721588void EncoderBase::encodeOptions (const Instruction& inst)
15731589{
0 commit comments