Skip to content

Commit 787f8bc

Browse files
committed
Use LSB-first nibble order in ConvertPrecision for u4/i4 types
1 parent d19dc49 commit 787f8bc

File tree

2 files changed

+42
-31
lines changed

2 files changed

+42
-31
lines changed

src/common/transformations/src/transformations/convert_precision.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "openvino/pass/constant_folding.hpp"
1515
#include "openvino/pass/manager.hpp"
1616
#include "openvino/reference/convert.hpp"
17+
#include "openvino/core/type/element_iterator.hpp"
1718
#include "ov_ops/rms.hpp"
1819
#include "ov_ops/type_relaxed.hpp"
1920
#include "transformations/fp16_compression/align_mixed_fp32_fp16_types.hpp"
@@ -1290,7 +1291,7 @@ std::shared_ptr<Node> convert_low_precisions_int(std::shared_ptr<ov::op::v0::Con
12901291
const auto size = shape_size(constant->get_shape());
12911292
size_t src_idx(0), dst_idx(0), dst_off(0), src_off(0);
12921293
if (src_type.bitwidth() < 8) {
1293-
src_off = 8 - src_type.bitwidth();
1294+
src_off = element::is_lsb_packed(src_type) ? 0 : (8 - src_type.bitwidth());
12941295
}
12951296

12961297
if (to.bitwidth() < 8) {
@@ -1342,11 +1343,21 @@ std::shared_ptr<Node> convert_low_precisions_int(std::shared_ptr<ov::op::v0::Con
13421343
}
13431344
// Calculate offsets and indexes
13441345
if (src_type.bitwidth() < 8) {
1345-
if (src_off == 0) {
1346-
src_off = 8;
1347-
src_idx++;
1346+
if (element::is_lsb_packed(src_type)) {
1347+
// LSB-first: offset goes up 0 → 4 → next byte
1348+
src_off += src_type.bitwidth();
1349+
if (src_off >= 8) {
1350+
src_off = 0;
1351+
src_idx++;
1352+
}
1353+
} else {
1354+
// MSB-first: offset goes down 4 → 0 → next byte
1355+
if (src_off == 0) {
1356+
src_off = 8;
1357+
src_idx++;
1358+
}
1359+
src_off -= src_type.bitwidth();
13481360
}
1349-
src_off -= src_type.bitwidth();
13501361
} else {
13511362
src_idx++;
13521363
}

src/common/transformations/tests/utils/convert_precision.cpp

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,110 +1598,110 @@ TEST(TransformationTests, ConvertPrecision_ConstantConversion_BoolToU8) {
15981598
}
15991599

16001600
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI8) {
1601-
constant_convert_test<uint8_t, int8_t>(element::u4, element::i8, std::vector<uint8_t>{171}, {10, 11});
1601+
constant_convert_test<uint8_t, int8_t>(element::u4, element::i8, std::vector<uint8_t>{171}, {11, 10});
16021602
}
16031603

16041604
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU8) {
1605-
constant_convert_test<uint8_t, uint8_t>(element::u4, element::u8, {171}, {10, 11});
1605+
constant_convert_test<uint8_t, uint8_t>(element::u4, element::u8, {171}, {11, 10});
16061606
}
16071607

16081608
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI8_2) {
1609-
constant_convert_test<uint8_t, int8_t>(element::u4, element::i8, {96}, {6, 0});
1609+
constant_convert_test<uint8_t, int8_t>(element::u4, element::i8, {96}, {0, 6});
16101610
}
16111611

16121612
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU8_96) {
1613-
constant_convert_test<uint8_t, uint8_t>(element::u4, element::u8, {96}, {6, 0});
1613+
constant_convert_test<uint8_t, uint8_t>(element::u4, element::u8, {96}, {0, 6});
16141614
}
16151615

16161616
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU8) {
1617-
constant_convert_test<uint8_t, uint8_t>(element::i4, element::u8, {96}, {6, 0});
1617+
constant_convert_test<uint8_t, uint8_t>(element::i4, element::u8, {96}, {0, 6});
16181618
}
16191619

16201620
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI8) {
1621-
constant_convert_test<uint8_t, int8_t>(element::i4, element::i8, {96}, {6, 0});
1621+
constant_convert_test<uint8_t, int8_t>(element::i4, element::i8, {96}, {0, 6});
16221622
}
16231623

16241624
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU8_neg) {
1625-
constant_convert_test<uint8_t, uint8_t>(element::i4, element::u8, {171}, {250, 251});
1625+
constant_convert_test<uint8_t, uint8_t>(element::i4, element::u8, {171}, {251, 250});
16261626
}
16271627

16281628
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI8_neg) {
1629-
constant_convert_test<uint8_t, int8_t>(element::i4, element::i8, {171}, {-6, -5});
1629+
constant_convert_test<uint8_t, int8_t>(element::i4, element::i8, {171}, {-5, -6});
16301630
}
16311631

16321632
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI32) {
1633-
constant_convert_test<uint8_t, int32_t>(element::u4, element::i32, {171}, {10, 11});
1633+
constant_convert_test<uint8_t, int32_t>(element::u4, element::i32, {171}, {11, 10});
16341634
}
16351635

16361636
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU32) {
1637-
constant_convert_test<uint8_t, uint32_t>(element::u4, element::u32, {171}, {10, 11});
1637+
constant_convert_test<uint8_t, uint32_t>(element::u4, element::u32, {171}, {11, 10});
16381638
}
16391639

16401640
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU32) {
1641-
constant_convert_test<uint8_t, uint32_t>(element::i4, element::u32, {96}, {6, 0});
1641+
constant_convert_test<uint8_t, uint32_t>(element::i4, element::u32, {96}, {0, 6});
16421642
}
16431643

16441644
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI32) {
1645-
constant_convert_test<uint8_t, int32_t>(element::i4, element::i32, {96}, {6, 0});
1645+
constant_convert_test<uint8_t, int32_t>(element::i4, element::i32, {96}, {0, 6});
16461646
}
16471647

16481648
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU32_neg) {
1649-
constant_convert_test<uint8_t, uint32_t>(element::i4, element::u32, {171}, {4294967290, 4294967291});
1649+
constant_convert_test<uint8_t, uint32_t>(element::i4, element::u32, {171}, {4294967291, 4294967290});
16501650
}
16511651

16521652
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI32_neg) {
1653-
constant_convert_test<uint8_t, int32_t>(element::i4, element::i32, {171}, {-6, -5});
1653+
constant_convert_test<uint8_t, int32_t>(element::i4, element::i32, {171}, {-5, -6});
16541654
}
16551655

16561656
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI16) {
1657-
constant_convert_test<uint8_t, int16_t>(element::u4, element::i16, {171}, {10, 11});
1657+
constant_convert_test<uint8_t, int16_t>(element::u4, element::i16, {171}, {11, 10});
16581658
}
16591659

16601660
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU16) {
1661-
constant_convert_test<uint8_t, uint16_t>(element::u4, element::u16, {171}, {10, 11});
1661+
constant_convert_test<uint8_t, uint16_t>(element::u4, element::u16, {171}, {11, 10});
16621662
}
16631663

16641664
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU16) {
1665-
constant_convert_test<uint8_t, uint16_t>(element::i4, element::u16, {96}, {6, 0});
1665+
constant_convert_test<uint8_t, uint16_t>(element::i4, element::u16, {96}, {0, 6});
16661666
}
16671667

16681668
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI16) {
1669-
constant_convert_test<uint8_t, int16_t>(element::i4, element::i16, {96}, {6, 0});
1669+
constant_convert_test<uint8_t, int16_t>(element::i4, element::i16, {96}, {0, 6});
16701670
}
16711671

16721672
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU16_neg) {
1673-
constant_convert_test<uint8_t, uint16_t>(element::i4, element::u16, {171}, {65530, 65531});
1673+
constant_convert_test<uint8_t, uint16_t>(element::i4, element::u16, {171}, {65531, 65530});
16741674
}
16751675

16761676
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI16_neg) {
1677-
constant_convert_test<uint8_t, int16_t>(element::i4, element::i16, {171}, {-6, -5});
1677+
constant_convert_test<uint8_t, int16_t>(element::i4, element::i16, {171}, {-5, -6});
16781678
}
16791679

16801680
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI64) {
1681-
constant_convert_test<uint8_t, int64_t>(element::u4, element::i64, {171}, {10, 11});
1681+
constant_convert_test<uint8_t, int64_t>(element::u4, element::i64, {171}, {11, 10});
16821682
}
16831683

16841684
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU64) {
1685-
constant_convert_test<uint8_t, int64_t>(element::u4, element::u64, {171}, {10, 11});
1685+
constant_convert_test<uint8_t, int64_t>(element::u4, element::u64, {171}, {11, 10});
16861686
}
16871687

16881688
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU64) {
1689-
constant_convert_test<uint8_t, uint64_t>(element::i4, element::u64, {96}, {6, 0});
1689+
constant_convert_test<uint8_t, uint64_t>(element::i4, element::u64, {96}, {0, 6});
16901690
}
16911691

16921692
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI64) {
1693-
constant_convert_test<uint8_t, int64_t>(element::i4, element::i64, {96}, {6, 0});
1693+
constant_convert_test<uint8_t, int64_t>(element::i4, element::i64, {96}, {0, 6});
16941694
}
16951695

16961696
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU64_neg) {
16971697
constant_convert_test<uint8_t, uint64_t>(element::i4,
16981698
element::u64,
16991699
{171},
1700-
{18446744073709551610u, 18446744073709551611u});
1700+
{18446744073709551611u, 18446744073709551610u});
17011701
}
17021702

17031703
TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI64_neg) {
1704-
constant_convert_test<uint8_t, int64_t>(element::i4, element::i64, {171}, {-6, -5});
1704+
constant_convert_test<uint8_t, int64_t>(element::i4, element::i64, {171}, {-5, -6});
17051705
}
17061706

17071707
TEST(TransformationTests, ConvertPrecision_ConstantConversion_U1ToU8) {

0 commit comments

Comments
 (0)