Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: runtime/lib/simd128.cc

Issue 12303013: Simd128Float32, Simd128Mask, and Simd128Float32List additions for dart:scalarlist (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Incorporating Kasper's review Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 #include "vm/bootstrap_natives.h"
6
7 #include "vm/exceptions.h"
8 #include "vm/native_entry.h"
9 #include "vm/object.h"
10 #include "vm/symbols.h"
11
12 namespace dart {
13
14 DEFINE_NATIVE_ENTRY(Simd128Float32_fromDoubles, 5) {
15 ASSERT(AbstractTypeArguments::CheckedHandle(
16 arguments->NativeArgAt(0)).IsNull());
17 GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
18 GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(2));
19 GET_NON_NULL_NATIVE_ARGUMENT(Double, z, arguments->NativeArgAt(3));
20 GET_NON_NULL_NATIVE_ARGUMENT(Double, w, arguments->NativeArgAt(4));
21 float _x = x.value();
22 float _y = y.value();
23 float _z = z.value();
24 float _w = w.value();
25 return Simd128Float32::New(_x, _y, _z, _w);
26 }
27
28
29 DEFINE_NATIVE_ENTRY(Simd128Float32_zero, 1) {
30 ASSERT(AbstractTypeArguments::CheckedHandle(
31 arguments->NativeArgAt(0)).IsNull());
32 return Simd128Float32::New(0.0f, 0.0f, 0.0f, 0.0f);
33 }
34
35
36 DEFINE_NATIVE_ENTRY(Simd128Float32_add, 2) {
37 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
38 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, other,
39 arguments->NativeArgAt(1));
40 float _x = self.x() + other.x();
41 float _y = self.y() + other.y();
42 float _z = self.z() + other.z();
43 float _w = self.w() + other.w();
44 return Simd128Float32::New(_x, _y, _z, _w);
45 }
46
47
48 DEFINE_NATIVE_ENTRY(Simd128Float32_negate, 1) {
49 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
50 float _x = -self.x();
51 float _y = -self.y();
52 float _z = -self.z();
53 float _w = -self.w();
54 return Simd128Float32::New(_x, _y, _z, _w);
55 }
56
57
58 DEFINE_NATIVE_ENTRY(Simd128Float32_sub, 2) {
59 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
60 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, other,
61 arguments->NativeArgAt(1));
62 float _x = self.x() - other.x();
63 float _y = self.y() - other.y();
64 float _z = self.z() - other.z();
65 float _w = self.w() - other.w();
66 return Simd128Float32::New(_x, _y, _z, _w);
67 }
68
69
70 DEFINE_NATIVE_ENTRY(Simd128Float32_mul, 2) {
71 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
72 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, other,
73 arguments->NativeArgAt(1));
74 float _x = self.x() * other.x();
75 float _y = self.y() * other.y();
76 float _z = self.z() * other.z();
77 float _w = self.w() * other.w();
78 return Simd128Float32::New(_x, _y, _z, _w);
79 }
80
81
82 DEFINE_NATIVE_ENTRY(Simd128Float32_div, 2) {
83 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
84 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, other,
85 arguments->NativeArgAt(1));
86 float _x = self.x() / other.x();
87 float _y = self.y() / other.y();
88 float _z = self.z() / other.z();
89 float _w = self.w() / other.w();
90 return Simd128Float32::New(_x, _y, _z, _w);
91 }
92
93
94 DEFINE_NATIVE_ENTRY(Simd128Float32_cmplt, 2) {
95 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, a, arguments->NativeArgAt(0));
96 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, b, arguments->NativeArgAt(1));
97 uint32_t _x = a.x() < b.x() ? 0xFFFFFFFF : 0x0;
98 uint32_t _y = a.y() < b.y() ? 0xFFFFFFFF : 0x0;
99 uint32_t _z = a.z() < b.z() ? 0xFFFFFFFF : 0x0;
100 uint32_t _w = a.w() < b.w() ? 0xFFFFFFFF : 0x0;
101 return Simd128Mask::New(_x, _y, _z, _w);
102 }
103
104
105 DEFINE_NATIVE_ENTRY(Simd128Float32_cmplte, 2) {
106 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, a, arguments->NativeArgAt(0));
107 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, b, arguments->NativeArgAt(1));
108 uint32_t _x = a.x() <= b.x() ? 0xFFFFFFFF : 0x0;
109 uint32_t _y = a.y() <= b.y() ? 0xFFFFFFFF : 0x0;
110 uint32_t _z = a.z() <= b.z() ? 0xFFFFFFFF : 0x0;
111 uint32_t _w = a.w() <= b.w() ? 0xFFFFFFFF : 0x0;
112 return Simd128Mask::New(_x, _y, _z, _w);
113 }
114
115
116 DEFINE_NATIVE_ENTRY(Simd128Float32_cmpgt, 2) {
117 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, a, arguments->NativeArgAt(0));
118 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, b, arguments->NativeArgAt(1));
119 uint32_t _x = a.x() > b.x() ? 0xFFFFFFFF : 0x0;
120 uint32_t _y = a.y() > b.y() ? 0xFFFFFFFF : 0x0;
121 uint32_t _z = a.z() > b.z() ? 0xFFFFFFFF : 0x0;
122 uint32_t _w = a.w() > b.w() ? 0xFFFFFFFF : 0x0;
123 return Simd128Mask::New(_x, _y, _z, _w);
124 }
125
126
127 DEFINE_NATIVE_ENTRY(Simd128Float32_cmpgte, 2) {
128 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, a, arguments->NativeArgAt(0));
129 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, b, arguments->NativeArgAt(1));
130 uint32_t _x = a.x() >= b.x() ? 0xFFFFFFFF : 0x0;
131 uint32_t _y = a.y() >= b.y() ? 0xFFFFFFFF : 0x0;
132 uint32_t _z = a.z() >= b.z() ? 0xFFFFFFFF : 0x0;
133 uint32_t _w = a.w() >= b.w() ? 0xFFFFFFFF : 0x0;
134 return Simd128Mask::New(_x, _y, _z, _w);
135 }
136
137
138 DEFINE_NATIVE_ENTRY(Simd128Float32_cmpequal, 2) {
139 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, a, arguments->NativeArgAt(0));
140 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, b, arguments->NativeArgAt(1));
141 uint32_t _x = a.x() == b.x() ? 0xFFFFFFFF : 0x0;
142 uint32_t _y = a.y() == b.y() ? 0xFFFFFFFF : 0x0;
143 uint32_t _z = a.z() == b.z() ? 0xFFFFFFFF : 0x0;
144 uint32_t _w = a.w() == b.w() ? 0xFFFFFFFF : 0x0;
145 return Simd128Mask::New(_x, _y, _z, _w);
146 }
147
148
149 DEFINE_NATIVE_ENTRY(Simd128Float32_cmpnequal, 2) {
150 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, a, arguments->NativeArgAt(0));
151 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, b, arguments->NativeArgAt(1));
152 uint32_t _x = a.x() != b.x() ? 0xFFFFFFFF : 0x0;
153 uint32_t _y = a.y() != b.y() ? 0xFFFFFFFF : 0x0;
154 uint32_t _z = a.z() != b.z() ? 0xFFFFFFFF : 0x0;
155 uint32_t _w = a.w() != b.w() ? 0xFFFFFFFF : 0x0;
156 return Simd128Mask::New(_x, _y, _z, _w);
157 }
158
159
160 DEFINE_NATIVE_ENTRY(Simd128Float32_scale, 2) {
161 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
162 GET_NON_NULL_NATIVE_ARGUMENT(Double, scale, arguments->NativeArgAt(1));
163 float _s = static_cast<float>(scale.value());
164 float _x = self.x() * _s;
165 float _y = self.y() * _s;
166 float _z = self.z() * _s;
167 float _w = self.w() * _s;
168 return Simd128Float32::New(_x, _y, _z, _w);
169 }
170
171
172 DEFINE_NATIVE_ENTRY(Simd128Float32_abs, 1) {
173 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
174 float _x = fabsf(self.x());
175 float _y = fabsf(self.y());
176 float _z = fabsf(self.z());
177 float _w = fabsf(self.w());
178 return Simd128Float32::New(_x, _y, _z, _w);
179 }
180
181
182 DEFINE_NATIVE_ENTRY(Simd128Float32_clamp, 3) {
183 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
184 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, lo, arguments->NativeArgAt(1));
185 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, hi, arguments->NativeArgAt(2));
186 float _x = self.x() > lo.x() ? self.x() : lo.x();
187 float _y = self.y() > lo.y() ? self.y() : lo.y();
188 float _z = self.z() > lo.z() ? self.z() : lo.z();
189 float _w = self.w() > lo.w() ? self.w() : lo.w();
190 _x = _x > hi.x() ? hi.x() : _x;
191 _y = _y > hi.y() ? hi.y() : _y;
192 _z = _z > hi.z() ? hi.z() : _z;
193 _w = _w > hi.w() ? hi.w() : _w;
194 return Simd128Float32::New(_x, _y, _z, _w);
195 }
196
197
198 DEFINE_NATIVE_ENTRY(Simd128Float32_getX, 1) {
199 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
200 double value = static_cast<double>(self.x());
201 return Double::New(value);
202 }
203
204
205 DEFINE_NATIVE_ENTRY(Simd128Float32_getY, 1) {
206 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
207 double value = static_cast<double>(self.y());
208 return Double::New(value);
209 }
210
211
212 DEFINE_NATIVE_ENTRY(Simd128Float32_getZ, 1) {
213 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
214 double value = static_cast<double>(self.z());
215 return Double::New(value);
216 }
217
218
219 DEFINE_NATIVE_ENTRY(Simd128Float32_getW, 1) {
220 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
221 double value = static_cast<double>(self.w());
222 return Double::New(value);
223 }
224
225
226 DEFINE_NATIVE_ENTRY(Simd128Float32_getXXXX, 1) {
227 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
228 float value = self.x();
229 return Simd128Float32::New(value, value, value, value);
230 }
231
232
233 DEFINE_NATIVE_ENTRY(Simd128Float32_getYYYY, 1) {
234 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
235 float value = self.y();
236 return Simd128Float32::New(value, value, value, value);
237 }
238
239
240 DEFINE_NATIVE_ENTRY(Simd128Float32_getZZZZ, 1) {
241 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
242 float value = self.z();
243 return Simd128Float32::New(value, value, value, value);
244 }
245
246
247 DEFINE_NATIVE_ENTRY(Simd128Float32_getWWWW, 1) {
248 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
249 float value = self.w();
250 return Simd128Float32::New(value, value, value, value);
251 }
252
253
254 DEFINE_NATIVE_ENTRY(Simd128Float32_setX, 2) {
255 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
256 GET_NON_NULL_NATIVE_ARGUMENT(Double, x, arguments->NativeArgAt(1));
257 float _x = static_cast<float>(x.value());
258 float _y = self.y();
259 float _z = self.z();
260 float _w = self.w();
261 return Simd128Float32::New(_x, _y, _z, _w);
262 }
263
264
265 DEFINE_NATIVE_ENTRY(Simd128Float32_setY, 2) {
266 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
267 GET_NON_NULL_NATIVE_ARGUMENT(Double, y, arguments->NativeArgAt(1));
268 float _x = self.x();
269 float _y = static_cast<float>(y.value());
270 float _z = self.z();
271 float _w = self.w();
272 return Simd128Float32::New(_x, _y, _z, _w);
273 }
274
275
276 DEFINE_NATIVE_ENTRY(Simd128Float32_setZ, 2) {
277 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
278 GET_NON_NULL_NATIVE_ARGUMENT(Double, z, arguments->NativeArgAt(1));
279 float _x = self.x();
280 float _y = self.y();
281 float _z = static_cast<float>(z.value());
282 float _w = self.w();
283 return Simd128Float32::New(_x, _y, _z, _w);
284 }
285
286
287 DEFINE_NATIVE_ENTRY(Simd128Float32_setW, 2) {
288 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
289 GET_NON_NULL_NATIVE_ARGUMENT(Double, w, arguments->NativeArgAt(1));
290 float _x = self.x();
291 float _y = self.y();
292 float _z = self.z();
293 float _w = static_cast<float>(w.value());
294 return Simd128Float32::New(_x, _y, _z, _w);
295 }
296
297
298 DEFINE_NATIVE_ENTRY(Simd128Float32_min, 2) {
299 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
300 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, other,
301 arguments->NativeArgAt(1));
302 float _x = self.x() < other.x() ? self.x() : other.x();
303 float _y = self.y() < other.y() ? self.y() : other.y();
304 float _z = self.z() < other.z() ? self.z() : other.z();
305 float _w = self.w() < other.w() ? self.w() : other.w();
306 return Simd128Float32::New(_x, _y, _z, _w);
307 }
308
309
310 DEFINE_NATIVE_ENTRY(Simd128Float32_max, 2) {
311 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
312 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, other,
313 arguments->NativeArgAt(1));
314 float _x = self.x() > other.x() ? self.x() : other.x();
315 float _y = self.y() > other.y() ? self.y() : other.y();
316 float _z = self.z() > other.z() ? self.z() : other.z();
317 float _w = self.w() > other.w() ? self.w() : other.w();
318 return Simd128Float32::New(_x, _y, _z, _w);
319 }
320
321
322 DEFINE_NATIVE_ENTRY(Simd128Float32_sqrt, 1) {
323 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
324 float _x = sqrtf(self.x());
325 float _y = sqrtf(self.y());
326 float _z = sqrtf(self.z());
327 float _w = sqrtf(self.w());
328 return Simd128Float32::New(_x, _y, _z, _w);
329 }
330
331
332 DEFINE_NATIVE_ENTRY(Simd128Float32_reciprocal, 1) {
333 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
334 float _x = 1.0f / self.x();
335 float _y = 1.0f / self.y();
336 float _z = 1.0f / self.z();
337 float _w = 1.0f / self.w();
338 return Simd128Float32::New(_x, _y, _z, _w);
339 }
340
341
342 DEFINE_NATIVE_ENTRY(Simd128Float32_reciprocalSqrt, 1) {
343 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, self, arguments->NativeArgAt(0));
344 float _x = sqrtf(1.0f / self.x());
345 float _y = sqrtf(1.0f / self.y());
346 float _z = sqrtf(1.0f / self.z());
347 float _w = sqrtf(1.0f / self.w());
348 return Simd128Float32::New(_x, _y, _z, _w);
349 }
350
351
352 DEFINE_NATIVE_ENTRY(Simd128Float32_toSimd128Mask, 1) {
353 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, v, arguments->NativeArgAt(0));
354 float _fx = v.x();
355 float _fy = v.y();
356 float _fz = v.z();
357 float _fw = v.w();
358 uint32_t _x = *reinterpret_cast<uint32_t*>(&_fx);
359 uint32_t _y = *reinterpret_cast<uint32_t*>(&_fy);
360 uint32_t _z = *reinterpret_cast<uint32_t*>(&_fz);
361 uint32_t _w = *reinterpret_cast<uint32_t*>(&_fw);
362 return Simd128Mask::New(_x, _y, _z, _w);
363 }
364
365
366 DEFINE_NATIVE_ENTRY(Simd128Mask_fromInts, 5) {
367 ASSERT(AbstractTypeArguments::CheckedHandle(
368 arguments->NativeArgAt(0)).IsNull());
369 GET_NON_NULL_NATIVE_ARGUMENT(Integer, x, arguments->NativeArgAt(1));
370 GET_NON_NULL_NATIVE_ARGUMENT(Integer, y, arguments->NativeArgAt(2));
371 GET_NON_NULL_NATIVE_ARGUMENT(Integer, z, arguments->NativeArgAt(3));
372 GET_NON_NULL_NATIVE_ARGUMENT(Integer, w, arguments->NativeArgAt(4));
373 uint32_t _x = static_cast<uint32_t>(x.AsInt64Value() & 0xFFFFFFFF);
374 uint32_t _y = static_cast<uint32_t>(y.AsInt64Value() & 0xFFFFFFFF);
375 uint32_t _z = static_cast<uint32_t>(z.AsInt64Value() & 0xFFFFFFFF);
376 uint32_t _w = static_cast<uint32_t>(w.AsInt64Value() & 0xFFFFFFFF);
377 return Simd128Mask::New(_x, _y, _z, _w);
378 }
379
380
381 DEFINE_NATIVE_ENTRY(Simd128Mask_fromBools, 5) {
382 ASSERT(AbstractTypeArguments::CheckedHandle(
383 arguments->NativeArgAt(0)).IsNull());
384 GET_NON_NULL_NATIVE_ARGUMENT(Bool, x, arguments->NativeArgAt(1));
385 GET_NON_NULL_NATIVE_ARGUMENT(Bool, y, arguments->NativeArgAt(2));
386 GET_NON_NULL_NATIVE_ARGUMENT(Bool, z, arguments->NativeArgAt(3));
387 GET_NON_NULL_NATIVE_ARGUMENT(Bool, w, arguments->NativeArgAt(4));
388 uint32_t _x = x.value() ? 0xFFFFFFFF : 0x0;
389 uint32_t _y = y.value() ? 0xFFFFFFFF : 0x0;
390 uint32_t _z = z.value() ? 0xFFFFFFFF : 0x0;
391 uint32_t _w = w.value() ? 0xFFFFFFFF : 0x0;
392 return Simd128Mask::New(_x, _y, _z, _w);
393 }
394
395
396 DEFINE_NATIVE_ENTRY(Simd128Mask_or, 2) {
397 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
398 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, other, arguments->NativeArgAt(1));
399 uint32_t _x = self.x() | other.x();
400 uint32_t _y = self.y() | other.y();
401 uint32_t _z = self.z() | other.z();
402 uint32_t _w = self.w() | other.w();
403 return Simd128Mask::New(_x, _y, _z, _w);
404 }
405
406
407 DEFINE_NATIVE_ENTRY(Simd128Mask_and, 2) {
408 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
409 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, other, arguments->NativeArgAt(1));
410 uint32_t _x = self.x() & other.x();
411 uint32_t _y = self.y() & other.y();
412 uint32_t _z = self.z() & other.z();
413 uint32_t _w = self.w() & other.w();
414 return Simd128Mask::New(_x, _y, _z, _w);
415 }
416
417
418 DEFINE_NATIVE_ENTRY(Simd128Mask_xor, 2) {
419 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
420 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, other, arguments->NativeArgAt(1));
421 uint32_t _x = self.x() ^ other.x();
422 uint32_t _y = self.y() ^ other.y();
423 uint32_t _z = self.z() ^ other.z();
424 uint32_t _w = self.w() ^ other.w();
425 return Simd128Mask::New(_x, _y, _z, _w);
426 }
427
428
429 DEFINE_NATIVE_ENTRY(Simd128Mask_getX, 1) {
430 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
431 uint32_t value = self.x();
432 return Integer::New(value);
433 }
434
435
436 DEFINE_NATIVE_ENTRY(Simd128Mask_getY, 1) {
437 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
438 uint32_t value = self.y();
439 return Integer::New(value);
440 }
441
442
443 DEFINE_NATIVE_ENTRY(Simd128Mask_getZ, 1) {
444 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
445 uint32_t value = self.z();
446 return Integer::New(value);
447 }
448
449
450 DEFINE_NATIVE_ENTRY(Simd128Mask_getW, 1) {
451 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
452 uint32_t value = self.w();
453 return Integer::New(value);
454 }
455
456
457 DEFINE_NATIVE_ENTRY(Simd128Mask_setX, 2) {
458 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
459 GET_NON_NULL_NATIVE_ARGUMENT(Integer, x, arguments->NativeArgAt(1));
460 uint32_t _x = static_cast<uint32_t>(x.AsInt64Value() & 0xFFFFFFFF);
461 uint32_t _y = self.y();
462 uint32_t _z = self.z();
463 uint32_t _w = self.w();
464 return Simd128Mask::New(_x, _y, _z, _w);
465 }
466
467
468 DEFINE_NATIVE_ENTRY(Simd128Mask_setY, 2) {
469 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
470 GET_NON_NULL_NATIVE_ARGUMENT(Integer, y, arguments->NativeArgAt(1));
471 uint32_t _x = self.x();
472 uint32_t _y = static_cast<uint32_t>(y.AsInt64Value() & 0xFFFFFFFF);
473 uint32_t _z = self.z();
474 uint32_t _w = self.w();
475 return Simd128Mask::New(_x, _y, _z, _w);
476 }
477
478
479 DEFINE_NATIVE_ENTRY(Simd128Mask_setZ, 2) {
480 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
481 GET_NON_NULL_NATIVE_ARGUMENT(Integer, z, arguments->NativeArgAt(1));
482 uint32_t _x = self.x();
483 uint32_t _y = self.y();
484 uint32_t _z = static_cast<uint32_t>(z.AsInt64Value() & 0xFFFFFFFF);
485 uint32_t _w = self.w();
486 return Simd128Mask::New(_x, _y, _z, _w);
487 }
488
489
490 DEFINE_NATIVE_ENTRY(Simd128Mask_setW, 2) {
491 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
492 GET_NON_NULL_NATIVE_ARGUMENT(Integer, w, arguments->NativeArgAt(1));
493 uint32_t _x = self.x();
494 uint32_t _y = self.y();
495 uint32_t _z = self.z();
496 uint32_t _w = static_cast<uint32_t>(w.AsInt64Value() & 0xFFFFFFFF);
497 return Simd128Mask::New(_x, _y, _z, _w);
498 }
499
500
501 DEFINE_NATIVE_ENTRY(Simd128Mask_getFlagX, 1) {
502 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
503 uint32_t value = self.x();
504 return value != 0 ? Bool::True().raw() : Bool::False().raw();
505 }
506
507
508 DEFINE_NATIVE_ENTRY(Simd128Mask_getFlagY, 1) {
509 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
510 uint32_t value = self.y();
511 return value != 0 ? Bool::True().raw() : Bool::False().raw();
512 }
513
514
515 DEFINE_NATIVE_ENTRY(Simd128Mask_getFlagZ, 1) {
516 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
517 uint32_t value = self.z();
518 return value != 0 ? Bool::True().raw() : Bool::False().raw();
519 }
520
521
522 DEFINE_NATIVE_ENTRY(Simd128Mask_getFlagW, 1) {
523 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
524 uint32_t value = self.w();
525 return value != 0 ? Bool::True().raw() : Bool::False().raw();
526 }
527
528
529 DEFINE_NATIVE_ENTRY(Simd128Mask_setFlagX, 2) {
530 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
531 GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagX, arguments->NativeArgAt(1));
532 uint32_t _x = self.x();
533 uint32_t _y = self.y();
534 uint32_t _z = self.z();
535 uint32_t _w = self.w();
536 _x = flagX.raw() == Bool::True().raw() ? 0xFFFFFFFF : 0x0;
537 return Simd128Mask::New(_x, _y, _z, _w);
538 }
539
540
541 DEFINE_NATIVE_ENTRY(Simd128Mask_setFlagY, 2) {
542 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
543 GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagY, arguments->NativeArgAt(1));
544 uint32_t _x = self.x();
545 uint32_t _y = self.y();
546 uint32_t _z = self.z();
547 uint32_t _w = self.w();
548 _y = flagY.raw() == Bool::True().raw() ? 0xFFFFFFFF : 0x0;
549 return Simd128Mask::New(_x, _y, _z, _w);
550 }
551
552
553 DEFINE_NATIVE_ENTRY(Simd128Mask_setFlagZ, 2) {
554 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
555 GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagZ, arguments->NativeArgAt(1));
556 uint32_t _x = self.x();
557 uint32_t _y = self.y();
558 uint32_t _z = self.z();
559 uint32_t _w = self.w();
560 _z = flagZ.raw() == Bool::True().raw() ? 0xFFFFFFFF : 0x0;
561 return Simd128Mask::New(_x, _y, _z, _w);
562 }
563
564
565 DEFINE_NATIVE_ENTRY(Simd128Mask_setFlagW, 2) {
566 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
567 GET_NON_NULL_NATIVE_ARGUMENT(Bool, flagW, arguments->NativeArgAt(1));
568 uint32_t _x = self.x();
569 uint32_t _y = self.y();
570 uint32_t _z = self.z();
571 uint32_t _w = self.w();
572 _w = flagW.raw() == Bool::True().raw() ? 0xFFFFFFFF : 0x0;
573 return Simd128Mask::New(_x, _y, _z, _w);
574 }
575
576
577 DEFINE_NATIVE_ENTRY(Simd128Mask_select, 3) {
578 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, self, arguments->NativeArgAt(0));
579 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, tv, arguments->NativeArgAt(1));
580 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Float32, fv, arguments->NativeArgAt(2));
581 uint32_t _maskX = self.x();
582 uint32_t _maskY = self.y();
583 uint32_t _maskZ = self.z();
584 uint32_t _maskW = self.w();
585 // Extract floats and interpret them as masks.
586 float _tx = tv.x();
587 float _ty = tv.y();
588 float _tz = tv.z();
589 float _tw = tv.w();
590 float _fx = fv.x();
591 float _fy = fv.y();
592 float _fz = fv.z();
593 float _fw = fv.w();
594 uint32_t _tvx = *reinterpret_cast<uint32_t*>(&_tx);
595 uint32_t _tvy = *reinterpret_cast<uint32_t*>(&_ty);
596 uint32_t _tvz = *reinterpret_cast<uint32_t*>(&_tz);
597 uint32_t _tvw = *reinterpret_cast<uint32_t*>(&_tw);
598 uint32_t _fvx = *reinterpret_cast<uint32_t*>(&_fx);
599 uint32_t _fvy = *reinterpret_cast<uint32_t*>(&_fy);
600 uint32_t _fvz = *reinterpret_cast<uint32_t*>(&_fz);
601 uint32_t _fvw = *reinterpret_cast<uint32_t*>(&_fw);
602 // Perform select.
603 uint32_t _tempX = (_maskX & _tvx) | (~_maskX & _fvx);
604 uint32_t _tempY = (_maskY & _tvy) | (~_maskY & _fvy);
605 uint32_t _tempZ = (_maskZ & _tvz) | (~_maskZ & _fvz);
606 uint32_t _tempW = (_maskW & _tvw) | (~_maskW & _fvw);
607 // Interpret the result as floats.
608 float _x = *reinterpret_cast<float*>(&_tempX);
609 float _y = *reinterpret_cast<float*>(&_tempY);
610 float _z = *reinterpret_cast<float*>(&_tempZ);
611 float _w = *reinterpret_cast<float*>(&_tempW);
612 return Simd128Float32::New(_x, _y, _z, _w);
613 }
614
615
616 DEFINE_NATIVE_ENTRY(Simd128Mask_toSimd128Float32, 1) {
617 GET_NON_NULL_NATIVE_ARGUMENT(Simd128Mask, v, arguments->NativeArgAt(0));
618 uint32_t _ix = v.x();
619 uint32_t _iy = v.y();
620 uint32_t _iz = v.z();
621 uint32_t _iw = v.w();
622 float _x = *reinterpret_cast<float*>(&_ix);
623 float _y = *reinterpret_cast<float*>(&_iy);
624 float _z = *reinterpret_cast<float*>(&_iz);
625 float _w = *reinterpret_cast<float*>(&_iw);
626 return Simd128Float32::New(_x, _y, _z, _w);
627 }
628
629
630 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698