Wiki Roadmap Timeline Tickets New Ticket Source Search Help / Guide About Trac Login

root/runtime/internal/arrayInit.d

Revision 1480:b3ba2c6ff038, 2.9 kB (checked in by Frits van Bommel <fvbommel wxs.nl>, 3 years ago)

Use llvm.memset instead of _d_array_init_i1 and _d_array_init_i8.
This exposes what's happening to LLVM, and memset is probably faster than the
runtime functions we were using anyway.

Line 
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 }
Note: See TracBrowser for help on using the browser.
Copyright © 2008, LDC Development Team.