235 lines
9.6 KiB
Diff
235 lines
9.6 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Aikar <aikar@aikar.co>
|
||
|
Date: Thu, 4 Jun 2020 02:24:49 -0400
|
||
|
Subject: [PATCH] Optimize Bit Operations by inlining
|
||
|
|
||
|
Inline bit operations and reduce instruction count to make these hot
|
||
|
operations faster
|
||
|
|
||
|
diff --git a/src/main/java/net/minecraft/server/BlockPosition.java b/src/main/java/net/minecraft/server/BlockPosition.java
|
||
|
index 3bf17ccdaef21322b787db538d569e0bc614ef22..4c64798fbc50f4d8b08502ba865c5fde5c968e62 100644
|
||
|
--- a/src/main/java/net/minecraft/server/BlockPosition.java
|
||
|
+++ b/src/main/java/net/minecraft/server/BlockPosition.java
|
||
|
@@ -75,38 +75,34 @@ public class BlockPosition extends BaseBlockPosition implements MinecraftSeriali
|
||
|
return dynamicops.createIntList(IntStream.of(new int[]{this.getX(), this.getY(), this.getZ()}));
|
||
|
}
|
||
|
|
||
|
+ public static long getAdjacent(int baseX, int baseY, int baseZ, EnumDirection enumdirection) { return asLong(baseX + enumdirection.getAdjacentX(), baseY + enumdirection.getAdjacentY(), baseZ + enumdirection.getAdjacentZ()); } // Paper
|
||
|
public static long a(long i, EnumDirection enumdirection) {
|
||
|
return a(i, enumdirection.getAdjacentX(), enumdirection.getAdjacentY(), enumdirection.getAdjacentZ());
|
||
|
}
|
||
|
|
||
|
public static long a(long i, int j, int k, int l) {
|
||
|
- return a(b(i) + j, c(i) + k, d(i) + l);
|
||
|
+ return a((int) (i >> 38) + j, (int) ((i << 52) >> 52) + k, (int) ((i << 26) >> 38) + l); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static int b(long i) {
|
||
|
- return (int) (i << 64 - BlockPosition.k - BlockPosition.c >> 64 - BlockPosition.c);
|
||
|
+ return (int) (i >> 38); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static int c(long i) {
|
||
|
- return (int) (i << 64 - BlockPosition.f >> 64 - BlockPosition.f);
|
||
|
+ return (int) ((i << 52) >> 52); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static int d(long i) {
|
||
|
- return (int) (i << 64 - BlockPosition.j - BlockPosition.d >> 64 - BlockPosition.d);
|
||
|
+ return (int) ((i << 26) >> 38); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static BlockPosition fromLong(long i) {
|
||
|
- return new BlockPosition(b(i), c(i), d(i));
|
||
|
+ return new BlockPosition((int) (i >> 38), (int) ((i << 52) >> 52), (int) ((i << 26) >> 38)); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static long asLong(int x, int y, int z) { return a(x, y, z); } // Paper - OBFHELPER
|
||
|
public static long a(int i, int j, int k) {
|
||
|
- long l = 0L;
|
||
|
-
|
||
|
- l |= ((long) i & BlockPosition.g) << BlockPosition.k;
|
||
|
- l |= ((long) j & BlockPosition.h) << 0;
|
||
|
- l |= ((long) k & BlockPosition.i) << BlockPosition.j;
|
||
|
- return l;
|
||
|
+ return (((long) i & (long) 67108863) << 38) | (((long) j & (long) 4095)) | (((long) k & (long) 67108863) << 12); // Paper - inline constants and simplify
|
||
|
}
|
||
|
|
||
|
public static long f(long i) {
|
||
|
diff --git a/src/main/java/net/minecraft/server/SectionPosition.java b/src/main/java/net/minecraft/server/SectionPosition.java
|
||
|
index ca3f63f5e5e4e926de562b4bfbbf72ad8a6b943f..c415736282de6d4d0f87135c24999c4bbf993901 100644
|
||
|
--- a/src/main/java/net/minecraft/server/SectionPosition.java
|
||
|
+++ b/src/main/java/net/minecraft/server/SectionPosition.java
|
||
|
@@ -16,7 +16,7 @@ public class SectionPosition extends BaseBlockPosition {
|
||
|
}
|
||
|
|
||
|
public static SectionPosition a(BlockPosition blockposition) {
|
||
|
- return new SectionPosition(a(blockposition.getX()), a(blockposition.getY()), a(blockposition.getZ()));
|
||
|
+ return new SectionPosition(blockposition.getX() >> 4, blockposition.getY() >> 4, blockposition.getZ() >> 4); // Paper
|
||
|
}
|
||
|
|
||
|
public static SectionPosition a(ChunkCoordIntPair chunkcoordintpair, int i) {
|
||
|
@@ -28,7 +28,7 @@ public class SectionPosition extends BaseBlockPosition {
|
||
|
}
|
||
|
|
||
|
public static SectionPosition a(long i) {
|
||
|
- return new SectionPosition(b(i), c(i), d(i));
|
||
|
+ return new SectionPosition((int) (i >> 42), (int) (i << 44 >> 44), (int) (i << 22 >> 42)); // Paper
|
||
|
}
|
||
|
|
||
|
public static long a(long i, EnumDirection enumdirection) {
|
||
|
@@ -36,7 +36,7 @@ public class SectionPosition extends BaseBlockPosition {
|
||
|
}
|
||
|
|
||
|
public static long a(long i, int j, int k, int l) {
|
||
|
- return b(b(i) + j, c(i) + k, d(i) + l);
|
||
|
+ return (((long) ((int) (i >> 42) + j) & 4194303L) << 42) | (((long) ((int) (i << 44 >> 44) + k) & 1048575L)) | (((long) ((int) (i << 22 >> 42) + l) & 4194303L) << 20); // Simplify to reduce instruction count
|
||
|
}
|
||
|
|
||
|
public static int a(int i) {
|
||
|
@@ -48,11 +48,7 @@ public class SectionPosition extends BaseBlockPosition {
|
||
|
}
|
||
|
|
||
|
public static short b(BlockPosition blockposition) {
|
||
|
- int i = b(blockposition.getX());
|
||
|
- int j = b(blockposition.getY());
|
||
|
- int k = b(blockposition.getZ());
|
||
|
-
|
||
|
- return (short) (i << 8 | k << 4 | j);
|
||
|
+ return (short) ((blockposition.x & 15) << 8 | (blockposition.z & 15) << 4 | blockposition.y & 15); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static int c(int i) {
|
||
|
@@ -60,7 +56,7 @@ public class SectionPosition extends BaseBlockPosition {
|
||
|
}
|
||
|
|
||
|
public static int b(long i) {
|
||
|
- return (int) (i << 0 >> 42);
|
||
|
+ return (int) (i >> 42); // Paper
|
||
|
}
|
||
|
|
||
|
public static int c(long i) {
|
||
|
@@ -71,44 +67,46 @@ public class SectionPosition extends BaseBlockPosition {
|
||
|
return (int) (i << 22 >> 42);
|
||
|
}
|
||
|
|
||
|
- public int a() {
|
||
|
- return this.getX();
|
||
|
+ public final int a() { // Paper
|
||
|
+ return x; // Paper
|
||
|
}
|
||
|
|
||
|
- public int b() {
|
||
|
- return this.getY();
|
||
|
+ public final int b() { // Paper
|
||
|
+ return y; // Paper
|
||
|
}
|
||
|
|
||
|
- public int c() {
|
||
|
- return this.getZ();
|
||
|
+ public final int c() { // Paper
|
||
|
+ return z; // Paper
|
||
|
}
|
||
|
|
||
|
- public int d() {
|
||
|
- return this.a() << 4;
|
||
|
+ public final int d() { // Paper
|
||
|
+ return x << 4; // Paper
|
||
|
}
|
||
|
|
||
|
- public int e() {
|
||
|
- return this.b() << 4;
|
||
|
+ public final int e() { // Paper
|
||
|
+ return y << 4; // Paper
|
||
|
}
|
||
|
|
||
|
- public int f() {
|
||
|
- return this.c() << 4;
|
||
|
+ public final int f() { // Paper
|
||
|
+ return z << 4; // Paper
|
||
|
}
|
||
|
|
||
|
- public int g() {
|
||
|
- return (this.a() << 4) + 15;
|
||
|
+ public final int g() { // Paper
|
||
|
+ return (x << 4) + 15; // Paper
|
||
|
}
|
||
|
|
||
|
- public int h() {
|
||
|
- return (this.b() << 4) + 15;
|
||
|
+ public final int h() { // Paper
|
||
|
+ return (y << 4) + 15; // Paper
|
||
|
}
|
||
|
|
||
|
- public int r() {
|
||
|
- return (this.c() << 4) + 15;
|
||
|
+ public final int r() { // Paper
|
||
|
+ return (z << 4) + 15; // Paper
|
||
|
}
|
||
|
|
||
|
+ public static long blockToSection(long i) { return e(i); } // Paper - OBFHELPER
|
||
|
public static long e(long i) {
|
||
|
- return b(a(BlockPosition.b(i)), a(BlockPosition.c(i)), a(BlockPosition.d(i)));
|
||
|
+ // b(a(BlockPosition.b(i)), a(BlockPosition.c(i)), a(BlockPosition.d(i)));
|
||
|
+ return (((long) (int) (i >> 42) & 4194303L) << 42) | (((long) (int) ((i << 52) >> 56) & 1048575L)) | (((long) (int) ((i << 26) >> 42) & 4194303L) << 20); // Simplify to reduce instruction count
|
||
|
}
|
||
|
|
||
|
public static long f(long i) {
|
||
|
@@ -116,7 +114,7 @@ public class SectionPosition extends BaseBlockPosition {
|
||
|
}
|
||
|
|
||
|
public BlockPosition s() {
|
||
|
- return new BlockPosition(c(this.a()), c(this.b()), c(this.c()));
|
||
|
+ return new BlockPosition(x << 4, y << 4, z << 4); // Paper
|
||
|
}
|
||
|
|
||
|
public BlockPosition t() {
|
||
|
@@ -129,36 +127,30 @@ public class SectionPosition extends BaseBlockPosition {
|
||
|
return new ChunkCoordIntPair(this.a(), this.c());
|
||
|
}
|
||
|
|
||
|
+ // Paper start
|
||
|
+ public static long blockPosAsSectionLong(int i, int j, int k) {
|
||
|
+ return (((long) (i >> 4) & 4194303L) << 42) | (((long) (j >> 4) & 1048575L)) | (((long) (k >> 4) & 4194303L) << 20);
|
||
|
+ }
|
||
|
+ // Paper end
|
||
|
+ public static long asLong(int i, int j, int k) { return b(i, j, k); } // Paper - OBFHELPER
|
||
|
public static long b(int i, int j, int k) {
|
||
|
- long l = 0L;
|
||
|
-
|
||
|
- l |= ((long) i & 4194303L) << 42;
|
||
|
- l |= ((long) j & 1048575L) << 0;
|
||
|
- l |= ((long) k & 4194303L) << 20;
|
||
|
- return l;
|
||
|
+ return (((long) i & 4194303L) << 42) | (((long) j & 1048575L)) | (((long) k & 4194303L) << 20); // Paper - Simplify to reduce instruction count
|
||
|
}
|
||
|
|
||
|
public long v() {
|
||
|
- return b(this.a(), this.b(), this.c());
|
||
|
+ return (((long) x & 4194303L) << 42) | (((long) y & 1048575L)) | (((long) z & 4194303L) << 20); // Paper - Simplify to reduce instruction count
|
||
|
}
|
||
|
|
||
|
public Stream<BlockPosition> w() {
|
||
|
- return BlockPosition.a(this.d(), this.e(), this.f(), this.g(), this.h(), this.r());
|
||
|
+ return BlockPosition.a(x << 4, y << 4, z << 4, (x << 4) + 15, (y << 4) + 15, (z << 4) + 15); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static Stream<SectionPosition> a(SectionPosition sectionposition, int i) {
|
||
|
- int j = sectionposition.a();
|
||
|
- int k = sectionposition.b();
|
||
|
- int l = sectionposition.c();
|
||
|
-
|
||
|
- return a(j - i, k - i, l - i, j + i, k + i, l + i);
|
||
|
+ return a(sectionposition.x - i, sectionposition.y - i, sectionposition.z - i, sectionposition.x + i, sectionposition.y + i, sectionposition.z + i); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static Stream<SectionPosition> b(ChunkCoordIntPair chunkcoordintpair, int i) {
|
||
|
- int j = chunkcoordintpair.x;
|
||
|
- int k = chunkcoordintpair.z;
|
||
|
-
|
||
|
- return a(j - i, 0, k - i, j + i, 15, k + i);
|
||
|
+ return a(chunkcoordintpair.x - i, 0, chunkcoordintpair.z - i, chunkcoordintpair.x + i, 15, chunkcoordintpair.z + i); // Paper - simplify/inline
|
||
|
}
|
||
|
|
||
|
public static Stream<SectionPosition> a(final int i, final int j, final int k, final int l, final int i1, final int j1) {
|