Imported some runtime libraries

This commit is contained in:
dbalatoni13 2024-11-19 02:57:22 +01:00
parent b7c28ab24d
commit faacc236bf
8 changed files with 1139 additions and 5 deletions

View file

@ -631,13 +631,13 @@ config.libs = [
"cflags": cflags_runtime, "cflags": cflags_runtime,
"host": False, "host": False,
"objects": [ "objects": [
Object(NonMatching, "Runtime.PPCEABI.H/__va_arg.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/__va_arg.c"),
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/global_destructor_chain.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/global_destructor_chain.c"),
Object(NonMatching, "Runtime.PPCEABI.H/__mem.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/__mem.c"),
Object(NonMatching, "Runtime.PPCEABI.H/New.cp"), Object(NonMatching, "Runtime.PPCEABI.H/New.cp"),
Object(NonMatching, "Runtime.PPCEABI.H/NewMore.cp"), Object(NonMatching, "Runtime.PPCEABI.H/NewMore.cp"),
Object(NonMatching, "Runtime.PPCEABI.H/NMWException.cp"), Object(NonMatching, "Runtime.PPCEABI.H/NMWException.cp"),
Object(NonMatching, "Runtime.PPCEABI.H/runtime.c"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/runtime.c"),
Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/__init_cpp_exceptions.cpp"), Object(MatchingFor("GMPE01_00", "GMPE01_01"), "Runtime.PPCEABI.H/__init_cpp_exceptions.cpp"),
Object(NonMatching, "Runtime.PPCEABI.H/Gecko_ExceptionPPC.cp"), Object(NonMatching, "Runtime.PPCEABI.H/Gecko_ExceptionPPC.cp"),
Object(NonMatching, "Runtime.PPCEABI.H/GCN_mem_alloc.c"), Object(NonMatching, "Runtime.PPCEABI.H/GCN_mem_alloc.c"),

View file

@ -0,0 +1,40 @@
#ifndef __VA_ARG_H
#define __VA_ARG_H
#include "dolphin/types.h"
typedef struct __va_list_struct {
char gpr;
char fpr;
char reserved[2];
char* input_arg_area;
char* reg_save_area;
} _va_list_struct;
typedef _va_list_struct __va_list[1];
#ifdef __cplusplus
extern "C" void* __va_arg(_va_list_struct*, int);
#else
void* __va_arg(_va_list_struct*, int);
#endif
#ifndef __MWERKS__
#define __builtin_va_info(...)
#define _var_arg_typeof(...)
#endif
// from defined-string in mwcceppc.exe:
// __builtin_va_info: initialize the __va_list_struct
// _var_arg_typeof: convert type to integer for __va_arg
#define __va_start(list, fmt) __builtin_va_info(&list)
#define __va_arg(list, type) (*((type*)__va_arg(list, _var_arg_typeof(type))))
#define va_start __va_start
#define va_arg __va_arg
#define va_end __va_end
#define va_list __va_list
#define __va_end(list) ((void)0)
#define __va_copy(a, b) (*(a) = *(b))
#endif /* __VA_ARG_H */

90
include/dol2asm.h Normal file
View file

@ -0,0 +1,90 @@
#ifndef DOL2ASM
#define DOL2ASM
// this helps remove useless error from the linter when using vscode.
#ifdef __MWERKS__
#ifdef __cplusplus
#define SECTION_INIT extern "C" __declspec(section ".init")
#define SECTION_RODATA __declspec(section ".rodata")
#define SECTION_DATA __declspec(section ".data")
#define SECTION_SDATA __declspec(section ".sdata")
#define SECTION_SDATA2 __declspec(section ".sdata2")
#define SECTION_BSS __declspec(section ".data")
#define SECTION_SBSS __declspec(section ".sdata")
#define SECTION_SBSS2 __declspec(section ".sdata2")
#define SECTION_CTORS extern "C" __declspec(section ".ctors")
#define SECTION_DTORS extern "C" __declspec(section ".dtors")
#define SECTION_EXTAB extern "C" __declspec(section "extab_")
#define SECTION_EXTABINDEX extern "C" __declspec(section "extabindex_")
#define SECTION_DEAD extern "C" __declspec(section ".dead")
#define SECTION_CTORS10 __declspec(section ".ctors$10")
#define SECTION_CTORS15 __declspec(section ".ctors$15")
#define SECTION_DTORS10 __declspec(section ".dtors$10")
#define SECTION_DTORS15 __declspec(section ".dtors$15")
#define COMPILER_STRIP_GATE(NAME, VALUE) SECTION_DEAD void* const cg_##NAME = (void*)(VALUE)
#define REGISTER_CTORS(ADDR, FUNCTION) SECTION_CTORS void* const _ctors_##ADDR = (void*)(FUNCTION);
#else
#define SECTION_INIT __declspec(section ".init")
#define SECTION_RODATA __declspec(section ".rodata")
#define SECTION_DATA __declspec(section ".data")
#define SECTION_SDATA __declspec(section ".sdata")
#define SECTION_SDATA2 __declspec(section ".sdata2")
#define SECTION_BSS __declspec(section ".data")
#define SECTION_SBSS __declspec(section ".sdata")
#define SECTION_SBSS2 __declspec(section ".sdata2")
#define SECTION_CTORS __declspec(section ".ctors")
#define SECTION_DTORS __declspec(section ".dtors")
#define SECTION_EXTAB __declspec(section "extab_")
#define SECTION_EXTABINDEX __declspec(section "extabindex_")
#define SECTION_DEAD __declspec(section ".dead")
#define SECTION_CTORS10 __declspec(section ".ctors$10")
#define SECTION_CTORS15 __declspec(section ".ctors$15")
#define SECTION_DTORS10 __declspec(section ".dtors$10")
#define SECTION_DTORS15 __declspec(section ".dtors$15")
#define COMPILER_STRIP_GATE(NAME, VALUE) SECTION_DEAD void* const cg_##NAME = (void*)(VALUE)
#define REGISTER_CTORS(ADDR, FUNCTION) SECTION_CTORS void* const _ctors_##ADDR = (void*)(FUNCTION);
#endif
#else
#define SECTION_INIT
#define SECTION_RODATA
#define SECTION_DATA
#define SECTION_SDATA
#define SECTION_SDATA2
#define SECTION_BSS
#define SECTION_SBSS
#define SECTION_SBSS2
#define SECTION_CTORS
#define SECTION_DTORS
#define SECTION_EXTAB
#define SECTION_EXTABINDEX
#define SECTION_DEAD
#define SECTION_CTORS10
#define SECTION_CTORS15
#define SECTION_DTORS10
#define SECTION_DTORS15
#define COMPILER_STRIP_GATE(...)
#define REGISTER_CTORS(...)
// vscode doesn't like asm and nofralloc very much
#define asm
#define nofralloc
#endif
// floating-point constants
// TODO: move to different header
#define _HUGE_ENUF 1e+300
#define INFINITY ((float)(_HUGE_ENUF * _HUGE_ENUF))
#define HUGE_VAL ((double)INFINITY)
#define HUGE_VALL ((long double)INFINITY)
#define DOUBLE_INF HUGE_VAL
#pragma section ".dead"
#pragma section ".ctors$10"
#pragma section ".ctors$15"
#pragma section ".dtors$10"
#pragma section ".dtors$15"
#endif /* DOL2ASM */

View file

@ -57,8 +57,14 @@ u32 OSUncachedToCached(void *ucaddr);
#define OSDiffTick(tick1, tick0) ((s32)(tick1) - (s32)(tick0)) #define OSDiffTick(tick1, tick0) ((s32)(tick1) - (s32)(tick0))
#define OSRoundUp32B(v) (((u32)(v + 31) & ~31)) #define OSRoundUp32B(x) (((u32)(x) + 0x1F) & ~(0x1F))
#define OSRoundDown32B(x) (((u32)(x)) & ~31) #define OSRoundDown32B(x) (((u32)(x)) & ~(0x1F))
#define OSRoundUp(x, align) (((x) + (align)-1) & (-(align)))
#define OSRoundUpPtr(x, align) ((void*)((((u32)(x)) + (align)-1) & (~((align)-1))))
#define OSRoundDown(x, align) ((x) & (-(align)))
#define OSRoundDownPtr(x, align) ((void*)(((u32)(x)) & (~((align)-1))))
void OSInit(); void OSInit();

View file

@ -0,0 +1,30 @@
#include "dolphin/os.h"
inline static void InitDefaultHeap(void) {
void* arenaLo;
void* arenaHi;
OSReport("GCN_Mem_Alloc.c : InitDefaultHeap. No Heap Available\n");
OSReport("Metrowerks CW runtime library initializing default heap\n");
arenaLo = OSGetArenaLo();
arenaHi = OSGetArenaHi();
arenaLo = OSInitAlloc(arenaLo, arenaHi, 1);
OSSetArenaLo(arenaLo);
arenaLo = OSRoundUpPtr(arenaLo, 0x20);
arenaHi = OSRoundDownPtr(arenaHi, 0x20);
OSSetCurrentHeap(OSCreateHeap(arenaLo, arenaHi));
OSSetArenaLo(arenaLo = arenaHi);
}
/* 80362914-803629CC 35D254 00B8+00 0/0 1/1 0/0 .text __sys_free */
void __sys_free(void* p) {
if (__OSCurrHeap == -1) {
InitDefaultHeap();
}
OSFreeToHeap(__OSCurrHeap, p);
}

View file

@ -0,0 +1,91 @@
#include "dol2asm.h"
#include "stddef.h"
#include <dolphin.h>
/* 80003540-80003590 000440 0050+00 1/1 63/63 6/6 .init memcpy */
SECTION_INIT void* memcpy(void* dst, const void* src, size_t n) {
const unsigned char* s;
unsigned char* d;
if ((unsigned long)src >= (unsigned long)dst) {
s = (const unsigned char*)src - 1;
d = (unsigned char*)dst - 1;
n++;
while (--n != 0)
*++d = *++s;
} else {
s = (const unsigned char*)src + n;
d = (unsigned char*)dst + n;
n++;
while (--n != 0)
*--d = *--s;
}
return dst;
}
/* 80003488-80003540 000388 00B8+00 1/1 0/0 0/0 .init __fill_mem */
SECTION_INIT void __fill_mem(void* dst, int val, size_t n) {
unsigned long v = (unsigned char)val;
unsigned long i;
((unsigned char*)dst) = ((unsigned char*)dst) - 1;
if (n >= 32) {
i = (~(unsigned long)dst) & 3;
if (i) {
n -= i;
do {
*++(((unsigned char*)dst)) = v;
} while (--i);
}
if (v)
v |= v << 24 | v << 16 | v << 8;
((unsigned long*)dst) = ((unsigned long*)(((unsigned char*)dst) + 1)) - 1;
i = n >> 5;
if (i) {
do {
*++((unsigned long*)dst) = v;
*++((unsigned long*)dst) = v;
*++((unsigned long*)dst) = v;
*++((unsigned long*)dst) = v;
*++((unsigned long*)dst) = v;
*++((unsigned long*)dst) = v;
*++((unsigned long*)dst) = v;
*++((unsigned long*)dst) = v;
} while (--i);
}
i = (n & 31) >> 2;
if (i) {
do {
*++((unsigned long*)dst) = v;
} while (--i);
}
((unsigned char*)dst) = ((unsigned char*)(((unsigned long*)dst) + 1)) - 1;
n &= 3;
}
if (n)
do {
*++((unsigned char*)dst) = v;
} while (--n);
return;
}
/* 80003458-80003488 000358 0030+00 1/1 55/55 137/137 .init memset */
SECTION_INIT void* memset(void* dst, int val, size_t n) {
__fill_mem(dst, val, n);
return dst;
}

View file

@ -0,0 +1,50 @@
#include "Runtime.PPCEABI.H/__va_arg.h"
#undef __va_arg
/* 80361B14-80361BDC 35C454 00C8+00 0/0 3/3 0/0 .text __va_arg */
void* __va_arg(_va_list_struct* list, int type) {
char* addr;
char* reg = &(list->gpr);
int g_reg = list->gpr;
int maxsize = 8;
int size = 4;
int increment = 1;
int even = 0;
int fpr_offset = 0;
int regsize = 4;
if (type == 3) {
reg = &(list->fpr);
g_reg = list->fpr;
size = 8;
fpr_offset = 32;
regsize = 8;
}
if (type == 2) {
size = 8;
maxsize--;
if (g_reg & 1) {
even = 1;
}
increment = 2;
}
if (g_reg < maxsize) {
g_reg += even;
addr = list->reg_save_area + fpr_offset + (g_reg * regsize);
*reg = g_reg + increment;
} else {
*reg = 8;
addr = list->input_arg_area;
addr = (char*)(((u32)(addr) + ((size)-1)) & ~((size)-1));
list->input_arg_area = addr + size;
}
if (type == 0) {
addr = *((char**)addr);
}
return addr;
}

View file

@ -0,0 +1,827 @@
#include <dolphin.h>
#ifdef __cplusplus
extern "C" {
#endif
/* macros for GPR/FPR resting and saving */
#define SAVE_FPR(reg) _savefpr_##reg
#define RESTORE_FPR(reg) _restfpr_##reg
#define SAVE_GPR(reg) _savegpr_##reg
#define RESTORE_GPR(reg) _restgpr_##reg
#define ENTRY_SAVE_FPR(reg) entry SAVE_FPR(reg)
#define ENTRY_RESTORE_FPR(reg) entry RESTORE_FPR(reg)
#define ENTRY_SAVE_GPR(reg) entry SAVE_GPR(reg)
#define ENTRY_RESTORE_GPR(reg) entry RESTORE_GPR(reg)
#define save_restore_reg r11
asm void __div2u(void);
asm void __div2i(void);
asm void __mod2u(void);
asm void __mod2i(void);
asm void __shl2i(void);
asm void __shr2u(void);
asm void __shr2i(void);
asm void __cvt_dbl_usll(void);
void SAVE_FPR(14)(void);
void SAVE_FPR(15)(void);
void SAVE_FPR(16)(void);
void SAVE_FPR(17)(void);
void SAVE_FPR(18)(void);
void SAVE_FPR(19)(void);
void SAVE_FPR(20)(void);
void SAVE_FPR(21)(void);
void SAVE_FPR(22)(void);
void SAVE_FPR(23)(void);
void SAVE_FPR(24)(void);
void SAVE_FPR(25)(void);
void SAVE_FPR(26)(void);
void SAVE_FPR(27)(void);
void SAVE_FPR(28)(void);
void SAVE_FPR(29)(void);
void SAVE_FPR(30)(void);
void SAVE_FPR(31)(void);
void RESTORE_FPR(14)(void);
void RESTORE_FPR(15)(void);
void RESTORE_FPR(16)(void);
void RESTORE_FPR(17)(void);
void RESTORE_FPR(18)(void);
void RESTORE_FPR(19)(void);
void RESTORE_FPR(20)(void);
void RESTORE_FPR(21)(void);
void RESTORE_FPR(22)(void);
void RESTORE_FPR(23)(void);
void RESTORE_FPR(24)(void);
void RESTORE_FPR(25)(void);
void RESTORE_FPR(26)(void);
void RESTORE_FPR(27)(void);
void RESTORE_FPR(28)(void);
void RESTORE_FPR(29)(void);
void RESTORE_FPR(30)(void);
void RESTORE_FPR(31)(void);
void SAVE_GPR(14)(void);
void SAVE_GPR(15)(void);
void SAVE_GPR(16)(void);
void SAVE_GPR(17)(void);
void SAVE_GPR(18)(void);
void SAVE_GPR(19)(void);
void SAVE_GPR(20)(void);
void SAVE_GPR(21)(void);
void SAVE_GPR(22)(void);
void SAVE_GPR(23)(void);
void SAVE_GPR(24)(void);
void SAVE_GPR(25)(void);
void SAVE_GPR(26)(void);
void SAVE_GPR(27)(void);
void SAVE_GPR(28)(void);
void SAVE_GPR(29)(void);
void SAVE_GPR(30)(void);
void SAVE_GPR(31)(void);
void RESTORE_GPR(14)(void);
void RESTORE_GPR(15)(void);
void RESTORE_GPR(16)(void);
void RESTORE_GPR(17)(void);
void RESTORE_GPR(18)(void);
void RESTORE_GPR(19)(void);
void RESTORE_GPR(20)(void);
void RESTORE_GPR(21)(void);
void RESTORE_GPR(22)(void);
void RESTORE_GPR(23)(void);
void RESTORE_GPR(24)(void);
void RESTORE_GPR(25)(void);
void RESTORE_GPR(26)(void);
void RESTORE_GPR(27)(void);
void RESTORE_GPR(28)(void);
void RESTORE_GPR(29)(void);
void RESTORE_GPR(30)(void);
void RESTORE_GPR(31)(void);
static const u32 __constants[] = {
0x00000000, 0x00000000, 0x41F00000, 0x00000000, 0x41E00000, 0x00000000,
};
/* 803620AC-80362108 35C9EC 005C+00 0/0 42/42 89/89 .text __cvt_fp2unsigned */
asm u32 __cvt_fp2unsigned(register f64 d)
{
#ifdef __MWERKS__ // clang-format off
nofralloc
stwu r1,-16(r1)
lis r4, __constants@h
ori r4, r4, __constants@l
li r3,0
lfd fp0,0(r4)
lfd fp3,8(r4)
lfd fp4,16(r4)
fcmpu cr0,fp1,fp0
fcmpu cr6,fp1,fp3
blt cr0, @exit
addi r3,r3,-1
bge cr6,@exit
fcmpu cr7,fp1,fp4
fmr fp2,fp1
blt cr7,@1
fsub fp2,fp1,fp4
@1 fctiwz fp2,fp2
stfd fp2,8(r1)
lwz r3,12(r1)
blt cr7,@exit
addis r3,r3,-0x8000
@exit:
addi r1,r1,16
blr
#endif // clang-format on
}
/* 80362108-80362134 35CA48 002C+00 0/0 0/0 0/0 .text __save_fpr */
asm void __save_fpr(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
ENTRY_SAVE_FPR(14)
stfd fp14,-144(save_restore_reg)
ENTRY_SAVE_FPR(15)
stfd fp15,-136(save_restore_reg)
ENTRY_SAVE_FPR(16)
stfd fp16,-128(save_restore_reg)
ENTRY_SAVE_FPR(17)
stfd fp17,-120(save_restore_reg)
ENTRY_SAVE_FPR(18)
stfd fp18,-112(save_restore_reg)
ENTRY_SAVE_FPR(19)
stfd fp19,-104(save_restore_reg)
ENTRY_SAVE_FPR(20)
stfd fp20,-96(save_restore_reg)
ENTRY_SAVE_FPR(21)
stfd fp21,-88(save_restore_reg)
ENTRY_SAVE_FPR(22)
stfd fp22,-80(save_restore_reg)
ENTRY_SAVE_FPR(23)
stfd fp23,-72(save_restore_reg)
ENTRY_SAVE_FPR(24)
stfd fp24,-64(save_restore_reg)
ENTRY_SAVE_FPR(25)
stfd fp25,-56(save_restore_reg)
ENTRY_SAVE_FPR(26)
stfd fp26,-48(save_restore_reg)
ENTRY_SAVE_FPR(27)
stfd fp27,-40(save_restore_reg)
ENTRY_SAVE_FPR(28)
stfd fp28,-32(save_restore_reg)
ENTRY_SAVE_FPR(29)
stfd fp29,-24(save_restore_reg)
ENTRY_SAVE_FPR(30)
stfd fp30,-16(save_restore_reg)
ENTRY_SAVE_FPR(31)
stfd fp31,-8(save_restore_reg)
blr
#endif // clang-format on
}
/* 80362154-80362180 35CA94 002C+00 0/0 0/0 0/0 .text __restore_fpr */
asm void __restore_fpr(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
ENTRY_RESTORE_FPR(14)
lfd fp14,-144(save_restore_reg)
ENTRY_RESTORE_FPR(15)
lfd fp15,-136(save_restore_reg)
ENTRY_RESTORE_FPR(16)
lfd fp16,-128(save_restore_reg)
ENTRY_RESTORE_FPR(17)
lfd fp17,-120(save_restore_reg)
ENTRY_RESTORE_FPR(18)
lfd fp18,-112(save_restore_reg)
ENTRY_RESTORE_FPR(19)
lfd fp19,-104(save_restore_reg)
ENTRY_RESTORE_FPR(20)
lfd fp20,-96(save_restore_reg)
ENTRY_RESTORE_FPR(21)
lfd fp21,-88(save_restore_reg)
ENTRY_RESTORE_FPR(22)
lfd fp22,-80(save_restore_reg)
ENTRY_RESTORE_FPR(23)
lfd fp23,-72(save_restore_reg)
ENTRY_RESTORE_FPR(24)
lfd fp24,-64(save_restore_reg)
ENTRY_RESTORE_FPR(25)
lfd fp25,-56(save_restore_reg)
ENTRY_RESTORE_FPR(26)
lfd fp26,-48(save_restore_reg)
ENTRY_RESTORE_FPR(27)
lfd fp27,-40(save_restore_reg)
ENTRY_RESTORE_FPR(28)
lfd fp28,-32(save_restore_reg)
ENTRY_RESTORE_FPR(29)
lfd fp29,-24(save_restore_reg)
ENTRY_RESTORE_FPR(30)
lfd fp30,-16(save_restore_reg)
ENTRY_RESTORE_FPR(31)
lfd fp31,-8(save_restore_reg)
blr
#endif // clang-format on
}
/* 803621A0-803621A4 35CAE0 0004+00 0/0 22/22 13/13 .text _savegpr_14 */
asm void __save_gpr(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
ENTRY_SAVE_GPR(14)
stw r14,-72(save_restore_reg)
ENTRY_SAVE_GPR(15)
stw r15,-68(save_restore_reg)
ENTRY_SAVE_GPR(16)
stw r16,-64(save_restore_reg)
ENTRY_SAVE_GPR(17)
stw r17,-60(save_restore_reg)
ENTRY_SAVE_GPR(18)
stw r18,-56(save_restore_reg)
ENTRY_SAVE_GPR(19)
stw r19,-52(save_restore_reg)
ENTRY_SAVE_GPR(20)
stw r20,-48(save_restore_reg)
ENTRY_SAVE_GPR(21)
stw r21,-44(save_restore_reg)
ENTRY_SAVE_GPR(22)
stw r22,-40(save_restore_reg)
ENTRY_SAVE_GPR(23)
stw r23,-36(save_restore_reg)
ENTRY_SAVE_GPR(24)
stw r24,-32(save_restore_reg)
ENTRY_SAVE_GPR(25)
stw r25,-28(save_restore_reg)
ENTRY_SAVE_GPR(26)
stw r26,-24(save_restore_reg)
ENTRY_SAVE_GPR(27)
stw r27,-20(save_restore_reg)
ENTRY_SAVE_GPR(28)
stw r28,-16(save_restore_reg)
ENTRY_SAVE_GPR(29)
stw r29,-12(save_restore_reg)
ENTRY_SAVE_GPR(30)
stw r30,-8(save_restore_reg)
ENTRY_SAVE_GPR(31)
stw r31,-4(save_restore_reg)
blr
#endif // clang-format on
}
/* 803621EC-803621F0 35CB2C 0004+00 0/0 22/22 13/13 .text _restgpr_14 */
asm void __restore_gpr(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
ENTRY_RESTORE_GPR(14)
lwz r14,-72(save_restore_reg)
ENTRY_RESTORE_GPR(15)
lwz r15,-68(save_restore_reg)
ENTRY_RESTORE_GPR(16)
lwz r16,-64(save_restore_reg)
ENTRY_RESTORE_GPR(17)
lwz r17,-60(save_restore_reg)
ENTRY_RESTORE_GPR(18)
lwz r18,-56(save_restore_reg)
ENTRY_RESTORE_GPR(19)
lwz r19,-52(save_restore_reg)
ENTRY_RESTORE_GPR(20)
lwz r20,-48(save_restore_reg)
ENTRY_RESTORE_GPR(21)
lwz r21,-44(save_restore_reg)
ENTRY_RESTORE_GPR(22)
lwz r22,-40(save_restore_reg)
ENTRY_RESTORE_GPR(23)
lwz r23,-36(save_restore_reg)
ENTRY_RESTORE_GPR(24)
lwz r24,-32(save_restore_reg)
ENTRY_RESTORE_GPR(25)
lwz r25,-28(save_restore_reg)
ENTRY_RESTORE_GPR(26)
lwz r26,-24(save_restore_reg)
ENTRY_RESTORE_GPR(27)
lwz r27,-20(save_restore_reg)
ENTRY_RESTORE_GPR(28)
lwz r28,-16(save_restore_reg)
ENTRY_RESTORE_GPR(29)
lwz r29,-12(save_restore_reg)
ENTRY_RESTORE_GPR(30)
lwz r30,-8(save_restore_reg)
ENTRY_RESTORE_GPR(31)
lwz r31,-4(save_restore_reg)
blr
#endif // clang-format on
}
/* 80362238-80362324 35CB78 00EC+00 0/0 2/2 0/0 .text __div2u */
asm void __div2u(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
cmpwi cr0,r3,0
cntlzw r0,r3
cntlzw r9,r4
bne cr0,lab1
addi r0,r9,32
lab1:
cmpwi cr0,r5,0
cntlzw r9,r5
cntlzw r10,r6
bne cr0,lab2
addi r9,r10,32
lab2:
cmpw cr0,r0,r9
subfic r10,r0,64
bgt cr0,lab9
addi r9,r9,1
subfic r9,r9,64
add r0,r0,r9
subf r9,r9,r10
mtctr r9
cmpwi cr0,r9,32
addi r7,r9,-32
blt cr0,lab3
srw r8,r3,r7
li r7,0
b lab4
lab3:
srw r8,r4,r9
subfic r7,r9,32
slw r7,r3,r7
or r8,r8,r7
srw r7,r3,r9
lab4:
cmpwi cr0,r0,32
addic r9,r0,-32
blt cr0,lab5
slw r3,r4,r9
li r4,0
b lab6
lab5:
slw r3,r3,r0
subfic r9,r0,32
srw r9,r4,r9
or r3,r3,r9
slw r4,r4,r0
lab6:
li r10,-1
addic r7,r7,0
lab7:
adde r4,r4,r4
adde r3,r3,r3
adde r8,r8,r8
adde r7,r7,r7
subfc r0,r6,r8
subfe. r9,r5,r7
blt cr0,lab8
mr r8,r0
mr r7,r9
addic r0,r10,1
lab8:
bdnz lab7
adde r4,r4,r4
adde r3,r3,r3
blr
lab9:
li r4,0
li r3,0
blr
#endif // clang-format on
}
/* 80362324-8036245C 35CC64 0138+00 0/0 16/16 1/1 .text __div2i */
asm void __div2i(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
stwu r1,-16(r1)
rlwinm. r9,r3,0,0,0
beq cr0,positive1
subfic r4,r4,0
subfze r3,r3
positive1:
stw r9,8(r1)
rlwinm. r10,r5,0,0,0
beq cr0,positive2
subfic r6,r6,0
subfze r5,r5
positive2:
stw r10,12(r1)
cmpwi cr0,r3,0
cntlzw r0,r3
cntlzw r9,r4
bne cr0,lab1
addi r0,r9,32
lab1:
cmpwi cr0,r5,0
cntlzw r9,r5
cntlzw r10,r6
bne cr0,lab2
addi r9,r10,32
lab2:
cmpw cr0,r0,r9
subfic r10,r0,64
bgt cr0,lab9
addi r9,r9,1
subfic r9,r9,64
add r0,r0,r9
subf r9,r9,r10
mtctr r9
cmpwi cr0,r9,32
addi r7,r9,-32
blt cr0,lab3
srw r8,r3,r7
li r7,0
b lab4
lab3:
srw r8,r4,r9
subfic r7,r9,32
slw r7,r3,r7
or r8,r8,r7
srw r7,r3,r9
lab4:
cmpwi cr0,r0,32
addic r9,r0,-32
blt cr0,lab5
slw r3,r4,r9
li r4,0
b lab6
lab5:
slw r3,r3,r0
subfic r9,r0,32
srw r9,r4,r9
or r3,r3,r9
slw r4,r4,r0
lab6:
li r10,-1
addic r7,r7,0
lab7:
adde r4,r4,r4
adde r3,r3,r3
adde r8,r8,r8
adde r7,r7,r7
subfc r0,r6,r8
subfe. r9,r5,r7
blt cr0,lab8
mr r8,r0
mr r7,r9
addic r0,r10,1
lab8:
bdnz lab7
adde r4,r4,r4
adde r3,r3,r3
lwz r9,8(r1)
lwz r10,12(r1)
xor. r7,r9,r10
beq cr0,no_adjust
cmpwi cr0,r9,0
subfic r4,r4,0
subfze r3,r3
no_adjust:
b func_end
lab9:
li r4,0
li r3,0
func_end:
addi r1,r1,16
blr
#endif // clang-format on
}
/* 8036245C-80362540 35CD9C 00E4+00 0/0 2/2 0/0 .text __mod2u */
asm void __mod2u(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
cmpwi cr0,r3,0
cntlzw r0,r3
cntlzw r9,r4
bne cr0,lab1
addi r0,r9,32
lab1:
cmpwi cr0,r5,0
cntlzw r9,r5
cntlzw r10,r6
bne cr0,lab2
addi r9,r10,32
lab2:
cmpw cr0,r0,r9
subfic r10,r0,64
bgt cr0,lab9
addi r9,r9,1
subfic r9,r9,64
add r0,r0,r9
subf r9,r9,r10
mtctr r9
cmpwi cr0,r9,32
addi r7,r9,-32
blt cr0,lab3
srw r8,r3,r7
li r7,0
b lab4
lab3:
srw r8,r4,r9
subfic r7,r9,32
slw r7,r3,r7
or r8,r8,r7
srw r7,r3,r9
lab4:
cmpwi cr0,r0,32
addic r9,r0,-32
blt cr0,lab5
slw r3,r4,r9
li r4,0
b lab6
lab5:
slw r3,r3,r0
subfic r9,r0,32
srw r9,r4,r9
or r3,r3,r9
slw r4,r4,r0
lab6:
li r10,-1
addic r7,r7,0
lab7:
adde r4,r4,r4
adde r3,r3,r3
adde r8,r8,r8
adde r7,r7,r7
subfc r0,r6,r8
subfe. r9,r5,r7
blt cr0,lab8
mr r8,r0
mr r7,r9
addic r0,r10,1
lab8:
bdnz lab7
mr r4,r8
mr r3,r7
blr
lab9:
blr
#endif // clang-format on
}
/* 80362540-8036264C 35CE80 010C+00 0/0 2/2 0/0 .text __mod2i */
asm void __mod2i(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
cmpwi cr7,r3,0
bge cr7,positive1
subfic r4,r4,0
subfze r3,r3
positive1:
cmpwi cr0,r5,0
bge cr0,positive2
subfic r6,r6,0
subfze r5,r5
positive2:
cmpwi cr0,r3,0
cntlzw r0,r3
cntlzw r9,r4
bne cr0,lab1
addi r0,r9,32
lab1:
cmpwi cr0,r5,0
cntlzw r9,r5
cntlzw r10,r6
bne cr0,lab2
addi r9,r10,32
lab2:
cmpw cr0,r0,r9
subfic r10,r0,64
bgt cr0,lab9
addi r9,r9,1
subfic r9,r9,64
add r0,r0,r9
subf r9,r9,r10
mtctr r9
cmpwi cr0,r9,32
addi r7,r9,-32
blt cr0,lab3
srw r8,r3,r7
li r7,0
b lab4
lab3:
srw r8,r4,r9
subfic r7,r9,32
slw r7,r3,r7
or r8,r8,r7
srw r7,r3,r9
lab4:
cmpwi cr0,r0,32
addic r9,r0,-32
blt cr0,lab5
slw r3,r4,r9
li r4,0
b lab6
lab5:
slw r3,r3,r0
subfic r9,r0,32
srw r9,r4,r9
or r3,r3,r9
slw r4,r4,r0
lab6:
li r10,-1
addic r7,r7,0
lab7:
adde r4,r4,r4
adde r3,r3,r3
adde r8,r8,r8
adde r7,r7,r7
subfc r0,r6,r8
subfe. r9,r5,r7
blt cr0,lab8
mr r8,r0
mr r7,r9
addic r0,r10,1
lab8:
bdnz lab7
mr r4,r8
mr r3,r7
lab9:
bge cr7,no_adjust
subfic r4,r4,0
subfze r3,r3
no_adjust:
blr
#endif // clang-format on
}
/* 8036264C-80362670 35CF8C 0024+00 0/0 2/2 0/0 .text __shl2i */
asm void __shl2i(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
subfic r8,r5,32
subic r9,r5,32
slw r3,r3,r5
srw r10,r4,r8
or r3,r3,r10
slw r10,r4,r9
or r3,r3,r10
slw r4,r4,r5
blr
#endif // clang-format on
}
/* 80362670-80362694 35CFB0 0024+00 0/0 2/2 0/0 .text __shr2u */
asm void __shr2u(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
subfic r8,r5,32
subic r9,r5,32
srw r4,r4,r5
slw r10,r3,r8
or r4,r4,r10
srw r10,r3,r9
or r4,r4,r10
srw r3,r3,r5
blr
#endif // clang-format on
}
/* 80362694-803626BC 35CFD4 0028+00 0/0 3/3 0/0 .text __shr2i */
asm void __shr2i(void) {
#ifdef __MWERKS__ // clang-format off
nofralloc
subfic r8, r5, 0x20
addic. r9, r5, -0x20
srw r4, r4, r5
slw r10, r3, r8
or r4, r4, r10
sraw r10, r3, r9
ble around
or r4, r4, r10
around:
sraw r3, r3, r5
blr
#endif // clang-format on
}
/* 803626BC-80362770 35CFFC 00B4+00 0/0 1/1 0/0 .text __cvt_sll_flt */
asm void __cvt_sll_flt(void)
{
#ifdef __MWERKS__ // clang-format off
nofralloc
stwu r1, -0x10(r1)
rlwinm. r5, r3, 0, 0, 0
beq lbl_803626D0
subfic r4, r4, 0
subfze r3, r3
lbl_803626D0:
or. r7, r3, r4
li r6, 0
beq lbl_80362758
cntlzw r7, r3
cntlzw r8, r4
rlwinm r9, r7, 0x1a, 0, 4
srawi r9, r9, 0x1f
and r9, r9, r8
add r7, r7, r9
subfic r8, r7, 0x20
addic r9, r7, -32
slw r3, r3, r7
srw r10, r4, r8
or r3, r3, r10
slw r10, r4, r9
or r3, r3, r10
slw r4, r4, r7
subf r6, r7, r6
clrlwi r7, r4, 0x15
cmpwi r7, 0x400
addi r6, r6, 0x43e
blt lbl_80362740
bgt lbl_80362734
rlwinm. r7, r4, 0, 0x14, 0x14
beq lbl_80362740
lbl_80362734:
addic r4, r4, 0x800
addze r3, r3
addze r6, r6
lbl_80362740:
rotlwi r4, r4, 0x15
rlwimi r4, r3, 0x15, 0, 0xa
rlwinm r3, r3, 0x15, 0xc, 0x1f
slwi r6, r6, 0x14
or r3, r6, r3
or r3, r5, r3
lbl_80362758:
stw r3, 8(r1)
stw r4, 0xc(r1)
lfd f1, 8(r1)
frsp f1, f1
addi r1, r1, 0x10
blr
#endif // clang-format on
}
/* 80362770-8036283C 35D0B0 00CC+00 0/0 2/2 0/0 .text __cvt_dbl_usll */
asm void __cvt_dbl_usll(void)
{
#ifdef __MWERKS__ // clang-format off
nofralloc
stwu r1,-16(r1)
stfd f1,8(r1)
lwz r3,8(r1)
lwz r4,12(r1)
rlwinm r5,r3,12,21,31
cmpli cr0,0,r5,1023
bge cr0,not_fraction
li r3,0
li r4,0
b func_end
not_fraction:
mr r6,r3
rlwinm r3,r3,0,12,31
oris r3,r3,0x0010
addi r5,r5,-1075
cmpwi cr0,r5,0
bge cr0,left
neg r5,r5
subfic r8,r5,32
subic r9,r5,32
srw r4,r4,r5
slw r10,r3,r8
or r4,r4,r10
srw r10,r3,r9
or r4,r4,r10
srw r3,r3,r5
b around
left:
cmpwi cr0,r5,10
ble+ no_overflow
rlwinm. r6,r6,0,0,0
beq cr0,max_positive
lis r3,0x8000
li r4,0
b func_end
max_positive:
lis r3,0x7FFF
ori r3,r3,0xFFFF
li r4,-1
b func_end
no_overflow:
subfic r8,r5,32
subic r9,r5,32
slw r3,r3,r5
srw r10,r4,r8
or r3,r3,r10
slw r10,r4,r9
or r3,r3,r10
slw r4,r4,r5
around:
rlwinm. r6,r6,0,0,0
beq cr0,positive
subfic r4,r4,0
subfze r3,r3
positive:
func_end:
addi r1,r1,16
blr
#endif // clang-format on
}
#ifdef __cplusplus
}
#endif