aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0504-Optimize-Bit-Operations-by-inlining.patch
blob: cd3a9824d514b8b8ac83f663adf9461e750bc5fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
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 0d3a57900dc0bf5bc9729a3661a32da4e7ea1f33..a2ee39b7efca0851bca8dc0ec1c13fe3cada6b3f 100644
--- a/src/main/java/net/minecraft/server/BlockPosition.java
+++ b/src/main/java/net/minecraft/server/BlockPosition.java
@@ -24,14 +24,16 @@ public class BlockPosition extends BaseBlockPosition {
     }).stable();
     private static final Logger LOGGER = LogManager.getLogger();
     public static final BlockPosition ZERO = new BlockPosition(0, 0, 0);
-    private static final int f = 1 + MathHelper.f(MathHelper.c(30000000));
-    private static final int g = BlockPosition.f;
-    private static final int h = 64 - BlockPosition.f - BlockPosition.g;
-    private static final long i = (1L << BlockPosition.f) - 1L;
-    private static final long j = (1L << BlockPosition.h) - 1L;
-    private static final long k = (1L << BlockPosition.g) - 1L;
-    private static final int l = BlockPosition.h;
-    private static final int m = BlockPosition.h + BlockPosition.g;
+    // Paper start - static constants
+    private static final int f = 26;
+    private static final int g = 26;
+    private static final int h = 12;
+    private static final long i = 67108863;
+    private static final long j = 4095;
+    private static final long k = 67108863;
+    private static final int l = 12;
+    private static final int m = 38;
+    // Paper end
 
     public BlockPosition(int i, int j, int k) {
         super(i, j, k);
@@ -53,28 +55,29 @@ public class BlockPosition extends BaseBlockPosition {
         this(baseblockposition.getX(), baseblockposition.getY(), baseblockposition.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.m - BlockPosition.f >> 64 - BlockPosition.f);
+        return (int) (i >> 38); // Paper - simplify/inline
     }
 
     public static int c(long i) {
-        return (int) (i << 64 - BlockPosition.h >> 64 - BlockPosition.h);
+        return (int) ((i << 52) >> 52); // Paper - simplify/inline
     }
 
     public static int d(long i) {
-        return (int) (i << 64 - BlockPosition.l - BlockPosition.g >> 64 - BlockPosition.g);
+        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 long asLong() {
@@ -83,12 +86,7 @@ public class BlockPosition extends BaseBlockPosition {
 
     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.i) << BlockPosition.m;
-        l |= ((long) j & BlockPosition.j) << 0;
-        l |= ((long) k & BlockPosition.k) << BlockPosition.l;
-        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 6a8597c585e74ebea2e8bac2f9965f8760e19b67..7806f3c351cba3f0388da11888f900c48004dadf 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,15 +28,23 @@ 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) {
         return a(i, enumdirection.getAdjacentX(), enumdirection.getAdjacentY(), enumdirection.getAdjacentZ());
     }
 
+    // Paper start
+    public static long getAdjacentFromBlockPos(int x, int y, int z, EnumDirection enumdirection) {
+        return (((long) ((x >> 4) + enumdirection.getAdjacentX()) & 4194303L) << 42) | (((long) ((y >> 4) + enumdirection.getAdjacentY()) & 1048575L)) | (((long) ((z >> 4) + enumdirection.getAdjacentZ()) & 4194303L) << 20);
+    }
+    public static long getAdjacentFromSectionPos(int x, int y, int z, EnumDirection enumdirection) {
+        return (((long) (x + enumdirection.getAdjacentX()) & 4194303L) << 42) | (((long) ((y) + enumdirection.getAdjacentY()) & 1048575L)) | (((long) (z + enumdirection.getAdjacentZ()) & 4194303L) << 20);
+    }
+    // Paper end
     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 +56,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.getX() & 15) << 8 | (blockposition.getZ() & 15) << 4 | blockposition.getY() & 15); // Paper - simplify/inline
     }
 
     public static int c(int i) {
@@ -83,16 +87,16 @@ public class SectionPosition extends BaseBlockPosition {
         return this.getZ();
     }
 
-    public int d() {
-        return this.a() << 4;
+    public final int d() { // Paper
+        return this.getX() << 4; // Paper
     }
 
-    public int e() {
-        return this.b() << 4;
+    public final int e() { // Paper
+        return this.getY() << 4; // Paper
     }
 
-    public int f() {
-        return this.c() << 4;
+    public final int f() { // Paper
+        return this.getZ() << 4; // Paper
     }
 
     public int g() {
@@ -107,8 +111,10 @@ public class SectionPosition extends BaseBlockPosition {
         return (this.c() << 4) + 15;
     }
 
+    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) {
@@ -129,17 +135,18 @@ 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 s() {
-        return b(this.a(), this.b(), this.c());
+        return (((long) getX() & 4194303L) << 42) | (((long) getY() & 1048575L)) | (((long) getZ() & 4194303L) << 20); // Paper - Simplify to reduce instruction count
     }
 
     public Stream<BlockPosition> t() {
@@ -147,18 +154,11 @@ public class SectionPosition extends BaseBlockPosition {
     }
 
     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.getX() - i, sectionposition.getY() - i, sectionposition.getZ() - i, sectionposition.getX() + i, sectionposition.getY() + i, sectionposition.getZ() + 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) {