/*
|
* Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and
|
* its subsidiaries and affiliates (collectly called MKSEMI).
|
*
|
* 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, except as embedded into an MKSEMI
|
* integrated circuit in a product or a software update for such product,
|
* 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 MKSEMI nor the names of its contributors may be used
|
* to endorse or promote products derived from this software without
|
* specific prior written permission.
|
*
|
* 4. This software, with or without modification, must only be used with a
|
* MKSEMI integrated circuit.
|
*
|
* 5. Any software provided in binary form under this license must not be
|
* reverse engineered, decompiled, modified and/or disassembled.
|
*
|
* THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
* DISCLAIMED. IN NO EVENT SHALL MKSEMI 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 LIBC_ROM_H__
|
#define LIBC_ROM_H__
|
#include "stdint.h"
|
#include "stdbool.h"
|
#include "stdarg.h"
|
|
#include "string.h"
|
#include "stdio.h"
|
#include "stdlib.h"
|
#include "math.h"
|
|
#ifndef STD_LIBC
|
|
#ifdef __cplusplus
|
extern "C" {
|
#endif
|
|
typedef void *(*__MEMCPY)(void *, const void *, size_t);
|
typedef void *(*__MEMMOVE)(void *, const void *, size_t);
|
typedef char *(*__STRCPY)(char *, const char *);
|
typedef char *(*__STRNCPY)(char *, const char *, size_t);
|
typedef char *(*__STRCAT)(char *, const char *);
|
typedef char *(*__STRNCAT)(char *, const char *, size_t);
|
typedef int (*__MEMCMP)(const void *, const void *, size_t);
|
typedef int (*__STRCMP)(const char *, const char *);
|
typedef int (*__STRNCMP)(const char *, const char *, size_t);
|
typedef int (*__STRCASECMP)(const char *, const char *);
|
typedef int (*__STRNCASECMP)(const char *, const char *, size_t);
|
typedef int (*__STRCOLL)(const char *, const char *);
|
typedef size_t (*__STRXFRM)(char *, const char *, size_t);
|
typedef void *(*__MEMCHR)(const void *, int, size_t);
|
typedef char *(*__STRCHR)(const char *, int);
|
typedef size_t (*__STRCSPN)(const char *, const char *);
|
typedef char *(*__STRPBRK)(const char *, const char *);
|
typedef char *(*__STRRCHR)(const char *, int);
|
typedef size_t (*__STRSPN)(const char *, const char *);
|
typedef char *(*__STRSTR)(const char *, const char *);
|
typedef char *(*__STRTOK)(char *, const char *);
|
typedef char *(*__STRTOK_R)(char *, const char *, char **);
|
typedef void *(*__MEMSET)(void *, int, size_t);
|
typedef char *(*__STRERROR)(int);
|
typedef size_t (*__STRLEN)(const char *);
|
typedef size_t (*__STRLCPY)(char *, const char *, size_t);
|
typedef size_t (*__STRLCAT)(char *, const char *, size_t);
|
|
typedef int (*__PRINTF)(const char *, ...);
|
typedef int (*__SCANF)(const char *, ...);
|
typedef int (*__SPRINTF)(char *buf, const char *fmt, ...);
|
typedef int (*__SNPRINTF)(char *buf, size_t len, const char *fmt, ...);
|
typedef int (*__SSCANF)(const char *buf, const char *fmt, ...);
|
typedef int (*__VSPRINTF)(char *buf, const char *fmt, va_list ap);
|
typedef int (*__VSNPRINTF)(char *buf, size_t size, const char *fmt, va_list ap);
|
typedef int (*__VSSCANF)(const char *fp, const char *fmt0, va_list ap);
|
|
typedef double (*__ATOF)(const char *);
|
typedef int (*__ATOI)(const char *);
|
typedef long int (*__ATOL)(const char *);
|
typedef long long (*__ATOLL)(const char *);
|
typedef double (*__STRTOD)(const char *, char **);
|
typedef float (*__STRTOF)(const char *, char **);
|
typedef long double (*__STRTOLD)(const char *, char **);
|
typedef long int (*__STRTOL)(const char *, char **, int);
|
typedef unsigned long int (*__STRTOUL)(const char *, char **, int);
|
typedef long long (*__STRTOLL)(const char *, char **, int);
|
typedef unsigned long long (*__STRTOULL)(const char *, char **, int);
|
typedef int (*__RAND)(void);
|
typedef void (*__SRAND)(unsigned int);
|
typedef void *(*__CALLOC)(size_t, size_t);
|
typedef void (*__FREE)(void *);
|
typedef void *(*__MALLOC)(size_t);
|
typedef void *(*__BSEARCH)(const void *, const void *, size_t, size_t, int (*)(const void *, const void *));
|
typedef void (*__QSORT)(void *, size_t, size_t, int (*)(const void *, const void *));
|
typedef int (*__ABS)(int);
|
typedef div_t (*__DIV)(int, int);
|
typedef long int (*__LABS)(long int);
|
typedef ldiv_t (*__LDIV)(long int, long int);
|
typedef long long (*__LLABS)(long long);
|
typedef lldiv_t (*__LLDIV)(long long, long long);
|
typedef int (*__MBLEN)(const char *, size_t);
|
typedef int (*__MBTOWC)(wchar_t *, const char *, size_t);
|
typedef int (*__WCTOMB)(char *, wchar_t);
|
typedef size_t (*__MBSTOWCS)(wchar_t *, const char *, size_t);
|
typedef size_t (*__WCSTOMBS)(char *, const wchar_t *, size_t);
|
|
typedef double (*__ACOS)(double);
|
typedef double (*__ASIN)(double);
|
typedef double (*__ATAN)(double);
|
typedef double (*__ATAN2)(double, double);
|
typedef double (*__COS)(double);
|
typedef double (*__SIN)(double);
|
typedef double (*__TAN)(double);
|
typedef double (*__COSH)(double);
|
typedef double (*__SINH)(double);
|
typedef double (*__TANH)(double);
|
typedef double (*__EXP)(double);
|
typedef double (*__FREXP)(double, int *);
|
typedef double (*__LDEXP)(double, int);
|
typedef double (*__LOG)(double);
|
typedef double (*__LOG10)(double);
|
typedef double (*__MODF)(double, double *);
|
typedef double (*__POW)(double, double);
|
typedef double (*__SQRT)(double);
|
typedef double (*__CEIL)(double);
|
typedef double (*__FABS)(double);
|
typedef double (*__FLOOR)(double);
|
typedef double (*__FMOD)(double, double);
|
typedef double (*__ACOSH)(double);
|
typedef double (*__ASINH)(double);
|
typedef double (*__ATANH)(double);
|
typedef double (*__CBRT)(double);
|
typedef double (*__ERF)(double);
|
typedef double (*__ERFC)(double);
|
typedef double (*__EXPM1)(double);
|
typedef double (*__HYPOT)(double, double);
|
typedef int (*__ILOGB)(double);
|
typedef int (*__ILOGBF)(float);
|
typedef int (*__ILOGBL)(long double);
|
typedef double (*__LGAMMA)(double);
|
typedef double (*__LOG1P)(double);
|
typedef double (*__LOGB)(double);
|
typedef float (*__LOGBF)(float);
|
typedef long double (*__LOGBL)(long double);
|
typedef double (*__NEXTAFTER)(double, double);
|
typedef float (*__NEXTAFTERF)(float, float);
|
typedef long double (*__NEXTAFTERL)(long double, long double);
|
typedef double (*__NEXTTOWARD)(double, long double);
|
typedef float (*__NEXTTOWARDF)(float, long double);
|
typedef long double (*__NEXTTOWARDL)(long double, long double);
|
typedef double (*__REMAINDER)(double, double);
|
typedef double (*__RINT)(double);
|
typedef double (*__SCALBLN)(double, long int);
|
typedef float (*__SCALBLNF)(float, long int);
|
typedef long double (*__SCALBLNL)(long double, long int);
|
// typedef double (*__SCALBN)(double, int);
|
// typedef float (*__SCALBNF)(float, int);
|
typedef long double (*__SCALBNL)(long double, int);
|
typedef float (*__FABSF)(float);
|
typedef float (*__SINF)(float);
|
typedef float (*__COSF)(float);
|
typedef float (*__TANF)(float);
|
typedef float (*__ACOSF)(float);
|
typedef float (*__ASINF)(float);
|
typedef float (*__ATANF)(float);
|
typedef float (*__ATAN2F)(float, float);
|
typedef float (*__SINHF)(float);
|
typedef float (*__COSHF)(float);
|
typedef float (*__TANHF)(float);
|
typedef float (*__EXPF)(float);
|
typedef float (*__LOGF)(float);
|
typedef float (*__LOG10F)(float);
|
typedef float (*__POWF)(float, float);
|
typedef float (*__SQRTF)(float);
|
typedef float (*__LDEXPF)(float, int);
|
typedef float (*__FREXPF)(float, int *);
|
typedef float (*__CEILF)(float);
|
typedef float (*__FLOORF)(float);
|
typedef float (*__FMODF)(float, float);
|
typedef float (*__MODFF)(float, float *);
|
|
/* C99 long double versions of functions. */
|
typedef long double (*__ACOSL)(long double);
|
typedef long double (*__ASINL)(long double);
|
typedef long double (*__ATANL)(long double);
|
typedef long double (*__ATAN2L)(long double, long double);
|
typedef long double (*__CEILL)(long double);
|
typedef long double (*__COSL)(long double);
|
typedef long double (*__COSHL)(long double);
|
typedef long double (*__EXPL)(long double);
|
typedef long double (*__FABSL)(long double);
|
typedef long double (*__FLOORL)(long double);
|
typedef long double (*__FMODL)(long double, long double);
|
typedef long double (*__FREXPL)(long double, int *);
|
typedef long double (*__LDEXPL)(long double, int);
|
typedef long double (*__LOGL)(long double);
|
typedef long double (*__LOG10L)(long double);
|
typedef long double (*__MODFL)(long double, long double *);
|
typedef long double (*__POWL)(long double, long double);
|
typedef long double (*__SINL)(long double);
|
typedef long double (*__SINHL)(long double);
|
typedef long double (*__SQRTL)(long double);
|
typedef long double (*__TANL)(long double);
|
typedef long double (*__TANHL)(long double);
|
|
typedef float (*__ACOSHF)(float);
|
typedef long double (*__ACOSHL)(long double);
|
typedef float (*__ASINHF)(float);
|
typedef long double (*__ASINHL)(long double);
|
typedef float (*__ATANHF)(float);
|
typedef long double (*__ATANHL)(long double);
|
typedef long double (*__COPYSIGNL)(long double, long double);
|
typedef float (*__CBRTF)(float);
|
typedef long double (*__CBRTL)(long double);
|
typedef float (*__ERFF)(float);
|
typedef long double (*__ERFL)(long double);
|
typedef float (*__ERFCF)(float);
|
typedef long double (*__ERFCL)(long double);
|
typedef float (*__EXPM1F)(float);
|
typedef long double (*__EXPM1L)(long double);
|
typedef float (*__LOG1PF)(float);
|
typedef long double (*__LOG1PL)(long double);
|
typedef float (*__HYPOTF)(float, float);
|
typedef long double (*__HYPOTL)(long double, long double);
|
typedef float (*__LGAMMAF)(float);
|
typedef long double (*__LGAMMAL)(long double);
|
typedef float (*__REMAINDERF)(float, float);
|
typedef long double (*__REMAINDERL)(long double, long double);
|
typedef float (*__RINTF)(float);
|
typedef long double (*__RINTL)(long double);
|
|
typedef double (*__EXP2)(double); /* * 2.^x. */
|
typedef float (*__EXP2F)(float);
|
typedef long double (*__EXP2L)(long double);
|
typedef double (*__FDIM)(double, double);
|
typedef float (*__FDIMF)(float, float);
|
typedef long double (*__FDIML)(long double, long double);
|
|
typedef double (*__FMA)(double, double, double);
|
typedef float (*__FMAF)(float, float, float);
|
|
typedef double (*__FMAX)(double, double);
|
typedef float (*__FMAXF)(float, float);
|
typedef long double (*__FMAXL)(long double, long double);
|
typedef double (*__FMIN)(double, double);
|
typedef float (*__FMINF)(float, float);
|
typedef long double (*__FMINL)(long double, long double);
|
typedef double (*__LOG2)(double); /* * log base 2 of x. */
|
typedef float (*__LOG2F)(float);
|
typedef long double (*__LOG2L)(long double);
|
typedef long (*__LRINT)(double);
|
typedef long (*__LRINTF)(float);
|
|
typedef long long (*__LLRINT)(double);
|
typedef long long (*__LLRINTF)(float);
|
|
typedef long (*__LROUND)(double);
|
typedef long (*__LROUNDF)(float);
|
|
typedef long long (*__LLROUND)(double);
|
typedef long long (*__LLROUNDF)(float);
|
|
typedef double (*__NAN)(const char *);
|
typedef float (*__NANF)(const char *);
|
|
typedef double (*__NEARBYINT)(double);
|
typedef float (*__NEARBYINTF)(float);
|
typedef long double (*__NEARBYINTL)(long double);
|
typedef double (*__REMQUO)(double, double, int *);
|
typedef float (*__REMQUOF)(float, float, int *);
|
|
typedef double (*__ROUND)(double);
|
typedef float (*__ROUNDF)(float);
|
typedef long double (*__ROUNDL)(long double);
|
typedef double (*__TGAMMA)(double); /* * The gamma function of x. */
|
typedef float (*__TGAMMAF)(float);
|
typedef long double (*__TGAMMAL)(long double);
|
typedef double (*__TRUNC)(double);
|
typedef float (*__TRUNCF)(float);
|
typedef long double (*__TRUNCL)(long double);
|
|
struct LIBC_ROM_T
|
{
|
// string.h
|
__MEMCPY memcpy;
|
__MEMMOVE memmove;
|
__STRCPY strcpy;
|
__STRNCPY strncpy;
|
__STRCAT strcat;
|
__STRNCAT strncat;
|
__MEMCMP memcmp;
|
__STRCMP strcmp;
|
__STRNCMP strncmp;
|
__STRCASECMP strcasecmp;
|
__STRNCASECMP strncasecmp;
|
__STRCOLL strcoll;
|
__STRXFRM strxfrm;
|
__MEMCHR memchr;
|
__STRCHR strchr;
|
__STRCSPN strcspn;
|
__STRPBRK strpbrk;
|
__STRRCHR strrchr;
|
__STRSPN strspn;
|
__STRSTR strstr;
|
__STRTOK strtok;
|
//__STRTOK_R strtok_r;
|
__MEMSET memset;
|
__STRERROR strerror;
|
__STRLEN strlen;
|
__STRLCPY strlcpy;
|
__STRLCAT strlcat;
|
|
// stdio.h
|
//__PRINTF printf;
|
//__SCANF scanf;
|
__SPRINTF sprintf;
|
__SNPRINTF snprintf;
|
__SSCANF sscanf;
|
__VSSCANF vsscanf;
|
__VSPRINTF vsprintf;
|
__VSNPRINTF vsnprintf;
|
|
// stdlib.h
|
__ATOF atof;
|
__ATOI atoi;
|
__ATOL atol;
|
__ATOLL atoll;
|
__STRTOD strtod;
|
__STRTOF strtof;
|
__STRTOLD strtold;
|
|
__STRTOL strtol;
|
__STRTOUL strtoul;
|
__STRTOLL strtoll;
|
__STRTOULL strtoull;
|
__RAND rand;
|
__SRAND srand;
|
|
//__CALLOC calloc;
|
//__FREE free;
|
//__MALLOC malloc;
|
|
__BSEARCH bsearch;
|
__QSORT qsort;
|
__ABS abs;
|
__DIV div;
|
__LABS labs;
|
__LDIV ldiv;
|
__LLABS llabs;
|
__LLDIV lldiv;
|
|
//__MBLEN mblen;
|
//__MBTOWC mbtowc;
|
//__WCTOMB wctomb;
|
//__MBSTOWCS mbstowcs;
|
//__WCSTOMBS wcstombs;
|
|
// math.h
|
|
__ACOS acos;
|
__ASIN asin;
|
__ATAN2 atan2;
|
__ATAN atan;
|
__CEIL ceil;
|
__COS cos;
|
__COSH cosh;
|
__EXP exp;
|
__FABS fabs;
|
__FLOOR floor;
|
__FMOD fmod;
|
__FREXP frexp;
|
__LDEXP ldexp;
|
__LOG10 log10;
|
__LOG log;
|
__MODF modf;
|
__POW pow;
|
__SIN sin;
|
__SINH sinh;
|
__SQRT sqrt;
|
__TAN tan;
|
__TANH tanh;
|
/* C99 float and long double versions in already-C89-reserved namespace */
|
__ACOSF acosf;
|
__ACOSL acosl;
|
__ASINF asinf;
|
__ASINL asinl;
|
__ATAN2F atan2f;
|
__ATAN2L atan2l;
|
__ATANF atanf;
|
__ATANL atanl;
|
__CEILF ceilf;
|
__CEILL ceill;
|
__COSF cosf;
|
__COSHF coshf;
|
__COSHL coshl;
|
__COSL cosl;
|
__EXPF expf;
|
__EXPL expl;
|
__FABSF fabsf;
|
__FABSL fabsl;
|
__FLOORF floorf;
|
__FLOORL floorl;
|
__FMODF fmodf;
|
__FMODL fmodl;
|
__FREXPF frexpf;
|
__FREXPL frexpl;
|
__LDEXPF ldexpf;
|
__LDEXPL ldexpl;
|
__LOG10F log10f;
|
__LOG10L log10l;
|
__LOGF logf;
|
__LOGL logl;
|
__MODFF modff;
|
__MODFL modfl;
|
__POWF powf;
|
__POWL powl;
|
__SINF sinf;
|
__SINHF sinhf;
|
__SINHL sinhl;
|
__SINL sinl;
|
__SQRTF sqrtf;
|
__SQRTL sqrtl;
|
__TANF tanf;
|
__TANHF tanhf;
|
__TANHL tanhl;
|
__TANL tanl;
|
__ACOSH acosh;
|
__ASINH asinh;
|
__ATANH atanh;
|
__CBRT cbrt;
|
|
__ERF erf;
|
__ERFC erfc;
|
__EXPM1 expm1;
|
__HYPOT hypot;
|
//__ILOGB ilogb;
|
//__ILOGBF ilogbf;
|
//__ILOGBL ilogbl;
|
//__LGAMMA lgamma;
|
__LOG1P log1p;
|
//__LOGB logb;
|
//__LOGBF logbf;
|
//__LOGBL logbl;
|
//__NEXTAFTER nextafter;
|
//__NEXTAFTERF nextafterf;
|
//__NEXTAFTERL nextafterl;
|
//__NEXTTOWARD nexttoward;
|
//__NEXTTOWARDF nexttowardf;
|
//__NEXTTOWARDL nexttowardl;
|
__REMAINDER remainder;
|
__RINT rint;
|
__SCALBLN scalbln;
|
__SCALBLNF scalblnf;
|
__SCALBLNL scalblnl;
|
//__SCALBN scalbn;
|
//__SCALBNF scalbnf;
|
//__SCALBNL scalbnl;
|
|
__ACOSHF acoshf;
|
__ACOSHL acoshl;
|
__ASINHF asinhf;
|
__ASINHL asinhl;
|
__ATANHF atanhf;
|
__ATANHL atanhl;
|
__COPYSIGNL copysignl;
|
__CBRTF cbrtf;
|
__CBRTL cbrtl;
|
__ERFF erff;
|
__ERFL erfl;
|
__ERFCF erfcf;
|
__ERFCL erfcl;
|
__EXPM1F expm1f;
|
__EXPM1L expm1l;
|
__LOG1PF log1pf;
|
__LOG1PL log1pl;
|
__HYPOTF hypotf;
|
__HYPOTL hypotl;
|
//__LGAMMAF lgammaf;
|
//__LGAMMAL lgammal;
|
__REMAINDERF remainderf;
|
__REMAINDERL remainderl;
|
__RINTF rintf;
|
__RINTL rintl;
|
|
/* Functions new in C99. */
|
__EXP2 exp2;
|
__EXP2F exp2f;
|
__EXP2L exp2l;
|
__FDIM fdim;
|
__FDIMF fdimf;
|
__FDIML fdiml;
|
__FMA fma;
|
__FMAF fmaf;
|
|
__FMAX fmax;
|
__FMAXF fmaxf;
|
__FMAXL fmaxl;
|
__FMIN fmin;
|
__FMINF fminf;
|
__FMINL fminl;
|
__LOG2 log2;
|
__LOG2F log2f;
|
__LOG2L log2l;
|
__LRINT lrint;
|
__LRINTF lrintf;
|
__LLRINT llrint;
|
__LLRINTF llrintf;
|
__LROUND lround;
|
__LROUNDF lroundf;
|
__LLROUND llround;
|
__LLROUNDF llroundf;
|
__NAN nan;
|
__NANF nanf;
|
__NEARBYINT nearbyint;
|
__NEARBYINTF nearbyintf;
|
__NEARBYINTL nearbyintl;
|
__REMQUO remquo;
|
__REMQUOF remquof;
|
__ROUND round;
|
__ROUNDF roundf;
|
__ROUNDL roundl;
|
__TGAMMA tgamma;
|
__TGAMMAF tgammaf;
|
__TGAMMAL tgammal;
|
__TRUNC trunc;
|
__TRUNCF truncf;
|
__TRUNCL truncl;
|
};
|
|
void update_libc_rom_table(void);
|
|
#ifdef __cplusplus
|
}
|
#endif
|
|
#endif
|
|
#endif /* LIBC_ROM_H__ */
|