diff --git a/src/test/examplesJava9/backport/StrictMathBackportJava9Main.java b/src/test/examplesJava9/backport/StrictMathBackportJava9Main.java
new file mode 100644
index 0000000..b711539
--- /dev/null
+++ b/src/test/examplesJava9/backport/StrictMathBackportJava9Main.java
@@ -0,0 +1,67 @@
+// Copyright (c) 2019, the R8 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.
+
+package backport;
+
+public class StrictMathBackportJava9Main {
+
+  public static void main(String[] args) {
+    testMultiplyExactLongInt();
+    testFloorDivLongInt();
+    testFloorModLongInt();
+  }
+
+  public static void testMultiplyExactLongInt() {
+    assertEquals(8L, StrictMath.multiplyExact(2L, 4));
+    assertEquals(Long.MAX_VALUE, StrictMath.multiplyExact(Long.MAX_VALUE, 1));
+    assertEquals(Long.MIN_VALUE, StrictMath.multiplyExact(Long.MIN_VALUE / 2L, 2));
+    try {
+      throw new AssertionError(StrictMath.multiplyExact(Long.MAX_VALUE, 2));
+    } catch (ArithmeticException expected) {
+    }
+    try {
+      throw new AssertionError(StrictMath.multiplyExact(Long.MIN_VALUE, 2));
+    } catch (ArithmeticException expected) {
+    }
+  }
+
+  public static void testFloorDivLongInt() {
+    assertEquals(1L, StrictMath.floorDiv(4L, 4));
+    assertEquals(1L, StrictMath.floorDiv(-4L, -4));
+    assertEquals(-1L, StrictMath.floorDiv(-4L, 4));
+    assertEquals(-1L, StrictMath.floorDiv(4L, -4));
+
+    assertEquals(1L, StrictMath.floorDiv(4L, 3));
+    assertEquals(1L, StrictMath.floorDiv(-4L, -3));
+    assertEquals(-2L, StrictMath.floorDiv(-4L, 3));
+    assertEquals(-2L, StrictMath.floorDiv(4L, -3));
+
+    // Spec edge case: result is actually MAX_VALUE+1 which becomes MIN_VALUE.
+    assertEquals(Long.MIN_VALUE, StrictMath.floorDiv(Long.MIN_VALUE, -1));
+  }
+
+  public static void testFloorModLongInt() {
+    assertEquals(0, StrictMath.floorMod(4L, 4));
+    assertEquals(0, StrictMath.floorMod(-4L, -4));
+    assertEquals(0, StrictMath.floorMod(-4L, 4));
+    assertEquals(0, StrictMath.floorMod(4L, -4));
+
+    assertEquals(1, StrictMath.floorMod(4L, 3));
+    assertEquals(-1, StrictMath.floorMod(-4L, -3));
+    assertEquals(2, StrictMath.floorMod(-4L, 3));
+    assertEquals(-2, StrictMath.floorMod(4L, -3));
+  }
+
+  private static void assertEquals(int expected, int actual) {
+    if (expected != actual) {
+      throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>');
+    }
+  }
+
+  private static void assertEquals(long expected, long actual) {
+    if (expected != actual) {
+      throw new AssertionError("Expected <" + expected + "> but was <" + actual + '>');
+    }
+  }
+}
