Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: src/mips/code-stubs-mips.cc

Issue 2682153003: [stubs] Port LoadIndexedStringStub to CSA (Closed)
Patch Set: move to builtins-handler.cc Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ic/handler-compiler.cc ('k') | src/mips64/code-stubs-mips64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #if V8_TARGET_ARCH_MIPS 5 #if V8_TARGET_ARCH_MIPS
6 6
7 #include "src/code-stubs.h" 7 #include "src/code-stubs.h"
8 #include "src/api-arguments.h" 8 #include "src/api-arguments.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/bootstrapper.h" 10 #include "src/bootstrapper.h"
(...skipping 1259 matching lines...) Expand 10 before | Expand all | Expand 10 after
1270 1270
1271 // Restore callee-saved fpu registers. 1271 // Restore callee-saved fpu registers.
1272 __ MultiPopFPU(kCalleeSavedFPU); 1272 __ MultiPopFPU(kCalleeSavedFPU);
1273 1273
1274 // Restore callee saved registers from the stack. 1274 // Restore callee saved registers from the stack.
1275 __ MultiPop(kCalleeSaved | ra.bit()); 1275 __ MultiPop(kCalleeSaved | ra.bit());
1276 // Return. 1276 // Return.
1277 __ Jump(ra); 1277 __ Jump(ra);
1278 } 1278 }
1279 1279
1280
1281 void LoadIndexedStringStub::Generate(MacroAssembler* masm) {
1282 // Return address is in ra.
1283 Label miss;
1284
1285 Register receiver = LoadDescriptor::ReceiverRegister();
1286 Register index = LoadDescriptor::NameRegister();
1287 Register scratch = t1;
1288 Register result = v0;
1289 DCHECK(!scratch.is(receiver) && !scratch.is(index));
1290 DCHECK(!scratch.is(LoadWithVectorDescriptor::VectorRegister()));
1291
1292 StringCharAtGenerator char_at_generator(receiver, index, scratch, result,
1293 &miss, // When not a string.
1294 &miss, // When not a number.
1295 &miss, // When index out of range.
1296 RECEIVER_IS_STRING);
1297 char_at_generator.GenerateFast(masm);
1298 __ Ret();
1299
1300 StubRuntimeCallHelper call_helper;
1301 char_at_generator.GenerateSlow(masm, PART_OF_IC_HANDLER, call_helper);
1302
1303 __ bind(&miss);
1304 PropertyAccessCompiler::TailCallBuiltin(
1305 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC));
1306 }
1307
1308
1309 void FunctionPrototypeStub::Generate(MacroAssembler* masm) { 1280 void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
1310 Label miss; 1281 Label miss;
1311 Register receiver = LoadDescriptor::ReceiverRegister(); 1282 Register receiver = LoadDescriptor::ReceiverRegister();
1312 // Ensure that the vector and slot registers won't be clobbered before 1283 // Ensure that the vector and slot registers won't be clobbered before
1313 // calling the miss handler. 1284 // calling the miss handler.
1314 DCHECK(!AreAliased(t0, t1, LoadWithVectorDescriptor::VectorRegister(), 1285 DCHECK(!AreAliased(t0, t1, LoadWithVectorDescriptor::VectorRegister(),
1315 LoadWithVectorDescriptor::SlotRegister())); 1286 LoadWithVectorDescriptor::SlotRegister()));
1316 1287
1317 NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, t0, 1288 NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, t0,
1318 t1, &miss); 1289 t1, &miss);
(...skipping 664 matching lines...) Expand 10 before | Expand all | Expand 10 after
1983 __ CallRuntime(Runtime::kStringCharCodeAtRT); 1954 __ CallRuntime(Runtime::kStringCharCodeAtRT);
1984 1955
1985 __ Move(result_, v0); 1956 __ Move(result_, v0);
1986 1957
1987 call_helper.AfterCall(masm); 1958 call_helper.AfterCall(masm);
1988 __ jmp(&exit_); 1959 __ jmp(&exit_);
1989 1960
1990 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); 1961 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase);
1991 } 1962 }
1992 1963
1993
1994 // -------------------------------------------------------------------------
1995 // StringCharFromCodeGenerator
1996
1997 void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
1998 // Fast case of Heap::LookupSingleCharacterStringFromCode.
1999
2000 DCHECK(!t0.is(result_));
2001 DCHECK(!t0.is(code_));
2002
2003 STATIC_ASSERT(kSmiTag == 0);
2004 STATIC_ASSERT(kSmiShiftSize == 0);
2005 DCHECK(base::bits::IsPowerOfTwo32(String::kMaxOneByteCharCodeU + 1));
2006 __ And(t0, code_, Operand(kSmiTagMask |
2007 ((~String::kMaxOneByteCharCodeU) << kSmiTagSize)));
2008 __ Branch(&slow_case_, ne, t0, Operand(zero_reg));
2009
2010 __ LoadRoot(result_, Heap::kSingleCharacterStringCacheRootIndex);
2011 // At this point code register contains smi tagged one-byte char code.
2012 STATIC_ASSERT(kSmiTag == 0);
2013 __ Lsa(result_, result_, code_, kPointerSizeLog2 - kSmiTagSize);
2014 __ lw(result_, FieldMemOperand(result_, FixedArray::kHeaderSize));
2015 __ LoadRoot(t0, Heap::kUndefinedValueRootIndex);
2016 __ Branch(&slow_case_, eq, result_, Operand(t0));
2017 __ bind(&exit_);
2018 }
2019
2020
2021 void StringCharFromCodeGenerator::GenerateSlow(
2022 MacroAssembler* masm,
2023 const RuntimeCallHelper& call_helper) {
2024 __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase);
2025
2026 __ bind(&slow_case_);
2027 call_helper.BeforeCall(masm);
2028 __ push(code_);
2029 __ CallRuntime(Runtime::kStringCharFromCode);
2030 __ Move(result_, v0);
2031
2032 call_helper.AfterCall(masm);
2033 __ Branch(&exit_);
2034
2035 __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase);
2036 }
2037
2038 void StringHelper::GenerateFlatOneByteStringEquals( 1964 void StringHelper::GenerateFlatOneByteStringEquals(
2039 MacroAssembler* masm, Register left, Register right, Register scratch1, 1965 MacroAssembler* masm, Register left, Register right, Register scratch1,
2040 Register scratch2, Register scratch3) { 1966 Register scratch2, Register scratch3) {
2041 Register length = scratch1; 1967 Register length = scratch1;
2042 1968
2043 // Compare lengths. 1969 // Compare lengths.
2044 Label strings_not_equal, check_zero_length; 1970 Label strings_not_equal, check_zero_length;
2045 __ lw(length, FieldMemOperand(left, String::kLengthOffset)); 1971 __ lw(length, FieldMemOperand(left, String::kLengthOffset));
2046 __ lw(scratch2, FieldMemOperand(right, String::kLengthOffset)); 1972 __ lw(scratch2, FieldMemOperand(right, String::kLengthOffset));
2047 __ Branch(&check_zero_length, eq, length, Operand(scratch2)); 1973 __ Branch(&check_zero_length, eq, length, Operand(scratch2));
(...skipping 1564 matching lines...) Expand 10 before | Expand all | Expand 10 after
3612 kStackUnwindSpace, kInvalidStackOffset, 3538 kStackUnwindSpace, kInvalidStackOffset,
3613 return_value_operand, NULL); 3539 return_value_operand, NULL);
3614 } 3540 }
3615 3541
3616 #undef __ 3542 #undef __
3617 3543
3618 } // namespace internal 3544 } // namespace internal
3619 } // namespace v8 3545 } // namespace v8
3620 3546
3621 #endif // V8_TARGET_ARCH_MIPS 3547 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « src/ic/handler-compiler.cc ('k') | src/mips64/code-stubs-mips64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698