diff options
author | Richard Henderson <richard.henderson@linaro.org> | 2023-06-06 10:19:35 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2023-06-06 10:19:35 +0100 |
commit | d450bd0157be43d273116c3e3617883c8a0ac3d1 (patch) | |
tree | 691df745f26c38f0d5bfd4dd19f4feb225427184 /target/arm/tcg/translate.h | |
parent | c74cc082a6d3f8fde7778d26f600967582741967 (diff) | |
download | qemu-d450bd0157be43d273116c3e3617883c8a0ac3d1.zip qemu-d450bd0157be43d273116c3e3617883c8a0ac3d1.tar.gz qemu-d450bd0157be43d273116c3e3617883c8a0ac3d1.tar.bz2 |
target/arm: Use tcg_gen_qemu_{st, ld}_i128 for do_fp_{st, ld}
While we don't require 16-byte atomicity here, using a single larger
operation simplifies the code. Introduce finalize_memop_asimd for this.
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20230530191438.411344-6-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'target/arm/tcg/translate.h')
-rw-r--r-- | target/arm/tcg/translate.h | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/target/arm/tcg/translate.h b/target/arm/tcg/translate.h index c1e57a5..3aa486a 100644 --- a/target/arm/tcg/translate.h +++ b/target/arm/tcg/translate.h @@ -610,6 +610,30 @@ static inline MemOp finalize_memop_pair(DisasContext *s, MemOp opc) } /** + * finalize_memop_asimd: + * @s: DisasContext + * @opc: size+sign+align of the memory operation + * + * Like finalize_memop_atom, but with atomicity of AccessType_ASIMD. + */ +static inline MemOp finalize_memop_asimd(DisasContext *s, MemOp opc) +{ + /* + * In the pseudocode for Mem[], with AccessType_ASIMD, size == 16, + * if IsAligned(8), the first case provides separate atomicity for + * the pair of 64-bit accesses. If !IsAligned(8), the middle cases + * do not apply, and we're left with the final case of no atomicity. + * Thus MO_ATOM_IFALIGN_PAIR. + * + * For other sizes, normal LSE2 rules apply. + */ + if ((opc & MO_SIZE) == MO_128) { + return finalize_memop_atom(s, opc, MO_ATOM_IFALIGN_PAIR); + } + return finalize_memop(s, opc); +} + +/** * asimd_imm_const: Expand an encoded SIMD constant value * * Expand a SIMD constant value. This is essentially the pseudocode |