-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathlwjgl3_uni_arm_float_workaround.diff
More file actions
39 lines (37 loc) · 2.35 KB
/
Copy pathlwjgl3_uni_arm_float_workaround.diff
File metadata and controls
39 lines (37 loc) · 2.35 KB
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
diff --git a/modules/lwjgl/core/src/main/java/org/lwjgl/system/MemoryUtil.java b/modules/lwjgl/core/src/main/java/org/lwjgl/system/MemoryUtil.java
index 7370e6697f..65dd4e848d 100644
--- a/modules/lwjgl/core/src/main/java/org/lwjgl/system/MemoryUtil.java
+++ b/modules/lwjgl/core/src/main/java/org/lwjgl/system/MemoryUtil.java
@@ -96,6 +96,9 @@ public final class MemoryUtil {
private static final long PARENT_FLOAT;
private static final long PARENT_DOUBLE;
+ // Float accesses on ARM require 4-byte (or 8-byte) alignment, so we need to make some special considerations for this arch to avoid exploding Java.
+ private static final boolean FLOAT_REQUIRES_ALIGNMENT = "arm".equals(System.getProperty("os.arch"));
+
static {
Library.initialize();
@@ -1906,3 +1909,10 @@ static void memCopyAligned32(int src, int dst, int bytes) {
- public static float memGetFloat(long ptr) { return UNSAFE.getFloat(null, ptr); }
- public static double memGetDouble(long ptr) { return UNSAFE.getDouble(null, ptr); }
+ public static float memGetFloat(long ptr) {
+ if(!FLOAT_REQUIRES_ALIGNMENT) return UNSAFE.getFloat(null, ptr);
+ // If an explicitly float access is required, go around and do an unaligned integer access first (which is allowed)
+ else return Float.intBitsToFloat(UNSAFE.getInt(null, ptr));
+ }
+ public static double memGetDouble(long ptr) {
+ if(!FLOAT_REQUIRES_ALIGNMENT) return UNSAFE.getDouble(null, ptr);
+ else return Double.longBitsToDouble(UNSAFE.getLong(null, ptr));
+ }
public static long memGetCLong(long ptr) {
@@ -1924,3 +1934,9 @@ public static long memGetAddress(long ptr) {
- public static void memPutFloat(long ptr, float value) { UNSAFE.putFloat(null, ptr, value); }
- public static void memPutDouble(long ptr, double value) { UNSAFE.putDouble(null, ptr, value); }
+ public static void memPutFloat(long ptr, float value) {
+ if(!FLOAT_REQUIRES_ALIGNMENT) UNSAFE.putFloat(null, ptr, value);
+ else UNSAFE.putInt(null, ptr, Float.floatToRawIntBits(value));
+ }
+ public static void memPutDouble(long ptr, double value) {
+ if(!FLOAT_REQUIRES_ALIGNMENT) UNSAFE.putDouble(null, ptr, value);
+ else UNSAFE.putLong(null, ptr, Double.doubleToRawLongBits(value));
+ }
public static void memPutCLong(long ptr, long value) {