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