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