diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2024-06-25 11:35:24 -0700 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2024-07-01 12:48:55 +0100 |
commit | 76bccf3cb9d9383da0128bbc6d1300cddbe3ae8f (patch) | |
tree | 224c4aecc895ca31ecb284bf5d5a2442d1aad331 | |
parent | 69970205edb661f79a7f6d6046785c521c6da80b (diff) | |
download | qemu-76bccf3cb9d9383da0128bbc6d1300cddbe3ae8f.zip qemu-76bccf3cb9d9383da0128bbc6d1300cddbe3ae8f.tar.gz qemu-76bccf3cb9d9383da0128bbc6d1300cddbe3ae8f.tar.bz2 |
target/arm: Fix VCMLA Dd, Dn, Dm[idx]
The inner loop, bounded by eltspersegment, must not be
larger than the outer loop, bounded by elements.
Cc: qemu-stable@nongnu.org
Fixes: 18fc2405781 ("target/arm: Implement SVE fp complex multiply add (indexed)")
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2376
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20240625183536.1672454-2-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r-- | target/arm/tcg/vec_helper.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c index b05922b..7b34cc9 100644 --- a/target/arm/tcg/vec_helper.c +++ b/target/arm/tcg/vec_helper.c @@ -907,7 +907,7 @@ void HELPER(gvec_fcmlah_idx)(void *vd, void *vn, void *vm, void *va, intptr_t index = extract32(desc, SIMD_DATA_SHIFT + 2, 2); uint32_t neg_real = flip ^ neg_imag; intptr_t elements = opr_sz / sizeof(float16); - intptr_t eltspersegment = 16 / sizeof(float16); + intptr_t eltspersegment = MIN(16 / sizeof(float16), elements); intptr_t i, j; /* Shift boolean to the sign bit so we can xor to negate. */ @@ -969,7 +969,7 @@ void HELPER(gvec_fcmlas_idx)(void *vd, void *vn, void *vm, void *va, intptr_t index = extract32(desc, SIMD_DATA_SHIFT + 2, 2); uint32_t neg_real = flip ^ neg_imag; intptr_t elements = opr_sz / sizeof(float32); - intptr_t eltspersegment = 16 / sizeof(float32); + intptr_t eltspersegment = MIN(16 / sizeof(float32), elements); intptr_t i, j; /* Shift boolean to the sign bit so we can xor to negate. */ |