Skip to content

Commit

Permalink
Unroll argument conversion loop.
Browse files Browse the repository at this point in the history
  • Loading branch information
woess committed Oct 2, 2024
1 parent 6942dea commit a95b336
Showing 1 changed file with 35 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,15 @@
import java.util.concurrent.ConcurrentHashMap;

import com.oracle.truffle.api.CallTarget;
import com.oracle.truffle.api.CompilerAsserts;
import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.exception.AbstractTruffleException;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.interop.ExceptionType;
import com.oracle.truffle.api.interop.InteropException;
import com.oracle.truffle.api.interop.InteropLibrary;
import com.oracle.truffle.api.nodes.ExplodeLoop;
import com.oracle.truffle.api.object.DynamicObjectLibrary;
import com.oracle.truffle.api.object.Shape;
import com.oracle.truffle.api.profiles.BranchProfile;
Expand Down Expand Up @@ -240,6 +242,7 @@ private static JSFunctionData getOrCreateExportedWasmFunctionAdapter(JSContext c
}

private static class WasmToJSFunctionAdapterRootNode extends JavaScriptRootNode {
private static final int MAX_UNROLL = 32;
private final JSContext context;
private final WasmFunctionTypeInfo type;

Expand All @@ -266,17 +269,7 @@ public Object execute(VirtualFrame frame) {
int returnLength = type.resultLength();

Object[] frameArguments = frame.getArguments();
int userArgumentCount = JSArguments.getUserArgumentCount(frameArguments);
Object[] wasmArgs = new Object[argCount];
for (int i = 0; i < argCount; i++) {
Object wasmArg;
if (i < userArgumentCount) {
wasmArg = JSArguments.getUserArgument(frameArguments, i);
} else {
wasmArg = Undefined.instance;
}
wasmArgs[i] = toWebAssemblyValueNode.execute(wasmArg, type.paramTypes()[i]);
}
Object[] wasmArgs = convertArgsToWasm(frameArguments, argCount);

Object export = getExportedFunctionLib.getOrDefault(JSFrameUtil.getFunctionObject(frame), JSWebAssembly.FUNCTION_ADDRESS, null);
try {
Expand Down Expand Up @@ -312,6 +305,37 @@ public Object execute(VirtualFrame frame) {
}
}

@ExplodeLoop
private Object[] convertArgsToWasm(Object[] frameArguments, int paramCount) {
CompilerAsserts.partialEvaluationConstant(paramCount);
if (paramCount > MAX_UNROLL) {
return convertArgsToWasmNoUnroll(frameArguments, paramCount);
}
Object[] wasmArgs = new Object[paramCount];
for (int i = 0; i < paramCount; i++) {
wasmArgs[i] = convertArgToWasm(frameArguments, i);
}
return wasmArgs;
}

private Object[] convertArgsToWasmNoUnroll(Object[] frameArguments, int paramCount) {
Object[] wasmArgs = new Object[paramCount];
for (int i = 0; i < paramCount; i++) {
wasmArgs[i] = convertArgToWasm(frameArguments, i);
}
return wasmArgs;
}

private Object convertArgToWasm(Object[] frameArguments, int i) {
Object wasmArg;
if (i < JSArguments.getUserArgumentCount(frameArguments)) {
wasmArg = JSArguments.getUserArgument(frameArguments, i);
} else {
wasmArg = Undefined.instance;
}
return toWebAssemblyValueNode.execute(wasmArg, type.paramTypes()[i]);
}

@Override
public String toString() {
return FUNCTION_ADAPTER_NAME.toJavaStringUncached() + ":" + type.toString();
Expand Down

0 comments on commit a95b336

Please sign in to comment.