diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2023-05-18 10:31:43 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2023-05-18 10:31:43 +0100 |
commit | a6771f2f5cbfbf312e2fb5b1627f38a6bf6321d0 (patch) | |
tree | 30c93634aa4ab825fd131a609884de0f0b1f360a /target/arm | |
parent | 1877272bad7b08b67312503ee66184279876c7bd (diff) | |
download | qemu-a6771f2f5cbfbf312e2fb5b1627f38a6bf6321d0.zip qemu-a6771f2f5cbfbf312e2fb5b1627f38a6bf6321d0.tar.gz qemu-a6771f2f5cbfbf312e2fb5b1627f38a6bf6321d0.tar.bz2 |
target/arm: Fix vd == vm overlap in sve_ldff1_z
If vd == vm, copy vm to scratch, so that we can pre-zero
the output and still access the gather indicies.
Cc: qemu-stable@nongnu.org
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1612
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20230504104232.1877774-1-richard.henderson@linaro.org
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'target/arm')
-rw-r--r-- | target/arm/tcg/sve_helper.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/target/arm/tcg/sve_helper.c b/target/arm/tcg/sve_helper.c index ccf5e5b..0097522 100644 --- a/target/arm/tcg/sve_helper.c +++ b/target/arm/tcg/sve_helper.c @@ -6727,6 +6727,7 @@ void sve_ldff1_z(CPUARMState *env, void *vd, uint64_t *vg, void *vm, intptr_t reg_off; SVEHostPage info; target_ulong addr, in_page; + ARMVectorReg scratch; /* Skip to the first true predicate. */ reg_off = find_next_active(vg, 0, reg_max, esz); @@ -6736,6 +6737,11 @@ void sve_ldff1_z(CPUARMState *env, void *vd, uint64_t *vg, void *vm, return; } + /* Protect against overlap between vd and vm. */ + if (unlikely(vd == vm)) { + vm = memcpy(&scratch, vm, reg_max); + } + /* * Probe the first element, allowing faults. */ |