summaryrefslogtreecommitdiff
path: root/src/compiler/codegen/GenInvoke.cc
diff options
context:
space:
mode:
author jeffhao <jeffhao@google.com> 2012-08-10 13:04:01 -0700
committer jeffhao <jeffhao@google.com> 2012-08-10 13:04:01 -0700
commit634ea28f78c4a138e6a1de54eae8696095422415 (patch)
tree9852d454d5168462f3d75c5497d6582cfb1e950f /src/compiler/codegen/GenInvoke.cc
parent86e4671975752b112b2e8969ac6652c72c8e86c7 (diff)
Implemented inline of String charAton x86.
Change-Id: I5899d5169096adf9b2563a7160c60d05e2ab3e9d
Diffstat (limited to 'src/compiler/codegen/GenInvoke.cc')
-rw-r--r--src/compiler/codegen/GenInvoke.cc28
1 files changed, 24 insertions, 4 deletions
diff --git a/src/compiler/codegen/GenInvoke.cc b/src/compiler/codegen/GenInvoke.cc
index d75234e38e..29bd2a6c6d 100644
--- a/src/compiler/codegen/GenInvoke.cc
+++ b/src/compiler/codegen/GenInvoke.cc
@@ -609,7 +609,7 @@ RegLocation inlineTargetWide(CompilationUnit* cUnit, CallInfo* info)
bool genInlinedCharAt(CompilationUnit* cUnit, CallInfo* info)
{
-#if defined(TARGET_ARM)
+#if defined(TARGET_ARM) || defined(TARGET_X86)
// Location of reference to data array
int valueOffset = String::ValueOffset().Int32Value();
// Location of count
@@ -624,17 +624,18 @@ bool genInlinedCharAt(CompilationUnit* cUnit, CallInfo* info)
rlObj = loadValue(cUnit, rlObj, kCoreReg);
rlIdx = loadValue(cUnit, rlIdx, kCoreReg);
int regMax;
- int regOff = oatAllocTemp(cUnit);
- int regPtr = oatAllocTemp(cUnit);
genNullCheck(cUnit, rlObj.sRegLow, rlObj.lowReg, info->optFlags);
bool rangeCheck = (!(info->optFlags & MIR_IGNORE_RANGE_CHECK));
+ LIR* launchPad = NULL;
+#if !defined(TARGET_X86)
+ int regOff = oatAllocTemp(cUnit);
+ int regPtr = oatAllocTemp(cUnit);
if (rangeCheck) {
regMax = oatAllocTemp(cUnit);
loadWordDisp(cUnit, rlObj.lowReg, countOffset, regMax);
}
loadWordDisp(cUnit, rlObj.lowReg, offsetOffset, regOff);
loadWordDisp(cUnit, rlObj.lowReg, valueOffset, regPtr);
- LIR* launchPad = NULL;
if (rangeCheck) {
// Set up a launch pad to allow retry in case of bounds violation */
launchPad = rawLIR(cUnit, 0, kPseudoIntrinsicRetry, (uintptr_t)info);
@@ -644,8 +645,27 @@ bool genInlinedCharAt(CompilationUnit* cUnit, CallInfo* info)
oatFreeTemp(cUnit, regMax);
opCondBranch(cUnit, kCondCs, launchPad);
}
+#else
+ if (rangeCheck) {
+ regMax = oatAllocTemp(cUnit);
+ loadWordDisp(cUnit, rlObj.lowReg, countOffset, regMax);
+ // Set up a launch pad to allow retry in case of bounds violation */
+ launchPad = rawLIR(cUnit, 0, kPseudoIntrinsicRetry, (uintptr_t)info);
+ oatInsertGrowableList(cUnit, &cUnit->intrinsicLaunchpads,
+ (intptr_t)launchPad);
+ opRegReg(cUnit, kOpCmp, rlIdx.lowReg, regMax);
+ oatFreeTemp(cUnit, regMax);
+ opCondBranch(cUnit, kCondCc, launchPad);
+ }
+ int regOff = oatAllocTemp(cUnit);
+ int regPtr = oatAllocTemp(cUnit);
+ loadWordDisp(cUnit, rlObj.lowReg, offsetOffset, regOff);
+ loadWordDisp(cUnit, rlObj.lowReg, valueOffset, regPtr);
+#endif
opRegImm(cUnit, kOpAdd, regPtr, dataOffset);
opRegReg(cUnit, kOpAdd, regOff, rlIdx.lowReg);
+ oatFreeTemp(cUnit, rlObj.lowReg);
+ oatFreeTemp(cUnit, rlIdx.lowReg);
RegLocation rlDest = inlineTarget(cUnit, info);
RegLocation rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true);
loadBaseIndexed(cUnit, regPtr, regOff, rlResult.lowReg, 1, kUnsignedHalf);