diff --git a/src/isa/codec.cpp b/src/isa/codec.cpp index 8378330..13b1c3d 100644 --- a/src/isa/codec.cpp +++ b/src/isa/codec.cpp @@ -283,6 +283,8 @@ MinstEncodedWord EncodeMinst(const Minst &inst) noexcept { } } + bits = (bits & ~inst.form->mask) | inst.form->match; + for (const auto &constraint : ConstraintsFor(*inst.form)) { const auto *field = inst.FindDecodedField(constraint.field_name); if (field == nullptr) { diff --git a/src/isa/generated_tables.cpp b/src/isa/generated_tables.cpp index 67e9a3d..7b6e235 100644 --- a/src/isa/generated_tables.cpp +++ b/src/isa/generated_tables.cpp @@ -4825,61 +4825,61 @@ const MinstFormDesc kForms[] = { .constraint_start = 1, .constraint_count = 0}, {.uid = "5537088c4f03", - .mnemonic = "B.IOT", - .asm_template = "B.IOT [SrcTile0<.reuse>, SrcTile1<.reuse>], group=1, ->DstTile", + .mnemonic = "B.ITP", + .asm_template = "B.ITP [SrcTile0<.reuse>, SrcTile1<.reuse>], last, src_pair", .encoding_kind = "L32", .group = "Block Input & Output", .uop_group = "CMD", .uop_big_kind = "CMD", .length_bits = 32, - .fixed_bits = 10, - .mask = 0x707fULL, - .match = 0x5013ULL, + .fixed_bits = 11, + .mask = 0xf0ffULL, + .match = 0xa013ULL, .field_start = 77, .field_count = 8, .constraint_start = 1, .constraint_count = 0}, {.uid = "f6b1a38eb134", - .mnemonic = "B.IOT", - .asm_template = "B.IOT [SrcTile0<.reuse>, SrcTile1<.reuse>], group=0, ->DstTile", + .mnemonic = "B.ITP", + .asm_template = "B.ITP [SrcTile0<.reuse>, SrcTile1<.reuse>], src_pair", .encoding_kind = "L32", .group = "Block Input & Output", .uop_group = "CMD", .uop_big_kind = "CMD", .length_bits = 32, - .fixed_bits = 10, - .mask = 0x707fULL, - .match = 0x4013ULL, + .fixed_bits = 11, + .mask = 0xf0ffULL, + .match = 0x2013ULL, .field_start = 85, .field_count = 8, .constraint_start = 1, .constraint_count = 0}, {.uid = "0be0ecce86bb", - .mnemonic = "B.IOTI", - .asm_template = "B.IOTI [SrcTile0<.reuse>, SrcTile1<.reuse>], group=0, ->DstTile", + .mnemonic = "B.OTA", + .asm_template = "B.OTA ->DstTile, dst_slot", .encoding_kind = "L32", .group = "Block Input & Output", .uop_group = "CMD", .uop_big_kind = "CMD", .length_bits = 32, - .fixed_bits = 10, - .mask = 0x707fULL, - .match = 0x6013ULL, + .fixed_bits = 11, + .mask = 0xf0ffULL, + .match = 0x3013ULL, .field_start = 93, .field_count = 8, .constraint_start = 1, .constraint_count = 0}, {.uid = "fb045cf4149a", - .mnemonic = "B.IOTI", - .asm_template = "B.IOTI [SrcTile0<.reuse>, SrcTile1<.reuse>], group=1, ->DstTile", + .mnemonic = "B.OTA", + .asm_template = "B.OTA ->DstTile, last, dst_slot", .encoding_kind = "L32", .group = "Block Input & Output", .uop_group = "CMD", .uop_big_kind = "CMD", .length_bits = 32, - .fixed_bits = 10, - .mask = 0x707fULL, - .match = 0x7013ULL, + .fixed_bits = 11, + .mask = 0xf0ffULL, + .match = 0xb013ULL, .field_start = 101, .field_count = 8, .constraint_start = 1, @@ -5126,7 +5126,7 @@ const MinstFormDesc kForms[] = { .constraint_count = 0}, {.uid = "bd3f337acb9d", .mnemonic = "BSTART.CUBE", - .asm_template = "BSTART.CUBE Function, DataType", + .asm_template = "BSTART.CUBE 0, DataType", .encoding_kind = "L32", .group = "Block Split", .uop_group = "CMD", @@ -5141,7 +5141,7 @@ const MinstFormDesc kForms[] = { .constraint_count = 3}, {.uid = "3b0ae11126a6", .mnemonic = "BSTART.FIXP", - .asm_template = "BSTART.FIXP TileOp, DataType", + .asm_template = "BSTART.FIXP Function, DataType", .encoding_kind = "L32", .group = "Block Split", .uop_group = "CMD", @@ -5470,8 +5470,8 @@ const MinstFormDesc kForms[] = { .constraint_start = 4, .constraint_count = 1}, {.uid = "f9da70e4e0ad", - .mnemonic = "BSTART.TMATMUL", - .asm_template = "BSTART.TMATMUL DataType", + .mnemonic = "BSTART.CUBE", + .asm_template = "BSTART.CUBE 2, DataType", .encoding_kind = "L32", .group = "Block Split", .uop_group = "CMD", @@ -5485,8 +5485,8 @@ const MinstFormDesc kForms[] = { .constraint_start = 5, .constraint_count = 0}, {.uid = "0c8c62e5f00a", - .mnemonic = "BSTART.TMATMUL.ACC", - .asm_template = "BSTART.TMATMUL.ACC DataType", + .mnemonic = "BSTART.CUBE", + .asm_template = "BSTART.CUBE Function, DataType", .encoding_kind = "L32", .group = "Block Split", .uop_group = "CMD", @@ -5500,8 +5500,8 @@ const MinstFormDesc kForms[] = { .constraint_start = 5, .constraint_count = 0}, {.uid = "211446509efb", - .mnemonic = "BSTART.TMOV", - .asm_template = "BSTART.TMOV DataType", + .mnemonic = "BSTART.FIXP", + .asm_template = "BSTART.FIXP 2, DataType", .encoding_kind = "L32", .group = "Block Split", .uop_group = "CMD", @@ -5515,8 +5515,8 @@ const MinstFormDesc kForms[] = { .constraint_start = 5, .constraint_count = 0}, {.uid = "4048b6e8b0f4", - .mnemonic = "BSTART.TSTORE", - .asm_template = "BSTART.TSTORE DataType", + .mnemonic = "BSTART.TMA", + .asm_template = "BSTART.TMA 1, DataType", .encoding_kind = "L32", .group = "Block Split", .uop_group = "CMD", diff --git a/tests/unit/minst_test.cpp b/tests/unit/minst_test.cpp index 8a54402..648d225 100644 --- a/tests/unit/minst_test.cpp +++ b/tests/unit/minst_test.cpp @@ -19,6 +19,7 @@ using linx::model::isa::DecodeMinstPacked; using linx::model::isa::EncodeMinst; using linx::model::isa::FieldsFor; using linx::model::isa::LookupFormByMnemonic; +using linx::model::isa::LookupFormByUid; using linx::model::isa::Minst; using linx::model::isa::MinstCodecStatus; using linx::model::isa::MinstConstraintDesc; @@ -366,6 +367,45 @@ int RunAsmTemplateReplacementSmoke() { return 0; } +int RunDescriptorLastBitSmoke() { + struct Case { + std::string_view uid; + bool last; + }; + const std::array cases = {{ + {"5537088c4f03", true}, + {"f6b1a38eb134", false}, + {"0be0ecce86bb", false}, + {"fb045cf4149a", true}, + }}; + + for (std::size_t i = 0; i < cases.size(); ++i) { + const auto *form = LookupFormByUid(cases[i].uid); + if (form == nullptr) { + return 60 + static_cast(i); + } + + Minst inst = BuildSatisfyingInst(*form); + const auto encoded = EncodeMinst(inst); + if (!encoded.valid || encoded.status != MinstCodecStatus::Ok) { + return 64 + static_cast(i); + } + if (((encoded.bits & (std::uint64_t{1} << 15U)) != 0) != cases[i].last) { + return 68 + static_cast(i); + } + + Minst decoded; + if (DecodeMinstPacked(encoded.bits, encoded.length_bits, decoded) != MinstCodecStatus::Ok) { + return 72 + static_cast(i); + } + if (decoded.form_id != cases[i].uid) { + return 76 + static_cast(i); + } + } + + return 0; +} + } // namespace int main() { @@ -399,5 +439,10 @@ int main() { std::cerr << "RunAsmTemplateReplacementSmoke failed with code " << asm_replace << '\n'; return 6; } + const auto descriptor_last = RunDescriptorLastBitSmoke(); + if (descriptor_last != 0) { + std::cerr << "RunDescriptorLastBitSmoke failed with code " << descriptor_last << '\n'; + return 7; + } return 0; }