Special case division by small constants
Do the standard reciprocal multiply trick for small division
by small constants.
Change-Id: Iad1060ccdc6ffeb7b47d45c29ba741683ad01ab9
diff --git a/test/003-omnibus-opcodes/src/IntMath.java b/test/003-omnibus-opcodes/src/IntMath.java
index 292fdd3..2e2962a 100644
--- a/test/003-omnibus-opcodes/src/IntMath.java
+++ b/test/003-omnibus-opcodes/src/IntMath.java
@@ -272,6 +272,80 @@
Main.assertTrue(results[7] == 55563);
}
+ /*
+ * Make sure special-cased literal division matches
+ * normal division.
+ */
+ static void divLiteralTestBody(int start, int count) {
+ int normal = 0;
+ int special = 0;
+ for (int i = 0; i < count; i++) {
+ for (int j = 3; j < 16; j++) {
+ switch(j) {
+ case 3:
+ normal = (start+i) / j;
+ special = (start+i) / 3;
+ break;
+ case 4:
+ normal = (start+i) / j;
+ special = (start+i) / 4;
+ break;
+ case 5:
+ normal = (start+i) / j;
+ special = (start+i) / 5;
+ break;
+ case 6:
+ normal = (start+i) / j;
+ special = (start+i) / 6;
+ break;
+ case 7:
+ normal = (start+i) / j;
+ special = (start+i) / 7;
+ break;
+ case 8:
+ normal = (start+i) / j;
+ special = (start+i) / 8;
+ break;
+ case 9:
+ normal = (start+i) / j;
+ special = (start+i) / 9;
+ break;
+ case 10:
+ normal = (start+i) / j;
+ special = (start+i) / 10;
+ break;
+ case 11:
+ normal = (start+i) / j;
+ special = (start+i) / 11;
+ break;
+ case 12:
+ normal = (start+i) / j;
+ special = (start+i) / 12;
+ break;
+ case 13:
+ normal = (start+i) / j;
+ special = (start+i) / 13;
+ break;
+ case 14:
+ normal = (start+i) / j;
+ special = (start+i) / 14;
+ break;
+ case 15:
+ normal = (start+i) / j;
+ special = (start+i) / 15;
+ break;
+ }
+ }
+ Main.assertTrue(normal == special);
+ }
+ }
+
+ static void divLiteralTest() {
+ System.out.println("IntMath.divLiteralTest");
+ divLiteralTestBody(-1000, 2000);
+ divLiteralTestBody(0x7fffffff-2000, 2000);
+ divLiteralTestBody(0xfff0ffff, 2000);
+ }
/*
* Shift some data. (value=0xff00aa01, dist=8)
@@ -518,6 +592,7 @@
lit16Check(intResults);
intResults = lit8Test(-55555);
lit8Check(intResults);
+ divLiteralTest();
intResults = intShiftTest(0xff00aa01, 8);
intShiftCheck(intResults);