diff --git a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_uni_eltwise_generic.cpp b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_uni_eltwise_generic.cpp index edec78d9a2c67c..0f0cd170ef6889 100644 --- a/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_uni_eltwise_generic.cpp +++ b/src/plugins/intel_cpu/src/nodes/kernels/x64/jit_uni_eltwise_generic.cpp @@ -549,7 +549,28 @@ void jit_uni_eltwise_generic::load_vector(Vmm vmm_src, if (src_prc == dst_prc) { if (broadcast) { load_scalar(xmm_src, op, src_prc, dst_prc); - uni_vbroadcastss(vmm_src, xmm_src); + switch (src_prc.size()) { + case 1: + if (isa == x64::sse41) { + punpcklbw(xmm_src, xmm_src); + punpcklbw(xmm_src, xmm_src); + pshufd(xmm_src, xmm_src, 0); + } else { + vpbroadcastb(vmm_src, xmm_src); + } + break; + case 2: + if (isa == x64::sse41) { + punpcklwd(xmm_src, xmm_src); + pshufd(xmm_src, xmm_src, 0); + } else { + vpbroadcastw(vmm_src, xmm_src); + } + break; + default: + uni_vbroadcastss(vmm_src, xmm_src); + break; + } } else { uni_vmovups(vmm_src, op); } diff --git a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/instances/common/eltwise.cpp b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/instances/common/eltwise.cpp index 8a11dd7779ab83..82f70f841be27c 100644 --- a/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/instances/common/eltwise.cpp +++ b/src/plugins/intel_cpu/tests/functional/custom/single_layer_tests/instances/common/eltwise.cpp @@ -276,6 +276,11 @@ static const std::vector> bitwise_in_shapes_4D = { }, }; +static const std::vector> bitwise_in_shapes_2D_broadcast = { + {{{1, -1}, {{1, 64}, {1, 1}}}, {{1, 64}, {{1, 64}}}}, + {{{-1, -1}, {{32, 256}, {1, 1}}}, {{32, 256}, {{32, 256}}}}, +}; + static const std::vector& bitwiseCpuParams() { static const std::vector params = {CPUSpecificParams({nhwc, nhwc}, {nhwc}, {}, {}), CPUSpecificParams({nchw, nchw}, {nchw}, {}, {})}; @@ -316,6 +321,27 @@ const auto params_4D_bitwise = ::testing::Combine( INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_4D_Bitwise, EltwiseLayerCPUTest, params_4D_bitwise, EltwiseLayerCPUTest::getTestCaseName); +const auto params_2D_bitwise_broadcast = + ::testing::Combine(::testing::Combine(::testing::ValuesIn(bitwise_in_shapes_2D_broadcast), + ::testing::ValuesIn({ov::test::utils::EltwiseTypes::BITWISE_AND, + ov::test::utils::EltwiseTypes::BITWISE_OR, + ov::test::utils::EltwiseTypes::BITWISE_XOR}), + ::testing::ValuesIn(secondaryInputTypes()), + ::testing::ValuesIn({ov::test::utils::OpType::VECTOR}), + ::testing::ValuesIn({ov::element::Type_t::i8, ov::element::Type_t::u8}), + ::testing::Values(ov::element::Type_t::dynamic), + ::testing::Values(ov::element::Type_t::dynamic), + ::testing::Values(ov::test::utils::DEVICE_CPU), + ::testing::Values(ov::AnyMap())), + ::testing::Values(CPUSpecificParams({}, {}, {}, {})), + ::testing::Values(emptyFusingSpec), + ::testing::Values(false)); + +INSTANTIATE_TEST_SUITE_P(smoke_CompareWithRefs_2D_Bitwise_i8u8_Broadcast, + EltwiseLayerCPUTest, + params_2D_bitwise_broadcast, + EltwiseLayerCPUTest::getTestCaseName); + const auto params_4D_bitwise_i32 = ::testing::Combine( ::testing::Combine( ::testing::ValuesIn(bitwise_in_shapes_4D),