diff --git a/aot/src/main/java/com/dylibso/chicory/aot/AotUtil.java b/aot/src/main/java/com/dylibso/chicory/aot/AotUtil.java index fe9dc0c72..2df3ef63f 100644 --- a/aot/src/main/java/com/dylibso/chicory/aot/AotUtil.java +++ b/aot/src/main/java/com/dylibso/chicory/aot/AotUtil.java @@ -1,6 +1,7 @@ package com.dylibso.chicory.aot; import static com.dylibso.chicory.wasm.types.Value.REF_NULL_VALUE; +import static java.lang.invoke.MethodHandles.identity; import static java.lang.invoke.MethodHandles.publicLookup; import static java.lang.invoke.MethodType.methodType; import static org.objectweb.asm.Type.getInternalName; @@ -29,39 +30,31 @@ public enum StackSize { } private static final Method LONG_TO_I32; - private static final Method LONG_TO_I64; private static final Method LONG_TO_F32; private static final Method LONG_TO_F64; private static final Method I32_TO_LONG; - private static final Method I64_TO_LONG; private static final Method F32_TO_LONG; private static final Method F64_TO_LONG; private static final MethodHandle LONG_TO_I32_MH; - private static final MethodHandle LONG_TO_I64_MH; private static final MethodHandle LONG_TO_F32_MH; private static final MethodHandle LONG_TO_F64_MH; private static final MethodHandle I32_TO_LONG_MH; - private static final MethodHandle I64_TO_LONG_MH; private static final MethodHandle F32_TO_LONG_MH; private static final MethodHandle F64_TO_LONG_MH; static { try { LONG_TO_I32 = ValueConversions.class.getMethod("longToI32", long.class); - LONG_TO_I64 = ValueConversions.class.getMethod("longToI64", long.class); LONG_TO_F32 = ValueConversions.class.getMethod("longToF32", long.class); LONG_TO_F64 = ValueConversions.class.getMethod("longToF64", long.class); I32_TO_LONG = ValueConversions.class.getMethod("i32ToLong", int.class); - I64_TO_LONG = ValueConversions.class.getMethod("i64ToLong", long.class); F32_TO_LONG = ValueConversions.class.getMethod("f32ToLong", float.class); F64_TO_LONG = ValueConversions.class.getMethod("f64ToLong", double.class); LONG_TO_I32_MH = publicLookup().unreflect(LONG_TO_I32); - LONG_TO_I64_MH = publicLookup().unreflect(LONG_TO_I64); LONG_TO_F32_MH = publicLookup().unreflect(LONG_TO_F32); LONG_TO_F64_MH = publicLookup().unreflect(LONG_TO_F64); I32_TO_LONG_MH = publicLookup().unreflect(I32_TO_LONG); - I64_TO_LONG_MH = publicLookup().unreflect(I64_TO_LONG); F32_TO_LONG_MH = publicLookup().unreflect(F32_TO_LONG); F64_TO_LONG_MH = publicLookup().unreflect(F64_TO_LONG); } catch (NoSuchMethodException e) { @@ -196,7 +189,7 @@ public static MethodHandle jvmToLongHandle(ValueType type) { case FuncRef: return I32_TO_LONG_MH; case I64: - return I64_TO_LONG_MH; + return identity(long.class); case F32: return F32_TO_LONG_MH; case F64: diff --git a/aot/src/main/java/com/dylibso/chicory/aot/ValueConversions.java b/aot/src/main/java/com/dylibso/chicory/aot/ValueConversions.java index f4967a036..16d176cf9 100644 --- a/aot/src/main/java/com/dylibso/chicory/aot/ValueConversions.java +++ b/aot/src/main/java/com/dylibso/chicory/aot/ValueConversions.java @@ -11,10 +11,6 @@ public static int longToI32(long val) { return (int) val; } - public static long longToI64(long val) { - return val; - } - public static float longToF32(long val) { return Value.longToFloat(val); } @@ -28,10 +24,6 @@ public static long i32ToLong(int val) { return val; } - public static long i64ToLong(long val) { - return val; - } - public static long f32ToLong(float val) { return Value.floatToLong(val); } diff --git a/function-processor/src/main/java/com/dylibso/chicory/function/processor/FunctionProcessor.java b/function-processor/src/main/java/com/dylibso/chicory/function/processor/FunctionProcessor.java index 1749ec07b..901fd1bbe 100644 --- a/function-processor/src/main/java/com/dylibso/chicory/function/processor/FunctionProcessor.java +++ b/function-processor/src/main/java/com/dylibso/chicory/function/processor/FunctionProcessor.java @@ -100,6 +100,7 @@ private void processModule(TypeElement type) { } cu.addImport("com.dylibso.chicory.runtime.HostFunction"); cu.addImport("com.dylibso.chicory.runtime.Instance"); + cu.addImport("com.dylibso.chicory.wasm.types.Value"); cu.addImport("com.dylibso.chicory.wasm.types.ValueType"); cu.addImport("java.util.List"); @@ -161,16 +162,14 @@ private Expression processMethod( paramTypes.add(valueType("F32")); arguments.add( new MethodCallExpr( - new NameExpr("Float"), - "intBitsToFloat", - new NodeList<>(new CastExpr(parseType("int"), argExpr)))); + new NameExpr("Value"), "longToFloat", new NodeList<>(argExpr))); break; case "double": paramTypes.add(valueType("F64")); arguments.add( new MethodCallExpr( - new NameExpr("Double"), - "doubleToLongBits", + new NameExpr("Value"), + "longToDouble", new NodeList<>(argExpr))); break; case "java.lang.String": @@ -228,16 +227,16 @@ private Expression processMethod( returnType.add(valueType("F32")); returnExpr = new MethodCallExpr( - new NameExpr("Float"), - "floatToRawIntBits", + new NameExpr("Value"), + "floatToLong", new NodeList<>(new NameExpr("result"))); break; case "double": returnType.add(valueType("F64")); returnExpr = new MethodCallExpr( - new NameExpr("Double"), - "doubleToLongBits", + new NameExpr("Value"), + "doubleToLong", new NodeList<>(new NameExpr("result"))); break; default: diff --git a/function-processor/src/test/resources/BasicMathGenerated.java b/function-processor/src/test/resources/BasicMathGenerated.java index e521e802d..5fb3d1c6f 100644 --- a/function-processor/src/test/resources/BasicMathGenerated.java +++ b/function-processor/src/test/resources/BasicMathGenerated.java @@ -2,6 +2,7 @@ import com.dylibso.chicory.runtime.HostFunction; import com.dylibso.chicory.runtime.Instance; +import com.dylibso.chicory.wasm.types.Value; import com.dylibso.chicory.wasm.types.ValueType; import java.util.List; import javax.annotation.processing.Generated; @@ -27,8 +28,8 @@ public static HostFunction[] toHostFunctions(BasicMath functions) { new HostFunction("math", "square", (Instance instance, long... args) -> { - double result = functions.pow2(Float.intBitsToFloat((int) args[0])); - return new long[] { Double.doubleToLongBits(result) }; + double result = functions.pow2(Value.longToFloat(args[0])); + return new long[] { Value.doubleToLong(result) }; }, List.of(ValueType.F32), List.of(ValueType.F64)), // diff --git a/function-processor/src/test/resources/NestedGenerated.java b/function-processor/src/test/resources/NestedGenerated.java index b5f798843..f996b3da9 100644 --- a/function-processor/src/test/resources/NestedGenerated.java +++ b/function-processor/src/test/resources/NestedGenerated.java @@ -3,6 +3,7 @@ import chicory.testing.Box.Nested; import com.dylibso.chicory.runtime.HostFunction; import com.dylibso.chicory.runtime.Instance; +import com.dylibso.chicory.wasm.types.Value; import com.dylibso.chicory.wasm.types.ValueType; import java.util.List; import javax.annotation.processing.Generated; diff --git a/function-processor/src/test/resources/NoPackageGenerated.java b/function-processor/src/test/resources/NoPackageGenerated.java index 25c3ec78b..d76fe5e15 100644 --- a/function-processor/src/test/resources/NoPackageGenerated.java +++ b/function-processor/src/test/resources/NoPackageGenerated.java @@ -1,5 +1,6 @@ import com.dylibso.chicory.runtime.HostFunction; import com.dylibso.chicory.runtime.Instance; +import com.dylibso.chicory.wasm.types.Value; import com.dylibso.chicory.wasm.types.ValueType; import java.util.List; import javax.annotation.processing.Generated; diff --git a/function-processor/src/test/resources/SimpleGenerated.java b/function-processor/src/test/resources/SimpleGenerated.java index d65f0d0d4..1321fe90c 100644 --- a/function-processor/src/test/resources/SimpleGenerated.java +++ b/function-processor/src/test/resources/SimpleGenerated.java @@ -2,6 +2,7 @@ import com.dylibso.chicory.runtime.HostFunction; import com.dylibso.chicory.runtime.Instance; +import com.dylibso.chicory.wasm.types.Value; import com.dylibso.chicory.wasm.types.ValueType; import java.util.List; import javax.annotation.processing.Generated;