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'])
# 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
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
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
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];
/* 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)
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
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
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
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
#include <features.h>
+#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 */
/* Default control word set at startup. */
extern fpu_control_t __fpu_control;
+#endif /* __loongarch_soft_float */
+
#endif /* fpu_control.h */
--- /dev/null
+ieee754/soft-fp
--- /dev/null
+/* 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
+ <https://www.gnu.org/licenses/>. */
+
+#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. */
--- /dev/null
+/* 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
+ <https://www.gnu.org/licenses/>. */
+
+#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. */
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
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)
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
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
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
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/)
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
-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"_
%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