summaryrefslogtreecommitdiff
path: root/src/MSL_C.PPCEABI.bare.H/mem_funcs.c
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2023-02-02 17:29:19 -0400
committermrb0nk500 <b0nk@b0nk.xyz>2023-02-03 13:27:06 -0400
commitf2eabdb6257c09cf2890dac5e9737912728542af (patch)
tree3b46f6787185d65605651a0f48776dc9779ce648 /src/MSL_C.PPCEABI.bare.H/mem_funcs.c
parenteef1dd840b7cecac28c2e6b0574707b90a37d4e7 (diff)
global: Add rest of Dolphin SDK proper, add MSL, and MetroTRK
Finally, it links properly.
Diffstat (limited to 'src/MSL_C.PPCEABI.bare.H/mem_funcs.c')
-rw-r--r--src/MSL_C.PPCEABI.bare.H/mem_funcs.c235
1 files changed, 235 insertions, 0 deletions
diff --git a/src/MSL_C.PPCEABI.bare.H/mem_funcs.c b/src/MSL_C.PPCEABI.bare.H/mem_funcs.c
new file mode 100644
index 0000000..c1ce8ea
--- /dev/null
+++ b/src/MSL_C.PPCEABI.bare.H/mem_funcs.c
@@ -0,0 +1,235 @@
+#include "mem_funcs.h"
+
+#pragma ANSI_strict off
+
+#define cps ((unsigned char*)src)
+#define cpd ((unsigned char*)dst)
+#define lps ((unsigned long*)src)
+#define lpd ((unsigned long*)dst)
+#define deref_auto_inc(p) *++(p)
+
+void __copy_longs_aligned(void* dst, const void* src, unsigned long n) {
+ unsigned long i;
+
+ i = (-(unsigned long)dst) & 3;
+
+ cps = ((unsigned char*)src) - 1;
+ cpd = ((unsigned char*)dst) - 1;
+
+ if (i) {
+ n -= i;
+
+ do
+ deref_auto_inc(cpd) = deref_auto_inc(cps);
+ while (--i);
+ }
+
+ lps = ((unsigned long*)(cps + 1)) - 1;
+ lpd = ((unsigned long*)(cpd + 1)) - 1;
+
+ i = n >> 5;
+
+ if (i)
+ do {
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ } while (--i);
+
+ i = (n & 31) >> 2;
+
+ if (i)
+ do
+ deref_auto_inc(lpd) = deref_auto_inc(lps);
+ while (--i);
+
+ cps = ((unsigned char*)(lps + 1)) - 1;
+ cpd = ((unsigned char*)(lpd + 1)) - 1;
+
+#ifdef PRIME1
+ n &= 3ULL;
+#else
+ n &= 3;
+#endif
+
+ if (n)
+ do
+ deref_auto_inc(cpd) = deref_auto_inc(cps);
+ while (--n);
+
+ return;
+}
+
+void __copy_longs_rev_aligned(void* dst, const void* src, unsigned long n) {
+ unsigned long i;
+
+ cps = ((unsigned char*)src) + n;
+ cpd = ((unsigned char*)dst) + n;
+
+ i = ((unsigned long)cpd) & 3;
+
+ if (i) {
+ n -= i;
+
+ do
+ *--cpd = *--cps;
+ while (--i);
+ }
+
+ i = n >> 5;
+
+ if (i)
+ do {
+ *--lpd = *--lps;
+ *--lpd = *--lps;
+ *--lpd = *--lps;
+ *--lpd = *--lps;
+ *--lpd = *--lps;
+ *--lpd = *--lps;
+ *--lpd = *--lps;
+ *--lpd = *--lps;
+ } while (--i);
+
+ i = (n & 31) >> 2;
+
+ if (i)
+ do
+ *--lpd = *--lps;
+ while (--i);
+
+#ifdef PRIME1
+ n &= 3ULL;
+#else
+ n &= 3;
+#endif
+
+ if (n)
+ do
+ *--cpd = *--cps;
+ while (--n);
+
+ return;
+}
+
+void __copy_longs_unaligned(void* dst, const void* src, unsigned long n) {
+ unsigned long i, v1, v2;
+ unsigned int src_offset, left_shift, right_shift;
+
+ i = (-(unsigned long)dst) & 3;
+
+ cps = ((unsigned char*)src) - 1;
+ cpd = ((unsigned char*)dst) - 1;
+
+ if (i) {
+ n -= i;
+
+ do
+ deref_auto_inc(cpd) = deref_auto_inc(cps);
+ while (--i);
+ }
+
+ src_offset = ((unsigned int)(cps + 1)) & 3;
+
+ left_shift = src_offset << 3;
+ right_shift = 32 - left_shift;
+
+ cps -= src_offset;
+
+ lps = ((unsigned long*)(cps + 1)) - 1;
+ lpd = ((unsigned long*)(cpd + 1)) - 1;
+
+ i = n >> 3;
+
+ v1 = deref_auto_inc(lps);
+
+ do {
+ v2 = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = (v1 << left_shift) | (v2 >> right_shift);
+ v1 = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = (v2 << left_shift) | (v1 >> right_shift);
+ } while (--i);
+
+ if (n & 4) {
+ v2 = deref_auto_inc(lps);
+ deref_auto_inc(lpd) = (v1 << left_shift) | (v2 >> right_shift);
+ }
+
+ cps = ((unsigned char*)(lps + 1)) - 1;
+ cpd = ((unsigned char*)(lpd + 1)) - 1;
+
+#ifdef PRIME1
+ n &= 3ULL;
+#else
+ n &= 3;
+#endif
+
+ if (n) {
+ cps -= 4 - src_offset;
+ do
+ deref_auto_inc(cpd) = deref_auto_inc(cps);
+ while (--n);
+ }
+
+ return;
+}
+
+void __copy_longs_rev_unaligned(void* dst, const void* src, unsigned long n) {
+ unsigned long i, v1, v2;
+ unsigned int src_offset, left_shift, right_shift;
+
+ cps = ((unsigned char*)src) + n;
+ cpd = ((unsigned char*)dst) + n;
+
+ i = ((unsigned long)cpd) & 3;
+
+ if (i) {
+ n -= i;
+
+ do
+ *--cpd = *--cps;
+ while (--i);
+ }
+
+ src_offset = ((unsigned int)cps) & 3;
+
+ left_shift = src_offset << 3;
+ right_shift = 32 - left_shift;
+
+ cps += 4 - src_offset;
+
+ i = n >> 3;
+
+ v1 = *--lps;
+
+ do {
+ v2 = *--lps;
+ *--lpd = (v2 << left_shift) | (v1 >> right_shift);
+ v1 = *--lps;
+ *--lpd = (v1 << left_shift) | (v2 >> right_shift);
+ } while (--i);
+
+ if (n & 4) {
+ v2 = *--lps;
+ *--lpd = (v2 << left_shift) | (v1 >> right_shift);
+ }
+
+#ifdef PRIME1
+ n &= 3ULL;
+#else
+ n &= 3;
+#endif
+
+ if (n) {
+ cps += src_offset;
+ do
+ *--cpd = *--cps;
+ while (--n);
+ }
+
+ return;
+}