diff options
-rw-r--r-- | vm/InlineNative.cpp | 80 | ||||
-rw-r--r-- | vm/InlineNative.h | 9 | ||||
-rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.cpp | 22 | ||||
-rw-r--r-- | vm/compiler/codegen/mips/CodegenDriver.cpp | 22 |
4 files changed, 75 insertions, 58 deletions
diff --git a/vm/InlineNative.cpp b/vm/InlineNative.cpp index 80d522a39..00c1e9554 100644 --- a/vm/InlineNative.cpp +++ b/vm/InlineNative.cpp @@ -732,51 +732,41 @@ const InlineOperation gDvmInlineOpsTable[] = { "Lorg/apache/harmony/dalvik/NativeTestTarget;", "emptyInlineMethod", "()V" }, - { javaLangString_charAt, - "Ljava/lang/String;", "charAt", "(I)C" }, - { javaLangString_compareTo, - "Ljava/lang/String;", "compareTo", "(Ljava/lang/String;)I" }, - { javaLangString_equals, - "Ljava/lang/String;", "equals", "(Ljava/lang/Object;)Z" }, - { javaLangString_fastIndexOf_II, - "Ljava/lang/String;", "fastIndexOf", "(II)I" }, - { javaLangString_isEmpty, - "Ljava/lang/String;", "isEmpty", "()Z" }, - { javaLangString_length, - "Ljava/lang/String;", "length", "()I" }, - - { javaLangMath_abs_int, - "Ljava/lang/Math;", "abs", "(I)I" }, - { javaLangMath_abs_long, - "Ljava/lang/Math;", "abs", "(J)J" }, - { javaLangMath_abs_float, - "Ljava/lang/Math;", "abs", "(F)F" }, - { javaLangMath_abs_double, - "Ljava/lang/Math;", "abs", "(D)D" }, - { javaLangMath_min_int, - "Ljava/lang/Math;", "min", "(II)I" }, - { javaLangMath_max_int, - "Ljava/lang/Math;", "max", "(II)I" }, - { javaLangMath_sqrt, - "Ljava/lang/Math;", "sqrt", "(D)D" }, - { javaLangMath_cos, - "Ljava/lang/Math;", "cos", "(D)D" }, - { javaLangMath_sin, - "Ljava/lang/Math;", "sin", "(D)D" }, - - { javaLangFloat_floatToIntBits, - "Ljava/lang/Float;", "floatToIntBits", "(F)I" }, - { javaLangFloat_floatToRawIntBits, - "Ljava/lang/Float;", "floatToRawIntBits", "(F)I" }, - { javaLangFloat_intBitsToFloat, - "Ljava/lang/Float;", "intBitsToFloat", "(I)F" }, - - { javaLangDouble_doubleToLongBits, - "Ljava/lang/Double;", "doubleToLongBits", "(D)J" }, - { javaLangDouble_doubleToRawLongBits, - "Ljava/lang/Double;", "doubleToRawLongBits", "(D)J" }, - { javaLangDouble_longBitsToDouble, - "Ljava/lang/Double;", "longBitsToDouble", "(J)D" }, + { javaLangString_charAt, "Ljava/lang/String;", "charAt", "(I)C" }, + { javaLangString_compareTo, "Ljava/lang/String;", "compareTo", "(Ljava/lang/String;)I" }, + { javaLangString_equals, "Ljava/lang/String;", "equals", "(Ljava/lang/Object;)Z" }, + { javaLangString_fastIndexOf_II, "Ljava/lang/String;", "fastIndexOf", "(II)I" }, + { javaLangString_isEmpty, "Ljava/lang/String;", "isEmpty", "()Z" }, + { javaLangString_length, "Ljava/lang/String;", "length", "()I" }, + + { javaLangMath_abs_int, "Ljava/lang/Math;", "abs", "(I)I" }, + { javaLangMath_abs_long, "Ljava/lang/Math;", "abs", "(J)J" }, + { javaLangMath_abs_float, "Ljava/lang/Math;", "abs", "(F)F" }, + { javaLangMath_abs_double, "Ljava/lang/Math;", "abs", "(D)D" }, + { javaLangMath_min_int, "Ljava/lang/Math;", "min", "(II)I" }, + { javaLangMath_max_int, "Ljava/lang/Math;", "max", "(II)I" }, + { javaLangMath_sqrt, "Ljava/lang/Math;", "sqrt", "(D)D" }, + { javaLangMath_cos, "Ljava/lang/Math;", "cos", "(D)D" }, + { javaLangMath_sin, "Ljava/lang/Math;", "sin", "(D)D" }, + + { javaLangFloat_floatToIntBits, "Ljava/lang/Float;", "floatToIntBits", "(F)I" }, + { javaLangFloat_floatToRawIntBits, "Ljava/lang/Float;", "floatToRawIntBits", "(F)I" }, + { javaLangFloat_intBitsToFloat, "Ljava/lang/Float;", "intBitsToFloat", "(I)F" }, + + { javaLangDouble_doubleToLongBits, "Ljava/lang/Double;", "doubleToLongBits", "(D)J" }, + { javaLangDouble_doubleToRawLongBits, "Ljava/lang/Double;", "doubleToRawLongBits", "(D)J" }, + { javaLangDouble_longBitsToDouble, "Ljava/lang/Double;", "longBitsToDouble", "(J)D" }, + + // These are implemented exactly the same in Math and StrictMath, + // so we can make the StrictMath calls fast too. Note that this + // isn't true in general! + { javaLangMath_abs_int, "Ljava/lang/StrictMath;", "abs", "(I)I" }, + { javaLangMath_abs_long, "Ljava/lang/StrictMath;", "abs", "(J)J" }, + { javaLangMath_abs_float, "Ljava/lang/StrictMath;", "abs", "(F)F" }, + { javaLangMath_abs_double, "Ljava/lang/StrictMath;", "abs", "(D)D" }, + { javaLangMath_min_int, "Ljava/lang/StrictMath;", "min", "(II)I" }, + { javaLangMath_max_int, "Ljava/lang/StrictMath;", "max", "(II)I" }, + { javaLangMath_sqrt, "Ljava/lang/StrictMath;", "sqrt", "(D)D" }, }; /* diff --git a/vm/InlineNative.h b/vm/InlineNative.h index 101ddd192..fe14f8bf8 100644 --- a/vm/InlineNative.h +++ b/vm/InlineNative.h @@ -53,7 +53,7 @@ struct InlineOperation { }; /* - * Must be kept in sync w/ gDvmInlineOpsTable in InlineNative.c + * Must be kept in sync w/ gDvmInlineOpsTable in InlineNative.cpp * * You should also add a test to libcore's IntrinsicTest. */ @@ -80,6 +80,13 @@ enum NativeInlineOps { INLINE_DOUBLE_TO_LONG_BITS = 19, INLINE_DOUBLE_TO_RAW_LONG_BITS = 20, INLINE_LONG_BITS_TO_DOUBLE = 21, + INLINE_STRICT_MATH_ABS_INT = 22, + INLINE_STRICT_MATH_ABS_LONG = 23, + INLINE_STRICT_MATH_ABS_FLOAT = 24, + INLINE_STRICT_MATH_ABS_DOUBLE = 25, + INLINE_STRICT_MATH_MIN_INT = 26, + INLINE_STRICT_MATH_MAX_INT = 27, + INLINE_STRICT_MATH_SQRT = 28, }; /* diff --git a/vm/compiler/codegen/arm/CodegenDriver.cpp b/vm/compiler/codegen/arm/CodegenDriver.cpp index 78809dc74..7346c835e 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.cpp +++ b/vm/compiler/codegen/arm/CodegenDriver.cpp @@ -3645,30 +3645,40 @@ static bool handleExecuteInline(CompilationUnit *cUnit, MIR *mir) return false; /* Nop */ /* These ones we potentially JIT inline. */ + + case INLINE_STRING_CHARAT: + return genInlinedStringCharAt(cUnit, mir); case INLINE_STRING_LENGTH: return genInlinedStringLength(cUnit, mir); case INLINE_STRING_IS_EMPTY: return genInlinedStringIsEmpty(cUnit, mir); + case INLINE_STRING_COMPARETO: + return genInlinedCompareTo(cUnit, mir); + case INLINE_STRING_FASTINDEXOF_II: + return genInlinedFastIndexOf(cUnit, mir); + case INLINE_MATH_ABS_INT: + case INLINE_STRICT_MATH_ABS_INT: return genInlinedAbsInt(cUnit, mir); case INLINE_MATH_ABS_LONG: + case INLINE_STRICT_MATH_ABS_LONG: return genInlinedAbsLong(cUnit, mir); case INLINE_MATH_MIN_INT: + case INLINE_STRICT_MATH_MIN_INT: return genInlinedMinMaxInt(cUnit, mir, true); case INLINE_MATH_MAX_INT: + case INLINE_STRICT_MATH_MAX_INT: return genInlinedMinMaxInt(cUnit, mir, false); - case INLINE_STRING_CHARAT: - return genInlinedStringCharAt(cUnit, mir); case INLINE_MATH_SQRT: + case INLINE_STRICT_MATH_SQRT: return genInlineSqrt(cUnit, mir); case INLINE_MATH_ABS_FLOAT: + case INLINE_STRICT_MATH_ABS_FLOAT: return genInlinedAbsFloat(cUnit, mir); case INLINE_MATH_ABS_DOUBLE: + case INLINE_STRICT_MATH_ABS_DOUBLE: return genInlinedAbsDouble(cUnit, mir); - case INLINE_STRING_COMPARETO: - return genInlinedCompareTo(cUnit, mir); - case INLINE_STRING_FASTINDEXOF_II: - return genInlinedFastIndexOf(cUnit, mir); + case INLINE_FLOAT_TO_RAW_INT_BITS: case INLINE_INT_BITS_TO_FLOAT: return genInlinedIntFloatConversion(cUnit, mir); diff --git a/vm/compiler/codegen/mips/CodegenDriver.cpp b/vm/compiler/codegen/mips/CodegenDriver.cpp index bbe631cb0..fea1d1ec4 100644 --- a/vm/compiler/codegen/mips/CodegenDriver.cpp +++ b/vm/compiler/codegen/mips/CodegenDriver.cpp @@ -3777,30 +3777,40 @@ static bool handleExecuteInline(CompilationUnit *cUnit, MIR *mir) return false; /* Nop */ /* These ones we potentially JIT inline. */ + + case INLINE_STRING_CHARAT: + return genInlinedStringCharAt(cUnit, mir); case INLINE_STRING_LENGTH: return genInlinedStringLength(cUnit, mir); case INLINE_STRING_IS_EMPTY: return genInlinedStringIsEmpty(cUnit, mir); + case INLINE_STRING_COMPARETO: + return genInlinedCompareTo(cUnit, mir); + case INLINE_STRING_FASTINDEXOF_II: + return genInlinedFastIndexOf(cUnit, mir); + case INLINE_MATH_ABS_INT: + case INLINE_STRICT_MATH_ABS_INT: return genInlinedAbsInt(cUnit, mir); case INLINE_MATH_ABS_LONG: + case INLINE_STRICT_MATH_ABS_LONG: return genInlinedAbsLong(cUnit, mir); case INLINE_MATH_MIN_INT: + case INLINE_STRICT_MATH_MIN_INT: return genInlinedMinMaxInt(cUnit, mir, true); case INLINE_MATH_MAX_INT: + case INLINE_STRICT_MATH_MAX_INT: return genInlinedMinMaxInt(cUnit, mir, false); - case INLINE_STRING_CHARAT: - return genInlinedStringCharAt(cUnit, mir); case INLINE_MATH_SQRT: + case INLINE_STRICT_MATH_SQRT: return genInlineSqrt(cUnit, mir); case INLINE_MATH_ABS_FLOAT: + case INLINE_STRICT_MATH_ABS_FLOAT: return genInlinedAbsFloat(cUnit, mir); case INLINE_MATH_ABS_DOUBLE: + case INLINE_STRICT_MATH_ABS_DOUBLE: return genInlinedAbsDouble(cUnit, mir); - case INLINE_STRING_COMPARETO: - return genInlinedCompareTo(cUnit, mir); - case INLINE_STRING_FASTINDEXOF_II: - return genInlinedFastIndexOf(cUnit, mir); + case INLINE_FLOAT_TO_RAW_INT_BITS: case INLINE_INT_BITS_TO_FLOAT: return genInlinedIntFloatConversion(cUnit, mir); |