1 #include <string.h>
2 #include "primitive-memops.h"
3
hsprimitive_memcpy(void * dst,ptrdiff_t doff,void * src,ptrdiff_t soff,size_t len)4 void hsprimitive_memcpy( void *dst, ptrdiff_t doff, void *src, ptrdiff_t soff, size_t len )
5 {
6 memcpy( (char *)dst + doff, (char *)src + soff, len );
7 }
8
hsprimitive_memmove(void * dst,ptrdiff_t doff,void * src,ptrdiff_t soff,size_t len)9 void hsprimitive_memmove( void *dst, ptrdiff_t doff, void *src, ptrdiff_t soff, size_t len )
10 {
11 memmove( (char *)dst + doff, (char *)src + soff, len );
12 }
13
14 #define MEMSET(TYPE, ATYPE) \
15 void hsprimitive_memset_ ## TYPE (Hs ## TYPE *p, ptrdiff_t off, size_t n, ATYPE x) \
16 { \
17 p += off; \
18 if (x == 0) \
19 memset(p, 0, n * sizeof(Hs ## TYPE)); \
20 else if (sizeof(Hs ## TYPE) == sizeof(int)*2) { \
21 int *q = (int *)p; \
22 const int *r = (const int *)(void *)&x; \
23 while (n>0) { \
24 q[0] = r[0]; \
25 q[1] = r[1]; \
26 q += 2; \
27 --n; \
28 } \
29 } \
30 else { \
31 while (n>0) { \
32 *p++ = x; \
33 --n; \
34 } \
35 } \
36 }
37
hsprimitive_memcmp(HsWord8 * s1,HsWord8 * s2,size_t n)38 int hsprimitive_memcmp( HsWord8 *s1, HsWord8 *s2, size_t n )
39 {
40 return memcmp( s1, s2, n );
41 }
42
hsprimitive_memset_Word8(HsWord8 * p,ptrdiff_t off,size_t n,HsWord x)43 void hsprimitive_memset_Word8 (HsWord8 *p, ptrdiff_t off, size_t n, HsWord x)
44 {
45 memset( (char *)(p+off), x, n );
46 }
47
48 /* MEMSET(HsWord8, HsWord) */
49 MEMSET(Word16, HsWord)
50 MEMSET(Word32, HsWord)
51 MEMSET(Word64, HsWord64)
52 MEMSET(Word, HsWord)
53 MEMSET(Ptr, HsPtr)
54 MEMSET(Float, HsFloat)
55 MEMSET(Double, HsDouble)
56 MEMSET(Char, HsChar)
57