Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include "itt.hpp"
#include "openvino/core/graph_util.hpp"
#include "openvino/core/rt_info/weightless_caching_attributes.hpp"
#include "openvino/core/type/element_iterator.hpp"
#include "openvino/op/ops.hpp"
#include "openvino/pass/constant_folding.hpp"
#include "openvino/pass/manager.hpp"
Expand Down Expand Up @@ -1290,7 +1291,7 @@ std::shared_ptr<Node> convert_low_precisions_int(std::shared_ptr<ov::op::v0::Con
const auto size = shape_size(constant->get_shape());
size_t src_idx(0), dst_idx(0), dst_off(0), src_off(0);
if (src_type.bitwidth() < 8) {
src_off = 8 - src_type.bitwidth();
src_off = element::is_lsb_packed(src_type) ? 0 : (8 - src_type.bitwidth());
}

if (to.bitwidth() < 8) {
Expand Down Expand Up @@ -1342,11 +1343,21 @@ std::shared_ptr<Node> convert_low_precisions_int(std::shared_ptr<ov::op::v0::Con
}
// Calculate offsets and indexes
if (src_type.bitwidth() < 8) {
if (src_off == 0) {
src_off = 8;
src_idx++;
if (element::is_lsb_packed(src_type)) {
// LSB-first: offset goes up 0 → 4 → next byte
src_off += src_type.bitwidth();
if (src_off >= 8) {
src_off = 0;
src_idx++;
}
} else {
// MSB-first: offset goes down 4 → 0 → next byte
if (src_off == 0) {
src_off = 8;
src_idx++;
}
src_off -= src_type.bitwidth();
}
src_off -= src_type.bitwidth();
} else {
src_idx++;
}
Expand Down
52 changes: 26 additions & 26 deletions src/common/transformations/tests/utils/convert_precision.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1598,110 +1598,110 @@ TEST(TransformationTests, ConvertPrecision_ConstantConversion_BoolToU8) {
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI8) {
constant_convert_test<uint8_t, int8_t>(element::u4, element::i8, std::vector<uint8_t>{171}, {10, 11});
constant_convert_test<uint8_t, int8_t>(element::u4, element::i8, std::vector<uint8_t>{171}, {11, 10});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU8) {
constant_convert_test<uint8_t, uint8_t>(element::u4, element::u8, {171}, {10, 11});
constant_convert_test<uint8_t, uint8_t>(element::u4, element::u8, {171}, {11, 10});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI8_2) {
constant_convert_test<uint8_t, int8_t>(element::u4, element::i8, {96}, {6, 0});
constant_convert_test<uint8_t, int8_t>(element::u4, element::i8, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU8_96) {
constant_convert_test<uint8_t, uint8_t>(element::u4, element::u8, {96}, {6, 0});
constant_convert_test<uint8_t, uint8_t>(element::u4, element::u8, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU8) {
constant_convert_test<uint8_t, uint8_t>(element::i4, element::u8, {96}, {6, 0});
constant_convert_test<uint8_t, uint8_t>(element::i4, element::u8, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI8) {
constant_convert_test<uint8_t, int8_t>(element::i4, element::i8, {96}, {6, 0});
constant_convert_test<uint8_t, int8_t>(element::i4, element::i8, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU8_neg) {
constant_convert_test<uint8_t, uint8_t>(element::i4, element::u8, {171}, {250, 251});
constant_convert_test<uint8_t, uint8_t>(element::i4, element::u8, {171}, {251, 250});
}

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

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI32) {
constant_convert_test<uint8_t, int32_t>(element::u4, element::i32, {171}, {10, 11});
constant_convert_test<uint8_t, int32_t>(element::u4, element::i32, {171}, {11, 10});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU32) {
constant_convert_test<uint8_t, uint32_t>(element::u4, element::u32, {171}, {10, 11});
constant_convert_test<uint8_t, uint32_t>(element::u4, element::u32, {171}, {11, 10});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU32) {
constant_convert_test<uint8_t, uint32_t>(element::i4, element::u32, {96}, {6, 0});
constant_convert_test<uint8_t, uint32_t>(element::i4, element::u32, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI32) {
constant_convert_test<uint8_t, int32_t>(element::i4, element::i32, {96}, {6, 0});
constant_convert_test<uint8_t, int32_t>(element::i4, element::i32, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU32_neg) {
constant_convert_test<uint8_t, uint32_t>(element::i4, element::u32, {171}, {4294967290, 4294967291});
constant_convert_test<uint8_t, uint32_t>(element::i4, element::u32, {171}, {4294967291, 4294967290});
}

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

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI16) {
constant_convert_test<uint8_t, int16_t>(element::u4, element::i16, {171}, {10, 11});
constant_convert_test<uint8_t, int16_t>(element::u4, element::i16, {171}, {11, 10});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU16) {
constant_convert_test<uint8_t, uint16_t>(element::u4, element::u16, {171}, {10, 11});
constant_convert_test<uint8_t, uint16_t>(element::u4, element::u16, {171}, {11, 10});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU16) {
constant_convert_test<uint8_t, uint16_t>(element::i4, element::u16, {96}, {6, 0});
constant_convert_test<uint8_t, uint16_t>(element::i4, element::u16, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI16) {
constant_convert_test<uint8_t, int16_t>(element::i4, element::i16, {96}, {6, 0});
constant_convert_test<uint8_t, int16_t>(element::i4, element::i16, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU16_neg) {
constant_convert_test<uint8_t, uint16_t>(element::i4, element::u16, {171}, {65530, 65531});
constant_convert_test<uint8_t, uint16_t>(element::i4, element::u16, {171}, {65531, 65530});
}

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

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToI64) {
constant_convert_test<uint8_t, int64_t>(element::u4, element::i64, {171}, {10, 11});
constant_convert_test<uint8_t, int64_t>(element::u4, element::i64, {171}, {11, 10});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U4ToU64) {
constant_convert_test<uint8_t, int64_t>(element::u4, element::u64, {171}, {10, 11});
constant_convert_test<uint8_t, int64_t>(element::u4, element::u64, {171}, {11, 10});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU64) {
constant_convert_test<uint8_t, uint64_t>(element::i4, element::u64, {96}, {6, 0});
constant_convert_test<uint8_t, uint64_t>(element::i4, element::u64, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToI64) {
constant_convert_test<uint8_t, int64_t>(element::i4, element::i64, {96}, {6, 0});
constant_convert_test<uint8_t, int64_t>(element::i4, element::i64, {96}, {0, 6});
}

TEST(TransformationTests, ConvertPrecision_ConstantConversion_I4ToU64_neg) {
constant_convert_test<uint8_t, uint64_t>(element::i4,
element::u64,
{171},
{18446744073709551610u, 18446744073709551611u});
{18446744073709551611u, 18446744073709551610u});
}

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

TEST(TransformationTests, ConvertPrecision_ConstantConversion_U1ToU8) {
Expand Down
Loading