| 1 |
private import ldc.intrinsics; |
|---|
| 2 |
|
|---|
| 3 |
extern(C): |
|---|
| 4 |
|
|---|
| 5 |
int memcmp(void*,void*,size_t); |
|---|
| 6 |
size_t strlen(char*); |
|---|
| 7 |
|
|---|
| 8 |
version(LLVM64) |
|---|
| 9 |
alias llvm_memcpy_i64 llvm_memcpy; |
|---|
| 10 |
else |
|---|
| 11 |
alias llvm_memcpy_i32 llvm_memcpy; |
|---|
| 12 |
|
|---|
| 13 |
// per-element array init routines |
|---|
| 14 |
|
|---|
| 15 |
void _d_array_init_i16(ushort* a, size_t n, ushort v) |
|---|
| 16 |
{ |
|---|
| 17 |
auto p = a; |
|---|
| 18 |
auto end = a+n; |
|---|
| 19 |
while (p !is end) |
|---|
| 20 |
*p++ = v; |
|---|
| 21 |
} |
|---|
| 22 |
|
|---|
| 23 |
void _d_array_init_i32(uint* a, size_t n, uint v) |
|---|
| 24 |
{ |
|---|
| 25 |
auto p = a; |
|---|
| 26 |
auto end = a+n; |
|---|
| 27 |
while (p !is end) |
|---|
| 28 |
*p++ = v; |
|---|
| 29 |
} |
|---|
| 30 |
|
|---|
| 31 |
void _d_array_init_i64(ulong* a, size_t n, ulong v) |
|---|
| 32 |
{ |
|---|
| 33 |
auto p = a; |
|---|
| 34 |
auto end = a+n; |
|---|
| 35 |
while (p !is end) |
|---|
| 36 |
*p++ = v; |
|---|
| 37 |
} |
|---|
| 38 |
|
|---|
| 39 |
void _d_array_init_float(float* a, size_t n, float v) |
|---|
| 40 |
{ |
|---|
| 41 |
auto p = a; |
|---|
| 42 |
auto end = a+n; |
|---|
| 43 |
while (p !is end) |
|---|
| 44 |
*p++ = v; |
|---|
| 45 |
} |
|---|
| 46 |
|
|---|
| 47 |
void _d_array_init_double(double* a, size_t n, double v) |
|---|
| 48 |
{ |
|---|
| 49 |
auto p = a; |
|---|
| 50 |
auto end = a+n; |
|---|
| 51 |
while (p !is end) |
|---|
| 52 |
*p++ = v; |
|---|
| 53 |
} |
|---|
| 54 |
|
|---|
| 55 |
void _d_array_init_real(real* a, size_t n, real v) |
|---|
| 56 |
{ |
|---|
| 57 |
auto p = a; |
|---|
| 58 |
auto end = a+n; |
|---|
| 59 |
while (p !is end) |
|---|
| 60 |
*p++ = v; |
|---|
| 61 |
} |
|---|
| 62 |
|
|---|
| 63 |
void _d_array_init_cfloat(cfloat* a, size_t n, cfloat v) |
|---|
| 64 |
{ |
|---|
| 65 |
auto p = a; |
|---|
| 66 |
auto end = a+n; |
|---|
| 67 |
while (p !is end) |
|---|
| 68 |
*p++ = v; |
|---|
| 69 |
} |
|---|
| 70 |
|
|---|
| 71 |
void _d_array_init_cdouble(cdouble* a, size_t n, cdouble v) |
|---|
| 72 |
{ |
|---|
| 73 |
auto p = a; |
|---|
| 74 |
auto end = a+n; |
|---|
| 75 |
while (p !is end) |
|---|
| 76 |
*p++ = v; |
|---|
| 77 |
} |
|---|
| 78 |
|
|---|
| 79 |
void _d_array_init_creal(creal* a, size_t n, creal v) |
|---|
| 80 |
{ |
|---|
| 81 |
auto p = a; |
|---|
| 82 |
auto end = a+n; |
|---|
| 83 |
while (p !is end) |
|---|
| 84 |
*p++ = v; |
|---|
| 85 |
} |
|---|
| 86 |
|
|---|
| 87 |
void _d_array_init_pointer(void** a, size_t n, void* v) |
|---|
| 88 |
{ |
|---|
| 89 |
auto p = a; |
|---|
| 90 |
auto end = a+n; |
|---|
| 91 |
while (p !is end) |
|---|
| 92 |
*p++ = v; |
|---|
| 93 |
} |
|---|
| 94 |
|
|---|
| 95 |
void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) |
|---|
| 96 |
{ |
|---|
| 97 |
auto p = a; |
|---|
| 98 |
auto end = a + na*nv; |
|---|
| 99 |
while (p !is end) { |
|---|
| 100 |
llvm_memcpy(p,v,nv,0); |
|---|
| 101 |
p += nv; |
|---|
| 102 |
} |
|---|
| 103 |
} |
|---|
| 104 |
|
|---|
| 105 |
/* |
|---|
| 106 |
void _d_array_init(TypeInfo ti, void* a) |
|---|
| 107 |
{ |
|---|
| 108 |
auto initializer = ti.next.init(); |
|---|
| 109 |
auto isize = initializer.length; |
|---|
| 110 |
auto q = initializer.ptr; |
|---|
| 111 |
|
|---|
| 112 |
if (isize == 1) |
|---|
| 113 |
memset(p, *cast(ubyte*)q, size); |
|---|
| 114 |
else if (isize == int.sizeof) |
|---|
| 115 |
{ |
|---|
| 116 |
int init = *cast(int*)q; |
|---|
| 117 |
size /= int.sizeof; |
|---|
| 118 |
for (size_t u = 0; u < size; u++) |
|---|
| 119 |
{ |
|---|
| 120 |
(cast(int*)p)[u] = init; |
|---|
| 121 |
} |
|---|
| 122 |
} |
|---|
| 123 |
else |
|---|
| 124 |
{ |
|---|
| 125 |
for (size_t u = 0; u < size; u += isize) |
|---|
| 126 |
{ |
|---|
| 127 |
memcpy(p + u, q, isize); |
|---|
| 128 |
} |
|---|
| 129 |
} |
|---|
| 130 |
}*/ |
|---|
| 131 |
|
|---|
| 132 |
// for array cast |
|---|
| 133 |
size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) |
|---|
| 134 |
{ |
|---|
| 135 |
if (newelemsz == 1) { |
|---|
| 136 |
return len*elemsz; |
|---|
| 137 |
} |
|---|
| 138 |
else if ((len*elemsz) % newelemsz) { |
|---|
| 139 |
throw new Exception("Bad array cast"); |
|---|
| 140 |
} |
|---|
| 141 |
return (len*elemsz)/newelemsz; |
|---|
| 142 |
} |
|---|
| 143 |
|
|---|
| 144 |
// slice copy when assertions are enabled |
|---|
| 145 |
void _d_array_slice_copy(void* dst, size_t dstlen, void* src, size_t srclen) |
|---|
| 146 |
{ |
|---|
| 147 |
if (dstlen != srclen) |
|---|
| 148 |
throw new Exception("lengths don't match for array copy"); |
|---|
| 149 |
else if (dst+dstlen <= src || src+srclen <= dst) |
|---|
| 150 |
llvm_memcpy(dst, src, dstlen, 0); |
|---|
| 151 |
else |
|---|
| 152 |
throw new Exception("overlapping array copy"); |
|---|
| 153 |
} |
|---|