From 1f4c0de0c63ef805e4a8e69f1982312b7aeb4c20 Mon Sep 17 00:00:00 2001 From: LagoLunatic Date: Wed, 8 Nov 2023 22:48:15 -0500 Subject: [PATCH] Match __mem.c and ptmf.c --- configure.py | 4 +- include/Runtime.PPCEABI.H/__mem.h | 16 ++++++ include/Runtime.PPCEABI.H/ptmf.h | 5 ++ src/Runtime.PPCEABI.H/__mem.c | 84 +++++++++++++++++++++++++++++++ src/Runtime.PPCEABI.H/ptmf.c | 50 ++++++++++++++++++ 5 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 include/Runtime.PPCEABI.H/__mem.h diff --git a/configure.py b/configure.py index f2972f9df..2676cc2eb 100644 --- a/configure.py +++ b/configure.py @@ -1066,12 +1066,12 @@ config.libs = [ "cflags": cflags_runtime, "host": False, "objects": [ - Object(NonMatching, "Runtime.PPCEABI.H/__mem.c"), + Object(Matching, "Runtime.PPCEABI.H/__mem.c"), Object(Matching, "Runtime.PPCEABI.H/__va_arg.c"), Object(Matching, "Runtime.PPCEABI.H/global_destructor_chain.c"), Object(Matching, "Runtime.PPCEABI.H/CPlusLibPPC.cp"), Object(NonMatching, "Runtime.PPCEABI.H/NMWException.cp"), - Object(NonMatching, "Runtime.PPCEABI.H/ptmf.c"), + Object(Matching, "Runtime.PPCEABI.H/ptmf.c"), Object(NonMatching, "Runtime.PPCEABI.H/runtime.c"), Object(Matching, "Runtime.PPCEABI.H/__init_cpp_exceptions.cpp"), Object(Matching, "Runtime.PPCEABI.H/Gecko_ExceptionPPC.cp"), diff --git a/include/Runtime.PPCEABI.H/__mem.h b/include/Runtime.PPCEABI.H/__mem.h new file mode 100644 index 000000000..ab53e58f9 --- /dev/null +++ b/include/Runtime.PPCEABI.H/__mem.h @@ -0,0 +1,16 @@ +#ifndef RUNTIME_MEM_H +#define RUNTIME_MEM_H + +#ifdef __cplusplus +extern "C" { +#endif + +__declspec(section ".init") void* memcpy(void* dest, const void* src, size_t n); +__declspec(section ".init") void __fill_mem(void* dest, int val, size_t count); +__declspec(section ".init") void* memset(void* dest, int val, size_t count); + +#ifdef __cplusplus +} +#endif + +#endif /* RUNTIME_MEM_H */ diff --git a/include/Runtime.PPCEABI.H/ptmf.h b/include/Runtime.PPCEABI.H/ptmf.h index 450d703ad..cc22aa42c 100644 --- a/include/Runtime.PPCEABI.H/ptmf.h +++ b/include/Runtime.PPCEABI.H/ptmf.h @@ -10,4 +10,9 @@ typedef struct __ptmf { } f_data; } __ptmf; +const __ptmf __ptmf_null; +long __ptmf_test(__ptmf* ptmf); +void __ptmf_cmpr(register __ptmf* this, register __ptmf* other); +void __ptmf_scall(...); + #endif /* PTMF_H */ diff --git a/src/Runtime.PPCEABI.H/__mem.c b/src/Runtime.PPCEABI.H/__mem.c index e69de29bb..6e4709d86 100644 --- a/src/Runtime.PPCEABI.H/__mem.c +++ b/src/Runtime.PPCEABI.H/__mem.c @@ -0,0 +1,84 @@ +#include "dolphin/types.h" +#include "Runtime.PPCEABI.H/__mem.h" + +void* memcpy(void* dst, const void* src, size_t n) +{ + const char* p; + char* q; + int rev = ((u32)src < (u32)dst); + + if (!rev) { + + for (p = (const char*)src - 1, q = (char*)dst - 1, n++; --n;) + *++q = *++p; + + } else { + for (p = (const char*)src + n, q = (char*)dst + n, n++; --n;) + *--q = *--p; + } + return (dst); +} + +void __fill_mem(void* dst, int val, u32 n) +{ + u32 v = (u8)val; + u32 i; + + ((u8*)dst) = ((u8*)dst) - 1; + + if (n >= 32) { + i = (~(u32)dst) & 3; + + if (i) { + n -= i; + + do + *++(((u8*)dst)) = v; + while (--i); + } + + if (v) + v |= v << 24 | v << 16 | v << 8; + + ((u32*)dst) = ((u32*)(((u8*)dst) + 1)) - 1; + + i = n >> 5; + + if (i) + do { + *++(((u32*)dst)) = v; + *++(((u32*)dst)) = v; + *++(((u32*)dst)) = v; + *++(((u32*)dst)) = v; + *++(((u32*)dst)) = v; + *++(((u32*)dst)) = v; + *++(((u32*)dst)) = v; + *++(((u32*)dst)) = v; + } while (--i); + + i = (n & 31) >> 2; + + if (i) + do + *++(((u32*)dst)) = v; + while (--i); + + ((u8*)dst) = ((u8*)(((u32*)dst) + 1)) - 1; + + n &= 3; + } + + if (n) + do + *++(((u8*)dst)) = v; + while (--n); + + return; +} + +void* memset(void* dst, int val, size_t n) +{ + __fill_mem(dst, val, n); + + return (dst); +} diff --git a/src/Runtime.PPCEABI.H/ptmf.c b/src/Runtime.PPCEABI.H/ptmf.c index 9721d88d3..8ba0bd98c 100644 --- a/src/Runtime.PPCEABI.H/ptmf.c +++ b/src/Runtime.PPCEABI.H/ptmf.c @@ -1 +1,51 @@ #include "Runtime.PPCEABI.H/ptmf.h" + +const __ptmf __ptmf_null = { 0, 0, 0 }; + +asm long __ptmf_test(register __ptmf* ptmf) { + lwz r5, __ptmf.this_delta(ptmf) + lwz r6, __ptmf.v_offset(ptmf) + lwz r7, __ptmf.f_data(ptmf) + li r3, 0x1 + cmpwi r5, 0x0 + cmpwi cr6, r6, 0x0 + cmpwi cr7, r7, 0x0 + bnelr + bnelr cr6 + bnelr cr7 + li r3, 0x0 + blr +}; + +asm void __ptmf_cmpr(register __ptmf* lhs, register __ptmf* rhs) { + lwz r5, __ptmf.this_delta(lhs) + lwz r6, __ptmf.this_delta(rhs) + lwz r7, __ptmf.v_offset(lhs) + lwz r8, __ptmf.v_offset(rhs) + lwz r9, __ptmf.f_data(lhs) + lwz r10, __ptmf.f_data(rhs) + li r3, 0x1 + cmpw r5, r6 + cmpw cr6, r7, r8 + cmpw cr7, r9, r10 + bnelr + bnelr cr6 + bnelr cr7 + li r3, 0x0 + blr +}; + +asm void __ptmf_scall(...) { + nofralloc; + lwz r0, __ptmf.this_delta(r12) + lwz r11, __ptmf.v_offset(r12) + lwz r12, __ptmf.f_data(r12) + add r3, r3, r0 + cmpwi r11, 0x0 + blt do_call + lwzx r12, r3, r12 + lwzx r12, r12, r11 +do_call: + mtctr r12 + bctr +};