mirror of https://github.com/PrimeDecomp/prime.git
224 lines
4.1 KiB
C
224 lines
4.1 KiB
C
|
#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;
|
||
|
|
||
|
// TODO longlong required to match?
|
||
|
n &= 3ULL;
|
||
|
|
||
|
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);
|
||
|
|
||
|
// TODO longlong required to match?
|
||
|
n &= 3ULL;
|
||
|
|
||
|
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;
|
||
|
|
||
|
// TODO longlong required to match?
|
||
|
n &= 3ULL;
|
||
|
|
||
|
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);
|
||
|
}
|
||
|
|
||
|
// TODO longlong required to match?
|
||
|
n &= 3ULL;
|
||
|
|
||
|
if (n) {
|
||
|
cps += src_offset;
|
||
|
do
|
||
|
*--cpd = *--cps;
|
||
|
while (--n);
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|