From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 7891) id 0DBA0386E9C0; Thu, 1 Sep 2022 01:10:42 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0DBA0386E9C0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1661994642; bh=NB2diD9w1FGm/AoOZfkE4KVA6UTbbNgMUE0A7IVDrn4=; h=From:To:Subject:Date:From; b=tA/eSnI8EkUm+AE2Po/MuaWoeKUFqh7igs3VWp4841tGJeD3sfmDk1xuUNDc5HAEy pHkH05ZiITD2hheYZKqy86ujoPx5OxFDQduxwkjsRJ7NJZD7bESrTtnNwHS8VxNIwM rNDL9oJBSRY+gnW0sS6gwGCQOsI5OQumX6Z5PHVI= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Yinyu Cai To: glibc-cvs@sourceware.org Subject: [glibc] LoongArch: Add soft float support. X-Act-Checkin: glibc X-Git-Author: caiyinyu X-Git-Refname: refs/heads/master X-Git-Oldrev: 1e903124cec4492463d075c6c061a2a772db77bf X-Git-Newrev: 930993921f2f381b545ea1b1f2d9c534b2b72b08 Message-Id: <20220901011042.0DBA0386E9C0@sourceware.org> Date: Thu, 1 Sep 2022 01:10:42 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=930993921f2f381b545ea1b1f2d9c534b2b72b08 commit 930993921f2f381b545ea1b1f2d9c534b2b72b08 Author: caiyinyu Date: Mon Aug 22 16:00:51 2022 +0800 LoongArch: Add soft float support. Diff: --- scripts/build-many-glibcs.py | 4 ++ sysdeps/loongarch/Makefile | 8 ---- sysdeps/loongarch/__longjmp.S | 2 + sysdeps/loongarch/bits/setjmp.h | 3 ++ sysdeps/loongarch/dl-trampoline.S | 11 ++++- sysdeps/loongarch/fpu_control.h | 13 ++++++ sysdeps/loongarch/nofpu/Implies | 1 + sysdeps/loongarch/nofpu/math-tests-exceptions.h | 28 +++++++++++++ sysdeps/loongarch/nofpu/math-tests-rounding.h | 27 ++++++++++++ sysdeps/loongarch/preconfigure | 1 - sysdeps/loongarch/preconfigure.ac | 1 - sysdeps/loongarch/setjmp.S | 2 + sysdeps/unix/sysv/linux/loongarch/Makefile | 9 ++++ sysdeps/unix/sysv/linux/loongarch/configure | 51 +++++++++++++++++++++-- sysdeps/unix/sysv/linux/loongarch/configure.ac | 22 ++++++++-- sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed | 2 +- sysdeps/unix/sysv/linux/loongarch/shlib-versions | 2 + 17 files changed, 168 insertions(+), 19 deletions(-) diff --git a/scripts/build-many-glibcs.py b/scripts/build-many-glibcs.py index 98f02104a2..db632b18a3 100755 --- a/scripts/build-many-glibcs.py +++ b/scripts/build-many-glibcs.py @@ -222,6 +222,10 @@ class Context(object): os_name='linux-gnu', variant='lp64d', gcc_cfg=['--with-abi=lp64d','--disable-multilib']) + self.add_config(arch='loongarch64', + os_name='linux-gnu', + variant='lp64s', + gcc_cfg=['--with-abi=lp64s','--disable-multilib']) self.add_config(arch='m68k', os_name='linux-gnu', gcc_cfg=['--disable-multilib']) diff --git a/sysdeps/loongarch/Makefile b/sysdeps/loongarch/Makefile index 41c3449670..746d4c2c8f 100644 --- a/sysdeps/loongarch/Makefile +++ b/sysdeps/loongarch/Makefile @@ -5,11 +5,3 @@ endif # LoongArch's assembler also needs to know about PIC as it changes the # definition of some assembler macros. ASFLAGS-.os += $(pic-ccflag) - -abi-variants := lp64 - -ifeq (,$(filter $(default-abi),$(abi-variants))) -$(error Unknown ABI $(default-abi), must be one of $(abi-variants)) -endif - -abi-lp64-condition := defined __loongarch_lp64 diff --git a/sysdeps/loongarch/__longjmp.S b/sysdeps/loongarch/__longjmp.S index 4207376f5e..d6a99fcbc8 100644 --- a/sysdeps/loongarch/__longjmp.S +++ b/sysdeps/loongarch/__longjmp.S @@ -41,6 +41,7 @@ ENTRY (__longjmp) REG_L s7, a0, 11*SZREG REG_L s8, a0, 12*SZREG +#ifndef __loongarch_soft_float FREG_L $f24, a0, 13*SZREG + 0*SZFREG FREG_L $f25, a0, 13*SZREG + 1*SZFREG FREG_L $f26, a0, 13*SZREG + 2*SZFREG @@ -49,6 +50,7 @@ ENTRY (__longjmp) FREG_L $f29, a0, 13*SZREG + 5*SZFREG FREG_L $f30, a0, 13*SZREG + 6*SZFREG FREG_L $f31, a0, 13*SZREG + 7*SZFREG +#endif sltui a0,a1,1 ADD a0, a0, a1 # a0 = (a1 == 0) ? 1 : a1 diff --git a/sysdeps/loongarch/bits/setjmp.h b/sysdeps/loongarch/bits/setjmp.h index 42f8fa7657..8b323ad2b6 100644 --- a/sysdeps/loongarch/bits/setjmp.h +++ b/sysdeps/loongarch/bits/setjmp.h @@ -31,8 +31,11 @@ typedef struct __jmp_buf_internal_tag long int __fp; /* Callee-saved registers. */ long int __regs[9]; + +#ifndef __loongarch_soft_float /* Callee-saved floating point registers. */ double __fpregs[8]; +#endif } __jmp_buf[1]; diff --git a/sysdeps/loongarch/dl-trampoline.S b/sysdeps/loongarch/dl-trampoline.S index ad8ab0fda7..9a8f580971 100644 --- a/sysdeps/loongarch/dl-trampoline.S +++ b/sysdeps/loongarch/dl-trampoline.S @@ -21,8 +21,11 @@ /* Assembler veneer called from the PLT header code for lazy loading. The PLT header passes its own args in t0-t2. */ - -# define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK)) +#ifdef __loongarch_soft_float +#define FRAME_SIZE (-((-10 * SZREG) & ALMASK)) +#else +#define FRAME_SIZE (-((-10 * SZREG - 8 * SZFREG) & ALMASK)) +#endif ENTRY (_dl_runtime_resolve) @@ -39,6 +42,7 @@ ENTRY (_dl_runtime_resolve) REG_S a6, sp, 7*SZREG REG_S a7, sp, 8*SZREG +#ifndef __loongarch_soft_float FREG_S fa0, sp, 10*SZREG + 0*SZFREG FREG_S fa1, sp, 10*SZREG + 1*SZFREG FREG_S fa2, sp, 10*SZREG + 2*SZFREG @@ -47,6 +51,7 @@ ENTRY (_dl_runtime_resolve) FREG_S fa5, sp, 10*SZREG + 5*SZFREG FREG_S fa6, sp, 10*SZREG + 6*SZFREG FREG_S fa7, sp, 10*SZREG + 7*SZFREG +#endif /* Update .got.plt and obtain runtime address of callee */ SLLI a1, t1, 1 @@ -67,6 +72,7 @@ ENTRY (_dl_runtime_resolve) REG_L a6, sp, 7*SZREG REG_L a7, sp, 8*SZREG +#ifndef __loongarch_soft_float FREG_L fa0, sp, 10*SZREG + 0*SZFREG FREG_L fa1, sp, 10*SZREG + 1*SZFREG FREG_L fa2, sp, 10*SZREG + 2*SZFREG @@ -75,6 +81,7 @@ ENTRY (_dl_runtime_resolve) FREG_L fa5, sp, 10*SZREG + 5*SZFREG FREG_L fa6, sp, 10*SZREG + 6*SZFREG FREG_L fa7, sp, 10*SZREG + 7*SZFREG +#endif ADDI sp, sp, FRAME_SIZE diff --git a/sysdeps/loongarch/fpu_control.h b/sysdeps/loongarch/fpu_control.h index 1cccc933a5..f482395dba 100644 --- a/sysdeps/loongarch/fpu_control.h +++ b/sysdeps/loongarch/fpu_control.h @@ -51,6 +51,17 @@ #include +#ifdef __loongarch_soft_float + +#define _FPU_RESERVED 0xffffffff +#define _FPU_DEFAULT 0x00000000 +typedef unsigned int fpu_control_t; +#define _FPU_GETCW(cw) (cw) = 0 +#define _FPU_SETCW(cw) (void) (cw) +extern fpu_control_t __fpu_control; + +#else /* __loongarch_soft_float */ + /* Masks for interrupts. */ #define _FPU_MASK_V 0x10 /* Invalid operation */ #define _FPU_MASK_Z 0x08 /* Division by zero */ @@ -86,4 +97,6 @@ extern void __loongarch_fpu_setcw (fpu_control_t) __THROW; /* Default control word set at startup. */ extern fpu_control_t __fpu_control; +#endif /* __loongarch_soft_float */ + #endif /* fpu_control.h */ diff --git a/sysdeps/loongarch/nofpu/Implies b/sysdeps/loongarch/nofpu/Implies new file mode 100644 index 0000000000..abcbadb25f --- /dev/null +++ b/sysdeps/loongarch/nofpu/Implies @@ -0,0 +1 @@ +ieee754/soft-fp diff --git a/sysdeps/loongarch/nofpu/math-tests-exceptions.h b/sysdeps/loongarch/nofpu/math-tests-exceptions.h new file mode 100644 index 0000000000..b22bb01d0e --- /dev/null +++ b/sysdeps/loongarch/nofpu/math-tests-exceptions.h @@ -0,0 +1,28 @@ +/* Configuration for math tests: support for exceptions. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef LOONGARCH_NOFPU_MATH_TESTS_EXCEPTIONS_H +#define LOONGARCH_NOFPU_MATH_TESTS_EXCEPTIONS_H 1 + +/* We support setting floating-point exception flags on hard-float + targets. These are not supported on soft-float targets. */ +#define EXCEPTION_TESTS_float 0 +#define EXCEPTION_TESTS_double 0 +#define EXCEPTION_TESTS_long_double 0 + +#endif /* math-tests-exceptions.h. */ diff --git a/sysdeps/loongarch/nofpu/math-tests-rounding.h b/sysdeps/loongarch/nofpu/math-tests-rounding.h new file mode 100644 index 0000000000..5322e481b9 --- /dev/null +++ b/sysdeps/loongarch/nofpu/math-tests-rounding.h @@ -0,0 +1,27 @@ +/* Configuration for math tests: rounding mode support. + Copyright (C) 2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#ifndef LOONGARCH_NOFPU_MATH_TESTS_ROUNDING_H +#define LOONGARCH_NOFPU_MATH_TESTS_ROUNDING_H 1 + +/* On soft-float targets we only support the "to nearest" rounding mode. */ +#define ROUNDING_TESTS_float(MODE) ((MODE) == FE_TONEAREST) +#define ROUNDING_TESTS_double(MODE) ((MODE) == FE_TONEAREST) +#define ROUNDING_TESTS_long_double(MODE) ((MODE) == FE_TONEAREST) + +#endif /* math-tests-rounding.h. */ diff --git a/sysdeps/loongarch/preconfigure b/sysdeps/loongarch/preconfigure index 118963cda6..f2d1a0d87b 100644 --- a/sysdeps/loongarch/preconfigure +++ b/sysdeps/loongarch/preconfigure @@ -12,7 +12,6 @@ loongarch*) case "$float_abi" in soft) abi_flen=0 - as_fn_error 1 "loongarch does not yet support soft floating-point ABI!!" "$LINENO" 5 ;; single) as_fn_error 1 "glibc does not yet support the single floating-point ABI!!" "$LINENO" 5 diff --git a/sysdeps/loongarch/preconfigure.ac b/sysdeps/loongarch/preconfigure.ac index 1aba743c15..67e4357013 100644 --- a/sysdeps/loongarch/preconfigure.ac +++ b/sysdeps/loongarch/preconfigure.ac @@ -12,7 +12,6 @@ loongarch*) case "$float_abi" in soft) abi_flen=0 - AC_MSG_ERROR([loongarch does not yet support soft floating-point ABI!!], 1) ;; single) AC_MSG_ERROR([glibc does not yet support the single floating-point ABI!!], 1) diff --git a/sysdeps/loongarch/setjmp.S b/sysdeps/loongarch/setjmp.S index 298bb02a82..9b1cdea48c 100644 --- a/sysdeps/loongarch/setjmp.S +++ b/sysdeps/loongarch/setjmp.S @@ -50,6 +50,7 @@ ENTRY (__sigsetjmp) REG_S s7, a0, 11*SZREG REG_S s8, a0, 12*SZREG +#ifndef __loongarch_soft_float FREG_S $f24, a0, 13*SZREG + 0*SZFREG FREG_S $f25, a0, 13*SZREG + 1*SZFREG FREG_S $f26, a0, 13*SZREG + 2*SZFREG @@ -58,6 +59,7 @@ ENTRY (__sigsetjmp) FREG_S $f29, a0, 13*SZREG + 5*SZFREG FREG_S $f30, a0, 13*SZREG + 6*SZFREG FREG_S $f31, a0, 13*SZREG + 7*SZFREG +#endif #if !IS_IN (libc) && IS_IN(rtld) li.w v0, 0 diff --git a/sysdeps/unix/sysv/linux/loongarch/Makefile b/sysdeps/unix/sysv/linux/loongarch/Makefile index 91bd35800a..c84a1762ed 100644 --- a/sysdeps/unix/sysv/linux/loongarch/Makefile +++ b/sysdeps/unix/sysv/linux/loongarch/Makefile @@ -1,3 +1,12 @@ ifeq ($(subdir),stdlib) gen-as-const-headers += ucontext_i.sym endif + +abi-variants := lp64s lp64d + +ifeq (,$(filter $(default-abi),$(abi-variants))) +$(error Unknown ABI $(default-abi), must be one of $(abi-variants)) +endif + +abi-lp64s-condition := __WORDSIZE == 64 && defined __loongarch_soft_float +abi-lp64d-condition := __WORDSIZE == 64 && defined __loongarch_double_float diff --git a/sysdeps/unix/sysv/linux/loongarch/configure b/sysdeps/unix/sysv/linux/loongarch/configure index 60a410303e..28216c165e 100644 --- a/sysdeps/unix/sysv/linux/loongarch/configure +++ b/sysdeps/unix/sysv/linux/loongarch/configure @@ -151,11 +151,56 @@ if test $libc_cv_loongarch_int_abi = no; then as_fn_error $? "Unable to determine integer ABI" "$LINENO" 5 fi +libc_cv_loongarch_float_abi=no +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __loongarch_double_float + yes + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + libc_cv_loongarch_float_abi=d +fi +rm -f conftest* + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __loongarch_soft_float + yes + #endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then : + libc_cv_loongarch_float_abi=s +fi +rm -f conftest* + +if test "$libc_cv_loongarch_float_abi" = no; then + as_fn_error $? "Unable to determine floating-point ABI" "$LINENO" 5 +fi + config_vars="$config_vars -default-abi = $libc_cv_loongarch_int_abi" +default-abi = $libc_cv_loongarch_int_abi$libc_cv_loongarch_float_abi" -case $libc_cv_loongarch_int_abi in -lp64) +case $libc_cv_loongarch_int_abi$libc_cv_loongarch_float_abi in +lp64s) + test -n "$libc_cv_slibdir" || +case "$prefix" in +/usr | /usr/) + libc_cv_slibdir='/lib64/sf' + libc_cv_rtlddir='/lib64' + if test "$libdir" = '${exec_prefix}/lib'; then + libdir='${exec_prefix}/lib64/sf'; + # Locale data can be shared between 32-bit and 64-bit libraries. + libc_cv_complocaledir='${exec_prefix}/lib/locale' + fi + ;; +esac + ;; +lp64d) test -n "$libc_cv_slibdir" || case "$prefix" in /usr | /usr/) diff --git a/sysdeps/unix/sysv/linux/loongarch/configure.ac b/sysdeps/unix/sysv/linux/loongarch/configure.ac index 7de1e95ff6..04e9150a9b 100644 --- a/sysdeps/unix/sysv/linux/loongarch/configure.ac +++ b/sysdeps/unix/sysv/linux/loongarch/configure.ac @@ -11,10 +11,26 @@ if test $libc_cv_loongarch_int_abi = no; then AC_MSG_ERROR([Unable to determine integer ABI]) fi -LIBC_CONFIG_VAR([default-abi], [$libc_cv_loongarch_int_abi]) +libc_cv_loongarch_float_abi=no +AC_EGREP_CPP(yes, [#ifdef __loongarch_double_float + yes + #endif + ],libc_cv_loongarch_float_abi=d) +AC_EGREP_CPP(yes, [#ifdef __loongarch_soft_float + yes + #endif + ],libc_cv_loongarch_float_abi=s) +if test "$libc_cv_loongarch_float_abi" = no; then + AC_MSG_ERROR([Unable to determine floating-point ABI]) +fi + +LIBC_CONFIG_VAR([default-abi], [$libc_cv_loongarch_int_abi$libc_cv_loongarch_float_abi]) -case $libc_cv_loongarch_int_abi in -lp64) +case $libc_cv_loongarch_int_abi$libc_cv_loongarch_float_abi in +lp64s) + LIBC_SLIBDIR_RTLDDIR([lib64/sf], [lib64]) + ;; +lp64d) LIBC_SLIBDIR_RTLDDIR([lib64], [lib64]) ;; esac diff --git a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed index f8976fd239..cdbe5c3dc5 100644 --- a/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed +++ b/sysdeps/unix/sysv/linux/loongarch/ldd-rewrite.sed @@ -1 +1 @@ -s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/[^/]*\)\(-loongarch\)\(64\|32\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\2\4\7 \264\4-loongarch64\7 \232\4-loongarch32\7"_ +s_^\(RTLDLIST=\)\(.*lib\)\(\|64\|32\)\(/ld-linux-loongarch-\)\(lp\|ilp\)\(64\|32\)\(d\|s\)\(\.so\.[0-9.]*\)[[:blank:]]*$_\1"\264\4lp64d\8 \264\4lp64s\8"_ diff --git a/sysdeps/unix/sysv/linux/loongarch/shlib-versions b/sysdeps/unix/sysv/linux/loongarch/shlib-versions index dc2220b4be..5f40e7f5ec 100644 --- a/sysdeps/unix/sysv/linux/loongarch/shlib-versions +++ b/sysdeps/unix/sysv/linux/loongarch/shlib-versions @@ -2,6 +2,8 @@ DEFAULT GLIBC_2.36 %if LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 64 ld=ld-linux-loongarch-lp64d.so.1 +%elif LOONGARCH_ABI_GRLEN == 64 && LOONGARCH_ABI_FRLEN == 0 +ld=ld-linux-loongarch-lp64s.so.1 %else %error cannot determine ABI %endif