primal-0.1.0.0: cbits/primal.c
#include <HsFFI.h>
#include <string.h>
HsInt primal_ptreq(HsWord8 *ptr1, HsWord8 *ptr2){
return ptr1 == ptr2;
}
HsInt8 primal_memcmp(HsWord8 *ptr1, HsInt offset1, HsWord8 *ptr2, HsInt offset2, HsInt n){
return memcmp(ptr1 + offset1, ptr2 + offset2, n);
}
void primal_memmove(HsWord8 *src, HsInt src_offset, HsWord8 *dst, HsInt dst_offset, HsInt n){
memmove(dst + dst_offset, src + src_offset, n);
}
void primal_memset8(HsWord8 *ptr, HsInt offset, HsInt n, HsWord8 x){
memset((void *)(ptr + offset), x, n);
}
void primal_memset16(HsWord16 *ptr, HsInt offset, HsInt n, HsWord16 x){
HsWord8 x8 = (HsWord8) x;
ptr+= offset;
if((HsWord8) (x >> 8) == x8){
memset((void *)ptr, x8, n * 2);
return;
}
while(n > 0){
*ptr++ = x;
n--;
}
}
void primal_memset32(HsWord32 *ptr, HsInt offset, HsInt n, HsWord32 x){
HsWord8 x8 = (HsWord8) x;
ptr+= offset;
// Use memset if it is a repeating 8bit pattern
if((HsWord16) (x >> 16) == (HsWord16) x && (HsWord8) (x >> 24) == x8){
memset((void *)ptr, x8, n * 4);
return;
}
while(n > 0){
*ptr++ = x;
n--;
}
}
void primal_memset64(HsWord64 *ptr, HsInt offset, HsInt n, HsWord64 x){
HsWord8 x8 = (HsWord8) x;
HsWord32 x32 = (HsWord32) x;
ptr+= offset;
// Use memset if it is a repeating 8bit pattern
if((HsWord32) (x >> 32) == x32 &&
(HsWord16) (x32 >> 16) == (HsWord16) x32 &&
(HsWord8) (x32 >> 24) == x8
){
memset((void *)ptr, x8, n * 8);
return;
}
// Allow gcc to vectorize with SIMD:
HsWord32 *ptr32 = (HsWord32 *)ptr;
const HsWord32 *x32p = (const HsWord32 *)(void *)&x;
while (n > 0) {
ptr32[0] = x32p[0];
ptr32[1] = x32p[1];
ptr32+= 2;
n--;
}
}