@@ -329,17 +329,10 @@ void EncoderBase::encodeInstruction(Instruction& inst)
329
329
330
330
GED_ENCODE (MaskCtrl, IGAToGEDTranslation::lowerEmask (inst.getMaskCtrl ()));
331
331
332
- // GED_ExecutionDataType
332
+ // Predicate
333
333
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
-
340
334
if (os.supportsPredication ()) {
341
335
GED_ENCODE (PredCtrl, IGAToGEDTranslation::lowerPredCtrl (pred.function ));
342
- GED_ENCODE (PredInv, pred.inverse ? GED_PRED_INV_Invert : GED_PRED_INV_Normal);
343
336
} else {
344
337
GED_ENCODE (PredCtrl, GED_PRED_CTRL_Normal);
345
338
}
@@ -352,6 +345,18 @@ void EncoderBase::encodeInstruction(Instruction& inst)
352
345
}
353
346
}
354
347
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
+
355
360
// set AccWrEn where supported
356
361
if (inst.hasInstOpt (InstOpt::ACCWREN)) {
357
362
GED_ENCODE (AccWrCtrl, GED_ACC_WR_CTRL_AccWrEn);
@@ -428,9 +433,8 @@ void EncoderBase::encodeTernaryDestinationAlign1(
428
433
GED_ENCODE (DstMathMacroExt, IGAToGEDTranslation::lowerMathMacroReg (dst.getMathMacroExt ()));
429
434
// GED_ENCODE(DstHorzStride, 1);
430
435
} 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 );
434
438
bool hasDstRgnHz = true ;
435
439
if (hasDstRgnHz) {
436
440
GED_ENCODE (DstHorzStride, static_cast <int >(dst.getRegion ().getHz ()));
@@ -495,9 +499,9 @@ void EncoderBase::encodeTernarySourceAlign1(
495
499
encodeSrcRegionHorz<S>(Region::Horz::HZ_1);
496
500
497
501
} else {
498
- uint32_t subRegNum = SubRegToBytesOffset (
502
+ auto subReg = subRegNumToBinNum (
499
503
src.getDirRegRef ().subRegNum , src.getDirRegName (), src.getType ());
500
- encodeSrcSubRegNum<S>(subRegNum );
504
+ encodeSrcSubRegNum<S>(subReg, true );
501
505
}
502
506
break ;
503
507
}
@@ -841,11 +845,11 @@ void EncoderBase::encodeBranchDestination(
841
845
GED_ENCODE (DstRegFile,
842
846
IGAToGEDTranslation::lowerRegFile (dst.getDirRegName ()));
843
847
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 );
849
853
}
850
854
851
855
void EncoderBase::encodeBasicDestination (
@@ -911,12 +915,14 @@ void EncoderBase::encodeBasicDestination(
911
915
encodeDstReg (dst.getDirRegName (), dst.getDirRegRef ().regNum );
912
916
GED_ENCODE (DstChanEn, GED_DST_CHAN_EN_xyzw);
913
917
}
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 ());
916
921
} else { // Align1
917
922
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 ());
920
926
}
921
927
break ;
922
928
case Operand::Kind::MACRO:
@@ -971,9 +977,9 @@ void EncoderBase::encodeBranchSource(
971
977
{
972
978
encodeSrcRegFile<SourceIndex::SRC0>(IGAToGEDTranslation::lowerRegFile (src.getDirRegName ()));
973
979
encodeSrcReg<SourceIndex::SRC0>(src.getDirRegName (),src.getDirRegRef ().regNum );
974
- uint32_t subRegBits = SubRegToBytesOffset (
980
+ auto subReg = subRegNumToBinNum (
975
981
src.getDirRegRef ().subRegNum , src.getDirRegName (), Type::D);
976
- encodeSrcSubRegNum<SourceIndex::SRC0>(subRegBits );
982
+ encodeSrcSubRegNum<SourceIndex::SRC0>(subReg, true );
977
983
}
978
984
979
985
template <SourceIndex S>
@@ -1016,9 +1022,10 @@ void EncoderBase::encodeBasicSource(
1016
1022
encodeSrcReg<S>(RegName::ARF_MME, 0 );
1017
1023
} else {
1018
1024
encodeSrcReg<S>(src.getDirRegName (), src.getDirRegRef ().regNum );
1019
- uint32_t subRegBits = SubRegToBytesOffset (
1025
+ auto subReg = subRegNumToBinNum (
1020
1026
src.getDirRegRef ().subRegNum , src.getDirRegName (), src.getType ());
1021
- encodeSrcSubRegNum<S>(subRegBits);
1027
+ encodeSrcSubRegNum<S>(subReg,
1028
+ inst.getOpSpec ().isTernary () || inst.getOpSpec ().isBranching ());
1022
1029
}
1023
1030
} else { // (src.getKind() == Operand::Kind::MACRO)
1024
1031
encodeSrcReg<S>(RegName::GRF_R,src.getDirRegRef ().regNum );
@@ -1216,8 +1223,8 @@ void EncoderBase::encodeSendSource0(const Operand& src)
1216
1223
else if ( src.getKind () == Operand::Kind::INDIRECT )
1217
1224
{
1218
1225
GED_ENCODE (Src0DataType, IGAToGEDTranslation::lowerDataType (t));
1219
- GED_ENCODE (Src0AddrImm, src.getIndImmAddr ());
1220
1226
GED_ENCODE (Src0AddrSubRegNum, src.getIndAddrReg ().subRegNum );
1227
+ GED_ENCODE (Src0AddrImm, src.getIndImmAddr ());
1221
1228
}
1222
1229
}
1223
1230
@@ -1276,8 +1283,8 @@ void EncoderBase::encodeSendsDestination(const Operand& dst)
1276
1283
1277
1284
GED_ENCODE (DstRegNum, dst.getDirRegRef ().regNum );
1278
1285
// 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 );
1281
1288
}
1282
1289
1283
1290
template <SourceIndex S>
@@ -1366,9 +1373,9 @@ void EncoderBase::encodeTernarySourceAlign16(const Instruction& inst)
1366
1373
}
1367
1374
uint32_t regNum = reg.regNum ;
1368
1375
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 );
1372
1379
} else {
1373
1380
// implicit operand accumulator
1374
1381
// e.g. madm (4) ... -r14.acc3
@@ -1446,9 +1453,8 @@ void EncoderBase::encodeTernaryDestinationAlign16(const Instruction& inst)
1446
1453
}
1447
1454
}
1448
1455
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 );
1452
1458
}
1453
1459
}
1454
1460
@@ -1568,6 +1574,16 @@ void EncoderBase::encodeOptionsThreadControl(const Instruction& inst)
1568
1574
}
1569
1575
}
1570
1576
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
+ }
1571
1587
1572
1588
void EncoderBase::encodeOptions (const Instruction& inst)
1573
1589
{
0 commit comments