diff options
| author | Elliott Hughes <enh@google.com> | 2010-08-20 18:47:36 -0700 |
|---|---|---|
| committer | Elliott Hughes <enh@google.com> | 2010-09-01 18:01:24 -0700 |
| commit | a1227409084c4a675cc83ada128f364506528b9c (patch) | |
| tree | 9ea245adfbb2fb41d24a163932fea4ae8f8c1d81 /vm/compiler/codegen/arm/CodegenDriver.c | |
| parent | 4a2b20a1128b13dbcda9e7d1114f4d60a02431ed (diff) | |
Intrinsics for float/int and double/long conversions.
[cherry-picked e22bd84c8c8a57ddd86c21a1f65137d549b07935 from dalvik-dev to gingerbread]
Bug: 2935622
Change-Id: Ib4de19033dc4a08f41bf0eb0f7a21dcde216aae3
Diffstat (limited to 'vm/compiler/codegen/arm/CodegenDriver.c')
| -rw-r--r-- | vm/compiler/codegen/arm/CodegenDriver.c | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.c b/vm/compiler/codegen/arm/CodegenDriver.c index 7716eb252..86c2e29c2 100644 --- a/vm/compiler/codegen/arm/CodegenDriver.c +++ b/vm/compiler/codegen/arm/CodegenDriver.c @@ -3309,7 +3309,7 @@ static bool genInlinedAbsInt(CompilationUnit *cUnit, MIR *mir) { RegLocation rlSrc = dvmCompilerGetSrc(cUnit, mir, 0); rlSrc = loadValue(cUnit, rlSrc, kCoreReg); - RegLocation rlDest = inlinedTarget(cUnit, mir, false);; + RegLocation rlDest = inlinedTarget(cUnit, mir, false); RegLocation rlResult = dvmCompilerEvalLoc(cUnit, rlDest, kCoreReg, true); int signReg = dvmCompilerAllocTemp(cUnit); /* @@ -3346,6 +3346,24 @@ static bool genInlinedAbsLong(CompilationUnit *cUnit, MIR *mir) return false; } +static bool genInlinedIntFloatConversion(CompilationUnit *cUnit, MIR *mir) +{ + // Just move from source to destination... + RegLocation rlSrc = dvmCompilerGetSrc(cUnit, mir, 0); + RegLocation rlDest = inlinedTarget(cUnit, mir, false); + storeValue(cUnit, rlDest, rlSrc); + return false; +} + +static bool genInlinedLongDoubleConversion(CompilationUnit *cUnit, MIR *mir) +{ + // Just move from source to destination... + RegLocation rlSrc = dvmCompilerGetSrcWide(cUnit, mir, 0, 1); + RegLocation rlDest = inlinedTargetWide(cUnit, mir, false); + storeValueWide(cUnit, rlDest, rlSrc); + return false; +} + /* * NOTE: Handles both range and non-range versions (arguments * have already been normalized by this point). @@ -3402,9 +3420,17 @@ static bool handleExecuteInline(CompilationUnit *cUnit, MIR *mir) return false; else break; + case INLINE_FLOAT_TO_RAW_INT_BITS: + case INLINE_INT_BITS_TO_FLOAT: + return genInlinedIntFloatConversion(cUnit, mir); + case INLINE_DOUBLE_TO_RAW_LONG_BITS: + case INLINE_LONG_BITS_TO_DOUBLE: + return genInlinedLongDoubleConversion(cUnit, mir); case INLINE_STRING_EQUALS: case INLINE_MATH_COS: case INLINE_MATH_SIN: + case INLINE_FLOAT_TO_INT_BITS: + case INLINE_DOUBLE_TO_LONG_BITS: break; /* Handle with C routine */ default: dvmCompilerAbort(cUnit); |
