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

Side by Side Diff: src/mips64/code-stubs-mips64.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/mips/code-stubs-mips.cc ('k') | src/ppc/code-stubs-ppc.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_MIPS64 5 #if V8_TARGET_ARCH_MIPS64
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/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/codegen.h" 10 #include "src/codegen.h"
(...skipping 1254 matching lines...) Expand 10 before | Expand all | Expand 10 after
1265 1265
1266 // Restore callee-saved fpu registers. 1266 // Restore callee-saved fpu registers.
1267 __ MultiPopFPU(kCalleeSavedFPU); 1267 __ MultiPopFPU(kCalleeSavedFPU);
1268 1268
1269 // Restore callee saved registers from the stack. 1269 // Restore callee saved registers from the stack.
1270 __ MultiPop(kCalleeSaved | ra.bit()); 1270 __ MultiPop(kCalleeSaved | ra.bit());
1271 // Return. 1271 // Return.
1272 __ Jump(ra); 1272 __ Jump(ra);
1273 } 1273 }
1274 1274
1275
1276 void LoadIndexedStringStub::Generate(MacroAssembler* masm) {
1277 // Return address is in ra.
1278 Label miss;
1279
1280 Register receiver = LoadDescriptor::ReceiverRegister();
1281 Register index = LoadDescriptor::NameRegister();
1282 Register scratch = a5;
1283 Register result = v0;
1284 DCHECK(!scratch.is(receiver) && !scratch.is(index));
1285 DCHECK(!scratch.is(LoadWithVectorDescriptor::VectorRegister()));
1286
1287 StringCharAtGenerator char_at_generator(receiver, index, scratch, result,
1288 &miss, // When not a string.
1289 &miss, // When not a number.
1290 &miss, // When index out of range.
1291 RECEIVER_IS_STRING);
1292 char_at_generator.GenerateFast(masm);
1293 __ Ret();
1294
1295 StubRuntimeCallHelper call_helper;
1296 char_at_generator.GenerateSlow(masm, PART_OF_IC_HANDLER, call_helper);
1297
1298 __ bind(&miss);
1299 PropertyAccessCompiler::TailCallBuiltin(
1300 masm, PropertyAccessCompiler::MissBuiltin(Code::KEYED_LOAD_IC));
1301 }
1302
1303
1304 void FunctionPrototypeStub::Generate(MacroAssembler* masm) { 1275 void FunctionPrototypeStub::Generate(MacroAssembler* masm) {
1305 Label miss; 1276 Label miss;
1306 Register receiver = LoadDescriptor::ReceiverRegister(); 1277 Register receiver = LoadDescriptor::ReceiverRegister();
1307 // Ensure that the vector and slot registers won't be clobbered before 1278 // Ensure that the vector and slot registers won't be clobbered before
1308 // calling the miss handler. 1279 // calling the miss handler.
1309 DCHECK(!AreAliased(a4, a5, LoadWithVectorDescriptor::VectorRegister(), 1280 DCHECK(!AreAliased(a4, a5, LoadWithVectorDescriptor::VectorRegister(),
1310 LoadWithVectorDescriptor::SlotRegister())); 1281 LoadWithVectorDescriptor::SlotRegister()));
1311 1282
1312 NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, a4, 1283 NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, a4,
1313 a5, &miss); 1284 a5, &miss);
(...skipping 677 matching lines...) Expand 10 before | Expand all | Expand 10 after
1991 __ CallRuntime(Runtime::kStringCharCodeAtRT); 1962 __ CallRuntime(Runtime::kStringCharCodeAtRT);
1992 1963
1993 __ Move(result_, v0); 1964 __ Move(result_, v0);
1994 1965
1995 call_helper.AfterCall(masm); 1966 call_helper.AfterCall(masm);
1996 __ jmp(&exit_); 1967 __ jmp(&exit_);
1997 1968
1998 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); 1969 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase);
1999 } 1970 }
2000 1971
2001
2002 // -------------------------------------------------------------------------
2003 // StringCharFromCodeGenerator
2004
2005 void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
2006 // Fast case of Heap::LookupSingleCharacterStringFromCode.
2007 __ JumpIfNotSmi(code_, &slow_case_);
2008 __ Branch(&slow_case_, hi, code_,
2009 Operand(Smi::FromInt(String::kMaxOneByteCharCode)));
2010
2011 __ LoadRoot(result_, Heap::kSingleCharacterStringCacheRootIndex);
2012 // At this point code register contains smi tagged one_byte char code.
2013 __ SmiScale(at, code_, kPointerSizeLog2);
2014 __ Daddu(result_, result_, at);
2015 __ ld(result_, FieldMemOperand(result_, FixedArray::kHeaderSize));
2016 __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
2017 __ Branch(&slow_case_, eq, result_, Operand(at));
2018 __ bind(&exit_);
2019 }
2020
2021
2022 void StringCharFromCodeGenerator::GenerateSlow(
2023 MacroAssembler* masm,
2024 const RuntimeCallHelper& call_helper) {
2025 __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase);
2026
2027 __ bind(&slow_case_);
2028 call_helper.BeforeCall(masm);
2029 __ push(code_);
2030 __ CallRuntime(Runtime::kStringCharFromCode);
2031 __ Move(result_, v0);
2032
2033 call_helper.AfterCall(masm);
2034 __ Branch(&exit_);
2035
2036 __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase);
2037 }
2038
2039 void StringHelper::GenerateFlatOneByteStringEquals( 1972 void StringHelper::GenerateFlatOneByteStringEquals(
2040 MacroAssembler* masm, Register left, Register right, Register scratch1, 1973 MacroAssembler* masm, Register left, Register right, Register scratch1,
2041 Register scratch2, Register scratch3) { 1974 Register scratch2, Register scratch3) {
2042 Register length = scratch1; 1975 Register length = scratch1;
2043 1976
2044 // Compare lengths. 1977 // Compare lengths.
2045 Label strings_not_equal, check_zero_length; 1978 Label strings_not_equal, check_zero_length;
2046 __ ld(length, FieldMemOperand(left, String::kLengthOffset)); 1979 __ ld(length, FieldMemOperand(left, String::kLengthOffset));
2047 __ ld(scratch2, FieldMemOperand(right, String::kLengthOffset)); 1980 __ ld(scratch2, FieldMemOperand(right, String::kLengthOffset));
2048 __ Branch(&check_zero_length, eq, length, Operand(scratch2)); 1981 __ Branch(&check_zero_length, eq, length, Operand(scratch2));
(...skipping 1570 matching lines...) Expand 10 before | Expand all | Expand 10 after
3619 kStackUnwindSpace, kInvalidStackOffset, 3552 kStackUnwindSpace, kInvalidStackOffset,
3620 return_value_operand, NULL); 3553 return_value_operand, NULL);
3621 } 3554 }
3622 3555
3623 #undef __ 3556 #undef __
3624 3557
3625 } // namespace internal 3558 } // namespace internal
3626 } // namespace v8 3559 } // namespace v8
3627 3560
3628 #endif // V8_TARGET_ARCH_MIPS64 3561 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/mips/code-stubs-mips.cc ('k') | src/ppc/code-stubs-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698