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();