hash-wasm.h raw
1 #include <stdint.h>
2 #include <stdalign.h>
3
4 #ifndef NULL
5 #define NULL 0
6 #endif
7
8 #ifdef _MSC_VER
9 #define WASM_EXPORT
10 #define __inline__
11 #else
12 #define WASM_EXPORT __attribute__((visibility("default")))
13 #endif
14
15 #ifdef WITH_BUFFER
16
17 #define MAIN_BUFFER_SIZE 16 * 1024
18 alignas(128) uint8_t main_buffer[MAIN_BUFFER_SIZE];
19
20 WASM_EXPORT
21 uint8_t *Hash_GetBuffer() {
22 return main_buffer;
23 }
24
25 #endif
26
27 // Sometimes LLVM emits these functions during the optimization step
28 // even with -nostdlib -fno-builtin flags
29 static __inline__ void* memcpy(void* dst, const void* src, uint32_t cnt) {
30 uint8_t *destination = dst;
31 const uint8_t *source = src;
32 while (cnt) {
33 *(destination++)= *(source++);
34 --cnt;
35 }
36 return dst;
37 }
38
39 static __inline__ void* memset(void* dst, const uint8_t value, uint32_t cnt) {
40 uint8_t *p = dst;
41 while (cnt--) {
42 *p++ = value;
43 }
44 return dst;
45 }
46
47 static __inline__ void* memcpy2(void* dst, const void* src, uint32_t cnt) {
48 uint64_t *destination64 = dst;
49 const uint64_t *source64 = src;
50 while (cnt >= 8) {
51 *(destination64++)= *(source64++);
52 cnt -= 8;
53 }
54
55 uint8_t *destination = (uint8_t*)destination64;
56 const uint8_t *source = (uint8_t*)source64;
57 while (cnt) {
58 *(destination++)= *(source++);
59 --cnt;
60 }
61 return dst;
62 }
63
64 static __inline__ void memcpy16(void* dst, const void* src) {
65 uint64_t* dst64 = (uint64_t*)dst;
66 uint64_t* src64 = (uint64_t*)src;
67
68 dst64[0] = src64[0];
69 dst64[1] = src64[1];
70 }
71
72 static __inline__ void memcpy32(void* dst, const void* src) {
73 uint64_t* dst64 = (uint64_t*)dst;
74 uint64_t* src64 = (uint64_t*)src;
75
76 #pragma clang loop unroll(full)
77 for (int i = 0; i < 4; i++) {
78 dst64[i] = src64[i];
79 }
80 }
81
82 static __inline__ void memcpy64(void* dst, const void* src) {
83 uint64_t* dst64 = (uint64_t*)dst;
84 uint64_t* src64 = (uint64_t*)src;
85
86 #pragma clang loop unroll(full)
87 for (int i = 0; i < 8; i++) {
88 dst64[i] = src64[i];
89 }
90 }
91
92 static __inline__ uint64_t widen8to64(const uint8_t value) {
93 return value | (value << 8) | (value << 16) | (value << 24);
94 }
95
96 static __inline__ void memset16(void* dst, const uint8_t value) {
97 uint64_t val = widen8to64(value);
98 uint64_t* dst64 = (uint64_t*)dst;
99
100 dst64[0] = val;
101 dst64[1] = val;
102 }
103
104 static __inline__ void memset32(void* dst, const uint8_t value) {
105 uint64_t val = widen8to64(value);
106 uint64_t* dst64 = (uint64_t*)dst;
107
108 #pragma clang loop unroll(full)
109 for (int i = 0; i < 4; i++) {
110 dst64[i] = val;
111 }
112 }
113
114 static __inline__ void memset64(void* dst, const uint8_t value) {
115 uint64_t val = widen8to64(value);
116 uint64_t* dst64 = (uint64_t*)dst;
117
118 #pragma clang loop unroll(full)
119 for (int i = 0; i < 8; i++) {
120 dst64[i] = val;
121 }
122 }
123
124 static __inline__ void memset128(void* dst, const uint8_t value) {
125 uint64_t val = widen8to64(value);
126 uint64_t* dst64 = (uint64_t*)dst;
127
128 #pragma clang loop unroll(full)
129 for (int i = 0; i < 16; i++) {
130 dst64[i] = val;
131 }
132 }
133