# HG changeset patch # User Doug Simon # Date 1358168797 -3600 # Node ID 1489cd4eabe74c26efce296bfaeada7f05d566c1 # Parent f4f3d63d35e6a168b29ccc263eb2398728bd62ab added support for making calls with the native/C ABI diff -r f4f3d63d35e6 -r 1489cd4eabe7 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java Mon Jan 14 00:14:54 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRegisterConfig.java Mon Jan 14 14:06:37 2013 +0100 @@ -62,16 +62,19 @@ return attributesMap; } - private final Register[] generalParameterRegisters; + private final Register[] javaGeneralParameterRegisters; + private final Register[] nativeGeneralParameterRegisters; private final Register[] xmmParameterRegisters = {xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7}; private final CalleeSaveLayout csl; public AMD64HotSpotRegisterConfig(HotSpotVMConfig config, boolean globalStubConfig) { if (config.windowsOs) { - generalParameterRegisters = new Register[] {rdx, r8, r9, rdi, rsi, rcx}; + javaGeneralParameterRegisters = new Register[] {rdx, r8, r9, rdi, rsi, rcx}; + nativeGeneralParameterRegisters = new Register[] {rcx, rdx, r8, r9}; } else { - generalParameterRegisters = new Register[] {rsi, rdx, rcx, r8, r9, rdi}; + javaGeneralParameterRegisters = new Register[] {rsi, rdx, rcx, r8, r9, rdi}; + nativeGeneralParameterRegisters = new Register[] {rdi, rsi, rdx, rcx, r8, r9}; } if (globalStubConfig) { @@ -107,19 +110,19 @@ @Override public CallingConvention getCallingConvention(Type type, JavaType returnType, JavaType[] parameterTypes, TargetDescription target, boolean stackOnly) { if (type == Type.NativeCall) { - throw new UnsupportedOperationException(); + return callingConvention(nativeGeneralParameterRegisters, returnType, parameterTypes, type, target, stackOnly); } - return callingConvention(returnType, parameterTypes, type, target, stackOnly); + return callingConvention(javaGeneralParameterRegisters, returnType, parameterTypes, type, target, stackOnly); } public Register[] getCallingConventionRegisters(Type type, RegisterFlag flag) { if (flag == RegisterFlag.FPU) { return xmmParameterRegisters; } - return generalParameterRegisters; + return type == Type.NativeCall ? nativeGeneralParameterRegisters : javaGeneralParameterRegisters; } - private CallingConvention callingConvention(JavaType returnType, JavaType[] parameterTypes, Type type, TargetDescription target, boolean stackOnly) { + private CallingConvention callingConvention(Register[] generalParameterRegisters, JavaType returnType, JavaType[] parameterTypes, Type type, TargetDescription target, boolean stackOnly) { Value[] locations = new Value[parameterTypes.length]; int currentGeneral = 0; diff -r f4f3d63d35e6 -r 1489cd4eabe7 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java Mon Jan 14 00:14:54 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotRuntime.java Mon Jan 14 14:06:37 2013 +0100 @@ -68,26 +68,26 @@ addRuntimeCall(ARITHMETIC_FREM, config.arithmeticFremStub, /* temps */ null, /* ret */ ret(Kind.Float), - /* arg0: a */ arg(0, Kind.Float), - /* arg1: b */ arg(1, Kind.Float)); + /* arg0: a */ jarg(0, Kind.Float), + /* arg1: b */ jarg(1, Kind.Float)); addRuntimeCall(ARITHMETIC_DREM, config.arithmeticDremStub, /* temps */ null, /* ret */ ret(Kind.Double), - /* arg0: a */ arg(0, Kind.Double), - /* arg1: b */ arg(1, Kind.Double)); + /* arg0: a */ jarg(0, Kind.Double), + /* arg1: b */ jarg(1, Kind.Double)); addRuntimeCall(MONITORENTER, config.monitorEnterStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: object */ arg(0, Kind.Object), - /* arg1: lock */ arg(1, word)); + /* arg0: object */ jarg(0, Kind.Object), + /* arg1: lock */ jarg(1, word)); addRuntimeCall(MONITOREXIT, config.monitorExitStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: object */ arg(0, Kind.Object), - /* arg1: lock */ arg(1, word)); + /* arg0: object */ jarg(0, Kind.Object), + /* arg1: lock */ jarg(1, word)); addRuntimeCall(NEW_ARRAY, 0L, /* temps */ null, @@ -126,34 +126,34 @@ addRuntimeCall(VM_ERROR, config.vmErrorStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: where */ arg(0, Kind.Object), - /* arg1: format */ arg(1, Kind.Object), - /* arg2: value */ arg(2, Kind.Long)); + /* arg0: where */ jarg(0, Kind.Object), + /* arg1: format */ jarg(1, Kind.Object), + /* arg2: value */ jarg(2, Kind.Long)); addRuntimeCall(IDENTITY_HASHCODE, config.identityHashCodeStub, /* temps */ null, /* ret */ rax.asValue(Kind.Int), - /* arg0: obj */ arg(0, Kind.Object)); + /* arg0: obj */ jarg(0, Kind.Object)); addRuntimeCall(THREAD_IS_INTERRUPTED, config.threadIsInterruptedStub, /* temps */ null, /* ret */ rax.asValue(Kind.Int), - /* arg0: thread */ arg(0, Kind.Object), - /* arg1: clearInterrupted */ arg(1, Kind.Boolean)); + /* arg0: thread */ jarg(0, Kind.Object), + /* arg1: clearInterrupted */ jarg(1, Kind.Boolean)); addRuntimeCall(ENCRYPT_BLOCK, config.aescryptEncryptBlockStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: in */ arg(0, word), - /* arg1: out */ arg(1, word), - /* arg2: key */ arg(2, word)); + /* arg0: in */ carg(0, word), + /* arg1: out */ carg(1, word), + /* arg2: key */ carg(2, word)); addRuntimeCall(DECRYPT_BLOCK, config.aescryptDecryptBlockStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: in */ arg(0, word), - /* arg1: out */ arg(1, word), - /* arg2: key */ arg(2, word)); + /* arg0: in */ carg(0, word), + /* arg1: out */ carg(1, word), + /* arg2: key */ carg(2, word)); } @Override diff -r f4f3d63d35e6 -r 1489cd4eabe7 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Jan 14 00:14:54 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java Mon Jan 14 14:06:37 2013 +0100 @@ -24,6 +24,7 @@ import static com.oracle.graal.api.code.DeoptimizationAction.*; import static com.oracle.graal.api.code.MemoryBarriers.*; +import static com.oracle.graal.api.code.Register.RegisterFlag.*; import static com.oracle.graal.api.meta.DeoptimizationReason.*; import static com.oracle.graal.api.meta.Value.*; import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*; @@ -33,6 +34,7 @@ import static com.oracle.graal.nodes.java.RegisterFinalizerNode.*; import static com.oracle.graal.snippets.Log.*; import static com.oracle.graal.snippets.MathSubstitutionsX86.*; +import static com.oracle.graal.api.code.CallingConvention.Type.*; import java.lang.reflect.*; import java.util.*; @@ -164,11 +166,14 @@ return globalStubRegConfig.getReturnRegister(kind).asValue(kind); } - protected Value arg(int index, Kind kind) { - if (kind == Kind.Float || kind == Kind.Double) { - return globalStubRegConfig.getCallingConventionRegisters(CallingConvention.Type.RuntimeCall, RegisterFlag.FPU)[index].asValue(kind); - } - return globalStubRegConfig.getCallingConventionRegisters(CallingConvention.Type.RuntimeCall, RegisterFlag.CPU)[index].asValue(kind); + protected Value jarg(int index, Kind kind) { + RegisterFlag flag = kind == Kind.Float || kind == Kind.Double ? FPU : CPU; + return globalStubRegConfig.getCallingConventionRegisters(RuntimeCall, flag)[index].asValue(kind); + } + + protected Value carg(int index, Kind kind) { + RegisterFlag flag = kind == Kind.Float || kind == Kind.Double ? FPU : CPU; + return globalStubRegConfig.getCallingConventionRegisters(NativeCall, flag)[index].asValue(kind); } protected Value scratch(Kind kind) { @@ -184,17 +189,17 @@ addRuntimeCall(UNWIND_EXCEPTION, config.unwindExceptionStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: exception */ arg(0, Kind.Object)); + /* arg0: exception */ jarg(0, Kind.Object)); addRuntimeCall(OnStackReplacementPhase.OSR_MIGRATION_END, config.osrMigrationEndStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: long */ arg(0, Kind.Long)); + /* arg0: long */ jarg(0, Kind.Long)); addRuntimeCall(REGISTER_FINALIZER, config.registerFinalizerStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: object */ arg(0, Kind.Object)); + /* arg0: object */ jarg(0, Kind.Object)); addRuntimeCall(CREATE_NULL_POINTER_EXCEPTION, config.createNullPointerExceptionStub, /* temps */ null, @@ -203,7 +208,7 @@ addRuntimeCall(CREATE_OUT_OF_BOUNDS_EXCEPTION, config.createOutOfBoundsExceptionStub, /* temps */ null, /* ret */ ret(Kind.Object), - /* arg0: index */ arg(0, Kind.Int)); + /* arg0: index */ jarg(0, Kind.Int)); addRuntimeCall(JAVA_TIME_MILLIS, config.javaTimeMillisStub, /* temps */ null, @@ -216,38 +221,38 @@ addRuntimeCall(ARITHMETIC_SIN, config.arithmeticSinStub, /* temps */ null, /* ret */ ret(Kind.Double), - /* arg0: index */ arg(0, Kind.Double)); + /* arg0: index */ jarg(0, Kind.Double)); addRuntimeCall(ARITHMETIC_COS, config.arithmeticCosStub, /* temps */ null, /* ret */ ret(Kind.Double), - /* arg0: index */ arg(0, Kind.Double)); + /* arg0: index */ jarg(0, Kind.Double)); addRuntimeCall(ARITHMETIC_TAN, config.arithmeticTanStub, /* temps */ null, /* ret */ ret(Kind.Double), - /* arg0: index */ arg(0, Kind.Double)); + /* arg0: index */ jarg(0, Kind.Double)); addRuntimeCall(LOG_PRIMITIVE, config.logPrimitiveStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: typeChar */ arg(0, Kind.Int), - /* arg1: value */ arg(1, Kind.Long), - /* arg2: newline */ arg(2, Kind.Boolean)); + /* arg0: typeChar */ jarg(0, Kind.Int), + /* arg1: value */ jarg(1, Kind.Long), + /* arg2: newline */ jarg(2, Kind.Boolean)); addRuntimeCall(LOG_PRINTF, config.logPrintfStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: format */ arg(0, Kind.Object), - /* arg1: value */ arg(1, Kind.Long), - /* arg2: value */ arg(2, Kind.Long), - /* arg3: value */ arg(3, Kind.Long)); + /* arg0: format */ jarg(0, Kind.Object), + /* arg1: value */ jarg(1, Kind.Long), + /* arg2: value */ jarg(2, Kind.Long), + /* arg3: value */ jarg(3, Kind.Long)); addRuntimeCall(LOG_OBJECT, config.logObjectStub, /* temps */ null, /* ret */ ret(Kind.Void), - /* arg0: object */ arg(0, Kind.Object), - /* arg1: flags */ arg(1, Kind.Int)); + /* arg0: object */ jarg(0, Kind.Object), + /* arg1: flags */ jarg(1, Kind.Int)); }