535 } 536 537 private static long umulHigh(long a, long b, int bits) { 538 Assert.assertTrue(bits == 32 || bits == 64); 539 BigInteger valA = BigInteger.valueOf(a); 540 if (valA.compareTo(BigInteger.valueOf(0)) < 0) { 541 valA = valA.add(BigInteger.ONE.shiftLeft(bits)); 542 } 543 BigInteger valB = BigInteger.valueOf(b); 544 if (valB.compareTo(BigInteger.valueOf(0)) < 0) { 545 valB = valB.add(BigInteger.ONE.shiftLeft(bits)); 546 } 547 548 BigInteger result = valA.multiply(valB).shiftRight(bits); 549 if (bits == 32) { 550 return result.intValue(); 551 } else { 552 return result.longValue(); 553 } 554 } 555 } | 535 } 536 537 private static long umulHigh(long a, long b, int bits) { 538 Assert.assertTrue(bits == 32 || bits == 64); 539 BigInteger valA = BigInteger.valueOf(a); 540 if (valA.compareTo(BigInteger.valueOf(0)) < 0) { 541 valA = valA.add(BigInteger.ONE.shiftLeft(bits)); 542 } 543 BigInteger valB = BigInteger.valueOf(b); 544 if (valB.compareTo(BigInteger.valueOf(0)) < 0) { 545 valB = valB.add(BigInteger.ONE.shiftLeft(bits)); 546 } 547 548 BigInteger result = valA.multiply(valB).shiftRight(bits); 549 if (bits == 32) { 550 return result.intValue(); 551 } else { 552 return result.longValue(); 553 } 554 } 555 556 @Test 557 public void testDiv() { 558 testDiv(32, Integer.MIN_VALUE, Integer.MAX_VALUE); 559 testDiv(64, Long.MIN_VALUE, Long.MAX_VALUE); 560 } 561 562 private static void testDiv(int bits, long min, long max) { 563 BinaryOp<?> div = IntegerStamp.OPS.getDiv(); 564 assertEquals(IntegerStamp.create(bits, -50, 50), div.foldStamp(IntegerStamp.create(bits, -100, 100), IntegerStamp.create(bits, 2, 5))); 565 assertEquals(IntegerStamp.create(bits, 20, 500), div.foldStamp(IntegerStamp.create(bits, 100, 1000), IntegerStamp.create(bits, 2, 5))); 566 assertEquals(IntegerStamp.create(bits, -500, -20), div.foldStamp(IntegerStamp.create(bits, -1000, -100), IntegerStamp.create(bits, 2, 5))); 567 assertEquals(IntegerStamp.create(bits, min, max), div.foldStamp(IntegerStamp.create(bits, min, max), IntegerStamp.create(bits, 1, max))); 568 assertEquals(IntegerStamp.create(bits, -100, 100), div.foldStamp(IntegerStamp.create(bits, -100, 100), IntegerStamp.create(bits, 1, max))); 569 assertEquals(IntegerStamp.create(bits, 0, 1000), div.foldStamp(IntegerStamp.create(bits, 100, 1000), IntegerStamp.create(bits, 1, max))); 570 assertEquals(IntegerStamp.create(bits, -1000, 0), div.foldStamp(IntegerStamp.create(bits, -1000, -100), IntegerStamp.create(bits, 1, max))); 571 } 572 } |