Cast to uint32_t before multiplying uint16_t values to prevent signed integer overflow. Without the cast, the uint16_t operands are promoted to int, and the product can overflow the int range. Found with UBSan.
Reviewed-by: Sid Manning <[email protected]> Signed-off-by: Brian Cain <[email protected]> --- tests/tcg/hexagon/v69_hvx.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/tcg/hexagon/v69_hvx.c b/tests/tcg/hexagon/v69_hvx.c index a0d567d142f..eff936064a0 100644 --- a/tests/tcg/hexagon/v69_hvx.c +++ b/tests/tcg/hexagon/v69_hvx.c @@ -292,7 +292,8 @@ static void test_vmpyuhvs(void) pout += sizeof(MMVector); for (int j = 0; j < MAX_VEC_SIZE_BYTES / 2; j++) { - expect[i].uh[j] = (buffer0[i].uh[j] * buffer1[i].uh[j]) >> 16; + expect[i].uh[j] = + ((uint32_t)buffer0[i].uh[j] * buffer1[i].uh[j]) >> 16; } } -- 2.34.1
