diff options
Diffstat (limited to 'compiler/dex')
-rw-r--r-- | compiler/dex/quick/dex_file_method_inliner.cc | 10 | ||||
-rw-r--r-- | compiler/dex/quick/dex_file_method_inliner.h | 3 | ||||
-rw-r--r-- | compiler/dex/quick/gen_invoke.cc | 37 | ||||
-rw-r--r-- | compiler/dex/quick/mir_to_lir.h | 2 |
4 files changed, 52 insertions, 0 deletions
diff --git a/compiler/dex/quick/dex_file_method_inliner.cc b/compiler/dex/quick/dex_file_method_inliner.cc index 0937be3232..4c79c3a6e4 100644 --- a/compiler/dex/quick/dex_file_method_inliner.cc +++ b/compiler/dex/quick/dex_file_method_inliner.cc @@ -107,6 +107,8 @@ const DexFileMethodInliner::ProtoDef DexFileMethodInliner::kProtoCacheDefs[] = { { kClassCacheShort, 1, { kClassCacheShort } }, // kProtoCacheD_D { kClassCacheDouble, 1, { kClassCacheDouble } }, + // kProtoCacheF_F + { kClassCacheFloat, 1, { kClassCacheFloat } }, // kProtoCacheD_J { kClassCacheLong, 1, { kClassCacheDouble } }, // kProtoCacheJ_D @@ -182,6 +184,10 @@ const DexFileMethodInliner::IntrinsicDef DexFileMethodInliner::kIntrinsicMethods INTRINSIC(JavaLangStrictMath, Abs, I_I, kIntrinsicAbsInt, 0), INTRINSIC(JavaLangMath, Abs, J_J, kIntrinsicAbsLong, 0), INTRINSIC(JavaLangStrictMath, Abs, J_J, kIntrinsicAbsLong, 0), + INTRINSIC(JavaLangMath, Abs, F_F, kIntrinsicAbsFloat, 0), + INTRINSIC(JavaLangStrictMath, Abs, F_F, kIntrinsicAbsFloat, 0), + INTRINSIC(JavaLangMath, Abs, D_D, kIntrinsicAbsDouble, 0), + INTRINSIC(JavaLangStrictMath, Abs, D_D, kIntrinsicAbsDouble, 0), INTRINSIC(JavaLangMath, Min, II_I, kIntrinsicMinMaxInt, kIntrinsicFlagMin), INTRINSIC(JavaLangStrictMath, Min, II_I, kIntrinsicMinMaxInt, kIntrinsicFlagMin), INTRINSIC(JavaLangMath, Max, II_I, kIntrinsicMinMaxInt, kIntrinsicFlagMax), @@ -328,6 +334,10 @@ bool DexFileMethodInliner::GenIntrinsic(Mir2Lir* backend, CallInfo* info) { return backend->GenInlinedAbsInt(info); case kIntrinsicAbsLong: return backend->GenInlinedAbsLong(info); + case kIntrinsicAbsFloat: + return backend->GenInlinedAbsFloat(info); + case kIntrinsicAbsDouble: + return backend->GenInlinedAbsDouble(info); case kIntrinsicMinMaxInt: return backend->GenInlinedMinMaxInt(info, intrinsic.data & kIntrinsicFlagMin); case kIntrinsicSqrt: diff --git a/compiler/dex/quick/dex_file_method_inliner.h b/compiler/dex/quick/dex_file_method_inliner.h index 6e81303f9d..d815877a22 100644 --- a/compiler/dex/quick/dex_file_method_inliner.h +++ b/compiler/dex/quick/dex_file_method_inliner.h @@ -36,6 +36,8 @@ enum InlineMethodOpcode : uint16_t { kIntrinsicReverseBytes, kIntrinsicAbsInt, kIntrinsicAbsLong, + kIntrinsicAbsFloat, + kIntrinsicAbsDouble, kIntrinsicMinMaxInt, kIntrinsicSqrt, kIntrinsicCharAt, @@ -261,6 +263,7 @@ class DexFileMethodInliner { kProtoCacheJ_J, kProtoCacheS_S, kProtoCacheD_D, + kProtoCacheF_F, kProtoCacheD_J, kProtoCacheJ_D, kProtoCacheF_I, diff --git a/compiler/dex/quick/gen_invoke.cc b/compiler/dex/quick/gen_invoke.cc index 3823fb31d4..d7aecaf3f5 100644 --- a/compiler/dex/quick/gen_invoke.cc +++ b/compiler/dex/quick/gen_invoke.cc @@ -1076,6 +1076,43 @@ bool Mir2Lir::GenInlinedAbsLong(CallInfo* info) { } } +bool Mir2Lir::GenInlinedAbsFloat(CallInfo* info) { + if (cu_->instruction_set == kMips) { + // TODO - add Mips implementation + return false; + } + RegLocation rl_src = info->args[0]; + rl_src = LoadValue(rl_src, kCoreReg); + RegLocation rl_dest = InlineTarget(info); + RegLocation rl_result = EvalLoc(rl_dest, kCoreReg, true); + int signMask = AllocTemp(); + LoadConstant(signMask, 0x7fffffff); + OpRegRegReg(kOpAnd, rl_result.low_reg, rl_src.low_reg, signMask); + FreeTemp(signMask); + StoreValue(rl_dest, rl_result); + return true; +} + +bool Mir2Lir::GenInlinedAbsDouble(CallInfo* info) { + if (cu_->instruction_set == kMips) { + // TODO - add Mips implementation + return false; + } + RegLocation rl_src = info->args[0]; + rl_src = LoadValueWide(rl_src, kCoreReg); + RegLocation rl_dest = InlineTargetWide(info); + RegLocation rl_result = EvalLoc(rl_dest, kCoreReg, true); + OpRegCopyWide(rl_result.low_reg, rl_result.high_reg, rl_src.low_reg, rl_src.high_reg); + FreeTemp(rl_src.low_reg); + FreeTemp(rl_src.high_reg); + int signMask = AllocTemp(); + LoadConstant(signMask, 0x7fffffff); + OpRegReg(kOpAnd, rl_result.high_reg, signMask); + FreeTemp(signMask); + StoreValueWide(rl_dest, rl_result); + return true; +} + bool Mir2Lir::GenInlinedFloatCvt(CallInfo* info) { if (cu_->instruction_set == kMips) { // TODO - add Mips implementation diff --git a/compiler/dex/quick/mir_to_lir.h b/compiler/dex/quick/mir_to_lir.h index 81053a3eff..93b093a13d 100644 --- a/compiler/dex/quick/mir_to_lir.h +++ b/compiler/dex/quick/mir_to_lir.h @@ -600,6 +600,8 @@ class Mir2Lir : public Backend { bool GenInlinedReverseBytes(CallInfo* info, OpSize size); bool GenInlinedAbsInt(CallInfo* info); bool GenInlinedAbsLong(CallInfo* info); + bool GenInlinedAbsFloat(CallInfo* info); + bool GenInlinedAbsDouble(CallInfo* info); bool GenInlinedFloatCvt(CallInfo* info); bool GenInlinedDoubleCvt(CallInfo* info); bool GenInlinedIndexOf(CallInfo* info, bool zero_based); |