// Copyright (c) 2018, 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=--no-background-compilation --optimization-counter-threshold=100

// @dart = 2.9

// Verify that runtime correctly materializes unboxed variables on the catch
// entry in optimized code.

import 'dart:typed_data';

import 'package:expect/expect.dart';

@pragma('vm:never-inline')
void testThrow(bool shouldThrow) {
  var dbl = 0.0;
  var i32 = 0;
  var i64 = 0;
  var f32x4 = new Float32x4.zero();
  var f64x2 = new Float64x2.zero();
  var i32x4 = new Int32x4(0, 0, 0, 0);
  try {
    for (var i = 0; i < 100; i++) {
      dbl += i;
      i32 = i | 0x70000000;
      i64 = i | 0x80000000;
      final d = i.toDouble();
      f32x4 += new Float32x4(d, -d, d, -d);
      f64x2 += new Float64x2(d, -d);
      i32x4 += new Int32x4(-i, i, -i, i);
      if (shouldThrow && i == 50) {
        throw "";
      }
    }
  } catch (e) {}

  if (shouldThrow) {
    Expect.equals(1275.0, dbl);
    Expect.equals(0x70000000 | 50, i32);
    Expect.equals(0x80000000 | 50, i64);
    Expect.listEquals([1275.0, -1275.0, 1275.0, -1275.0],
        [f32x4.x, f32x4.y, f32x4.z, f32x4.w]);
    Expect.listEquals([1275.0, -1275.0], [f64x2.x, f64x2.y]);
    Expect.listEquals(
        [-1275, 1275, -1275, 1275], [i32x4.x, i32x4.y, i32x4.z, i32x4.w]);
  }
}

void main() {
  for (var i = 0; i < 100; i++) testThrow(false);
  testThrow(true);
}
