From: Richard Henderson <richard.henderson@linaro.org>
To: WANG Xuerui <git@xen0n.name>, qemu-devel@nongnu.org
Subject: Re: [PATCH 23/30] tcg/loongarch: Add softmmu load/store helpers, implement qemu_ld/qemu_st ops
Date: Mon, 20 Sep 2021 10:10:58 -0700 [thread overview]
Message-ID: <bd7c4980-6840-79f5-225b-4dba2d530e6f@linaro.org> (raw)
In-Reply-To: <20210920080451.408655-24-git@xen0n.name>
On 9/20/21 1:04 AM, WANG Xuerui wrote:
> +static void tcg_out_goto(TCGContext *s, const tcg_insn_unit *target)
> +{
> + tcg_out_opc_b(s, 0);
> + bool ok = reloc_sd10k16(s->code_ptr - 1, target);
> + tcg_debug_assert(ok);
> +}
Hmm. This is an existing bug in tcg/riscv/. We should have no asserts on relocations
being in range. We should always be able to tell our caller that the relocation failed,
and we'll try again with a smaller TB.
In this case, return the result of reloc_sd10k16 and ...
> +
> + tcg_out_goto(s, l->raddr);
> + return true;
> +}
... return the result of tcg_out_goto.
> +static void tcg_out_tlb_load(TCGContext *s, TCGReg addrl, TCGMemOpIdx oi,
> + tcg_insn_unit **label_ptr, bool is_load)
> +{
> + MemOp opc = get_memop(oi);
> + unsigned s_bits = opc & MO_SIZE;
> + unsigned a_bits = get_alignment_bits(opc);
> + tcg_target_long compare_mask;
> + int mem_index = get_mmuidx(oi);
> + int fast_ofs = TLB_MASK_TABLE_OFS(mem_index);
> + int mask_ofs = fast_ofs + offsetof(CPUTLBDescFast, mask);
> + int table_ofs = fast_ofs + offsetof(CPUTLBDescFast, table);
> + TCGReg mask_base = TCG_AREG0, table_base = TCG_AREG0;
> +
> + tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP0, mask_base, mask_ofs);
> + tcg_out_ld(s, TCG_TYPE_PTR, TCG_REG_TMP1, table_base, table_ofs);
I think we can eliminate the mask_base and table_base variables now. This dates from the
TCG_TARGET_TLB_DISPLACEMENT_BITS thing, where we would need to compute an intermediate
offset, and adjust these base registers.
> + /* Clear the non-page, non-alignment bits from the address. */
> + compare_mask = (tcg_target_long)TARGET_PAGE_MASK | ((1 << a_bits) - 1);
> + if (compare_mask == sextreg(compare_mask, 0, 12)) {
> + tcg_out_opc_andi(s, TCG_REG_TMP1, addrl, compare_mask);
LoongArch uses an unsigned mask for andi, not signed. The immediate case will never match
for LoongArch.
> +static bool tcg_out_qemu_ld_slow_path(TCGContext *s, TCGLabelQemuLdst *l)
> +{
> + TCGMemOpIdx oi = l->oi;
> + MemOp opc = get_memop(oi);
> + TCGReg a0 = tcg_target_call_iarg_regs[0];
> + TCGReg a1 = tcg_target_call_iarg_regs[1];
> + TCGReg a2 = tcg_target_call_iarg_regs[2];
> + TCGReg a3 = tcg_target_call_iarg_regs[3];
Drop these, since you've already named TCG_REG_A0 etc.
> +
> + /* We don't support oversize guests */
> + if (TCG_TARGET_REG_BITS < TARGET_LONG_BITS) {
> + g_assert_not_reached();
> + }
This is redundant with TCG_TARGET_REG_BITS == 64.
> + tcg_out_call(s, qemu_ld_helpers[opc & MO_SSIZE]);
> + tcg_out_mov(s, (opc & MO_SIZE) == MO_64, l->datalo_reg, a0);
Because you have single-insn sign-extend instructions, it's better to always call the
unsigned load function, and then sign-extend here. See the aarch64 version.
> + tcg_out_mov(s, TCG_TYPE_PTR, a2, l->datalo_reg);
> + switch (s_bits) {
> + case MO_8:
> + tcg_out_ext8u(s, a2, a2);
> + break;
> + case MO_16:
> + tcg_out_ext16u(s, a2, a2);
> + break;
> + default:
> + break;
> + }
Do you have a pointer to the LoongArch ABI? Do 32-bit values need to be sign- or
zero-extended in the call arguments?
Anyway, merge the move and extend.
> + tcg_out_movi(s, TCG_TYPE_PTR, a4, (tcg_target_long)l->raddr);
Oh, just FYI, this is another case where movi wants to handle pc-relative addresses.
> + if (guest_base == 0) {
> + tcg_out_opc_add_d(s, base, addr_regl, TCG_REG_ZERO);
Don't add zero. RISCV bug that's been fixed recently.
> +static void tcg_out_qemu_st_direct(TCGContext *s, TCGReg lo,
> + TCGReg base, MemOp opc)
> +{
> + /* Byte swapping is left to middle-end expansion. */
> + tcg_debug_assert((opc & MO_BSWAP) == 0);
> +
> + switch (opc & (MO_SSIZE)) {
MO_SIZE here.
> +static void tcg_out_qemu_st(TCGContext *s, const TCGArg *args, bool is_64)
Shouldn't need is_64 argument for store. It's only relevant to load so that TCG_TYPE_I32
values are always sign-extended in the host register.
r~
next prev parent reply other threads:[~2021-09-20 17:13 UTC|newest]
Thread overview: 80+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-20 8:04 [PATCH 00/30] 64-bit LoongArch port of QEMU TCG WANG Xuerui
2021-09-20 8:04 ` [PATCH 01/30] elf: Add machine type value for LoongArch WANG Xuerui
2021-09-20 8:04 ` [PATCH 02/30] MAINTAINERS: Add tcg/loongarch entry with myself as maintainer WANG Xuerui
2021-09-20 14:50 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 03/30] tcg/loongarch: Add the tcg-target.h file WANG Xuerui
2021-09-20 14:23 ` Richard Henderson
2021-09-20 16:20 ` WANG Xuerui
2021-09-20 16:25 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 04/30] tcg/loongarch: Add generated instruction opcodes and encoding helpers WANG Xuerui
2021-09-20 15:55 ` Richard Henderson
2021-09-20 16:24 ` WANG Xuerui
2021-09-21 9:58 ` Philippe Mathieu-Daudé
2021-09-21 11:40 ` WANG Xuerui
2021-09-20 8:04 ` [PATCH 05/30] tcg/loongarch: Add register names, allocation order and input/output sets WANG Xuerui
2021-09-20 15:57 ` Richard Henderson
2021-09-20 16:27 ` WANG Xuerui
2021-09-20 8:04 ` [PATCH 06/30] tcg/loongarch: Define the operand constraints WANG Xuerui
2021-09-20 14:28 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 07/30] tcg/loongarch: Implement necessary relocation operations WANG Xuerui
2021-09-20 14:36 ` Richard Henderson
2021-09-20 17:15 ` WANG Xuerui
2021-09-20 8:04 ` [PATCH 08/30] tcg/loongarch: Implement the memory barrier op WANG Xuerui
2021-09-20 8:04 ` [PATCH 09/30] tcg/loongarch: Implement tcg_out_mov and tcg_out_movi WANG Xuerui
2021-09-20 14:47 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 10/30] tcg/loongarch: Implement goto_ptr WANG Xuerui
2021-09-20 14:49 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 11/30] tcg/loongarch: Implement sign-/zero-extension ops WANG Xuerui
2021-09-20 14:50 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 12/30] tcg/loongarch: Implement not/and/or/xor/nor/andc/orc ops WANG Xuerui
2021-09-20 14:54 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 13/30] tcg/loongarch: Implement deposit/extract ops WANG Xuerui
2021-09-20 14:55 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 14/30] tcg/loongarch: Implement bswap32_i32/bswap64_i64 WANG Xuerui
2021-09-20 15:11 ` Richard Henderson
2021-09-20 18:20 ` Richard Henderson
2021-09-21 6:37 ` WANG Xuerui
2021-09-20 8:04 ` [PATCH 15/30] tcg/loongarch: Implement clz/ctz ops WANG Xuerui
2021-09-20 16:10 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 16/30] tcg/loongarch: Implement shl/shr/sar/rotl/rotr ops WANG Xuerui
2021-09-20 16:13 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 17/30] tcg/loongarch: Implement neg/add/sub ops WANG Xuerui
2021-09-20 16:16 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 18/30] tcg/loongarch: Implement mul/mulsh/muluh/div/divu/rem/remu ops WANG Xuerui
2021-09-20 16:16 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 19/30] tcg/loongarch: Implement br/brcond ops WANG Xuerui
2021-09-20 16:20 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 20/30] tcg/loongarch: Implement setcond ops WANG Xuerui
2021-09-20 16:24 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 21/30] tcg/loongarch: Implement tcg_out_call WANG Xuerui
2021-09-20 16:31 ` Richard Henderson
2021-09-20 16:35 ` Richard Henderson
2021-09-21 6:42 ` WANG Xuerui
2021-09-20 8:04 ` [PATCH 22/30] tcg/loongarch: Implement simple load/store ops WANG Xuerui
2021-09-20 16:35 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 23/30] tcg/loongarch: Add softmmu load/store helpers, implement qemu_ld/qemu_st ops WANG Xuerui
2021-09-20 17:10 ` Richard Henderson [this message]
2021-09-20 8:04 ` [PATCH 24/30] tcg/loongarch: Implement tcg_target_qemu_prologue WANG Xuerui
2021-09-20 17:15 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 25/30] tcg/loongarch: Implement exit_tb/goto_tb WANG Xuerui
2021-09-20 17:16 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 26/30] tcg/loongarch: Implement tcg_target_init WANG Xuerui
2021-09-20 17:19 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 27/30] tcg/loongarch: Register the JIT WANG Xuerui
2021-09-20 17:21 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 28/30] configure, meson.build: Mark support for 64-bit LoongArch hosts WANG Xuerui
2021-09-20 17:23 ` Richard Henderson
2021-09-21 6:02 ` WANG Xuerui
2021-09-21 6:59 ` Philippe Mathieu-Daudé
2021-09-21 7:24 ` WANG Xuerui
2021-09-21 13:30 ` Richard Henderson
2021-09-21 14:07 ` WANG Xuerui
2021-09-21 14:10 ` WANG Xuerui
2021-09-21 14:42 ` Peter Maydell
2021-09-21 15:59 ` Richard Henderson
2021-09-21 16:09 ` WANG Xuerui
2021-09-21 17:26 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 29/30] linux-user: Add host dependency for 64-bit LoongArch WANG Xuerui
2021-09-20 17:26 ` Richard Henderson
2021-09-20 8:04 ` [PATCH 30/30] accel/tcg/user-exec: Implement CPU-specific signal handler for LoongArch hosts WANG Xuerui
2021-09-20 17:31 ` Richard Henderson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=bd7c4980-6840-79f5-225b-4dba2d530e6f@linaro.org \
--to=richard.henderson@linaro.org \
--cc=git@xen0n.name \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).