You've already forked ultrasm64-2
mirror of
https://github.com/HackerN64/ultrasm64-2.git
synced 2026-01-21 10:38:08 -08:00
Deprecate lib/src/libgcc
This commit is contained in:
28
Makefile
28
Makefile
@@ -246,8 +246,6 @@ LEVEL_DIRS := $(patsubst levels/%,%,$(dir $(wildcard levels/*/header.h)))
|
||||
SRC_DIRS := src src/engine src/game src/menu src/buffers src/audio $(AUDIO_SRC_DIR) actors levels bin data assets asm lib sound
|
||||
BIN_DIRS := bin bin/$(VERSION)
|
||||
|
||||
LIBGCC_SRC_DIRS += lib/src/libgcc
|
||||
|
||||
GODDARD_SRC_DIRS := src/goddard src/goddard/dynlists
|
||||
|
||||
# File dependencies and variables for specific files
|
||||
@@ -258,7 +256,6 @@ LEVEL_C_FILES := $(wildcard levels/*/leveldata.c) $(wildcard levels/*/script
|
||||
C_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) $(LEVEL_C_FILES)
|
||||
S_FILES := $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.s))
|
||||
GODDARD_C_FILES := $(foreach dir,$(GODDARD_SRC_DIRS),$(wildcard $(dir)/*.c))
|
||||
LIBGCC_C_FILES := $(foreach dir,$(LIBGCC_SRC_DIRS),$(wildcard $(dir)/*.c))
|
||||
GENERATED_C_FILES := $(BUILD_DIR)/assets/mario_anim_data.c $(BUILD_DIR)/assets/demo_data.c
|
||||
|
||||
# Sound files
|
||||
@@ -286,10 +283,8 @@ O_FILES := $(foreach file,$(C_FILES),$(BUILD_DIR)/$(file:.c=.o)) \
|
||||
|
||||
GODDARD_O_FILES := $(foreach file,$(GODDARD_C_FILES),$(BUILD_DIR)/$(file:.c=.o))
|
||||
|
||||
LIBGCC_O_FILES := $(foreach file,$(LIBGCC_C_FILES),$(BUILD_DIR)/$(file:.c=.o))
|
||||
|
||||
# Automatic dependency files
|
||||
DEP_FILES := $(O_FILES:.o=.d) $(GODDARD_O_FILES:.o=.d) $(LIBGCC_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d
|
||||
DEP_FILES := $(O_FILES:.o=.d) $(GODDARD_O_FILES:.o=.d) $(BUILD_DIR)/$(LD_SCRIPT).d
|
||||
|
||||
# Files with GLOBAL_ASM blocks
|
||||
ifeq ($(NON_MATCHING),0)
|
||||
@@ -319,7 +314,7 @@ endif
|
||||
|
||||
AS := $(CROSS)as
|
||||
ifeq ($(COMPILER),gcc)
|
||||
CC := $(CROSS)gcc
|
||||
CC := /opt/mips64-elf-gcc/bin/mips64-elf-gcc
|
||||
else
|
||||
ifeq ($(USE_QEMU_IRIX),1)
|
||||
IRIX_ROOT := $(TOOLS_DIR)/ido5.3_compiler
|
||||
@@ -373,8 +368,7 @@ EGCS_CFLAGS = -G 0 $(TARGET_CFLAGS) -mcpu=r4300 -fno-pic -Wa,--strip-local-absol
|
||||
# iQue recompiled some files with a different compiler
|
||||
ifeq ($(VERSION),cn)
|
||||
IQUE_RECOMPILED_SRC_GAME := $(addprefix $(BUILD_DIR)/src/game/,rumble_init.o level_update.o memory.o area.o print.o ingame_menu.o hud.o cn_common_syms_1.o cn_common_syms_2.o) $(addprefix $(BUILD_DIR)/src/menu/,title_screen.o intro_geo.o file_select.o star_select.o)
|
||||
IQUE_RECOMPILED_LIBGCC_SRC := $(LIBGCC_O_FILES)
|
||||
IQUE_RECOMPILED = $(IQUE_RECOMPILED_SRC_GAME) $(IQUE_RECOMPILED_LIBGCC_SRC)
|
||||
IQUE_RECOMPILED = $(IQUE_RECOMPILED_SRC_GAME)
|
||||
$(IQUE_RECOMPILED): CC := $(EGCS_CC)
|
||||
$(IQUE_RECOMPILED): CFLAGS = $(EGCS_CFLAGS)
|
||||
$(IQUE_RECOMPILED): MIPSISET :=
|
||||
@@ -531,7 +525,7 @@ else
|
||||
endif
|
||||
$(BUILD_DIR)/bin/segment2.o: $(BUILD_DIR)/text/debug_text.raw.inc.c
|
||||
|
||||
ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(GODDARD_SRC_DIRS) $(ULTRA_SRC_DIRS) $(LIBGCC_SRC_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(MIO0_DIR) $(addprefix $(MIO0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION)
|
||||
ALL_DIRS := $(BUILD_DIR) $(addprefix $(BUILD_DIR)/,$(SRC_DIRS) $(GODDARD_SRC_DIRS) $(ULTRA_SRC_DIRS) $(BIN_DIRS) $(TEXTURE_DIRS) $(TEXT_DIRS) $(SOUND_SAMPLE_DIRS) $(addprefix levels/,$(LEVEL_DIRS)) rsp include) $(MIO0_DIR) $(addprefix $(MIO0_DIR)/,$(VERSION)) $(SOUND_BIN_DIR) $(SOUND_BIN_DIR)/sequences/$(VERSION)
|
||||
|
||||
# Make sure build directory exists before compiling anything
|
||||
DUMMY != mkdir -p $(ALL_DIRS)
|
||||
@@ -722,9 +716,6 @@ ifeq ($(NON_MATCHING),0)
|
||||
$(BUILD_DIR)/bin/%.o: OPT_FLAGS := -g
|
||||
$(BUILD_DIR)/src/goddard/%.o: OPT_FLAGS := -g
|
||||
$(BUILD_DIR)/src/goddard/%.o: MIPSISET := -mips1
|
||||
ifeq ($(VERSION),cn)
|
||||
$(BUILD_DIR)/lib/src/libgcc/%.o: OPT_FLAGS := -O2 -g -mips2
|
||||
endif
|
||||
|
||||
# Audio specific flags:
|
||||
|
||||
@@ -775,7 +766,7 @@ endif
|
||||
$(BUILD_DIR)/%.o: %.s
|
||||
$(call print,Assembling:,$<,$@)
|
||||
ifeq ($(COMPILER),gcc)
|
||||
$(V)$(CC) -c $(ASMFLAGS) -x assembler-with-cpp -MMD -MF $(BUILD_DIR)/$*.d -o $@ $<
|
||||
$(V)$(CPP) $(CPPFLAGS) -D_LANGUAGE_ASSEMBLY=1 $< | $(AS) $(ASFLAGS) -MD $(BUILD_DIR)/$*.d -o $@
|
||||
else
|
||||
$(V)$(CPP) $(CPPFLAGS) -D_LANGUAGE_ASSEMBLY $< | $(AS) $(ASFLAGS) -MD $(BUILD_DIR)/$*.d -o $@
|
||||
endif
|
||||
@@ -795,15 +786,10 @@ $(BUILD_DIR)/libgoddard.a: $(GODDARD_O_FILES)
|
||||
@$(PRINT) "$(GREEN)Linking libgoddard: $(BLUE)$@ $(NO_COL)\n"
|
||||
$(V)$(AR) rcs -o $@ $(GODDARD_O_FILES)
|
||||
|
||||
# Link libgcc
|
||||
$(BUILD_DIR)/libgcc.a: $(LIBGCC_O_FILES)
|
||||
@$(PRINT) "$(GREEN)Linking libgcc: $(BLUE)$@ $(NO_COL)\n"
|
||||
$(V)$(AR) rcs -o $@ $(LIBGCC_O_FILES)
|
||||
|
||||
# Link SM64 ELF file
|
||||
$(ELF): $(LIBULTRA_BUILD_DIR)/libgultra_rom.a $(O_FILES) $(MIO0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) $(BUILD_DIR)/libgoddard.a $(BUILD_DIR)/libgcc.a
|
||||
$(ELF): $(LIBULTRA_BUILD_DIR)/libgultra_rom.a $(O_FILES) $(MIO0_OBJ_FILES) $(SEG_FILES) $(BUILD_DIR)/$(LD_SCRIPT) $(BUILD_DIR)/libgoddard.a
|
||||
@$(PRINT) "$(GREEN)Linking ELF file: $(BLUE)$@ $(NO_COL)\n"
|
||||
$(V)$(LD) -L $(BUILD_DIR) -L $(LIBULTRA_BUILD_DIR) -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -lgultra_rom -lgoddard -lgcc
|
||||
$(V)$(LD) -L $(BUILD_DIR) -L $(LIBULTRA_BUILD_DIR) -T $(BUILD_DIR)/$(LD_SCRIPT) -Map $(BUILD_DIR)/sm64.$(VERSION).map --no-check-sections $(addprefix -R ,$(SEG_FILES)) -o $@ $(O_FILES) -lgultra_rom -lgoddard
|
||||
|
||||
# Build ROM
|
||||
ifeq ($(VERSION),cn)
|
||||
|
||||
1
sm64.ld
1
sm64.ld
@@ -226,6 +226,7 @@ SECTIONS
|
||||
#endif
|
||||
// #include "lib/ultra/ld.inc"
|
||||
ULTRA_BUILD_DIR/libgultra_rom.a:*.o(.text);
|
||||
BUILD_DIR/src/game/libgcc.o(.text);
|
||||
#undef SECTION
|
||||
#ifdef VERSION_JP
|
||||
#undef JP_PADDING_TEXT
|
||||
|
||||
266
src/game/libgcc.c
Normal file
266
src/game/libgcc.c
Normal file
@@ -0,0 +1,266 @@
|
||||
/* --------------------------------------------------------------------------------*/
|
||||
/* Depending on the toolchain used, an appropriate precompiled libgcc library */
|
||||
/* may not exist and cannot be linked against. Until we have a better work around, */
|
||||
/* necessary gcc functions are hosted here in order to properly compile. */
|
||||
/* This file is NOT a part of the original game and only exists to help gcc work. */
|
||||
/* --------------------------------------------------------------------------------*/
|
||||
|
||||
#include <ultra64.h>
|
||||
|
||||
// Self-hosted libc memory functions, gcc assumes these exist even in a freestanding
|
||||
// environment and there is no way to tell it otherwise.
|
||||
|
||||
void *memset(void *dest, int val, size_t len) {
|
||||
unsigned char *ptr = dest;
|
||||
while (len-- > 0)
|
||||
*ptr++ = val;
|
||||
return dest;
|
||||
}
|
||||
|
||||
int memcmp(const void *s1, const void *s2, size_t n) {
|
||||
const u8 *m1 = s1;
|
||||
const u8 *m2 = s2;
|
||||
size_t i;
|
||||
|
||||
for (i = 0; i < n; i++) {
|
||||
if (m1[i] < m2[i]) {
|
||||
return -1;
|
||||
} else if (m1[i] > m2[i]) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *memmove(void *dest, const void *src, size_t len) {
|
||||
char *d = dest;
|
||||
const char *s = src;
|
||||
if (d < s)
|
||||
while (len--)
|
||||
*d++ = *s++;
|
||||
else {
|
||||
char *lasts = (char *) s + (len - 1);
|
||||
char *lastd = (char *) d + (len - 1);
|
||||
while (len--)
|
||||
*lastd-- = *lasts--;
|
||||
}
|
||||
return dest;
|
||||
}
|
||||
|
||||
// Conversions involving 64-bit integer types required by the O32 MIPS ABI.
|
||||
|
||||
// f32 -> u64, negative values become 0
|
||||
u64 __fixunssfdi(f32 a) {
|
||||
if (a > 0.0f) {
|
||||
register union {
|
||||
f64 f;
|
||||
u64 i;
|
||||
} m;
|
||||
|
||||
__asm__("cvt.l.s %0, %1" : "=f"(m.f) : "f"(a));
|
||||
return m.i;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// f64 -> u64, negative values become 0
|
||||
u64 __fixunsdfdi(f64 a) {
|
||||
if (a > 0.0) {
|
||||
register union {
|
||||
f64 f;
|
||||
u64 i;
|
||||
} m;
|
||||
|
||||
__asm__("cvt.l.d %0, %1" : "=f"(m.f) : "f"(a));
|
||||
return m.i;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// f32 -> s64
|
||||
s64 __fixsfdi(f32 c) {
|
||||
register union {
|
||||
f64 f;
|
||||
s64 i;
|
||||
} m;
|
||||
|
||||
__asm__("cvt.l.s %0, %1" : "=f"(m.f) : "f"(c));
|
||||
return m.i;
|
||||
}
|
||||
|
||||
// f64 -> s64
|
||||
s64 __fixdfdi(f64 c) {
|
||||
register union {
|
||||
f64 f;
|
||||
s64 i;
|
||||
} m;
|
||||
|
||||
__asm__("cvt.l.d %0, %1" : "=f"(m.f) : "f"(c));
|
||||
return m.i;
|
||||
}
|
||||
|
||||
// s64 -> f32
|
||||
f32 __floatdisf(s64 c) {
|
||||
register union {
|
||||
f64 f;
|
||||
s64 i;
|
||||
} m;
|
||||
register f32 v;
|
||||
|
||||
m.i = c;
|
||||
__asm__("cvt.s.l %0, %1" : "=f"(v) : "f"(m.f));
|
||||
return v;
|
||||
}
|
||||
|
||||
// s64 -> f64
|
||||
f64 __floatdidf(s64 c) {
|
||||
register union {
|
||||
f64 f;
|
||||
s64 i;
|
||||
} m;
|
||||
register f64 v;
|
||||
|
||||
m.i = c;
|
||||
__asm__("cvt.d.l %0, %1" : "=f"(v) : "f"(m.f));
|
||||
return v;
|
||||
}
|
||||
|
||||
// u64 -> f32
|
||||
f32 __floatundisf(u64 c) {
|
||||
register union {
|
||||
f64 f;
|
||||
u64 i;
|
||||
} m;
|
||||
register f32 v;
|
||||
|
||||
m.i = c;
|
||||
__asm__("cvt.s.l %0, %1" : "=f"(v) : "f"(m.f));
|
||||
if ((s64) c < 0) {
|
||||
// cvt.s.l assumes signed input, adjust output
|
||||
v += 4294967296.0f; // 2^32
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
// u64 -> f64
|
||||
f64 __floatundidf(u64 c) {
|
||||
register union {
|
||||
f64 f;
|
||||
u64 i;
|
||||
} m;
|
||||
register f64 v;
|
||||
|
||||
m.i = c;
|
||||
__asm__("cvt.d.l %0, %1" : "=f"(v) : "f"(m.f));
|
||||
if ((s64) c < 0) {
|
||||
// cvt.d.l assumes signed input, adjust output
|
||||
v += 18446744073709551616.0; // 2^64
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
||||
// Compute x^m by binary exponentiation
|
||||
|
||||
f32 __powisf2(f32 x, s32 m) {
|
||||
u32 n = (m < 0) ? -m : m;
|
||||
f32 y = (n % 2 != 0) ? x : 1.0f;
|
||||
|
||||
while (n >>= 1) {
|
||||
x = x * x;
|
||||
|
||||
if (n % 2 != 0) {
|
||||
y = y * x;
|
||||
}
|
||||
}
|
||||
return (m < 0) ? (1.0f / y) : y;
|
||||
}
|
||||
|
||||
int __ucmpdi2(unsigned long long a, unsigned long long b) {
|
||||
if (a == b) {
|
||||
return 1;
|
||||
}
|
||||
return (a < b) ? 0 : 2;
|
||||
}
|
||||
|
||||
// Compute division and modulo of 64-bit signed and unsigned integers
|
||||
|
||||
__asm__(" \n\
|
||||
.set push \n\
|
||||
.set noreorder \n\
|
||||
.set gp=64 \n\
|
||||
\n\
|
||||
.global __umoddi3 \n\
|
||||
__umoddi3: \n\
|
||||
.type __umoddi3, @function \n\
|
||||
.ent __umoddi3 \n\
|
||||
sw $a0, 0x0($sp) \n\
|
||||
sw $a1, 0x4($sp) \n\
|
||||
sw $a2, 0x8($sp) \n\
|
||||
sw $a3, 0xC($sp) \n\
|
||||
ld $t6, 0($sp) \n\
|
||||
ld $t7, 8($sp) \n\
|
||||
dremu $v0, $t6, $t7 \n\
|
||||
dsll32 $v1, $v0, 0 \n\
|
||||
dsra32 $v1, $v1, 0 \n\
|
||||
jr $ra \n\
|
||||
dsra32 $v0, $v0, 0 \n\
|
||||
.end __umoddi3 \n\
|
||||
.size __umoddi3, . - __umoddi3 \n\
|
||||
\n\
|
||||
.global __udivdi3 \n\
|
||||
__udivdi3: \n\
|
||||
.type __udivdi3, @function \n\
|
||||
.ent __udivdi3 \n\
|
||||
sw $a0, 0x0($sp) \n\
|
||||
sw $a1, 0x4($sp) \n\
|
||||
sw $a2, 0x8($sp) \n\
|
||||
sw $a3, 0xC($sp) \n\
|
||||
ld $t6, 0($sp) \n\
|
||||
ld $t7, 8($sp) \n\
|
||||
ddivu $v0, $t6, $t7 \n\
|
||||
dsll32 $v1, $v0, 0 \n\
|
||||
dsra32 $v1, $v1, 0 \n\
|
||||
jr $ra \n\
|
||||
dsra32 $v0, $v0, 0 \n\
|
||||
.end __udivdi3 \n\
|
||||
.size __udivdi3, . - __udivdi3 \n\
|
||||
\n\
|
||||
.global __moddi3 \n\
|
||||
__moddi3: \n\
|
||||
.type __moddi3, @function \n\
|
||||
.ent __moddi3 \n\
|
||||
sw $a0, 0x0($sp) \n\
|
||||
sw $a1, 0x4($sp) \n\
|
||||
sw $a2, 0x8($sp) \n\
|
||||
sw $a3, 0xC($sp) \n\
|
||||
ld $t6, 0($sp) \n\
|
||||
ld $t7, 8($sp) \n\
|
||||
drem $v0, $t6, $t7 \n\
|
||||
dsll32 $v1, $v0, 0 \n\
|
||||
dsra32 $v1, $v1, 0 \n\
|
||||
jr $ra \n\
|
||||
dsra32 $v0, $v0, 0 \n\
|
||||
.end __moddi3 \n\
|
||||
.size __moddi3, . - __moddi3 \n\
|
||||
\n\
|
||||
.global __divdi3 \n\
|
||||
__divdi3: \n\
|
||||
.type __divdi3, @function \n\
|
||||
.ent __divdi3 \n\
|
||||
sw $a0, 0x0($sp) \n\
|
||||
sw $a1, 0x4($sp) \n\
|
||||
sw $a2, 0x8($sp) \n\
|
||||
sw $a3, 0xC($sp) \n\
|
||||
ld $t6, 0($sp) \n\
|
||||
ld $t7, 8($sp) \n\
|
||||
ddiv $v0, $t6, $t7 \n\
|
||||
dsll32 $v1, $v0, 0 \n\
|
||||
dsra32 $v1, $v1, 0 \n\
|
||||
jr $ra \n\
|
||||
dsra32 $v0, $v0, 0 \n\
|
||||
.end __divdi3 \n\
|
||||
.size __divdi3, . - __divdi3 \n\
|
||||
\n\
|
||||
.set pop \n\
|
||||
\n");
|
||||
Reference in New Issue
Block a user