target/arm: Fix SQDMULH (by element) with Q=0
The inner loop, bounded by eltspersegment, must not be larger than the outer loop, bounded by elements. Cc: qemu-stable@nongnu.org Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20240625183536.1672454-3-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
76bccf3cb9
commit
a5b72ccc0f
@ -317,10 +317,12 @@ void HELPER(neon_sqdmulh_idx_h)(void *vd, void *vn, void *vm,
|
||||
intptr_t i, j, opr_sz = simd_oprsz(desc);
|
||||
int idx = simd_data(desc);
|
||||
int16_t *d = vd, *n = vn, *m = (int16_t *)vm + H2(idx);
|
||||
intptr_t elements = opr_sz / 2;
|
||||
intptr_t eltspersegment = MIN(16 / 2, elements);
|
||||
|
||||
for (i = 0; i < opr_sz / 2; i += 16 / 2) {
|
||||
for (i = 0; i < elements; i += 16 / 2) {
|
||||
int16_t mm = m[i];
|
||||
for (j = 0; j < 16 / 2; ++j) {
|
||||
for (j = 0; j < eltspersegment; ++j) {
|
||||
d[i + j] = do_sqrdmlah_h(n[i + j], mm, 0, false, false, vq);
|
||||
}
|
||||
}
|
||||
@ -333,10 +335,12 @@ void HELPER(neon_sqrdmulh_idx_h)(void *vd, void *vn, void *vm,
|
||||
intptr_t i, j, opr_sz = simd_oprsz(desc);
|
||||
int idx = simd_data(desc);
|
||||
int16_t *d = vd, *n = vn, *m = (int16_t *)vm + H2(idx);
|
||||
intptr_t elements = opr_sz / 2;
|
||||
intptr_t eltspersegment = MIN(16 / 2, elements);
|
||||
|
||||
for (i = 0; i < opr_sz / 2; i += 16 / 2) {
|
||||
for (i = 0; i < elements; i += 16 / 2) {
|
||||
int16_t mm = m[i];
|
||||
for (j = 0; j < 16 / 2; ++j) {
|
||||
for (j = 0; j < eltspersegment; ++j) {
|
||||
d[i + j] = do_sqrdmlah_h(n[i + j], mm, 0, false, true, vq);
|
||||
}
|
||||
}
|
||||
@ -512,10 +516,12 @@ void HELPER(neon_sqdmulh_idx_s)(void *vd, void *vn, void *vm,
|
||||
intptr_t i, j, opr_sz = simd_oprsz(desc);
|
||||
int idx = simd_data(desc);
|
||||
int32_t *d = vd, *n = vn, *m = (int32_t *)vm + H4(idx);
|
||||
intptr_t elements = opr_sz / 4;
|
||||
intptr_t eltspersegment = MIN(16 / 4, elements);
|
||||
|
||||
for (i = 0; i < opr_sz / 4; i += 16 / 4) {
|
||||
for (i = 0; i < elements; i += 16 / 4) {
|
||||
int32_t mm = m[i];
|
||||
for (j = 0; j < 16 / 4; ++j) {
|
||||
for (j = 0; j < eltspersegment; ++j) {
|
||||
d[i + j] = do_sqrdmlah_s(n[i + j], mm, 0, false, false, vq);
|
||||
}
|
||||
}
|
||||
@ -528,10 +534,12 @@ void HELPER(neon_sqrdmulh_idx_s)(void *vd, void *vn, void *vm,
|
||||
intptr_t i, j, opr_sz = simd_oprsz(desc);
|
||||
int idx = simd_data(desc);
|
||||
int32_t *d = vd, *n = vn, *m = (int32_t *)vm + H4(idx);
|
||||
intptr_t elements = opr_sz / 4;
|
||||
intptr_t eltspersegment = MIN(16 / 4, elements);
|
||||
|
||||
for (i = 0; i < opr_sz / 4; i += 16 / 4) {
|
||||
for (i = 0; i < elements; i += 16 / 4) {
|
||||
int32_t mm = m[i];
|
||||
for (j = 0; j < 16 / 4; ++j) {
|
||||
for (j = 0; j < eltspersegment; ++j) {
|
||||
d[i + j] = do_sqrdmlah_s(n[i + j], mm, 0, false, true, vq);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user