blob: 4288164f16abbc4a98135524124c0ae69bb94dfe [file] [log] [blame]
// Copyright (c) 2024, 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=--optimization-counter-threshold=50 --no-background-compilation
import "package:expect/expect.dart";
@pragma("vm:never-inline")
dynamic smi_add(dynamic x, dynamic y) => x + y;
@pragma("vm:never-inline")
dynamic smi_sub(dynamic x, dynamic y) => x - y;
@pragma("vm:never-inline")
dynamic smi_mul(dynamic x, dynamic y) => x * y;
@pragma("vm:never-inline")
dynamic smi_and(dynamic x, dynamic y) => x & y;
@pragma("vm:never-inline")
dynamic smi_or(dynamic x, dynamic y) => x | y;
@pragma("vm:never-inline")
dynamic smi_xor(dynamic x, dynamic y) => x ^ y;
@pragma("vm:never-inline")
dynamic smi_div(dynamic x, dynamic y) => x ~/ y;
@pragma("vm:never-inline")
dynamic smi_mod(dynamic x, dynamic y) => x % y;
@pragma("vm:never-inline")
dynamic smi_sll(dynamic x, dynamic y) => x << y;
@pragma("vm:never-inline")
dynamic smi_sra(dynamic x, dynamic y) => x >> y;
@pragma("vm:never-inline")
dynamic smi_srl(dynamic x, dynamic y) => x >>> y;
testSmi() {
Expect.equals(7, smi_add(3, 4));
Expect.equals(-1, smi_sub(3, 4));
Expect.equals(12, smi_mul(3, 4));
Expect.equals(0, smi_and(3, 4));
Expect.equals(7, smi_or(3, 4));
Expect.equals(7, smi_xor(3, 4));
Expect.equals(0, smi_div(3, 4));
Expect.equals(3, smi_mod(3, 4));
Expect.equals(48, smi_sll(3, 4));
Expect.equals(0, smi_sra(3, 4));
Expect.equals(0, smi_srl(3, 4));
}
const maxSmi32 = 0x3FFFFFFF;
const maxSmi64 = 0x3FFFFFFFFFFFFFFF;
const minSmi32 = -0x80000000;
const minSmi64 = -0x8000000000000000;
testSmiDeopt() {
Expect.equals(0x40000000, smi_add(maxSmi32, 1));
Expect.equals(0x4000000000000000, smi_add(maxSmi64, 1));
Expect.equals(0x40000000, smi_sub(maxSmi32, -1));
Expect.equals(0x4000000000000000, smi_sub(maxSmi64, -1));
Expect.equals(0x7FFFFFFE, smi_mul(maxSmi32, 2));
Expect.equals(0x7FFFFFFFFFFFFFFE, smi_mul(maxSmi64, 2));
Expect.equals(0x80000000, smi_div(minSmi32, -1));
Expect.equals(0x8000000000000000, smi_div(minSmi64, -1));
Expect.throws(() => smi_mod(minSmi32, 0));
Expect.throws(() => smi_mod(minSmi64, 0));
Expect.equals(0x7FFFFFFE, smi_sll(maxSmi32, 1));
Expect.equals(0x7FFFFFFFFFFFFFFE, smi_sll(maxSmi64, 1));
Expect.equals(0, smi_sra(maxSmi32, 65));
Expect.equals(0, smi_sra(maxSmi64, 65));
Expect.equals(0, smi_srl(minSmi32, 65));
Expect.equals(0, smi_srl(minSmi64, 65));
}
main() {
for (int i = 0; i < 200; i++) {
testSmi();
}
print("=================================");
for (int i = 0; i < 200; i++) {
testSmiDeopt();
}
}