From a3cd19ed4e1aab0ecf6215bce6a8787c545e3f71 Mon Sep 17 00:00:00 2001 From: Alejandro Javier Asenjo Nitti Date: Tue, 17 Oct 2023 18:50:39 -0300 Subject: [PATCH] ll.c --- Makefile | 12 +++++++++++ src/libultra/libc/ll.c | 47 ++++++++++++++++++++++++++++++++---------- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/Makefile b/Makefile index cecb544b..8a0eb37b 100644 --- a/Makefile +++ b/Makefile @@ -194,6 +194,8 @@ build/src/libultra/2D300.o: OPTFLAGS := -O1 -g0 build/src/libultra/io/controller.o: OPTFLAGS := -O1 -g0 build/src/libultra/libc/string.o: OPTFLAGS := -O2 -g0 build/src/libultra/libc/ldiv.o: OPTFLAGS := -O2 -g0 +build/src/libultra/libc/ll.o: OPTFLAGS := -O1 -g0 +build/src/libultra/libc/ll.o: MIPS_VERSION := -mips3 -32 build/src/libultra/gu/ortho.o: OPTFLAGS := -O3 -g0 build/src/libultra/gu/lookat.o: OPTFLAGS := -O3 -g0 @@ -201,6 +203,8 @@ build/src/libultra/gu/lookat.o: OPTFLAGS := -O3 -g0 CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(IDO) -- $(AS) $(ASFLAGS) -- build/src/libultra/gu/lookat.o: CC := $(IDO) build/src/libultra/gu/ortho.o: CC := $(IDO) +build/src/libultra/libc/ll.o: CC := $(IDO) + #build/src/%.o: CC := $(ASM_PROC) $(ASM_PROC_FLAGS) $(IDO) -- $(AS) $(ASFLAGS) -- all: uncompressed @@ -298,6 +302,14 @@ $(BUILD_DIR)/%.o: %.c $(OBJDUMP_CMD) $(RM_MDEBUG) +# Patch ll.o +build/src/libultra/libc/ll.o: src/libultra/libc/ll.c + $(CC_CHECK) $(CC_CHECK_FLAGS) $(IINC) -I $(dir $*) $(CHECK_WARNINGS) $(BUILD_DEFINES) $(COMMON_DEFINES) $(RELEASE_DEFINES) $(GBI_DEFINES) $(C_DEFINES) $(MIPS_BUILTIN_DEFS) -o $@ $< + $(CC) -c $(CFLAGS) $(BUILD_DEFINES) $(IINC) $(WARNINGS) $(MIPS_VERSION) $(ENDIAN) $(COMMON_DEFINES) $(RELEASE_DEFINES) $(GBI_DEFINES) $(C_DEFINES) $(OPTFLAGS) -o $@ $< + $(PYTHON) tools/set_o32abi_bit.py $@ + $(OBJDUMP_CMD) + $(RM_MDEBUG) + -include $(DEP_FILES) # Print target for debugging diff --git a/src/libultra/libc/ll.c b/src/libultra/libc/ll.c index 9ee154af..a3cee6d7 100644 --- a/src/libultra/libc/ll.c +++ b/src/libultra/libc/ll.c @@ -1,21 +1,46 @@ -#include "common.h" -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ull_rshift.s") +long long __ull_rshift(unsigned long long left, unsigned long long right) { + return left >> right; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ull_rem.s") +unsigned long long __ull_rem(unsigned long long left, unsigned long long right) { + return left % right; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ull_div.s") +unsigned long long __ull_div(unsigned long long left, unsigned long long right) { + return left / right; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ll_lshift.s") +long long __ll_lshift(long long left, long long right) { + return left << right; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ll_rem.s") +long long __ll_rem(long long left, unsigned long long right) { + return left % right; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ll_div.s") +long long __ll_div(long long left, long long right) { + return left / right; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ll_mul.s") +long long __ll_mul(long long left, long long right) { + return left * right; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ull_divremi.s") +void __ull_divremi(unsigned long long* quotient, unsigned long long* remainder, unsigned long long dividend, + unsigned short divisor) { + *quotient = dividend / divisor; + *remainder = dividend % divisor; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ll_mod.s") +long long __ll_mod(long long left, long long right) { + long long rem = left % right; + if (((rem < 0) && (right > 0)) || ((rem > 0) && (right < 0))) { + rem += right; + } + return rem; +} -#pragma GLOBAL_ASM("asm/us/nonmatchings/libultra/libc/ll/__ll_rshift.s") +long long __ll_rshift(long long left, long long right) { + return left >> right; +}