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

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

Issue 1233903003: MIPS64: Fix string stubs. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 5 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 | « no previous file | no next file » | 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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #if V8_TARGET_ARCH_MIPS64 7 #if V8_TARGET_ARCH_MIPS64
8 8
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 3182 matching lines...) Expand 10 before | Expand all | Expand 10 after
3193 3193
3194 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase); 3194 __ Abort(kUnexpectedFallthroughFromCharCodeAtSlowCase);
3195 } 3195 }
3196 3196
3197 3197
3198 // ------------------------------------------------------------------------- 3198 // -------------------------------------------------------------------------
3199 // StringCharFromCodeGenerator 3199 // StringCharFromCodeGenerator
3200 3200
3201 void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) { 3201 void StringCharFromCodeGenerator::GenerateFast(MacroAssembler* masm) {
3202 // Fast case of Heap::LookupSingleCharacterStringFromCode. 3202 // Fast case of Heap::LookupSingleCharacterStringFromCode.
3203 3203 __ JumpIfNotSmi(code_, &slow_case_);
3204 DCHECK(!a4.is(result_)); 3204 __ Branch(&slow_case_, hi, code_,
3205 DCHECK(!a4.is(code_)); 3205 Operand(Smi::FromInt(String::kMaxOneByteCharCode)));
3206
3207 STATIC_ASSERT(kSmiTag == 0);
3208 DCHECK(base::bits::IsPowerOfTwo32(String::kMaxOneByteCharCodeU + 1));
3209 __ And(a4, code_, Operand(kSmiTagMask |
3210 ((~String::kMaxOneByteCharCodeU) << kSmiTagSize)));
3211 __ Branch(&slow_case_, ne, a4, Operand(zero_reg));
3212
3213 3206
3214 __ LoadRoot(result_, Heap::kSingleCharacterStringCacheRootIndex); 3207 __ LoadRoot(result_, Heap::kSingleCharacterStringCacheRootIndex);
3215 // At this point code register contains smi tagged one_byte char code. 3208 // At this point code register contains smi tagged one_byte char code.
3216 STATIC_ASSERT(kSmiTag == 0); 3209 __ SmiScale(at, code_, kPointerSizeLog2);
3217 __ SmiScale(a4, code_, kPointerSizeLog2); 3210 __ Daddu(result_, result_, at);
3218 __ Daddu(result_, result_, a4);
3219 __ ld(result_, FieldMemOperand(result_, FixedArray::kHeaderSize)); 3211 __ ld(result_, FieldMemOperand(result_, FixedArray::kHeaderSize));
3220 __ LoadRoot(a4, Heap::kUndefinedValueRootIndex); 3212 __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
3221 __ Branch(&slow_case_, eq, result_, Operand(a4)); 3213 __ Branch(&slow_case_, eq, result_, Operand(at));
3222 __ bind(&exit_); 3214 __ bind(&exit_);
3223 } 3215 }
3224 3216
3225 3217
3226 void StringCharFromCodeGenerator::GenerateSlow( 3218 void StringCharFromCodeGenerator::GenerateSlow(
3227 MacroAssembler* masm, 3219 MacroAssembler* masm,
3228 const RuntimeCallHelper& call_helper) { 3220 const RuntimeCallHelper& call_helper) {
3229 __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase); 3221 __ Abort(kUnexpectedFallthroughToCharFromCodeSlowCase);
3230 3222
3231 __ bind(&slow_case_); 3223 __ bind(&slow_case_);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
3299 // both "from" and "to" are smis, and 3291 // both "from" and "to" are smis, and
3300 // 0 <= from <= to <= string.length. 3292 // 0 <= from <= to <= string.length.
3301 // If any of these assumptions fail, we call the runtime system. 3293 // If any of these assumptions fail, we call the runtime system.
3302 3294
3303 const int kToOffset = 0 * kPointerSize; 3295 const int kToOffset = 0 * kPointerSize;
3304 const int kFromOffset = 1 * kPointerSize; 3296 const int kFromOffset = 1 * kPointerSize;
3305 const int kStringOffset = 2 * kPointerSize; 3297 const int kStringOffset = 2 * kPointerSize;
3306 3298
3307 __ ld(a2, MemOperand(sp, kToOffset)); 3299 __ ld(a2, MemOperand(sp, kToOffset));
3308 __ ld(a3, MemOperand(sp, kFromOffset)); 3300 __ ld(a3, MemOperand(sp, kFromOffset));
3309 // Does not needed? 3301
3310 // STATIC_ASSERT(kFromOffset == kToOffset + 4);
3311 STATIC_ASSERT(kSmiTag == 0); 3302 STATIC_ASSERT(kSmiTag == 0);
3312 // Does not needed?
3313 // STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1);
3314 3303
3315 // Utilize delay slots. SmiUntag doesn't emit a jump, everything else is 3304 // Utilize delay slots. SmiUntag doesn't emit a jump, everything else is
3316 // safe in this case. 3305 // safe in this case.
3317 __ JumpIfNotSmi(a2, &runtime); 3306 __ JumpIfNotSmi(a2, &runtime);
3318 __ JumpIfNotSmi(a3, &runtime); 3307 __ JumpIfNotSmi(a3, &runtime);
3319 // Both a2 and a3 are untagged integers. 3308 // Both a2 and a3 are untagged integers.
3320 3309
3321 __ SmiUntag(a2, a2); 3310 __ SmiUntag(a2, a2);
3322 __ SmiUntag(a3, a3); 3311 __ SmiUntag(a3, a3);
3323 __ Branch(&runtime, lt, a3, Operand(zero_reg)); // From < 0. 3312 __ Branch(&runtime, lt, a3, Operand(zero_reg)); // From < 0.
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
3496 3485
3497 // Just jump to runtime to create the sub string. 3486 // Just jump to runtime to create the sub string.
3498 __ bind(&runtime); 3487 __ bind(&runtime);
3499 __ TailCallRuntime(Runtime::kSubStringRT, 3, 1); 3488 __ TailCallRuntime(Runtime::kSubStringRT, 3, 1);
3500 3489
3501 __ bind(&single_char); 3490 __ bind(&single_char);
3502 // v0: original string 3491 // v0: original string
3503 // a1: instance type 3492 // a1: instance type
3504 // a2: length 3493 // a2: length
3505 // a3: from index (untagged) 3494 // a3: from index (untagged)
3495 __ SmiTag(a3);
3506 StringCharAtGenerator generator(v0, a3, a2, v0, &runtime, &runtime, &runtime, 3496 StringCharAtGenerator generator(v0, a3, a2, v0, &runtime, &runtime, &runtime,
3507 STRING_INDEX_IS_NUMBER, RECEIVER_IS_STRING); 3497 STRING_INDEX_IS_NUMBER, RECEIVER_IS_STRING);
3508 generator.GenerateFast(masm); 3498 generator.GenerateFast(masm);
3509 __ DropAndRet(3); 3499 __ DropAndRet(3);
3510 generator.SkipSlow(masm, &runtime); 3500 generator.SkipSlow(masm, &runtime);
3511 } 3501 }
3512 3502
3513 3503
3514 void ToNumberStub::Generate(MacroAssembler* masm) { 3504 void ToNumberStub::Generate(MacroAssembler* masm) {
3515 // The ToNumber stub takes one argument in a0. 3505 // The ToNumber stub takes one argument in a0.
(...skipping 2104 matching lines...) Expand 10 before | Expand all | Expand 10 after
5620 MemOperand(fp, 6 * kPointerSize), NULL); 5610 MemOperand(fp, 6 * kPointerSize), NULL);
5621 } 5611 }
5622 5612
5623 5613
5624 #undef __ 5614 #undef __
5625 5615
5626 } // namespace internal 5616 } // namespace internal
5627 } // namespace v8 5617 } // namespace v8
5628 5618
5629 #endif // V8_TARGET_ARCH_MIPS64 5619 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698