mirror of
https://github.com/PaperMC/Paper.git
synced 2025-09-02 13:23:50 -07:00
Fix IntegerUtil#getDivisorNumbers
Use unsigned mod operation for initialization of anc Also includes -5a0cefb45e
-acc8ed9634
This commit is contained in:
@@ -3214,7 +3214,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ // copied from hacker's delight (signed division magic value)
|
+ // copied from hacker's delight (signed division magic value)
|
||||||
+ // http://www.hackersdelight.org/hdcodetxt/magic.c.txt
|
+ // http://www.hackersdelight.org/hdcodetxt/magic.c.txt
|
||||||
+ public static long getDivisorNumbers(final int d) {
|
+ public static long getDivisorNumbers(final int d) {
|
||||||
+ final int ad = IntegerUtil.branchlessAbs(d);
|
+ final int ad = branchlessAbs(d);
|
||||||
+
|
+
|
||||||
+ if (ad < 2) {
|
+ if (ad < 2) {
|
||||||
+ throw new IllegalArgumentException("|number| must be in [2, 2^31 -1], not: " + d);
|
+ throw new IllegalArgumentException("|number| must be in [2, 2^31 -1], not: " + d);
|
||||||
@@ -3223,11 +3223,27 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ final int two31 = 0x80000000;
|
+ final int two31 = 0x80000000;
|
||||||
+ final long mask = 0xFFFFFFFFL; // mask for enforcing unsigned behaviour
|
+ final long mask = 0xFFFFFFFFL; // mask for enforcing unsigned behaviour
|
||||||
+
|
+
|
||||||
|
+ /*
|
||||||
|
+ Signed usage:
|
||||||
|
+ int number;
|
||||||
|
+ long magic = getDivisorNumbers(div);
|
||||||
|
+ long mul = magic >>> 32;
|
||||||
|
+ int sign = number >> 31;
|
||||||
|
+ int result = (int)(((long)number * mul) >>> magic) - sign;
|
||||||
|
+ */
|
||||||
|
+ /*
|
||||||
|
+ Unsigned usage:
|
||||||
|
+ int number;
|
||||||
|
+ long magic = getDivisorNumbers(div);
|
||||||
|
+ long mul = magic >>> 32;
|
||||||
|
+ int result = (int)(((long)number * mul) >>> magic);
|
||||||
|
+ */
|
||||||
|
+
|
||||||
+ int p = 31;
|
+ int p = 31;
|
||||||
+
|
+
|
||||||
+ // all these variables are UNSIGNED!
|
+ // all these variables are UNSIGNED!
|
||||||
+ int t = two31 + (d >>> 31);
|
+ int t = two31 + (d >>> 31);
|
||||||
+ int anc = t - 1 - t%ad;
|
+ int anc = t - 1 - (int)((t & mask)%ad);
|
||||||
+ int q1 = (int)((two31 & mask)/(anc & mask));
|
+ int q1 = (int)((two31 & mask)/(anc & mask));
|
||||||
+ int r1 = two31 - q1*anc;
|
+ int r1 = two31 - q1*anc;
|
||||||
+ int q2 = (int)((two31 & mask)/(ad & mask));
|
+ int q2 = (int)((two31 & mask)/(ad & mask));
|
||||||
@@ -3255,7 +3271,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ if (d < 0) {
|
+ if (d < 0) {
|
||||||
+ magicNum = -magicNum;
|
+ magicNum = -magicNum;
|
||||||
+ }
|
+ }
|
||||||
+ int shift = p - 32;
|
+ int shift = p;
|
||||||
+ return ((long)magicNum << 32) | shift;
|
+ return ((long)magicNum << 32) | shift;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
@@ -1055,6 +1055,9 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ public static final int V1_20_PRE6 = 3460;
|
+ public static final int V1_20_PRE6 = 3460;
|
||||||
+ public static final int V1_20_PRE7 = 3461;
|
+ public static final int V1_20_PRE7 = 3461;
|
||||||
+ public static final int V1_20_RC1 = 3462;
|
+ public static final int V1_20_RC1 = 3462;
|
||||||
|
+ public static final int V1_20 = 3463;
|
||||||
|
+ public static final int V1_20_1_RC1 = 3464;
|
||||||
|
+ public static final int V1_20_1 = 3465;
|
||||||
+
|
+
|
||||||
+}
|
+}
|
||||||
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java
|
diff --git a/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java b/src/main/java/ca/spottedleaf/dataconverter/minecraft/converters/advancements/ConverterAbstractAdvancementsRename.java
|
||||||
@@ -23373,7 +23376,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ public static long getDivisorNumbers(final int d) {
|
+ public static long getDivisorNumbers(final int d) {
|
||||||
+ final int ad = Math.abs(d);
|
+ final int ad = branchlessAbs(d);
|
||||||
+
|
+
|
||||||
+ if (ad < 2) {
|
+ if (ad < 2) {
|
||||||
+ throw new IllegalArgumentException("|number| must be in [2, 2^31 -1], not: " + d);
|
+ throw new IllegalArgumentException("|number| must be in [2, 2^31 -1], not: " + d);
|
||||||
@@ -23382,6 +23385,22 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ final int two31 = 0x80000000;
|
+ final int two31 = 0x80000000;
|
||||||
+ final long mask = 0xFFFFFFFFL; // mask for enforcing unsigned behaviour
|
+ final long mask = 0xFFFFFFFFL; // mask for enforcing unsigned behaviour
|
||||||
+
|
+
|
||||||
|
+ /*
|
||||||
|
+ Signed usage:
|
||||||
|
+ int number;
|
||||||
|
+ long magic = getDivisorNumbers(div);
|
||||||
|
+ long mul = magic >>> 32;
|
||||||
|
+ int sign = number >> 31;
|
||||||
|
+ int result = (int)(((long)number * mul) >>> magic) - sign;
|
||||||
|
+ */
|
||||||
|
+ /*
|
||||||
|
+ Unsigned usage:
|
||||||
|
+ int number;
|
||||||
|
+ long magic = getDivisorNumbers(div);
|
||||||
|
+ long mul = magic >>> 32;
|
||||||
|
+ int result = (int)(((long)number * mul) >>> magic);
|
||||||
|
+ */
|
||||||
|
+
|
||||||
+ int p = 31;
|
+ int p = 31;
|
||||||
+
|
+
|
||||||
+ // all these variables are UNSIGNED!
|
+ // all these variables are UNSIGNED!
|
||||||
@@ -23414,7 +23433,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ if (d < 0) {
|
+ if (d < 0) {
|
||||||
+ magicNum = -magicNum;
|
+ magicNum = -magicNum;
|
||||||
+ }
|
+ }
|
||||||
+ int shift = p - 32;
|
+ int shift = p;
|
||||||
+ return ((long)magicNum << 32) | shift;
|
+ return ((long)magicNum << 32) | shift;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
@@ -3951,7 +3951,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ // copied from hacker's delight (signed division magic value)
|
+ // copied from hacker's delight (signed division magic value)
|
||||||
+ // http://www.hackersdelight.org/hdcodetxt/magic.c.txt
|
+ // http://www.hackersdelight.org/hdcodetxt/magic.c.txt
|
||||||
+ public static long getDivisorNumbers(final int d) {
|
+ public static long getDivisorNumbers(final int d) {
|
||||||
+ final int ad = IntegerUtil.branchlessAbs(d);
|
+ final int ad = branchlessAbs(d);
|
||||||
+
|
+
|
||||||
+ if (ad < 2) {
|
+ if (ad < 2) {
|
||||||
+ throw new IllegalArgumentException("|number| must be in [2, 2^31 -1], not: " + d);
|
+ throw new IllegalArgumentException("|number| must be in [2, 2^31 -1], not: " + d);
|
||||||
@@ -3960,11 +3960,27 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ final int two31 = 0x80000000;
|
+ final int two31 = 0x80000000;
|
||||||
+ final long mask = 0xFFFFFFFFL; // mask for enforcing unsigned behaviour
|
+ final long mask = 0xFFFFFFFFL; // mask for enforcing unsigned behaviour
|
||||||
+
|
+
|
||||||
|
+ /*
|
||||||
|
+ Signed usage:
|
||||||
|
+ int number;
|
||||||
|
+ long magic = getDivisorNumbers(div);
|
||||||
|
+ long mul = magic >>> 32;
|
||||||
|
+ int sign = number >> 31;
|
||||||
|
+ int result = (int)(((long)number * mul) >>> magic) - sign;
|
||||||
|
+ */
|
||||||
|
+ /*
|
||||||
|
+ Unsigned usage:
|
||||||
|
+ int number;
|
||||||
|
+ long magic = getDivisorNumbers(div);
|
||||||
|
+ long mul = magic >>> 32;
|
||||||
|
+ int result = (int)(((long)number * mul) >>> magic);
|
||||||
|
+ */
|
||||||
|
+
|
||||||
+ int p = 31;
|
+ int p = 31;
|
||||||
+
|
+
|
||||||
+ // all these variables are UNSIGNED!
|
+ // all these variables are UNSIGNED!
|
||||||
+ int t = two31 + (d >>> 31);
|
+ int t = two31 + (d >>> 31);
|
||||||
+ int anc = t - 1 - t%ad;
|
+ int anc = t - 1 - (int)((t & mask)%ad);
|
||||||
+ int q1 = (int)((two31 & mask)/(anc & mask));
|
+ int q1 = (int)((two31 & mask)/(anc & mask));
|
||||||
+ int r1 = two31 - q1*anc;
|
+ int r1 = two31 - q1*anc;
|
||||||
+ int q2 = (int)((two31 & mask)/(ad & mask));
|
+ int q2 = (int)((two31 & mask)/(ad & mask));
|
||||||
@@ -3992,7 +4008,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
|
|||||||
+ if (d < 0) {
|
+ if (d < 0) {
|
||||||
+ magicNum = -magicNum;
|
+ magicNum = -magicNum;
|
||||||
+ }
|
+ }
|
||||||
+ int shift = p - 32;
|
+ int shift = p;
|
||||||
+ return ((long)magicNum << 32) | shift;
|
+ return ((long)magicNum << 32) | shift;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
|
Reference in New Issue
Block a user