From 067660f8aa2e24533ad7420a9cfa9b3be02022bf Mon Sep 17 00:00:00 2001 From: Dongyan Qian Date: Tue, 10 Dec 2024 10:04:25 +0800 Subject: [PATCH] edk2-libc: Add LoongArch64 support. REF: https://github.com/bminor/glibc https://github.com/loongson/glibc Signed-off-by: Dongyan Qian --- AppPkg/AppPkg.dsc | 2 +- StdLib/Include/LoongArch64/loongarch-gcc.h | 104 ++++++ StdLib/Include/LoongArch64/machine/ansi.h | 106 ++++++ StdLib/Include/LoongArch64/machine/bswap.h | 13 + .../Include/LoongArch64/machine/byte_swap.h | 65 ++++ StdLib/Include/LoongArch64/machine/endian.h | 3 + .../LoongArch64/machine/endian_machdep.h | 3 + StdLib/Include/LoongArch64/machine/fenv.h | 29 ++ StdLib/Include/LoongArch64/machine/float.h | 62 ++++ StdLib/Include/LoongArch64/machine/ieee.h | 31 ++ StdLib/Include/LoongArch64/machine/ieeefp.h | 48 +++ .../Include/LoongArch64/machine/int_const.h | 65 ++++ .../Include/LoongArch64/machine/int_limits.h | 129 +++++++ .../LoongArch64/machine/int_mwgwtypes.h | 84 +++++ .../Include/LoongArch64/machine/int_types.h | 63 ++++ StdLib/Include/LoongArch64/machine/limits.h | 97 ++++++ StdLib/Include/LoongArch64/machine/math.h | 3 + StdLib/Include/LoongArch64/machine/param.h | 126 +++++++ StdLib/Include/LoongArch64/machine/signal.h | 22 ++ StdLib/Include/LoongArch64/machine/types.h | 82 +++++ StdLib/Include/LoongArch64/milieu.h | 43 +++ StdLib/Include/LoongArch64/softfloat.h | 316 ++++++++++++++++++ StdLib/LibC/LibC.inf | 1 + StdLib/LibC/Softfloat/Softfloat.inf | 2 +- StdLib/LibC/String/Copying.c | 2 +- StdLib/LibC/gdtoa/gdtoa.inf | 6 +- StdLib/StdLib.dec | 2 + StdLib/StdLib.dsc | 2 +- StdLib/StdLib.inc | 2 +- StdLibPrivateInternalFiles/DoNotUse.dec | 3 + .../Include/LoongArch64/arith.h | 9 + .../Include/LoongArch64/gd_qnan.h | 12 + 32 files changed, 1527 insertions(+), 10 deletions(-) create mode 100644 StdLib/Include/LoongArch64/loongarch-gcc.h create mode 100644 StdLib/Include/LoongArch64/machine/ansi.h create mode 100644 StdLib/Include/LoongArch64/machine/bswap.h create mode 100644 StdLib/Include/LoongArch64/machine/byte_swap.h create mode 100644 StdLib/Include/LoongArch64/machine/endian.h create mode 100644 StdLib/Include/LoongArch64/machine/endian_machdep.h create mode 100644 StdLib/Include/LoongArch64/machine/fenv.h create mode 100644 StdLib/Include/LoongArch64/machine/float.h create mode 100644 StdLib/Include/LoongArch64/machine/ieee.h create mode 100644 StdLib/Include/LoongArch64/machine/ieeefp.h create mode 100644 StdLib/Include/LoongArch64/machine/int_const.h create mode 100644 StdLib/Include/LoongArch64/machine/int_limits.h create mode 100644 StdLib/Include/LoongArch64/machine/int_mwgwtypes.h create mode 100644 StdLib/Include/LoongArch64/machine/int_types.h create mode 100644 StdLib/Include/LoongArch64/machine/limits.h create mode 100644 StdLib/Include/LoongArch64/machine/math.h create mode 100644 StdLib/Include/LoongArch64/machine/param.h create mode 100644 StdLib/Include/LoongArch64/machine/signal.h create mode 100644 StdLib/Include/LoongArch64/machine/types.h create mode 100644 StdLib/Include/LoongArch64/milieu.h create mode 100644 StdLib/Include/LoongArch64/softfloat.h create mode 100644 StdLibPrivateInternalFiles/Include/LoongArch64/arith.h create mode 100644 StdLibPrivateInternalFiles/Include/LoongArch64/gd_qnan.h diff --git a/AppPkg/AppPkg.dsc b/AppPkg/AppPkg.dsc index 89f9f1d2..e4606689 100644 --- a/AppPkg/AppPkg.dsc +++ b/AppPkg/AppPkg.dsc @@ -17,7 +17,7 @@ PLATFORM_VERSION = 0.01 DSC_SPECIFICATION = 0x00010006 OUTPUT_DIRECTORY = Build/AppPkg - SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT diff --git a/StdLib/Include/LoongArch64/loongarch-gcc.h b/StdLib/Include/LoongArch64/loongarch-gcc.h new file mode 100644 index 00000000..24e21138 --- /dev/null +++ b/StdLib/Include/LoongArch64/loongarch-gcc.h @@ -0,0 +1,104 @@ +/** @file + + Copyright (c) 2014, ARM Limited. All rights reserved. + Modified by Loongson Technology Co., Ltd. on 2024. + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + + +/* $NetBSD: arm-gcc.h,v 1.4 2013/01/26 07:08:14 matt Exp $ */ + +/* +------------------------------------------------------------------------------- +One of the macros `BIGENDIAN' or `LITTLEENDIAN' must be defined. +------------------------------------------------------------------------------- +*/ +#define LITTLEENDIAN + +/* +------------------------------------------------------------------------------- +The macro `BITS64' can be defined to indicate that 64-bit integer types are +supported by the compiler. +------------------------------------------------------------------------------- +*/ +#define BITS64 + +/* +------------------------------------------------------------------------------- +Each of the following `typedef's defines the most convenient type that holds +integers of at least as many bits as specified. For example, `uint8' should +be the most convenient type that can hold unsigned integers of as many as +8 bits. The `flag' type must be able to hold either a 0 or 1. For most +implementations of C, `flag', `uint8', and `int8' should all be `typedef'ed +to the same as `int'. +------------------------------------------------------------------------------- +*/ +typedef int flag; +typedef int uint8; +typedef int int8; +typedef int uint16; +typedef int int16; +typedef unsigned int uint32; +typedef signed int int32; +#ifdef BITS64 +typedef unsigned long long int uint64; +typedef signed long long int int64; +#endif + +/* +------------------------------------------------------------------------------- +Each of the following `typedef's defines a type that holds integers +of _exactly_ the number of bits specified. For instance, for most +implementation of C, `bits16' and `sbits16' should be `typedef'ed to +`unsigned short int' and `signed short int' (or `short int'), respectively. +------------------------------------------------------------------------------- +*/ +typedef unsigned char bits8; +typedef signed char sbits8; +typedef unsigned short int bits16; +typedef signed short int sbits16; +typedef unsigned int bits32; +typedef signed int sbits32; +#ifdef BITS64 +typedef unsigned long long int bits64; +typedef signed long long int sbits64; +#endif + +#ifdef BITS64 +/* +------------------------------------------------------------------------------- +The `LIT64' macro takes as its argument a textual integer literal and +if necessary ``marks'' the literal as having a 64-bit integer type. +For example, the GNU C Compiler (`gcc') requires that 64-bit literals be +appended with the letters `LL' standing for `long long', which is `gcc's +name for the 64-bit integer type. Some compilers may allow `LIT64' to be +defined as the identity macro: `#define LIT64( a ) a'. +------------------------------------------------------------------------------- +*/ +#define LIT64( a ) a##ULL +#endif + +/* +------------------------------------------------------------------------------- +The macro `INLINE' can be used before functions that should be inlined. If +a compiler does not support explicit inlining, this macro should be defined +to be `static'. +------------------------------------------------------------------------------- +*/ +#define INLINE static inline + +/* Modified by Loongson Technology Co., Ltd. on [2024]:\ + * Changed the endianness detection for new architecture */ + +#if defined(SOFTFLOAT_FOR_GCC) +#define FLOAT64_DEMANGLE(a) (a) +#define FLOAT64_MANGLE(a) (a) +#endif diff --git a/StdLib/Include/LoongArch64/machine/ansi.h b/StdLib/Include/LoongArch64/machine/ansi.h new file mode 100644 index 00000000..8273905c --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/ansi.h @@ -0,0 +1,106 @@ +/** @file + Machine dependent ANSI type definitions. + + Copyright (c) 2010-2012, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)ansi.h 8.2 (Berkeley) 1/4/94 + NetBSD: ansi.h,v 1.7 2006/10/04 13:51:59 tnozaki Exp +**/ +#ifndef _ANSI_H_ +#define _ANSI_H_ + +#include + +#include + +/* + * Types which are fundamental to the implementation and may appear in + * more than one standard header are defined here. Standard headers + * then use: + * #ifdef _BSD_SIZE_T_ + * typedef _BSD_SIZE_T_ size_t; + * #undef _BSD_SIZE_T_ + * #endif + */ +#define _BSD_CLOCK_T_ _EFI_CLOCK_T /* clock() */ +#define _BSD_PTRDIFF_T_ _EFI_PTRDIFF_T_ /* ptr1 - ptr2 */ +#define _BSD_SIZE_T_ _EFI_SIZE_T_ /* sizeof() */ +#define _BSD_SSIZE_T_ INTN /* byte count or error */ +#define _BSD_TIME_T_ _EFI_TIME_T /* time() */ +#define _BSD_VA_LIST_ VA_LIST +#define _BSD_CLOCKID_T_ INT64 /* clockid_t */ +#define _BSD_TIMER_T_ INT64 /* timer_t */ +#define _BSD_SUSECONDS_T_ INT64 /* suseconds_t */ +#define _BSD_USECONDS_T_ UINT64 /* useconds_t */ + +/* + * NOTE: rune_t is not covered by ANSI nor other standards, and should not + * be instantiated outside of lib/libc/locale. use wchar_t. + * + * Runes (wchar_t) is declared to be an ``int'' instead of the more natural + * ``unsigned long'' or ``long''. Two things are happening here. It is not + * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, + * it looks like 10646 will be a 31 bit standard. This means that if your + * ints cannot hold 32 bits, you will be in trouble. The reason an int was + * chosen over a long is that the is*() and to*() routines take ints (says + * ANSI C), but they use _RUNE_T_ instead of int. By changing it here, you + * lose a bit of ANSI conformance, but your programs will still work. + * + * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type. When wchar_t + * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains + * defined for ctype.h. + */ +#define _BSD_WCHAR_T_ _EFI_WCHAR_T /* wchar_t */ +#define _BSD_WINT_T_ _EFI_WINT_T /* wint_t */ +#define _BSD_RUNE_T_ _EFI_WCHAR_T /* rune_t */ +#define _BSD_WCTRANS_T_ void * /* wctrans_t */ +#define _BSD_WCTYPE_T_ unsigned int /* wctype_t */ + +/* + * mbstate_t is an opaque object to keep conversion state, during multibyte + * stream conversions. The content must not be referenced by user programs. + */ +typedef struct { + UINT32 A; // Np; + UINT32 B; // U; + UINT32 E; // L + UINT8 C[4]; // n[4] + UINT16 D[2]; // w[2] +} __mbstate_t; +#define _BSD_MBSTATE_T_ __mbstate_t /* mbstate_t */ + +#endif /* _ANSI_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/bswap.h b/StdLib/Include/LoongArch64/machine/bswap.h new file mode 100644 index 00000000..142f739d --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/bswap.h @@ -0,0 +1,13 @@ +/* $NetBSD: bswap.h,v 1.4 2006/01/31 07:49:18 dsl Exp $ */ + +/* Written by Manuel Bouyer. Public domain */ + +#ifndef _MACHINE_BSWAP_H_ +#define _MACHINE_BSWAP_H_ + +#include + +#define __BSWAP_RENAME +#include + +#endif /* !_MACHINE_BSWAP_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/byte_swap.h b/StdLib/Include/LoongArch64/machine/byte_swap.h new file mode 100644 index 00000000..b4d7075b --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/byte_swap.h @@ -0,0 +1,65 @@ +/*- + * Copyright (c) 1997, 1999, 2002 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Charles M. Hannum, Neil A. Carson, and Jason R. Thorpe. + * + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LOONGARCH64_BYTE_SWAP_H_ +#define _LOONGARCH64_BYTE_SWAP_H_ + +#ifdef __GNUC__ +#include +__BEGIN_DECLS + +#define __BYTE_SWAP_U32_VARIABLE __byte_swap_u32_variable +static __inline uint32_t +__byte_swap_u32_variable(uint32_t v) +{ + uint32_t t1; + + t1 = v ^ ((v << 16) | (v >> 16)); + t1 &= 0xff00ffffU; + v = (v >> 8) | (v << 24); + v ^= (t1 >> 8); + return (v); +} + +#define __BYTE_SWAP_U16_VARIABLE __byte_swap_u16_variable +static __inline uint16_t +__byte_swap_u16_variable(uint16_t v) +{ + + v &= 0xffff; + v = (v >> 8) | (v << 8); + return (v); +} + +__END_DECLS +#endif + +#endif /* _LOONGARCH64_BYTE_SWAP_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/endian.h b/StdLib/Include/LoongArch64/machine/endian.h new file mode 100644 index 00000000..bb53c0ba --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/endian.h @@ -0,0 +1,3 @@ +/* $NetBSD: endian.h,v 1.3 2001/06/23 12:20:27 bjh21 Exp $ */ + +#include diff --git a/StdLib/Include/LoongArch64/machine/endian_machdep.h b/StdLib/Include/LoongArch64/machine/endian_machdep.h new file mode 100644 index 00000000..19407860 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/endian_machdep.h @@ -0,0 +1,3 @@ +/* $NetBSD: endian_machdep.h,v 1.8 2006/01/30 21:52:38 dsl Exp $ */ + +#define _BYTE_ORDER _LITTLE_ENDIAN diff --git a/StdLib/Include/LoongArch64/machine/fenv.h b/StdLib/Include/LoongArch64/machine/fenv.h new file mode 100644 index 00000000..2c4a10cb --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/fenv.h @@ -0,0 +1,29 @@ +/* $NetBSD: fenv.h,v 1.2 2014/01/29 00:22:09 matt Exp $ */ + +/* + * Based on ieeefp.h written by J.T. Conklin, Apr 28, 1995 + * Public domain. + * + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * + */ + +#ifndef _LOONGARCH64_FENV_H_ +#define _LOONGARCH64_FENV_H_ + +typedef int fexcept_t; + +#define FE_INVALID 0x01 /* invalid operation exception */ +#define FE_DIVBYZERO 0x02 /* divide-by-zero exception */ +#define FE_OVERFLOW 0x04 /* overflow exception */ +#define FE_UNDERFLOW 0x08 /* underflow exception */ +#define FE_INEXACT 0x10 /* imprecise (loss of precision; "inexact") */ + +#define FE_ALL_EXCEPT 0x1f + +#define FE_TONEAREST 0 /* round to nearest representable number */ +#define FE_UPWARD 1 /* round toward positive infinity */ +#define FE_DOWNWARD 2 /* round toward negative infinity */ +#define FE_TOWARDZERO 3 /* round to zero (truncate) */ + +#endif /* _LOONGARCH64_FENV_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/float.h b/StdLib/Include/LoongArch64/machine/float.h new file mode 100644 index 00000000..97ff8859 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/float.h @@ -0,0 +1,62 @@ +/* $NetBSD: float.h,v 1.6 2005/12/11 12:16:47 christos Exp $ */ +/*- + * Copyright (c) 2008 The NetBSD Foundation, Inc. + * All rights reserved. + * + * Modified by Loongson Technology Co., Ltd. on 2024. + * + * This code is derived from software contributed to The NetBSD Foundation + * by + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LOONGARCH64_FLOAT_H_ +#define _LOONGARCH64_FLOAT_H_ + +#define LDBL_MANT_DIG 64 +#define LDBL_EPSILON 1.0842021724855044340E-19L +#define LDBL_DIG 18 +#define LDBL_MIN_EXP (-16381) +#define LDBL_MIN 1.6810515715560467531E-4932L +#define LDBL_MIN_10_EXP (-4931) +#define LDBL_MAX_EXP 16384 +#define LDBL_MAX 1.1897314953572317650E+4932L +#define LDBL_MAX_10_EXP 4932 + +/* Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown. */ +/* ??? This is supposed to change with calls to fesetround in . */ +#undef FLT_ROUNDS +#define FLT_ROUNDS 1 + +#include + +#if !defined(_ANSI_SOURCE) && !defined(_POSIX_C_SOURCE) && \ + !defined(_XOPEN_SOURCE) || \ + ((__STDC_VERSION__ - 0) >= 199901L) || \ + ((_POSIX_C_SOURCE - 0) >= 200112L) || \ + ((_XOPEN_SOURCE - 0) >= 600) || \ + defined(_ISOC99_SOURCE) || defined(_NETBSD_SOURCE) +#define DECIMAL_DIG 21 +#endif /* !defined(_ANSI_SOURCE) && ... */ + +#endif /* !_LOONGARCH64_FLOAT_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/ieee.h b/StdLib/Include/LoongArch64/machine/ieee.h new file mode 100644 index 00000000..4aa90bd8 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/ieee.h @@ -0,0 +1,31 @@ +/* $NetBSD: ieee.h,v 1.9 2005/12/11 12:16:47 christos Exp $ */ +/*- + * Copyright (c) 2008 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include diff --git a/StdLib/Include/LoongArch64/machine/ieeefp.h b/StdLib/Include/LoongArch64/machine/ieeefp.h new file mode 100644 index 00000000..b7fa6a82 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/ieeefp.h @@ -0,0 +1,48 @@ +/* $NetBSD: ieeefp.h,v 1.3 2013/04/23 05:42:23 matt Exp $ */ + +/* + * Based on ieeefp.h written by J.T. Conklin, Apr 28, 1995 + * Public domain. + * + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * + */ + +#ifndef _LOONGARCH64_IEEEFP_H_ +#define _LOONGARCH64_IEEEFP_H_ + +#include +#include + +#if defined(_NETBSD_SOURCE) || defined(_ISOC99_SOURCE) + +#include + +#if !defined(_ISOC99_SOURCE) + +/* Exception type (used by fpsetmask() et al.) */ + +typedef int fp_except; + +/* Bit defines for fp_except */ + +#define FP_X_INV FE_INVALID /* invalid operation exception */ +#define FP_X_DZ FE_DIVBYZERO /* divide-by-zero exception */ +#define FP_X_OFL FE_OVERFLOW /* overflow exception */ +#define FP_X_UFL FE_UNDERFLOW /* underflow exception */ +#define FP_X_IMP FE_INEXACT /* imprecise (prec. loss; "inexact") */ + +/* Rounding modes */ + +typedef enum { + FP_RN=FE_TONEAREST, /* round to nearest representable number */ + FP_RP=FE_UPWARD, /* round toward positive infinity */ + FP_RM=FE_DOWNWARD, /* round toward negative infinity */ + FP_RZ=FE_TOWARDZERO /* round to zero (truncate) */ +} fp_rnd; + +#endif /* !_ISOC99_SOURCE */ + +#endif /* _NETBSD_SOURCE || _ISOC99_SOURCE */ + +#endif /* _LOONGARCH64_IEEEFP_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/int_const.h b/StdLib/Include/LoongArch64/machine/int_const.h new file mode 100644 index 00000000..1e44f30c --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/int_const.h @@ -0,0 +1,65 @@ +/* $NetBSD: int_const.h,v 1.1 2001/04/14 22:38:38 kleink Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the NetBSD + * Foundation, Inc. and its contributors. + * 4. Neither the name of The NetBSD Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LOONGARCH64_INT_CONST_H_ +#define _LOONGARCH64_INT_CONST_H_ + +/* + * 7.18.4 Macros for integer constants + */ + +/* 7.18.4.1 Macros for minimum-width integer constants */ + +#define INT8_C(c) c +#define INT16_C(c) c +#define INT32_C(c) c +#define INT64_C(c) c ## LL + +#define UINT8_C(c) c ## U +#define UINT16_C(c) c ## U +#define UINT32_C(c) c ## U +#define UINT64_C(c) c ## ULL + +/* 7.18.4.2 Macros for greatest-width integer constants */ + +#define INTMAX_C(c) c ## LL +#define UINTMAX_C(c) c ## ULL + +#endif /* !_LOONGARCH64_INT_CONST_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/int_limits.h b/StdLib/Include/LoongArch64/machine/int_limits.h new file mode 100644 index 00000000..f5988782 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/int_limits.h @@ -0,0 +1,129 @@ +/* $NetBSD: int_limits.h,v 1.9 2008/08/29 19:08:29 matt Exp $ */ + +/*- + * Copyright (c) 2001 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Klaus Klein. + * + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef _LOONGARCH64_INT_LIMITS_H_ +#define _LOONGARCH64_INT_LIMITS_H_ + +/* + * 7.18.2 Limits of specified-width integer types + */ + +/* 7.18.2.1 Limits of exact-width integer types */ + +/* minimum values of exact-width signed integer types */ +#define INT8_MIN (-0x7f-1) /* int8_t */ +#define INT16_MIN (-0x7fff-1) /* int16_t */ +#define INT32_MIN (-0x7fffffff-1) /* int32_t */ +#define INT64_MIN (-0x7fffffffffffffffLL-1) /* int64_t */ + +/* maximum values of exact-width signed integer types */ +#define INT8_MAX 0x7f /* int8_t */ +#define INT16_MAX 0x7fff /* int16_t */ +#define INT32_MAX 0x7fffffff /* int32_t */ +#define INT64_MAX 0x7fffffffffffffffLL /* int64_t */ + +/* maximum values of exact-width unsigned integer types */ +#define UINT8_MAX 0xff /* uint8_t */ +#define UINT16_MAX 0xffff /* uint16_t */ +#define UINT32_MAX 0xffffffffU /* uint32_t */ +#define UINT64_MAX 0xffffffffffffffffULL /* uint64_t */ + +/* 7.18.2.2 Limits of minimum-width integer types */ + +/* minimum values of minimum-width signed integer types */ +#define INT_LEAST8_MIN (-0x7f-1) /* int_least8_t */ +#define INT_LEAST16_MIN (-0x7fff-1) /* int_least16_t */ +#define INT_LEAST32_MIN (-0x7fffffff-1) /* int_least32_t */ +#define INT_LEAST64_MIN (-0x7fffffffffffffffLL-1) /* int_least64_t */ + +/* maximum values of minimum-width signed integer types */ +#define INT_LEAST8_MAX 0x7f /* int_least8_t */ +#define INT_LEAST16_MAX 0x7fff /* int_least16_t */ +#define INT_LEAST32_MAX 0x7fffffff /* int_least32_t */ +#define INT_LEAST64_MAX 0x7fffffffffffffffLL /* int_least64_t */ + +/* maximum values of minimum-width unsigned integer types */ +#define UINT_LEAST8_MAX 0xff /* uint_least8_t */ +#define UINT_LEAST16_MAX 0xffff /* uint_least16_t */ +#define UINT_LEAST32_MAX 0xffffffffU /* uint_least32_t */ +#define UINT_LEAST64_MAX 0xffffffffffffffffULL /* uint_least64_t */ + +/* 7.18.2.3 Limits of fastest minimum-width integer types */ + +/* minimum values of fastest minimum-width signed integer types */ +#define INT_FAST8_MIN (-0x7fffffff-1) /* int_fast8_t */ +#define INT_FAST16_MIN (-0x7fffffff-1) /* int_fast16_t */ +#define INT_FAST32_MIN (-0x7fffffff-1) /* int_fast32_t */ +#define INT_FAST64_MIN (-0x7fffffffffffffffLL-1) /* int_fast64_t */ + +/* maximum values of fastest minimum-width signed integer types */ +#define INT_FAST8_MAX 0x7fffffff /* int_fast8_t */ +#define INT_FAST16_MAX 0x7fffffff /* int_fast16_t */ +#define INT_FAST32_MAX 0x7fffffff /* int_fast32_t */ +#define INT_FAST64_MAX 0x7fffffffffffffffLL /* int_fast64_t */ + +/* maximum values of fastest minimum-width unsigned integer types */ +#define UINT_FAST8_MAX 0xffffffffU /* uint_fast8_t */ +#define UINT_FAST16_MAX 0xffffffffU /* uint_fast16_t */ +#define UINT_FAST32_MAX 0xffffffffU /* uint_fast32_t */ +#define UINT_FAST64_MAX 0xffffffffffffffffULL /* uint_fast64_t */ + +/* 7.18.2.4 Limits of integer types capable of holding object pointers */ + +#define INTPTR_MIN (-0x7fffffffffffffffLL-1) /* intptr_t */ +#define INTPTR_MAX 0x7fffffffffffffffLL /* intptr_t */ +#define UINTPTR_MAX 0xffffffffffffffffULL /* uintptr_t */ + +/* 7.18.2.5 Limits of greatest-width integer types */ + +#define INTMAX_MIN (-0x7fffffffffffffffLL-1) /* intmax_t */ +#define INTMAX_MAX 0x7fffffffffffffffLL /* intmax_t */ +#define UINTMAX_MAX 0xffffffffffffffffULL /* uintmax_t */ + + +/* + * 7.18.3 Limits of other integer types + */ + +/* limits of ptrdiff_t */ +#define PTRDIFF_MIN (-0x7fffffffffffffffLL-1) /* ptrdiff_t */ +#define PTRDIFF_MAX 0x7fffffffffffffffLL /* ptrdiff_t */ + +/* limits of sig_atomic_t */ +#define SIG_ATOMIC_MIN (-0x7fffffffffffffffLL-1) /* sig_atomic_t */ +#define SIG_ATOMIC_MAX 0x7fffffffffffffffLL /* sig_atomic_t */ + +/* limit of size_t */ +#define SIZE_MAX 0xffffffffffffffffULL /* size_t */ + +#endif /* !_LOONGARCH64_INT_LIMITS_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/int_mwgwtypes.h b/StdLib/Include/LoongArch64/machine/int_mwgwtypes.h new file mode 100644 index 00000000..47e514c7 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/int_mwgwtypes.h @@ -0,0 +1,84 @@ +/** @file + Minimum and Greatest Width Integer types. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available under + the terms and conditions of the BSD License that accompanies this distribution. + The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + Modified by Loongson Technology Co., Ltd. on 2024/12/08. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Portions Copyright (c) 2001 The NetBSD Foundation, Inc. + All rights reserved. + + This code is derived from software contributed to The NetBSD Foundation + by Klaus Klein. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the NetBSD + Foundation, Inc. and its contributors. + 4. Neither the name of The NetBSD Foundation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + + NetBSD: int_mwgwtypes.h,v 1.5 2005/12/24 20:06:47 perry Exp +**/ +#ifndef _LOONGARCH64_INT_MWGWTYPES_H_ +#define _LOONGARCH64_INT_MWGWTYPES_H_ + +/* + * 7.18.1 Integer types + */ + +/* 7.18.1.2 Minimum-width integer types */ + +typedef CHAR8 int_least8_t; +typedef UINT8 uint_least8_t; +typedef INT16 int_least16_t; +typedef UINT16 uint_least16_t; +typedef INT32 int_least32_t; +typedef UINT32 uint_least32_t; +typedef INT64 int_least64_t; +typedef UINT64 uint_least64_t; + +/* 7.18.1.3 Fastest minimum-width integer types */ +typedef INT32 int_fast8_t; +typedef UINT32 uint_fast8_t; +typedef INT32 int_fast16_t; +typedef UINT32 uint_fast16_t; +typedef INT32 int_fast32_t; +typedef UINT32 uint_fast32_t; +typedef INT64 int_fast64_t; +typedef UINT64 uint_fast64_t; + +/* 7.18.1.5 Greatest-width integer types */ + +typedef INT64 intmax_t; +typedef UINT64 uintmax_t; + +#endif /* !_LOONGARCH64_INT_MWGWTYPES_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/int_types.h b/StdLib/Include/LoongArch64/machine/int_types.h new file mode 100644 index 00000000..e5891c0f --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/int_types.h @@ -0,0 +1,63 @@ +/* $NetBSD: int_types.h,v 1.10 2005/12/24 20:07:10 perry Exp $ */ + +/*- + * Copyright (c) 1990 The Regents of the University of California. + * All rights reserved. + * + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)types.h 7.5 (Berkeley) 3/9/91 + */ + +#ifndef _LOONGARCH64_INT_TYPES_H_ +#define _LOONGARCH64_INT_TYPES_H_ + +#include + +/* + * 7.18.1 Integer types + */ + +/* 7.18.1.1 Exact-width integer types */ + +typedef INT8 __int8_t; +typedef UINT8 __uint8_t; +typedef INT16 __int16_t; +typedef UINT16 __uint16_t; +typedef INT32 __int32_t; +typedef UINT32 __uint32_t; +typedef INT64 __int64_t; +typedef UINT64 __uint64_t; + +#define __BIT_TYPES_DEFINED__ + +/* 7.18.1.4 Integer types capable of holding object pointers */ + +typedef INTN __intptr_t; +typedef UINTN __uintptr_t; + +#endif /* !_LOONGARCH64_INT_TYPES_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/limits.h b/StdLib/Include/LoongArch64/machine/limits.h new file mode 100644 index 00000000..3cb20aac --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/limits.h @@ -0,0 +1,97 @@ +/* $NetBSD: limits.h,v 1.9 2008/08/29 19:08:29 matt Exp $ */ + +/* + * Copyright (c) 1988 The Regents of the University of California. + * All rights reserved. + * + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)limits.h 7.2 (Berkeley) 6/28/90 + */ + +#ifndef _LOONGARCH64_LIMITS_H_ +#define _LOONGARCH64_LIMITS_H_ + +#include + +#define __CHAR_BIT 8 /* number of bits in a char */ +//#define __MB_LEN_MAX 32 /* no multibyte characters */ + +#define __SCHAR_MIN (-0x7f-1) /* max value for a signed char */ +#define __SCHAR_MAX 0x7f /* min value for a signed char */ + +#define __UCHAR_MAX 0xff /* max value for an unsigned char */ +#define __CHAR_MAX 0xff /* max value for a char */ +#define __CHAR_MIN 0 /* min value for a char */ + +#define __USHRT_MAX 0xffff /* max value for an unsigned short */ +#define __SHRT_MAX 0x7fff /* max value for a short */ +#define __SHRT_MIN (-0x7fff-1) /* min value for a short */ + +#define __UINT_MAX 0xffffffffU /* max value for an unsigned int */ +#define __INT_MAX 0x7fffffff /* max value for an int */ +#define __INT_MIN (-0x7fffffff-1) /* min value for an int */ + +#define __ULONG_MAX 0xffffffffffffffffUL /* max value for an unsigned long */ +#define __LONG_MAX 0x7fffffffffffffffL /* max value for a long */ +#define __LONG_MIN (-0x7fffffffffffffffL-1) /* min value for a long */ + +#if defined(_POSIX_C_SOURCE) || defined(_XOPEN_SOURCE) || \ + defined(_NETBSD_SOURCE) +#define SSIZE_MAX LONG_MAX /* max value for a ssize_t */ + +#if defined(_ISOC99_SOURCE) || (__STDC_VERSION__ - 0) >= 199901L || \ + defined(_NETBSD_SOURCE) +#define __ULLONG_MAX 0xffffffffffffffffULL /* max unsigned long long */ +#define __LLONG_MAX 0x7fffffffffffffffLL /* max signed long long */ +#define __LLONG_MIN (-0x7fffffffffffffffLL-1) /* min signed long long */ +#endif + +#if defined(_NETBSD_SOURCE) +#define SIZE_T_MAX LONG_MAX /* max value for a size_t */ + +#define UQUAD_MAX 0xffffffffffffffffLL /* max unsigned quad */ +#define QUAD_MAX 0x7fffffffffffffffLL /* max signed quad */ +#define QUAD_MIN (-0x7fffffffffffffffLL-1) /* min signed quad */ + +#endif /* _NETBSD_SOURCE */ +#endif /* _POSIX_C_SOURCE || _XOPEN_SOURCE || _NETBSD_SOURCE */ + +#if defined(_XOPEN_SOURCE) || defined(_NETBSD_SOURCE) +#define LONG_BIT 64 +#define WORD_BIT 32 + +#define DBL_DIG 15 +#define DBL_MAX 1.7976931348623157E+308 +#define DBL_MIN 2.2250738585072014E-308 + +//#define FLT_DIG 6 +//#define FLT_MAX 3.40282347E+38F +//#define FLT_MIN 1.17549435E-38F +#endif + +#endif /* _LOONGARCH64_LIMITS_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/math.h b/StdLib/Include/LoongArch64/machine/math.h new file mode 100644 index 00000000..35ace3d7 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/math.h @@ -0,0 +1,3 @@ +/* $NetBSD: math.h,v 1.2 2002/02/19 13:08:14 simonb Exp $ */ + +#define __HAVE_NANF diff --git a/StdLib/Include/LoongArch64/machine/param.h b/StdLib/Include/LoongArch64/machine/param.h new file mode 100644 index 00000000..b851c0b5 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/param.h @@ -0,0 +1,126 @@ +/* $NetBSD: param.h,v 1.13 2010/05/06 19:10:26 joerg Exp $ */ + +/* + * Copyright (c) 1994,1995 Mark Brinicombe. + * All rights reserved. + * + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the RiscBSD team. + * 4. The name "RiscBSD" nor the name of the author may be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY RISCBSD ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL RISCBSD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef _LOONGARCH64_PARAM_H_ +#define _LOONGARCH64_PARAM_H_ + +// TODO: These were based on the ARMv7 version. Verify that it is correct. + +/* + * Machine dependent constants for all ARM processors + */ + +/* + * For KERNEL code: + * MACHINE must be defined by the individual port. This is so that + * uname returns the correct thing, etc. + * + * MACHINE_ARCH may be defined by individual ports as a temporary + * measure while we're finishing the conversion to ELF. + * + * For non-KERNEL code: + * If ELF, MACHINE and MACHINE_ARCH are forced to "arm/armeb". + */ + +#if defined(_KERNEL) +#undef _MACHINE +#undef MACHINE +#undef _MACHINE_ARCH +#undef MACHINE_ARCH +#define _MACHINE loongarch64 +#define MACHINE "loongarch64" +#define _MACHINE_ARCH loongarch64 +#define MACHINE_ARCH "loongarch64" +#endif /* !_KERNEL */ + +#define MID_MACHINE MID_LOONGARCH64 + +/* + * Round p (pointer or byte index) up to a correctly-aligned value + * for all data types (int, long, ...). The result is u_int and + * must be cast to any desired pointer type. + * + * ALIGNED_POINTER is a boolean macro that checks whether an address + * is valid to fetch data elements of type t from on this architecture. + * This does not reflect the optimal alignment, just the possibility + * (within reasonable limits). + * + */ +#define ALIGNBYTES (sizeof(int) - 1) +#define ALIGN(p) (((u_int)(p) + ALIGNBYTES) &~ ALIGNBYTES) +#define ALIGNED_POINTER(p,t) ((((u_long)(p)) & (sizeof(t)-1)) == 0) +/* ARM-specific macro to align a stack pointer (downwards). */ +#define STACKALIGNBYTES (8 - 1) +#define STACKALIGN(p) ((u_int)(p) &~ STACKALIGNBYTES) + +#define DEV_BSHIFT 9 /* log2(DEV_BSIZE) */ +#define DEV_BSIZE (1 << DEV_BSHIFT) +#define BLKDEV_IOSIZE 2048 + +#ifndef MAXPHYS +#define MAXPHYS 65536 /* max I/O transfer size */ +#endif + +/* + * Constants related to network buffer management. + * MCLBYTES must be no larger than NBPG (the software page size), and, + * on machines that exchange pages of input or output buffers with mbuf + * clusters (MAPPED_MBUFS), MCLBYTES must also be an integral multiple + * of the hardware page size. + */ +#define MSIZE 256 /* size of an mbuf */ + +#ifndef MCLSHIFT +#define MCLSHIFT 11 /* convert bytes to m_buf clusters */ + /* 2K cluster can hold Ether frame */ +#endif /* MCLSHIFT */ + +#define MCLBYTES (1 << MCLSHIFT) /* size of a m_buf cluster */ + +#ifndef NMBCLUSTERS_MAX +#define NMBCLUSTERS_MAX (0x2000000 / MCLBYTES) /* Limit to 64MB for clusters */ +#endif + +/* + * Compatibility /dev/zero mapping. + */ +#ifdef _KERNEL +#ifdef COMPAT_16 +#define COMPAT_ZERODEV(x) (x == makedev(0, _DEV_ZERO_oARM)) +#endif +#endif /* _KERNEL */ + +#endif /* _LOONGARCH64_PARAM_H_ */ diff --git a/StdLib/Include/LoongArch64/machine/signal.h b/StdLib/Include/LoongArch64/machine/signal.h new file mode 100644 index 00000000..6628eb9e --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/signal.h @@ -0,0 +1,22 @@ +/** +Copyright (c) 2010, Intel Corporation. All rights reserved.
+This program and the accompanying materials are licensed and made available under +the terms and conditions of the BSD License that accompanies this distribution. +The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php. + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef _MACHINE_SIGNAL_H +#define _MACHINE_SIGNAL_H +#include + +/** The type sig_atomic_t is the (possibly volatile-qualified) integer type of + an object that can be accessed as an atomic entity, even in the presence + of asynchronous interrupts. +**/ +typedef INTN sig_atomic_t; + +#endif /* _MACHINE_SIGNAL_H */ diff --git a/StdLib/Include/LoongArch64/machine/types.h b/StdLib/Include/LoongArch64/machine/types.h new file mode 100644 index 00000000..a59d5be0 --- /dev/null +++ b/StdLib/Include/LoongArch64/machine/types.h @@ -0,0 +1,82 @@ +/** @file + Machine dependent type definitions. + + Copyright (c) 2010, Intel Corporation. All rights reserved.
+ This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License that accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php. + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + Copyright (c) 1990 The Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + types.h 7.5 (Berkeley) 3/9/91 + NetBSD: types.h,v 1.49 2006/09/03 13:51:23 bjh21 Exp +**/ +#ifndef _MACHTYPES_H_ +#define _MACHTYPES_H_ + +#include +#include +#include + +/* Handle the long and unsigned long data types which EFI doesn't directly support. */ +//typedef INTN LONGN; +//typedef UINTN ULONGN; + +typedef PHYSICAL_ADDRESS paddr_t; +typedef UINT64 psize_t; +typedef PHYSICAL_ADDRESS vaddr_t; +typedef UINT64 vsize_t; + +typedef INT32 pmc_evid_t; +typedef UINT64 pmc_ctr_t; +typedef INT32 register_t; + +typedef volatile INT32 __cpu_simple_lock_t; + +#define __SIMPLELOCK_LOCKED 1 +#define __SIMPLELOCK_UNLOCKED 0 + +/* The ARMv7 does not have strict alignment requirements. */ +#define __NO_STRICT_ALIGNMENT +//TODO: Fixme for the ARM architecture that requires strict alignment + +#define __HAVE_DEVICE_REGISTER +#define __HAVE_CPU_COUNTER +#define __HAVE_SYSCALL_INTERN +#define __HAVE_MINIMAL_EMUL +#define __HAVE_OLD_DISKLABEL +#define __HAVE_GENERIC_SOFT_INTERRUPTS +#define __HAVE_CPU_MAXPROC +#define __HAVE_TIMECOUNTER +#define __HAVE_GENERIC_TODR + +#endif /* _MACHTYPES_H_ */ diff --git a/StdLib/Include/LoongArch64/milieu.h b/StdLib/Include/LoongArch64/milieu.h new file mode 100644 index 00000000..6eabc781 --- /dev/null +++ b/StdLib/Include/LoongArch64/milieu.h @@ -0,0 +1,43 @@ +/* $NetBSD: milieu.h,v 1.1 2000/12/29 20:13:54 bjh21 Exp $ */ + +/* +=============================================================================== + +This C header file is part of the SoftFloat IEC/IEEE Floating-point +Arithmetic Package, Release 2a. + +Written by John R. Hauser. This work was made possible in part by the +International Computer Science Institute, located at Suite 600, 1947 Center +Street, Berkeley, California 94704. Funding was partially provided by the +National Science Foundation under grant MIP-9311980. The original version +of this code was written as part of a project to build a fixed-point vector +processor in collaboration with the University of California at Berkeley, +overseen by Profs. Nelson Morgan and John Wawrzynek. More information +is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ +arithmetic/SoftFloat.html'. + +THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort +has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT +TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO +PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY +AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. + +Derivative works are acceptable, even for commercial purposes, so long as +(1) they include prominent notice that the work is derivative, and (2) they +include prominent notice akin to these four paragraphs for those parts of +this code that are retained. + +=============================================================================== +*/ + +/** @file + * Modified by Loongson Technology Co., Ltd. on 2024/12/08. + * */ + +/* +------------------------------------------------------------------------------- +Include common integer types and flags. +------------------------------------------------------------------------------- +*/ +#include "loongarch-gcc.h" + diff --git a/StdLib/Include/LoongArch64/softfloat.h b/StdLib/Include/LoongArch64/softfloat.h new file mode 100644 index 00000000..c290657d --- /dev/null +++ b/StdLib/Include/LoongArch64/softfloat.h @@ -0,0 +1,316 @@ +/* $NetBSD: softfloat.h,v 1.10 2013/04/24 18:04:46 matt Exp $ */ + +/* This is a derivative work. */ + +/* +=============================================================================== + +This C header file is part of the SoftFloat IEC/IEEE Floating-point +Arithmetic Package, Release 2a. + +Written by John R. Hauser. This work was made possible in part by the +International Computer Science Institute, located at Suite 600, 1947 Center +Street, Berkeley, California 94704. Funding was partially provided by the +National Science Foundation under grant MIP-9311980. The original version +of this code was written as part of a project to build a fixed-point vector +processor in collaboration with the University of California at Berkeley, +overseen by Profs. Nelson Morgan and John Wawrzynek. More information +is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/ +arithmetic/SoftFloat.html'. + +THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort +has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT +TIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO +PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY +AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. + +Derivative works are acceptable, even for commercial purposes, so long as +(1) they include prominent notice that the work is derivative, and (2) they +include prominent notice akin to these four paragraphs for those parts of +this code that are retained. + +=============================================================================== +*/ + +/* +------------------------------------------------------------------------------- +The macro `FLOATX80' must be defined to enable the extended double-precision +floating-point format `floatx80'. If this macro is not defined, the +`floatx80' type will not be defined, and none of the functions that either +input or output the `floatx80' type will be defined. The same applies to +the `FLOAT128' macro and the quadruple-precision format `float128'. +------------------------------------------------------------------------------- +*/ +/* #define FLOATX80 */ +#define FLOAT128 + +#include +#include + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE floating-point types. +------------------------------------------------------------------------------- +*/ +typedef unsigned int float32; +typedef unsigned long long float64; +#ifdef FLOATX80 +typedef struct { + unsigned short high; + unsigned long long low; +} floatx80; +#endif +#ifdef FLOAT128 +typedef struct { + unsigned long long high, low; +} float128; +#endif + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE floating-point underflow tininess-detection mode. +------------------------------------------------------------------------------- +*/ +#ifndef SOFTFLOAT_FOR_GCC +extern int float_detect_tininess; +#endif +enum { + float_tininess_after_rounding = 0, + float_tininess_before_rounding = 1 +}; + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE floating-point rounding mode. +------------------------------------------------------------------------------- +*/ +extern fp_rnd float_rounding_mode; +#define float_round_nearest_even FP_RN +#define float_round_to_zero FP_RZ +#define float_round_down FP_RM +#define float_round_up FP_RP + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE floating-point exception flags. +------------------------------------------------------------------------------- +*/ +extern fp_except float_exception_flags; +extern fp_except float_exception_mask; +enum { + float_flag_inexact = FP_X_IMP, + float_flag_underflow = FP_X_UFL, + float_flag_overflow = FP_X_OFL, + float_flag_divbyzero = FP_X_DZ, + float_flag_invalid = FP_X_INV +}; + +/* +------------------------------------------------------------------------------- +Routine to raise any or all of the software IEC/IEEE floating-point +exception flags. +------------------------------------------------------------------------------- +*/ +void float_raise( fp_except ); + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE integer-to-floating-point conversion routines. +------------------------------------------------------------------------------- +*/ +float32 int32_to_float32( int32 ); +float32 uint32_to_float32( uint32 ); +float64 int32_to_float64( int32 ); +float64 uint32_to_float64( uint32 ); +#ifdef FLOATX80 +floatx80 int32_to_floatx80( int32 ); +floatx80 uint32_to_floatx80( uint32 ); +#endif +#ifdef FLOAT128 +float128 int32_to_float128( int32 ); +float128 uint32_to_float128( uint32 ); +#endif +#ifndef SOFTFLOAT_FOR_GCC /* __floatdi?f is in libgcc2.c */ +float32 int64_to_float32( long long ); +float64 int64_to_float64( long long ); +#ifdef FLOATX80 +floatx80 int64_to_floatx80( long long ); +#endif +#ifdef FLOAT128 +float128 int64_to_float128( long long ); +#endif +#endif + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE single-precision conversion routines. +------------------------------------------------------------------------------- +*/ +int float32_to_int32( float32 ); +int float32_to_int32_round_to_zero( float32 ); +#if defined(SOFTFLOAT_FOR_GCC) && defined(SOFTFLOAT_NEED_FIXUNS) +unsigned int float32_to_uint32_round_to_zero( float32 ); +#endif +#ifndef SOFTFLOAT_FOR_GCC /* __fix?fdi provided by libgcc2.c */ +long long float32_to_int64( float32 ); +long long float32_to_int64_round_to_zero( float32 ); +#endif +float64 float32_to_float64( float32 ); +#ifdef FLOATX80 +floatx80 float32_to_floatx80( float32 ); +#endif +#ifdef FLOAT128 +float128 float32_to_float128( float32 ); +#endif + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE single-precision operations. +------------------------------------------------------------------------------- +*/ +float32 float32_round_to_int( float32 ); +float32 float32_add( float32, float32 ); +float32 float32_sub( float32, float32 ); +float32 float32_mul( float32, float32 ); +float32 float32_div( float32, float32 ); +float32 float32_rem( float32, float32 ); +float32 float32_sqrt( float32 ); +int float32_eq( float32, float32 ); +int float32_le( float32, float32 ); +int float32_lt( float32, float32 ); +int float32_eq_signaling( float32, float32 ); +int float32_le_quiet( float32, float32 ); +int float32_lt_quiet( float32, float32 ); +#ifndef SOFTFLOAT_FOR_GCC +int float32_is_signaling_nan( float32 ); +#endif + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE double-precision conversion routines. +------------------------------------------------------------------------------- +*/ +int float64_to_int32( float64 ); +int float64_to_int32_round_to_zero( float64 ); +#if defined(SOFTFLOAT_FOR_GCC) && defined(SOFTFLOAT_NEED_FIXUNS) +unsigned int float64_to_uint32_round_to_zero( float64 ); +#endif +#ifndef SOFTFLOAT_FOR_GCC /* __fix?fdi provided by libgcc2.c */ +long long float64_to_int64( float64 ); +long long float64_to_int64_round_to_zero( float64 ); +#endif +float32 float64_to_float32( float64 ); +#ifdef FLOATX80 +floatx80 float64_to_floatx80( float64 ); +#endif +#ifdef FLOAT128 +float128 float64_to_float128( float64 ); +#endif + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE double-precision operations. +------------------------------------------------------------------------------- +*/ +float64 float64_round_to_int( float64 ); +float64 float64_add( float64, float64 ); +float64 float64_sub( float64, float64 ); +float64 float64_mul( float64, float64 ); +float64 float64_div( float64, float64 ); +float64 float64_rem( float64, float64 ); +float64 float64_sqrt( float64 ); +int float64_eq( float64, float64 ); +int float64_le( float64, float64 ); +int float64_lt( float64, float64 ); +int float64_eq_signaling( float64, float64 ); +int float64_le_quiet( float64, float64 ); +int float64_lt_quiet( float64, float64 ); +#ifndef SOFTFLOAT_FOR_GCC +int float64_is_signaling_nan( float64 ); +#endif + +#ifdef FLOATX80 + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE extended double-precision conversion routines. +------------------------------------------------------------------------------- +*/ +int floatx80_to_int32( floatx80 ); +int floatx80_to_int32_round_to_zero( floatx80 ); +long long floatx80_to_int64( floatx80 ); +long long floatx80_to_int64_round_to_zero( floatx80 ); +float32 floatx80_to_float32( floatx80 ); +float64 floatx80_to_float64( floatx80 ); +#ifdef FLOAT128 +float128 floatx80_to_float128( floatx80 ); +#endif + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE extended double-precision rounding precision. Valid +values are 32, 64, and 80. +------------------------------------------------------------------------------- +*/ +extern int floatx80_rounding_precision; + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE extended double-precision operations. +------------------------------------------------------------------------------- +*/ +floatx80 floatx80_round_to_int( floatx80 ); +floatx80 floatx80_add( floatx80, floatx80 ); +floatx80 floatx80_sub( floatx80, floatx80 ); +floatx80 floatx80_mul( floatx80, floatx80 ); +floatx80 floatx80_div( floatx80, floatx80 ); +floatx80 floatx80_rem( floatx80, floatx80 ); +floatx80 floatx80_sqrt( floatx80 ); +int floatx80_eq( floatx80, floatx80 ); +int floatx80_le( floatx80, floatx80 ); +int floatx80_lt( floatx80, floatx80 ); +int floatx80_eq_signaling( floatx80, floatx80 ); +int floatx80_le_quiet( floatx80, floatx80 ); +int floatx80_lt_quiet( floatx80, floatx80 ); +int floatx80_is_signaling_nan( floatx80 ); + +#endif + +#ifdef FLOAT128 + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE quadruple-precision conversion routines. +------------------------------------------------------------------------------- +*/ +int float128_to_int32( float128 ); +int float128_to_int32_round_to_zero( float128 ); +long long float128_to_int64( float128 ); +long long float128_to_int64_round_to_zero( float128 ); +float32 float128_to_float32( float128 ); +float64 float128_to_float64( float128 ); +#ifdef FLOATX80 +floatx80 float128_to_floatx80( float128 ); +#endif + +/* +------------------------------------------------------------------------------- +Software IEC/IEEE quadruple-precision operations. +------------------------------------------------------------------------------- +*/ +float128 float128_round_to_int( float128 ); +float128 float128_add( float128, float128 ); +float128 float128_sub( float128, float128 ); +float128 float128_mul( float128, float128 ); +float128 float128_div( float128, float128 ); +float128 float128_rem( float128, float128 ); +float128 float128_sqrt( float128 ); +int float128_eq( float128, float128 ); +int float128_le( float128, float128 ); +int float128_lt( float128, float128 ); +int float128_eq_signaling( float128, float128 ); +int float128_le_quiet( float128, float128 ); +int float128_lt_quiet( float128, float128 ); +int float128_is_signaling_nan( float128 ); + +#endif diff --git a/StdLib/LibC/LibC.inf b/StdLib/LibC/LibC.inf index 93e32e8d..40b22222 100644 --- a/StdLib/LibC/LibC.inf +++ b/StdLib/LibC/LibC.inf @@ -117,3 +117,4 @@ MSFT:*_*_IA32_CC_FLAGS = /GL- GCC:*_*_IA32_CC_FLAGS = -fno-lto GCC:*_*_ARM_CC_FLAGS = -fno-lto + GCC:*_*_LOONGARCH64_CC_FLAGS = -fno-lto diff --git a/StdLib/LibC/Softfloat/Softfloat.inf b/StdLib/LibC/Softfloat/Softfloat.inf index b7a4f1cc..c174ab91 100644 --- a/StdLib/LibC/Softfloat/Softfloat.inf +++ b/StdLib/LibC/Softfloat/Softfloat.inf @@ -43,7 +43,7 @@ Arm/__aeabi_dcmpun.c Arm/__aeabi_fcmpun.c -[Sources.AARCH64] +[Sources.AARCH64, Sources.LOONGARCH64] bits64/softfloat.c eqtf2.c getf2.c diff --git a/StdLib/LibC/String/Copying.c b/StdLib/LibC/String/Copying.c index a50331bd..8632596e 100644 --- a/StdLib/LibC/String/Copying.c +++ b/StdLib/LibC/String/Copying.c @@ -24,7 +24,7 @@ CopyMem by objcpy during build. For ARM/AARCH64, the memcpy function is provided by the CompilerIntrinsics library. **/ -#if !((defined(MDE_CPU_IPF) || defined(MDE_CPU_ARM) || defined(MDE_CPU_AARCH64)) && defined(__GNUC__)) +#if !((defined(MDE_CPU_IPF) || defined(MDE_CPU_ARM) || defined(MDE_CPU_AARCH64) || defined(MDE_CPU_LOONGARCH64)) && defined(__GNUC__)) /** The memcpy function copies n characters from the object pointed to by s2 into the object pointed to by s1. diff --git a/StdLib/LibC/gdtoa/gdtoa.inf b/StdLib/LibC/gdtoa/gdtoa.inf index 51def1c7..9d975bb8 100644 --- a/StdLib/LibC/gdtoa/gdtoa.inf +++ b/StdLib/LibC/gdtoa/gdtoa.inf @@ -38,11 +38,7 @@ strtold_px.c strtopx.c -[Sources.ARM] - strtof.c - Ipf/strtold.c - -[Sources.AARCH64] +[Sources.ARM, Sources.AARCH64, Sources.LOONGARCH64] strtof.c Ipf/strtold.c diff --git a/StdLib/StdLib.dec b/StdLib/StdLib.dec index 8ea2a106..5b9773bc 100644 --- a/StdLib/StdLib.dec +++ b/StdLib/StdLib.dec @@ -29,6 +29,8 @@ [Includes.AARCH64] Include/Aarch64 +[Includes.LoongArch64] + Include/LoongArch64 [Guids] gStdLibTokenSpaceGuid = { 0x447559f0, 0xd02e, 0x4cf1, { 0x99, 0xbc, 0xca, 0x11, 0x65, 0x40, 0x54, 0xc2 }} diff --git a/StdLib/StdLib.dsc b/StdLib/StdLib.dsc index d064a1ec..d56a76cd 100644 --- a/StdLib/StdLib.dsc +++ b/StdLib/StdLib.dsc @@ -21,7 +21,7 @@ PLATFORM_VERSION = 0.01 DSC_SPECIFICATION = 0x00010006 OUTPUT_DIRECTORY = Build/StdLib - SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64 + SUPPORTED_ARCHITECTURES = IA32|X64|ARM|AARCH64|LOONGARCH64 BUILD_TARGETS = DEBUG|RELEASE|NOOPT SKUID_IDENTIFIER = DEFAULT diff --git a/StdLib/StdLib.inc b/StdLib/StdLib.inc index 164527b3..9182096f 100644 --- a/StdLib/StdLib.inc +++ b/StdLib/StdLib.inc @@ -65,7 +65,7 @@ LuaLib|AppPkg/Applications/Lua/LuaLib.inf # Lua language library -[LibraryClasses.ARM, LibraryClasses.AArch64] +[LibraryClasses.ARM, LibraryClasses.AArch64, LibraryClasses.LOONGARCH64] !if "MSFT" not in $(FAMILY) NULL|MdePkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf !endif diff --git a/StdLibPrivateInternalFiles/DoNotUse.dec b/StdLibPrivateInternalFiles/DoNotUse.dec index 113293d0..981c764b 100644 --- a/StdLibPrivateInternalFiles/DoNotUse.dec +++ b/StdLibPrivateInternalFiles/DoNotUse.dec @@ -28,3 +28,6 @@ [Includes.AARCH64] # Use the ARM headers for now. Include/Arm + +[Includes.LOONGARCH64] + Include/LoongArch64 diff --git a/StdLibPrivateInternalFiles/Include/LoongArch64/arith.h b/StdLibPrivateInternalFiles/Include/LoongArch64/arith.h new file mode 100644 index 00000000..e759ec2b --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/LoongArch64/arith.h @@ -0,0 +1,9 @@ +/* $NetBSD: arith.h,v 1.1 2006/01/25 15:33:28 kleink Exp $ */ + +#include + +#if BYTE_ORDER == BIG_ENDIAN +#define IEEE_BIG_ENDIAN +#else +#define IEEE_LITTLE_ENDIAN +#endif diff --git a/StdLibPrivateInternalFiles/Include/LoongArch64/gd_qnan.h b/StdLibPrivateInternalFiles/Include/LoongArch64/gd_qnan.h new file mode 100644 index 00000000..57c5affe --- /dev/null +++ b/StdLibPrivateInternalFiles/Include/LoongArch64/gd_qnan.h @@ -0,0 +1,12 @@ +/* $NetBSD: gd_qnan.h,v 1.1 2006/01/25 15:33:28 kleink Exp $ */ + +#include + +#define f_QNAN 0x7fc00000 +#if BYTE_ORDER == BIG_ENDIAN +#define d_QNAN0 0x7ff80000 +#define d_QNAN1 0x0 +#else +#define d_QNAN0 0x0 +#define d_QNAN1 0x7ff80000 +#endif