[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 09/21] target/arm: Fix SMMLS argument order
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 09/21] target/arm: Fix SMMLS argument order |
Date: |
Tue, 3 Sep 2019 16:36:21 +0100 |
From: Richard Henderson <address@hidden>
The previous simplification got the order of operands to the
subtraction wrong. Since the 64-bit product is the subtrahend,
we must use a 64-bit subtract to properly compute the borrow
from the low-part of the product.
Fixes: 5f8cd06ebcf5 ("target/arm: Simplify SMMLA, SMMLAR, SMMLS, SMMLSR")
Reported-by: Laurent Desnogues <address@hidden>
Signed-off-by: Richard Henderson <address@hidden>
Tested-by: Laurent Desnogues <address@hidden>
Message-id: address@hidden
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
---
target/arm/translate.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/target/arm/translate.c b/target/arm/translate.c
index 78d93f63cab..cfebd35d268 100644
--- a/target/arm/translate.c
+++ b/target/arm/translate.c
@@ -8831,7 +8831,16 @@ static void disas_arm_insn(DisasContext *s, unsigned int
insn)
if (rd != 15) {
tmp3 = load_reg(s, rd);
if (insn & (1 << 6)) {
- tcg_gen_sub_i32(tmp, tmp, tmp3);
+ /*
+ * For SMMLS, we need a 64-bit subtract.
+ * Borrow caused by a non-zero multiplicand
+ * lowpart, and the correct result lowpart
+ * for rounding.
+ */
+ TCGv_i32 zero = tcg_const_i32(0);
+ tcg_gen_sub2_i32(tmp2, tmp, zero, tmp3,
+ tmp2, tmp);
+ tcg_temp_free_i32(zero);
} else {
tcg_gen_add_i32(tmp, tmp, tmp3);
}
@@ -10075,7 +10084,14 @@ static void disas_thumb2_insn(DisasContext *s,
uint32_t insn)
if (insn & (1 << 20)) {
tcg_gen_add_i32(tmp, tmp, tmp3);
} else {
- tcg_gen_sub_i32(tmp, tmp, tmp3);
+ /*
+ * For SMMLS, we need a 64-bit subtract.
+ * Borrow caused by a non-zero multiplicand lowpart,
+ * and the correct result lowpart for rounding.
+ */
+ TCGv_i32 zero = tcg_const_i32(0);
+ tcg_gen_sub2_i32(tmp2, tmp, zero, tmp3, tmp2, tmp);
+ tcg_temp_free_i32(zero);
}
tcg_temp_free_i32(tmp3);
}
--
2.20.1
- [Qemu-devel] [PULL 00/21] target-arm queue, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 01/21] Revert "target/arm: Use unallocated_encoding for aarch32", Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 02/21] target/arm: Factor out unallocated_encoding for aarch32, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 03/21] target/arm: Allow ARMCPRegInfo read/write functions to throw exceptions, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 05/21] aspeed/timer: Provide back-pressure information for short periods, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 06/21] memory: Remove unused memory_region_iommu_replay_all(), Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 08/21] hw/arm/smmuv3: Remove spurious error messages on IOVA invalidations, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 04/21] target/arm: Take exceptions on ATS instructions when needed, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 07/21] hw/arm/smmuv3: Log a guest error when decoding an invalid STE, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 09/21] target/arm: Fix SMMLS argument order,
Peter Maydell <=
- [Qemu-devel] [PULL 10/21] hw/arm: Use ARM_CPU_TYPE_NAME() macro when appropriate, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 12/21] hw/arm: Use sysbus_init_child_obj for correct reference counting, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 11/21] hw/arm: Use object_initialize_child for correct reference counting, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 13/21] hw/arm/fsl-imx: Add the cpu as child of the SoC object, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 14/21] hw/dma/xilinx_axi: Use object_initialize_child for correct ref. counting, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 15/21] hw/net/xilinx_axi: Use object_initialize_child for correct ref. counting, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 20/21] target/arm: Free TCG temps in trans_VMOV_64_sp(), Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 16/21] includes: remove stale [smp|max]_cpus externs, Peter Maydell, 2019/09/03
- [Qemu-devel] [PULL 17/21] tcg/README: fix typo s/afterwise/afterwards/, Peter Maydell, 2019/09/03