| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2017, 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 // VMOptions=--limit-ints-to-64-bits --enable-inlining-annotations --optimizatio
n_counter_threshold=10 --no-use-osr --no-background-compilation |
| 6 |
| 7 // Test for truncating (wrap-around) integer arithmetic in --limit-ints-to-64-bi
ts mode. |
| 8 |
| 9 import "package:expect/expect.dart"; |
| 10 |
| 11 const alwaysInline = "AlwaysInline"; |
| 12 const neverInline = "NeverInline"; |
| 13 |
| 14 @neverInline |
| 15 add_smi(var a, var b) => a + b; |
| 16 |
| 17 @neverInline |
| 18 add_mint(var a, var b) => a + b; |
| 19 |
| 20 @neverInline |
| 21 add_mint_consts() => 0x5000000000000000 + 0x6000000000000000; |
| 22 |
| 23 @neverInline |
| 24 test_add(var v2, var v3, var v3fxx, var v5fxx, var v7fxx, var n60xx) { |
| 25 for (var i = 0; i < 20; i++) { |
| 26 Expect.equals(5, add_smi(v2, v3)); |
| 27 } |
| 28 |
| 29 // Trigger deoptimization and re-compilation |
| 30 for (var i = 0; i < 20; i++) { |
| 31 Expect.equals(0x4000000000000001, add_smi(v2, v3fxx)); |
| 32 } |
| 33 |
| 34 for (var i = 0; i < 20; i++) { |
| 35 Expect.equals(-1, add_mint(v5fxx, n60xx)); |
| 36 } |
| 37 |
| 38 // Wrap-around |
| 39 for (var i = 0; i < 20; i++) { |
| 40 Expect.equals(-0x2000000000000002, add_mint(v5fxx, v7fxx)); |
| 41 } |
| 42 |
| 43 // Constant folding |
| 44 for (var i = 0; i < 20; i++) { |
| 45 Expect.equals(-0x5000000000000000, add_mint_consts()); |
| 46 } |
| 47 } |
| 48 |
| 49 @neverInline |
| 50 sub_smi(var a, var b) => a - b; |
| 51 |
| 52 @neverInline |
| 53 sub_mint(var a, var b) => a - b; |
| 54 |
| 55 @neverInline |
| 56 sub_mint_consts() => (-0x5000000000000000) - 0x6000000000000000; |
| 57 |
| 58 @neverInline |
| 59 test_sub(var v2, var v3, var v3fxx, var v5fxx, var v7fxx, var n60xx) { |
| 60 for (var i = 0; i < 20; i++) { |
| 61 Expect.equals(1, sub_smi(v3, v2)); |
| 62 } |
| 63 |
| 64 // Trigger deoptimization and re-compilation |
| 65 for (var i = 0; i < 20; i++) { |
| 66 Expect.equals(-0x7ffffffffffffffe, sub_smi(-v3fxx, v3fxx)); |
| 67 } |
| 68 |
| 69 for (var i = 0; i < 20; i++) { |
| 70 Expect.equals(0x2000000000000000, sub_mint(v7fxx, v5fxx)); |
| 71 } |
| 72 |
| 73 // Wrap-around |
| 74 for (var i = 0; i < 20; i++) { |
| 75 Expect.equals(0x4000000000000001, sub_mint(n60xx, v5fxx)); |
| 76 } |
| 77 |
| 78 // Constant folding |
| 79 for (var i = 0; i < 20; i++) { |
| 80 Expect.equals(0x5000000000000000, sub_mint_consts()); |
| 81 } |
| 82 } |
| 83 |
| 84 @neverInline |
| 85 mul_smi(var a, var b) => a * b; |
| 86 |
| 87 @neverInline |
| 88 mul_mint(var a, var b) => a * b; |
| 89 |
| 90 @neverInline |
| 91 mul_mint_consts() => 0x5000000000000001 * 0x6000000000000001; |
| 92 |
| 93 @neverInline |
| 94 test_mul(var v2, var v3, var v3fxx, var v5fxx, var v7fxx, var n60xx) { |
| 95 for (var i = 0; i < 20; i++) { |
| 96 Expect.equals(6, mul_smi(v2, v3)); |
| 97 } |
| 98 |
| 99 // Trigger deoptimization and re-compilation |
| 100 for (var i = 0; i < 20; i++) { |
| 101 Expect.equals(0x7ffffffffffffffe, mul_smi(v2, v3fxx)); |
| 102 } |
| 103 |
| 104 // Wrap around |
| 105 for (var i = 0; i < 20; i++) { |
| 106 Expect.equals(0x1ffffffffffffffd, mul_mint(v5fxx, 3)); |
| 107 } |
| 108 |
| 109 // Constant folding |
| 110 for (var i = 0; i < 20; i++) { |
| 111 Expect.equals(-0x4fffffffffffffff, mul_mint_consts()); |
| 112 } |
| 113 } |
| 114 |
| 115 @neverInline |
| 116 shl_smi(var a, var b) => a << b; |
| 117 |
| 118 @neverInline |
| 119 shl_mint(var a, var b) => a << b; |
| 120 |
| 121 @neverInline |
| 122 shl_mint_by_const16(var a) => a << 16; |
| 123 |
| 124 @neverInline |
| 125 shl_smi_by_const96(var a) => a << 96; |
| 126 |
| 127 @neverInline |
| 128 shl_mint_by_const96(var a) => a << 96; |
| 129 |
| 130 @neverInline |
| 131 shl_mint_consts() => 0x77665544aabbccdd << 48; |
| 132 |
| 133 @neverInline |
| 134 test_shl(var v2, var v3, var v8, var v40) { |
| 135 for (var i = 0; i < 20; i++) { |
| 136 Expect.equals(16, shl_smi(v2, v3)); |
| 137 } |
| 138 |
| 139 // Trigger deoptimization and re-compilation, wrap-around |
| 140 for (var i = 0; i < 20; i++) { |
| 141 Expect.equals(0x5566770000000000, shl_smi(0x0011223344556677, v40)); |
| 142 } |
| 143 |
| 144 // Wrap around |
| 145 for (var i = 0; i < 20; i++) { |
| 146 Expect.equals(-0x554433ffeeddcd00, shl_mint(0x7faabbcc00112233, v8)); |
| 147 } |
| 148 |
| 149 // Shift mint by small constant |
| 150 for (var i = 0; i < 20; i++) { |
| 151 Expect.equals(0x5544332211aa0000, shl_mint_by_const16(0x77665544332211aa)); |
| 152 } |
| 153 |
| 154 // Shift smi by large constant |
| 155 for (var i = 0; i < 20; i++) { |
| 156 Expect.equals(0, shl_smi_by_const96(0x77665544332211)); |
| 157 } |
| 158 |
| 159 // Shift mint by large constant |
| 160 for (var i = 0; i < 20; i++) { |
| 161 Expect.equals(0, shl_mint_by_const96(0x77665544332211aa)); |
| 162 } |
| 163 |
| 164 // Constant folding |
| 165 for (var i = 0; i < 20; i++) { |
| 166 Expect.equals(-0x3323000000000000, shl_mint_consts()); |
| 167 } |
| 168 } |
| 169 |
| 170 main() { |
| 171 var v2 = 2; // smi |
| 172 var v3 = 3; // smi |
| 173 var v8 = 8; // smi |
| 174 var v40 = 40; // smi |
| 175 var v3fxx = 0x3fffffffffffffff; // max smi |
| 176 var v5fxx = 0x5fffffffffffffff; // mint |
| 177 var v7fxx = 0x7fffffffffffffff; // max mint |
| 178 var n60xx = -0x6000000000000000; // negative mint |
| 179 |
| 180 test_add(v2, v3, v3fxx, v5fxx, v7fxx, n60xx); |
| 181 test_sub(v2, v3, v3fxx, v5fxx, v7fxx, n60xx); |
| 182 test_mul(v2, v3, v3fxx, v5fxx, v7fxx, n60xx); |
| 183 test_shl(v2, v3, v8, v40); |
| 184 } |
| OLD | NEW |