diff options
author | Ian Rogers <irogers@google.com> | 2014-02-10 23:14:02 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-02-10 23:14:02 +0000 |
commit | 41ccc3b70dee0b43b3de6421c0643905720f40e3 (patch) | |
tree | 10a2c9cd66f426a41b5b8d4307fc3e36824d1034 /compiler | |
parent | 35d7e414134bd9f3d39e018a756617b21d49c877 (diff) | |
parent | dbb17e378b538133750e56375bbdbb217db7b248 (diff) | |
download | art-41ccc3b70dee0b43b3de6421c0643905720f40e3.zip art-41ccc3b70dee0b43b3de6421c0643905720f40e3.tar.gz art-41ccc3b70dee0b43b3de6421c0643905720f40e3.tar.bz2 |
Merge "Added inlined abs method with float and double type"
Diffstat (limited to 'compiler')
-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 0ad8abf..389dd9a 100644 --- a/compiler/dex/quick/dex_file_method_inliner.cc +++ b/compiler/dex/quick/dex_file_method_inliner.cc @@ -123,6 +123,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 @@ -198,6 +200,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), @@ -345,6 +351,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.d.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 fe0824c..fb7528e 100644 --- a/compiler/dex/quick/dex_file_method_inliner.h +++ b/compiler/dex/quick/dex_file_method_inliner.h @@ -40,6 +40,8 @@ enum InlineMethodOpcode : uint16_t { kIntrinsicReverseBytes, kIntrinsicAbsInt, kIntrinsicAbsLong, + kIntrinsicAbsFloat, + kIntrinsicAbsDouble, kIntrinsicMinMaxInt, kIntrinsicSqrt, kIntrinsicCharAt, @@ -268,6 +270,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 18a548f..ee61c8b 100644 --- a/compiler/dex/quick/gen_invoke.cc +++ b/compiler/dex/quick/gen_invoke.cc @@ -1172,6 +1172,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 22d4385..ae85b13 100644 --- a/compiler/dex/quick/mir_to_lir.h +++ b/compiler/dex/quick/mir_to_lir.h @@ -663,6 +663,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); |