These series patches introduce LoongArch32(LA32) ilp32d abi and LoongArch32
Reduced(LA32R) ilp32s abi.
The ilp32 abi is similar to lp64 abi[1], with some differences in details.

Most gcc testcasese has passed when using qemu-user.

A LA32 linux system based on qemu is here[2]. 
The binutils and glibc sources is here[3] [4].
A LA32 instruction set manual is here [5] or in any LA64 manual.
A Chinese LA32R instruction set manual is here[6].

[1] https://github.com/loongson/la-abi-specs/tree/release
[2] 
https://github.com/sunhaiyong1978/CLFS-for-LoongArch32/blob/main/Qemu_For_LoongArch32-Simple.md
[3] https://github.com/cloudspurs/binutils-gdb/tree/la32
[4] https://github.com/cloudspurs/glibc/tree/la32
[5] 
https://github.com/loongson/LoongArch-Documentation/blob/main/docs/LoongArch-Vol1-EN/basic-integer-instructions/overview-of-basic-integer-instructions.adoc
[6] 
https://www.loongson.cn/uploads/images/2025032109211238668.%E9%BE%99%E6%9E%B6%E6%9E%8432%E4%BD%8D%E7%B2%BE%E7%AE%80%E7%89%88%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C_r1p04.pdf

Changes v1 -> v2:
- Rebase to master branch. 
- Some modifies base on Xi Ruoyao.
- Add some testcases.

Jiajie Chen (8):
  LoongArch: Set long double width to 128 in la32
  LoongArch: Fix addsi3 pattern for loongarch32
  LoongArch: Allow lo_sum to be used with DF in LoongArch32 with 64-bit
    FPU
  LoongArch: Fix 64-bit immediate move for loongarch32 target
  LoongArch: Disable SF/DF -> unsigned DI expand in loongarch32
  LoongArch: Forbid ADDRESS_REG_REG in loongarch32
  LoongArch: Fix ilp32 detection
  LoongArch: Fix signed 32-bit overflow for loongarch32 target

mengqinggang (25):
  LoongArch: Introduce LoongArch32 target
  LoongArch: Fix 64-bit move for loongarch32 target
  LoongArch: Disable extreme code model for crtbeginS.o on LA32
  LoongArch: Forbid stptr/ldptr instructions on LA32
  LoongArch: Disable const_imm16_operand in loongarch_valid_offset_p
  LoongArch: Disable ZC constraint for movsi on LA32.
  LoongArch: Forbid stptr/ldptr when enable -fshrink-wrap.
  LoongArch: Disable k constraint on LA32
  LoongArch: Add support for atomic on LA32
  LoongArch: Add LA32 support for larchintrin.h
  LoongArch: Change MAX_FIXED_MODE_SIZE to 64 on la32
  LoongArch: Use DFmode to save or restore float registers on ilp32d ABI
  LoongArch: Fix nested function on LA32
  LoongArch: XALLOCAVEC allocate to large space on stack
  LoongArch: Let struct pass by registers
  LoongArch: Fix redundant SI sign_extend in
    atomic_compare_and_swap<mode>
  LoongArch: Disable mlsx, mlasx, msimd, extreme code mode on LA32
  LoongArch: Add support for TLS descriptors on LA32
  LoongArch: Fix fail testcases on LA32
  LoongArch: Add support for la32r ilp32s abi
  LoongArch: Fix uint64_t a & 0xfffffffffff on LA32
  LoongArch: Add support for call30 on LA32
  LoongArch: LA32 does not support BitInt
  LoongArch: Add loongarch_sx condition to vector testcases
  LoongArch: Add loongarch64 and double float condition

 contrib/config-list.mk                        |   1 +
 gcc/config.gcc                                |  48 +-
 gcc/config/loongarch/constraints.md           |   1 +
 .../loongarch/genopts/loongarch-strings       |  10 +
 gcc/config/loongarch/genopts/loongarch.opt.in |  24 +
 gcc/config/loongarch/gnu-user.h               |   3 +
 gcc/config/loongarch/larchintrin.h            |  21 +-
 gcc/config/loongarch/linux.h                  |   8 +-
 gcc/config/loongarch/loongarch-c.cc           |   5 +
 gcc/config/loongarch/loongarch-def.cc         |  51 +-
 gcc/config/loongarch/loongarch-def.h          |  28 +-
 gcc/config/loongarch/loongarch-driver.h       |   4 +
 gcc/config/loongarch/loongarch-opts.cc        |  53 ++-
 gcc/config/loongarch/loongarch-opts.h         |  19 +-
 gcc/config/loongarch/loongarch-str.h          |  10 +
 gcc/config/loongarch/loongarch.cc             | 129 +++--
 gcc/config/loongarch/loongarch.h              |  18 +-
 gcc/config/loongarch/loongarch.md             | 444 +++++++++++++-----
 gcc/config/loongarch/loongarch.opt            |  24 +
 gcc/config/loongarch/predicates.md            |  10 +-
 gcc/config/loongarch/sync.md                  | 200 ++++++--
 gcc/config/loongarch/t-linux                  |   6 +
 gcc/testsuite/g++.target/loongarch/bytepick.C |   2 +-
 gcc/testsuite/g++.target/loongarch/got-load.C |   2 +-
 gcc/testsuite/g++.target/loongarch/pr106828.C |   2 +-
 .../g++.target/loongarch/vect-ashr-lshr.C     |   1 +
 gcc/testsuite/gcc.dg/ifcvt-4.c                |   2 +-
 gcc/testsuite/gcc.dg/stack-usage-1.c          |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/gen-vect-2.c    |   2 -
 gcc/testsuite/gcc.dg/tree-ssa/gen-vect-25.c   |   2 -
 gcc/testsuite/gcc.dg/tree-ssa/pr83403-1.c     |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr83403-2.c     |   2 +-
 gcc/testsuite/gcc.target/loongarch/abd-lasx.c |   1 +
 gcc/testsuite/gcc.target/loongarch/abd-lsx.c  |   1 +
 .../gcc.target/loongarch/add-const.c          |   2 +-
 .../gcc.target/loongarch/alsl-cost.c          |   2 +-
 gcc/testsuite/gcc.target/loongarch/alsl_wu.c  |   2 +-
 gcc/testsuite/gcc.target/loongarch/and.c      |   7 +
 .../gcc.target/loongarch/arch-func-attr-1.c   |   2 +-
 .../gcc.target/loongarch/arch-pragma-attr-1.c |   2 +-
 .../gcc.target/loongarch/array-ldx.c          |   6 +
 .../gcc.target/loongarch/attr-model-1.c       |   1 +
 .../gcc.target/loongarch/attr-model-2.c       |   1 +
 .../gcc.target/loongarch/attr-model-3.c       |   1 +
 .../gcc.target/loongarch/attr-model-4.c       |   1 +
 .../gcc.target/loongarch/attr-model-5.c       |   1 +
 .../gcc.target/loongarch/avg-ceil-lasx.c      |   1 +
 .../gcc.target/loongarch/avg-ceil-lsx.c       |   1 +
 .../gcc.target/loongarch/avg-floor-lasx.c     |   1 +
 .../gcc.target/loongarch/avg-floor-lsx.c      |   1 +
 .../gcc.target/loongarch/bitint-args.c        |  14 +-
 .../loongarch/bitwise-shift-reassoc.c         |   2 +-
 .../gcc.target/loongarch/bitwise_extend.c     |   2 +-
 .../gcc.target/loongarch/bstrins-1.c          |   2 +-
 .../gcc.target/loongarch/bstrins-2.c          |   2 +-
 .../gcc.target/loongarch/bstrins-3.c          |   2 +-
 .../gcc.target/loongarch/bstrins-4.c          |   2 +-
 .../loongarch/bstrpick_alsl_paired.c          |   2 +-
 .../gcc.target/loongarch/bytepick_combine.c   |   1 +
 .../gcc.target/loongarch/bytepick_shift_128.c |   2 +-
 .../gcc.target/loongarch/can_inline_1.c       |   2 +-
 .../gcc.target/loongarch/can_inline_2.c       |   2 +-
 .../gcc.target/loongarch/can_inline_3.c       |   2 +-
 .../gcc.target/loongarch/can_inline_4.c       |   2 +-
 .../gcc.target/loongarch/can_inline_5.c       |   2 +-
 .../gcc.target/loongarch/can_inline_6.c       |   2 +-
 .../gcc.target/loongarch/cmodel-extreme-1.c   |   2 +-
 .../gcc.target/loongarch/cmodel-extreme-2.c   |   2 +-
 .../gcc.target/loongarch/cmodel-func-attr-1.c |   2 +-
 .../loongarch/cmodel-pragma-attr-1.c          |   2 +-
 gcc/testsuite/gcc.target/loongarch/cmov_ii.c  |   4 +-
 .../loongarch/conditional-move-opt-1.c        |   2 +-
 .../loongarch/conditional-move-opt-2.c        |   2 +-
 .../loongarch/const-double-zero-stx.c         |   1 +
 gcc/testsuite/gcc.target/loongarch/crc-sext.c |   2 +-
 .../gcc.target/loongarch/div-div32.c          |   2 +-
 .../gcc.target/loongarch/div-no-div32.c       |   2 +-
 gcc/testsuite/gcc.target/loongarch/divf.c     |   1 +
 .../explicit-relocs-auto-extreme-tls-desc.c   |   1 +
 ...explicit-relocs-auto-single-load-store-2.c |   2 +-
 ...-relocs-auto-single-load-store-no-anchor.c |   2 +-
 .../explicit-relocs-auto-single-load-store.c  |   2 +-
 .../explicit-relocs-extreme-auto-tls-ld-gd.c  |   1 +
 .../explicit-relocs-extreme-tls-desc.c        |   1 +
 ...icit-relocs-medium-call36-auto-tls-ld-gd.c |   2 +-
 .../loongarch/explicit-relocs-tls-desc.c      |   9 +-
 .../gcc.target/loongarch/fclass-compile.c     |   2 +-
 .../gcc.target/loongarch/float-load.c         |   1 +
 gcc/testsuite/gcc.target/loongarch/flogb.c    |   2 +-
 .../gcc.target/loongarch/flt-abi-isa-1.c      |   2 +-
 .../gcc.target/loongarch/flt-abi-isa-2.c      |   2 +-
 .../gcc.target/loongarch/flt-abi-isa-3.c      |   2 +-
 .../gcc.target/loongarch/flt-abi-isa-4.c      |   2 +-
 gcc/testsuite/gcc.target/loongarch/frint.c    |   2 +-
 gcc/testsuite/gcc.target/loongarch/fscaleb.c  |   2 +-
 .../gcc.target/loongarch/ftint-no-inexact.c   |   2 +-
 gcc/testsuite/gcc.target/loongarch/ftint.c    |   2 +-
 .../gcc.target/loongarch/func-call-1.c        |   2 +-
 .../gcc.target/loongarch/func-call-2.c        |   2 +-
 .../gcc.target/loongarch/func-call-3.c        |   2 +-
 .../gcc.target/loongarch/func-call-4.c        |   2 +-
 .../gcc.target/loongarch/func-call-5.c        |   2 +-
 .../gcc.target/loongarch/func-call-6.c        |   2 +-
 .../gcc.target/loongarch/func-call-7.c        |   2 +-
 .../gcc.target/loongarch/func-call-8.c        |   2 +-
 .../loongarch/func-call-extreme-1.c           |   2 +-
 .../loongarch/func-call-extreme-2.c           |   2 +-
 .../loongarch/func-call-extreme-3.c           |   2 +-
 .../loongarch/func-call-extreme-4.c           |   2 +-
 .../loongarch/func-call-extreme-5.c           |   2 +-
 .../loongarch/func-call-extreme-6.c           |   2 +-
 .../gcc.target/loongarch/func-call-medium-1.c |   2 +-
 .../gcc.target/loongarch/func-call-medium-2.c |   2 +-
 .../gcc.target/loongarch/func-call-medium-3.c |   2 +-
 .../gcc.target/loongarch/func-call-medium-5.c |   2 +-
 .../gcc.target/loongarch/func-call-medium-6.c |   2 +-
 .../gcc.target/loongarch/func-call-medium-7.c |   2 +-
 .../gcc.target/loongarch/func-call-medium-8.c |   2 +-
 .../loongarch/func-call-medium-call36-1.c     |   2 +-
 .../loongarch/func-call-medium-call36.c       |   2 +-
 gcc/testsuite/gcc.target/loongarch/imm-load.c |   2 +-
 .../gcc.target/loongarch/imm-load1.c          |   2 +-
 .../gcc.target/loongarch/invariant-recip.c    |   2 +-
 .../gcc.target/loongarch/larch-builtin.c      |  72 +--
 .../loongarch/larch-frecipe-builtin.c         |   2 +-
 .../loongarch/larch-frecipe-intrinsic.c       |   2 +-
 .../gcc.target/loongarch/lasx-andn-iorn.c     |   1 +
 .../loongarch/lasx-extract-even_odd-opt.c     |   1 +
 .../gcc.target/loongarch/lasx-func-attr-1.c   |   2 +-
 .../gcc.target/loongarch/lasx-func-attr-2.c   |   1 +
 .../gcc.target/loongarch/lasx-pragma-attr-1.c |   2 +-
 .../gcc.target/loongarch/lasx-pragma-attr-2.c |   1 +
 .../gcc.target/loongarch/lsx-andn-iorn.c      |   1 +
 .../gcc.target/loongarch/lsx-func-attr-1.c    |   2 +-
 .../gcc.target/loongarch/lsx-func-attr-2.c    |   1 +
 .../gcc.target/loongarch/lsx-pragma-attr-1.c  |   2 +-
 .../gcc.target/loongarch/lsx-pragma-attr-2.c  |   1 +
 .../gcc.target/loongarch/math-float-128.c     |   2 +-
 .../gcc.target/loongarch/memcpy-vec-1.c       |   2 +-
 .../gcc.target/loongarch/memcpy-vec-2.c       |   2 +-
 .../gcc.target/loongarch/memcpy-vec-3.c       |   2 +-
 .../gcc.target/loongarch/mov-zero-1.c         |   1 +
 .../gcc.target/loongarch/mov-zero-2.c         |   4 +-
 .../gcc.target/loongarch/movcf2gr-via-fr.c    |   2 +-
 gcc/testsuite/gcc.target/loongarch/movcf2gr.c |   2 +-
 .../loongarch/mul-const-reduction.c           |   2 +-
 gcc/testsuite/gcc.target/loongarch/mulw_d_w.c |   2 +-
 .../gcc.target/loongarch/mulw_d_wu.c          |   2 +-
 gcc/testsuite/gcc.target/loongarch/popcnt.c   |   1 +
 gcc/testsuite/gcc.target/loongarch/popcount.c |   1 +
 .../gcc.target/loongarch/pr109465-1.c         |   2 +-
 .../gcc.target/loongarch/pr109465-2.c         |   2 +-
 .../gcc.target/loongarch/pr109465-3.c         |   2 +-
 .../gcc.target/loongarch/pr112476-1.c         |   3 +-
 .../gcc.target/loongarch/pr112476-2.c         |   3 +-
 .../gcc.target/loongarch/pr112476-3.c         |   1 +
 .../gcc.target/loongarch/pr112476-4.c         |   1 +
 gcc/testsuite/gcc.target/loongarch/pr113033.c |   1 +
 gcc/testsuite/gcc.target/loongarch/pr113148.c |   2 +-
 gcc/testsuite/gcc.target/loongarch/pr114861.c |   2 +-
 gcc/testsuite/gcc.target/loongarch/pr115752.c |   1 +
 gcc/testsuite/gcc.target/loongarch/pr118561.c |   2 +-
 .../gcc.target/loongarch/pr118828-2.c         |   2 +-
 .../gcc.target/loongarch/pr118828-3.c         |   2 +-
 .../gcc.target/loongarch/pr118828-4.c         |   2 +-
 gcc/testsuite/gcc.target/loongarch/pr118828.c |   2 +-
 gcc/testsuite/gcc.target/loongarch/pr119127.c |   2 +-
 gcc/testsuite/gcc.target/loongarch/pr121064.c |   2 +-
 gcc/testsuite/gcc.target/loongarch/pr121542.c |   2 +-
 gcc/testsuite/gcc.target/loongarch/pr121634.c |   2 +-
 gcc/testsuite/gcc.target/loongarch/pr121875.c |   2 +-
 .../gcc.target/loongarch/pragma-push-pop.c    |   1 +
 .../gcc.target/loongarch/prolog-opt.c         |   2 +-
 .../gcc.target/loongarch/recip-divf.c         |   2 +-
 .../gcc.target/loongarch/recip-sqrtf.c        |   2 +-
 .../loongarch/relocs-symbol-noaddend.c        |   2 +-
 gcc/testsuite/gcc.target/loongarch/revb.c     |   2 +-
 .../gcc.target/loongarch/rotl-with-rotr.c     |   2 +-
 .../gcc.target/loongarch/rotl-with-vrotr-b.c  |   1 +
 .../gcc.target/loongarch/rotl-with-vrotr-d.c  |   1 +
 .../gcc.target/loongarch/rotl-with-vrotr-h.c  |   1 +
 .../gcc.target/loongarch/rotl-with-vrotr-w.c  |   1 +
 .../gcc.target/loongarch/rotl-with-xvrotr-b.c |   1 +
 .../gcc.target/loongarch/rotl-with-xvrotr-d.c |   1 +
 .../gcc.target/loongarch/rotl-with-xvrotr-h.c |   1 +
 .../gcc.target/loongarch/rotl-with-xvrotr-w.c |   1 +
 gcc/testsuite/gcc.target/loongarch/rotrw.c    |   2 +-
 gcc/testsuite/gcc.target/loongarch/sad-lasx.c |   1 +
 gcc/testsuite/gcc.target/loongarch/sad-lsx.c  |   1 +
 .../gcc.target/loongarch/sign-extend-1.c      |   2 +-
 .../gcc.target/loongarch/sign-extend-2.c      |   2 +-
 .../loongarch/sign-extend-bitwise.c           |   2 +-
 .../gcc.target/loongarch/slt-sign-extend.c    |   2 +-
 .../gcc.target/loongarch/smuldi3_highpart.c   |   2 +-
 gcc/testsuite/gcc.target/loongarch/sqrtf.c    |   1 +
 .../gcc.target/loongarch/strict-align.c       |   1 +
 .../gcc.target/loongarch/switch-qi.c          |   2 +-
 .../gcc.target/loongarch/tls-extreme-macro.c  |   2 +-
 .../gcc.target/loongarch/tls-gd-noplt.c       |   3 +-
 .../gcc.target/loongarch/tls-ie-extreme.c     |   2 +-
 .../gcc.target/loongarch/trunc_int_for_mode.c |  17 +
 .../loongarch/vec_pack_unpack_128.c           |   1 +
 .../loongarch/vec_pack_unpack_256.c           |   1 +
 .../gcc.target/loongarch/vect-extract.c       |   1 +
 .../loongarch/vect-frint-no-inexact.c         |   3 +-
 .../loongarch/vect-frint-scalar-no-inexact.c  |   1 +
 .../gcc.target/loongarch/vect-frint-scalar.c  |   1 +
 .../gcc.target/loongarch/vect-frint.c         |   3 +-
 .../loongarch/vect-ftint-no-inexact.c         |   3 +-
 .../gcc.target/loongarch/vect-ftint.c         |   3 +-
 .../gcc.target/loongarch/vect-ld-st-imm12.c   |   3 +-
 gcc/testsuite/gcc.target/loongarch/vect-muh.c |   1 +
 .../gcc.target/loongarch/vect-rotr.c          |   1 +
 .../loongarch/vect-shift-imm-round.c          |   1 +
 .../gcc.target/loongarch/vect-shuf-fp.c       |   1 +
 .../loongarch/vect-slp-two-operator.c         |   1 +
 .../gcc.target/loongarch/vect-widen-add.c     |   1 +
 .../gcc.target/loongarch/vect-widen-mul.c     |   1 +
 .../gcc.target/loongarch/vect-widen-sub.c     |   1 +
 .../gcc.target/loongarch/vector-func-attr-1.c |   1 +
 .../loongarch/vector-pragma-attr-1.c          |   1 +
 .../loongarch/vector/loongarch-vector.exp     |   2 +-
 gcc/testsuite/gcc.target/loongarch/vfcmp-d.c  |   1 +
 gcc/testsuite/gcc.target/loongarch/vfcmp-f.c  |   1 +
 .../gcc.target/loongarch/vfmax-vfmin.c        |   1 +
 gcc/testsuite/gcc.target/loongarch/vrepli.c   |   1 +
 .../gcc.target/loongarch/wide-mul-reduc-1.c   |   1 +
 .../gcc.target/loongarch/wide-mul-reduc-2.c   |   1 +
 gcc/testsuite/gcc.target/loongarch/xorsign.c  |   1 +
 gcc/testsuite/gcc.target/loongarch/xvfcmp-d.c |   1 +
 gcc/testsuite/gcc.target/loongarch/xvfcmp-f.c |   1 +
 .../loongarch/zero-size-field-pass.c          |   2 +-
 .../loongarch/zero-size-field-ret.c           |   2 +-
 gcc/testsuite/lib/target-supports.exp         |  24 +-
 include/longlong.h                            |   6 +-
 libgcc/config/loongarch/t-crtstuff-la32       |  11 +
 .../loongarch/{t-crtstuff => t-crtstuff-la64} |   0
 libgcc/configure                              |  12 +
 libgcc/configure.ac                           |  12 +
 libitm/config/loongarch/asm.h                 |   2 +-
 240 files changed, 1216 insertions(+), 445 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/loongarch/and.c
 create mode 100644 gcc/testsuite/gcc.target/loongarch/array-ldx.c
 create mode 100644 gcc/testsuite/gcc.target/loongarch/trunc_int_for_mode.c
 create mode 100644 libgcc/config/loongarch/t-crtstuff-la32
 rename libgcc/config/loongarch/{t-crtstuff => t-crtstuff-la64} (100%)

-- 
2.34.1

Reply via email to