Skip to content

Commit

Permalink
Match fdlibm & PPCArch.c
Browse files Browse the repository at this point in the history
fdlibm seems to be available in archives and already used in pikmin, so
I've just grabbed the files from it used by sms. Note that fabs mangling
seems to be screwed up in fdlibm TUs somehow and is c++-style even
though the library itself is C, so for now we work around thata instead
of trying to figure out what originally happened.

Also cleaned up PPCArch.c to be at 100%.
  • Loading branch information
Mrkol committed Dec 22, 2024
1 parent fa95dea commit 69035bd
Show file tree
Hide file tree
Showing 10 changed files with 666 additions and 178 deletions.
32 changes: 30 additions & 2 deletions configure.py
Original file line number Diff line number Diff line change
Expand Up @@ -369,12 +369,40 @@ def MatchingFor(*versions):
"mw_version": "GC/1.2.5",
"cflags": cflags_runtime,
"objects": [
Object(Matching, "MSL_C.PPCEABI.bare.H/hyperbolicsf.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/ansi_files.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/abort_exit.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/errno.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/ansi_fp.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/buffer_io.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/critical_regions.ppc_eabi.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/ctype.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/direct_io.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/mbstring.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/mem.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/mem_funcs.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/misc_io.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/printf.c"),
Object(Matching, "MSL_C.PPCEABI.bare.H/rand.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/scanf.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/string.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/strtoul.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/float.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/uart_consolle_io.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/wchar_io.c"),
Object(Matching, "MSL_C.PPCEABI.bare.H/e_asin.c"),
Object(Matching, "MSL_C.PPCEABI.bare.H/e_atan2.c"),
Object(Matching, "MSL_C.PPCEABI.bare.H/s_atan.c"),
Object(Matching, "MSL_C.PPCEABI.bare.H/s_frexp.c"),
Object(Matching, "MSL_C.PPCEABI.bare.H/w_atan2.c"),
Object(Matching, "MSL_C.PPCEABI.bare.H/hyperbolicsf.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/inverse_trig.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/trigf.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/common_float_tables.c"),
# Object(Matching, "MSL_C.PPCEABI.bare.H/exponentialsf.c"),
],
},
DolphinLib("base", [
Object(NonMatching, "base/PPCArch.c"),
Object(Matching, "base/PPCArch.c"),
]),
DolphinLib("db", [
Object(Matching, "db/db.c"),
Expand Down
234 changes: 234 additions & 0 deletions include/MSL_C.PPCEABI.bare.H/fdlibm.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,234 @@
#ifndef _FDLIBM_H
#define _FDLIBM_H

#include "dolphin/types.h"

/* @(#)fdlibm.h 1.5 04/04/22 */
/**
* ====================================================
* Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved.
*
* Permission to use, copy, modify, and distribute this
* software is freely granted, provided that this notice
* is preserved.
* ====================================================
*/

#ifdef __cplusplus
extern "C" {
#endif // ifdef __cplusplus

/* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly
but these catch some common cases. */

#if defined(i386) || defined(i486) || defined(intel) || defined(x86) || defined(i86pc) || defined(__alpha) || defined(__osf__)
#define __LITTLE_ENDIAN
#endif

#ifdef __LITTLE_ENDIAN
#define __HI(x) *(1 + (int*)&x)
#define __LO(x) *(int*)&x
#define __HIp(x) *(1 + (int*)x)
#define __LOp(x) *(int*)x
#else
#define __HI(x) *(int*)&x
#define __LO(x) *(1 + (int*)&x)
#define __HIp(x) *(int*)x
#define __LOp(x) *(1 + (int*)x)
#endif

// NOTE: should be enabled according to w_atan2.c
#define _IEEE_LIBM

// TODO: should __STDC__ actually be defined?
// #ifdef __STDC__
#define __P(p) p
// #else
// #define __P(p) ()
// #endif

/**
* ANSI/POSIX
*/

extern int signgam;

#define MAXFLOAT ((f32)3.40282346638528860e+38)

enum fdversion { fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix };

#define _LIB_VERSION_TYPE enum fdversion
#define _LIB_VERSION _fdlib_version

/* if global variable _LIB_VERSION is not desirable, one may
* change the following to be a constant by:
* #define _LIB_VERSION_TYPE const enum version
* In that case, after one initializes the value _LIB_VERSION (see
* s_lib_version.c) during compile time, it cannot be modified
* in the middle of a program
*/
extern _LIB_VERSION_TYPE _LIB_VERSION;

#define _IEEE_ fdlibm_ieee
#define _SVID_ fdlibm_svid
#define _XOPEN_ fdlibm_xopen
#define _POSIX_ fdlibm_posix

struct exception {
int type;
char* name;
f64 arg1;
f64 arg2;
f64 retval;
};

#define HUGE MAXFLOAT

/**
* set X_TLOSS = pi*2**52, which is possibly defined in <values.h>
* (one may replace the following line by "#include <values.h>")
*/

#define X_TLOSS 1.41484755040568800000e+16

#define DOMAIN 1
#define SING 2
#define OVERFLOW 3
#define UNDERFLOW 4
#define TLOSS 5
#define PLOSS 6

/**
* ANSI/POSIX
*/
extern f64 acos __P((f64));
extern f64 asin __P((f64));
extern f64 atan __P((f64));
extern f64 atan2 __P((f64, f64));
extern f64 cos __P((f64));
extern f64 sin __P((f64));
extern f64 tan __P((f64));

extern f64 cosh __P((f64));
extern f64 sinh __P((f64));
extern f64 tanh __P((f64));

extern f64 exp __P((f64));
extern f64 frexp __P((f64, int*));
extern f64 ldexp __P((f64, int));
extern f64 scalbn __P((f64, int));
extern f64 log __P((f64));
extern f64 log10 __P((f64));
extern f64 modf __P((f64, f64*));

extern f64 pow __P((f64, f64));
extern f64 sqrt __P((f64));

extern f64 ceil __P((f64));
extern f64 fabs __P((f64));
extern f64 fabs__Fd(f64); // NOTE: I have no idea how they got it to mangle like this
extern f64 floor __P((f64));
extern f64 fmod __P((f64, f64));

extern f64 erf __P((f64));
extern f64 erfc __P((f64));
extern f64 gamma __P((f64));
extern f64 hypot __P((f64, f64));
extern int isnan __P((f64));
extern int finite __P((f64));
extern f64 j0 __P((f64));
extern f64 j1 __P((f64));
extern f64 jn __P((int, f64));
extern f64 lgamma __P((f64));
extern f64 y0 __P((f64));
extern f64 y1 __P((f64));
extern f64 yn __P((int, f64));

extern f64 acosh __P((f64));
extern f64 asinh __P((f64));
extern f64 atanh __P((f64));
extern f64 cbrt __P((f64));
extern f64 logb __P((f64));
extern f64 nextafter __P((f64, f64));
extern f64 remainder __P((f64, f64));
#ifdef _SCALB_INT
extern f64 scalb __P((f64, int));
#else
extern f64 scalb __P((f64, f64));
#endif

extern int matherr __P((struct exception*));

/**
* IEEE Test Vector
*/
extern f64 significand __P((f64));

/**
* Functions callable from C, intended to support IEEE arithmetic.
*/
extern f64 copysign __P((f64, f64));
extern int ilogb __P((f64));
extern f64 rint __P((f64));
extern f64 scalbn __P((f64, int));

/**
* BSD math library entry points
*/
extern f64 expm1 __P((f64));
extern f64 log1p __P((f64));

/**
* Reentrant version of gamma & lgamma; passes signgam back by reference
* as the second argument; user must allocate space for signgam.
*/
#ifdef _REENTRANT
extern f64 gamma_r __P((f64, int*));
extern f64 lgamma_r __P((f64, int*));
#endif /* _REENTRANT */

/* ieee style elementary functions */
extern f64 __ieee754_sqrt __P((f64));
extern f64 __ieee754_acos __P((f64));
extern f64 __ieee754_acosh __P((f64));
extern f64 __ieee754_log __P((f64));
extern f64 __ieee754_atanh __P((f64));
extern f64 __ieee754_asin __P((f64));
extern f64 __ieee754_atan2 __P((f64, f64));
extern f64 __ieee754_exp __P((f64));
extern f64 __ieee754_cosh __P((f64));
extern f64 __ieee754_fmod __P((f64, f64));
extern f64 __ieee754_pow __P((f64, f64));
extern f64 __ieee754_lgamma_r __P((f64, int*));
extern f64 __ieee754_gamma_r __P((f64, int*));
extern f64 __ieee754_lgamma __P((f64));
extern f64 __ieee754_gamma __P((f64));
extern f64 __ieee754_log10 __P((f64));
extern f64 __ieee754_sinh __P((f64));
extern f64 __ieee754_hypot __P((f64, f64));
extern f64 __ieee754_j0 __P((f64));
extern f64 __ieee754_j1 __P((f64));
extern f64 __ieee754_y0 __P((f64));
extern f64 __ieee754_y1 __P((f64));
extern f64 __ieee754_jn __P((int, f64));
extern f64 __ieee754_yn __P((int, f64));
extern f64 __ieee754_remainder __P((f64, f64));
extern int __ieee754_rem_pio2 __P((f64, f64*));
#ifdef _SCALB_INT
extern f64 __ieee754_scalb __P((f64, int));
#else
extern f64 __ieee754_scalb __P((f64, f64));
#endif

/* fdlibm kernel function */
extern f64 __kernel_standard __P((f64, f64, int));
extern f64 __kernel_sin __P((f64, f64, int));
extern f64 __kernel_cos __P((f64, f64));
extern f64 __kernel_tan __P((f64, f64, int));
extern int __kernel_rem_pio2 __P((f64*, f64*, int, int, int, const int*));

#ifdef __cplusplus
};
#endif // ifdef __cplusplus

#endif
1 change: 0 additions & 1 deletion include/dolphin/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ typedef int BOOL;
#define NULL ((void*)0)
#endif

#include "libc/stdio.h"
#include "libc/stdarg.h"
#include "libc/string.h"
#include "libc/ctype.h"
Expand Down
20 changes: 11 additions & 9 deletions include/fake_tgmath.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#include <dolphin/types.h>

f32 acosf(f32);
f32 sinf(f32);

Expand All @@ -12,15 +14,15 @@ volatile float y;
{


double guess = __frsqrte((double)x); // returns an approximation to
double guess = __frsqrte((double)x); // returns an approximation to
guess = _half*guess*(_three - guess*guess*x); // now have 12 sig bits
guess = _half*guess*(_three - guess*guess*x); // now have 24 sig bits
guess = _half*guess*(_three - guess*guess*x); // now have 32 sig bits
y=(float)(x*guess);
return y ;
}
return x ;
}
}

extern inline float sqrt(float x)
{
Expand All @@ -31,7 +33,7 @@ volatile float y;
{


double guess = __frsqrte((double)x); // returns an approximation to
double guess = __frsqrte((double)x); // returns an approximation to
guess = _half*guess*(_three - guess*guess*x); // now have 12 sig bits
guess = _half*guess*(_three - guess*guess*x); // now have 24 sig bits
guess = _half*guess*(_three - guess*guess*x); // now have 32 sig bits
Expand All @@ -55,15 +57,15 @@ extern inline float fabs(float x)

inline float floor(float x)
{
int i=(int)x;
float y=x-(float)i;
int i=(int)x;
float y=x-(float)i;

if(!y || x > 8388608.0f)
return x ; // x is already an int
return x ; // x is already an int

if(x < 0)
return (float)--i;
// x < 0 -> int conversion of x above rounded toward zero(so decrement)
if(x < 0)
return (float)--i;
// x < 0 -> int conversion of x above rounded toward zero(so decrement)
return (float)i;
}

Expand Down
6 changes: 6 additions & 0 deletions src/MSL_C.PPCEABI.bare.H/e_asin.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include "MSL_C.PPCEABI.bare.H/fdlibm.h"

f64 fabs__Fd(f64 v)
{
return __fabs(v);
}
Loading

0 comments on commit 69035bd

Please sign in to comment.