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
