From 21afe3027c86e6acb5627b166735e89c01e908f2 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Sat, 21 Sep 2024 08:12:34 +1000 Subject: [PATCH] N64: Fix FPU underflow/overflow exceptions still being triggered --- .github/workflows/build_linux.yml | 1 + readme.md | 55 +++++++++++++++++++++++-------- src/Platform_N64.c | 4 +-- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build_linux.yml b/.github/workflows/build_linux.yml index 1d912249b..33fb7bc34 100644 --- a/.github/workflows/build_linux.yml +++ b/.github/workflows/build_linux.yml @@ -81,6 +81,7 @@ jobs: COMMON_FLAGS: "-O1 -s -fno-stack-protector -fno-math-errno -Qn" NIX64_FLAGS: "-no-pie -fno-pie -m64 -fvisibility=hidden -fcf-protection=none -rdynamic -DCC_BUILD_ICON" run: | + sudo apt-get -y update sudo apt-get -y install libx11-dev libxi-dev libgl1-mesa-dev libsdl2-dev LATEST_FLAG=-DCC_COMMIT_SHA=\"$(git rev-parse --short "$GITHUB_SHA")\" diff --git a/readme.md b/readme.md index 9c2052a14..b5b2d87fa 100644 --- a/readme.md +++ b/readme.md @@ -142,7 +142,9 @@ Compiling with TCC: ##### Using gcc/clang 1. Install X11, XInput2, and OpenGL development libraries if necessary.
For Ubuntu, these are the `libx11-dev`, `libxi-dev` and `libgl1-mesa-dev` packages -2. Run ```cc -fno-math-errno src/*.c -o ClassiCube -rdynamic -lpthread -lX11 -lXi -lGL -ldl``` +2. Run either: + * `make linux` or + * `cc -fno-math-errno src/*.c -o ClassiCube -rdynamic -lpthread -lX11 -lXi -lGL -ldl` ##### Cross compiling for Windows (32 bit): 1. Install MinGW-w64 if necessary. (Ubuntu: `gcc-mingw-w64` package) @@ -159,7 +161,9 @@ Although the regular linux compiliation flags will work fine, to take full advan ## Compiling - macOS 1. Install a C compiler if necessary. The easiest way of obtaining one is by installing **Xcode**. -2. Run ```cc -fno-math-errno src/*.c src/*.m -o ClassiCube -framework Cocoa -framework OpenGL -framework IOKit -lobjc``` +2. Run either: + * `make darwin` or + * `cc -fno-math-errno src/*.c src/*.m -o ClassiCube -framework Cocoa -framework OpenGL -framework IOKit -lobjc` ##### Using Xcode GUI @@ -196,11 +200,13 @@ NOTE: If you are distributing a modified version, **please change the bundle ID ## Compiling - webclient 1. Install emscripten if necessary. -2. Run ```emcc src/*.c -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_STACK=1Mb --js-library interop_web.js``` +2. Run either: + * `make web` or + * `emcc src/*.c -s ALLOW_MEMORY_GROWTH=1 -s TOTAL_STACK=1Mb --js-library interop_web.js` The generated javascript file has some issues. [See here for how to fix](doc/compile-fixes.md#webclient-patches) -For more details on how to integrate into a website, see [here](doc/hosting-webclient.md) +For details on how to integrate the webclient into a website, see [here](doc/hosting-webclient.md)

Compiling - consoles

@@ -317,44 +323,65 @@ Run `make saturn`. You'll need [libyaul](https://github.com/yaul-org/libyaul) #### FreeBSD 1. Install `libxi`, `libexecinfo`, `curl` and `openal-soft` packages if needed -2. Run ```cc src/*.c -o ClassiCube -I /usr/local/include -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo``` +2. Run either: + * `make freebsd` or + * `cc src/*.c -o ClassiCube -I /usr/local/include -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo` #### OpenBSD 1. Install `libexecinfo`, `curl` and `openal` packages if needed -2. Run ```cc src/*.c -o ClassiCube -I /usr/X11R6/include -I /usr/local/include -L /usr/X11R6/lib -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo``` +2. Run either: + * `make opensd` or + * `cc src/*.c -o ClassiCube -I /usr/X11R6/include -I /usr/local/include -L /usr/X11R6/lib -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo` #### NetBSD 1. Install `libexecinfo`, `curl` and `openal-soft` packages if needed -2. Run ```cc src/*.c -o ClassiCube -I /usr/X11R7/include -I /usr/pkg/include -L /usr/X11R7/lib -L /usr/pkg/lib -lpthread -lX11 -lXi -lGL -lexecinfo``` +2. Run either: + * `make netbsd` or + * `cc src/*.c -o ClassiCube -I /usr/X11R7/include -I /usr/pkg/include -L /usr/X11R7/lib -L /usr/pkg/lib -lpthread -lX11 -lXi -lGL -lexecinfo` #### DragonflyBSD -```cc src/*.c -o ClassiCube -I /usr/local/include -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo``` +1. Install `libxi`, `libexecinfo`, `curl` and `openal-soft` packages if needed +2. Run either: + * `make dragonfly` or + * `cc src/*.c -o ClassiCube -I /usr/local/include -L /usr/local/lib -lm -lpthread -lX11 -lXi -lGL -lexecinfo` #### Solaris -```gcc -fno-math-errno src/*.c -o ClassiCube -lsocket -lX11 -lXi -lGL``` +1. Install required packages if needed +2. Run either: + * `make sunos` or + * `gcc -fno-math-errno src/*.c -o ClassiCube -lsocket -lX11 -lXi -lGL` #### Haiku -1. Install openal_devel packages if needed -2. Run ```cc -fno-math-errno src/*.c interop_BeOS.cpp -o ClassiCube -lGL -lnetwork -lstdc++ -lbe -lgame -ltracker``` +1. Install `gcc`, `haiku_devel`, `openal_devel` packages if needed +2. Run either: + * `make haiku` or + * `cc -fno-math-errno src/*.c interop_BeOS.cpp -o ClassiCube -lGL -lnetwork -lstdc++ -lbe -lgame -ltracker` #### BeOS 1. Install a C compiler -2. Run ```cc -fno-math-errno src/*.c interop_BeOS.cpp -o ClassiCube -lGL -lbe -lgame -ltracker``` +2. Run either: + * `make beos` or + * `cc -fno-math-errno src/*.c interop_BeOS.cpp -o ClassiCube -lGL -lbe -lgame -ltracker` #### IRIX -```gcc -fno-math-errno src/*.c -o ClassiCube -lGL -lX11 -lXi -lpthread -ldl``` +1. Install required packages if needed +2. Run either: + * `make irix` or + * gcc -fno-math-errno src/*.c -o ClassiCube -lGL -lX11 -lXi -lpthread -ldl` #### SerenityOS 1. Install SDL2 port if needed -2. Run ```cc src/*.c -o ClassiCube -lgl -lSDL2``` +2. Run either: + * `make serenityos` or + * `cc src/*.c -o ClassiCube -lgl -lSDL2` #### Classic Mac OS diff --git a/src/Platform_N64.c b/src/Platform_N64.c index e63f375d7..81342a693 100644 --- a/src/Platform_N64.c +++ b/src/Platform_N64.c @@ -252,9 +252,9 @@ cc_result Socket_CheckWritable(cc_socket s, cc_bool* writable) { static void DisableFpuExceptions(void) { uint32_t fcr31 = C1_FCR31(); - fcr31 &= ~(C1_CAUSE_OVERFLOW | C1_CAUSE_UNDERFLOW | C1_CAUSE_NOT_IMPLEMENTED | C1_CAUSE_INEXACT_OP); + fcr31 &= ~(C1_ENABLE_OVERFLOW | C1_ENABLE_UNDERFLOW | C1_ENABLE_INEXACT_OP); fcr31 |= C1_ENABLE_DIV_BY_0 | C1_ENABLE_INVALID_OP; - fcr31 |= C1_FCR31_FS; + fcr31 |= C1_FCR31_FS; // flush denormals to zero C1_WRITE_FCR31(fcr31); }