1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-04-08 07:36:47 +00:00

move asm to inline asm (consolidate gcc functions)

This commit is contained in:
fig02 2022-02-12 00:00:41 -05:00
parent cbddf7146d
commit 82ba5da981
13 changed files with 153 additions and 150 deletions

View file

@ -29,7 +29,7 @@ endif
# Set prefix to mips binutils binaries (mips-linux-gnu-ld => 'mips-linux-gnu-') - Change at your own risk!
# In nearly all cases, not having 'mips-linux-gnu-*' binaries on the PATH is indicative of missing dependencies
MIPS_BINUTILS_PREFIX ?= mips-linux-gnu-
MIPS_BINUTILS_PREFIX ?= mips64-
ifeq ($(NON_MATCHING),1)
CFLAGS += -DNON_MATCHING

View file

@ -1,103 +0,0 @@
.include "macro.inc"
# assembler directives
.set noat # allow manual use of $at
.set noreorder # don't insert nops after branches
.set gp=64 # allow use of 64-bit general purpose registers
.section .text
.balign 16
/* Copied from Super Mario 64 decomp project */
/* -------------------------------------------------------------------------------------- */
/* need to asm these functions because lib32gcc-7-dev-mips-cross does not exist so we */
/* cannot naturally link a libgcc variant for this target given this architecture and */
/* compiler. Until we have a good workaround with a gcc target that doesn't involve */
/* assuming a 32-bit to 64-bit change, we have to encode these functions as raw assembly */
/* for it to compile. */
/* -------------------------------------------------------------------------------------- */
/* TODO: Is there a non-insane way to fix this hack that doesn't involve the user compiling */
/* a library themselves? */
glabel __umoddi3
sw $a0, ($sp)
sw $a1, 4($sp)
sw $a2, 8($sp)
sw $a3, 0xc($sp)
ld $t7, 8($sp)
ld $t6, ($sp)
ddivu $zero, $t6, $t7
bnez $t7, .L80324144
nop
break 7
.L80324144:
mfhi $v0
dsll32 $v1, $v0, 0
dsra32 $v1, $v1, 0
jr $ra
dsra32 $v0, $v0, 0
glabel __udivdi3
sw $a0, ($sp)
sw $a1, 4($sp)
sw $a2, 8($sp)
sw $a3, 0xc($sp)
ld $t7, 8($sp)
ld $t6, ($sp)
ddivu $zero, $t6, $t7
bnez $t7, .L80324180
nop
break 7
.L80324180:
mflo $v0
dsll32 $v1, $v0, 0
dsra32 $v1, $v1, 0
jr $ra
dsra32 $v0, $v0, 0
glabel __moddi3
sw $a0, ($sp)
sw $a1, 4($sp)
sw $a2, 8($sp)
sw $a3, 0xc($sp)
ld $t7, 8($sp)
ld $t6, ($sp)
ddivu $zero, $t6, $t7
bnez $t7, .L803241E8
nop
break 7
.L803241E8:
mfhi $v0
dsll32 $v1, $v0, 0
dsra32 $v1, $v1, 0
jr $ra
dsra32 $v0, $v0, 0
glabel __divdi3
sw $a0, ($sp)
sw $a1, 4($sp)
sw $a2, 8($sp)
sw $a3, 0xc($sp)
ld $t7, 8($sp)
ld $t6, ($sp)
ddiv $zero, $t6, $t7
nop
bnez $t7, .L80324228
nop
break 7
.L80324228:
daddiu $at, $zero, -1
bne $t7, $at, .L80324244
daddiu $at, $zero, 1
dsll32 $at, $at, 0x1f
bne $t6, $at, .L80324244
nop
break 6
.L80324244:
mflo $v0
dsll32 $v1, $v0, 0
dsra32 $v1, $v1, 0
jr $ra
dsra32 $v0, $v0, 0

1
spec
View file

@ -110,7 +110,6 @@ beginseg
include "build/asm/__osSetWatchLo.o"
include "build/data/rsp_boot.text.o"
#ifdef COMPILER_GCC
include "build/asm/llmuldiv_gcc.o"
include "build/src/boot/missing_gcc_functions.o"
#endif
endseg

View file

@ -24,7 +24,6 @@ void bootproc(void) {
Locale_Init();
StackCheck_Init(&sIdleThreadInfo, sIdleThreadStack, STACK_TOP(sIdleThreadStack), 0, 256, "idle");
osCreateThread(&sIdleThread, 1, Idle_ThreadEntry, NULL, STACK_TOP(sIdleThreadStack),
Z_PRIORITY_MAIN);
osCreateThread(&sIdleThread, 1, Idle_ThreadEntry, NULL, STACK_TOP(sIdleThreadStack), Z_PRIORITY_MAIN);
osStartThread(&sIdleThread);
}

View file

@ -1,12 +1,14 @@
#ifdef __GNUC__
#include "global.h"
// Define functions needed for the GCC build here.
// Self-hosted memcmp.
int memcmp(void *s1, const void *s2, size_t n) {
u8 *m1 = (u8 *)s1;
u8 *m2 = (u8 *)s2;
int i;
int memcmp(void* s1, const void* s2, size_t n) {
u8* m1 = (u8*)s1;
u8* m2 = (u8*)s2;
u32 i;
for (i = 0; i < n; i++) {
if (m1[i] < m2[i]) {
return -1;
@ -17,10 +19,10 @@ int memcmp(void *s1, const void *s2, size_t n) {
return 0;
}
void *memset(void *str, int c, size_t n) {
u8 *m1 = (u8 *)str;
int i;
for(i = 0; i < n; i++) {
void* memset(void* str, s32 c, size_t n) {
u8* m1 = (u8*)str;
u32 i;
for (i = 0; i < n; i++) {
m1[i] = c;
}
return str;
@ -29,14 +31,16 @@ void *memset(void *str, int c, size_t n) {
// These functions convert c to an unsigned integer, rounding toward zero. Negative values
// all become zero.
u32 __fixunssfdi(f32 a) {
if (a < 0.0f)
if (a < 0.0f) {
a = 0.0f;
}
return (u32)a;
}
u32 __fixunsdfdi(f64 a) {
if (a < 0.0)
if (a < 0.0) {
a = 0.0;
}
return (u32)a;
}
@ -60,7 +64,7 @@ f64 __floatdidf(s32 c) {
// These functions convert c, an unsigned integer, to floating point.
f32 __floatundisf(u32 c) {
return (f32)c;
return (f32)c;
}
f64 __floatundidf(u32 c) {
@ -84,5 +88,108 @@ f32 __powisf2(f32 a, s32 b) {
a *= a;
}
return recip ? 1/r : r;
return recip ? 1 / r : r;
}
unsigned long __umoddi3(unsigned long a, unsigned long b) {
__asm__(".set push;"
".set noat;"
".set noreorder;"
".set gp=64;"
"sw $a0, ($sp);"
"sw $a1, 4($sp);"
"sw $a2, 8($sp);"
"sw $a3, 0xc($sp);"
"ld $t7, 8($sp);"
"ld $t6, ($sp);"
"ddivu $zero, $t6, $t7;"
"bnez $t7, .L80324144;"
" nop;"
"break 7;"
".L80324144:"
"mfhi $v0;"
"dsll32 $v1, $v0, 0;"
"dsra32 $v1, $v1, 0;"
"dsra32 $v0, $v0, 0;"
".set pop;");
}
unsigned long __udivdi3(unsigned long a, unsigned long b) {
__asm__(".set push;"
".set noat;"
".set noreorder;"
".set gp=64;"
"sw $a0, ($sp);"
"sw $a1, 4($sp);"
"sw $a2, 8($sp);"
"sw $a3, 0xc($sp);"
"ld $t7, 8($sp);"
"ld $t6, ($sp);"
"ddivu $zero, $t6, $t7;"
"bnez $t7, .L80324180;"
" nop;"
"break 7;"
".L80324180:"
"mflo $v0;"
"dsll32 $v1, $v0, 0;"
"dsra32 $v1, $v1, 0;"
" dsra32 $v0, $v0, 0;"
".set pop;");
}
long __moddi3(long a, long b) {
__asm__(".set push;"
".set noat;"
".set noreorder;"
".set gp=64;"
"sw $a0, ($sp);"
"sw $a1, 4($sp);"
"sw $a2, 8($sp);"
"sw $a3, 0xc($sp);"
"ld $t7, 8($sp);"
"ld $t6, ($sp);"
"ddivu $zero, $t6, $t7;"
"bnez $t7, .L803241E8;"
" nop;"
"break 7;"
".L803241E8:"
"mfhi $v0;"
"dsll32 $v1, $v0, 0;"
"dsra32 $v1, $v1, 0;"
" dsra32 $v0, $v0, 0;"
".set pop;");
}
long __divdi3(long a, long b) {
__asm__(".set push;"
".set noat;"
".set noreorder;"
".set gp=64;"
"sw $a0, ($sp);"
"sw $a1, 4($sp);"
"sw $a2, 8($sp);"
"sw $a3, 0xc($sp);"
"ld $t7, 8($sp);"
"ld $t6, ($sp);"
"ddiv $zero, $t6, $t7;"
"nop;"
"bnez $t7, .L80324228;"
" nop;"
"break 7;"
".L80324228:"
"daddiu $at, $zero, -1;"
"bne $t7, $at, .L80324244;"
" daddiu $at, $zero, 1;"
"dsll32 $at, $at, 0x1f;"
"bne $t6, $at, .L80324244;"
" nop;"
"break 6;"
".L80324244:"
"mflo $v0;"
"dsll32 $v1, $v0, 0;"
"dsra32 $v1, $v1, 0;"
" dsra32 $v0, $v0, 0;"
".set pop;");
}
#endif

View file

@ -1265,8 +1265,7 @@ void Fault_Init(void) {
gFaultMgr.faultHandlerEnabled = true;
osCreateMesgQueue(&sFaultInstance->queue, &sFaultInstance->msg, 1);
StackCheck_Init(&sFaultThreadInfo, &sFaultStack, STACK_TOP(sFaultStack), 0, 0x100, "fault");
osCreateThread(&sFaultInstance->thread, 2, Fault_ThreadEntry, 0, STACK_TOP(sFaultStack),
OS_PRIORITY_APPMAX);
osCreateThread(&sFaultInstance->thread, 2, Fault_ThreadEntry, 0, STACK_TOP(sFaultStack), OS_PRIORITY_APPMAX);
osStartThread(&sFaultInstance->thread);
}

View file

@ -470,7 +470,8 @@ void func_8002C7BC(TargetContext* targetCtx, Player* player, Actor* actorArg, Gl
if ((actorArg != NULL) && (targetCtx->unk_4B == 0)) {
Actor_ProjectPos(globalCtx, &actorArg->focus.pos, &projectedFocusPos, &cappedInvWDest);
if (((projectedFocusPos.z <= 0.0f) || (1.0f <= fabsf(projectedFocusPos.x * cappedInvWDest))) || (1.0f <= fabsf(projectedFocusPos.y * cappedInvWDest))) {
if (((projectedFocusPos.z <= 0.0f) || (1.0f <= fabsf(projectedFocusPos.x * cappedInvWDest))) ||
(1.0f <= fabsf(projectedFocusPos.y * cappedInvWDest))) {
actorArg = NULL;
}
}
@ -728,23 +729,23 @@ void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity,
(u8)titleCtx->alpha);
gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + textureLanguageOffset, G_IM_FMT_IA, G_IM_SIZ_8b, width, height, 0,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + textureLanguageOffset, G_IM_FMT_IA, G_IM_SIZ_8b,
width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK,
G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1, G_TX_RENDERTILE,
0, 0, 1 << 10, 1 << 10);
gSPTextureRectangle(OVERLAY_DISP++, titleX, titleY, ((doubleWidth * 2) + titleX) - 4, titleY + (height * 4) - 1,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
height = titleCtx->height - height;
// If texture is bigger than 0x1000, display the rest
if (height > 0) {
gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + textureLanguageOffset + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, width,
height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
G_TX_NOLOD, G_TX_NOLOD);
gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + textureLanguageOffset + 0x1000, G_IM_FMT_IA,
G_IM_SIZ_8b, width, height, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4, titleSecondY + (height * 4) - 1,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
gSPTextureRectangle(OVERLAY_DISP++, titleX, titleSecondY, ((doubleWidth * 2) + titleX) - 4,
titleSecondY + (height * 4) - 1, G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
}
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 2880);

View file

@ -452,8 +452,10 @@ void HealthMeter_Draw(GlobalContext* globalCtx) {
heartTexCoordPerPixel *= 1 << 10;
halfHeartLength = 8.0f;
halfHeartLength *= 0.68f;
gSPTextureRectangle(OVERLAY_DISP++, (s32)((heartCenterX - halfHeartLength) * 4), (s32)((heartCenterY - halfHeartLength) * 4),
(s32)((heartCenterX + halfHeartLength) * 4), (s32)((heartCenterY + halfHeartLength) * 4), G_TX_RENDERTILE, 0, 0,
gSPTextureRectangle(OVERLAY_DISP++, (s32)((heartCenterX - halfHeartLength) * 4),
(s32)((heartCenterY - halfHeartLength) * 4),
(s32)((heartCenterX + halfHeartLength) * 4),
(s32)((heartCenterY + halfHeartLength) * 4), G_TX_RENDERTILE, 0, 0,
(s32)heartTexCoordPerPixel, (s32)heartTexCoordPerPixel);
} else {
if ((ddHeartCountMinusOne < 0) || (heartIndex > ddHeartCountMinusOne)) {
@ -474,8 +476,9 @@ void HealthMeter_Draw(GlobalContext* globalCtx) {
{
Mtx* matrix = Graph_Alloc(gfxCtx, sizeof(Mtx));
Matrix_SetTranslateScaleMtx2(matrix, 1.0f - (0.32f * beatingHeartPulsingSize), 1.0f - (0.32f * beatingHeartPulsingSize), 1.0f - (0.32f * beatingHeartPulsingSize),
-130.0f + offsetX, 94.5f - offsetY, 0.0f);
Matrix_SetTranslateScaleMtx2(
matrix, 1.0f - (0.32f * beatingHeartPulsingSize), 1.0f - (0.32f * beatingHeartPulsingSize),
1.0f - (0.32f * beatingHeartPulsingSize), -130.0f + offsetX, 94.5f - offsetY, 0.0f);
gSPMatrix(OVERLAY_DISP++, matrix, G_MTX_MODELVIEW | G_MTX_LOAD);
gSPVertex(OVERLAY_DISP++, beatingHeartVtx, 4, 0);
gSP1Quadrangle(OVERLAY_DISP++, 0, 2, 3, 1, 0);

View file

@ -63,10 +63,10 @@ void MapMark_Init(GlobalContext* globalCtx) {
Overlay_Load(overlay->vromStart, overlay->vromEnd, overlay->vramStart, overlay->vramEnd, overlay->loadedRamAddr);
sLoadedMarkDataTable = gMapMarkDataTable;
sLoadedMarkDataTable = (void*)(u32)((overlay->vramTable != NULL)
? (void*)((u32)overlay->vramTable -
(s32)((u32)overlay->vramStart - (u32)overlay->loadedRamAddr))
: NULL);
sLoadedMarkDataTable = (void*)(u32)(
(overlay->vramTable != NULL)
? (void*)((u32)overlay->vramTable - (s32)((u32)overlay->vramStart - (u32)overlay->loadedRamAddr))
: NULL);
}
void MapMark_ClearPointers(GlobalContext* globalCtx) {

View file

@ -155,7 +155,8 @@ void EnHeishi2_Init(Actor* thisx, GlobalContext* globalCtx) {
// "Identification Completed!"
osSyncPrintf(VT_FGCOL(YELLOW) " ☆☆☆☆☆ 識別完了! ☆☆☆☆☆ %d\n" VT_RST, this->type);
// "Message completed!"
osSyncPrintf(VT_FGCOL(MAGENTA) " ☆☆☆☆☆ メッセージ完了! ☆☆☆☆☆ %x\n\n" VT_RST, (this->actor.params >> 8) & 0xF);
osSyncPrintf(VT_FGCOL(MAGENTA) " ☆☆☆☆☆ メッセージ完了! ☆☆☆☆☆ %x\n\n" VT_RST,
(this->actor.params >> 8) & 0xF);
}
}

View file

@ -61,12 +61,8 @@ static s16 sObjectIds[6] = {
};
static FlexSkeletonHeader* sSkeletons[6] = {
&object_ahg_Skel_0000F0,
&object_boj_Skel_0000F0,
&object_boj_Skel_0000F0,
&object_boj_Skel_0000F0,
&object_boj_Skel_0000F0,
&object_boj_Skel_0000F0,
&object_ahg_Skel_0000F0, &object_boj_Skel_0000F0, &object_boj_Skel_0000F0,
&object_boj_Skel_0000F0, &object_boj_Skel_0000F0, &object_boj_Skel_0000F0,
};
static AnimationHeader* sAnimations[6] = {

View file

@ -186,7 +186,8 @@ void func_80B3A3D4(EnWonderTalk2* this, GlobalContext* globalCtx) {
if ((this->switchFlag >= 0) && (this->talkMode != 4)) {
Flags_SetSwitch(globalCtx, this->switchFlag);
// "(Forced) I saved it! All of it!"
osSyncPrintf(VT_FGCOL(MAGENTA) "☆☆☆☆☆ (強制)セーブしたよ!おもいっきり! %x\n" VT_RST, this->switchFlag);
osSyncPrintf(VT_FGCOL(MAGENTA) "☆☆☆☆☆ (強制)セーブしたよ!おもいっきり! %x\n" VT_RST,
this->switchFlag);
}
if (this->talkMode == 4) {

View file

@ -344,8 +344,8 @@ s16 ObjOshihiki_GetHighestFloor(ObjOshihiki* this) {
for (i = 1; i < ARRAY_COUNT(this->floorHeights); i++) {
if (this->floorHeights[i] > this->floorHeights[highestFloor]) {
highestFloor = i;
} else if ((this->floorBgIds[i] == BGCHECK_SCENE) &&
((this->floorHeights[i] - this->floorHeights[highestFloor]) > -0.001f)) {
} else if ((this->floorBgIds[i] == BGCHECK_SCENE) &&
((this->floorHeights[i] - this->floorHeights[highestFloor]) > -0.001f)) {
highestFloor = i;
}
}