Mercurial > projects > ldc
comparison tango/lib/compiler/llvmdc/arrays.d @ 132:1700239cab2e trunk
[svn r136] MAJOR UNSTABLE UPDATE!!!
Initial commit after moving to Tango instead of Phobos.
Lots of bugfixes...
This build is not suitable for most things.
author | lindquist |
---|---|
date | Fri, 11 Jan 2008 17:57:40 +0100 |
parents | |
children | 895e1b50cf2a |
comparison
equal
deleted
inserted
replaced
131:5825d48b27d1 | 132:1700239cab2e |
---|---|
1 private import llvm.intrinsic; | |
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_pointer(void** a, size_t n, void* 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_mem(void* a, size_t na, void* v, size_t nv) | |
80 { | |
81 auto p = a; | |
82 auto end = a + na*nv; | |
83 while (p !is end) { | |
84 llvm_memcpy(p,v,nv,0); | |
85 p += nv; | |
86 } | |
87 } | |
88 | |
89 // for array cast | |
90 size_t _d_array_cast_len(size_t len, size_t elemsz, size_t newelemsz) | |
91 { | |
92 if (newelemsz == 1) { | |
93 return len*elemsz; | |
94 } | |
95 else if (len % newelemsz) { | |
96 throw new Exception("Bad array cast"); | |
97 } | |
98 return (len*elemsz)/newelemsz; | |
99 } | |
100 | |
101 // creating args for main | |
102 void _d_main_args(uint n, char** args, ref char[][] res) | |
103 { | |
104 assert(res.length == n); | |
105 foreach(i,v; args[0..n]) | |
106 { | |
107 res[i] = v[0 .. strlen(v)]; | |
108 } | |
109 } |