diff --git a/pkg/dart2wasm/lib/compile.dart b/pkg/dart2wasm/lib/compile.dart index a9652ade734..4a55dfa9b4a 100644 --- a/pkg/dart2wasm/lib/compile.dart +++ b/pkg/dart2wasm/lib/compile.dart @@ -126,6 +126,8 @@ Future compileToModule( CoreTypes coreTypes = compilerResult.coreTypes!; ClassHierarchy classHierarchy = compilerResult.classHierarchy!; LibraryIndex libraryIndex = LibraryIndex(component, [ + "dart:_boxed_double", + "dart:_boxed_int", "dart:_internal", "dart:_js_helper", "dart:_js_types", diff --git a/pkg/dart2wasm/lib/intrinsics.dart b/pkg/dart2wasm/lib/intrinsics.dart index e8665401f24..b9654bcb631 100644 --- a/pkg/dart2wasm/lib/intrinsics.dart +++ b/pkg/dart2wasm/lib/intrinsics.dart @@ -46,12 +46,6 @@ class Intrinsifier { '<=': (c) => c.b.i64_le_s(), '>': (c) => c.b.i64_gt_s(), '>=': (c) => c.b.i64_ge_s(), - '_div_s': (c) => c.b.i64_div_s(), - '_shl': (c) => c.b.i64_shl(), - '_shr_s': (c) => c.b.i64_shr_s(), - '_shr_u': (c) => c.b.i64_shr_u(), - '_le_u': (c) => c.b.i64_le_u(), - '_lt_u': (c) => c.b.i64_lt_u(), '~/': (c) => c.call(c.translator.truncDiv.reference), } }, @@ -65,7 +59,6 @@ class Intrinsifier { '<=': (c) => c.b.f64_le(), '>': (c) => c.b.f64_gt(), '>=': (c) => c.b.f64_ge(), - '_copysign': (c) => c.b.f64_copysign(), } }, }; @@ -297,6 +290,26 @@ class Intrinsifier { codeGen.wrap(node.arguments.positional[0], w.NumType.i64); b.i64_gt_u(); return boolType; + case "shl": + codeGen.wrap(receiver, w.NumType.i64); + codeGen.wrap(node.arguments.positional[0], w.NumType.i64); + b.i64_shl(); + return w.NumType.i64; + case "shrS": + codeGen.wrap(receiver, w.NumType.i64); + codeGen.wrap(node.arguments.positional[0], w.NumType.i64); + b.i64_shr_s(); + return w.NumType.i64; + case "shrU": + codeGen.wrap(receiver, w.NumType.i64); + codeGen.wrap(node.arguments.positional[0], w.NumType.i64); + b.i64_shr_u(); + return w.NumType.i64; + case "divS": + codeGen.wrap(receiver, w.NumType.i64); + codeGen.wrap(node.arguments.positional[0], w.NumType.i64); + b.i64_div_s(); + return w.NumType.i64; default: throw 'Unknown WasmI64 member $name'; } @@ -314,6 +327,11 @@ class Intrinsifier { codeGen.wrap(receiver, w.NumType.f64); b.i64_trunc_sat_f64_s(); return w.NumType.i64; + case "copysign": + codeGen.wrap(receiver, w.NumType.f64); + codeGen.wrap(node.arguments.positional[0], w.NumType.f64); + b.f64_copysign(); + return w.NumType.f64; default: throw 'Unknown WasmF64 member $name'; } diff --git a/pkg/dart2wasm/lib/kernel_nodes.dart b/pkg/dart2wasm/lib/kernel_nodes.dart index 60ff8db6a0f..f8047f32848 100644 --- a/pkg/dart2wasm/lib/kernel_nodes.dart +++ b/pkg/dart2wasm/lib/kernel_nodes.dart @@ -30,8 +30,9 @@ mixin KernelNodes { // dart:core various classes late final Class boxedBoolClass = index.getClass("dart:core", "_BoxedBool"); late final Class boxedDoubleClass = - index.getClass("dart:core", "_BoxedDouble"); - late final Class boxedIntClass = index.getClass("dart:core", "_BoxedInt"); + index.getClass("dart:_boxed_double", "BoxedDouble"); + late final Class boxedIntClass = + index.getClass("dart:_boxed_int", "BoxedInt"); late final Class closureClass = index.getClass("dart:core", "_Closure"); late final Class listBaseClass = index.getClass("dart:_list", "WasmListBase"); late final Class fixedLengthListClass = @@ -250,7 +251,7 @@ mixin KernelNodes { late final Procedure stringInterpolate4 = index.getProcedure("dart:_string", "StringBase", "_interpolate4"); late final Procedure truncDiv = - index.getProcedure("dart:core", "_BoxedInt", "_truncDiv"); + index.getProcedure("dart:_boxed_int", "BoxedInt", "_truncDiv"); late final Procedure runtimeTypeEquals = index.getTopLevelProcedure("dart:core", "_runtimeTypeEquals"); late final Procedure runtimeTypeHashCode = diff --git a/pkg/dart2wasm/lib/target.dart b/pkg/dart2wasm/lib/target.dart index b00be0a2637..b79a7fe84d8 100644 --- a/pkg/dart2wasm/lib/target.dart +++ b/pkg/dart2wasm/lib/target.dart @@ -142,6 +142,8 @@ class WasmTarget extends Target { @override List get extraRequiredLibraries => [ + 'dart:_boxed_double', + 'dart:_boxed_int', 'dart:_http', 'dart:_internal', 'dart:_js_helper', @@ -163,6 +165,8 @@ class WasmTarget extends Target { @override List get extraIndexedLibraries => [ + 'dart:_boxed_double', + 'dart:_boxed_int', 'dart:_js_helper', 'dart:_js_types', 'dart:_list', @@ -524,11 +528,12 @@ class WasmTarget extends Target { @override Class concreteIntLiteralClass(CoreTypes coreTypes, int value) => - _boxedInt ??= coreTypes.index.getClass("dart:core", "_BoxedInt"); + _boxedInt ??= coreTypes.index.getClass("dart:_boxed_int", "BoxedInt"); @override Class concreteDoubleLiteralClass(CoreTypes coreTypes, double value) => - _boxedDouble ??= coreTypes.index.getClass("dart:core", "_BoxedDouble"); + _boxedDouble ??= + coreTypes.index.getClass("dart:_boxed_double", "BoxedDouble"); @override DartLibrarySupport get dartLibrarySupport => CustomizedDartLibrarySupport( diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/int_operations_dart2wasm.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/int_operations_dart2wasm.dart.expect index b0d7b57e9ac..632bdd7e3f9 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/int_operations_dart2wasm.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/int_operations_dart2wasm.dart.expect @@ -3,26 +3,26 @@ import self as self; import "dart:core" as core; -[@vm.inferred-type.metadata=dart.core::_BoxedInt] +[@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] [@vm.unboxing-info.metadata=(i)->i] -static field core::int x = [@vm.inferred-type.metadata=dart.core::_BoxedInt] core::int::parse("2"); +static field core::int x = [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] core::int::parse("2"); -[@vm.inferred-type.metadata=dart.core::_BoxedInt] +[@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] [@vm.unboxing-info.metadata=(i)->i] -static field core::int y = [@vm.inferred-type.metadata=dart.core::_BoxedInt] core::int::parse("3"); +static field core::int y = [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] core::int::parse("3"); [@vm.inferred-return-type.metadata=dart.core::Null? (value: null)] [@vm.unboxing-info.metadata=(i,i,i)->b] -static method use([@vm.inferred-arg-type.metadata=dart.core::_BoxedInt] final dynamic a, [@vm.inferred-arg-type.metadata=dart.core::_BoxedInt] final dynamic b, [@vm.inferred-arg-type.metadata=dart.core::_BoxedInt] final dynamic c) → void { +static method use([@vm.inferred-arg-type.metadata=library dart:_boxed_int::BoxedInt] final dynamic a, [@vm.inferred-arg-type.metadata=library dart:_boxed_int::BoxedInt] final dynamic b, [@vm.inferred-arg-type.metadata=library dart:_boxed_int::BoxedInt] final dynamic c) → void { core::print(a); core::print(b); core::print(c); - core::print([@vm.direct-call.metadata=dart.core::_BoxedInt.~/] [@vm.inferred-type.metadata=dart.core::_BoxedInt] a{dynamic}.~/(2)); - core::print([@vm.direct-call.metadata=dart.core::_BoxedInt.~/] [@vm.inferred-type.metadata=dart.core::_BoxedInt] b{dynamic}.~/(2)); - core::print([@vm.direct-call.metadata=dart.core::_BoxedInt.~/] [@vm.inferred-type.metadata=dart.core::_BoxedInt] c{dynamic}.~/(2)); + core::print([@vm.direct-call.metadata=library dart:_boxed_int::BoxedInt.~/] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] a{dynamic}.~/(2)); + core::print([@vm.direct-call.metadata=library dart:_boxed_int::BoxedInt.~/] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] b{dynamic}.~/(2)); + core::print([@vm.direct-call.metadata=library dart:_boxed_int::BoxedInt.~/] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] c{dynamic}.~/(2)); } [@vm.inferred-return-type.metadata=dart.core::Null? (value: null)] static method main() → dynamic { - self::use([@vm.direct-call.metadata=dart.core::_BoxedInt.+] [@vm.inferred-type.metadata=dart.core::_BoxedInt (skip check)] [@vm.inferred-type.metadata=dart.core::_BoxedInt] self::x.{core::num::+}([@vm.inferred-type.metadata=dart.core::_BoxedInt] self::y){(core::num) → core::int}, [@vm.direct-call.metadata=dart.core::_BoxedInt.-] [@vm.inferred-type.metadata=dart.core::_BoxedInt (skip check)] [@vm.inferred-type.metadata=dart.core::_BoxedInt] self::x.{core::num::-}([@vm.inferred-type.metadata=dart.core::_BoxedInt] self::y){(core::num) → core::int}, [@vm.direct-call.metadata=dart.core::_BoxedInt.*] [@vm.inferred-type.metadata=dart.core::_BoxedInt (skip check)] [@vm.inferred-type.metadata=dart.core::_BoxedInt] self::x.{core::num::*}([@vm.inferred-type.metadata=dart.core::_BoxedInt] self::y){(core::num) → core::int}); + self::use([@vm.direct-call.metadata=library dart:_boxed_int::BoxedInt.+] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt (skip check)] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] self::x.{core::num::+}([@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] self::y){(core::num) → core::int}, [@vm.direct-call.metadata=library dart:_boxed_int::BoxedInt.-] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt (skip check)] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] self::x.{core::num::-}([@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] self::y){(core::num) → core::int}, [@vm.direct-call.metadata=library dart:_boxed_int::BoxedInt.*] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt (skip check)] [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] self::x.{core::num::*}([@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] self::y){(core::num) → core::int}); } diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/records_dart2wasm.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/records_dart2wasm.dart.expect index ff59dccd88a..6b726bd754c 100644 --- a/pkg/vm/testcases/transformations/type_flow/transformer/records_dart2wasm.dart.expect +++ b/pkg/vm/testcases/transformations/type_flow/transformer/records_dart2wasm.dart.expect @@ -8,7 +8,7 @@ static field dynamic list = ["abc", (42, {foo42: "foo42"})]; [@vm.inferred-return-type.metadata=dart.core::Record_2_bar] [@vm.unboxing-info.metadata=(i,i,i)->b] -static method recordLiteral([@vm.inferred-arg-type.metadata=dart.core::_BoxedInt] final dynamic x, [@vm.inferred-arg-type.metadata=dart.core::_BoxedInt] final dynamic y, [@vm.inferred-arg-type.metadata=dart.core::_BoxedInt] final dynamic z) → dynamic +static method recordLiteral([@vm.inferred-arg-type.metadata=library dart:_boxed_int::BoxedInt] final dynamic x, [@vm.inferred-arg-type.metadata=library dart:_boxed_int::BoxedInt] final dynamic y, [@vm.inferred-arg-type.metadata=library dart:_boxed_int::BoxedInt] final dynamic z) → dynamic return (x, y, {bar: z}); static method recordFieldAccess1([@vm.inferred-arg-type.metadata=dart.core::Record_2] final(core::int, core::String) rec) → dynamic return rec.$1{core::int}; @@ -20,7 +20,7 @@ static method recordDynamicFieldAccess(final dynamic x) → dynamic [@vm.inferred-return-type.metadata=dart.core::Null? (value: null)] static method main() → dynamic { core::print(#C4); - core::print([@vm.inferred-type.metadata=dart.core::Record_2_bar] self::recordLiteral([@vm.inferred-type.metadata=dart.core::_BoxedInt] core::int::parse("1"), [@vm.inferred-type.metadata=dart.core::_BoxedInt] core::int::parse("2"), [@vm.inferred-type.metadata=dart.core::_BoxedInt] core::int::parse("3"))); + core::print([@vm.inferred-type.metadata=dart.core::Record_2_bar] self::recordLiteral([@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] core::int::parse("1"), [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] core::int::parse("2"), [@vm.inferred-type.metadata=library dart:_boxed_int::BoxedInt] core::int::parse("3"))); core::print(self::recordFieldAccess1((10, "hi"))); core::print(self::recordFieldAccess2(({a: 20, b: "bye"}))); core::print(self::recordDynamicFieldAccess([@vm.direct-call.metadata=dart._list::WasmListBase.[]??] [@vm.inferred-type.metadata=!? (receiver not int)] [@vm.inferred-type.metadata=dart._list::GrowableList?] self::list{dynamic}.[](1))); diff --git a/sdk/lib/_internal/wasm/lib/boxed_double.dart b/sdk/lib/_internal/wasm/lib/boxed_double.dart index ac9a1e4d29a..60e166314a5 100644 --- a/sdk/lib/_internal/wasm/lib/boxed_double.dart +++ b/sdk/lib/_internal/wasm/lib/boxed_double.dart @@ -2,19 +2,20 @@ // 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. +import 'dart:_boxed_int' show intHashCode; import 'dart:_internal' show doubleToIntBits, intBitsToDouble; import 'dart:_js_helper' show JS, jsStringToDartString; import 'dart:_string'; import 'dart:_wasm'; @pragma("wasm:entry-point") -final class _BoxedDouble extends double { +final class BoxedDouble extends double { // A boxed double contains an unboxed double. @pragma("wasm:entry-point") double value = 0.0; /// Dummy factory to silence error about missing superclass constructor. - external factory _BoxedDouble(); + external factory BoxedDouble(); static const int _mantissaBits = 52; static const int _exponentBits = 11; @@ -27,9 +28,9 @@ final class _BoxedDouble extends double { static int _doubleHashCode(double value) { const int maxInt = 0x7FFFFFFFFFFFFFFF; - int intValue = value._toInt(); + int intValue = value.truncSatS(); if (intValue.toDouble() == value && intValue != maxInt) { - return _intHashCode(intValue); + return intHashCode(intValue); } int bits = doubleToIntBits(value); return (bits ^ (bits >>> 32)) & 0x3FFFFFFF; @@ -97,10 +98,10 @@ final class _BoxedDouble extends double { return (a * b) / (a * b); } - if ((aBits << 1)._le_u(bBits << 1)) { + if ((aBits << 1).leU(bBits << 1)) { if ((aBits << 1) == (bBits << 1)) { // abs(a) == abs(b), so remainder = +/- 0.0 depending on sign of a - return 0.0._copysign(a); + return 0.0.copysign(a); } // abs(a) < abs(b), so b = 0 * a rem. a @@ -139,7 +140,7 @@ final class _BoxedDouble extends double { // remainder is positive if (remainder == 0) { // a divides into b exactly, so remainder = +/- 0.0 depending on sign of a - return 0.0._copysign(a); + return 0.0.copysign(a); } aBits = remainder; @@ -155,7 +156,7 @@ final class _BoxedDouble extends double { // remainder is positive if (remainder == 0) { // a divides into b exactly, so remainder = +/- 0.0 depending on sign of a - return 0.0._copysign(a); + return 0.0.copysign(a); } aBits = remainder; @@ -205,7 +206,7 @@ final class _BoxedDouble extends double { bool get isNegative { // Sign bit set, not NaN int bits = doubleToIntBits(this); - return (bits ^ _signMask)._le_u(_exponentMask); + return (bits ^ _signMask).leU(_exponentMask); } @pragma("wasm:prefer-inline") @@ -231,7 +232,7 @@ final class _BoxedDouble extends double { @pragma("wasm:prefer-inline") double abs() { - return value._copysign(0.0); + return value.copysign(0.0); } @pragma("wasm:prefer-inline") @@ -273,8 +274,8 @@ final class _BoxedDouble extends double { // Add 0.5 to the absolute value of the number and truncate the result. final int shift = (_exponentBias + _mantissaBits - 1) - exponent; - final int adjust = 1._shl(shift); - final int mask = (-2)._shl(shift); + final int adjust = 1.shl(shift); + final int mask = (-2).shl(shift); final int rounded = (bits + adjust) & mask; return intBitsToDouble(rounded); } @@ -298,7 +299,7 @@ final class _BoxedDouble extends double { if (!isFinite) { throw UnsupportedError("Infinity or NaN toInt"); } - return value._toInt(); + return value.truncSatS(); } @pragma("wasm:prefer-inline") @@ -476,7 +477,7 @@ final class _BoxedDouble extends double { return GREATER; } } - return value._toInt().compareTo(other); + return value.truncSatS().compareTo(other); } else { return EQUAL; } diff --git a/sdk/lib/_internal/wasm/lib/boxed_int.dart b/sdk/lib/_internal/wasm/lib/boxed_int.dart index e03dda4d678..20df3992327 100644 --- a/sdk/lib/_internal/wasm/lib/boxed_int.dart +++ b/sdk/lib/_internal/wasm/lib/boxed_int.dart @@ -2,17 +2,18 @@ // 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. +import 'dart:_boxed_double'; import 'dart:_internal'; import 'dart:_wasm'; @pragma("wasm:entry-point") -final class _BoxedInt extends int { +final class BoxedInt extends int { // A boxed int contains an unboxed int. @pragma("wasm:entry-point") int value = 0; /// Dummy factory to silence error about missing superclass constructor. - external factory _BoxedInt(); + external factory BoxedInt(); external num operator +(num other); external num operator -(num other); @@ -26,12 +27,12 @@ final class _BoxedInt extends int { @pragma("wasm:prefer-inline") int operator ~/(num other) => other is int ? _truncDiv(this.value, other) - : _BoxedDouble.truncDiv(toDouble(), unsafeCast(other)); + : BoxedDouble.truncDiv(toDouble(), unsafeCast(other)); @pragma("wasm:prefer-inline") num operator %(num other) => other is int ? _modulo(this, other) - : _BoxedDouble.modulo(toDouble(), unsafeCast(other)); + : BoxedDouble.modulo(toDouble(), unsafeCast(other)); static int _modulo(int a, int b) { int rem = a - (a ~/ b) * b; @@ -58,13 +59,13 @@ final class _BoxedInt extends int { throw IntegerDivisionByZeroException(); } - return a._div_s(b); + return a.divS(b); } @pragma("wasm:prefer-inline") num remainder(num other) => other is int ? this - (this ~/ other) * other - : _BoxedDouble.computeRemainder(toDouble(), unsafeCast(other)); + : BoxedDouble.computeRemainder(toDouble(), unsafeCast(other)); external int operator -(); @@ -75,8 +76,8 @@ final class _BoxedInt extends int { @pragma("wasm:prefer-inline") int operator >>(int shift) { // Unsigned comparison to check for large and negative shifts - if (shift._lt_u(64)) { - return value._shr_s(shift); + if (shift.ltU(64)) { + return value.shrS(shift); } if (shift < 0) { @@ -84,14 +85,14 @@ final class _BoxedInt extends int { } // shift >= 64, 0 or -1 depending on sign: `this >= 0 ? 0 : -1` - return value._shr_s(63); + return value.shrS(63); } @pragma("wasm:prefer-inline") int operator >>>(int shift) { // Unsigned comparison to check for large and negative shifts - if (shift._lt_u(64)) { - return value._shr_u(shift); + if (shift.ltU(64)) { + return value.shrU(shift); } if (shift < 0) { @@ -105,8 +106,8 @@ final class _BoxedInt extends int { @pragma("wasm:prefer-inline") int operator <<(int shift) { // Unsigned comparison to check for large and negative shifts - if (shift._lt_u(64)) { - return value._shl(shift); + if (shift.ltU(64)) { + return value.shl(shift); } if (shift < 0) { @@ -195,7 +196,7 @@ final class _BoxedInt extends int { } else { // If abs(other) > MAX_EXACT_INT_TO_DOUBLE, then other has an integer // value (no bits below the decimal point). - other = other._toInt(); + other = other.truncSatS(); } } if (this < other) { @@ -411,7 +412,7 @@ final class _BoxedInt extends int { return _binaryGcd(x, y, false); } - int get hashCode => _intHashCode(this); + int get hashCode => intHashCode(this); external int operator ~(); external int get bitLength; @@ -420,7 +421,7 @@ final class _BoxedInt extends int { external String toString(); } -int _intHashCode(int value) { +int intHashCode(int value) { const int magic = 0x2D51; int lower = (value & 0xFFFFFFFF) * magic; int upper = (value >>> 32) * magic; diff --git a/sdk/lib/_internal/wasm/lib/boxed_int_to_string.dart b/sdk/lib/_internal/wasm/lib/boxed_int_to_string.dart index 84cf3fa933c..8f1f418dc39 100644 --- a/sdk/lib/_internal/wasm/lib/boxed_int_to_string.dart +++ b/sdk/lib/_internal/wasm/lib/boxed_int_to_string.dart @@ -6,7 +6,7 @@ import 'dart:_internal'; import 'dart:_string'; @patch -class _BoxedInt { +class BoxedInt { @patch String toRadixString(int radix) => _intToRadixString(value, radix); diff --git a/sdk/lib/_internal/wasm/lib/double_patch.dart b/sdk/lib/_internal/wasm/lib/double_patch.dart index aa74e9e400a..fa85bc12257 100644 --- a/sdk/lib/_internal/wasm/lib/double_patch.dart +++ b/sdk/lib/_internal/wasm/lib/double_patch.dart @@ -42,10 +42,4 @@ class double { } return result; } - - /// Wasm i64.trunc_sat_f64_s instruction. - external int _toInt(); - - /// Wasm f64.copysign instruction. - external double _copysign(double other); } diff --git a/sdk/lib/_internal/wasm/lib/int_common_patch.dart b/sdk/lib/_internal/wasm/lib/int_common_patch.dart index 506335d1ffc..b1de299da26 100644 --- a/sdk/lib/_internal/wasm/lib/int_common_patch.dart +++ b/sdk/lib/_internal/wasm/lib/int_common_patch.dart @@ -9,22 +9,4 @@ class int { @patch external const factory int.fromEnvironment(String name, {int defaultValue = 0}); - - /// Wasm i64.div_s instruction. - external int _div_s(int divisor); - - /// Wasm i64.le_u instruction. - external bool _le_u(int other); - - /// Wasm i64.lt_u instruction. - external bool _lt_u(int other); - - /// Wasm i64.shr_s instruction. - external int _shr_s(int shift); - - /// Wasm i64.shr_u instruction. - external int _shr_u(int shift); - - /// Wasm i64.shl instruction. - external int _shl(int shift); } diff --git a/sdk/lib/_internal/wasm_js_compatibility/lib/boxed_int_to_string.dart b/sdk/lib/_internal/wasm_js_compatibility/lib/boxed_int_to_string.dart index 070b73ddbd6..88d72ee77ef 100644 --- a/sdk/lib/_internal/wasm_js_compatibility/lib/boxed_int_to_string.dart +++ b/sdk/lib/_internal/wasm_js_compatibility/lib/boxed_int_to_string.dart @@ -9,7 +9,7 @@ import 'dart:_string'; import 'dart:_wasm'; @patch -class _BoxedInt { +class BoxedInt { @patch String toRadixString(int radix) { // We could also catch the `_JavaScriptError` here and convert it to diff --git a/sdk/lib/_wasm/wasm_types.dart b/sdk/lib/_wasm/wasm_types.dart index 4f130bc1389..9b7bbe54ce6 100644 --- a/sdk/lib/_wasm/wasm_types.dart +++ b/sdk/lib/_wasm/wasm_types.dart @@ -165,6 +165,18 @@ class WasmI64 extends _WasmBase { /// Wasm `i64.gt_u` instruction. external bool gtU(WasmI64 other); + + /// Wasm `i64.shl` instruction. + external WasmI64 shl(WasmI64 shift); + + /// Wasm `i64.shr_s` instruction. + external WasmI64 shrS(WasmI64 shift); + + /// Wasm `i64.shr_u` instruction. + external WasmI64 shrU(WasmI64 shift); + + /// Wasm `i64.div_s` instruction. + external WasmI64 divS(WasmI64 divisor); } /// The Wasm `f32` type. @@ -193,8 +205,11 @@ class WasmF64 extends _WasmBase { external double toDouble(); - /// `i64.trunc_sat_f64_s`. + /// Wasm `i64.trunc_sat_f64_s` instruction. external WasmI64 truncSatS(); + + /// Wasm `f64.copysign` instruction. + external WasmF64 copysign(WasmF64 other); } /// A Wasm array. @@ -302,8 +317,11 @@ class WasmTable extends _WasmBase { external F callIndirect(WasmI32 index); } -extension IntToWasmInt on int { +extension IntWasmInstructions on int { + @pragma("wasm:prefer-inline") WasmI32 toWasmI32() => WasmI32.fromInt(this); + + @pragma("wasm:prefer-inline") WasmI64 toWasmI64() => WasmI64.fromInt(this); /// Wasm `i64.le_u` instruction. @@ -321,11 +339,39 @@ extension IntToWasmInt on int { /// Wasm `i64.gt_u` instruction. @pragma("wasm:prefer-inline") bool gtU(int other) => this.toWasmI64().gtU(other.toWasmI64()); + + /// Wasm `i64.shl` instruction. + @pragma("wasm:prefer-inline") + int shl(int shift) => this.toWasmI64().shl(shift.toWasmI64()).toInt(); + + /// Wasm `i64.shr_s` instruction. + @pragma("wasm:prefer-inline") + int shrS(int shift) => this.toWasmI64().shrS(shift.toWasmI64()).toInt(); + + /// Wasm `i64.shr_u` instruction. + @pragma("wasm:prefer-inline") + int shrU(int shift) => this.toWasmI64().shrU(shift.toWasmI64()).toInt(); + + /// Wasm `i64.div_s` instruction. + @pragma("wasm:prefer-inline") + int divS(int divisor) => this.toWasmI64().divS(divisor.toWasmI64()).toInt(); } -extension DoubleToWasmFloat on double { +extension DoubleWasmInstructions on double { + @pragma("wasm:prefer-inline") WasmF32 toWasmF32() => WasmF32.fromDouble(this); + + @pragma("wasm:prefer-inline") WasmF64 toWasmF64() => WasmF64.fromDouble(this); + + /// Wasm `i64.trunc_sat_f64_s` instruction. + @pragma("wasm:prefer-inline") + int truncSatS() => this.toWasmF64().truncSatS().toInt(); + + /// Wasm `f64.copysign` instruction. + @pragma("wasm:prefer-inline") + double copysign(double other) => + this.toWasmF64().copysign(other.toWasmF64()).toDouble(); } extension WasmExternRefToJSAny on WasmExternRef { diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json index d00a880b4f9..280a59819c7 100644 --- a/sdk/lib/libraries.json +++ b/sdk/lib/libraries.json @@ -132,9 +132,6 @@ "_internal/vm_shared/lib/map_patch.dart", "_internal/vm_shared/lib/null_patch.dart", "_internal/wasm/lib/array_patch.dart", - "_internal/wasm/lib/boxed_double.dart", - "_internal/wasm/lib/boxed_int.dart", - "_internal/wasm/lib/boxed_int_to_string.dart", "_internal/wasm/lib/core_patch.dart", "_internal/wasm/lib/date_patch_patch.dart", "_internal/wasm/lib/int_common_patch.dart", @@ -158,6 +155,10 @@ "_internal/wasm/lib/typed_data_patch.dart" ] }, + "_boxed_int": { + "uri": "_internal/wasm/lib/boxed_int.dart", + "patches": "_internal/wasm/lib/boxed_int_to_string.dart" + }, "_string": { "uri": "_internal/wasm/lib/js_string.dart", "patches": "_internal/wasm/lib/string.dart" @@ -195,14 +196,11 @@ "_internal/vm_shared/lib/map_patch.dart", "_internal/vm_shared/lib/null_patch.dart", "_internal/wasm/lib/array_patch.dart", - "_internal/wasm/lib/boxed_double.dart", - "_internal/wasm/lib/boxed_int.dart", "_internal/wasm/lib/core_patch.dart", "_internal/wasm/lib/date_patch_patch.dart", "_internal/wasm/lib/int_common_patch.dart", "_internal/wasm/lib/sync_star_patch.dart", "_internal/wasm/lib/weak_patch.dart", - "_internal/wasm_js_compatibility/lib/boxed_int_to_string.dart", "_internal/wasm_js_compatibility/lib/int_patch.dart", "_internal/wasm_js_compatibility/lib/string_buffer_patch.dart", "_internal/wasm_js_compatibility/lib/string_patch.dart" @@ -215,6 +213,10 @@ "_internal/wasm_js_compatibility/lib/typed_data_patch.dart" ] }, + "_boxed_int": { + "uri": "_internal/wasm/lib/boxed_int.dart", + "patches": "_internal/wasm_js_compatibility/lib/boxed_int_to_string.dart" + }, "_string": { "uri": "_internal/wasm/lib/js_string.dart" }, @@ -231,11 +233,15 @@ "core": { "uri": "core/core.dart", "patches": [ - "_internal/wasm/lib/boxed_double.dart", - "_internal/wasm/lib/boxed_int.dart", "_internal/wasm/lib/int_common_patch.dart" ] }, + "_boxed_int": { + "uri": "_internal/wasm/lib/boxed_int.dart" + }, + "_boxed_double": { + "uri": "_internal/wasm/lib/boxed_double.dart" + }, "_error_utils": { "uri": "_internal/wasm/lib/error_utils.dart" }, diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml index 7d616067b8b..e06c5cda285 100644 --- a/sdk/lib/libraries.yaml +++ b/sdk/lib/libraries.yaml @@ -123,9 +123,6 @@ wasm: - _internal/vm_shared/lib/map_patch.dart - _internal/vm_shared/lib/null_patch.dart - _internal/wasm/lib/array_patch.dart - - _internal/wasm/lib/boxed_double.dart - - _internal/wasm/lib/boxed_int.dart - - _internal/wasm/lib/boxed_int_to_string.dart - _internal/wasm/lib/core_patch.dart - _internal/wasm/lib/date_patch_patch.dart - _internal/wasm/lib/int_common_patch.dart @@ -143,6 +140,10 @@ wasm: patches: - _internal/wasm/lib/simd_patch.dart - _internal/wasm/lib/typed_data_patch.dart + _boxed_int: + uri: _internal/wasm/lib/boxed_int.dart + patches: + _internal/wasm/lib/boxed_int_to_string.dart _string: uri: _internal/wasm/lib/js_string.dart patches: @@ -171,14 +172,11 @@ wasm_js_compatibility: - _internal/vm_shared/lib/map_patch.dart - _internal/vm_shared/lib/null_patch.dart - _internal/wasm/lib/array_patch.dart - - _internal/wasm/lib/boxed_double.dart - - _internal/wasm/lib/boxed_int.dart - _internal/wasm/lib/core_patch.dart - _internal/wasm/lib/date_patch_patch.dart - _internal/wasm/lib/int_common_patch.dart - _internal/wasm/lib/sync_star_patch.dart - _internal/wasm/lib/weak_patch.dart - - _internal/wasm_js_compatibility/lib/boxed_int_to_string.dart - _internal/wasm_js_compatibility/lib/int_patch.dart - _internal/wasm_js_compatibility/lib/string_buffer_patch.dart - _internal/wasm_js_compatibility/lib/string_patch.dart @@ -187,6 +185,10 @@ wasm_js_compatibility: patches: - _internal/wasm/lib/simd_patch.dart - _internal/wasm_js_compatibility/lib/typed_data_patch.dart + _boxed_int: + uri: _internal/wasm/lib/boxed_int.dart + patches: + _internal/wasm_js_compatibility/lib/boxed_int_to_string.dart _string: uri: _internal/wasm/lib/js_string.dart _js_helper: @@ -199,9 +201,11 @@ wasm_common: core: uri: core/core.dart patches: - - _internal/wasm/lib/boxed_double.dart - - _internal/wasm/lib/boxed_int.dart - _internal/wasm/lib/int_common_patch.dart + _boxed_int: + uri: _internal/wasm/lib/boxed_int.dart + _boxed_double: + uri: _internal/wasm/lib/boxed_double.dart _error_utils: uri: _internal/wasm/lib/error_utils.dart _http: