Imported some runtime libraries
This commit is contained in:
parent
b7c28ab24d
commit
faacc236bf
8 changed files with 1139 additions and 5 deletions
|
|
@ -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"),
|
||||||
|
|
|
||||||
40
include/Runtime.PPCEABI.H/__va_arg.h
Normal file
40
include/Runtime.PPCEABI.H/__va_arg.h
Normal 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
90
include/dol2asm.h
Normal 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 */
|
||||||
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
||||||
30
src/Runtime.PPCEABI.H/GCN_Mem_Alloc.c
Normal file
30
src/Runtime.PPCEABI.H/GCN_Mem_Alloc.c
Normal 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);
|
||||||
|
}
|
||||||
91
src/Runtime.PPCEABI.H/__mem.c
Normal file
91
src/Runtime.PPCEABI.H/__mem.c
Normal 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;
|
||||||
|
}
|
||||||
50
src/Runtime.PPCEABI.H/__va_arg.c
Normal file
50
src/Runtime.PPCEABI.H/__va_arg.c
Normal 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;
|
||||||
|
}
|
||||||
827
src/Runtime.PPCEABI.H/runtime.c
Normal file
827
src/Runtime.PPCEABI.H/runtime.c
Normal 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
|
||||||
Loading…
Add table
Add a link
Reference in a new issue