Backport Math/StrictMath.multiplyFull
Test: tools/test.py --dex_vm all --no-internal -v *Backport*Test*
Test: tools/test.py --no-internal -v *GenerateBackportMethods*
Change-Id: I0adb69edc2eca3ebbf20db8adea531626a941227
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index d6b5512..8610eca 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -1205,6 +1205,15 @@
BackportedMethods::MathMethods_multiplyExactLongInt,
"multiplyExactLongInt"));
+ // long {Math,StrictMath}.multiplyFull(int, int)
+ name = factory.createString("multiplyFull");
+ proto = factory.createProto(factory.longType, factory.intType, factory.intType);
+ method = factory.createMethod(type, proto, name);
+ addProvider(
+ new MethodGenerator(
+ method,
+ BackportedMethods::MathMethods_multiplyFull));
+
// long {Math,StrictMath}.floorDiv(long, int)
name = factory.createString("floorDiv");
proto = factory.createProto(factory.longType, factory.longType, factory.intType);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
index ddfb1c5..80f34d99 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
@@ -3155,6 +3155,26 @@
ImmutableList.of());
}
+ public static CfCode MathMethods_multiplyFull(InternalOptions options, DexMethod method) {
+ CfLabel label0 = new CfLabel();
+ CfLabel label1 = new CfLabel();
+ return new CfCode(
+ method.holder,
+ 4,
+ 2,
+ ImmutableList.of(
+ label0,
+ new CfLoad(ValueType.INT, 0),
+ new CfNumberConversion(NumericType.INT, NumericType.LONG),
+ new CfLoad(ValueType.INT, 1),
+ new CfNumberConversion(NumericType.INT, NumericType.LONG),
+ new CfArithmeticBinop(CfArithmeticBinop.Opcode.Mul, NumericType.LONG),
+ new CfReturn(ValueType.LONG),
+ label1),
+ ImmutableList.of(),
+ ImmutableList.of());
+ }
+
public static CfCode MathMethods_negateExactInt(InternalOptions options, DexMethod method) {
CfLabel label0 = new CfLabel();
CfLabel label1 = new CfLabel();
diff --git a/src/test/examplesJava9/backport/MathBackportJava9Main.java b/src/test/examplesJava9/backport/MathBackportJava9Main.java
index 5eefb65..c465af1 100644
--- a/src/test/examplesJava9/backport/MathBackportJava9Main.java
+++ b/src/test/examplesJava9/backport/MathBackportJava9Main.java
@@ -8,6 +8,7 @@
public static void main(String[] args) {
testMultiplyExactLongInt();
+ testMultiplyFull();
testFloorDivLongInt();
testFloorModLongInt();
}
@@ -26,6 +27,16 @@
}
}
+ public static void testMultiplyFull() {
+ assertEquals(8L, Math.multiplyFull(2, 4));
+ assertEquals(4611686014132420609L,
+ Math.multiplyFull(Integer.MAX_VALUE, Integer.MAX_VALUE));
+ assertEquals(-4611686016279904256L,
+ Math.multiplyFull(Integer.MAX_VALUE, Integer.MIN_VALUE));
+ assertEquals(4611686018427387904L,
+ Math.multiplyFull(Integer.MIN_VALUE, Integer.MIN_VALUE));
+ }
+
public static void testFloorDivLongInt() {
assertEquals(1L, Math.floorDiv(4L, 4));
assertEquals(1L, Math.floorDiv(-4L, -4));
diff --git a/src/test/examplesJava9/backport/StrictMathBackportJava9Main.java b/src/test/examplesJava9/backport/StrictMathBackportJava9Main.java
index b711539..e0e45fb 100644
--- a/src/test/examplesJava9/backport/StrictMathBackportJava9Main.java
+++ b/src/test/examplesJava9/backport/StrictMathBackportJava9Main.java
@@ -8,6 +8,7 @@
public static void main(String[] args) {
testMultiplyExactLongInt();
+ testMultiplyFull();
testFloorDivLongInt();
testFloorModLongInt();
}
@@ -26,6 +27,16 @@
}
}
+ public static void testMultiplyFull() {
+ assertEquals(8L, StrictMath.multiplyFull(2, 4));
+ assertEquals(4611686014132420609L,
+ StrictMath.multiplyFull(Integer.MAX_VALUE, Integer.MAX_VALUE));
+ assertEquals(-4611686016279904256L,
+ StrictMath.multiplyFull(Integer.MAX_VALUE, Integer.MIN_VALUE));
+ assertEquals(4611686018427387904L,
+ StrictMath.multiplyFull(Integer.MIN_VALUE, Integer.MIN_VALUE));
+ }
+
public static void testFloorDivLongInt() {
assertEquals(1L, StrictMath.floorDiv(4L, 4));
assertEquals(1L, StrictMath.floorDiv(-4L, -4));
diff --git a/src/test/java/com/android/tools/r8/ir/desugar/backports/MathMethods.java b/src/test/java/com/android/tools/r8/ir/desugar/backports/MathMethods.java
index 2f112ab..d3379c8 100644
--- a/src/test/java/com/android/tools/r8/ir/desugar/backports/MathMethods.java
+++ b/src/test/java/com/android/tools/r8/ir/desugar/backports/MathMethods.java
@@ -154,6 +154,10 @@
return Math.multiplyExact(x, (long) y);
}
+ public static long multiplyFull(int x, int y) {
+ return (long) x * y;
+ }
+
public static int negateExactInt(int value) {
if (value == Integer.MIN_VALUE) {
throw new ArithmeticException();