diff mbox series

[1/3] target/loongarch: Introduce loongarch32-softmmu target

Message ID 20230806141357.1756714-1-c@jia.je
State New
Headers show
Series [1/3] target/loongarch: Introduce loongarch32-softmmu target | expand

Commit Message

Jiajie Chen Aug. 6, 2023, 2:13 p.m. UTC
This commit introduces new loongarch32-softmmu target. Compared to
loongarch64-softmmu, the new target is different at least in:

- GPRs and CSRs are 32-bits wide, but FPRs are still 64-bits wide
- LA32 lacks some 64-bit-only instructions
- CSR.DMW0-3 introduces PSEG

More differences are to be handled in the following commits.

Signed-off-by: Jiajie Chen <c@jia.je>
---
 .../devices/loongarch32-softmmu/default.mak   |   3 +
 configs/targets/loongarch32-softmmu.mak       |   5 +
 gdb-xml/loongarch-base32.xml                  |  45 +++++++
 qapi/machine-target.json                      |   4 +-
 target/loongarch/Kconfig                      |   3 +
 target/loongarch/cpu-csr.h                    |   7 +-
 target/loongarch/cpu-param.h                  |   6 +
 target/loongarch/cpu.c                        |  30 ++---
 target/loongarch/cpu.h                        | 112 +++++++++---------
 target/loongarch/helper.h                     |  24 ++--
 target/loongarch/insn_trans/trans_arith.c.inc |  40 ++++---
 .../loongarch/insn_trans/trans_atomic.c.inc   |   6 +-
 target/loongarch/insn_trans/trans_bit.c.inc   |  40 ++++---
 target/loongarch/insn_trans/trans_extra.c.inc |   2 +-
 .../loongarch/insn_trans/trans_farith.c.inc   |  52 ++++----
 target/loongarch/insn_trans/trans_fcmp.c.inc  |  16 +--
 .../loongarch/insn_trans/trans_fmemory.c.inc  |  34 +++---
 target/loongarch/insn_trans/trans_fmov.c.inc  |  88 +++++++++-----
 target/loongarch/insn_trans/trans_lsx.c.inc   |  63 +++++-----
 target/loongarch/iocsr_helper.c               |   8 +-
 target/loongarch/machine.c                    | 106 ++++++++---------
 target/loongarch/op_helper.c                  |   6 +-
 target/loongarch/tlb_helper.c                 |  25 +++-
 target/loongarch/translate.c                  |   6 +-
 target/loongarch/translate.h                  |   9 ++
 25 files changed, 435 insertions(+), 305 deletions(-)
 create mode 100644 configs/devices/loongarch32-softmmu/default.mak
 create mode 100644 configs/targets/loongarch32-softmmu.mak
 create mode 100644 gdb-xml/loongarch-base32.xml

Comments

Richard Henderson Aug. 6, 2023, 2:41 p.m. UTC | #1
On 8/6/23 07:13, Jiajie Chen wrote:
> This commit introduces new loongarch32-softmmu target. Compared to
> loongarch64-softmmu, the new target is different at least in:
> 
> - GPRs and CSRs are 32-bits wide, but FPRs are still 64-bits wide
> - LA32 lacks some 64-bit-only instructions
> - CSR.DMW0-3 introduces PSEG

Let us not create a new executable if we can avoid it.
We can run 32-bit cpus from qemu-system-{x86_64,ppc64,aarch64}.

In any case, the patch is much too large and must be split.


r~
Song Gao Aug. 7, 2023, 2:31 a.m. UTC | #2
Cc: Jun Yi <yijun@loongson.cn>

在 2023/8/6 下午10:13, Jiajie Chen 写道:
> This commit introduces new loongarch32-softmmu target. Compared to
> loongarch64-softmmu, the new target is different at least in:
>
> - GPRs and CSRs are 32-bits wide, but FPRs are still 64-bits wide
> - LA32 lacks some 64-bit-only instructions
> - CSR.DMW0-3 introduces PSEG
>
> More differences are to be handled in the following commits.
>
> Signed-off-by: Jiajie Chen <c@jia.je>
> ---
>   .../devices/loongarch32-softmmu/default.mak   |   3 +
>   configs/targets/loongarch32-softmmu.mak       |   5 +
>   gdb-xml/loongarch-base32.xml                  |  45 +++++++
>   qapi/machine-target.json                      |   4 +-
>   target/loongarch/Kconfig                      |   3 +
>   target/loongarch/cpu-csr.h                    |   7 +-
>   target/loongarch/cpu-param.h                  |   6 +
>   target/loongarch/cpu.c                        |  30 ++---
>   target/loongarch/cpu.h                        | 112 +++++++++---------
>   target/loongarch/helper.h                     |  24 ++--
>   target/loongarch/insn_trans/trans_arith.c.inc |  40 ++++---
>   .../loongarch/insn_trans/trans_atomic.c.inc   |   6 +-
>   target/loongarch/insn_trans/trans_bit.c.inc   |  40 ++++---
>   target/loongarch/insn_trans/trans_extra.c.inc |   2 +-
>   .../loongarch/insn_trans/trans_farith.c.inc   |  52 ++++----
>   target/loongarch/insn_trans/trans_fcmp.c.inc  |  16 +--
>   .../loongarch/insn_trans/trans_fmemory.c.inc  |  34 +++---
>   target/loongarch/insn_trans/trans_fmov.c.inc  |  88 +++++++++-----
>   target/loongarch/insn_trans/trans_lsx.c.inc   |  63 +++++-----
>   target/loongarch/iocsr_helper.c               |   8 +-
>   target/loongarch/machine.c                    | 106 ++++++++---------
>   target/loongarch/op_helper.c                  |   6 +-
>   target/loongarch/tlb_helper.c                 |  25 +++-
>   target/loongarch/translate.c                  |   6 +-
>   target/loongarch/translate.h                  |   9 ++
>   25 files changed, 435 insertions(+), 305 deletions(-)
>   create mode 100644 configs/devices/loongarch32-softmmu/default.mak
>   create mode 100644 configs/targets/loongarch32-softmmu.mak
>   create mode 100644 gdb-xml/loongarch-base32.xml
>
> diff --git a/configs/devices/loongarch32-softmmu/default.mak b/configs/devices/loongarch32-softmmu/default.mak
> new file mode 100644
> index 0000000000..a8d3a9d554
> --- /dev/null
> +++ b/configs/devices/loongarch32-softmmu/default.mak
> @@ -0,0 +1,3 @@
> +# Default configuration for loongarch32-softmmu
> +
> +CONFIG_LOONGARCH_VIRT=y
> diff --git a/configs/targets/loongarch32-softmmu.mak b/configs/targets/loongarch32-softmmu.mak
> new file mode 100644
> index 0000000000..c13b7eb1ae
> --- /dev/null
> +++ b/configs/targets/loongarch32-softmmu.mak
> @@ -0,0 +1,5 @@
> +TARGET_ARCH=loongarch32
> +TARGET_BASE_ARCH=loongarch
> +TARGET_SUPPORTS_MTTCG=y
> +TARGET_XML_FILES= gdb-xml/loongarch-base32.xml gdb-xml/loongarch-fpu.xml
> +TARGET_NEED_FDT=y
> diff --git a/gdb-xml/loongarch-base32.xml b/gdb-xml/loongarch-base32.xml
> new file mode 100644
> index 0000000000..af47bbd3da
> --- /dev/null
> +++ b/gdb-xml/loongarch-base32.xml
> @@ -0,0 +1,45 @@
> +<?xml version="1.0"?>
> +<!-- Copyright (C) 2022 Free Software Foundation, Inc.
> +
> +     Copying and distribution of this file, with or without modification,
> +     are permitted in any medium without royalty provided the copyright
> +     notice and this notice are preserved.  -->
> +
> +<!DOCTYPE feature SYSTEM "gdb-target.dtd">
> +<feature name="org.gnu.gdb.loongarch.base">
> +  <reg name="r0" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r1" bitsize="32" type="code_ptr" group="general"/>
> +  <reg name="r2" bitsize="32" type="data_ptr" group="general"/>
> +  <reg name="r3" bitsize="32" type="data_ptr" group="general"/>
> +  <reg name="r4" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r5" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r6" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r7" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r8" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r9" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r10" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r11" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r12" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r13" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r14" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r15" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r16" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r17" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r18" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r19" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r20" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r21" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r22" bitsize="32" type="data_ptr" group="general"/>
> +  <reg name="r23" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r24" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r25" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r26" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r27" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r28" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r29" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r30" bitsize="32" type="uint32" group="general"/>
> +  <reg name="r31" bitsize="32" type="uint32" group="general"/>
> +  <reg name="orig_a0" bitsize="32" type="uint32" group="general"/>
> +  <reg name="pc" bitsize="32" type="code_ptr" group="general"/>
> +  <reg name="badv" bitsize="32" type="code_ptr" group="general"/>
> +</feature>
> diff --git a/qapi/machine-target.json b/qapi/machine-target.json
> index f0a6b72414..a728e14c86 100644
> --- a/qapi/machine-target.json
> +++ b/qapi/machine-target.json
> @@ -341,7 +341,7 @@
>                      'TARGET_I386',
>                      'TARGET_S390X',
>                      'TARGET_MIPS',
> -                   'TARGET_LOONGARCH64',
> +                   'TARGET_LOONGARCH',
>                      'TARGET_RISCV' ] } }
>   
>   ##
> @@ -359,5 +359,5 @@
>                      'TARGET_I386',
>                      'TARGET_S390X',
>                      'TARGET_MIPS',
> -                   'TARGET_LOONGARCH64',
> +                   'TARGET_LOONGARCH',
>                      'TARGET_RISCV' ] } }
> diff --git a/target/loongarch/Kconfig b/target/loongarch/Kconfig
> index 46b26b1a85..a834f20ed8 100644
> --- a/target/loongarch/Kconfig
> +++ b/target/loongarch/Kconfig
> @@ -1,2 +1,5 @@
>   config LOONGARCH64
>       bool
> +
> +config LOONGARCH32
> +    bool
> diff --git a/target/loongarch/cpu-csr.h b/target/loongarch/cpu-csr.h
> index f8f24032cb..439eb1b578 100644
> --- a/target/loongarch/cpu-csr.h
> +++ b/target/loongarch/cpu-csr.h
> @@ -187,10 +187,9 @@ FIELD(CSR_DMW, PLV1, 1, 1)
>   FIELD(CSR_DMW, PLV2, 2, 1)
>   FIELD(CSR_DMW, PLV3, 3, 1)
>   FIELD(CSR_DMW, MAT, 4, 2)
> -FIELD(CSR_DMW, VSEG, 60, 4)
> -
> -#define dmw_va2pa(va) \
> -    (va & MAKE_64BIT_MASK(0, TARGET_VIRT_ADDR_SPACE_BITS))
> +FIELD(CSR_DMW_32, PSEG, 25, 3)
> +FIELD(CSR_DMW_32, VSEG, 29, 3)
> +FIELD(CSR_DMW_64, VSEG, 60, 4)
>   
>   /* Debug CSRs */
>   #define LOONGARCH_CSR_DBG            0x500 /* debug config */
> diff --git a/target/loongarch/cpu-param.h b/target/loongarch/cpu-param.h
> index 1265dc7cb5..53030ea00e 100644
> --- a/target/loongarch/cpu-param.h
> +++ b/target/loongarch/cpu-param.h
> @@ -8,9 +8,15 @@
>   #ifndef LOONGARCH_CPU_PARAM_H
>   #define LOONGARCH_CPU_PARAM_H
>   
> +#ifdef TARGET_LOONGARCH32
> +#define TARGET_LONG_BITS 32
> +#define TARGET_PHYS_ADDR_SPACE_BITS 36
> +#define TARGET_VIRT_ADDR_SPACE_BITS 32
> +#else
>   #define TARGET_LONG_BITS 64
>   #define TARGET_PHYS_ADDR_SPACE_BITS 48
>   #define TARGET_VIRT_ADDR_SPACE_BITS 48
> +#endif
>   
>   #define TARGET_PAGE_BITS 14
>   
> diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
> index ad93ecac92..b513531ac8 100644
> --- a/target/loongarch/cpu.c
> +++ b/target/loongarch/cpu.c
> @@ -626,7 +626,7 @@ void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
>       CPULoongArchState *env = &cpu->env;
>       int i;
>   
> -    qemu_fprintf(f, " PC=%016" PRIx64 " ", env->pc);
> +    qemu_fprintf(f, " PC=" TARGET_FMT_lx " ", env->pc);
>       qemu_fprintf(f, " FCSR0 0x%08x  fp_status 0x%02x\n", env->fcsr0,
>                    get_float_exception_flags(&env->fp_status));
>   
> @@ -635,26 +635,26 @@ void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
>           if ((i & 3) == 0) {
>               qemu_fprintf(f, " GPR%02d:", i);
>           }
> -        qemu_fprintf(f, " %s %016" PRIx64, regnames[i], env->gpr[i]);
> +        qemu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->gpr[i]);
>           if ((i & 3) == 3) {
>               qemu_fprintf(f, "\n");
>           }
>       }
>   
> -    qemu_fprintf(f, "CRMD=%016" PRIx64 "\n", env->CSR_CRMD);
> -    qemu_fprintf(f, "PRMD=%016" PRIx64 "\n", env->CSR_PRMD);
> -    qemu_fprintf(f, "EUEN=%016" PRIx64 "\n", env->CSR_EUEN);
> -    qemu_fprintf(f, "ESTAT=%016" PRIx64 "\n", env->CSR_ESTAT);
> -    qemu_fprintf(f, "ERA=%016" PRIx64 "\n", env->CSR_ERA);
> -    qemu_fprintf(f, "BADV=%016" PRIx64 "\n", env->CSR_BADV);
> -    qemu_fprintf(f, "BADI=%016" PRIx64 "\n", env->CSR_BADI);
> -    qemu_fprintf(f, "EENTRY=%016" PRIx64 "\n", env->CSR_EENTRY);
> -    qemu_fprintf(f, "PRCFG1=%016" PRIx64 ", PRCFG2=%016" PRIx64 ","
> -                 " PRCFG3=%016" PRIx64 "\n",
> +    qemu_fprintf(f, "CRMD=" TARGET_FMT_lx "\n", env->CSR_CRMD);
> +    qemu_fprintf(f, "PRMD=" TARGET_FMT_lx "\n", env->CSR_PRMD);
> +    qemu_fprintf(f, "EUEN=" TARGET_FMT_lx "\n", env->CSR_EUEN);
> +    qemu_fprintf(f, "ESTAT=" TARGET_FMT_lx "\n", env->CSR_ESTAT);
> +    qemu_fprintf(f, "ERA=" TARGET_FMT_lx "\n", env->CSR_ERA);
> +    qemu_fprintf(f, "BADV=" TARGET_FMT_lx "\n", env->CSR_BADV);
> +    qemu_fprintf(f, "BADI=" TARGET_FMT_lx "\n", env->CSR_BADI);
> +    qemu_fprintf(f, "EENTRY=" TARGET_FMT_lx "\n", env->CSR_EENTRY);
> +    qemu_fprintf(f, "PRCFG1=" TARGET_FMT_lx ", PRCFG2=" TARGET_FMT_lx ","
> +                 " PRCFG3=" TARGET_FMT_lx "\n",
>                    env->CSR_PRCFG1, env->CSR_PRCFG3, env->CSR_PRCFG3);
> -    qemu_fprintf(f, "TLBRENTRY=%016" PRIx64 "\n", env->CSR_TLBRENTRY);
> -    qemu_fprintf(f, "TLBRBADV=%016" PRIx64 "\n", env->CSR_TLBRBADV);
> -    qemu_fprintf(f, "TLBRERA=%016" PRIx64 "\n", env->CSR_TLBRERA);
> +    qemu_fprintf(f, "TLBRENTRY=" TARGET_FMT_lx "\n", env->CSR_TLBRENTRY);
> +    qemu_fprintf(f, "TLBRBADV=" TARGET_FMT_lx "\n", env->CSR_TLBRBADV);
> +    qemu_fprintf(f, "TLBRERA=" TARGET_FMT_lx "\n", env->CSR_TLBRERA);
>   
>       /* fpr */
>       if (flags & CPU_DUMP_FPU) {
> diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
> index fa371ca8ba..37712cc590 100644
> --- a/target/loongarch/cpu.h
> +++ b/target/loongarch/cpu.h
> @@ -273,8 +273,8 @@ struct LoongArchTLB {
>   typedef struct LoongArchTLB LoongArchTLB;
>   
>   typedef struct CPUArchState {
> -    uint64_t gpr[32];
> -    uint64_t pc;
> +    target_ulong gpr[32];
> +    target_ulong pc;
>   
>       fpr_t fpr[32];
>       float_status fp_status;
> @@ -289,60 +289,60 @@ typedef struct CPUArchState {
>       uint64_t llval;
>   
>       /* LoongArch CSRs */
> -    uint64_t CSR_CRMD;
> -    uint64_t CSR_PRMD;
> -    uint64_t CSR_EUEN;
> -    uint64_t CSR_MISC;
> -    uint64_t CSR_ECFG;
> -    uint64_t CSR_ESTAT;
> -    uint64_t CSR_ERA;
> -    uint64_t CSR_BADV;
> -    uint64_t CSR_BADI;
> -    uint64_t CSR_EENTRY;
> -    uint64_t CSR_TLBIDX;
> -    uint64_t CSR_TLBEHI;
> -    uint64_t CSR_TLBELO0;
> -    uint64_t CSR_TLBELO1;
> -    uint64_t CSR_ASID;
> -    uint64_t CSR_PGDL;
> -    uint64_t CSR_PGDH;
> -    uint64_t CSR_PGD;
> -    uint64_t CSR_PWCL;
> -    uint64_t CSR_PWCH;
> -    uint64_t CSR_STLBPS;
> -    uint64_t CSR_RVACFG;
> -    uint64_t CSR_PRCFG1;
> -    uint64_t CSR_PRCFG2;
> -    uint64_t CSR_PRCFG3;
> -    uint64_t CSR_SAVE[16];
> -    uint64_t CSR_TID;
> -    uint64_t CSR_TCFG;
> -    uint64_t CSR_TVAL;
> -    uint64_t CSR_CNTC;
> -    uint64_t CSR_TICLR;
> -    uint64_t CSR_LLBCTL;
> -    uint64_t CSR_IMPCTL1;
> -    uint64_t CSR_IMPCTL2;
> -    uint64_t CSR_TLBRENTRY;
> -    uint64_t CSR_TLBRBADV;
> -    uint64_t CSR_TLBRERA;
> -    uint64_t CSR_TLBRSAVE;
> -    uint64_t CSR_TLBRELO0;
> -    uint64_t CSR_TLBRELO1;
> -    uint64_t CSR_TLBREHI;
> -    uint64_t CSR_TLBRPRMD;
> -    uint64_t CSR_MERRCTL;
> -    uint64_t CSR_MERRINFO1;
> -    uint64_t CSR_MERRINFO2;
> -    uint64_t CSR_MERRENTRY;
> -    uint64_t CSR_MERRERA;
> -    uint64_t CSR_MERRSAVE;
> -    uint64_t CSR_CTAG;
> -    uint64_t CSR_DMW[4];
> -    uint64_t CSR_DBG;
> -    uint64_t CSR_DERA;
> -    uint64_t CSR_DSAVE;
> -    uint64_t CSR_CPUID;
> +    target_ulong CSR_CRMD;
> +    target_ulong CSR_PRMD;
> +    target_ulong CSR_EUEN;
> +    target_ulong CSR_MISC;
> +    target_ulong CSR_ECFG;
> +    target_ulong CSR_ESTAT;
> +    target_ulong CSR_ERA;
> +    target_ulong CSR_BADV;
> +    target_ulong CSR_BADI;
> +    target_ulong CSR_EENTRY;
> +    target_ulong CSR_TLBIDX;
> +    target_ulong CSR_TLBEHI;
> +    target_ulong CSR_TLBELO0;
> +    target_ulong CSR_TLBELO1;
> +    target_ulong CSR_ASID;
> +    target_ulong CSR_PGDL;
> +    target_ulong CSR_PGDH;
> +    target_ulong CSR_PGD;
> +    target_ulong CSR_PWCL;
> +    target_ulong CSR_PWCH;
> +    target_ulong CSR_STLBPS;
> +    target_ulong CSR_RVACFG;
> +    target_ulong CSR_PRCFG1;
> +    target_ulong CSR_PRCFG2;
> +    target_ulong CSR_PRCFG3;
> +    target_ulong CSR_SAVE[16];
> +    target_ulong CSR_TID;
> +    target_ulong CSR_TCFG;
> +    target_ulong CSR_TVAL;
> +    target_ulong CSR_CNTC;
> +    target_ulong CSR_TICLR;
> +    target_ulong CSR_LLBCTL;
> +    target_ulong CSR_IMPCTL1;
> +    target_ulong CSR_IMPCTL2;
> +    target_ulong CSR_TLBRENTRY;
> +    target_ulong CSR_TLBRBADV;
> +    target_ulong CSR_TLBRERA;
> +    target_ulong CSR_TLBRSAVE;
> +    target_ulong CSR_TLBRELO0;
> +    target_ulong CSR_TLBRELO1;
> +    target_ulong CSR_TLBREHI;
> +    target_ulong CSR_TLBRPRMD;
> +    target_ulong CSR_MERRCTL;
> +    target_ulong CSR_MERRINFO1;
> +    target_ulong CSR_MERRINFO2;
> +    target_ulong CSR_MERRENTRY;
> +    target_ulong CSR_MERRERA;
> +    target_ulong CSR_MERRSAVE;
> +    target_ulong CSR_CTAG;
> +    target_ulong CSR_DMW[4];
> +    target_ulong CSR_DBG;
> +    target_ulong CSR_DERA;
> +    target_ulong CSR_DSAVE;
> +    target_ulong CSR_CPUID;
>   
>   #ifndef CONFIG_USER_ONLY
>       LoongArchTLB  tlb[LOONGARCH_TLB_MAX];
> diff --git a/target/loongarch/helper.h b/target/loongarch/helper.h
> index ffb1e0b0bf..1c41816b9a 100644
> --- a/target/loongarch/helper.h
> +++ b/target/loongarch/helper.h
> @@ -93,21 +93,21 @@ DEF_HELPER_2(frint_d, i64, env, i64)
>   
>   DEF_HELPER_FLAGS_1(set_rounding_mode, TCG_CALL_NO_RWG, void, env)
>   
> -DEF_HELPER_1(rdtime_d, i64, env)
> +DEF_HELPER_1(rdtime_d, tl, env)
>   
>   #ifndef CONFIG_USER_ONLY
>   /* CSRs helper */
> -DEF_HELPER_1(csrrd_pgd, i64, env)
> -DEF_HELPER_1(csrrd_cpuid, i64, env)
> -DEF_HELPER_1(csrrd_tval, i64, env)
> -DEF_HELPER_2(csrwr_estat, i64, env, tl)
> -DEF_HELPER_2(csrwr_asid, i64, env, tl)
> -DEF_HELPER_2(csrwr_tcfg, i64, env, tl)
> -DEF_HELPER_2(csrwr_ticlr, i64, env, tl)
> -DEF_HELPER_2(iocsrrd_b, i64, env, tl)
> -DEF_HELPER_2(iocsrrd_h, i64, env, tl)
> -DEF_HELPER_2(iocsrrd_w, i64, env, tl)
> -DEF_HELPER_2(iocsrrd_d, i64, env, tl)
> +DEF_HELPER_1(csrrd_pgd, tl, env)
> +DEF_HELPER_1(csrrd_cpuid, tl, env)
> +DEF_HELPER_1(csrrd_tval, tl, env)
> +DEF_HELPER_2(csrwr_estat, tl, env, tl)
> +DEF_HELPER_2(csrwr_asid, tl, env, tl)
> +DEF_HELPER_2(csrwr_tcfg, tl, env, tl)
> +DEF_HELPER_2(csrwr_ticlr, tl, env, tl)
> +DEF_HELPER_2(iocsrrd_b, tl, env, tl)
> +DEF_HELPER_2(iocsrrd_h, tl, env, tl)
> +DEF_HELPER_2(iocsrrd_w, tl, env, tl)
> +DEF_HELPER_2(iocsrrd_d, tl, env, tl)
>   DEF_HELPER_3(iocsrwr_b, void, env, tl, tl)
>   DEF_HELPER_3(iocsrwr_h, void, env, tl, tl)
>   DEF_HELPER_3(iocsrwr_w, void, env, tl, tl)
> diff --git a/target/loongarch/insn_trans/trans_arith.c.inc b/target/loongarch/insn_trans/trans_arith.c.inc
> index 43d6cf261d..b6fb286446 100644
> --- a/target/loongarch/insn_trans/trans_arith.c.inc
> +++ b/target/loongarch/insn_trans/trans_arith.c.inc
> @@ -92,10 +92,11 @@ static void gen_sltu(TCGv dest, TCGv src1, TCGv src2)
>   
>   static void gen_mulh_w(TCGv dest, TCGv src1, TCGv src2)
>   {
> -    tcg_gen_mul_i64(dest, src1, src2);
> -    tcg_gen_sari_i64(dest, dest, 32);
> +    tcg_gen_mul_tl(dest, src1, src2);
> +    tcg_gen_sari_tl(dest, dest, 32);
>   }
>   
> +#ifdef TARGET_LOONGARCH64
>   static void gen_mulh_d(TCGv dest, TCGv src1, TCGv src2)
>   {
>       TCGv discard = tcg_temp_new();
> @@ -128,6 +129,7 @@ static void prep_divisor_d(TCGv ret, TCGv src1, TCGv src2)
>       tcg_gen_or_tl(ret, ret, t1);
>       tcg_gen_movcond_tl(TCG_COND_NE, ret, ret, zero, ret, src2);
>   }
> +#endif
>   
>   static void prep_divisor_du(TCGv ret, TCGv src2)
>   {
> @@ -142,6 +144,7 @@ static void prep_divisor_du(TCGv ret, TCGv src2)
>       tcg_gen_movcond_tl(TCG_COND_EQ, ret, src2, zero, one, src2);
>   }
>   
> +#ifdef TARGET_LOONGARCH64
>   static void gen_div_d(TCGv dest, TCGv src1, TCGv src2)
>   {
>       TCGv t0 = tcg_temp_new();
> @@ -155,6 +158,7 @@ static void gen_rem_d(TCGv dest, TCGv src1, TCGv src2)
>       prep_divisor_d(t0, src1, src2);
>       tcg_gen_rem_tl(dest, src1, t0);
>   }
> +#endif
>   
>   static void gen_div_du(TCGv dest, TCGv src1, TCGv src2)
>   {
> @@ -232,10 +236,12 @@ static target_ulong gen_pcaddu12i(target_ulong pc, int imm)
>       return pc + (imm << 12);
>   }
>   
> +#ifdef TARGET_LOONGARCH64
>   static target_ulong gen_pcaddu18i(target_ulong pc, int imm)
>   {
>       return pc + ((target_ulong)(imm) << 18);
>   }
> +#endif
>   
>   static bool trans_addu16i_d(DisasContext *ctx, arg_addu16i_d *a)
>   {
> @@ -249,9 +255,9 @@ static bool trans_addu16i_d(DisasContext *ctx, arg_addu16i_d *a)
>   }
>   
>   TRANS(add_w, gen_rrr, EXT_NONE, EXT_NONE, EXT_SIGN, tcg_gen_add_tl)
> -TRANS(add_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_add_tl)
> +TRANS_64(add_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_add_tl)
>   TRANS(sub_w, gen_rrr, EXT_NONE, EXT_NONE, EXT_SIGN, tcg_gen_sub_tl)
> -TRANS(sub_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_sub_tl)
> +TRANS_64(sub_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_sub_tl)
>   TRANS(and, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_and_tl)
>   TRANS(or, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_or_tl)
>   TRANS(xor, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_xor_tl)
> @@ -261,32 +267,32 @@ TRANS(orn, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_orc_tl)
>   TRANS(slt, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_slt)
>   TRANS(sltu, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sltu)
>   TRANS(mul_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, tcg_gen_mul_tl)
> -TRANS(mul_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_mul_tl)
> +TRANS_64(mul_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_mul_tl)
>   TRANS(mulh_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, gen_mulh_w)
>   TRANS(mulh_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, gen_mulh_w)
> -TRANS(mulh_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_d)
> -TRANS(mulh_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_du)
> -TRANS(mulw_d_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, tcg_gen_mul_tl)
> -TRANS(mulw_d_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, tcg_gen_mul_tl)
> +TRANS_64(mulh_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_d)
> +TRANS_64(mulh_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_du)
> +TRANS_64(mulw_d_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, tcg_gen_mul_tl)
> +TRANS_64(mulw_d_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, tcg_gen_mul_tl)
>   TRANS(div_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, gen_div_w)
>   TRANS(mod_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, gen_rem_w)
>   TRANS(div_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_SIGN, gen_div_du)
>   TRANS(mod_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_SIGN, gen_rem_du)
> -TRANS(div_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_d)
> -TRANS(mod_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_d)
> -TRANS(div_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_du)
> -TRANS(mod_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_du)
> +TRANS_64(div_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_d)
> +TRANS_64(mod_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_d)
> +TRANS_64(div_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_du)
> +TRANS_64(mod_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_du)
>   TRANS(slti, gen_rri_v, EXT_NONE, EXT_NONE, gen_slt)
>   TRANS(sltui, gen_rri_v, EXT_NONE, EXT_NONE, gen_sltu)
>   TRANS(addi_w, gen_rri_c, EXT_NONE, EXT_SIGN, tcg_gen_addi_tl)
> -TRANS(addi_d, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_addi_tl)
> +TRANS_64(addi_d, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_addi_tl)
>   TRANS(alsl_w, gen_rrr_sa, EXT_NONE, EXT_SIGN, gen_alsl)
> -TRANS(alsl_wu, gen_rrr_sa, EXT_NONE, EXT_ZERO, gen_alsl)
> -TRANS(alsl_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_alsl)
> +TRANS_64(alsl_wu, gen_rrr_sa, EXT_NONE, EXT_ZERO, gen_alsl)
> +TRANS_64(alsl_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_alsl)
>   TRANS(pcaddi, gen_pc, gen_pcaddi)
>   TRANS(pcalau12i, gen_pc, gen_pcalau12i)
>   TRANS(pcaddu12i, gen_pc, gen_pcaddu12i)
> -TRANS(pcaddu18i, gen_pc, gen_pcaddu18i)
> +TRANS_64(pcaddu18i, gen_pc, gen_pcaddu18i)
>   TRANS(andi, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_andi_tl)
>   TRANS(ori, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_ori_tl)
>   TRANS(xori, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_xori_tl)
> diff --git a/target/loongarch/insn_trans/trans_atomic.c.inc b/target/loongarch/insn_trans/trans_atomic.c.inc
> index 612709f2a7..d3d8babd5e 100644
> --- a/target/loongarch/insn_trans/trans_atomic.c.inc
> +++ b/target/loongarch/insn_trans/trans_atomic.c.inc
> @@ -10,7 +10,7 @@ static bool gen_ll(DisasContext *ctx, arg_rr_i *a, MemOp mop)
>       TCGv t0 = tcg_temp_new();
>   
>       tcg_gen_addi_tl(t0, src1, a->imm);
> -    tcg_gen_qemu_ld_i64(dest, t0, ctx->mem_idx, mop);
> +    tcg_gen_qemu_ld_tl(dest, t0, ctx->mem_idx, mop);
>       tcg_gen_st_tl(t0, cpu_env, offsetof(CPULoongArchState, lladdr));
>       tcg_gen_st_tl(dest, cpu_env, offsetof(CPULoongArchState, llval));
>       gen_set_gpr(a->rd, dest, EXT_NONE);
> @@ -70,8 +70,8 @@ static bool gen_am(DisasContext *ctx, arg_rrr *a,
>   
>   TRANS(ll_w, gen_ll, MO_TESL)
>   TRANS(sc_w, gen_sc, MO_TESL)
> -TRANS(ll_d, gen_ll, MO_TEUQ)
> -TRANS(sc_d, gen_sc, MO_TEUQ)
> +TRANS_64(ll_d, gen_ll, MO_TEUQ)
> +TRANS_64(sc_d, gen_sc, MO_TEUQ)
>   TRANS(amswap_w, gen_am, tcg_gen_atomic_xchg_tl, MO_TESL)
>   TRANS(amswap_d, gen_am, tcg_gen_atomic_xchg_tl, MO_TEUQ)
>   TRANS(amadd_w, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TESL)
> diff --git a/target/loongarch/insn_trans/trans_bit.c.inc b/target/loongarch/insn_trans/trans_bit.c.inc
> index 25b4d7858b..80877a1b15 100644
> --- a/target/loongarch/insn_trans/trans_bit.c.inc
> +++ b/target/loongarch/insn_trans/trans_bit.c.inc
> @@ -18,14 +18,20 @@ static bool gen_rr(DisasContext *ctx, arg_rr *a,
>   
>   static void gen_bytepick_w(TCGv dest, TCGv src1, TCGv src2, target_long sa)
>   {
> +#ifdef TARGET_LOONGARCH32
> +    tcg_gen_extract2_tl(dest, src1, src2, (32 - sa * 8));
> +#else
>       tcg_gen_concat_tl_i64(dest, src1, src2);
>       tcg_gen_sextract_i64(dest, dest, (32 - sa * 8), 32);
> +#endif
>   }
>   
> +#ifdef TARGET_LOONGARCH64
>   static void gen_bytepick_d(TCGv dest, TCGv src1, TCGv src2, target_long sa)
>   {
>       tcg_gen_extract2_i64(dest, src1, src2, (64 - sa * 8));
>   }
> +#endif
>   
>   static bool gen_bstrins(DisasContext *ctx, arg_rr_ms_ls *a,
>                           DisasExtend dst_ext)
> @@ -83,9 +89,10 @@ static void gen_cto_w(TCGv dest, TCGv src1)
>       gen_ctz_w(dest, dest);
>   }
>   
> +#ifdef TARGET_LOONGARCH64
>   static void gen_clz_d(TCGv dest, TCGv src1)
>   {
> -    tcg_gen_clzi_i64(dest, src1, TARGET_LONG_BITS);
> +    tcg_gen_clzi_tl(dest, src1, TARGET_LONG_BITS);
>   }
>   
>   static void gen_clo_d(TCGv dest, TCGv src1)
> @@ -110,6 +117,7 @@ static void gen_revb_2w(TCGv dest, TCGv src1)
>       tcg_gen_bswap64_i64(dest, src1);
>       tcg_gen_rotri_i64(dest, dest, 32);
>   }
> +#endif
>   
>   static void gen_revb_2h(TCGv dest, TCGv src1)
>   {
> @@ -124,6 +132,7 @@ static void gen_revb_2h(TCGv dest, TCGv src1)
>       tcg_gen_or_tl(dest, t0, t1);
>   }
>   
> +#ifdef TARGET_LOONGARCH64
>   static void gen_revb_4h(TCGv dest, TCGv src1)
>   {
>       TCGv mask = tcg_constant_tl(0x00FF00FF00FF00FFULL);
> @@ -163,6 +172,7 @@ static void gen_revh_d(TCGv dest, TCGv src1)
>       tcg_gen_or_tl(t0, t0, t1);
>       tcg_gen_rotri_tl(dest, t0, 32);
>   }
> +#endif
>   
>   static void gen_maskeqz(TCGv dest, TCGv src1, TCGv src2)
>   {
> @@ -184,25 +194,25 @@ TRANS(clo_w, gen_rr, EXT_NONE, EXT_NONE, gen_clo_w)
>   TRANS(clz_w, gen_rr, EXT_ZERO, EXT_NONE, gen_clz_w)
>   TRANS(cto_w, gen_rr, EXT_NONE, EXT_NONE, gen_cto_w)
>   TRANS(ctz_w, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_w)
> -TRANS(clo_d, gen_rr, EXT_NONE, EXT_NONE, gen_clo_d)
> -TRANS(clz_d, gen_rr, EXT_NONE, EXT_NONE, gen_clz_d)
> -TRANS(cto_d, gen_rr, EXT_NONE, EXT_NONE, gen_cto_d)
> -TRANS(ctz_d, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_d)
> +TRANS_64(clo_d, gen_rr, EXT_NONE, EXT_NONE, gen_clo_d)
> +TRANS_64(clz_d, gen_rr, EXT_NONE, EXT_NONE, gen_clz_d)
> +TRANS_64(cto_d, gen_rr, EXT_NONE, EXT_NONE, gen_cto_d)
> +TRANS_64(ctz_d, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_d)
>   TRANS(revb_2h, gen_rr, EXT_NONE, EXT_SIGN, gen_revb_2h)
> -TRANS(revb_4h, gen_rr, EXT_NONE, EXT_NONE, gen_revb_4h)
> -TRANS(revb_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revb_2w)
> -TRANS(revb_d, gen_rr, EXT_NONE, EXT_NONE, tcg_gen_bswap64_i64)
> -TRANS(revh_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revh_2w)
> -TRANS(revh_d, gen_rr, EXT_NONE, EXT_NONE, gen_revh_d)
> +TRANS_64(revb_4h, gen_rr, EXT_NONE, EXT_NONE, gen_revb_4h)
> +TRANS_64(revb_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revb_2w)
> +TRANS_64(revb_d, gen_rr, EXT_NONE, EXT_NONE, tcg_gen_bswap64_i64)
> +TRANS_64(revh_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revh_2w)
> +TRANS_64(revh_d, gen_rr, EXT_NONE, EXT_NONE, gen_revh_d)
>   TRANS(bitrev_4b, gen_rr, EXT_ZERO, EXT_SIGN, gen_helper_bitswap)
> -TRANS(bitrev_8b, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitswap)
> +TRANS_64(bitrev_8b, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitswap)
>   TRANS(bitrev_w, gen_rr, EXT_NONE, EXT_SIGN, gen_helper_bitrev_w)
> -TRANS(bitrev_d, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitrev_d)
> +TRANS_64(bitrev_d, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitrev_d)
>   TRANS(maskeqz, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_maskeqz)
>   TRANS(masknez, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_masknez)
>   TRANS(bytepick_w, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_w)
> -TRANS(bytepick_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_d)
> +TRANS_64(bytepick_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_d)
>   TRANS(bstrins_w, gen_bstrins, EXT_SIGN)
> -TRANS(bstrins_d, gen_bstrins, EXT_NONE)
> +TRANS_64(bstrins_d, gen_bstrins, EXT_NONE)
>   TRANS(bstrpick_w, gen_bstrpick, EXT_SIGN)
> -TRANS(bstrpick_d, gen_bstrpick, EXT_NONE)
> +TRANS_64(bstrpick_d, gen_bstrpick, EXT_NONE)
> diff --git a/target/loongarch/insn_trans/trans_extra.c.inc b/target/loongarch/insn_trans/trans_extra.c.inc
> index 06f4de4515..2beb858582 100644
> --- a/target/loongarch/insn_trans/trans_extra.c.inc
> +++ b/target/loongarch/insn_trans/trans_extra.c.inc
> @@ -44,7 +44,7 @@ static bool gen_rdtime(DisasContext *ctx, arg_rr *a,
>       if (word) {
>           tcg_gen_sextract_tl(dst1, dst1, high ? 32 : 0, 32);
>       }
> -    tcg_gen_ld_i64(dst2, cpu_env, offsetof(CPULoongArchState, CSR_TID));
> +    tcg_gen_ld_tl(dst2, cpu_env, offsetof(CPULoongArchState, CSR_TID));
>   
>       return true;
>   }
> diff --git a/target/loongarch/insn_trans/trans_farith.c.inc b/target/loongarch/insn_trans/trans_farith.c.inc
> index 21ea47308b..fa146706bc 100644
> --- a/target/loongarch/insn_trans/trans_farith.c.inc
> +++ b/target/loongarch/insn_trans/trans_farith.c.inc
> @@ -15,11 +15,11 @@
>   #endif
>   
>   static bool gen_fff(DisasContext *ctx, arg_fff *a,
> -                    void (*func)(TCGv, TCGv_env, TCGv, TCGv))
> +                    void (*func)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64))
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src1 = get_fpr(ctx, a->fj);
> -    TCGv src2 = get_fpr(ctx, a->fk);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src1 = get_fpr(ctx, a->fj);
> +    TCGv_i64 src2 = get_fpr(ctx, a->fk);
>   
>       CHECK_FPE;
>   
> @@ -30,10 +30,10 @@ static bool gen_fff(DisasContext *ctx, arg_fff *a,
>   }
>   
>   static bool gen_ff(DisasContext *ctx, arg_ff *a,
> -                   void (*func)(TCGv, TCGv_env, TCGv))
> +                   void (*func)(TCGv_i64, TCGv_env, TCGv_i64))
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src = get_fpr(ctx, a->fj);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> @@ -44,14 +44,14 @@ static bool gen_ff(DisasContext *ctx, arg_ff *a,
>   }
>   
>   static bool gen_muladd(DisasContext *ctx, arg_ffff *a,
> -                       void (*func)(TCGv, TCGv_env, TCGv, TCGv, TCGv, TCGv_i32),
> +                       void (*func)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i32),
>                          int flag)
>   {
>       TCGv_i32 tflag = tcg_constant_i32(flag);
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src1 = get_fpr(ctx, a->fj);
> -    TCGv src2 = get_fpr(ctx, a->fk);
> -    TCGv src3 = get_fpr(ctx, a->fa);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src1 = get_fpr(ctx, a->fj);
> +    TCGv_i64 src2 = get_fpr(ctx, a->fk);
> +    TCGv_i64 src3 = get_fpr(ctx, a->fa);
>   
>       CHECK_FPE;
>   
> @@ -63,9 +63,9 @@ static bool gen_muladd(DisasContext *ctx, arg_ffff *a,
>   
>   static bool trans_fcopysign_s(DisasContext *ctx, arg_fcopysign_s *a)
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src1 = get_fpr(ctx, a->fk);
> -    TCGv src2 = get_fpr(ctx, a->fj);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src1 = get_fpr(ctx, a->fk);
> +    TCGv_i64 src2 = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> @@ -77,9 +77,9 @@ static bool trans_fcopysign_s(DisasContext *ctx, arg_fcopysign_s *a)
>   
>   static bool trans_fcopysign_d(DisasContext *ctx, arg_fcopysign_d *a)
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src1 = get_fpr(ctx, a->fk);
> -    TCGv src2 = get_fpr(ctx, a->fj);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src1 = get_fpr(ctx, a->fk);
> +    TCGv_i64 src2 = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> @@ -91,8 +91,8 @@ static bool trans_fcopysign_d(DisasContext *ctx, arg_fcopysign_d *a)
>   
>   static bool trans_fabs_s(DisasContext *ctx, arg_fabs_s *a)
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src = get_fpr(ctx, a->fj);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> @@ -105,8 +105,8 @@ static bool trans_fabs_s(DisasContext *ctx, arg_fabs_s *a)
>   
>   static bool trans_fabs_d(DisasContext *ctx, arg_fabs_d *a)
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src = get_fpr(ctx, a->fj);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> @@ -118,8 +118,8 @@ static bool trans_fabs_d(DisasContext *ctx, arg_fabs_d *a)
>   
>   static bool trans_fneg_s(DisasContext *ctx, arg_fneg_s *a)
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src = get_fpr(ctx, a->fj);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> @@ -132,8 +132,8 @@ static bool trans_fneg_s(DisasContext *ctx, arg_fneg_s *a)
>   
>   static bool trans_fneg_d(DisasContext *ctx, arg_fneg_d *a)
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src = get_fpr(ctx, a->fj);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> diff --git a/target/loongarch/insn_trans/trans_fcmp.c.inc b/target/loongarch/insn_trans/trans_fcmp.c.inc
> index a78868dbc4..ebef54f495 100644
> --- a/target/loongarch/insn_trans/trans_fcmp.c.inc
> +++ b/target/loongarch/insn_trans/trans_fcmp.c.inc
> @@ -25,13 +25,13 @@ static uint32_t get_fcmp_flags(int cond)
>   
>   static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a)
>   {
> -    TCGv var, src1, src2;
> +    TCGv_i64 var, src1, src2;
>       uint32_t flags;
> -    void (*fn)(TCGv, TCGv_env, TCGv, TCGv, TCGv_i32);
> +    void (*fn)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64, TCGv_i32);
>   
>       CHECK_FPE;
>   
> -    var = tcg_temp_new();
> +    var = tcg_temp_new_i64();
>       src1 = get_fpr(ctx, a->fj);
>       src2 = get_fpr(ctx, a->fk);
>       fn = (a->fcond & 1 ? gen_helper_fcmp_s_s : gen_helper_fcmp_c_s);
> @@ -39,19 +39,19 @@ static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a)
>   
>       fn(var, cpu_env, src1, src2, tcg_constant_i32(flags));
>   
> -    tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
> +    tcg_gen_st8_i64(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
>       return true;
>   }
>   
>   static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a)
>   {
> -    TCGv var, src1, src2;
> +    TCGv_i64 var, src1, src2;
>       uint32_t flags;
> -    void (*fn)(TCGv, TCGv_env, TCGv, TCGv, TCGv_i32);
> +    void (*fn)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64, TCGv_i32);
>   
>       CHECK_FPE;
>   
> -    var = tcg_temp_new();
> +    var = tcg_temp_new_i64();
>       src1 = get_fpr(ctx, a->fj);
>       src2 = get_fpr(ctx, a->fk);
>       fn = (a->fcond & 1 ? gen_helper_fcmp_s_d : gen_helper_fcmp_c_d);
> @@ -59,6 +59,6 @@ static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a)
>   
>       fn(var, cpu_env, src1, src2, tcg_constant_i32(flags));
>   
> -    tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
> +    tcg_gen_st8_i64(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
>       return true;
>   }
> diff --git a/target/loongarch/insn_trans/trans_fmemory.c.inc b/target/loongarch/insn_trans/trans_fmemory.c.inc
> index 91c09fb6d9..6e46782666 100644
> --- a/target/loongarch/insn_trans/trans_fmemory.c.inc
> +++ b/target/loongarch/insn_trans/trans_fmemory.c.inc
> @@ -3,7 +3,7 @@
>    * Copyright (c) 2021 Loongson Technology Corporation Limited
>    */
>   
> -static void maybe_nanbox_load(TCGv freg, MemOp mop)
> +static void maybe_nanbox_load(TCGv_i64 freg, MemOp mop)
>   {
>       if ((mop & MO_SIZE) == MO_32) {
>           gen_nanbox_s(freg, freg);
> @@ -13,7 +13,7 @@ static void maybe_nanbox_load(TCGv freg, MemOp mop)
>   static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
>   {
>       TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
> -    TCGv dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>   
>       CHECK_FPE;
>   
> @@ -23,7 +23,7 @@ static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
>           addr = temp;
>       }
>   
> -    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
> +    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
>       maybe_nanbox_load(dest, mop);
>       set_fpr(a->fd, dest);
>   
> @@ -33,7 +33,7 @@ static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
>   static bool gen_fstore_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
>   {
>       TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
> -    TCGv src = get_fpr(ctx, a->fd);
> +    TCGv_i64 src = get_fpr(ctx, a->fd);
>   
>       CHECK_FPE;
>   
> @@ -43,7 +43,7 @@ static bool gen_fstore_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
>           addr = temp;
>       }
>   
> -    tcg_gen_qemu_st_tl(src, addr, ctx->mem_idx, mop);
> +    tcg_gen_qemu_st_i64(src, addr, ctx->mem_idx, mop);
>   
>       return true;
>   }
> @@ -52,14 +52,14 @@ static bool gen_floadx(DisasContext *ctx, arg_frr *a, MemOp mop)
>   {
>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
> -    TCGv dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>       TCGv addr;
>   
>       CHECK_FPE;
>   
>       addr = tcg_temp_new();
>       tcg_gen_add_tl(addr, src1, src2);
> -    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
> +    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
>       maybe_nanbox_load(dest, mop);
>       set_fpr(a->fd, dest);
>   
> @@ -70,14 +70,14 @@ static bool gen_fstorex(DisasContext *ctx, arg_frr *a, MemOp mop)
>   {
>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
> -    TCGv src3 = get_fpr(ctx, a->fd);
> +    TCGv_i64 src3 = get_fpr(ctx, a->fd);
>       TCGv addr;
>   
>       CHECK_FPE;
>   
>       addr = tcg_temp_new();
>       tcg_gen_add_tl(addr, src1, src2);
> -    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
> +    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
>   
>       return true;
>   }
> @@ -86,7 +86,7 @@ static bool gen_fload_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
>   {
>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
> -    TCGv dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>       TCGv addr;
>   
>       CHECK_FPE;
> @@ -94,7 +94,7 @@ static bool gen_fload_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
>       addr = tcg_temp_new();
>       gen_helper_asrtgt_d(cpu_env, src1, src2);
>       tcg_gen_add_tl(addr, src1, src2);
> -    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
> +    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
>       maybe_nanbox_load(dest, mop);
>       set_fpr(a->fd, dest);
>   
> @@ -105,7 +105,7 @@ static bool gen_fstore_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
>   {
>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
> -    TCGv src3 = get_fpr(ctx, a->fd);
> +    TCGv_i64 src3 = get_fpr(ctx, a->fd);
>       TCGv addr;
>   
>       CHECK_FPE;
> @@ -113,7 +113,7 @@ static bool gen_fstore_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
>       addr = tcg_temp_new();
>       gen_helper_asrtgt_d(cpu_env, src1, src2);
>       tcg_gen_add_tl(addr, src1, src2);
> -    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
> +    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
>   
>       return true;
>   }
> @@ -122,7 +122,7 @@ static bool gen_fload_le(DisasContext *ctx, arg_frr *a, MemOp mop)
>   {
>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
> -    TCGv dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>       TCGv addr;
>   
>       CHECK_FPE;
> @@ -130,7 +130,7 @@ static bool gen_fload_le(DisasContext *ctx, arg_frr *a, MemOp mop)
>       addr = tcg_temp_new();
>       gen_helper_asrtle_d(cpu_env, src1, src2);
>       tcg_gen_add_tl(addr, src1, src2);
> -    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
> +    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
>       maybe_nanbox_load(dest, mop);
>       set_fpr(a->fd, dest);
>   
> @@ -141,7 +141,7 @@ static bool gen_fstore_le(DisasContext *ctx, arg_frr *a, MemOp mop)
>   {
>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
> -    TCGv src3 = get_fpr(ctx, a->fd);
> +    TCGv_i64 src3 = get_fpr(ctx, a->fd);
>       TCGv addr;
>   
>       CHECK_FPE;
> @@ -149,7 +149,7 @@ static bool gen_fstore_le(DisasContext *ctx, arg_frr *a, MemOp mop)
>       addr = tcg_temp_new();
>       gen_helper_asrtle_d(cpu_env, src1, src2);
>       tcg_gen_add_tl(addr, src1, src2);
> -    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
> +    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
>   
>       return true;
>   }
> diff --git a/target/loongarch/insn_trans/trans_fmov.c.inc b/target/loongarch/insn_trans/trans_fmov.c.inc
> index 5af0dd1b66..46b2af4b0c 100644
> --- a/target/loongarch/insn_trans/trans_fmov.c.inc
> +++ b/target/loongarch/insn_trans/trans_fmov.c.inc
> @@ -9,27 +9,27 @@ static const uint32_t fcsr_mask[4] = {
>   
>   static bool trans_fsel(DisasContext *ctx, arg_fsel *a)
>   {
> -    TCGv zero = tcg_constant_tl(0);
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src1 = get_fpr(ctx, a->fj);
> -    TCGv src2 = get_fpr(ctx, a->fk);
> -    TCGv cond;
> +    TCGv_i64 zero = tcg_constant_i64(0);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src1 = get_fpr(ctx, a->fj);
> +    TCGv_i64 src2 = get_fpr(ctx, a->fk);
> +    TCGv_i64 cond;
>   
>       CHECK_FPE;
>   
> -    cond = tcg_temp_new();
> -    tcg_gen_ld8u_tl(cond, cpu_env, offsetof(CPULoongArchState, cf[a->ca]));
> -    tcg_gen_movcond_tl(TCG_COND_EQ, dest, cond, zero, src1, src2);
> +    cond = tcg_temp_new_i64();
> +    tcg_gen_ld8u_i64(cond, cpu_env, offsetof(CPULoongArchState, cf[a->ca]));
> +    tcg_gen_movcond_i64(TCG_COND_EQ, dest, cond, zero, src1, src2);
>       set_fpr(a->fd, dest);
>   
>       return true;
>   }
>   
>   static bool gen_f2f(DisasContext *ctx, arg_ff *a,
> -                    void (*func)(TCGv, TCGv), bool nanbox)
> +                    void (*func)(TCGv_i64, TCGv_i64), bool nanbox)
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> -    TCGv src = get_fpr(ctx, a->fj);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> @@ -43,10 +43,10 @@ static bool gen_f2f(DisasContext *ctx, arg_ff *a,
>   }
>   
>   static bool gen_r2f(DisasContext *ctx, arg_fr *a,
> -                    void (*func)(TCGv, TCGv))
> +                    void (*func)(TCGv_i64, TCGv))
>   {
>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
> -    TCGv dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>   
>       CHECK_FPE;
>   
> @@ -57,10 +57,10 @@ static bool gen_r2f(DisasContext *ctx, arg_fr *a,
>   }
>   
>   static bool gen_f2r(DisasContext *ctx, arg_rf *a,
> -                    void (*func)(TCGv, TCGv))
> +                    void (*func)(TCGv, TCGv_i64))
>   {
>       TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
> -    TCGv src = get_fpr(ctx, a->fj);
> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> @@ -78,13 +78,17 @@ static bool trans_movgr2fcsr(DisasContext *ctx, arg_movgr2fcsr *a)
>       CHECK_FPE;
>   
>       if (mask == UINT32_MAX) {
> -        tcg_gen_st32_i64(Rj, cpu_env, offsetof(CPULoongArchState, fcsr0));
> +        tcg_gen_st32_tl(Rj, cpu_env, offsetof(CPULoongArchState, fcsr0));
>       } else {
>           TCGv_i32 fcsr0 = tcg_temp_new_i32();
>           TCGv_i32 temp = tcg_temp_new_i32();
>   
>           tcg_gen_ld_i32(fcsr0, cpu_env, offsetof(CPULoongArchState, fcsr0));
> +#ifdef TARGET_LOONGARCH32
> +        tcg_gen_mov_i32(temp, Rj);
> +#else
>           tcg_gen_extrl_i64_i32(temp, Rj);
> +#endif
>           tcg_gen_andi_i32(temp, temp, mask);
>           tcg_gen_andi_i32(fcsr0, fcsr0, ~mask);
>           tcg_gen_or_i32(fcsr0, fcsr0, temp);
> @@ -107,49 +111,65 @@ static bool trans_movfcsr2gr(DisasContext *ctx, arg_movfcsr2gr *a)
>   
>       CHECK_FPE;
>   
> -    tcg_gen_ld32u_i64(dest, cpu_env, offsetof(CPULoongArchState, fcsr0));
> -    tcg_gen_andi_i64(dest, dest, fcsr_mask[a->fcsrs]);
> +    tcg_gen_ld32u_tl(dest, cpu_env, offsetof(CPULoongArchState, fcsr0));
> +    tcg_gen_andi_tl(dest, dest, fcsr_mask[a->fcsrs]);
>       gen_set_gpr(a->rd, dest, EXT_NONE);
>   
>       return true;
>   }
>   
> -static void gen_movgr2fr_w(TCGv dest, TCGv src)
> +static void gen_movgr2fr_w(TCGv_i64 dest, TCGv src)
>   {
> +#ifdef TARGET_LOONGARCH32
> +    TCGv_i64 src_i64 = tcg_temp_new_i64();
> +    tcg_gen_extu_i32_i64(src_i64, src);
> +    tcg_gen_deposit_i64(dest, dest, src_i64, 0, 32);
> +#else
>       tcg_gen_deposit_i64(dest, dest, src, 0, 32);
> +#endif
>   }
>   
> -static void gen_movgr2frh_w(TCGv dest, TCGv src)
> +static void gen_movgr2frh_w(TCGv_i64 dest, TCGv src)
>   {
> +#ifdef TARGET_LOONGARCH32
> +    TCGv_i64 src_i64 = tcg_temp_new_i64();
> +    tcg_gen_extu_i32_i64(src_i64, src);
> +    tcg_gen_deposit_i64(dest, dest, src_i64, 32, 32);
> +#else
>       tcg_gen_deposit_i64(dest, dest, src, 32, 32);
> +#endif
>   }
>   
> -static void gen_movfrh2gr_s(TCGv dest, TCGv src)
> +static void gen_movfrh2gr_s(TCGv dest, TCGv_i64 src)
>   {
> +#ifdef TARGET_LOONGARCH32
> +    tcg_gen_extrh_i64_i32(dest, src);
> +#else
>       tcg_gen_sextract_tl(dest, src, 32, 32);
> +#endif
>   }
>   
>   static bool trans_movfr2cf(DisasContext *ctx, arg_movfr2cf *a)
>   {
> -    TCGv t0;
> -    TCGv src = get_fpr(ctx, a->fj);
> +    TCGv_i64 t0;
> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>   
>       CHECK_FPE;
>   
> -    t0 = tcg_temp_new();
> -    tcg_gen_andi_tl(t0, src, 0x1);
> -    tcg_gen_st8_tl(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7]));
> +    t0 = tcg_temp_new_i64();
> +    tcg_gen_andi_i64(t0, src, 0x1);
> +    tcg_gen_st8_i64(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7]));
>   
>       return true;
>   }
>   
>   static bool trans_movcf2fr(DisasContext *ctx, arg_movcf2fr *a)
>   {
> -    TCGv dest = get_fpr(ctx, a->fd);
> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>   
>       CHECK_FPE;
>   
> -    tcg_gen_ld8u_tl(dest, cpu_env,
> +    tcg_gen_ld8u_i64(dest, cpu_env,
>                       offsetof(CPULoongArchState, cf[a->cj & 0x7]));
>       set_fpr(a->fd, dest);
>   
> @@ -178,11 +198,15 @@ static bool trans_movcf2gr(DisasContext *ctx, arg_movcf2gr *a)
>       return true;
>   }
>   
> -TRANS(fmov_s, gen_f2f, tcg_gen_mov_tl, true)
> -TRANS(fmov_d, gen_f2f, tcg_gen_mov_tl, false)
> +TRANS(fmov_s, gen_f2f, tcg_gen_mov_i64, true)
> +TRANS(fmov_d, gen_f2f, tcg_gen_mov_i64, false)
>   TRANS(movgr2fr_w, gen_r2f, gen_movgr2fr_w)
> -TRANS(movgr2fr_d, gen_r2f, tcg_gen_mov_tl)
> +TRANS_64(movgr2fr_d, gen_r2f, tcg_gen_mov_tl)
>   TRANS(movgr2frh_w, gen_r2f, gen_movgr2frh_w)
> +#ifdef TARGET_LOONGARCH32
> +TRANS(movfr2gr_s, gen_f2r, tcg_gen_extrl_i64_i32)
> +#else
>   TRANS(movfr2gr_s, gen_f2r, tcg_gen_ext32s_tl)
> -TRANS(movfr2gr_d, gen_f2r, tcg_gen_mov_tl)
> +#endif
> +TRANS_64(movfr2gr_d, gen_f2r, tcg_gen_mov_tl)
>   TRANS(movfrh2gr_s, gen_f2r, gen_movfrh2gr_s)
> diff --git a/target/loongarch/insn_trans/trans_lsx.c.inc b/target/loongarch/insn_trans/trans_lsx.c.inc
> index 68779daff6..25f72460c8 100644
> --- a/target/loongarch/insn_trans/trans_lsx.c.inc
> +++ b/target/loongarch/insn_trans/trans_lsx.c.inc
> @@ -3930,23 +3930,23 @@ static bool trans_vbitseli_b(DisasContext *ctx, arg_vv_i *a)
>   }
>   
>   #define VSET(NAME, COND)                                                       \
> -static bool trans_## NAME (DisasContext *ctx, arg_cv *a)                       \
> -{                                                                              \
> -    TCGv_i64 t1, al, ah;                                                       \
> -                                                                               \
> -    al = tcg_temp_new_i64();                                                   \
> -    ah = tcg_temp_new_i64();                                                   \
> -    t1 = tcg_temp_new_i64();                                                   \
> -                                                                               \
> -    get_vreg64(ah, a->vj, 1);                                                  \
> -    get_vreg64(al, a->vj, 0);                                                  \
> -                                                                               \
> -    CHECK_SXE;                                                                 \
> -    tcg_gen_or_i64(t1, al, ah);                                                \
> -    tcg_gen_setcondi_i64(COND, t1, t1, 0);                                     \
> -    tcg_gen_st8_tl(t1, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7])); \
> -                                                                               \
> -    return true;                                                               \
> +static bool trans_## NAME (DisasContext *ctx, arg_cv *a)                        \
> +{                                                                               \
> +    TCGv_i64 t1, al, ah;                                                        \
> +                                                                                \
> +    al = tcg_temp_new_i64();                                                    \
> +    ah = tcg_temp_new_i64();                                                    \
> +    t1 = tcg_temp_new_i64();                                                    \
> +                                                                                \
> +    get_vreg64(ah, a->vj, 1);                                                   \
> +    get_vreg64(al, a->vj, 0);                                                   \
> +                                                                                \
> +    CHECK_SXE;                                                                  \
> +    tcg_gen_or_i64(t1, al, ah);                                                 \
> +    tcg_gen_setcondi_i64(COND, t1, t1, 0);                                      \
> +    tcg_gen_st8_i64(t1, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7])); \
> +                                                                                \
> +    return true;                                                                \
>   }
>   
>   VSET(vseteqz_v, TCG_COND_EQ)
> @@ -3965,7 +3965,7 @@ static bool trans_vinsgr2vr_b(DisasContext *ctx, arg_vr_i *a)
>   {
>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_st8_i64(src, cpu_env,
> +    tcg_gen_st8_tl(src, cpu_env,
>                       offsetof(CPULoongArchState, fpr[a->vd].vreg.B(a->imm)));
>       return true;
>   }
> @@ -3974,7 +3974,7 @@ static bool trans_vinsgr2vr_h(DisasContext *ctx, arg_vr_i *a)
>   {
>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_st16_i64(src, cpu_env,
> +    tcg_gen_st16_tl(src, cpu_env,
>                       offsetof(CPULoongArchState, fpr[a->vd].vreg.H(a->imm)));
>       return true;
>   }
> @@ -3983,7 +3983,7 @@ static bool trans_vinsgr2vr_w(DisasContext *ctx, arg_vr_i *a)
>   {
>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_st32_i64(src, cpu_env,
> +    tcg_gen_st32_tl(src, cpu_env,
>                        offsetof(CPULoongArchState, fpr[a->vd].vreg.W(a->imm)));
>       return true;
>   }
> @@ -3992,7 +3992,7 @@ static bool trans_vinsgr2vr_d(DisasContext *ctx, arg_vr_i *a)
>   {
>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_st_i64(src, cpu_env,
> +    tcg_gen_st_tl(src, cpu_env,
>                      offsetof(CPULoongArchState, fpr[a->vd].vreg.D(a->imm)));
>       return true;
>   }
> @@ -4001,7 +4001,7 @@ static bool trans_vpickve2gr_b(DisasContext *ctx, arg_rv_i *a)
>   {
>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_ld8s_i64(dst, cpu_env,
> +    tcg_gen_ld8s_tl(dst, cpu_env,
>                        offsetof(CPULoongArchState, fpr[a->vj].vreg.B(a->imm)));
>       return true;
>   }
> @@ -4010,7 +4010,7 @@ static bool trans_vpickve2gr_h(DisasContext *ctx, arg_rv_i *a)
>   {
>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_ld16s_i64(dst, cpu_env,
> +    tcg_gen_ld16s_tl(dst, cpu_env,
>                         offsetof(CPULoongArchState, fpr[a->vj].vreg.H(a->imm)));
>       return true;
>   }
> @@ -4019,7 +4019,7 @@ static bool trans_vpickve2gr_w(DisasContext *ctx, arg_rv_i *a)
>   {
>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_ld32s_i64(dst, cpu_env,
> +    tcg_gen_ld32s_tl(dst, cpu_env,
>                         offsetof(CPULoongArchState, fpr[a->vj].vreg.W(a->imm)));
>       return true;
>   }
> @@ -4028,7 +4028,7 @@ static bool trans_vpickve2gr_d(DisasContext *ctx, arg_rv_i *a)
>   {
>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_ld_i64(dst, cpu_env,
> +    tcg_gen_ld_tl(dst, cpu_env,
>                      offsetof(CPULoongArchState, fpr[a->vj].vreg.D(a->imm)));
>       return true;
>   }
> @@ -4037,7 +4037,7 @@ static bool trans_vpickve2gr_bu(DisasContext *ctx, arg_rv_i *a)
>   {
>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_ld8u_i64(dst, cpu_env,
> +    tcg_gen_ld8u_tl(dst, cpu_env,
>                        offsetof(CPULoongArchState, fpr[a->vj].vreg.B(a->imm)));
>       return true;
>   }
> @@ -4046,7 +4046,7 @@ static bool trans_vpickve2gr_hu(DisasContext *ctx, arg_rv_i *a)
>   {
>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_ld16u_i64(dst, cpu_env,
> +    tcg_gen_ld16u_tl(dst, cpu_env,
>                         offsetof(CPULoongArchState, fpr[a->vj].vreg.H(a->imm)));
>       return true;
>   }
> @@ -4055,7 +4055,7 @@ static bool trans_vpickve2gr_wu(DisasContext *ctx, arg_rv_i *a)
>   {
>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_ld32u_i64(dst, cpu_env,
> +    tcg_gen_ld32u_tl(dst, cpu_env,
>                         offsetof(CPULoongArchState, fpr[a->vj].vreg.W(a->imm)));
>       return true;
>   }
> @@ -4064,7 +4064,7 @@ static bool trans_vpickve2gr_du(DisasContext *ctx, arg_rv_i *a)
>   {
>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>       CHECK_SXE;
> -    tcg_gen_ld_i64(dst, cpu_env,
> +    tcg_gen_ld_tl(dst, cpu_env,
>                      offsetof(CPULoongArchState, fpr[a->vj].vreg.D(a->imm)));
>       return true;
>   }
> @@ -4074,7 +4074,7 @@ static bool gvec_dup(DisasContext *ctx, arg_vr *a, MemOp mop)
>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>       CHECK_SXE;
>   
> -    tcg_gen_gvec_dup_i64(mop, vec_full_offset(a->vd),
> +    tcg_gen_gvec_dup_tl(mop, vec_full_offset(a->vd),
>                            16, ctx->vl/8, src);
>       return true;
>   }
> @@ -4131,7 +4131,8 @@ static bool gen_vreplve(DisasContext *ctx, arg_vvr *a, int vece, int bit,
>   
>       CHECK_SXE;
>   
> -    tcg_gen_andi_i64(t0, gpr_src(ctx, a->rk, EXT_NONE), (LSX_LEN/bit) -1);
> +    tcg_gen_extu_tl_i64(t0, gpr_src(ctx, a->rk, EXT_NONE));
> +    tcg_gen_andi_i64(t0, t0, (LSX_LEN / bit) - 1);
>       tcg_gen_shli_i64(t0, t0, vece);
>       if (HOST_BIG_ENDIAN) {
>           tcg_gen_xori_i64(t0, t0, vece << ((LSX_LEN/bit) -1));
> diff --git a/target/loongarch/iocsr_helper.c b/target/loongarch/iocsr_helper.c
> index dda9845d6c..32cf3204b2 100644
> --- a/target/loongarch/iocsr_helper.c
> +++ b/target/loongarch/iocsr_helper.c
> @@ -16,25 +16,25 @@
>   #define GET_MEMTXATTRS(cas) \
>           ((MemTxAttrs){.requester_id = env_cpu(cas)->cpu_index})
>   
> -uint64_t helper_iocsrrd_b(CPULoongArchState *env, target_ulong r_addr)
> +target_ulong helper_iocsrrd_b(CPULoongArchState *env, target_ulong r_addr)
>   {
>       return address_space_ldub(&env->address_space_iocsr, r_addr,
>                                 GET_MEMTXATTRS(env), NULL);
>   }
>   
> -uint64_t helper_iocsrrd_h(CPULoongArchState *env, target_ulong r_addr)
> +target_ulong helper_iocsrrd_h(CPULoongArchState *env, target_ulong r_addr)
>   {
>       return address_space_lduw(&env->address_space_iocsr, r_addr,
>                                 GET_MEMTXATTRS(env), NULL);
>   }
>   
> -uint64_t helper_iocsrrd_w(CPULoongArchState *env, target_ulong r_addr)
> +target_ulong helper_iocsrrd_w(CPULoongArchState *env, target_ulong r_addr)
>   {
>       return address_space_ldl(&env->address_space_iocsr, r_addr,
>                                GET_MEMTXATTRS(env), NULL);
>   }
>   
> -uint64_t helper_iocsrrd_d(CPULoongArchState *env, target_ulong r_addr)
> +target_ulong helper_iocsrrd_d(CPULoongArchState *env, target_ulong r_addr)
>   {
>       return address_space_ldq(&env->address_space_iocsr, r_addr,
>                                GET_MEMTXATTRS(env), NULL);
> diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
> index d8ac99c9a4..31b9635bc4 100644
> --- a/target/loongarch/machine.c
> +++ b/target/loongarch/machine.c
> @@ -99,61 +99,61 @@ const VMStateDescription vmstate_loongarch_cpu = {
>           VMSTATE_UINTTL(env.pc, LoongArchCPU),
>   
>           /* Remaining CSRs */
> -        VMSTATE_UINT64(env.CSR_CRMD, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PRMD, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_EUEN, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_MISC, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_ECFG, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_ESTAT, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_ERA, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_BADV, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_BADI, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_EENTRY, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBIDX, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBEHI, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBELO0, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBELO1, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_ASID, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PGDL, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PGDH, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PGD, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PWCL, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PWCH, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_STLBPS, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_RVACFG, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PRCFG1, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PRCFG2, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_PRCFG3, LoongArchCPU),
> -        VMSTATE_UINT64_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
> -        VMSTATE_UINT64(env.CSR_TID, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TCFG, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TVAL, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_CNTC, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TICLR, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_LLBCTL, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_IMPCTL1, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_IMPCTL2, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBRENTRY, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBRBADV, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBRERA, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBRSAVE, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBRELO0, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBRELO1, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBREHI, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_TLBRPRMD, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_MERRCTL, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_MERRINFO1, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_MERRINFO2, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_MERRENTRY, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_MERRERA, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_MERRSAVE, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_CTAG, LoongArchCPU),
> -        VMSTATE_UINT64_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
> +        VMSTATE_UINTTL(env.CSR_CRMD, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PRMD, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_EUEN, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_MISC, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_ECFG, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_ESTAT, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_ERA, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_BADV, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_BADI, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_EENTRY, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBIDX, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBEHI, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBELO0, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBELO1, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_ASID, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PGDL, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PGDH, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PGD, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PWCL, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PWCH, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_STLBPS, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_RVACFG, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PRCFG1, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PRCFG2, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_PRCFG3, LoongArchCPU),
> +        VMSTATE_UINTTL_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
> +        VMSTATE_UINTTL(env.CSR_TID, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TCFG, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TVAL, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_CNTC, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TICLR, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_LLBCTL, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_IMPCTL1, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_IMPCTL2, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBRENTRY, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBRBADV, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBRERA, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBRSAVE, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBRELO0, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBRELO1, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBREHI, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_TLBRPRMD, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_MERRCTL, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_MERRINFO1, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_MERRINFO2, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_MERRENTRY, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_MERRERA, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_MERRSAVE, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_CTAG, LoongArchCPU),
> +        VMSTATE_UINTTL_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
>   
>           /* Debug CSRs */
> -        VMSTATE_UINT64(env.CSR_DBG, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
> -        VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_DBG, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_DERA, LoongArchCPU),
> +        VMSTATE_UINTTL(env.CSR_DSAVE, LoongArchCPU),
>           /* TLB */
>           VMSTATE_STRUCT_ARRAY(env.tlb, LoongArchCPU, LOONGARCH_TLB_MAX,
>                                0, vmstate_tlb, LoongArchTLB),
> diff --git a/target/loongarch/op_helper.c b/target/loongarch/op_helper.c
> index 60335a05e2..61dbddc501 100644
> --- a/target/loongarch/op_helper.c
> +++ b/target/loongarch/op_helper.c
> @@ -62,7 +62,7 @@ void helper_asrtgt_d(CPULoongArchState *env, target_ulong rj, target_ulong rk)
>       }
>   }
>   
> -target_ulong helper_crc32(target_ulong val, target_ulong m, uint64_t sz)
> +target_ulong helper_crc32(target_ulong val, target_ulong m, target_ulong sz)
>   {
>       uint8_t buf[8];
>       target_ulong mask = ((sz * 8) == 64) ? -1ULL : ((1ULL << (sz * 8)) - 1);
> @@ -72,7 +72,7 @@ target_ulong helper_crc32(target_ulong val, target_ulong m, uint64_t sz)
>       return (int32_t) (crc32(val ^ 0xffffffff, buf, sz) ^ 0xffffffff);
>   }
>   
> -target_ulong helper_crc32c(target_ulong val, target_ulong m, uint64_t sz)
> +target_ulong helper_crc32c(target_ulong val, target_ulong m, target_ulong sz)
>   {
>       uint8_t buf[8];
>       target_ulong mask = ((sz * 8) == 64) ? -1ULL : ((1ULL << (sz * 8)) - 1);
> @@ -86,7 +86,7 @@ target_ulong helper_cpucfg(CPULoongArchState *env, target_ulong rj)
>       return rj >= ARRAY_SIZE(env->cpucfg) ? 0 : env->cpucfg[rj];
>   }
>   
> -uint64_t helper_rdtime_d(CPULoongArchState *env)
> +target_ulong helper_rdtime_d(CPULoongArchState *env)
>   {
>   #ifdef CONFIG_USER_ONLY
>       return cpu_get_host_ticks();
> diff --git a/target/loongarch/tlb_helper.c b/target/loongarch/tlb_helper.c
> index 6e00190547..8c13e80fd3 100644
> --- a/target/loongarch/tlb_helper.c
> +++ b/target/loongarch/tlb_helper.c
> @@ -166,6 +166,17 @@ static int loongarch_map_address(CPULoongArchState *env, hwaddr *physical,
>       return TLBRET_NOMATCH;
>   }
>   
> +static target_ulong dmw_va2pa(target_ulong va, target_ulong dmw)
> +{
> +#ifdef TARGET_LOONGARCH32
> +    uint32_t pseg = FIELD_EX32(dmw, CSR_DMW_32, PSEG);
> +    return (va & MAKE_64BIT_MASK(0, R_CSR_DMW_32_VSEG_SHIFT)) | \
> +        (pseg << R_CSR_DMW_32_VSEG_SHIFT);
> +#else
> +    return va & TARGET_PHYS_MASK;
> +#endif
> +}
> +
>   static int get_physical_address(CPULoongArchState *env, hwaddr *physical,
>                                   int *prot, target_ulong address,
>                                   MMUAccessType access_type, int mmu_idx)
> @@ -185,12 +196,20 @@ static int get_physical_address(CPULoongArchState *env, hwaddr *physical,
>       }
>   
>       plv = kernel_mode | (user_mode << R_CSR_DMW_PLV3_SHIFT);
> -    base_v = address >> R_CSR_DMW_VSEG_SHIFT;
> +#ifdef TARGET_LOONGARCH32
> +    base_v = address >> R_CSR_DMW_32_VSEG_SHIFT;
> +#else
> +    base_v = address >> R_CSR_DMW_64_VSEG_SHIFT;
> +#endif
>       /* Check direct map window */
>       for (int i = 0; i < 4; i++) {
> -        base_c = FIELD_EX64(env->CSR_DMW[i], CSR_DMW, VSEG);
> +#ifdef TARGET_LOONGARCH32
> +        base_c = FIELD_EX32(env->CSR_DMW[i], CSR_DMW_32, VSEG);
> +#else
> +        base_c = FIELD_EX64(env->CSR_DMW[i], CSR_DMW_64, VSEG);
> +#endif
>           if ((plv & env->CSR_DMW[i]) && (base_c == base_v)) {
> -            *physical = dmw_va2pa(address);
> +            *physical = dmw_va2pa(address, env->CSR_DMW[i]);
>               *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
>               return TLBRET_MATCH;
>           }
> diff --git a/target/loongarch/translate.c b/target/loongarch/translate.c
> index 3146a2d4ac..3557963df7 100644
> --- a/target/loongarch/translate.c
> +++ b/target/loongarch/translate.c
> @@ -191,15 +191,15 @@ static void gen_set_gpr(int reg_num, TCGv t, DisasExtend dst_ext)
>       }
>   }
>   
> -static TCGv get_fpr(DisasContext *ctx, int reg_num)
> +static TCGv_i64 get_fpr(DisasContext *ctx, int reg_num)
>   {
> -    TCGv t = tcg_temp_new();
> +    TCGv_i64 t = tcg_temp_new_i64();
>       tcg_gen_ld_i64(t, cpu_env,
>                      offsetof(CPULoongArchState, fpr[reg_num].vreg.D(0)));
>       return  t;
>   }
>   
> -static void set_fpr(int reg_num, TCGv val)
> +static void set_fpr(int reg_num, TCGv_i64 val)
>   {
>       tcg_gen_st_i64(val, cpu_env,
>                      offsetof(CPULoongArchState, fpr[reg_num].vreg.D(0)));
> diff --git a/target/loongarch/translate.h b/target/loongarch/translate.h
> index 7f60090580..4e45e3e434 100644
> --- a/target/loongarch/translate.h
> +++ b/target/loongarch/translate.h
> @@ -14,6 +14,15 @@
>       static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \
>       { return FUNC(ctx, a, __VA_ARGS__); }
>   
> +/* for LoongArch64-only instructions */
> +#ifdef TARGET_LOONGARCH64
> +#define TRANS_64(NAME, FUNC, ...) TRANS(NAME, FUNC, __VA_ARGS__)
> +#else
> +#define TRANS_64(NAME, FUNC, ...) \
> +    static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \
> +    { return false; }
> +#endif
> +
>   /*
>    * If an operation is being performed on less than TARGET_LONG_BITS,
>    * it may require the inputs to be sign- or zero-extended; which will
Song Gao Aug. 7, 2023, 2:51 a.m. UTC | #3
在 2023/8/7 上午10:31, gaosong 写道:
> Cc: Jun Yi <yijun@loongson.cn>
>
CC: shenjinyang@loongson.cn
> 在 2023/8/6 下午10:13, Jiajie Chen 写道:
>> This commit introduces new loongarch32-softmmu target. Compared to
>> loongarch64-softmmu, the new target is different at least in:
>>
>> - GPRs and CSRs are 32-bits wide, but FPRs are still 64-bits wide
>> - LA32 lacks some 64-bit-only instructions
>> - CSR.DMW0-3 introduces PSEG
>>
>> More differences are to be handled in the following commits.
>>
>> Signed-off-by: Jiajie Chen <c@jia.je>
>> ---
>>   .../devices/loongarch32-softmmu/default.mak   |   3 +
>>   configs/targets/loongarch32-softmmu.mak       |   5 +
>>   gdb-xml/loongarch-base32.xml                  |  45 +++++++
>>   qapi/machine-target.json                      |   4 +-
>>   target/loongarch/Kconfig                      |   3 +
>>   target/loongarch/cpu-csr.h                    |   7 +-
>>   target/loongarch/cpu-param.h                  |   6 +
>>   target/loongarch/cpu.c                        |  30 ++---
>>   target/loongarch/cpu.h                        | 112 +++++++++---------
>>   target/loongarch/helper.h                     |  24 ++--
>>   target/loongarch/insn_trans/trans_arith.c.inc |  40 ++++---
>>   .../loongarch/insn_trans/trans_atomic.c.inc   |   6 +-
>>   target/loongarch/insn_trans/trans_bit.c.inc   |  40 ++++---
>>   target/loongarch/insn_trans/trans_extra.c.inc |   2 +-
>>   .../loongarch/insn_trans/trans_farith.c.inc   |  52 ++++----
>>   target/loongarch/insn_trans/trans_fcmp.c.inc  |  16 +--
>>   .../loongarch/insn_trans/trans_fmemory.c.inc  |  34 +++---
>>   target/loongarch/insn_trans/trans_fmov.c.inc  |  88 +++++++++-----
>>   target/loongarch/insn_trans/trans_lsx.c.inc   |  63 +++++-----
>>   target/loongarch/iocsr_helper.c               |   8 +-
>>   target/loongarch/machine.c                    | 106 ++++++++---------
>>   target/loongarch/op_helper.c                  |   6 +-
>>   target/loongarch/tlb_helper.c                 |  25 +++-
>>   target/loongarch/translate.c                  |   6 +-
>>   target/loongarch/translate.h                  |   9 ++
>>   25 files changed, 435 insertions(+), 305 deletions(-)
>>   create mode 100644 configs/devices/loongarch32-softmmu/default.mak
>>   create mode 100644 configs/targets/loongarch32-softmmu.mak
>>   create mode 100644 gdb-xml/loongarch-base32.xml
>>
>> diff --git a/configs/devices/loongarch32-softmmu/default.mak 
>> b/configs/devices/loongarch32-softmmu/default.mak
>> new file mode 100644
>> index 0000000000..a8d3a9d554
>> --- /dev/null
>> +++ b/configs/devices/loongarch32-softmmu/default.mak
>> @@ -0,0 +1,3 @@
>> +# Default configuration for loongarch32-softmmu
>> +
>> +CONFIG_LOONGARCH_VIRT=y
>> diff --git a/configs/targets/loongarch32-softmmu.mak 
>> b/configs/targets/loongarch32-softmmu.mak
>> new file mode 100644
>> index 0000000000..c13b7eb1ae
>> --- /dev/null
>> +++ b/configs/targets/loongarch32-softmmu.mak
>> @@ -0,0 +1,5 @@
>> +TARGET_ARCH=loongarch32
>> +TARGET_BASE_ARCH=loongarch
>> +TARGET_SUPPORTS_MTTCG=y
>> +TARGET_XML_FILES= gdb-xml/loongarch-base32.xml 
>> gdb-xml/loongarch-fpu.xml
>> +TARGET_NEED_FDT=y
>> diff --git a/gdb-xml/loongarch-base32.xml b/gdb-xml/loongarch-base32.xml
>> new file mode 100644
>> index 0000000000..af47bbd3da
>> --- /dev/null
>> +++ b/gdb-xml/loongarch-base32.xml
>> @@ -0,0 +1,45 @@
>> +<?xml version="1.0"?>
>> +<!-- Copyright (C) 2022 Free Software Foundation, Inc.
>> +
>> +     Copying and distribution of this file, with or without 
>> modification,
>> +     are permitted in any medium without royalty provided the copyright
>> +     notice and this notice are preserved.  -->
>> +
>> +<!DOCTYPE feature SYSTEM "gdb-target.dtd">
>> +<feature name="org.gnu.gdb.loongarch.base">
>> +  <reg name="r0" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r1" bitsize="32" type="code_ptr" group="general"/>
>> +  <reg name="r2" bitsize="32" type="data_ptr" group="general"/>
>> +  <reg name="r3" bitsize="32" type="data_ptr" group="general"/>
>> +  <reg name="r4" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r5" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r6" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r7" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r8" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r9" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r10" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r11" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r12" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r13" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r14" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r15" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r16" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r17" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r18" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r19" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r20" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r21" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r22" bitsize="32" type="data_ptr" group="general"/>
>> +  <reg name="r23" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r24" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r25" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r26" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r27" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r28" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r29" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r30" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="r31" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="orig_a0" bitsize="32" type="uint32" group="general"/>
>> +  <reg name="pc" bitsize="32" type="code_ptr" group="general"/>
>> +  <reg name="badv" bitsize="32" type="code_ptr" group="general"/>
>> +</feature>
>> diff --git a/qapi/machine-target.json b/qapi/machine-target.json
>> index f0a6b72414..a728e14c86 100644
>> --- a/qapi/machine-target.json
>> +++ b/qapi/machine-target.json
>> @@ -341,7 +341,7 @@
>>                      'TARGET_I386',
>>                      'TARGET_S390X',
>>                      'TARGET_MIPS',
>> -                   'TARGET_LOONGARCH64',
>> +                   'TARGET_LOONGARCH',
>>                      'TARGET_RISCV' ] } }
>>     ##
>> @@ -359,5 +359,5 @@
>>                      'TARGET_I386',
>>                      'TARGET_S390X',
>>                      'TARGET_MIPS',
>> -                   'TARGET_LOONGARCH64',
>> +                   'TARGET_LOONGARCH',
>>                      'TARGET_RISCV' ] } }
>> diff --git a/target/loongarch/Kconfig b/target/loongarch/Kconfig
>> index 46b26b1a85..a834f20ed8 100644
>> --- a/target/loongarch/Kconfig
>> +++ b/target/loongarch/Kconfig
>> @@ -1,2 +1,5 @@
>>   config LOONGARCH64
>>       bool
>> +
>> +config LOONGARCH32
>> +    bool
>> diff --git a/target/loongarch/cpu-csr.h b/target/loongarch/cpu-csr.h
>> index f8f24032cb..439eb1b578 100644
>> --- a/target/loongarch/cpu-csr.h
>> +++ b/target/loongarch/cpu-csr.h
>> @@ -187,10 +187,9 @@ FIELD(CSR_DMW, PLV1, 1, 1)
>>   FIELD(CSR_DMW, PLV2, 2, 1)
>>   FIELD(CSR_DMW, PLV3, 3, 1)
>>   FIELD(CSR_DMW, MAT, 4, 2)
>> -FIELD(CSR_DMW, VSEG, 60, 4)
>> -
>> -#define dmw_va2pa(va) \
>> -    (va & MAKE_64BIT_MASK(0, TARGET_VIRT_ADDR_SPACE_BITS))
>> +FIELD(CSR_DMW_32, PSEG, 25, 3)
>> +FIELD(CSR_DMW_32, VSEG, 29, 3)
>> +FIELD(CSR_DMW_64, VSEG, 60, 4)
>>     /* Debug CSRs */
>>   #define LOONGARCH_CSR_DBG            0x500 /* debug config */
>> diff --git a/target/loongarch/cpu-param.h b/target/loongarch/cpu-param.h
>> index 1265dc7cb5..53030ea00e 100644
>> --- a/target/loongarch/cpu-param.h
>> +++ b/target/loongarch/cpu-param.h
>> @@ -8,9 +8,15 @@
>>   #ifndef LOONGARCH_CPU_PARAM_H
>>   #define LOONGARCH_CPU_PARAM_H
>>   +#ifdef TARGET_LOONGARCH32
>> +#define TARGET_LONG_BITS 32
>> +#define TARGET_PHYS_ADDR_SPACE_BITS 36
>> +#define TARGET_VIRT_ADDR_SPACE_BITS 32
>> +#else
>>   #define TARGET_LONG_BITS 64
>>   #define TARGET_PHYS_ADDR_SPACE_BITS 48
>>   #define TARGET_VIRT_ADDR_SPACE_BITS 48
>> +#endif
>>     #define TARGET_PAGE_BITS 14
>>   diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
>> index ad93ecac92..b513531ac8 100644
>> --- a/target/loongarch/cpu.c
>> +++ b/target/loongarch/cpu.c
>> @@ -626,7 +626,7 @@ void loongarch_cpu_dump_state(CPUState *cs, FILE 
>> *f, int flags)
>>       CPULoongArchState *env = &cpu->env;
>>       int i;
>>   -    qemu_fprintf(f, " PC=%016" PRIx64 " ", env->pc);
>> +    qemu_fprintf(f, " PC=" TARGET_FMT_lx " ", env->pc);
>>       qemu_fprintf(f, " FCSR0 0x%08x  fp_status 0x%02x\n", env->fcsr0,
>> get_float_exception_flags(&env->fp_status));
>>   @@ -635,26 +635,26 @@ void loongarch_cpu_dump_state(CPUState *cs, 
>> FILE *f, int flags)
>>           if ((i & 3) == 0) {
>>               qemu_fprintf(f, " GPR%02d:", i);
>>           }
>> -        qemu_fprintf(f, " %s %016" PRIx64, regnames[i], env->gpr[i]);
>> +        qemu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], 
>> env->gpr[i]);
>>           if ((i & 3) == 3) {
>>               qemu_fprintf(f, "\n");
>>           }
>>       }
>>   -    qemu_fprintf(f, "CRMD=%016" PRIx64 "\n", env->CSR_CRMD);
>> -    qemu_fprintf(f, "PRMD=%016" PRIx64 "\n", env->CSR_PRMD);
>> -    qemu_fprintf(f, "EUEN=%016" PRIx64 "\n", env->CSR_EUEN);
>> -    qemu_fprintf(f, "ESTAT=%016" PRIx64 "\n", env->CSR_ESTAT);
>> -    qemu_fprintf(f, "ERA=%016" PRIx64 "\n", env->CSR_ERA);
>> -    qemu_fprintf(f, "BADV=%016" PRIx64 "\n", env->CSR_BADV);
>> -    qemu_fprintf(f, "BADI=%016" PRIx64 "\n", env->CSR_BADI);
>> -    qemu_fprintf(f, "EENTRY=%016" PRIx64 "\n", env->CSR_EENTRY);
>> -    qemu_fprintf(f, "PRCFG1=%016" PRIx64 ", PRCFG2=%016" PRIx64 ","
>> -                 " PRCFG3=%016" PRIx64 "\n",
>> +    qemu_fprintf(f, "CRMD=" TARGET_FMT_lx "\n", env->CSR_CRMD);
>> +    qemu_fprintf(f, "PRMD=" TARGET_FMT_lx "\n", env->CSR_PRMD);
>> +    qemu_fprintf(f, "EUEN=" TARGET_FMT_lx "\n", env->CSR_EUEN);
>> +    qemu_fprintf(f, "ESTAT=" TARGET_FMT_lx "\n", env->CSR_ESTAT);
>> +    qemu_fprintf(f, "ERA=" TARGET_FMT_lx "\n", env->CSR_ERA);
>> +    qemu_fprintf(f, "BADV=" TARGET_FMT_lx "\n", env->CSR_BADV);
>> +    qemu_fprintf(f, "BADI=" TARGET_FMT_lx "\n", env->CSR_BADI);
>> +    qemu_fprintf(f, "EENTRY=" TARGET_FMT_lx "\n", env->CSR_EENTRY);
>> +    qemu_fprintf(f, "PRCFG1=" TARGET_FMT_lx ", PRCFG2=" 
>> TARGET_FMT_lx ","
>> +                 " PRCFG3=" TARGET_FMT_lx "\n",
>>                    env->CSR_PRCFG1, env->CSR_PRCFG3, env->CSR_PRCFG3);
>> -    qemu_fprintf(f, "TLBRENTRY=%016" PRIx64 "\n", env->CSR_TLBRENTRY);
>> -    qemu_fprintf(f, "TLBRBADV=%016" PRIx64 "\n", env->CSR_TLBRBADV);
>> -    qemu_fprintf(f, "TLBRERA=%016" PRIx64 "\n", env->CSR_TLBRERA);
>> +    qemu_fprintf(f, "TLBRENTRY=" TARGET_FMT_lx "\n", 
>> env->CSR_TLBRENTRY);
>> +    qemu_fprintf(f, "TLBRBADV=" TARGET_FMT_lx "\n", env->CSR_TLBRBADV);
>> +    qemu_fprintf(f, "TLBRERA=" TARGET_FMT_lx "\n", env->CSR_TLBRERA);
>>         /* fpr */
>>       if (flags & CPU_DUMP_FPU) {
>> diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
>> index fa371ca8ba..37712cc590 100644
>> --- a/target/loongarch/cpu.h
>> +++ b/target/loongarch/cpu.h
>> @@ -273,8 +273,8 @@ struct LoongArchTLB {
>>   typedef struct LoongArchTLB LoongArchTLB;
>>     typedef struct CPUArchState {
>> -    uint64_t gpr[32];
>> -    uint64_t pc;
>> +    target_ulong gpr[32];
>> +    target_ulong pc;
>>         fpr_t fpr[32];
>>       float_status fp_status;
>> @@ -289,60 +289,60 @@ typedef struct CPUArchState {
>>       uint64_t llval;
>>         /* LoongArch CSRs */
>> -    uint64_t CSR_CRMD;
>> -    uint64_t CSR_PRMD;
>> -    uint64_t CSR_EUEN;
>> -    uint64_t CSR_MISC;
>> -    uint64_t CSR_ECFG;
>> -    uint64_t CSR_ESTAT;
>> -    uint64_t CSR_ERA;
>> -    uint64_t CSR_BADV;
>> -    uint64_t CSR_BADI;
>> -    uint64_t CSR_EENTRY;
>> -    uint64_t CSR_TLBIDX;
>> -    uint64_t CSR_TLBEHI;
>> -    uint64_t CSR_TLBELO0;
>> -    uint64_t CSR_TLBELO1;
>> -    uint64_t CSR_ASID;
>> -    uint64_t CSR_PGDL;
>> -    uint64_t CSR_PGDH;
>> -    uint64_t CSR_PGD;
>> -    uint64_t CSR_PWCL;
>> -    uint64_t CSR_PWCH;
>> -    uint64_t CSR_STLBPS;
>> -    uint64_t CSR_RVACFG;
>> -    uint64_t CSR_PRCFG1;
>> -    uint64_t CSR_PRCFG2;
>> -    uint64_t CSR_PRCFG3;
>> -    uint64_t CSR_SAVE[16];
>> -    uint64_t CSR_TID;
>> -    uint64_t CSR_TCFG;
>> -    uint64_t CSR_TVAL;
>> -    uint64_t CSR_CNTC;
>> -    uint64_t CSR_TICLR;
>> -    uint64_t CSR_LLBCTL;
>> -    uint64_t CSR_IMPCTL1;
>> -    uint64_t CSR_IMPCTL2;
>> -    uint64_t CSR_TLBRENTRY;
>> -    uint64_t CSR_TLBRBADV;
>> -    uint64_t CSR_TLBRERA;
>> -    uint64_t CSR_TLBRSAVE;
>> -    uint64_t CSR_TLBRELO0;
>> -    uint64_t CSR_TLBRELO1;
>> -    uint64_t CSR_TLBREHI;
>> -    uint64_t CSR_TLBRPRMD;
>> -    uint64_t CSR_MERRCTL;
>> -    uint64_t CSR_MERRINFO1;
>> -    uint64_t CSR_MERRINFO2;
>> -    uint64_t CSR_MERRENTRY;
>> -    uint64_t CSR_MERRERA;
>> -    uint64_t CSR_MERRSAVE;
>> -    uint64_t CSR_CTAG;
>> -    uint64_t CSR_DMW[4];
>> -    uint64_t CSR_DBG;
>> -    uint64_t CSR_DERA;
>> -    uint64_t CSR_DSAVE;
>> -    uint64_t CSR_CPUID;
>> +    target_ulong CSR_CRMD;
>> +    target_ulong CSR_PRMD;
>> +    target_ulong CSR_EUEN;
>> +    target_ulong CSR_MISC;
>> +    target_ulong CSR_ECFG;
>> +    target_ulong CSR_ESTAT;
>> +    target_ulong CSR_ERA;
>> +    target_ulong CSR_BADV;
>> +    target_ulong CSR_BADI;
>> +    target_ulong CSR_EENTRY;
>> +    target_ulong CSR_TLBIDX;
>> +    target_ulong CSR_TLBEHI;
>> +    target_ulong CSR_TLBELO0;
>> +    target_ulong CSR_TLBELO1;
>> +    target_ulong CSR_ASID;
>> +    target_ulong CSR_PGDL;
>> +    target_ulong CSR_PGDH;
>> +    target_ulong CSR_PGD;
>> +    target_ulong CSR_PWCL;
>> +    target_ulong CSR_PWCH;
>> +    target_ulong CSR_STLBPS;
>> +    target_ulong CSR_RVACFG;
>> +    target_ulong CSR_PRCFG1;
>> +    target_ulong CSR_PRCFG2;
>> +    target_ulong CSR_PRCFG3;
>> +    target_ulong CSR_SAVE[16];
>> +    target_ulong CSR_TID;
>> +    target_ulong CSR_TCFG;
>> +    target_ulong CSR_TVAL;
>> +    target_ulong CSR_CNTC;
>> +    target_ulong CSR_TICLR;
>> +    target_ulong CSR_LLBCTL;
>> +    target_ulong CSR_IMPCTL1;
>> +    target_ulong CSR_IMPCTL2;
>> +    target_ulong CSR_TLBRENTRY;
>> +    target_ulong CSR_TLBRBADV;
>> +    target_ulong CSR_TLBRERA;
>> +    target_ulong CSR_TLBRSAVE;
>> +    target_ulong CSR_TLBRELO0;
>> +    target_ulong CSR_TLBRELO1;
>> +    target_ulong CSR_TLBREHI;
>> +    target_ulong CSR_TLBRPRMD;
>> +    target_ulong CSR_MERRCTL;
>> +    target_ulong CSR_MERRINFO1;
>> +    target_ulong CSR_MERRINFO2;
>> +    target_ulong CSR_MERRENTRY;
>> +    target_ulong CSR_MERRERA;
>> +    target_ulong CSR_MERRSAVE;
>> +    target_ulong CSR_CTAG;
>> +    target_ulong CSR_DMW[4];
>> +    target_ulong CSR_DBG;
>> +    target_ulong CSR_DERA;
>> +    target_ulong CSR_DSAVE;
>> +    target_ulong CSR_CPUID;
>>     #ifndef CONFIG_USER_ONLY
>>       LoongArchTLB  tlb[LOONGARCH_TLB_MAX];
>> diff --git a/target/loongarch/helper.h b/target/loongarch/helper.h
>> index ffb1e0b0bf..1c41816b9a 100644
>> --- a/target/loongarch/helper.h
>> +++ b/target/loongarch/helper.h
>> @@ -93,21 +93,21 @@ DEF_HELPER_2(frint_d, i64, env, i64)
>>     DEF_HELPER_FLAGS_1(set_rounding_mode, TCG_CALL_NO_RWG, void, env)
>>   -DEF_HELPER_1(rdtime_d, i64, env)
>> +DEF_HELPER_1(rdtime_d, tl, env)
>>     #ifndef CONFIG_USER_ONLY
>>   /* CSRs helper */
>> -DEF_HELPER_1(csrrd_pgd, i64, env)
>> -DEF_HELPER_1(csrrd_cpuid, i64, env)
>> -DEF_HELPER_1(csrrd_tval, i64, env)
>> -DEF_HELPER_2(csrwr_estat, i64, env, tl)
>> -DEF_HELPER_2(csrwr_asid, i64, env, tl)
>> -DEF_HELPER_2(csrwr_tcfg, i64, env, tl)
>> -DEF_HELPER_2(csrwr_ticlr, i64, env, tl)
>> -DEF_HELPER_2(iocsrrd_b, i64, env, tl)
>> -DEF_HELPER_2(iocsrrd_h, i64, env, tl)
>> -DEF_HELPER_2(iocsrrd_w, i64, env, tl)
>> -DEF_HELPER_2(iocsrrd_d, i64, env, tl)
>> +DEF_HELPER_1(csrrd_pgd, tl, env)
>> +DEF_HELPER_1(csrrd_cpuid, tl, env)
>> +DEF_HELPER_1(csrrd_tval, tl, env)
>> +DEF_HELPER_2(csrwr_estat, tl, env, tl)
>> +DEF_HELPER_2(csrwr_asid, tl, env, tl)
>> +DEF_HELPER_2(csrwr_tcfg, tl, env, tl)
>> +DEF_HELPER_2(csrwr_ticlr, tl, env, tl)
>> +DEF_HELPER_2(iocsrrd_b, tl, env, tl)
>> +DEF_HELPER_2(iocsrrd_h, tl, env, tl)
>> +DEF_HELPER_2(iocsrrd_w, tl, env, tl)
>> +DEF_HELPER_2(iocsrrd_d, tl, env, tl)
>>   DEF_HELPER_3(iocsrwr_b, void, env, tl, tl)
>>   DEF_HELPER_3(iocsrwr_h, void, env, tl, tl)
>>   DEF_HELPER_3(iocsrwr_w, void, env, tl, tl)
>> diff --git a/target/loongarch/insn_trans/trans_arith.c.inc 
>> b/target/loongarch/insn_trans/trans_arith.c.inc
>> index 43d6cf261d..b6fb286446 100644
>> --- a/target/loongarch/insn_trans/trans_arith.c.inc
>> +++ b/target/loongarch/insn_trans/trans_arith.c.inc
>> @@ -92,10 +92,11 @@ static void gen_sltu(TCGv dest, TCGv src1, TCGv 
>> src2)
>>     static void gen_mulh_w(TCGv dest, TCGv src1, TCGv src2)
>>   {
>> -    tcg_gen_mul_i64(dest, src1, src2);
>> -    tcg_gen_sari_i64(dest, dest, 32);
>> +    tcg_gen_mul_tl(dest, src1, src2);
>> +    tcg_gen_sari_tl(dest, dest, 32);
>>   }
>>   +#ifdef TARGET_LOONGARCH64
>>   static void gen_mulh_d(TCGv dest, TCGv src1, TCGv src2)
>>   {
>>       TCGv discard = tcg_temp_new();
>> @@ -128,6 +129,7 @@ static void prep_divisor_d(TCGv ret, TCGv src1, 
>> TCGv src2)
>>       tcg_gen_or_tl(ret, ret, t1);
>>       tcg_gen_movcond_tl(TCG_COND_NE, ret, ret, zero, ret, src2);
>>   }
>> +#endif
>>     static void prep_divisor_du(TCGv ret, TCGv src2)
>>   {
>> @@ -142,6 +144,7 @@ static void prep_divisor_du(TCGv ret, TCGv src2)
>>       tcg_gen_movcond_tl(TCG_COND_EQ, ret, src2, zero, one, src2);
>>   }
>>   +#ifdef TARGET_LOONGARCH64
>>   static void gen_div_d(TCGv dest, TCGv src1, TCGv src2)
>>   {
>>       TCGv t0 = tcg_temp_new();
>> @@ -155,6 +158,7 @@ static void gen_rem_d(TCGv dest, TCGv src1, TCGv 
>> src2)
>>       prep_divisor_d(t0, src1, src2);
>>       tcg_gen_rem_tl(dest, src1, t0);
>>   }
>> +#endif
>>     static void gen_div_du(TCGv dest, TCGv src1, TCGv src2)
>>   {
>> @@ -232,10 +236,12 @@ static target_ulong gen_pcaddu12i(target_ulong 
>> pc, int imm)
>>       return pc + (imm << 12);
>>   }
>>   +#ifdef TARGET_LOONGARCH64
>>   static target_ulong gen_pcaddu18i(target_ulong pc, int imm)
>>   {
>>       return pc + ((target_ulong)(imm) << 18);
>>   }
>> +#endif
>>     static bool trans_addu16i_d(DisasContext *ctx, arg_addu16i_d *a)
>>   {
>> @@ -249,9 +255,9 @@ static bool trans_addu16i_d(DisasContext *ctx, 
>> arg_addu16i_d *a)
>>   }
>>     TRANS(add_w, gen_rrr, EXT_NONE, EXT_NONE, EXT_SIGN, tcg_gen_add_tl)
>> -TRANS(add_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_add_tl)
>> +TRANS_64(add_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_add_tl)
>>   TRANS(sub_w, gen_rrr, EXT_NONE, EXT_NONE, EXT_SIGN, tcg_gen_sub_tl)
>> -TRANS(sub_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_sub_tl)
>> +TRANS_64(sub_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_sub_tl)
>>   TRANS(and, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_and_tl)
>>   TRANS(or, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_or_tl)
>>   TRANS(xor, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_xor_tl)
>> @@ -261,32 +267,32 @@ TRANS(orn, gen_rrr, EXT_NONE, EXT_NONE, 
>> EXT_NONE, tcg_gen_orc_tl)
>>   TRANS(slt, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_slt)
>>   TRANS(sltu, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sltu)
>>   TRANS(mul_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, tcg_gen_mul_tl)
>> -TRANS(mul_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_mul_tl)
>> +TRANS_64(mul_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_mul_tl)
>>   TRANS(mulh_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, gen_mulh_w)
>>   TRANS(mulh_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, gen_mulh_w)
>> -TRANS(mulh_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_d)
>> -TRANS(mulh_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_du)
>> -TRANS(mulw_d_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, tcg_gen_mul_tl)
>> -TRANS(mulw_d_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, tcg_gen_mul_tl)
>> +TRANS_64(mulh_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_d)
>> +TRANS_64(mulh_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_du)
>> +TRANS_64(mulw_d_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, 
>> tcg_gen_mul_tl)
>> +TRANS_64(mulw_d_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, 
>> tcg_gen_mul_tl)
>>   TRANS(div_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, gen_div_w)
>>   TRANS(mod_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, gen_rem_w)
>>   TRANS(div_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_SIGN, gen_div_du)
>>   TRANS(mod_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_SIGN, gen_rem_du)
>> -TRANS(div_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_d)
>> -TRANS(mod_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_d)
>> -TRANS(div_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_du)
>> -TRANS(mod_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_du)
>> +TRANS_64(div_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_d)
>> +TRANS_64(mod_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_d)
>> +TRANS_64(div_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_du)
>> +TRANS_64(mod_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_du)
>>   TRANS(slti, gen_rri_v, EXT_NONE, EXT_NONE, gen_slt)
>>   TRANS(sltui, gen_rri_v, EXT_NONE, EXT_NONE, gen_sltu)
>>   TRANS(addi_w, gen_rri_c, EXT_NONE, EXT_SIGN, tcg_gen_addi_tl)
>> -TRANS(addi_d, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_addi_tl)
>> +TRANS_64(addi_d, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_addi_tl)
>>   TRANS(alsl_w, gen_rrr_sa, EXT_NONE, EXT_SIGN, gen_alsl)
>> -TRANS(alsl_wu, gen_rrr_sa, EXT_NONE, EXT_ZERO, gen_alsl)
>> -TRANS(alsl_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_alsl)
>> +TRANS_64(alsl_wu, gen_rrr_sa, EXT_NONE, EXT_ZERO, gen_alsl)
>> +TRANS_64(alsl_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_alsl)
>>   TRANS(pcaddi, gen_pc, gen_pcaddi)
>>   TRANS(pcalau12i, gen_pc, gen_pcalau12i)
>>   TRANS(pcaddu12i, gen_pc, gen_pcaddu12i)
>> -TRANS(pcaddu18i, gen_pc, gen_pcaddu18i)
>> +TRANS_64(pcaddu18i, gen_pc, gen_pcaddu18i)
>>   TRANS(andi, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_andi_tl)
>>   TRANS(ori, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_ori_tl)
>>   TRANS(xori, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_xori_tl)
>> diff --git a/target/loongarch/insn_trans/trans_atomic.c.inc 
>> b/target/loongarch/insn_trans/trans_atomic.c.inc
>> index 612709f2a7..d3d8babd5e 100644
>> --- a/target/loongarch/insn_trans/trans_atomic.c.inc
>> +++ b/target/loongarch/insn_trans/trans_atomic.c.inc
>> @@ -10,7 +10,7 @@ static bool gen_ll(DisasContext *ctx, arg_rr_i *a, 
>> MemOp mop)
>>       TCGv t0 = tcg_temp_new();
>>         tcg_gen_addi_tl(t0, src1, a->imm);
>> -    tcg_gen_qemu_ld_i64(dest, t0, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_ld_tl(dest, t0, ctx->mem_idx, mop);
>>       tcg_gen_st_tl(t0, cpu_env, offsetof(CPULoongArchState, lladdr));
>>       tcg_gen_st_tl(dest, cpu_env, offsetof(CPULoongArchState, llval));
>>       gen_set_gpr(a->rd, dest, EXT_NONE);
>> @@ -70,8 +70,8 @@ static bool gen_am(DisasContext *ctx, arg_rrr *a,
>>     TRANS(ll_w, gen_ll, MO_TESL)
>>   TRANS(sc_w, gen_sc, MO_TESL)
>> -TRANS(ll_d, gen_ll, MO_TEUQ)
>> -TRANS(sc_d, gen_sc, MO_TEUQ)
>> +TRANS_64(ll_d, gen_ll, MO_TEUQ)
>> +TRANS_64(sc_d, gen_sc, MO_TEUQ)
>>   TRANS(amswap_w, gen_am, tcg_gen_atomic_xchg_tl, MO_TESL)
>>   TRANS(amswap_d, gen_am, tcg_gen_atomic_xchg_tl, MO_TEUQ)
>>   TRANS(amadd_w, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TESL)
>> diff --git a/target/loongarch/insn_trans/trans_bit.c.inc 
>> b/target/loongarch/insn_trans/trans_bit.c.inc
>> index 25b4d7858b..80877a1b15 100644
>> --- a/target/loongarch/insn_trans/trans_bit.c.inc
>> +++ b/target/loongarch/insn_trans/trans_bit.c.inc
>> @@ -18,14 +18,20 @@ static bool gen_rr(DisasContext *ctx, arg_rr *a,
>>     static void gen_bytepick_w(TCGv dest, TCGv src1, TCGv src2, 
>> target_long sa)
>>   {
>> +#ifdef TARGET_LOONGARCH32
>> +    tcg_gen_extract2_tl(dest, src1, src2, (32 - sa * 8));
>> +#else
>>       tcg_gen_concat_tl_i64(dest, src1, src2);
>>       tcg_gen_sextract_i64(dest, dest, (32 - sa * 8), 32);
>> +#endif
>>   }
>>   +#ifdef TARGET_LOONGARCH64
>>   static void gen_bytepick_d(TCGv dest, TCGv src1, TCGv src2, 
>> target_long sa)
>>   {
>>       tcg_gen_extract2_i64(dest, src1, src2, (64 - sa * 8));
>>   }
>> +#endif
>>     static bool gen_bstrins(DisasContext *ctx, arg_rr_ms_ls *a,
>>                           DisasExtend dst_ext)
>> @@ -83,9 +89,10 @@ static void gen_cto_w(TCGv dest, TCGv src1)
>>       gen_ctz_w(dest, dest);
>>   }
>>   +#ifdef TARGET_LOONGARCH64
>>   static void gen_clz_d(TCGv dest, TCGv src1)
>>   {
>> -    tcg_gen_clzi_i64(dest, src1, TARGET_LONG_BITS);
>> +    tcg_gen_clzi_tl(dest, src1, TARGET_LONG_BITS);
>>   }
>>     static void gen_clo_d(TCGv dest, TCGv src1)
>> @@ -110,6 +117,7 @@ static void gen_revb_2w(TCGv dest, TCGv src1)
>>       tcg_gen_bswap64_i64(dest, src1);
>>       tcg_gen_rotri_i64(dest, dest, 32);
>>   }
>> +#endif
>>     static void gen_revb_2h(TCGv dest, TCGv src1)
>>   {
>> @@ -124,6 +132,7 @@ static void gen_revb_2h(TCGv dest, TCGv src1)
>>       tcg_gen_or_tl(dest, t0, t1);
>>   }
>>   +#ifdef TARGET_LOONGARCH64
>>   static void gen_revb_4h(TCGv dest, TCGv src1)
>>   {
>>       TCGv mask = tcg_constant_tl(0x00FF00FF00FF00FFULL);
>> @@ -163,6 +172,7 @@ static void gen_revh_d(TCGv dest, TCGv src1)
>>       tcg_gen_or_tl(t0, t0, t1);
>>       tcg_gen_rotri_tl(dest, t0, 32);
>>   }
>> +#endif
>>     static void gen_maskeqz(TCGv dest, TCGv src1, TCGv src2)
>>   {
>> @@ -184,25 +194,25 @@ TRANS(clo_w, gen_rr, EXT_NONE, EXT_NONE, 
>> gen_clo_w)
>>   TRANS(clz_w, gen_rr, EXT_ZERO, EXT_NONE, gen_clz_w)
>>   TRANS(cto_w, gen_rr, EXT_NONE, EXT_NONE, gen_cto_w)
>>   TRANS(ctz_w, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_w)
>> -TRANS(clo_d, gen_rr, EXT_NONE, EXT_NONE, gen_clo_d)
>> -TRANS(clz_d, gen_rr, EXT_NONE, EXT_NONE, gen_clz_d)
>> -TRANS(cto_d, gen_rr, EXT_NONE, EXT_NONE, gen_cto_d)
>> -TRANS(ctz_d, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_d)
>> +TRANS_64(clo_d, gen_rr, EXT_NONE, EXT_NONE, gen_clo_d)
>> +TRANS_64(clz_d, gen_rr, EXT_NONE, EXT_NONE, gen_clz_d)
>> +TRANS_64(cto_d, gen_rr, EXT_NONE, EXT_NONE, gen_cto_d)
>> +TRANS_64(ctz_d, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_d)
>>   TRANS(revb_2h, gen_rr, EXT_NONE, EXT_SIGN, gen_revb_2h)
>> -TRANS(revb_4h, gen_rr, EXT_NONE, EXT_NONE, gen_revb_4h)
>> -TRANS(revb_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revb_2w)
>> -TRANS(revb_d, gen_rr, EXT_NONE, EXT_NONE, tcg_gen_bswap64_i64)
>> -TRANS(revh_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revh_2w)
>> -TRANS(revh_d, gen_rr, EXT_NONE, EXT_NONE, gen_revh_d)
>> +TRANS_64(revb_4h, gen_rr, EXT_NONE, EXT_NONE, gen_revb_4h)
>> +TRANS_64(revb_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revb_2w)
>> +TRANS_64(revb_d, gen_rr, EXT_NONE, EXT_NONE, tcg_gen_bswap64_i64)
>> +TRANS_64(revh_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revh_2w)
>> +TRANS_64(revh_d, gen_rr, EXT_NONE, EXT_NONE, gen_revh_d)
>>   TRANS(bitrev_4b, gen_rr, EXT_ZERO, EXT_SIGN, gen_helper_bitswap)
>> -TRANS(bitrev_8b, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitswap)
>> +TRANS_64(bitrev_8b, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitswap)
>>   TRANS(bitrev_w, gen_rr, EXT_NONE, EXT_SIGN, gen_helper_bitrev_w)
>> -TRANS(bitrev_d, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitrev_d)
>> +TRANS_64(bitrev_d, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitrev_d)
>>   TRANS(maskeqz, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_maskeqz)
>>   TRANS(masknez, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_masknez)
>>   TRANS(bytepick_w, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_w)
>> -TRANS(bytepick_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_d)
>> +TRANS_64(bytepick_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_d)
>>   TRANS(bstrins_w, gen_bstrins, EXT_SIGN)
>> -TRANS(bstrins_d, gen_bstrins, EXT_NONE)
>> +TRANS_64(bstrins_d, gen_bstrins, EXT_NONE)
>>   TRANS(bstrpick_w, gen_bstrpick, EXT_SIGN)
>> -TRANS(bstrpick_d, gen_bstrpick, EXT_NONE)
>> +TRANS_64(bstrpick_d, gen_bstrpick, EXT_NONE)
>> diff --git a/target/loongarch/insn_trans/trans_extra.c.inc 
>> b/target/loongarch/insn_trans/trans_extra.c.inc
>> index 06f4de4515..2beb858582 100644
>> --- a/target/loongarch/insn_trans/trans_extra.c.inc
>> +++ b/target/loongarch/insn_trans/trans_extra.c.inc
>> @@ -44,7 +44,7 @@ static bool gen_rdtime(DisasContext *ctx, arg_rr *a,
>>       if (word) {
>>           tcg_gen_sextract_tl(dst1, dst1, high ? 32 : 0, 32);
>>       }
>> -    tcg_gen_ld_i64(dst2, cpu_env, offsetof(CPULoongArchState, 
>> CSR_TID));
>> +    tcg_gen_ld_tl(dst2, cpu_env, offsetof(CPULoongArchState, CSR_TID));
>>         return true;
>>   }
>> diff --git a/target/loongarch/insn_trans/trans_farith.c.inc 
>> b/target/loongarch/insn_trans/trans_farith.c.inc
>> index 21ea47308b..fa146706bc 100644
>> --- a/target/loongarch/insn_trans/trans_farith.c.inc
>> +++ b/target/loongarch/insn_trans/trans_farith.c.inc
>> @@ -15,11 +15,11 @@
>>   #endif
>>     static bool gen_fff(DisasContext *ctx, arg_fff *a,
>> -                    void (*func)(TCGv, TCGv_env, TCGv, TCGv))
>> +                    void (*func)(TCGv_i64, TCGv_env, TCGv_i64, 
>> TCGv_i64))
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src1 = get_fpr(ctx, a->fj);
>> -    TCGv src2 = get_fpr(ctx, a->fk);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src1 = get_fpr(ctx, a->fj);
>> +    TCGv_i64 src2 = get_fpr(ctx, a->fk);
>>         CHECK_FPE;
>>   @@ -30,10 +30,10 @@ static bool gen_fff(DisasContext *ctx, arg_fff *a,
>>   }
>>     static bool gen_ff(DisasContext *ctx, arg_ff *a,
>> -                   void (*func)(TCGv, TCGv_env, TCGv))
>> +                   void (*func)(TCGv_i64, TCGv_env, TCGv_i64))
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src = get_fpr(ctx, a->fj);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   @@ -44,14 +44,14 @@ static bool gen_ff(DisasContext *ctx, arg_ff *a,
>>   }
>>     static bool gen_muladd(DisasContext *ctx, arg_ffff *a,
>> -                       void (*func)(TCGv, TCGv_env, TCGv, TCGv, 
>> TCGv, TCGv_i32),
>> +                       void (*func)(TCGv_i64, TCGv_env, TCGv_i64, 
>> TCGv_i64, TCGv_i64, TCGv_i32),
>>                          int flag)
>>   {
>>       TCGv_i32 tflag = tcg_constant_i32(flag);
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src1 = get_fpr(ctx, a->fj);
>> -    TCGv src2 = get_fpr(ctx, a->fk);
>> -    TCGv src3 = get_fpr(ctx, a->fa);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src1 = get_fpr(ctx, a->fj);
>> +    TCGv_i64 src2 = get_fpr(ctx, a->fk);
>> +    TCGv_i64 src3 = get_fpr(ctx, a->fa);
>>         CHECK_FPE;
>>   @@ -63,9 +63,9 @@ static bool gen_muladd(DisasContext *ctx, 
>> arg_ffff *a,
>>     static bool trans_fcopysign_s(DisasContext *ctx, arg_fcopysign_s *a)
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src1 = get_fpr(ctx, a->fk);
>> -    TCGv src2 = get_fpr(ctx, a->fj);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src1 = get_fpr(ctx, a->fk);
>> +    TCGv_i64 src2 = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   @@ -77,9 +77,9 @@ static bool trans_fcopysign_s(DisasContext *ctx, 
>> arg_fcopysign_s *a)
>>     static bool trans_fcopysign_d(DisasContext *ctx, arg_fcopysign_d *a)
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src1 = get_fpr(ctx, a->fk);
>> -    TCGv src2 = get_fpr(ctx, a->fj);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src1 = get_fpr(ctx, a->fk);
>> +    TCGv_i64 src2 = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   @@ -91,8 +91,8 @@ static bool trans_fcopysign_d(DisasContext *ctx, 
>> arg_fcopysign_d *a)
>>     static bool trans_fabs_s(DisasContext *ctx, arg_fabs_s *a)
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src = get_fpr(ctx, a->fj);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   @@ -105,8 +105,8 @@ static bool trans_fabs_s(DisasContext *ctx, 
>> arg_fabs_s *a)
>>     static bool trans_fabs_d(DisasContext *ctx, arg_fabs_d *a)
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src = get_fpr(ctx, a->fj);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   @@ -118,8 +118,8 @@ static bool trans_fabs_d(DisasContext *ctx, 
>> arg_fabs_d *a)
>>     static bool trans_fneg_s(DisasContext *ctx, arg_fneg_s *a)
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src = get_fpr(ctx, a->fj);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   @@ -132,8 +132,8 @@ static bool trans_fneg_s(DisasContext *ctx, 
>> arg_fneg_s *a)
>>     static bool trans_fneg_d(DisasContext *ctx, arg_fneg_d *a)
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src = get_fpr(ctx, a->fj);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   diff --git a/target/loongarch/insn_trans/trans_fcmp.c.inc 
>> b/target/loongarch/insn_trans/trans_fcmp.c.inc
>> index a78868dbc4..ebef54f495 100644
>> --- a/target/loongarch/insn_trans/trans_fcmp.c.inc
>> +++ b/target/loongarch/insn_trans/trans_fcmp.c.inc
>> @@ -25,13 +25,13 @@ static uint32_t get_fcmp_flags(int cond)
>>     static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a)
>>   {
>> -    TCGv var, src1, src2;
>> +    TCGv_i64 var, src1, src2;
>>       uint32_t flags;
>> -    void (*fn)(TCGv, TCGv_env, TCGv, TCGv, TCGv_i32);
>> +    void (*fn)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64, TCGv_i32);
>>         CHECK_FPE;
>>   -    var = tcg_temp_new();
>> +    var = tcg_temp_new_i64();
>>       src1 = get_fpr(ctx, a->fj);
>>       src2 = get_fpr(ctx, a->fk);
>>       fn = (a->fcond & 1 ? gen_helper_fcmp_s_s : gen_helper_fcmp_c_s);
>> @@ -39,19 +39,19 @@ static bool trans_fcmp_cond_s(DisasContext *ctx, 
>> arg_fcmp_cond_s *a)
>>         fn(var, cpu_env, src1, src2, tcg_constant_i32(flags));
>>   -    tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, 
>> cf[a->cd]));
>> +    tcg_gen_st8_i64(var, cpu_env, offsetof(CPULoongArchState, 
>> cf[a->cd]));
>>       return true;
>>   }
>>     static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a)
>>   {
>> -    TCGv var, src1, src2;
>> +    TCGv_i64 var, src1, src2;
>>       uint32_t flags;
>> -    void (*fn)(TCGv, TCGv_env, TCGv, TCGv, TCGv_i32);
>> +    void (*fn)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64, TCGv_i32);
>>         CHECK_FPE;
>>   -    var = tcg_temp_new();
>> +    var = tcg_temp_new_i64();
>>       src1 = get_fpr(ctx, a->fj);
>>       src2 = get_fpr(ctx, a->fk);
>>       fn = (a->fcond & 1 ? gen_helper_fcmp_s_d : gen_helper_fcmp_c_d);
>> @@ -59,6 +59,6 @@ static bool trans_fcmp_cond_d(DisasContext *ctx, 
>> arg_fcmp_cond_d *a)
>>         fn(var, cpu_env, src1, src2, tcg_constant_i32(flags));
>>   -    tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, 
>> cf[a->cd]));
>> +    tcg_gen_st8_i64(var, cpu_env, offsetof(CPULoongArchState, 
>> cf[a->cd]));
>>       return true;
>>   }
>> diff --git a/target/loongarch/insn_trans/trans_fmemory.c.inc 
>> b/target/loongarch/insn_trans/trans_fmemory.c.inc
>> index 91c09fb6d9..6e46782666 100644
>> --- a/target/loongarch/insn_trans/trans_fmemory.c.inc
>> +++ b/target/loongarch/insn_trans/trans_fmemory.c.inc
>> @@ -3,7 +3,7 @@
>>    * Copyright (c) 2021 Loongson Technology Corporation Limited
>>    */
>>   -static void maybe_nanbox_load(TCGv freg, MemOp mop)
>> +static void maybe_nanbox_load(TCGv_i64 freg, MemOp mop)
>>   {
>>       if ((mop & MO_SIZE) == MO_32) {
>>           gen_nanbox_s(freg, freg);
>> @@ -13,7 +13,7 @@ static void maybe_nanbox_load(TCGv freg, MemOp mop)
>>   static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
>>   {
>>       TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>>         CHECK_FPE;
>>   @@ -23,7 +23,7 @@ static bool gen_fload_i(DisasContext *ctx, 
>> arg_fr_i *a, MemOp mop)
>>           addr = temp;
>>       }
>>   -    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
>>       maybe_nanbox_load(dest, mop);
>>       set_fpr(a->fd, dest);
>>   @@ -33,7 +33,7 @@ static bool gen_fload_i(DisasContext *ctx, 
>> arg_fr_i *a, MemOp mop)
>>   static bool gen_fstore_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
>>   {
>>       TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
>> -    TCGv src = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src = get_fpr(ctx, a->fd);
>>         CHECK_FPE;
>>   @@ -43,7 +43,7 @@ static bool gen_fstore_i(DisasContext *ctx, 
>> arg_fr_i *a, MemOp mop)
>>           addr = temp;
>>       }
>>   -    tcg_gen_qemu_st_tl(src, addr, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_st_i64(src, addr, ctx->mem_idx, mop);
>>         return true;
>>   }
>> @@ -52,14 +52,14 @@ static bool gen_floadx(DisasContext *ctx, arg_frr 
>> *a, MemOp mop)
>>   {
>>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>>       TCGv addr;
>>         CHECK_FPE;
>>         addr = tcg_temp_new();
>>       tcg_gen_add_tl(addr, src1, src2);
>> -    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
>>       maybe_nanbox_load(dest, mop);
>>       set_fpr(a->fd, dest);
>>   @@ -70,14 +70,14 @@ static bool gen_fstorex(DisasContext *ctx, 
>> arg_frr *a, MemOp mop)
>>   {
>>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
>> -    TCGv src3 = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src3 = get_fpr(ctx, a->fd);
>>       TCGv addr;
>>         CHECK_FPE;
>>         addr = tcg_temp_new();
>>       tcg_gen_add_tl(addr, src1, src2);
>> -    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
>>         return true;
>>   }
>> @@ -86,7 +86,7 @@ static bool gen_fload_gt(DisasContext *ctx, arg_frr 
>> *a, MemOp mop)
>>   {
>>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>>       TCGv addr;
>>         CHECK_FPE;
>> @@ -94,7 +94,7 @@ static bool gen_fload_gt(DisasContext *ctx, arg_frr 
>> *a, MemOp mop)
>>       addr = tcg_temp_new();
>>       gen_helper_asrtgt_d(cpu_env, src1, src2);
>>       tcg_gen_add_tl(addr, src1, src2);
>> -    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
>>       maybe_nanbox_load(dest, mop);
>>       set_fpr(a->fd, dest);
>>   @@ -105,7 +105,7 @@ static bool gen_fstore_gt(DisasContext *ctx, 
>> arg_frr *a, MemOp mop)
>>   {
>>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
>> -    TCGv src3 = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src3 = get_fpr(ctx, a->fd);
>>       TCGv addr;
>>         CHECK_FPE;
>> @@ -113,7 +113,7 @@ static bool gen_fstore_gt(DisasContext *ctx, 
>> arg_frr *a, MemOp mop)
>>       addr = tcg_temp_new();
>>       gen_helper_asrtgt_d(cpu_env, src1, src2);
>>       tcg_gen_add_tl(addr, src1, src2);
>> -    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
>>         return true;
>>   }
>> @@ -122,7 +122,7 @@ static bool gen_fload_le(DisasContext *ctx, 
>> arg_frr *a, MemOp mop)
>>   {
>>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>>       TCGv addr;
>>         CHECK_FPE;
>> @@ -130,7 +130,7 @@ static bool gen_fload_le(DisasContext *ctx, 
>> arg_frr *a, MemOp mop)
>>       addr = tcg_temp_new();
>>       gen_helper_asrtle_d(cpu_env, src1, src2);
>>       tcg_gen_add_tl(addr, src1, src2);
>> -    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
>>       maybe_nanbox_load(dest, mop);
>>       set_fpr(a->fd, dest);
>>   @@ -141,7 +141,7 @@ static bool gen_fstore_le(DisasContext *ctx, 
>> arg_frr *a, MemOp mop)
>>   {
>>       TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
>>       TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
>> -    TCGv src3 = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src3 = get_fpr(ctx, a->fd);
>>       TCGv addr;
>>         CHECK_FPE;
>> @@ -149,7 +149,7 @@ static bool gen_fstore_le(DisasContext *ctx, 
>> arg_frr *a, MemOp mop)
>>       addr = tcg_temp_new();
>>       gen_helper_asrtle_d(cpu_env, src1, src2);
>>       tcg_gen_add_tl(addr, src1, src2);
>> -    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
>> +    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
>>         return true;
>>   }
>> diff --git a/target/loongarch/insn_trans/trans_fmov.c.inc 
>> b/target/loongarch/insn_trans/trans_fmov.c.inc
>> index 5af0dd1b66..46b2af4b0c 100644
>> --- a/target/loongarch/insn_trans/trans_fmov.c.inc
>> +++ b/target/loongarch/insn_trans/trans_fmov.c.inc
>> @@ -9,27 +9,27 @@ static const uint32_t fcsr_mask[4] = {
>>     static bool trans_fsel(DisasContext *ctx, arg_fsel *a)
>>   {
>> -    TCGv zero = tcg_constant_tl(0);
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src1 = get_fpr(ctx, a->fj);
>> -    TCGv src2 = get_fpr(ctx, a->fk);
>> -    TCGv cond;
>> +    TCGv_i64 zero = tcg_constant_i64(0);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src1 = get_fpr(ctx, a->fj);
>> +    TCGv_i64 src2 = get_fpr(ctx, a->fk);
>> +    TCGv_i64 cond;
>>         CHECK_FPE;
>>   -    cond = tcg_temp_new();
>> -    tcg_gen_ld8u_tl(cond, cpu_env, offsetof(CPULoongArchState, 
>> cf[a->ca]));
>> -    tcg_gen_movcond_tl(TCG_COND_EQ, dest, cond, zero, src1, src2);
>> +    cond = tcg_temp_new_i64();
>> +    tcg_gen_ld8u_i64(cond, cpu_env, offsetof(CPULoongArchState, 
>> cf[a->ca]));
>> +    tcg_gen_movcond_i64(TCG_COND_EQ, dest, cond, zero, src1, src2);
>>       set_fpr(a->fd, dest);
>>         return true;
>>   }
>>     static bool gen_f2f(DisasContext *ctx, arg_ff *a,
>> -                    void (*func)(TCGv, TCGv), bool nanbox)
>> +                    void (*func)(TCGv_i64, TCGv_i64), bool nanbox)
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> -    TCGv src = get_fpr(ctx, a->fj);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   @@ -43,10 +43,10 @@ static bool gen_f2f(DisasContext *ctx, arg_ff *a,
>>   }
>>     static bool gen_r2f(DisasContext *ctx, arg_fr *a,
>> -                    void (*func)(TCGv, TCGv))
>> +                    void (*func)(TCGv_i64, TCGv))
>>   {
>>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>>         CHECK_FPE;
>>   @@ -57,10 +57,10 @@ static bool gen_r2f(DisasContext *ctx, arg_fr *a,
>>   }
>>     static bool gen_f2r(DisasContext *ctx, arg_rf *a,
>> -                    void (*func)(TCGv, TCGv))
>> +                    void (*func)(TCGv, TCGv_i64))
>>   {
>>       TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
>> -    TCGv src = get_fpr(ctx, a->fj);
>> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   @@ -78,13 +78,17 @@ static bool trans_movgr2fcsr(DisasContext *ctx, 
>> arg_movgr2fcsr *a)
>>       CHECK_FPE;
>>         if (mask == UINT32_MAX) {
>> -        tcg_gen_st32_i64(Rj, cpu_env, offsetof(CPULoongArchState, 
>> fcsr0));
>> +        tcg_gen_st32_tl(Rj, cpu_env, offsetof(CPULoongArchState, 
>> fcsr0));
>>       } else {
>>           TCGv_i32 fcsr0 = tcg_temp_new_i32();
>>           TCGv_i32 temp = tcg_temp_new_i32();
>>             tcg_gen_ld_i32(fcsr0, cpu_env, 
>> offsetof(CPULoongArchState, fcsr0));
>> +#ifdef TARGET_LOONGARCH32
>> +        tcg_gen_mov_i32(temp, Rj);
>> +#else
>>           tcg_gen_extrl_i64_i32(temp, Rj);
>> +#endif
>>           tcg_gen_andi_i32(temp, temp, mask);
>>           tcg_gen_andi_i32(fcsr0, fcsr0, ~mask);
>>           tcg_gen_or_i32(fcsr0, fcsr0, temp);
>> @@ -107,49 +111,65 @@ static bool trans_movfcsr2gr(DisasContext *ctx, 
>> arg_movfcsr2gr *a)
>>         CHECK_FPE;
>>   -    tcg_gen_ld32u_i64(dest, cpu_env, offsetof(CPULoongArchState, 
>> fcsr0));
>> -    tcg_gen_andi_i64(dest, dest, fcsr_mask[a->fcsrs]);
>> +    tcg_gen_ld32u_tl(dest, cpu_env, offsetof(CPULoongArchState, 
>> fcsr0));
>> +    tcg_gen_andi_tl(dest, dest, fcsr_mask[a->fcsrs]);
>>       gen_set_gpr(a->rd, dest, EXT_NONE);
>>         return true;
>>   }
>>   -static void gen_movgr2fr_w(TCGv dest, TCGv src)
>> +static void gen_movgr2fr_w(TCGv_i64 dest, TCGv src)
>>   {
>> +#ifdef TARGET_LOONGARCH32
>> +    TCGv_i64 src_i64 = tcg_temp_new_i64();
>> +    tcg_gen_extu_i32_i64(src_i64, src);
>> +    tcg_gen_deposit_i64(dest, dest, src_i64, 0, 32);
>> +#else
>>       tcg_gen_deposit_i64(dest, dest, src, 0, 32);
>> +#endif
>>   }
>>   -static void gen_movgr2frh_w(TCGv dest, TCGv src)
>> +static void gen_movgr2frh_w(TCGv_i64 dest, TCGv src)
>>   {
>> +#ifdef TARGET_LOONGARCH32
>> +    TCGv_i64 src_i64 = tcg_temp_new_i64();
>> +    tcg_gen_extu_i32_i64(src_i64, src);
>> +    tcg_gen_deposit_i64(dest, dest, src_i64, 32, 32);
>> +#else
>>       tcg_gen_deposit_i64(dest, dest, src, 32, 32);
>> +#endif
>>   }
>>   -static void gen_movfrh2gr_s(TCGv dest, TCGv src)
>> +static void gen_movfrh2gr_s(TCGv dest, TCGv_i64 src)
>>   {
>> +#ifdef TARGET_LOONGARCH32
>> +    tcg_gen_extrh_i64_i32(dest, src);
>> +#else
>>       tcg_gen_sextract_tl(dest, src, 32, 32);
>> +#endif
>>   }
>>     static bool trans_movfr2cf(DisasContext *ctx, arg_movfr2cf *a)
>>   {
>> -    TCGv t0;
>> -    TCGv src = get_fpr(ctx, a->fj);
>> +    TCGv_i64 t0;
>> +    TCGv_i64 src = get_fpr(ctx, a->fj);
>>         CHECK_FPE;
>>   -    t0 = tcg_temp_new();
>> -    tcg_gen_andi_tl(t0, src, 0x1);
>> -    tcg_gen_st8_tl(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd 
>> & 0x7]));
>> +    t0 = tcg_temp_new_i64();
>> +    tcg_gen_andi_i64(t0, src, 0x1);
>> +    tcg_gen_st8_i64(t0, cpu_env, offsetof(CPULoongArchState, 
>> cf[a->cd & 0x7]));
>>         return true;
>>   }
>>     static bool trans_movcf2fr(DisasContext *ctx, arg_movcf2fr *a)
>>   {
>> -    TCGv dest = get_fpr(ctx, a->fd);
>> +    TCGv_i64 dest = get_fpr(ctx, a->fd);
>>         CHECK_FPE;
>>   -    tcg_gen_ld8u_tl(dest, cpu_env,
>> +    tcg_gen_ld8u_i64(dest, cpu_env,
>>                       offsetof(CPULoongArchState, cf[a->cj & 0x7]));
>>       set_fpr(a->fd, dest);
>>   @@ -178,11 +198,15 @@ static bool trans_movcf2gr(DisasContext *ctx, 
>> arg_movcf2gr *a)
>>       return true;
>>   }
>>   -TRANS(fmov_s, gen_f2f, tcg_gen_mov_tl, true)
>> -TRANS(fmov_d, gen_f2f, tcg_gen_mov_tl, false)
>> +TRANS(fmov_s, gen_f2f, tcg_gen_mov_i64, true)
>> +TRANS(fmov_d, gen_f2f, tcg_gen_mov_i64, false)
>>   TRANS(movgr2fr_w, gen_r2f, gen_movgr2fr_w)
>> -TRANS(movgr2fr_d, gen_r2f, tcg_gen_mov_tl)
>> +TRANS_64(movgr2fr_d, gen_r2f, tcg_gen_mov_tl)
>>   TRANS(movgr2frh_w, gen_r2f, gen_movgr2frh_w)
>> +#ifdef TARGET_LOONGARCH32
>> +TRANS(movfr2gr_s, gen_f2r, tcg_gen_extrl_i64_i32)
>> +#else
>>   TRANS(movfr2gr_s, gen_f2r, tcg_gen_ext32s_tl)
>> -TRANS(movfr2gr_d, gen_f2r, tcg_gen_mov_tl)
>> +#endif
>> +TRANS_64(movfr2gr_d, gen_f2r, tcg_gen_mov_tl)
>>   TRANS(movfrh2gr_s, gen_f2r, gen_movfrh2gr_s)
>> diff --git a/target/loongarch/insn_trans/trans_lsx.c.inc 
>> b/target/loongarch/insn_trans/trans_lsx.c.inc
>> index 68779daff6..25f72460c8 100644
>> --- a/target/loongarch/insn_trans/trans_lsx.c.inc
>> +++ b/target/loongarch/insn_trans/trans_lsx.c.inc
>> @@ -3930,23 +3930,23 @@ static bool trans_vbitseli_b(DisasContext 
>> *ctx, arg_vv_i *a)
>>   }
>>     #define VSET(NAME, 
>> COND)                                                       \
>> -static bool trans_## NAME (DisasContext *ctx, arg_cv 
>> *a)                       \
>> -{ \
>> -    TCGv_i64 t1, al, 
>> ah;                                                       \
>> - \
>> -    al = tcg_temp_new_i64(); \
>> -    ah = tcg_temp_new_i64(); \
>> -    t1 = tcg_temp_new_i64(); \
>> - \
>> -    get_vreg64(ah, a->vj, 
>> 1);                                                  \
>> -    get_vreg64(al, a->vj, 
>> 0);                                                  \
>> - \
>> - CHECK_SXE; \
>> -    tcg_gen_or_i64(t1, al, 
>> ah);                                                \
>> -    tcg_gen_setcondi_i64(COND, t1, t1, 
>> 0);                                     \
>> -    tcg_gen_st8_tl(t1, cpu_env, offsetof(CPULoongArchState, cf[a->cd 
>> & 0x7])); \
>> - \
>> -    return true; \
>> +static bool trans_## NAME (DisasContext *ctx, arg_cv 
>> *a)                        \
>> +{ \
>> +    TCGv_i64 t1, al, 
>> ah;                                                        \
>> + \
>> +    al = tcg_temp_new_i64(); \
>> +    ah = tcg_temp_new_i64(); \
>> +    t1 = tcg_temp_new_i64(); \
>> + \
>> +    get_vreg64(ah, a->vj, 
>> 1);                                                   \
>> +    get_vreg64(al, a->vj, 
>> 0);                                                   \
>> + \
>> + CHECK_SXE; \
>> +    tcg_gen_or_i64(t1, al, 
>> ah);                                                 \
>> +    tcg_gen_setcondi_i64(COND, t1, t1, 
>> 0);                                      \
>> +    tcg_gen_st8_i64(t1, cpu_env, offsetof(CPULoongArchState, 
>> cf[a->cd & 0x7])); \
>> + \
>> +    return true; \
>>   }
>>     VSET(vseteqz_v, TCG_COND_EQ)
>> @@ -3965,7 +3965,7 @@ static bool trans_vinsgr2vr_b(DisasContext 
>> *ctx, arg_vr_i *a)
>>   {
>>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_st8_i64(src, cpu_env,
>> +    tcg_gen_st8_tl(src, cpu_env,
>>                       offsetof(CPULoongArchState, 
>> fpr[a->vd].vreg.B(a->imm)));
>>       return true;
>>   }
>> @@ -3974,7 +3974,7 @@ static bool trans_vinsgr2vr_h(DisasContext 
>> *ctx, arg_vr_i *a)
>>   {
>>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_st16_i64(src, cpu_env,
>> +    tcg_gen_st16_tl(src, cpu_env,
>>                       offsetof(CPULoongArchState, 
>> fpr[a->vd].vreg.H(a->imm)));
>>       return true;
>>   }
>> @@ -3983,7 +3983,7 @@ static bool trans_vinsgr2vr_w(DisasContext 
>> *ctx, arg_vr_i *a)
>>   {
>>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_st32_i64(src, cpu_env,
>> +    tcg_gen_st32_tl(src, cpu_env,
>>                        offsetof(CPULoongArchState, 
>> fpr[a->vd].vreg.W(a->imm)));
>>       return true;
>>   }
>> @@ -3992,7 +3992,7 @@ static bool trans_vinsgr2vr_d(DisasContext 
>> *ctx, arg_vr_i *a)
>>   {
>>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_st_i64(src, cpu_env,
>> +    tcg_gen_st_tl(src, cpu_env,
>>                      offsetof(CPULoongArchState, 
>> fpr[a->vd].vreg.D(a->imm)));
>>       return true;
>>   }
>> @@ -4001,7 +4001,7 @@ static bool trans_vpickve2gr_b(DisasContext 
>> *ctx, arg_rv_i *a)
>>   {
>>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_ld8s_i64(dst, cpu_env,
>> +    tcg_gen_ld8s_tl(dst, cpu_env,
>>                        offsetof(CPULoongArchState, 
>> fpr[a->vj].vreg.B(a->imm)));
>>       return true;
>>   }
>> @@ -4010,7 +4010,7 @@ static bool trans_vpickve2gr_h(DisasContext 
>> *ctx, arg_rv_i *a)
>>   {
>>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_ld16s_i64(dst, cpu_env,
>> +    tcg_gen_ld16s_tl(dst, cpu_env,
>>                         offsetof(CPULoongArchState, 
>> fpr[a->vj].vreg.H(a->imm)));
>>       return true;
>>   }
>> @@ -4019,7 +4019,7 @@ static bool trans_vpickve2gr_w(DisasContext 
>> *ctx, arg_rv_i *a)
>>   {
>>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_ld32s_i64(dst, cpu_env,
>> +    tcg_gen_ld32s_tl(dst, cpu_env,
>>                         offsetof(CPULoongArchState, 
>> fpr[a->vj].vreg.W(a->imm)));
>>       return true;
>>   }
>> @@ -4028,7 +4028,7 @@ static bool trans_vpickve2gr_d(DisasContext 
>> *ctx, arg_rv_i *a)
>>   {
>>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_ld_i64(dst, cpu_env,
>> +    tcg_gen_ld_tl(dst, cpu_env,
>>                      offsetof(CPULoongArchState, 
>> fpr[a->vj].vreg.D(a->imm)));
>>       return true;
>>   }
>> @@ -4037,7 +4037,7 @@ static bool trans_vpickve2gr_bu(DisasContext 
>> *ctx, arg_rv_i *a)
>>   {
>>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_ld8u_i64(dst, cpu_env,
>> +    tcg_gen_ld8u_tl(dst, cpu_env,
>>                        offsetof(CPULoongArchState, 
>> fpr[a->vj].vreg.B(a->imm)));
>>       return true;
>>   }
>> @@ -4046,7 +4046,7 @@ static bool trans_vpickve2gr_hu(DisasContext 
>> *ctx, arg_rv_i *a)
>>   {
>>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_ld16u_i64(dst, cpu_env,
>> +    tcg_gen_ld16u_tl(dst, cpu_env,
>>                         offsetof(CPULoongArchState, 
>> fpr[a->vj].vreg.H(a->imm)));
>>       return true;
>>   }
>> @@ -4055,7 +4055,7 @@ static bool trans_vpickve2gr_wu(DisasContext 
>> *ctx, arg_rv_i *a)
>>   {
>>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_ld32u_i64(dst, cpu_env,
>> +    tcg_gen_ld32u_tl(dst, cpu_env,
>>                         offsetof(CPULoongArchState, 
>> fpr[a->vj].vreg.W(a->imm)));
>>       return true;
>>   }
>> @@ -4064,7 +4064,7 @@ static bool trans_vpickve2gr_du(DisasContext 
>> *ctx, arg_rv_i *a)
>>   {
>>       TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
>>       CHECK_SXE;
>> -    tcg_gen_ld_i64(dst, cpu_env,
>> +    tcg_gen_ld_tl(dst, cpu_env,
>>                      offsetof(CPULoongArchState, 
>> fpr[a->vj].vreg.D(a->imm)));
>>       return true;
>>   }
>> @@ -4074,7 +4074,7 @@ static bool gvec_dup(DisasContext *ctx, arg_vr 
>> *a, MemOp mop)
>>       TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
>>       CHECK_SXE;
>>   -    tcg_gen_gvec_dup_i64(mop, vec_full_offset(a->vd),
>> +    tcg_gen_gvec_dup_tl(mop, vec_full_offset(a->vd),
>>                            16, ctx->vl/8, src);
>>       return true;
>>   }
>> @@ -4131,7 +4131,8 @@ static bool gen_vreplve(DisasContext *ctx, 
>> arg_vvr *a, int vece, int bit,
>>         CHECK_SXE;
>>   -    tcg_gen_andi_i64(t0, gpr_src(ctx, a->rk, EXT_NONE), 
>> (LSX_LEN/bit) -1);
>> +    tcg_gen_extu_tl_i64(t0, gpr_src(ctx, a->rk, EXT_NONE));
>> +    tcg_gen_andi_i64(t0, t0, (LSX_LEN / bit) - 1);
>>       tcg_gen_shli_i64(t0, t0, vece);
>>       if (HOST_BIG_ENDIAN) {
>>           tcg_gen_xori_i64(t0, t0, vece << ((LSX_LEN/bit) -1));
>> diff --git a/target/loongarch/iocsr_helper.c 
>> b/target/loongarch/iocsr_helper.c
>> index dda9845d6c..32cf3204b2 100644
>> --- a/target/loongarch/iocsr_helper.c
>> +++ b/target/loongarch/iocsr_helper.c
>> @@ -16,25 +16,25 @@
>>   #define GET_MEMTXATTRS(cas) \
>>           ((MemTxAttrs){.requester_id = env_cpu(cas)->cpu_index})
>>   -uint64_t helper_iocsrrd_b(CPULoongArchState *env, target_ulong 
>> r_addr)
>> +target_ulong helper_iocsrrd_b(CPULoongArchState *env, target_ulong 
>> r_addr)
>>   {
>>       return address_space_ldub(&env->address_space_iocsr, r_addr,
>>                                 GET_MEMTXATTRS(env), NULL);
>>   }
>>   -uint64_t helper_iocsrrd_h(CPULoongArchState *env, target_ulong 
>> r_addr)
>> +target_ulong helper_iocsrrd_h(CPULoongArchState *env, target_ulong 
>> r_addr)
>>   {
>>       return address_space_lduw(&env->address_space_iocsr, r_addr,
>>                                 GET_MEMTXATTRS(env), NULL);
>>   }
>>   -uint64_t helper_iocsrrd_w(CPULoongArchState *env, target_ulong 
>> r_addr)
>> +target_ulong helper_iocsrrd_w(CPULoongArchState *env, target_ulong 
>> r_addr)
>>   {
>>       return address_space_ldl(&env->address_space_iocsr, r_addr,
>>                                GET_MEMTXATTRS(env), NULL);
>>   }
>>   -uint64_t helper_iocsrrd_d(CPULoongArchState *env, target_ulong 
>> r_addr)
>> +target_ulong helper_iocsrrd_d(CPULoongArchState *env, target_ulong 
>> r_addr)
>>   {
>>       return address_space_ldq(&env->address_space_iocsr, r_addr,
>>                                GET_MEMTXATTRS(env), NULL);
>> diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
>> index d8ac99c9a4..31b9635bc4 100644
>> --- a/target/loongarch/machine.c
>> +++ b/target/loongarch/machine.c
>> @@ -99,61 +99,61 @@ const VMStateDescription vmstate_loongarch_cpu = {
>>           VMSTATE_UINTTL(env.pc, LoongArchCPU),
>>             /* Remaining CSRs */
>> -        VMSTATE_UINT64(env.CSR_CRMD, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PRMD, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_EUEN, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_MISC, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_ECFG, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_ESTAT, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_ERA, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_BADV, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_BADI, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_EENTRY, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBIDX, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBEHI, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBELO0, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBELO1, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_ASID, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PGDL, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PGDH, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PGD, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PWCL, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PWCH, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_STLBPS, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_RVACFG, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PRCFG1, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PRCFG2, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_PRCFG3, LoongArchCPU),
>> -        VMSTATE_UINT64_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
>> -        VMSTATE_UINT64(env.CSR_TID, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TCFG, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TVAL, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_CNTC, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TICLR, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_LLBCTL, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_IMPCTL1, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_IMPCTL2, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBRENTRY, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBRBADV, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBRERA, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBRSAVE, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBRELO0, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBRELO1, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBREHI, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_TLBRPRMD, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_MERRCTL, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_MERRINFO1, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_MERRINFO2, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_MERRENTRY, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_MERRERA, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_MERRSAVE, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_CTAG, LoongArchCPU),
>> -        VMSTATE_UINT64_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
>> +        VMSTATE_UINTTL(env.CSR_CRMD, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PRMD, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_EUEN, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_MISC, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_ECFG, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_ESTAT, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_ERA, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_BADV, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_BADI, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_EENTRY, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBIDX, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBEHI, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBELO0, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBELO1, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_ASID, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PGDL, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PGDH, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PGD, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PWCL, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PWCH, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_STLBPS, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_RVACFG, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PRCFG1, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PRCFG2, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_PRCFG3, LoongArchCPU),
>> +        VMSTATE_UINTTL_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
>> +        VMSTATE_UINTTL(env.CSR_TID, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TCFG, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TVAL, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_CNTC, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TICLR, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_LLBCTL, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_IMPCTL1, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_IMPCTL2, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBRENTRY, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBRBADV, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBRERA, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBRSAVE, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBRELO0, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBRELO1, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBREHI, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_TLBRPRMD, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_MERRCTL, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_MERRINFO1, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_MERRINFO2, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_MERRENTRY, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_MERRERA, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_MERRSAVE, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_CTAG, LoongArchCPU),
>> +        VMSTATE_UINTTL_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
>>             /* Debug CSRs */
>> -        VMSTATE_UINT64(env.CSR_DBG, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
>> -        VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_DBG, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_DERA, LoongArchCPU),
>> +        VMSTATE_UINTTL(env.CSR_DSAVE, LoongArchCPU),
>>           /* TLB */
>>           VMSTATE_STRUCT_ARRAY(env.tlb, LoongArchCPU, LOONGARCH_TLB_MAX,
>>                                0, vmstate_tlb, LoongArchTLB),
>> diff --git a/target/loongarch/op_helper.c b/target/loongarch/op_helper.c
>> index 60335a05e2..61dbddc501 100644
>> --- a/target/loongarch/op_helper.c
>> +++ b/target/loongarch/op_helper.c
>> @@ -62,7 +62,7 @@ void helper_asrtgt_d(CPULoongArchState *env, 
>> target_ulong rj, target_ulong rk)
>>       }
>>   }
>>   -target_ulong helper_crc32(target_ulong val, target_ulong m, 
>> uint64_t sz)
>> +target_ulong helper_crc32(target_ulong val, target_ulong m, 
>> target_ulong sz)
>>   {
>>       uint8_t buf[8];
>>       target_ulong mask = ((sz * 8) == 64) ? -1ULL : ((1ULL << (sz * 
>> 8)) - 1);
>> @@ -72,7 +72,7 @@ target_ulong helper_crc32(target_ulong val, 
>> target_ulong m, uint64_t sz)
>>       return (int32_t) (crc32(val ^ 0xffffffff, buf, sz) ^ 0xffffffff);
>>   }
>>   -target_ulong helper_crc32c(target_ulong val, target_ulong m, 
>> uint64_t sz)
>> +target_ulong helper_crc32c(target_ulong val, target_ulong m, 
>> target_ulong sz)
>>   {
>>       uint8_t buf[8];
>>       target_ulong mask = ((sz * 8) == 64) ? -1ULL : ((1ULL << (sz * 
>> 8)) - 1);
>> @@ -86,7 +86,7 @@ target_ulong helper_cpucfg(CPULoongArchState *env, 
>> target_ulong rj)
>>       return rj >= ARRAY_SIZE(env->cpucfg) ? 0 : env->cpucfg[rj];
>>   }
>>   -uint64_t helper_rdtime_d(CPULoongArchState *env)
>> +target_ulong helper_rdtime_d(CPULoongArchState *env)
>>   {
>>   #ifdef CONFIG_USER_ONLY
>>       return cpu_get_host_ticks();
>> diff --git a/target/loongarch/tlb_helper.c 
>> b/target/loongarch/tlb_helper.c
>> index 6e00190547..8c13e80fd3 100644
>> --- a/target/loongarch/tlb_helper.c
>> +++ b/target/loongarch/tlb_helper.c
>> @@ -166,6 +166,17 @@ static int 
>> loongarch_map_address(CPULoongArchState *env, hwaddr *physical,
>>       return TLBRET_NOMATCH;
>>   }
>>   +static target_ulong dmw_va2pa(target_ulong va, target_ulong dmw)
>> +{
>> +#ifdef TARGET_LOONGARCH32
>> +    uint32_t pseg = FIELD_EX32(dmw, CSR_DMW_32, PSEG);
>> +    return (va & MAKE_64BIT_MASK(0, R_CSR_DMW_32_VSEG_SHIFT)) | \
>> +        (pseg << R_CSR_DMW_32_VSEG_SHIFT);
>> +#else
>> +    return va & TARGET_PHYS_MASK;
>> +#endif
>> +}
>> +
>>   static int get_physical_address(CPULoongArchState *env, hwaddr 
>> *physical,
>>                                   int *prot, target_ulong address,
>>                                   MMUAccessType access_type, int 
>> mmu_idx)
>> @@ -185,12 +196,20 @@ static int 
>> get_physical_address(CPULoongArchState *env, hwaddr *physical,
>>       }
>>         plv = kernel_mode | (user_mode << R_CSR_DMW_PLV3_SHIFT);
>> -    base_v = address >> R_CSR_DMW_VSEG_SHIFT;
>> +#ifdef TARGET_LOONGARCH32
>> +    base_v = address >> R_CSR_DMW_32_VSEG_SHIFT;
>> +#else
>> +    base_v = address >> R_CSR_DMW_64_VSEG_SHIFT;
>> +#endif
>>       /* Check direct map window */
>>       for (int i = 0; i < 4; i++) {
>> -        base_c = FIELD_EX64(env->CSR_DMW[i], CSR_DMW, VSEG);
>> +#ifdef TARGET_LOONGARCH32
>> +        base_c = FIELD_EX32(env->CSR_DMW[i], CSR_DMW_32, VSEG);
>> +#else
>> +        base_c = FIELD_EX64(env->CSR_DMW[i], CSR_DMW_64, VSEG);
>> +#endif
>>           if ((plv & env->CSR_DMW[i]) && (base_c == base_v)) {
>> -            *physical = dmw_va2pa(address);
>> +            *physical = dmw_va2pa(address, env->CSR_DMW[i]);
>>               *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
>>               return TLBRET_MATCH;
>>           }
>> diff --git a/target/loongarch/translate.c b/target/loongarch/translate.c
>> index 3146a2d4ac..3557963df7 100644
>> --- a/target/loongarch/translate.c
>> +++ b/target/loongarch/translate.c
>> @@ -191,15 +191,15 @@ static void gen_set_gpr(int reg_num, TCGv t, 
>> DisasExtend dst_ext)
>>       }
>>   }
>>   -static TCGv get_fpr(DisasContext *ctx, int reg_num)
>> +static TCGv_i64 get_fpr(DisasContext *ctx, int reg_num)
>>   {
>> -    TCGv t = tcg_temp_new();
>> +    TCGv_i64 t = tcg_temp_new_i64();
>>       tcg_gen_ld_i64(t, cpu_env,
>>                      offsetof(CPULoongArchState, 
>> fpr[reg_num].vreg.D(0)));
>>       return  t;
>>   }
>>   -static void set_fpr(int reg_num, TCGv val)
>> +static void set_fpr(int reg_num, TCGv_i64 val)
>>   {
>>       tcg_gen_st_i64(val, cpu_env,
>>                      offsetof(CPULoongArchState, 
>> fpr[reg_num].vreg.D(0)));
>> diff --git a/target/loongarch/translate.h b/target/loongarch/translate.h
>> index 7f60090580..4e45e3e434 100644
>> --- a/target/loongarch/translate.h
>> +++ b/target/loongarch/translate.h
>> @@ -14,6 +14,15 @@
>>       static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \
>>       { return FUNC(ctx, a, __VA_ARGS__); }
>>   +/* for LoongArch64-only instructions */
>> +#ifdef TARGET_LOONGARCH64
>> +#define TRANS_64(NAME, FUNC, ...) TRANS(NAME, FUNC, __VA_ARGS__)
>> +#else
>> +#define TRANS_64(NAME, FUNC, ...) \
>> +    static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \
>> +    { return false; }
>> +#endif
>> +
>>   /*
>>    * If an operation is being performed on less than TARGET_LONG_BITS,
>>    * it may require the inputs to be sign- or zero-extended; which will
>
>
diff mbox series

Patch

diff --git a/configs/devices/loongarch32-softmmu/default.mak b/configs/devices/loongarch32-softmmu/default.mak
new file mode 100644
index 0000000000..a8d3a9d554
--- /dev/null
+++ b/configs/devices/loongarch32-softmmu/default.mak
@@ -0,0 +1,3 @@ 
+# Default configuration for loongarch32-softmmu
+
+CONFIG_LOONGARCH_VIRT=y
diff --git a/configs/targets/loongarch32-softmmu.mak b/configs/targets/loongarch32-softmmu.mak
new file mode 100644
index 0000000000..c13b7eb1ae
--- /dev/null
+++ b/configs/targets/loongarch32-softmmu.mak
@@ -0,0 +1,5 @@ 
+TARGET_ARCH=loongarch32
+TARGET_BASE_ARCH=loongarch
+TARGET_SUPPORTS_MTTCG=y
+TARGET_XML_FILES= gdb-xml/loongarch-base32.xml gdb-xml/loongarch-fpu.xml
+TARGET_NEED_FDT=y
diff --git a/gdb-xml/loongarch-base32.xml b/gdb-xml/loongarch-base32.xml
new file mode 100644
index 0000000000..af47bbd3da
--- /dev/null
+++ b/gdb-xml/loongarch-base32.xml
@@ -0,0 +1,45 @@ 
+<?xml version="1.0"?>
+<!-- Copyright (C) 2022 Free Software Foundation, Inc.
+
+     Copying and distribution of this file, with or without modification,
+     are permitted in any medium without royalty provided the copyright
+     notice and this notice are preserved.  -->
+
+<!DOCTYPE feature SYSTEM "gdb-target.dtd">
+<feature name="org.gnu.gdb.loongarch.base">
+  <reg name="r0" bitsize="32" type="uint32" group="general"/>
+  <reg name="r1" bitsize="32" type="code_ptr" group="general"/>
+  <reg name="r2" bitsize="32" type="data_ptr" group="general"/>
+  <reg name="r3" bitsize="32" type="data_ptr" group="general"/>
+  <reg name="r4" bitsize="32" type="uint32" group="general"/>
+  <reg name="r5" bitsize="32" type="uint32" group="general"/>
+  <reg name="r6" bitsize="32" type="uint32" group="general"/>
+  <reg name="r7" bitsize="32" type="uint32" group="general"/>
+  <reg name="r8" bitsize="32" type="uint32" group="general"/>
+  <reg name="r9" bitsize="32" type="uint32" group="general"/>
+  <reg name="r10" bitsize="32" type="uint32" group="general"/>
+  <reg name="r11" bitsize="32" type="uint32" group="general"/>
+  <reg name="r12" bitsize="32" type="uint32" group="general"/>
+  <reg name="r13" bitsize="32" type="uint32" group="general"/>
+  <reg name="r14" bitsize="32" type="uint32" group="general"/>
+  <reg name="r15" bitsize="32" type="uint32" group="general"/>
+  <reg name="r16" bitsize="32" type="uint32" group="general"/>
+  <reg name="r17" bitsize="32" type="uint32" group="general"/>
+  <reg name="r18" bitsize="32" type="uint32" group="general"/>
+  <reg name="r19" bitsize="32" type="uint32" group="general"/>
+  <reg name="r20" bitsize="32" type="uint32" group="general"/>
+  <reg name="r21" bitsize="32" type="uint32" group="general"/>
+  <reg name="r22" bitsize="32" type="data_ptr" group="general"/>
+  <reg name="r23" bitsize="32" type="uint32" group="general"/>
+  <reg name="r24" bitsize="32" type="uint32" group="general"/>
+  <reg name="r25" bitsize="32" type="uint32" group="general"/>
+  <reg name="r26" bitsize="32" type="uint32" group="general"/>
+  <reg name="r27" bitsize="32" type="uint32" group="general"/>
+  <reg name="r28" bitsize="32" type="uint32" group="general"/>
+  <reg name="r29" bitsize="32" type="uint32" group="general"/>
+  <reg name="r30" bitsize="32" type="uint32" group="general"/>
+  <reg name="r31" bitsize="32" type="uint32" group="general"/>
+  <reg name="orig_a0" bitsize="32" type="uint32" group="general"/>
+  <reg name="pc" bitsize="32" type="code_ptr" group="general"/>
+  <reg name="badv" bitsize="32" type="code_ptr" group="general"/>
+</feature>
diff --git a/qapi/machine-target.json b/qapi/machine-target.json
index f0a6b72414..a728e14c86 100644
--- a/qapi/machine-target.json
+++ b/qapi/machine-target.json
@@ -341,7 +341,7 @@ 
                    'TARGET_I386',
                    'TARGET_S390X',
                    'TARGET_MIPS',
-                   'TARGET_LOONGARCH64',
+                   'TARGET_LOONGARCH',
                    'TARGET_RISCV' ] } }
 
 ##
@@ -359,5 +359,5 @@ 
                    'TARGET_I386',
                    'TARGET_S390X',
                    'TARGET_MIPS',
-                   'TARGET_LOONGARCH64',
+                   'TARGET_LOONGARCH',
                    'TARGET_RISCV' ] } }
diff --git a/target/loongarch/Kconfig b/target/loongarch/Kconfig
index 46b26b1a85..a834f20ed8 100644
--- a/target/loongarch/Kconfig
+++ b/target/loongarch/Kconfig
@@ -1,2 +1,5 @@ 
 config LOONGARCH64
     bool
+
+config LOONGARCH32
+    bool
diff --git a/target/loongarch/cpu-csr.h b/target/loongarch/cpu-csr.h
index f8f24032cb..439eb1b578 100644
--- a/target/loongarch/cpu-csr.h
+++ b/target/loongarch/cpu-csr.h
@@ -187,10 +187,9 @@  FIELD(CSR_DMW, PLV1, 1, 1)
 FIELD(CSR_DMW, PLV2, 2, 1)
 FIELD(CSR_DMW, PLV3, 3, 1)
 FIELD(CSR_DMW, MAT, 4, 2)
-FIELD(CSR_DMW, VSEG, 60, 4)
-
-#define dmw_va2pa(va) \
-    (va & MAKE_64BIT_MASK(0, TARGET_VIRT_ADDR_SPACE_BITS))
+FIELD(CSR_DMW_32, PSEG, 25, 3)
+FIELD(CSR_DMW_32, VSEG, 29, 3)
+FIELD(CSR_DMW_64, VSEG, 60, 4)
 
 /* Debug CSRs */
 #define LOONGARCH_CSR_DBG            0x500 /* debug config */
diff --git a/target/loongarch/cpu-param.h b/target/loongarch/cpu-param.h
index 1265dc7cb5..53030ea00e 100644
--- a/target/loongarch/cpu-param.h
+++ b/target/loongarch/cpu-param.h
@@ -8,9 +8,15 @@ 
 #ifndef LOONGARCH_CPU_PARAM_H
 #define LOONGARCH_CPU_PARAM_H
 
+#ifdef TARGET_LOONGARCH32
+#define TARGET_LONG_BITS 32
+#define TARGET_PHYS_ADDR_SPACE_BITS 36
+#define TARGET_VIRT_ADDR_SPACE_BITS 32
+#else
 #define TARGET_LONG_BITS 64
 #define TARGET_PHYS_ADDR_SPACE_BITS 48
 #define TARGET_VIRT_ADDR_SPACE_BITS 48
+#endif
 
 #define TARGET_PAGE_BITS 14
 
diff --git a/target/loongarch/cpu.c b/target/loongarch/cpu.c
index ad93ecac92..b513531ac8 100644
--- a/target/loongarch/cpu.c
+++ b/target/loongarch/cpu.c
@@ -626,7 +626,7 @@  void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
     CPULoongArchState *env = &cpu->env;
     int i;
 
-    qemu_fprintf(f, " PC=%016" PRIx64 " ", env->pc);
+    qemu_fprintf(f, " PC=" TARGET_FMT_lx " ", env->pc);
     qemu_fprintf(f, " FCSR0 0x%08x  fp_status 0x%02x\n", env->fcsr0,
                  get_float_exception_flags(&env->fp_status));
 
@@ -635,26 +635,26 @@  void loongarch_cpu_dump_state(CPUState *cs, FILE *f, int flags)
         if ((i & 3) == 0) {
             qemu_fprintf(f, " GPR%02d:", i);
         }
-        qemu_fprintf(f, " %s %016" PRIx64, regnames[i], env->gpr[i]);
+        qemu_fprintf(f, " %s " TARGET_FMT_lx, regnames[i], env->gpr[i]);
         if ((i & 3) == 3) {
             qemu_fprintf(f, "\n");
         }
     }
 
-    qemu_fprintf(f, "CRMD=%016" PRIx64 "\n", env->CSR_CRMD);
-    qemu_fprintf(f, "PRMD=%016" PRIx64 "\n", env->CSR_PRMD);
-    qemu_fprintf(f, "EUEN=%016" PRIx64 "\n", env->CSR_EUEN);
-    qemu_fprintf(f, "ESTAT=%016" PRIx64 "\n", env->CSR_ESTAT);
-    qemu_fprintf(f, "ERA=%016" PRIx64 "\n", env->CSR_ERA);
-    qemu_fprintf(f, "BADV=%016" PRIx64 "\n", env->CSR_BADV);
-    qemu_fprintf(f, "BADI=%016" PRIx64 "\n", env->CSR_BADI);
-    qemu_fprintf(f, "EENTRY=%016" PRIx64 "\n", env->CSR_EENTRY);
-    qemu_fprintf(f, "PRCFG1=%016" PRIx64 ", PRCFG2=%016" PRIx64 ","
-                 " PRCFG3=%016" PRIx64 "\n",
+    qemu_fprintf(f, "CRMD=" TARGET_FMT_lx "\n", env->CSR_CRMD);
+    qemu_fprintf(f, "PRMD=" TARGET_FMT_lx "\n", env->CSR_PRMD);
+    qemu_fprintf(f, "EUEN=" TARGET_FMT_lx "\n", env->CSR_EUEN);
+    qemu_fprintf(f, "ESTAT=" TARGET_FMT_lx "\n", env->CSR_ESTAT);
+    qemu_fprintf(f, "ERA=" TARGET_FMT_lx "\n", env->CSR_ERA);
+    qemu_fprintf(f, "BADV=" TARGET_FMT_lx "\n", env->CSR_BADV);
+    qemu_fprintf(f, "BADI=" TARGET_FMT_lx "\n", env->CSR_BADI);
+    qemu_fprintf(f, "EENTRY=" TARGET_FMT_lx "\n", env->CSR_EENTRY);
+    qemu_fprintf(f, "PRCFG1=" TARGET_FMT_lx ", PRCFG2=" TARGET_FMT_lx ","
+                 " PRCFG3=" TARGET_FMT_lx "\n",
                  env->CSR_PRCFG1, env->CSR_PRCFG3, env->CSR_PRCFG3);
-    qemu_fprintf(f, "TLBRENTRY=%016" PRIx64 "\n", env->CSR_TLBRENTRY);
-    qemu_fprintf(f, "TLBRBADV=%016" PRIx64 "\n", env->CSR_TLBRBADV);
-    qemu_fprintf(f, "TLBRERA=%016" PRIx64 "\n", env->CSR_TLBRERA);
+    qemu_fprintf(f, "TLBRENTRY=" TARGET_FMT_lx "\n", env->CSR_TLBRENTRY);
+    qemu_fprintf(f, "TLBRBADV=" TARGET_FMT_lx "\n", env->CSR_TLBRBADV);
+    qemu_fprintf(f, "TLBRERA=" TARGET_FMT_lx "\n", env->CSR_TLBRERA);
 
     /* fpr */
     if (flags & CPU_DUMP_FPU) {
diff --git a/target/loongarch/cpu.h b/target/loongarch/cpu.h
index fa371ca8ba..37712cc590 100644
--- a/target/loongarch/cpu.h
+++ b/target/loongarch/cpu.h
@@ -273,8 +273,8 @@  struct LoongArchTLB {
 typedef struct LoongArchTLB LoongArchTLB;
 
 typedef struct CPUArchState {
-    uint64_t gpr[32];
-    uint64_t pc;
+    target_ulong gpr[32];
+    target_ulong pc;
 
     fpr_t fpr[32];
     float_status fp_status;
@@ -289,60 +289,60 @@  typedef struct CPUArchState {
     uint64_t llval;
 
     /* LoongArch CSRs */
-    uint64_t CSR_CRMD;
-    uint64_t CSR_PRMD;
-    uint64_t CSR_EUEN;
-    uint64_t CSR_MISC;
-    uint64_t CSR_ECFG;
-    uint64_t CSR_ESTAT;
-    uint64_t CSR_ERA;
-    uint64_t CSR_BADV;
-    uint64_t CSR_BADI;
-    uint64_t CSR_EENTRY;
-    uint64_t CSR_TLBIDX;
-    uint64_t CSR_TLBEHI;
-    uint64_t CSR_TLBELO0;
-    uint64_t CSR_TLBELO1;
-    uint64_t CSR_ASID;
-    uint64_t CSR_PGDL;
-    uint64_t CSR_PGDH;
-    uint64_t CSR_PGD;
-    uint64_t CSR_PWCL;
-    uint64_t CSR_PWCH;
-    uint64_t CSR_STLBPS;
-    uint64_t CSR_RVACFG;
-    uint64_t CSR_PRCFG1;
-    uint64_t CSR_PRCFG2;
-    uint64_t CSR_PRCFG3;
-    uint64_t CSR_SAVE[16];
-    uint64_t CSR_TID;
-    uint64_t CSR_TCFG;
-    uint64_t CSR_TVAL;
-    uint64_t CSR_CNTC;
-    uint64_t CSR_TICLR;
-    uint64_t CSR_LLBCTL;
-    uint64_t CSR_IMPCTL1;
-    uint64_t CSR_IMPCTL2;
-    uint64_t CSR_TLBRENTRY;
-    uint64_t CSR_TLBRBADV;
-    uint64_t CSR_TLBRERA;
-    uint64_t CSR_TLBRSAVE;
-    uint64_t CSR_TLBRELO0;
-    uint64_t CSR_TLBRELO1;
-    uint64_t CSR_TLBREHI;
-    uint64_t CSR_TLBRPRMD;
-    uint64_t CSR_MERRCTL;
-    uint64_t CSR_MERRINFO1;
-    uint64_t CSR_MERRINFO2;
-    uint64_t CSR_MERRENTRY;
-    uint64_t CSR_MERRERA;
-    uint64_t CSR_MERRSAVE;
-    uint64_t CSR_CTAG;
-    uint64_t CSR_DMW[4];
-    uint64_t CSR_DBG;
-    uint64_t CSR_DERA;
-    uint64_t CSR_DSAVE;
-    uint64_t CSR_CPUID;
+    target_ulong CSR_CRMD;
+    target_ulong CSR_PRMD;
+    target_ulong CSR_EUEN;
+    target_ulong CSR_MISC;
+    target_ulong CSR_ECFG;
+    target_ulong CSR_ESTAT;
+    target_ulong CSR_ERA;
+    target_ulong CSR_BADV;
+    target_ulong CSR_BADI;
+    target_ulong CSR_EENTRY;
+    target_ulong CSR_TLBIDX;
+    target_ulong CSR_TLBEHI;
+    target_ulong CSR_TLBELO0;
+    target_ulong CSR_TLBELO1;
+    target_ulong CSR_ASID;
+    target_ulong CSR_PGDL;
+    target_ulong CSR_PGDH;
+    target_ulong CSR_PGD;
+    target_ulong CSR_PWCL;
+    target_ulong CSR_PWCH;
+    target_ulong CSR_STLBPS;
+    target_ulong CSR_RVACFG;
+    target_ulong CSR_PRCFG1;
+    target_ulong CSR_PRCFG2;
+    target_ulong CSR_PRCFG3;
+    target_ulong CSR_SAVE[16];
+    target_ulong CSR_TID;
+    target_ulong CSR_TCFG;
+    target_ulong CSR_TVAL;
+    target_ulong CSR_CNTC;
+    target_ulong CSR_TICLR;
+    target_ulong CSR_LLBCTL;
+    target_ulong CSR_IMPCTL1;
+    target_ulong CSR_IMPCTL2;
+    target_ulong CSR_TLBRENTRY;
+    target_ulong CSR_TLBRBADV;
+    target_ulong CSR_TLBRERA;
+    target_ulong CSR_TLBRSAVE;
+    target_ulong CSR_TLBRELO0;
+    target_ulong CSR_TLBRELO1;
+    target_ulong CSR_TLBREHI;
+    target_ulong CSR_TLBRPRMD;
+    target_ulong CSR_MERRCTL;
+    target_ulong CSR_MERRINFO1;
+    target_ulong CSR_MERRINFO2;
+    target_ulong CSR_MERRENTRY;
+    target_ulong CSR_MERRERA;
+    target_ulong CSR_MERRSAVE;
+    target_ulong CSR_CTAG;
+    target_ulong CSR_DMW[4];
+    target_ulong CSR_DBG;
+    target_ulong CSR_DERA;
+    target_ulong CSR_DSAVE;
+    target_ulong CSR_CPUID;
 
 #ifndef CONFIG_USER_ONLY
     LoongArchTLB  tlb[LOONGARCH_TLB_MAX];
diff --git a/target/loongarch/helper.h b/target/loongarch/helper.h
index ffb1e0b0bf..1c41816b9a 100644
--- a/target/loongarch/helper.h
+++ b/target/loongarch/helper.h
@@ -93,21 +93,21 @@  DEF_HELPER_2(frint_d, i64, env, i64)
 
 DEF_HELPER_FLAGS_1(set_rounding_mode, TCG_CALL_NO_RWG, void, env)
 
-DEF_HELPER_1(rdtime_d, i64, env)
+DEF_HELPER_1(rdtime_d, tl, env)
 
 #ifndef CONFIG_USER_ONLY
 /* CSRs helper */
-DEF_HELPER_1(csrrd_pgd, i64, env)
-DEF_HELPER_1(csrrd_cpuid, i64, env)
-DEF_HELPER_1(csrrd_tval, i64, env)
-DEF_HELPER_2(csrwr_estat, i64, env, tl)
-DEF_HELPER_2(csrwr_asid, i64, env, tl)
-DEF_HELPER_2(csrwr_tcfg, i64, env, tl)
-DEF_HELPER_2(csrwr_ticlr, i64, env, tl)
-DEF_HELPER_2(iocsrrd_b, i64, env, tl)
-DEF_HELPER_2(iocsrrd_h, i64, env, tl)
-DEF_HELPER_2(iocsrrd_w, i64, env, tl)
-DEF_HELPER_2(iocsrrd_d, i64, env, tl)
+DEF_HELPER_1(csrrd_pgd, tl, env)
+DEF_HELPER_1(csrrd_cpuid, tl, env)
+DEF_HELPER_1(csrrd_tval, tl, env)
+DEF_HELPER_2(csrwr_estat, tl, env, tl)
+DEF_HELPER_2(csrwr_asid, tl, env, tl)
+DEF_HELPER_2(csrwr_tcfg, tl, env, tl)
+DEF_HELPER_2(csrwr_ticlr, tl, env, tl)
+DEF_HELPER_2(iocsrrd_b, tl, env, tl)
+DEF_HELPER_2(iocsrrd_h, tl, env, tl)
+DEF_HELPER_2(iocsrrd_w, tl, env, tl)
+DEF_HELPER_2(iocsrrd_d, tl, env, tl)
 DEF_HELPER_3(iocsrwr_b, void, env, tl, tl)
 DEF_HELPER_3(iocsrwr_h, void, env, tl, tl)
 DEF_HELPER_3(iocsrwr_w, void, env, tl, tl)
diff --git a/target/loongarch/insn_trans/trans_arith.c.inc b/target/loongarch/insn_trans/trans_arith.c.inc
index 43d6cf261d..b6fb286446 100644
--- a/target/loongarch/insn_trans/trans_arith.c.inc
+++ b/target/loongarch/insn_trans/trans_arith.c.inc
@@ -92,10 +92,11 @@  static void gen_sltu(TCGv dest, TCGv src1, TCGv src2)
 
 static void gen_mulh_w(TCGv dest, TCGv src1, TCGv src2)
 {
-    tcg_gen_mul_i64(dest, src1, src2);
-    tcg_gen_sari_i64(dest, dest, 32);
+    tcg_gen_mul_tl(dest, src1, src2);
+    tcg_gen_sari_tl(dest, dest, 32);
 }
 
+#ifdef TARGET_LOONGARCH64
 static void gen_mulh_d(TCGv dest, TCGv src1, TCGv src2)
 {
     TCGv discard = tcg_temp_new();
@@ -128,6 +129,7 @@  static void prep_divisor_d(TCGv ret, TCGv src1, TCGv src2)
     tcg_gen_or_tl(ret, ret, t1);
     tcg_gen_movcond_tl(TCG_COND_NE, ret, ret, zero, ret, src2);
 }
+#endif
 
 static void prep_divisor_du(TCGv ret, TCGv src2)
 {
@@ -142,6 +144,7 @@  static void prep_divisor_du(TCGv ret, TCGv src2)
     tcg_gen_movcond_tl(TCG_COND_EQ, ret, src2, zero, one, src2);
 }
 
+#ifdef TARGET_LOONGARCH64
 static void gen_div_d(TCGv dest, TCGv src1, TCGv src2)
 {
     TCGv t0 = tcg_temp_new();
@@ -155,6 +158,7 @@  static void gen_rem_d(TCGv dest, TCGv src1, TCGv src2)
     prep_divisor_d(t0, src1, src2);
     tcg_gen_rem_tl(dest, src1, t0);
 }
+#endif
 
 static void gen_div_du(TCGv dest, TCGv src1, TCGv src2)
 {
@@ -232,10 +236,12 @@  static target_ulong gen_pcaddu12i(target_ulong pc, int imm)
     return pc + (imm << 12);
 }
 
+#ifdef TARGET_LOONGARCH64
 static target_ulong gen_pcaddu18i(target_ulong pc, int imm)
 {
     return pc + ((target_ulong)(imm) << 18);
 }
+#endif
 
 static bool trans_addu16i_d(DisasContext *ctx, arg_addu16i_d *a)
 {
@@ -249,9 +255,9 @@  static bool trans_addu16i_d(DisasContext *ctx, arg_addu16i_d *a)
 }
 
 TRANS(add_w, gen_rrr, EXT_NONE, EXT_NONE, EXT_SIGN, tcg_gen_add_tl)
-TRANS(add_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_add_tl)
+TRANS_64(add_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_add_tl)
 TRANS(sub_w, gen_rrr, EXT_NONE, EXT_NONE, EXT_SIGN, tcg_gen_sub_tl)
-TRANS(sub_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_sub_tl)
+TRANS_64(sub_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_sub_tl)
 TRANS(and, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_and_tl)
 TRANS(or, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_or_tl)
 TRANS(xor, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_xor_tl)
@@ -261,32 +267,32 @@  TRANS(orn, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_orc_tl)
 TRANS(slt, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_slt)
 TRANS(sltu, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_sltu)
 TRANS(mul_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, tcg_gen_mul_tl)
-TRANS(mul_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_mul_tl)
+TRANS_64(mul_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, tcg_gen_mul_tl)
 TRANS(mulh_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, gen_mulh_w)
 TRANS(mulh_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, gen_mulh_w)
-TRANS(mulh_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_d)
-TRANS(mulh_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_du)
-TRANS(mulw_d_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, tcg_gen_mul_tl)
-TRANS(mulw_d_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, tcg_gen_mul_tl)
+TRANS_64(mulh_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_d)
+TRANS_64(mulh_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_mulh_du)
+TRANS_64(mulw_d_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_NONE, tcg_gen_mul_tl)
+TRANS_64(mulw_d_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_NONE, tcg_gen_mul_tl)
 TRANS(div_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, gen_div_w)
 TRANS(mod_w, gen_rrr, EXT_SIGN, EXT_SIGN, EXT_SIGN, gen_rem_w)
 TRANS(div_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_SIGN, gen_div_du)
 TRANS(mod_wu, gen_rrr, EXT_ZERO, EXT_ZERO, EXT_SIGN, gen_rem_du)
-TRANS(div_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_d)
-TRANS(mod_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_d)
-TRANS(div_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_du)
-TRANS(mod_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_du)
+TRANS_64(div_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_d)
+TRANS_64(mod_d, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_d)
+TRANS_64(div_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_div_du)
+TRANS_64(mod_du, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_rem_du)
 TRANS(slti, gen_rri_v, EXT_NONE, EXT_NONE, gen_slt)
 TRANS(sltui, gen_rri_v, EXT_NONE, EXT_NONE, gen_sltu)
 TRANS(addi_w, gen_rri_c, EXT_NONE, EXT_SIGN, tcg_gen_addi_tl)
-TRANS(addi_d, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_addi_tl)
+TRANS_64(addi_d, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_addi_tl)
 TRANS(alsl_w, gen_rrr_sa, EXT_NONE, EXT_SIGN, gen_alsl)
-TRANS(alsl_wu, gen_rrr_sa, EXT_NONE, EXT_ZERO, gen_alsl)
-TRANS(alsl_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_alsl)
+TRANS_64(alsl_wu, gen_rrr_sa, EXT_NONE, EXT_ZERO, gen_alsl)
+TRANS_64(alsl_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_alsl)
 TRANS(pcaddi, gen_pc, gen_pcaddi)
 TRANS(pcalau12i, gen_pc, gen_pcalau12i)
 TRANS(pcaddu12i, gen_pc, gen_pcaddu12i)
-TRANS(pcaddu18i, gen_pc, gen_pcaddu18i)
+TRANS_64(pcaddu18i, gen_pc, gen_pcaddu18i)
 TRANS(andi, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_andi_tl)
 TRANS(ori, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_ori_tl)
 TRANS(xori, gen_rri_c, EXT_NONE, EXT_NONE, tcg_gen_xori_tl)
diff --git a/target/loongarch/insn_trans/trans_atomic.c.inc b/target/loongarch/insn_trans/trans_atomic.c.inc
index 612709f2a7..d3d8babd5e 100644
--- a/target/loongarch/insn_trans/trans_atomic.c.inc
+++ b/target/loongarch/insn_trans/trans_atomic.c.inc
@@ -10,7 +10,7 @@  static bool gen_ll(DisasContext *ctx, arg_rr_i *a, MemOp mop)
     TCGv t0 = tcg_temp_new();
 
     tcg_gen_addi_tl(t0, src1, a->imm);
-    tcg_gen_qemu_ld_i64(dest, t0, ctx->mem_idx, mop);
+    tcg_gen_qemu_ld_tl(dest, t0, ctx->mem_idx, mop);
     tcg_gen_st_tl(t0, cpu_env, offsetof(CPULoongArchState, lladdr));
     tcg_gen_st_tl(dest, cpu_env, offsetof(CPULoongArchState, llval));
     gen_set_gpr(a->rd, dest, EXT_NONE);
@@ -70,8 +70,8 @@  static bool gen_am(DisasContext *ctx, arg_rrr *a,
 
 TRANS(ll_w, gen_ll, MO_TESL)
 TRANS(sc_w, gen_sc, MO_TESL)
-TRANS(ll_d, gen_ll, MO_TEUQ)
-TRANS(sc_d, gen_sc, MO_TEUQ)
+TRANS_64(ll_d, gen_ll, MO_TEUQ)
+TRANS_64(sc_d, gen_sc, MO_TEUQ)
 TRANS(amswap_w, gen_am, tcg_gen_atomic_xchg_tl, MO_TESL)
 TRANS(amswap_d, gen_am, tcg_gen_atomic_xchg_tl, MO_TEUQ)
 TRANS(amadd_w, gen_am, tcg_gen_atomic_fetch_add_tl, MO_TESL)
diff --git a/target/loongarch/insn_trans/trans_bit.c.inc b/target/loongarch/insn_trans/trans_bit.c.inc
index 25b4d7858b..80877a1b15 100644
--- a/target/loongarch/insn_trans/trans_bit.c.inc
+++ b/target/loongarch/insn_trans/trans_bit.c.inc
@@ -18,14 +18,20 @@  static bool gen_rr(DisasContext *ctx, arg_rr *a,
 
 static void gen_bytepick_w(TCGv dest, TCGv src1, TCGv src2, target_long sa)
 {
+#ifdef TARGET_LOONGARCH32
+    tcg_gen_extract2_tl(dest, src1, src2, (32 - sa * 8));
+#else
     tcg_gen_concat_tl_i64(dest, src1, src2);
     tcg_gen_sextract_i64(dest, dest, (32 - sa * 8), 32);
+#endif
 }
 
+#ifdef TARGET_LOONGARCH64
 static void gen_bytepick_d(TCGv dest, TCGv src1, TCGv src2, target_long sa)
 {
     tcg_gen_extract2_i64(dest, src1, src2, (64 - sa * 8));
 }
+#endif
 
 static bool gen_bstrins(DisasContext *ctx, arg_rr_ms_ls *a,
                         DisasExtend dst_ext)
@@ -83,9 +89,10 @@  static void gen_cto_w(TCGv dest, TCGv src1)
     gen_ctz_w(dest, dest);
 }
 
+#ifdef TARGET_LOONGARCH64
 static void gen_clz_d(TCGv dest, TCGv src1)
 {
-    tcg_gen_clzi_i64(dest, src1, TARGET_LONG_BITS);
+    tcg_gen_clzi_tl(dest, src1, TARGET_LONG_BITS);
 }
 
 static void gen_clo_d(TCGv dest, TCGv src1)
@@ -110,6 +117,7 @@  static void gen_revb_2w(TCGv dest, TCGv src1)
     tcg_gen_bswap64_i64(dest, src1);
     tcg_gen_rotri_i64(dest, dest, 32);
 }
+#endif
 
 static void gen_revb_2h(TCGv dest, TCGv src1)
 {
@@ -124,6 +132,7 @@  static void gen_revb_2h(TCGv dest, TCGv src1)
     tcg_gen_or_tl(dest, t0, t1);
 }
 
+#ifdef TARGET_LOONGARCH64
 static void gen_revb_4h(TCGv dest, TCGv src1)
 {
     TCGv mask = tcg_constant_tl(0x00FF00FF00FF00FFULL);
@@ -163,6 +172,7 @@  static void gen_revh_d(TCGv dest, TCGv src1)
     tcg_gen_or_tl(t0, t0, t1);
     tcg_gen_rotri_tl(dest, t0, 32);
 }
+#endif
 
 static void gen_maskeqz(TCGv dest, TCGv src1, TCGv src2)
 {
@@ -184,25 +194,25 @@  TRANS(clo_w, gen_rr, EXT_NONE, EXT_NONE, gen_clo_w)
 TRANS(clz_w, gen_rr, EXT_ZERO, EXT_NONE, gen_clz_w)
 TRANS(cto_w, gen_rr, EXT_NONE, EXT_NONE, gen_cto_w)
 TRANS(ctz_w, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_w)
-TRANS(clo_d, gen_rr, EXT_NONE, EXT_NONE, gen_clo_d)
-TRANS(clz_d, gen_rr, EXT_NONE, EXT_NONE, gen_clz_d)
-TRANS(cto_d, gen_rr, EXT_NONE, EXT_NONE, gen_cto_d)
-TRANS(ctz_d, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_d)
+TRANS_64(clo_d, gen_rr, EXT_NONE, EXT_NONE, gen_clo_d)
+TRANS_64(clz_d, gen_rr, EXT_NONE, EXT_NONE, gen_clz_d)
+TRANS_64(cto_d, gen_rr, EXT_NONE, EXT_NONE, gen_cto_d)
+TRANS_64(ctz_d, gen_rr, EXT_NONE, EXT_NONE, gen_ctz_d)
 TRANS(revb_2h, gen_rr, EXT_NONE, EXT_SIGN, gen_revb_2h)
-TRANS(revb_4h, gen_rr, EXT_NONE, EXT_NONE, gen_revb_4h)
-TRANS(revb_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revb_2w)
-TRANS(revb_d, gen_rr, EXT_NONE, EXT_NONE, tcg_gen_bswap64_i64)
-TRANS(revh_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revh_2w)
-TRANS(revh_d, gen_rr, EXT_NONE, EXT_NONE, gen_revh_d)
+TRANS_64(revb_4h, gen_rr, EXT_NONE, EXT_NONE, gen_revb_4h)
+TRANS_64(revb_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revb_2w)
+TRANS_64(revb_d, gen_rr, EXT_NONE, EXT_NONE, tcg_gen_bswap64_i64)
+TRANS_64(revh_2w, gen_rr, EXT_NONE, EXT_NONE, gen_revh_2w)
+TRANS_64(revh_d, gen_rr, EXT_NONE, EXT_NONE, gen_revh_d)
 TRANS(bitrev_4b, gen_rr, EXT_ZERO, EXT_SIGN, gen_helper_bitswap)
-TRANS(bitrev_8b, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitswap)
+TRANS_64(bitrev_8b, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitswap)
 TRANS(bitrev_w, gen_rr, EXT_NONE, EXT_SIGN, gen_helper_bitrev_w)
-TRANS(bitrev_d, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitrev_d)
+TRANS_64(bitrev_d, gen_rr, EXT_NONE, EXT_NONE, gen_helper_bitrev_d)
 TRANS(maskeqz, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_maskeqz)
 TRANS(masknez, gen_rrr, EXT_NONE, EXT_NONE, EXT_NONE, gen_masknez)
 TRANS(bytepick_w, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_w)
-TRANS(bytepick_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_d)
+TRANS_64(bytepick_d, gen_rrr_sa, EXT_NONE, EXT_NONE, gen_bytepick_d)
 TRANS(bstrins_w, gen_bstrins, EXT_SIGN)
-TRANS(bstrins_d, gen_bstrins, EXT_NONE)
+TRANS_64(bstrins_d, gen_bstrins, EXT_NONE)
 TRANS(bstrpick_w, gen_bstrpick, EXT_SIGN)
-TRANS(bstrpick_d, gen_bstrpick, EXT_NONE)
+TRANS_64(bstrpick_d, gen_bstrpick, EXT_NONE)
diff --git a/target/loongarch/insn_trans/trans_extra.c.inc b/target/loongarch/insn_trans/trans_extra.c.inc
index 06f4de4515..2beb858582 100644
--- a/target/loongarch/insn_trans/trans_extra.c.inc
+++ b/target/loongarch/insn_trans/trans_extra.c.inc
@@ -44,7 +44,7 @@  static bool gen_rdtime(DisasContext *ctx, arg_rr *a,
     if (word) {
         tcg_gen_sextract_tl(dst1, dst1, high ? 32 : 0, 32);
     }
-    tcg_gen_ld_i64(dst2, cpu_env, offsetof(CPULoongArchState, CSR_TID));
+    tcg_gen_ld_tl(dst2, cpu_env, offsetof(CPULoongArchState, CSR_TID));
 
     return true;
 }
diff --git a/target/loongarch/insn_trans/trans_farith.c.inc b/target/loongarch/insn_trans/trans_farith.c.inc
index 21ea47308b..fa146706bc 100644
--- a/target/loongarch/insn_trans/trans_farith.c.inc
+++ b/target/loongarch/insn_trans/trans_farith.c.inc
@@ -15,11 +15,11 @@ 
 #endif
 
 static bool gen_fff(DisasContext *ctx, arg_fff *a,
-                    void (*func)(TCGv, TCGv_env, TCGv, TCGv))
+                    void (*func)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64))
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src1 = get_fpr(ctx, a->fj);
-    TCGv src2 = get_fpr(ctx, a->fk);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src1 = get_fpr(ctx, a->fj);
+    TCGv_i64 src2 = get_fpr(ctx, a->fk);
 
     CHECK_FPE;
 
@@ -30,10 +30,10 @@  static bool gen_fff(DisasContext *ctx, arg_fff *a,
 }
 
 static bool gen_ff(DisasContext *ctx, arg_ff *a,
-                   void (*func)(TCGv, TCGv_env, TCGv))
+                   void (*func)(TCGv_i64, TCGv_env, TCGv_i64))
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src = get_fpr(ctx, a->fj);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
@@ -44,14 +44,14 @@  static bool gen_ff(DisasContext *ctx, arg_ff *a,
 }
 
 static bool gen_muladd(DisasContext *ctx, arg_ffff *a,
-                       void (*func)(TCGv, TCGv_env, TCGv, TCGv, TCGv, TCGv_i32),
+                       void (*func)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i32),
                        int flag)
 {
     TCGv_i32 tflag = tcg_constant_i32(flag);
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src1 = get_fpr(ctx, a->fj);
-    TCGv src2 = get_fpr(ctx, a->fk);
-    TCGv src3 = get_fpr(ctx, a->fa);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src1 = get_fpr(ctx, a->fj);
+    TCGv_i64 src2 = get_fpr(ctx, a->fk);
+    TCGv_i64 src3 = get_fpr(ctx, a->fa);
 
     CHECK_FPE;
 
@@ -63,9 +63,9 @@  static bool gen_muladd(DisasContext *ctx, arg_ffff *a,
 
 static bool trans_fcopysign_s(DisasContext *ctx, arg_fcopysign_s *a)
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src1 = get_fpr(ctx, a->fk);
-    TCGv src2 = get_fpr(ctx, a->fj);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src1 = get_fpr(ctx, a->fk);
+    TCGv_i64 src2 = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
@@ -77,9 +77,9 @@  static bool trans_fcopysign_s(DisasContext *ctx, arg_fcopysign_s *a)
 
 static bool trans_fcopysign_d(DisasContext *ctx, arg_fcopysign_d *a)
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src1 = get_fpr(ctx, a->fk);
-    TCGv src2 = get_fpr(ctx, a->fj);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src1 = get_fpr(ctx, a->fk);
+    TCGv_i64 src2 = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
@@ -91,8 +91,8 @@  static bool trans_fcopysign_d(DisasContext *ctx, arg_fcopysign_d *a)
 
 static bool trans_fabs_s(DisasContext *ctx, arg_fabs_s *a)
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src = get_fpr(ctx, a->fj);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
@@ -105,8 +105,8 @@  static bool trans_fabs_s(DisasContext *ctx, arg_fabs_s *a)
 
 static bool trans_fabs_d(DisasContext *ctx, arg_fabs_d *a)
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src = get_fpr(ctx, a->fj);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
@@ -118,8 +118,8 @@  static bool trans_fabs_d(DisasContext *ctx, arg_fabs_d *a)
 
 static bool trans_fneg_s(DisasContext *ctx, arg_fneg_s *a)
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src = get_fpr(ctx, a->fj);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
@@ -132,8 +132,8 @@  static bool trans_fneg_s(DisasContext *ctx, arg_fneg_s *a)
 
 static bool trans_fneg_d(DisasContext *ctx, arg_fneg_d *a)
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src = get_fpr(ctx, a->fj);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
diff --git a/target/loongarch/insn_trans/trans_fcmp.c.inc b/target/loongarch/insn_trans/trans_fcmp.c.inc
index a78868dbc4..ebef54f495 100644
--- a/target/loongarch/insn_trans/trans_fcmp.c.inc
+++ b/target/loongarch/insn_trans/trans_fcmp.c.inc
@@ -25,13 +25,13 @@  static uint32_t get_fcmp_flags(int cond)
 
 static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a)
 {
-    TCGv var, src1, src2;
+    TCGv_i64 var, src1, src2;
     uint32_t flags;
-    void (*fn)(TCGv, TCGv_env, TCGv, TCGv, TCGv_i32);
+    void (*fn)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64, TCGv_i32);
 
     CHECK_FPE;
 
-    var = tcg_temp_new();
+    var = tcg_temp_new_i64();
     src1 = get_fpr(ctx, a->fj);
     src2 = get_fpr(ctx, a->fk);
     fn = (a->fcond & 1 ? gen_helper_fcmp_s_s : gen_helper_fcmp_c_s);
@@ -39,19 +39,19 @@  static bool trans_fcmp_cond_s(DisasContext *ctx, arg_fcmp_cond_s *a)
 
     fn(var, cpu_env, src1, src2, tcg_constant_i32(flags));
 
-    tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
+    tcg_gen_st8_i64(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
     return true;
 }
 
 static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a)
 {
-    TCGv var, src1, src2;
+    TCGv_i64 var, src1, src2;
     uint32_t flags;
-    void (*fn)(TCGv, TCGv_env, TCGv, TCGv, TCGv_i32);
+    void (*fn)(TCGv_i64, TCGv_env, TCGv_i64, TCGv_i64, TCGv_i32);
 
     CHECK_FPE;
 
-    var = tcg_temp_new();
+    var = tcg_temp_new_i64();
     src1 = get_fpr(ctx, a->fj);
     src2 = get_fpr(ctx, a->fk);
     fn = (a->fcond & 1 ? gen_helper_fcmp_s_d : gen_helper_fcmp_c_d);
@@ -59,6 +59,6 @@  static bool trans_fcmp_cond_d(DisasContext *ctx, arg_fcmp_cond_d *a)
 
     fn(var, cpu_env, src1, src2, tcg_constant_i32(flags));
 
-    tcg_gen_st8_tl(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
+    tcg_gen_st8_i64(var, cpu_env, offsetof(CPULoongArchState, cf[a->cd]));
     return true;
 }
diff --git a/target/loongarch/insn_trans/trans_fmemory.c.inc b/target/loongarch/insn_trans/trans_fmemory.c.inc
index 91c09fb6d9..6e46782666 100644
--- a/target/loongarch/insn_trans/trans_fmemory.c.inc
+++ b/target/loongarch/insn_trans/trans_fmemory.c.inc
@@ -3,7 +3,7 @@ 
  * Copyright (c) 2021 Loongson Technology Corporation Limited
  */
 
-static void maybe_nanbox_load(TCGv freg, MemOp mop)
+static void maybe_nanbox_load(TCGv_i64 freg, MemOp mop)
 {
     if ((mop & MO_SIZE) == MO_32) {
         gen_nanbox_s(freg, freg);
@@ -13,7 +13,7 @@  static void maybe_nanbox_load(TCGv freg, MemOp mop)
 static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
 {
     TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
-    TCGv dest = get_fpr(ctx, a->fd);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
 
     CHECK_FPE;
 
@@ -23,7 +23,7 @@  static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
         addr = temp;
     }
 
-    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
+    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
     maybe_nanbox_load(dest, mop);
     set_fpr(a->fd, dest);
 
@@ -33,7 +33,7 @@  static bool gen_fload_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
 static bool gen_fstore_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
 {
     TCGv addr = gpr_src(ctx, a->rj, EXT_NONE);
-    TCGv src = get_fpr(ctx, a->fd);
+    TCGv_i64 src = get_fpr(ctx, a->fd);
 
     CHECK_FPE;
 
@@ -43,7 +43,7 @@  static bool gen_fstore_i(DisasContext *ctx, arg_fr_i *a, MemOp mop)
         addr = temp;
     }
 
-    tcg_gen_qemu_st_tl(src, addr, ctx->mem_idx, mop);
+    tcg_gen_qemu_st_i64(src, addr, ctx->mem_idx, mop);
 
     return true;
 }
@@ -52,14 +52,14 @@  static bool gen_floadx(DisasContext *ctx, arg_frr *a, MemOp mop)
 {
     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
-    TCGv dest = get_fpr(ctx, a->fd);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
     TCGv addr;
 
     CHECK_FPE;
 
     addr = tcg_temp_new();
     tcg_gen_add_tl(addr, src1, src2);
-    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
+    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
     maybe_nanbox_load(dest, mop);
     set_fpr(a->fd, dest);
 
@@ -70,14 +70,14 @@  static bool gen_fstorex(DisasContext *ctx, arg_frr *a, MemOp mop)
 {
     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
-    TCGv src3 = get_fpr(ctx, a->fd);
+    TCGv_i64 src3 = get_fpr(ctx, a->fd);
     TCGv addr;
 
     CHECK_FPE;
 
     addr = tcg_temp_new();
     tcg_gen_add_tl(addr, src1, src2);
-    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
+    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
 
     return true;
 }
@@ -86,7 +86,7 @@  static bool gen_fload_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
 {
     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
-    TCGv dest = get_fpr(ctx, a->fd);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
     TCGv addr;
 
     CHECK_FPE;
@@ -94,7 +94,7 @@  static bool gen_fload_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
     addr = tcg_temp_new();
     gen_helper_asrtgt_d(cpu_env, src1, src2);
     tcg_gen_add_tl(addr, src1, src2);
-    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
+    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
     maybe_nanbox_load(dest, mop);
     set_fpr(a->fd, dest);
 
@@ -105,7 +105,7 @@  static bool gen_fstore_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
 {
     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
-    TCGv src3 = get_fpr(ctx, a->fd);
+    TCGv_i64 src3 = get_fpr(ctx, a->fd);
     TCGv addr;
 
     CHECK_FPE;
@@ -113,7 +113,7 @@  static bool gen_fstore_gt(DisasContext *ctx, arg_frr *a, MemOp mop)
     addr = tcg_temp_new();
     gen_helper_asrtgt_d(cpu_env, src1, src2);
     tcg_gen_add_tl(addr, src1, src2);
-    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
+    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
 
     return true;
 }
@@ -122,7 +122,7 @@  static bool gen_fload_le(DisasContext *ctx, arg_frr *a, MemOp mop)
 {
     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
-    TCGv dest = get_fpr(ctx, a->fd);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
     TCGv addr;
 
     CHECK_FPE;
@@ -130,7 +130,7 @@  static bool gen_fload_le(DisasContext *ctx, arg_frr *a, MemOp mop)
     addr = tcg_temp_new();
     gen_helper_asrtle_d(cpu_env, src1, src2);
     tcg_gen_add_tl(addr, src1, src2);
-    tcg_gen_qemu_ld_tl(dest, addr, ctx->mem_idx, mop);
+    tcg_gen_qemu_ld_i64(dest, addr, ctx->mem_idx, mop);
     maybe_nanbox_load(dest, mop);
     set_fpr(a->fd, dest);
 
@@ -141,7 +141,7 @@  static bool gen_fstore_le(DisasContext *ctx, arg_frr *a, MemOp mop)
 {
     TCGv src1 = gpr_src(ctx, a->rj, EXT_NONE);
     TCGv src2 = gpr_src(ctx, a->rk, EXT_NONE);
-    TCGv src3 = get_fpr(ctx, a->fd);
+    TCGv_i64 src3 = get_fpr(ctx, a->fd);
     TCGv addr;
 
     CHECK_FPE;
@@ -149,7 +149,7 @@  static bool gen_fstore_le(DisasContext *ctx, arg_frr *a, MemOp mop)
     addr = tcg_temp_new();
     gen_helper_asrtle_d(cpu_env, src1, src2);
     tcg_gen_add_tl(addr, src1, src2);
-    tcg_gen_qemu_st_tl(src3, addr, ctx->mem_idx, mop);
+    tcg_gen_qemu_st_i64(src3, addr, ctx->mem_idx, mop);
 
     return true;
 }
diff --git a/target/loongarch/insn_trans/trans_fmov.c.inc b/target/loongarch/insn_trans/trans_fmov.c.inc
index 5af0dd1b66..46b2af4b0c 100644
--- a/target/loongarch/insn_trans/trans_fmov.c.inc
+++ b/target/loongarch/insn_trans/trans_fmov.c.inc
@@ -9,27 +9,27 @@  static const uint32_t fcsr_mask[4] = {
 
 static bool trans_fsel(DisasContext *ctx, arg_fsel *a)
 {
-    TCGv zero = tcg_constant_tl(0);
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src1 = get_fpr(ctx, a->fj);
-    TCGv src2 = get_fpr(ctx, a->fk);
-    TCGv cond;
+    TCGv_i64 zero = tcg_constant_i64(0);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src1 = get_fpr(ctx, a->fj);
+    TCGv_i64 src2 = get_fpr(ctx, a->fk);
+    TCGv_i64 cond;
 
     CHECK_FPE;
 
-    cond = tcg_temp_new();
-    tcg_gen_ld8u_tl(cond, cpu_env, offsetof(CPULoongArchState, cf[a->ca]));
-    tcg_gen_movcond_tl(TCG_COND_EQ, dest, cond, zero, src1, src2);
+    cond = tcg_temp_new_i64();
+    tcg_gen_ld8u_i64(cond, cpu_env, offsetof(CPULoongArchState, cf[a->ca]));
+    tcg_gen_movcond_i64(TCG_COND_EQ, dest, cond, zero, src1, src2);
     set_fpr(a->fd, dest);
 
     return true;
 }
 
 static bool gen_f2f(DisasContext *ctx, arg_ff *a,
-                    void (*func)(TCGv, TCGv), bool nanbox)
+                    void (*func)(TCGv_i64, TCGv_i64), bool nanbox)
 {
-    TCGv dest = get_fpr(ctx, a->fd);
-    TCGv src = get_fpr(ctx, a->fj);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
+    TCGv_i64 src = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
@@ -43,10 +43,10 @@  static bool gen_f2f(DisasContext *ctx, arg_ff *a,
 }
 
 static bool gen_r2f(DisasContext *ctx, arg_fr *a,
-                    void (*func)(TCGv, TCGv))
+                    void (*func)(TCGv_i64, TCGv))
 {
     TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
-    TCGv dest = get_fpr(ctx, a->fd);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
 
     CHECK_FPE;
 
@@ -57,10 +57,10 @@  static bool gen_r2f(DisasContext *ctx, arg_fr *a,
 }
 
 static bool gen_f2r(DisasContext *ctx, arg_rf *a,
-                    void (*func)(TCGv, TCGv))
+                    void (*func)(TCGv, TCGv_i64))
 {
     TCGv dest = gpr_dst(ctx, a->rd, EXT_NONE);
-    TCGv src = get_fpr(ctx, a->fj);
+    TCGv_i64 src = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
@@ -78,13 +78,17 @@  static bool trans_movgr2fcsr(DisasContext *ctx, arg_movgr2fcsr *a)
     CHECK_FPE;
 
     if (mask == UINT32_MAX) {
-        tcg_gen_st32_i64(Rj, cpu_env, offsetof(CPULoongArchState, fcsr0));
+        tcg_gen_st32_tl(Rj, cpu_env, offsetof(CPULoongArchState, fcsr0));
     } else {
         TCGv_i32 fcsr0 = tcg_temp_new_i32();
         TCGv_i32 temp = tcg_temp_new_i32();
 
         tcg_gen_ld_i32(fcsr0, cpu_env, offsetof(CPULoongArchState, fcsr0));
+#ifdef TARGET_LOONGARCH32
+        tcg_gen_mov_i32(temp, Rj);
+#else
         tcg_gen_extrl_i64_i32(temp, Rj);
+#endif
         tcg_gen_andi_i32(temp, temp, mask);
         tcg_gen_andi_i32(fcsr0, fcsr0, ~mask);
         tcg_gen_or_i32(fcsr0, fcsr0, temp);
@@ -107,49 +111,65 @@  static bool trans_movfcsr2gr(DisasContext *ctx, arg_movfcsr2gr *a)
 
     CHECK_FPE;
 
-    tcg_gen_ld32u_i64(dest, cpu_env, offsetof(CPULoongArchState, fcsr0));
-    tcg_gen_andi_i64(dest, dest, fcsr_mask[a->fcsrs]);
+    tcg_gen_ld32u_tl(dest, cpu_env, offsetof(CPULoongArchState, fcsr0));
+    tcg_gen_andi_tl(dest, dest, fcsr_mask[a->fcsrs]);
     gen_set_gpr(a->rd, dest, EXT_NONE);
 
     return true;
 }
 
-static void gen_movgr2fr_w(TCGv dest, TCGv src)
+static void gen_movgr2fr_w(TCGv_i64 dest, TCGv src)
 {
+#ifdef TARGET_LOONGARCH32
+    TCGv_i64 src_i64 = tcg_temp_new_i64();
+    tcg_gen_extu_i32_i64(src_i64, src);
+    tcg_gen_deposit_i64(dest, dest, src_i64, 0, 32);
+#else
     tcg_gen_deposit_i64(dest, dest, src, 0, 32);
+#endif
 }
 
-static void gen_movgr2frh_w(TCGv dest, TCGv src)
+static void gen_movgr2frh_w(TCGv_i64 dest, TCGv src)
 {
+#ifdef TARGET_LOONGARCH32
+    TCGv_i64 src_i64 = tcg_temp_new_i64();
+    tcg_gen_extu_i32_i64(src_i64, src);
+    tcg_gen_deposit_i64(dest, dest, src_i64, 32, 32);
+#else
     tcg_gen_deposit_i64(dest, dest, src, 32, 32);
+#endif
 }
 
-static void gen_movfrh2gr_s(TCGv dest, TCGv src)
+static void gen_movfrh2gr_s(TCGv dest, TCGv_i64 src)
 {
+#ifdef TARGET_LOONGARCH32
+    tcg_gen_extrh_i64_i32(dest, src);
+#else
     tcg_gen_sextract_tl(dest, src, 32, 32);
+#endif
 }
 
 static bool trans_movfr2cf(DisasContext *ctx, arg_movfr2cf *a)
 {
-    TCGv t0;
-    TCGv src = get_fpr(ctx, a->fj);
+    TCGv_i64 t0;
+    TCGv_i64 src = get_fpr(ctx, a->fj);
 
     CHECK_FPE;
 
-    t0 = tcg_temp_new();
-    tcg_gen_andi_tl(t0, src, 0x1);
-    tcg_gen_st8_tl(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7]));
+    t0 = tcg_temp_new_i64();
+    tcg_gen_andi_i64(t0, src, 0x1);
+    tcg_gen_st8_i64(t0, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7]));
 
     return true;
 }
 
 static bool trans_movcf2fr(DisasContext *ctx, arg_movcf2fr *a)
 {
-    TCGv dest = get_fpr(ctx, a->fd);
+    TCGv_i64 dest = get_fpr(ctx, a->fd);
 
     CHECK_FPE;
 
-    tcg_gen_ld8u_tl(dest, cpu_env,
+    tcg_gen_ld8u_i64(dest, cpu_env,
                     offsetof(CPULoongArchState, cf[a->cj & 0x7]));
     set_fpr(a->fd, dest);
 
@@ -178,11 +198,15 @@  static bool trans_movcf2gr(DisasContext *ctx, arg_movcf2gr *a)
     return true;
 }
 
-TRANS(fmov_s, gen_f2f, tcg_gen_mov_tl, true)
-TRANS(fmov_d, gen_f2f, tcg_gen_mov_tl, false)
+TRANS(fmov_s, gen_f2f, tcg_gen_mov_i64, true)
+TRANS(fmov_d, gen_f2f, tcg_gen_mov_i64, false)
 TRANS(movgr2fr_w, gen_r2f, gen_movgr2fr_w)
-TRANS(movgr2fr_d, gen_r2f, tcg_gen_mov_tl)
+TRANS_64(movgr2fr_d, gen_r2f, tcg_gen_mov_tl)
 TRANS(movgr2frh_w, gen_r2f, gen_movgr2frh_w)
+#ifdef TARGET_LOONGARCH32
+TRANS(movfr2gr_s, gen_f2r, tcg_gen_extrl_i64_i32)
+#else
 TRANS(movfr2gr_s, gen_f2r, tcg_gen_ext32s_tl)
-TRANS(movfr2gr_d, gen_f2r, tcg_gen_mov_tl)
+#endif
+TRANS_64(movfr2gr_d, gen_f2r, tcg_gen_mov_tl)
 TRANS(movfrh2gr_s, gen_f2r, gen_movfrh2gr_s)
diff --git a/target/loongarch/insn_trans/trans_lsx.c.inc b/target/loongarch/insn_trans/trans_lsx.c.inc
index 68779daff6..25f72460c8 100644
--- a/target/loongarch/insn_trans/trans_lsx.c.inc
+++ b/target/loongarch/insn_trans/trans_lsx.c.inc
@@ -3930,23 +3930,23 @@  static bool trans_vbitseli_b(DisasContext *ctx, arg_vv_i *a)
 }
 
 #define VSET(NAME, COND)                                                       \
-static bool trans_## NAME (DisasContext *ctx, arg_cv *a)                       \
-{                                                                              \
-    TCGv_i64 t1, al, ah;                                                       \
-                                                                               \
-    al = tcg_temp_new_i64();                                                   \
-    ah = tcg_temp_new_i64();                                                   \
-    t1 = tcg_temp_new_i64();                                                   \
-                                                                               \
-    get_vreg64(ah, a->vj, 1);                                                  \
-    get_vreg64(al, a->vj, 0);                                                  \
-                                                                               \
-    CHECK_SXE;                                                                 \
-    tcg_gen_or_i64(t1, al, ah);                                                \
-    tcg_gen_setcondi_i64(COND, t1, t1, 0);                                     \
-    tcg_gen_st8_tl(t1, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7])); \
-                                                                               \
-    return true;                                                               \
+static bool trans_## NAME (DisasContext *ctx, arg_cv *a)                        \
+{                                                                               \
+    TCGv_i64 t1, al, ah;                                                        \
+                                                                                \
+    al = tcg_temp_new_i64();                                                    \
+    ah = tcg_temp_new_i64();                                                    \
+    t1 = tcg_temp_new_i64();                                                    \
+                                                                                \
+    get_vreg64(ah, a->vj, 1);                                                   \
+    get_vreg64(al, a->vj, 0);                                                   \
+                                                                                \
+    CHECK_SXE;                                                                  \
+    tcg_gen_or_i64(t1, al, ah);                                                 \
+    tcg_gen_setcondi_i64(COND, t1, t1, 0);                                      \
+    tcg_gen_st8_i64(t1, cpu_env, offsetof(CPULoongArchState, cf[a->cd & 0x7])); \
+                                                                                \
+    return true;                                                                \
 }
 
 VSET(vseteqz_v, TCG_COND_EQ)
@@ -3965,7 +3965,7 @@  static bool trans_vinsgr2vr_b(DisasContext *ctx, arg_vr_i *a)
 {
     TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_st8_i64(src, cpu_env,
+    tcg_gen_st8_tl(src, cpu_env,
                     offsetof(CPULoongArchState, fpr[a->vd].vreg.B(a->imm)));
     return true;
 }
@@ -3974,7 +3974,7 @@  static bool trans_vinsgr2vr_h(DisasContext *ctx, arg_vr_i *a)
 {
     TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_st16_i64(src, cpu_env,
+    tcg_gen_st16_tl(src, cpu_env,
                     offsetof(CPULoongArchState, fpr[a->vd].vreg.H(a->imm)));
     return true;
 }
@@ -3983,7 +3983,7 @@  static bool trans_vinsgr2vr_w(DisasContext *ctx, arg_vr_i *a)
 {
     TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_st32_i64(src, cpu_env,
+    tcg_gen_st32_tl(src, cpu_env,
                      offsetof(CPULoongArchState, fpr[a->vd].vreg.W(a->imm)));
     return true;
 }
@@ -3992,7 +3992,7 @@  static bool trans_vinsgr2vr_d(DisasContext *ctx, arg_vr_i *a)
 {
     TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_st_i64(src, cpu_env,
+    tcg_gen_st_tl(src, cpu_env,
                    offsetof(CPULoongArchState, fpr[a->vd].vreg.D(a->imm)));
     return true;
 }
@@ -4001,7 +4001,7 @@  static bool trans_vpickve2gr_b(DisasContext *ctx, arg_rv_i *a)
 {
     TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_ld8s_i64(dst, cpu_env,
+    tcg_gen_ld8s_tl(dst, cpu_env,
                      offsetof(CPULoongArchState, fpr[a->vj].vreg.B(a->imm)));
     return true;
 }
@@ -4010,7 +4010,7 @@  static bool trans_vpickve2gr_h(DisasContext *ctx, arg_rv_i *a)
 {
     TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_ld16s_i64(dst, cpu_env,
+    tcg_gen_ld16s_tl(dst, cpu_env,
                       offsetof(CPULoongArchState, fpr[a->vj].vreg.H(a->imm)));
     return true;
 }
@@ -4019,7 +4019,7 @@  static bool trans_vpickve2gr_w(DisasContext *ctx, arg_rv_i *a)
 {
     TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_ld32s_i64(dst, cpu_env,
+    tcg_gen_ld32s_tl(dst, cpu_env,
                       offsetof(CPULoongArchState, fpr[a->vj].vreg.W(a->imm)));
     return true;
 }
@@ -4028,7 +4028,7 @@  static bool trans_vpickve2gr_d(DisasContext *ctx, arg_rv_i *a)
 {
     TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_ld_i64(dst, cpu_env,
+    tcg_gen_ld_tl(dst, cpu_env,
                    offsetof(CPULoongArchState, fpr[a->vj].vreg.D(a->imm)));
     return true;
 }
@@ -4037,7 +4037,7 @@  static bool trans_vpickve2gr_bu(DisasContext *ctx, arg_rv_i *a)
 {
     TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_ld8u_i64(dst, cpu_env,
+    tcg_gen_ld8u_tl(dst, cpu_env,
                      offsetof(CPULoongArchState, fpr[a->vj].vreg.B(a->imm)));
     return true;
 }
@@ -4046,7 +4046,7 @@  static bool trans_vpickve2gr_hu(DisasContext *ctx, arg_rv_i *a)
 {
     TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_ld16u_i64(dst, cpu_env,
+    tcg_gen_ld16u_tl(dst, cpu_env,
                       offsetof(CPULoongArchState, fpr[a->vj].vreg.H(a->imm)));
     return true;
 }
@@ -4055,7 +4055,7 @@  static bool trans_vpickve2gr_wu(DisasContext *ctx, arg_rv_i *a)
 {
     TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_ld32u_i64(dst, cpu_env,
+    tcg_gen_ld32u_tl(dst, cpu_env,
                       offsetof(CPULoongArchState, fpr[a->vj].vreg.W(a->imm)));
     return true;
 }
@@ -4064,7 +4064,7 @@  static bool trans_vpickve2gr_du(DisasContext *ctx, arg_rv_i *a)
 {
     TCGv dst = gpr_dst(ctx, a->rd, EXT_NONE);
     CHECK_SXE;
-    tcg_gen_ld_i64(dst, cpu_env,
+    tcg_gen_ld_tl(dst, cpu_env,
                    offsetof(CPULoongArchState, fpr[a->vj].vreg.D(a->imm)));
     return true;
 }
@@ -4074,7 +4074,7 @@  static bool gvec_dup(DisasContext *ctx, arg_vr *a, MemOp mop)
     TCGv src = gpr_src(ctx, a->rj, EXT_NONE);
     CHECK_SXE;
 
-    tcg_gen_gvec_dup_i64(mop, vec_full_offset(a->vd),
+    tcg_gen_gvec_dup_tl(mop, vec_full_offset(a->vd),
                          16, ctx->vl/8, src);
     return true;
 }
@@ -4131,7 +4131,8 @@  static bool gen_vreplve(DisasContext *ctx, arg_vvr *a, int vece, int bit,
 
     CHECK_SXE;
 
-    tcg_gen_andi_i64(t0, gpr_src(ctx, a->rk, EXT_NONE), (LSX_LEN/bit) -1);
+    tcg_gen_extu_tl_i64(t0, gpr_src(ctx, a->rk, EXT_NONE));
+    tcg_gen_andi_i64(t0, t0, (LSX_LEN / bit) - 1);
     tcg_gen_shli_i64(t0, t0, vece);
     if (HOST_BIG_ENDIAN) {
         tcg_gen_xori_i64(t0, t0, vece << ((LSX_LEN/bit) -1));
diff --git a/target/loongarch/iocsr_helper.c b/target/loongarch/iocsr_helper.c
index dda9845d6c..32cf3204b2 100644
--- a/target/loongarch/iocsr_helper.c
+++ b/target/loongarch/iocsr_helper.c
@@ -16,25 +16,25 @@ 
 #define GET_MEMTXATTRS(cas) \
         ((MemTxAttrs){.requester_id = env_cpu(cas)->cpu_index})
 
-uint64_t helper_iocsrrd_b(CPULoongArchState *env, target_ulong r_addr)
+target_ulong helper_iocsrrd_b(CPULoongArchState *env, target_ulong r_addr)
 {
     return address_space_ldub(&env->address_space_iocsr, r_addr,
                               GET_MEMTXATTRS(env), NULL);
 }
 
-uint64_t helper_iocsrrd_h(CPULoongArchState *env, target_ulong r_addr)
+target_ulong helper_iocsrrd_h(CPULoongArchState *env, target_ulong r_addr)
 {
     return address_space_lduw(&env->address_space_iocsr, r_addr,
                               GET_MEMTXATTRS(env), NULL);
 }
 
-uint64_t helper_iocsrrd_w(CPULoongArchState *env, target_ulong r_addr)
+target_ulong helper_iocsrrd_w(CPULoongArchState *env, target_ulong r_addr)
 {
     return address_space_ldl(&env->address_space_iocsr, r_addr,
                              GET_MEMTXATTRS(env), NULL);
 }
 
-uint64_t helper_iocsrrd_d(CPULoongArchState *env, target_ulong r_addr)
+target_ulong helper_iocsrrd_d(CPULoongArchState *env, target_ulong r_addr)
 {
     return address_space_ldq(&env->address_space_iocsr, r_addr,
                              GET_MEMTXATTRS(env), NULL);
diff --git a/target/loongarch/machine.c b/target/loongarch/machine.c
index d8ac99c9a4..31b9635bc4 100644
--- a/target/loongarch/machine.c
+++ b/target/loongarch/machine.c
@@ -99,61 +99,61 @@  const VMStateDescription vmstate_loongarch_cpu = {
         VMSTATE_UINTTL(env.pc, LoongArchCPU),
 
         /* Remaining CSRs */
-        VMSTATE_UINT64(env.CSR_CRMD, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PRMD, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_EUEN, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_MISC, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_ECFG, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_ESTAT, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_ERA, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_BADV, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_BADI, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_EENTRY, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBIDX, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBEHI, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBELO0, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBELO1, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_ASID, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PGDL, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PGDH, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PGD, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PWCL, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PWCH, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_STLBPS, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_RVACFG, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PRCFG1, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PRCFG2, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_PRCFG3, LoongArchCPU),
-        VMSTATE_UINT64_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
-        VMSTATE_UINT64(env.CSR_TID, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TCFG, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TVAL, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_CNTC, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TICLR, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_LLBCTL, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_IMPCTL1, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_IMPCTL2, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBRENTRY, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBRBADV, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBRERA, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBRSAVE, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBRELO0, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBRELO1, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBREHI, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_TLBRPRMD, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_MERRCTL, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_MERRINFO1, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_MERRINFO2, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_MERRENTRY, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_MERRERA, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_MERRSAVE, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_CTAG, LoongArchCPU),
-        VMSTATE_UINT64_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
+        VMSTATE_UINTTL(env.CSR_CRMD, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PRMD, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_EUEN, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_MISC, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_ECFG, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_ESTAT, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_ERA, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_BADV, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_BADI, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_EENTRY, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBIDX, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBEHI, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBELO0, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBELO1, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_ASID, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PGDL, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PGDH, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PGD, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PWCL, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PWCH, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_STLBPS, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_RVACFG, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PRCFG1, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PRCFG2, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_PRCFG3, LoongArchCPU),
+        VMSTATE_UINTTL_ARRAY(env.CSR_SAVE, LoongArchCPU, 16),
+        VMSTATE_UINTTL(env.CSR_TID, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TCFG, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TVAL, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_CNTC, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TICLR, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_LLBCTL, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_IMPCTL1, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_IMPCTL2, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBRENTRY, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBRBADV, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBRERA, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBRSAVE, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBRELO0, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBRELO1, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBREHI, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_TLBRPRMD, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_MERRCTL, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_MERRINFO1, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_MERRINFO2, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_MERRENTRY, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_MERRERA, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_MERRSAVE, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_CTAG, LoongArchCPU),
+        VMSTATE_UINTTL_ARRAY(env.CSR_DMW, LoongArchCPU, 4),
 
         /* Debug CSRs */
-        VMSTATE_UINT64(env.CSR_DBG, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_DERA, LoongArchCPU),
-        VMSTATE_UINT64(env.CSR_DSAVE, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_DBG, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_DERA, LoongArchCPU),
+        VMSTATE_UINTTL(env.CSR_DSAVE, LoongArchCPU),
         /* TLB */
         VMSTATE_STRUCT_ARRAY(env.tlb, LoongArchCPU, LOONGARCH_TLB_MAX,
                              0, vmstate_tlb, LoongArchTLB),
diff --git a/target/loongarch/op_helper.c b/target/loongarch/op_helper.c
index 60335a05e2..61dbddc501 100644
--- a/target/loongarch/op_helper.c
+++ b/target/loongarch/op_helper.c
@@ -62,7 +62,7 @@  void helper_asrtgt_d(CPULoongArchState *env, target_ulong rj, target_ulong rk)
     }
 }
 
-target_ulong helper_crc32(target_ulong val, target_ulong m, uint64_t sz)
+target_ulong helper_crc32(target_ulong val, target_ulong m, target_ulong sz)
 {
     uint8_t buf[8];
     target_ulong mask = ((sz * 8) == 64) ? -1ULL : ((1ULL << (sz * 8)) - 1);
@@ -72,7 +72,7 @@  target_ulong helper_crc32(target_ulong val, target_ulong m, uint64_t sz)
     return (int32_t) (crc32(val ^ 0xffffffff, buf, sz) ^ 0xffffffff);
 }
 
-target_ulong helper_crc32c(target_ulong val, target_ulong m, uint64_t sz)
+target_ulong helper_crc32c(target_ulong val, target_ulong m, target_ulong sz)
 {
     uint8_t buf[8];
     target_ulong mask = ((sz * 8) == 64) ? -1ULL : ((1ULL << (sz * 8)) - 1);
@@ -86,7 +86,7 @@  target_ulong helper_cpucfg(CPULoongArchState *env, target_ulong rj)
     return rj >= ARRAY_SIZE(env->cpucfg) ? 0 : env->cpucfg[rj];
 }
 
-uint64_t helper_rdtime_d(CPULoongArchState *env)
+target_ulong helper_rdtime_d(CPULoongArchState *env)
 {
 #ifdef CONFIG_USER_ONLY
     return cpu_get_host_ticks();
diff --git a/target/loongarch/tlb_helper.c b/target/loongarch/tlb_helper.c
index 6e00190547..8c13e80fd3 100644
--- a/target/loongarch/tlb_helper.c
+++ b/target/loongarch/tlb_helper.c
@@ -166,6 +166,17 @@  static int loongarch_map_address(CPULoongArchState *env, hwaddr *physical,
     return TLBRET_NOMATCH;
 }
 
+static target_ulong dmw_va2pa(target_ulong va, target_ulong dmw)
+{
+#ifdef TARGET_LOONGARCH32
+    uint32_t pseg = FIELD_EX32(dmw, CSR_DMW_32, PSEG);
+    return (va & MAKE_64BIT_MASK(0, R_CSR_DMW_32_VSEG_SHIFT)) | \
+        (pseg << R_CSR_DMW_32_VSEG_SHIFT);
+#else
+    return va & TARGET_PHYS_MASK;
+#endif
+}
+
 static int get_physical_address(CPULoongArchState *env, hwaddr *physical,
                                 int *prot, target_ulong address,
                                 MMUAccessType access_type, int mmu_idx)
@@ -185,12 +196,20 @@  static int get_physical_address(CPULoongArchState *env, hwaddr *physical,
     }
 
     plv = kernel_mode | (user_mode << R_CSR_DMW_PLV3_SHIFT);
-    base_v = address >> R_CSR_DMW_VSEG_SHIFT;
+#ifdef TARGET_LOONGARCH32
+    base_v = address >> R_CSR_DMW_32_VSEG_SHIFT;
+#else
+    base_v = address >> R_CSR_DMW_64_VSEG_SHIFT;
+#endif
     /* Check direct map window */
     for (int i = 0; i < 4; i++) {
-        base_c = FIELD_EX64(env->CSR_DMW[i], CSR_DMW, VSEG);
+#ifdef TARGET_LOONGARCH32
+        base_c = FIELD_EX32(env->CSR_DMW[i], CSR_DMW_32, VSEG);
+#else
+        base_c = FIELD_EX64(env->CSR_DMW[i], CSR_DMW_64, VSEG);
+#endif
         if ((plv & env->CSR_DMW[i]) && (base_c == base_v)) {
-            *physical = dmw_va2pa(address);
+            *physical = dmw_va2pa(address, env->CSR_DMW[i]);
             *prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC;
             return TLBRET_MATCH;
         }
diff --git a/target/loongarch/translate.c b/target/loongarch/translate.c
index 3146a2d4ac..3557963df7 100644
--- a/target/loongarch/translate.c
+++ b/target/loongarch/translate.c
@@ -191,15 +191,15 @@  static void gen_set_gpr(int reg_num, TCGv t, DisasExtend dst_ext)
     }
 }
 
-static TCGv get_fpr(DisasContext *ctx, int reg_num)
+static TCGv_i64 get_fpr(DisasContext *ctx, int reg_num)
 {
-    TCGv t = tcg_temp_new();
+    TCGv_i64 t = tcg_temp_new_i64();
     tcg_gen_ld_i64(t, cpu_env,
                    offsetof(CPULoongArchState, fpr[reg_num].vreg.D(0)));
     return  t;
 }
 
-static void set_fpr(int reg_num, TCGv val)
+static void set_fpr(int reg_num, TCGv_i64 val)
 {
     tcg_gen_st_i64(val, cpu_env,
                    offsetof(CPULoongArchState, fpr[reg_num].vreg.D(0)));
diff --git a/target/loongarch/translate.h b/target/loongarch/translate.h
index 7f60090580..4e45e3e434 100644
--- a/target/loongarch/translate.h
+++ b/target/loongarch/translate.h
@@ -14,6 +14,15 @@ 
     static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \
     { return FUNC(ctx, a, __VA_ARGS__); }
 
+/* for LoongArch64-only instructions */
+#ifdef TARGET_LOONGARCH64
+#define TRANS_64(NAME, FUNC, ...) TRANS(NAME, FUNC, __VA_ARGS__)
+#else
+#define TRANS_64(NAME, FUNC, ...) \
+    static bool trans_##NAME(DisasContext *ctx, arg_##NAME * a) \
+    { return false; }
+#endif
+
 /*
  * If an operation is being performed on less than TARGET_LONG_BITS,
  * it may require the inputs to be sign- or zero-extended; which will