48 lines
2.0 KiB
Diff
48 lines
2.0 KiB
Diff
|
|
From cdf914a667f9d0f086329174c24f9623b00b8fb2 Mon Sep 17 00:00:00 2001
|
||
|
|
From: gubin <gubin_yewu@cmss.chinamobile.com>
|
||
|
|
Date: Tue, 17 Dec 2024 14:54:18 +0800
|
||
|
|
Subject: [PATCH] target/arm: Fix VCMLA Dd, Dn, Dm[idx]
|
||
|
|
|
||
|
|
cherry-pick from 76bccf3cb9d9383da0128bbc6d1300cddbe3ae8f
|
||
|
|
|
||
|
|
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>
|
||
|
|
Signed-off-by: gubin <gubin_yewu@cmss.chinamobile.com>
|
||
|
|
---
|
||
|
|
target/arm/tcg/vec_helper.c | 4 ++--
|
||
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/target/arm/tcg/vec_helper.c b/target/arm/tcg/vec_helper.c
|
||
|
|
index 11e874c05a..83b49ef009 100644
|
||
|
|
--- a/target/arm/tcg/vec_helper.c
|
||
|
|
+++ b/target/arm/tcg/vec_helper.c
|
||
|
|
@@ -850,7 +850,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. */
|
||
|
|
@@ -912,7 +912,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. */
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|