| // 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 float32x4_unbox_regress_test; |
| |
| import 'dart:typed_data'; |
| import 'package:expect/expect.dart'; |
| |
| testListStore(array, index, value) { |
| array[index] = value; |
| } |
| |
| void testListStoreDeopt() { |
| var list; |
| var value = new Float32x4(1.0, 2.0, 3.0, 4.0); |
| var smi = 12; |
| list = new Float32x4List(8); |
| for (int i = 0; i < 20; i++) { |
| testListStore(list, 0, value); |
| } |
| |
| try { |
| // Without a proper check for SMI in the Float32x4 unbox instruction |
| // this might trigger a crash. |
| testListStore(list, 0, smi); |
| } catch (_) {} |
| } |
| |
| testAdd(a, b) { |
| var c = a + b; |
| Expect.equals(3.0, c.x); |
| Expect.equals(5.0, c.y); |
| Expect.equals(7.0, c.z); |
| Expect.equals(9.0, c.w); |
| } |
| |
| void testAddDeopt() { |
| var a = new Float32x4(1.0, 2.0, 3.0, 4.0); |
| var b = new Float32x4(2.0, 3.0, 4.0, 5.0); |
| var smi = 12; |
| for (int i = 0; i < 20; i++) { |
| testAdd(a, b); |
| } |
| |
| try { |
| testAdd(a, smi); |
| } catch (_) {} |
| } |
| |
| testGet(a) { |
| var c = a.x + a.y + a.z + a.w; |
| Expect.equals(10.0, c); |
| } |
| |
| void testGetDeopt() { |
| var a = new Float32x4(1.0, 2.0, 3.0, 4.0); |
| var smi = 12; |
| for (int i = 0; i < 20; i++) { |
| testGet(a); |
| } |
| |
| try { |
| testGet(12); |
| } catch (_) {} |
| |
| for (int i = 0; i < 20; i++) { |
| testGet(a); |
| } |
| } |
| |
| void testComparison(a, b) { |
| Int32x4 r = a.equal(b); |
| Expect.equals(true, r.flagX); |
| Expect.equals(false, r.flagY); |
| Expect.equals(false, r.flagZ); |
| Expect.equals(true, r.flagW); |
| } |
| |
| void testComparisonDeopt() { |
| var a = new Float32x4(1.0, 2.0, 3.0, 4.0); |
| var b = new Float32x4(1.0, 2.1, 3.1, 4.0); |
| var smi = 12; |
| |
| for (int i = 0; i < 20; i++) { |
| testComparison(a, b); |
| } |
| |
| try { |
| testComparison(a, smi); |
| } catch (_) {} |
| |
| for (int i = 0; i < 20; i++) { |
| testComparison(a, b); |
| } |
| |
| try { |
| testComparison(smi, a); |
| } catch (_) {} |
| |
| for (int i = 0; i < 20; i++) { |
| testComparison(a, b); |
| } |
| } |
| |
| main() { |
| testListStoreDeopt(); |
| testAddDeopt(); |
| testGetDeopt(); |
| testComparisonDeopt(); |
| } |