diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 07:00:00 -0700 |
commit | 2ad60cfc28e14ee8f0bb038720836a4696c478ad (patch) | |
tree | 19f1bb30ab7ff96f1e3e59a60b61dcd2aeddda93 /vm/InlineNative.h | |
download | android_dalvik-2ad60cfc28e14ee8f0bb038720836a4696c478ad.tar.gz android_dalvik-2ad60cfc28e14ee8f0bb038720836a4696c478ad.tar.bz2 android_dalvik-2ad60cfc28e14ee8f0bb038720836a4696c478ad.zip |
Initial Contribution
Diffstat (limited to 'vm/InlineNative.h')
-rw-r--r-- | vm/InlineNative.h | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/vm/InlineNative.h b/vm/InlineNative.h new file mode 100644 index 000000000..a6177a6a1 --- /dev/null +++ b/vm/InlineNative.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2008 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* + * Inlined native functions. + */ +#ifndef _DALVIK_INLINENATIVE +#define _DALVIK_INLINENATIVE + +/* startup/shutdown */ +bool dvmInlineNativeStartup(void); +void dvmInlineNativeShutdown(void); + +/* + * Basic 4-argument inline operation handler. + */ +typedef bool (*InlineOp4Func)(u4 arg0, u4 arg1, u4 arg2, u4 arg3, + JValue* pResult); + +/* + * Table of inline operations. + * + * Try to keep this at a power-of-two size, so we don't have to multiply. + * + * TODO: might be to our advantage to generate a compact jump table on + * the heap at runtime (or just declare two static tables, one with full + * info and one with just function pointers). Especially useful if we decide + * to support other method call forms, e.g. /range. We can also just + * generate assembly code that knows how many args it needs and has the + * target address embedded. + */ +typedef struct InlineOperation { + InlineOp4Func func; /* MUST be first entry */ + const char* classDescriptor; + const char* methodName; + const char* methodSignature; +} InlineOperation; + +/* + * Get the inlineops table. + */ +const InlineOperation* dvmGetInlineOpsTable(void); +int dvmGetInlineOpsTableLength(void); + +/* + * The table, exposed so we can access it with C inlines. Prefer access + * through dvmGetInlineOpsTable(). + */ +extern const InlineOperation gDvmInlineOpsTable[]; + +/* + * Perform the operation specified by "opIndex". + * + * We want the arguments to appear in the first 4 registers so they can + * be passed straight through to the handler function. Ideally on ARM + * they'll go into r0-r3 and stay there. + * + * Returns "true" if everything went normally, "false" if an exception + * was thrown. + */ +INLINE bool dvmPerformInlineOp4Std(u4 arg0, u4 arg1, u4 arg2, u4 arg3, + JValue* pResult, int opIndex) +{ + return (*gDvmInlineOpsTable[opIndex].func)(arg0, arg1, arg2, arg3, pResult); +} + +/* + * Like the "std" version, but will emit profiling info. + */ +bool dvmPerformInlineOp4Dbg(u4 arg0, u4 arg1, u4 arg2, u4 arg3, + JValue* pResult, int opIndex); + +#endif /*_DALVIK_INLINENATIVE*/ |