From c257560554b96136597a2b59786f4a70e0deb0b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Charaoui?= Date: Wed, 7 Dec 2022 09:29:45 -0500 Subject: [PATCH] Add support for MIPS 32-bit little-endian architecture --- build.xml | 5 +++++ jni/jffi/Foreign.c | 11 +++++++---- src/main/java/com/kenai/jffi/Platform.java | 4 +++- src/main/java/com/kenai/jffi/internal/StubLoader.java | 4 ++++ src/test/java/com/kenai/jffi/NumberTest.java | 5 +++-- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/build.xml b/build.xml index e4788024..cce4a2eb 100644 --- a/build.xml +++ b/build.xml @@ -83,6 +83,11 @@ + + + + + diff --git a/jni/jffi/Foreign.c b/jni/jffi/Foreign.c index dc8bc305..df951350 100644 --- a/jni/jffi/Foreign.c +++ b/jni/jffi/Foreign.c @@ -274,11 +274,14 @@ Java_com_kenai_jffi_Foreign_unregisterNatives(JNIEnv *env, jobject self, jclass #elif defined(__ia64__) || defined(__ia64) # define CPU "ia64" -#elif defined(__mips__) || defined(__mips) || defined(__mips64) -# if defined (__mips64) +#elif defined(__mips64) +# if BYTE_ORDER == LITTLE_ENDIAN # define CPU "mips64el" -# else -# define CPU "mips" +# endif + +#elif defined (__mips__) || defined (__mips) +# if BYTE_ORDER == LITTLE_ENDIAN +# define CPU "mipsel" # endif #elif defined(__s390__) diff --git a/src/main/java/com/kenai/jffi/Platform.java b/src/main/java/com/kenai/jffi/Platform.java index d643f483..c860ea31 100644 --- a/src/main/java/com/kenai/jffi/Platform.java +++ b/src/main/java/com/kenai/jffi/Platform.java @@ -106,7 +106,9 @@ public enum CPU { AARCH64(64), /** LOONGARCH64 */ LOONGARCH64(64), - /** MIPS64EL */ + /** MIPSEL */ + MIPSEL(32), + /** MIPS64EL */ MIPS64EL(64), /** Unknown CPU */ UNKNOWN(64); diff --git a/src/main/java/com/kenai/jffi/internal/StubLoader.java b/src/main/java/com/kenai/jffi/internal/StubLoader.java index 7ce9dc20..3ca1d6d7 100644 --- a/src/main/java/com/kenai/jffi/internal/StubLoader.java +++ b/src/main/java/com/kenai/jffi/internal/StubLoader.java @@ -161,6 +161,8 @@ public enum CPU { AARCH64, /** LOONGARCH64 */ LOONGARCH64, + /** MIPS 32-bit little endian */ + MIPSEL, /** MIPS 64-bit little endian */ MIPS64EL, /** Unknown CPU */ @@ -231,6 +233,8 @@ private static CPU determineCPU() { return CPU.AARCH64; } else if (Util.equalsIgnoreCase("loongarch64", archString, LOCALE)) { return CPU.LOONGARCH64; + } else if (Util.equalsIgnoreCase("mipsel", archString, LOCALE)) { + return CPU.MIPSEL; } else if (Util.equalsIgnoreCase("mips64", archString, LOCALE) || Util.equalsIgnoreCase("mips64el", archString, LOCALE)) { return CPU.MIPS64EL; diff --git a/src/test/java/com/kenai/jffi/NumberTest.java b/src/test/java/com/kenai/jffi/NumberTest.java index d713bc0c..dfa78ecf 100644 --- a/src/test/java/com/kenai/jffi/NumberTest.java +++ b/src/test/java/com/kenai/jffi/NumberTest.java @@ -264,8 +264,9 @@ private void returnF128HighPrecision(InvokerType type) { Assume.assumeFalse("Apple Silicon does not support 80-bit long double", Platform.getPlatform().getOS() == Platform.OS.DARWIN && Platform.getPlatform().getCPU() == Platform.CPU.AARCH64); - Assume.assumeFalse("32-bit ARM does not support 80-bit long double", - Platform.getPlatform().getCPU() == Platform.CPU.ARM); + Assume.assumeFalse("32-bit ARM and MIPSel do not support 80-bit long double", + Platform.getPlatform().getCPU() == Platform.CPU.ARM || + Platform.getPlatform().getCPU() == Platform.CPU.MIPSEL); LibNumberTest lib = UnitHelper.loadTestLibrary(LibNumberTest.class, type); BigDecimal param = new BigDecimal("1.234567890123456789"); BigDecimal result = lib.ret_f128(param);