| // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| // VMOptions=--max_deoptimization_counter_threshold=1000 --optimization-counter-threshold=10 --no-background-compilation |
| |
| // @dart = 2.9 |
| |
| // Library tag to be able to run in html test framework. |
| library int32x4_list_test; |
| |
| import 'dart:typed_data'; |
| import 'package:expect/expect.dart'; |
| |
| testLoadStore(array) { |
| Expect.equals(8, array.length); |
| Expect.isTrue(array is List<Int32x4>); |
| array[0] = new Int32x4(1, 2, 3, 4); |
| Expect.equals(1, array[0].x); |
| Expect.equals(2, array[0].y); |
| Expect.equals(3, array[0].z); |
| Expect.equals(4, array[0].w); |
| array[1] = array[0]; |
| array[0] = array[0].withX(9); |
| Expect.equals(9, array[0].x); |
| Expect.equals(2, array[0].y); |
| Expect.equals(3, array[0].z); |
| Expect.equals(4, array[0].w); |
| Expect.equals(1, array[1].x); |
| Expect.equals(2, array[1].y); |
| Expect.equals(3, array[1].z); |
| Expect.equals(4, array[1].w); |
| } |
| |
| testLoadStoreDeopt(array, index, value) { |
| array[index] = value; |
| Expect.equals(value.x, array[index].x); |
| Expect.equals(value.y, array[index].y); |
| Expect.equals(value.z, array[index].z); |
| Expect.equals(value.w, array[index].w); |
| } |
| |
| testLoadStoreDeoptDriver() { |
| Int32x4List list = new Int32x4List(4); |
| Int32x4 value = new Int32x4(1, 2, 3, 4); |
| for (int i = 0; i < 20; i++) { |
| testLoadStoreDeopt(list, 0, value); |
| } |
| try { |
| // Invalid index. |
| testLoadStoreDeopt(list, 5, value); |
| } catch (_) {} |
| for (int i = 0; i < 20; i++) { |
| testLoadStoreDeopt(list, 0, value); |
| } |
| try { |
| // null list. |
| testLoadStoreDeopt(null, 0, value); |
| } catch (_) {} |
| for (int i = 0; i < 20; i++) { |
| testLoadStoreDeopt(list, 0, value); |
| } |
| try { |
| // null value. |
| testLoadStoreDeopt(list, 0, null); |
| } catch (_) {} |
| for (int i = 0; i < 20; i++) { |
| testLoadStoreDeopt(list, 0, value); |
| } |
| try { |
| // non-smi index. |
| testLoadStoreDeopt(list, 3.14159, value); |
| } catch (_) {} |
| for (int i = 0; i < 20; i++) { |
| testLoadStoreDeopt(list, 0, value); |
| } |
| try { |
| // non-Int32x4 value. |
| testLoadStoreDeopt(list, 0, 4.toDouble()); |
| } catch (_) {} |
| for (int i = 0; i < 20; i++) { |
| testLoadStoreDeopt(list, 0, value); |
| } |
| try { |
| // non-Int32x4List list. |
| testLoadStoreDeopt([new Int32x4(2, 3, 4, 5)], 0, value); |
| } catch (_) {} |
| for (int i = 0; i < 20; i++) { |
| testLoadStoreDeopt(list, 0, value); |
| } |
| } |
| |
| testListZero() { |
| Int32x4List list = new Int32x4List(1); |
| Expect.equals(0, list[0].x); |
| Expect.equals(0, list[0].y); |
| Expect.equals(0, list[0].z); |
| Expect.equals(0, list[0].w); |
| } |
| |
| testView(array) { |
| Expect.equals(8, array.length); |
| Expect.isTrue(array is List<Int32x4>); |
| Expect.equals(0, array[0].x); |
| Expect.equals(1, array[0].y); |
| Expect.equals(2, array[0].z); |
| Expect.equals(3, array[0].w); |
| Expect.equals(4, array[1].x); |
| Expect.equals(5, array[1].y); |
| Expect.equals(6, array[1].z); |
| Expect.equals(7, array[1].w); |
| } |
| |
| testSublist(array) { |
| Expect.equals(8, array.length); |
| Expect.isTrue(array is Int32x4List); |
| var a = array.sublist(0, 1); |
| Expect.equals(1, a.length); |
| Expect.equals(0, a[0].x); |
| Expect.equals(1, a[0].y); |
| Expect.equals(2, a[0].z); |
| Expect.equals(3, a[0].w); |
| a = array.sublist(1, 2); |
| Expect.equals(4, a[0].x); |
| Expect.equals(5, a[0].y); |
| Expect.equals(6, a[0].z); |
| Expect.equals(7, a[0].w); |
| a = array.sublist(0); |
| Expect.equals(a.length, array.length); |
| for (int i = 0; i < array.length; i++) { |
| Expect.equals(array[i].x, a[i].x); |
| Expect.equals(array[i].y, a[i].y); |
| Expect.equals(array[i].z, a[i].z); |
| Expect.equals(array[i].w, a[i].w); |
| } |
| } |
| |
| void testSpecialValues(array) { |
| var tests = [ |
| [0x8901234567890, 0x34567890], |
| [0x89012A4567890, -1537836912], |
| [0x80000000, -2147483648], |
| [-0x80000000, -2147483648], |
| [0x7fffffff, 2147483647], |
| [-0x7fffffff, -2147483647], |
| ]; |
| var int32x4; |
| |
| for (var test in tests) { |
| var input = test[0]; |
| var expected = test[1]; |
| |
| int32x4 = new Int32x4(input, 2, 3, 4); |
| array[0] = int32x4; |
| int32x4 = array[0]; |
| Expect.equals(expected, int32x4.x); |
| Expect.equals(2, int32x4.y); |
| Expect.equals(3, int32x4.z); |
| Expect.equals(4, int32x4.w); |
| |
| int32x4 = new Int32x4(1, input, 3, 4); |
| array[0] = int32x4; |
| int32x4 = array[0]; |
| Expect.equals(1, int32x4.x); |
| Expect.equals(expected, int32x4.y); |
| Expect.equals(3, int32x4.z); |
| Expect.equals(4, int32x4.w); |
| |
| int32x4 = new Int32x4(1, 2, input, 4); |
| array[0] = int32x4; |
| int32x4 = array[0]; |
| Expect.equals(1, int32x4.x); |
| Expect.equals(2, int32x4.y); |
| Expect.equals(expected, int32x4.z); |
| Expect.equals(4, int32x4.w); |
| |
| int32x4 = new Int32x4(1, 2, 3, input); |
| array[0] = int32x4; |
| int32x4 = array[0]; |
| Expect.equals(1, int32x4.x); |
| Expect.equals(2, int32x4.y); |
| Expect.equals(3, int32x4.z); |
| Expect.equals(expected, int32x4.w); |
| } |
| } |
| |
| main() { |
| var list; |
| |
| list = new Int32x4List(8); |
| for (int i = 0; i < 20; i++) { |
| testLoadStore(list); |
| } |
| for (int i = 0; i < 20; i++) { |
| testSpecialValues(list); |
| } |
| |
| Uint32List uint32List = new Uint32List(32); |
| for (int i = 0; i < uint32List.length; i++) { |
| uint32List[i] = i; |
| } |
| list = new Int32x4List.view(uint32List.buffer); |
| for (int i = 0; i < 20; i++) { |
| testView(list); |
| } |
| for (int i = 0; i < 20; i++) { |
| testSublist(list); |
| } |
| for (int i = 0; i < 20; i++) { |
| testLoadStore(list); |
| } |
| for (int i = 0; i < 20; i++) { |
| testListZero(); |
| } |
| for (int i = 0; i < 20; i++) { |
| testSpecialValues(list); |
| } |
| testLoadStoreDeoptDriver(); |
| } |