util.c (1637B)
1 /* See LICENSE for license details. */ 2 #include <stdarg.h> 3 #include <stdio.h> 4 #include <stdlib.h> 5 6 static void __attribute__((noreturn)) 7 die(char *fmt, ...) 8 { 9 va_list ap; 10 11 va_start(ap, fmt); 12 vfprintf(stderr, fmt, ap); 13 va_end(ap); 14 15 exit(1); 16 } 17 18 static void * 19 mem_clear(u8 *p, u8 c, size len) 20 { 21 while (len) p[--len] = c; 22 return p; 23 } 24 25 static void 26 mem_move(char *src, char *dest, size n) 27 { 28 if (dest < src) while (n) { *dest++ = *src++; n--; } 29 else while (n) { n--; dest[n] = src[n]; } 30 } 31 32 #define alloc(a, t, n) (t *)alloc_(a, sizeof(t), _Alignof(t), n) 33 static void * 34 alloc_(Arena *a, size len, size align, size count) 35 { 36 size padding = -(uintptr_t)a->beg & (align - 1); 37 size available = a->end - a->beg - padding; 38 if (available < 0 || count > available / len) { 39 ASSERT(0); 40 die("arena OOM\n"); 41 } 42 void *p = a->beg + padding; 43 a->beg += padding + count * len; 44 /* TODO: Performance? */ 45 return mem_clear(p, 0, count * len); 46 } 47 48 static s8 49 s8alloc(Arena *a, size len) 50 { 51 return (s8){ .data = alloc(a, u8, len), .len = len }; 52 } 53 54 static b32 55 uv4_equal(uv4 a, uv4 b) 56 { 57 return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w; 58 } 59 60 static u32 61 round_down_power_of_2(u32 a) 62 { 63 u32 result = 0x80000000UL >> _lzcnt_u32(a); 64 return result; 65 } 66 67 static void 68 fill_hadamard(i32 *m, u32 dim) 69 { 70 ASSERT(dim && ISPOWEROF2(dim)); 71 72 #define IND(i, j) ((i) * dim + (j)) 73 m[0] = 1; 74 for (u32 k = 1; k < dim; k *= 2) { 75 for (u32 i = 0; i < k; i++) { 76 for (u32 j = 0; j < k; j++) { 77 i32 val = m[IND(i, j)]; 78 m[IND(i + k, j)] = val; 79 m[IND(i, j + k)] = val; 80 m[IND(i + k, j + k)] = -val; 81 } 82 } 83 } 84 #undef IND 85 }