Mercurial > projects > ldc
comparison druntime/src/compiler/ldc/arrayInit.d @ 759:d3eb054172f9
Added copy of druntime from DMD 2.020 modified for LDC.
author | Tomas Lindquist Olsen <tomas.l.olsen@gmail.com> |
---|---|
date | Tue, 11 Nov 2008 01:52:37 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
758:f04dde6e882c | 759:d3eb054172f9 |
---|---|
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_i1(bool* a, size_t n, bool 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_i8(ubyte* a, size_t n, ubyte 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_i16(ushort* a, size_t n, ushort 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_i32(uint* a, size_t n, uint 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_i64(ulong* a, size_t n, ulong 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_float(float* a, size_t n, float 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_double(double* a, size_t n, double 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_real(real* a, size_t n, real 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_cfloat(cfloat* a, size_t n, cfloat 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_cdouble(cdouble* a, size_t n, cdouble 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_creal(creal* a, size_t n, creal v) | |
96 { | |
97 auto p = a; | |
98 auto end = a+n; | |
99 while (p !is end) | |
100 *p++ = v; | |
101 } | |
102 | |
103 void _d_array_init_pointer(void** a, size_t n, void* v) | |
104 { | |
105 auto p = a; | |
106 auto end = a+n; | |
107 while (p !is end) | |
108 *p++ = v; | |
109 } | |
110 | |
111 void _d_array_init_mem(void* a, size_t na, void* v, size_t nv) | |
112 { | |
113 auto p = a; | |
114 auto end = a + na*nv; | |
115 while (p !is end) { | |
116 llvm_memcpy(p,v,nv,0); | |
117 p += nv; | |
118 } | |
119 } | |
120 | |
121 /* | |
122 void _d_array_init(TypeInfo ti, void* a) | |
123 { | |
124 auto initializer = ti.next.init(); | |
125 auto isize = initializer.length; | |
126 auto q = initializer.ptr; | |
127 | |
128 if (isize == 1) | |
129 memset(p, *cast(ubyte*)q, size); | |
130 else if (isize == int.sizeof) | |
131 { | |
132 int init = *cast(int*)q; | |
133 size /= int.sizeof; | |
134 for (size_t u = 0; u < size; u++) | |
135 { | |
136 (cast(int*)p)[u] = init; | |
137 } | |
138 } | |
139 else | |
140 { | |
141 for (size_t u = 0; u < size; u += isize) | |
142 { | |
143 memcpy(p + u, q, isize); | |
144 } | |
145 } | |
146 }*/ | |
147 | |
148 // for array cast | |
149 size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) | |
150 { | |
151 if (newelemsz == 1) { | |
152 return len*elemsz; | |
153 } | |
154 else if ((len*elemsz) % newelemsz) { | |
155 throw new Exception("Bad array cast"); | |
156 } | |
157 return (len*elemsz)/newelemsz; | |
158 } |