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

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

Issue 530343005: Clean up code stubs and ensure distinct major keys. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 3 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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_ARM64 7 #if V8_TARGET_ARCH_ARM64
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 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
476 Register left_bitfield = left_type; 476 Register left_bitfield = left_type;
477 __ Ldrb(right_bitfield, FieldMemOperand(right_map, Map::kBitFieldOffset)); 477 __ Ldrb(right_bitfield, FieldMemOperand(right_map, Map::kBitFieldOffset));
478 __ Ldrb(left_bitfield, FieldMemOperand(left_map, Map::kBitFieldOffset)); 478 __ Ldrb(left_bitfield, FieldMemOperand(left_map, Map::kBitFieldOffset));
479 __ And(result, right_bitfield, left_bitfield); 479 __ And(result, right_bitfield, left_bitfield);
480 __ And(result, result, 1 << Map::kIsUndetectable); 480 __ And(result, result, 1 << Map::kIsUndetectable);
481 __ Eor(result, result, 1 << Map::kIsUndetectable); 481 __ Eor(result, result, 1 << Map::kIsUndetectable);
482 __ Ret(); 482 __ Ret();
483 } 483 }
484 484
485 485
486 static void ICCompareStub_CheckInputType(MacroAssembler* masm, 486 static void CompareICStub_CheckInputType(MacroAssembler* masm, Register input,
487 Register input,
488 Register scratch, 487 Register scratch,
489 CompareIC::State expected, 488 CompareIC::State expected,
490 Label* fail) { 489 Label* fail) {
491 Label ok; 490 Label ok;
492 if (expected == CompareIC::SMI) { 491 if (expected == CompareIC::SMI) {
493 __ JumpIfNotSmi(input, fail); 492 __ JumpIfNotSmi(input, fail);
494 } else if (expected == CompareIC::NUMBER) { 493 } else if (expected == CompareIC::NUMBER) {
495 __ JumpIfSmi(input, &ok); 494 __ JumpIfSmi(input, &ok);
496 __ CheckMap(input, scratch, Heap::kHeapNumberMapRootIndex, fail, 495 __ CheckMap(input, scratch, Heap::kHeapNumberMapRootIndex, fail,
497 DONT_DO_SMI_CHECK); 496 DONT_DO_SMI_CHECK);
498 } 497 }
499 // We could be strict about internalized/non-internalized here, but as long as 498 // We could be strict about internalized/non-internalized here, but as long as
500 // hydrogen doesn't care, the stub doesn't have to care either. 499 // hydrogen doesn't care, the stub doesn't have to care either.
501 __ Bind(&ok); 500 __ Bind(&ok);
502 } 501 }
503 502
504 503
505 void ICCompareStub::GenerateGeneric(MacroAssembler* masm) { 504 void CompareICStub::GenerateGeneric(MacroAssembler* masm) {
506 Register lhs = x1; 505 Register lhs = x1;
507 Register rhs = x0; 506 Register rhs = x0;
508 Register result = x0; 507 Register result = x0;
509 Condition cond = GetCondition(); 508 Condition cond = GetCondition();
510 509
511 Label miss; 510 Label miss;
512 ICCompareStub_CheckInputType(masm, lhs, x2, left(), &miss); 511 CompareICStub_CheckInputType(masm, lhs, x2, left(), &miss);
513 ICCompareStub_CheckInputType(masm, rhs, x3, right(), &miss); 512 CompareICStub_CheckInputType(masm, rhs, x3, right(), &miss);
514 513
515 Label slow; // Call builtin. 514 Label slow; // Call builtin.
516 Label not_smis, both_loaded_as_doubles; 515 Label not_smis, both_loaded_as_doubles;
517 Label not_two_smis, smi_done; 516 Label not_two_smis, smi_done;
518 __ JumpIfEitherNotSmi(lhs, rhs, &not_two_smis); 517 __ JumpIfEitherNotSmi(lhs, rhs, &not_two_smis);
519 __ SmiUntag(lhs); 518 __ SmiUntag(lhs);
520 __ Sub(result, lhs, Operand::UntagSmi(rhs)); 519 __ Sub(result, lhs, Operand::UntagSmi(rhs));
521 __ Ret(); 520 __ Ret();
522 521
523 __ Bind(&not_two_smis); 522 __ Bind(&not_two_smis);
(...skipping 2666 matching lines...) Expand 10 before | Expand all | Expand 10 after
3190 __ Push(code_); 3189 __ Push(code_);
3191 __ CallRuntime(Runtime::kCharFromCode, 1); 3190 __ CallRuntime(Runtime::kCharFromCode, 1);
3192 __ Mov(result_, x0); 3191 __ Mov(result_, x0);
3193 call_helper.AfterCall(masm); 3192 call_helper.AfterCall(masm);
3194 __ B(&exit_); 3193 __ B(&exit_);
3195 3194
3196 __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase); 3195 __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase);
3197 } 3196 }
3198 3197
3199 3198
3200 void ICCompareStub::GenerateSmis(MacroAssembler* masm) { 3199 void CompareICStub::GenerateSmis(MacroAssembler* masm) {
3201 // Inputs are in x0 (lhs) and x1 (rhs). 3200 // Inputs are in x0 (lhs) and x1 (rhs).
3202 DCHECK(state() == CompareIC::SMI); 3201 DCHECK(state() == CompareIC::SMI);
3203 ASM_LOCATION("ICCompareStub[Smis]"); 3202 ASM_LOCATION("CompareICStub[Smis]");
3204 Label miss; 3203 Label miss;
3205 // Bail out (to 'miss') unless both x0 and x1 are smis. 3204 // Bail out (to 'miss') unless both x0 and x1 are smis.
3206 __ JumpIfEitherNotSmi(x0, x1, &miss); 3205 __ JumpIfEitherNotSmi(x0, x1, &miss);
3207 3206
3208 if (GetCondition() == eq) { 3207 if (GetCondition() == eq) {
3209 // For equality we do not care about the sign of the result. 3208 // For equality we do not care about the sign of the result.
3210 __ Sub(x0, x0, x1); 3209 __ Sub(x0, x0, x1);
3211 } else { 3210 } else {
3212 // Untag before subtracting to avoid handling overflow. 3211 // Untag before subtracting to avoid handling overflow.
3213 __ SmiUntag(x1); 3212 __ SmiUntag(x1);
3214 __ Sub(x0, x1, Operand::UntagSmi(x0)); 3213 __ Sub(x0, x1, Operand::UntagSmi(x0));
3215 } 3214 }
3216 __ Ret(); 3215 __ Ret();
3217 3216
3218 __ Bind(&miss); 3217 __ Bind(&miss);
3219 GenerateMiss(masm); 3218 GenerateMiss(masm);
3220 } 3219 }
3221 3220
3222 3221
3223 void ICCompareStub::GenerateNumbers(MacroAssembler* masm) { 3222 void CompareICStub::GenerateNumbers(MacroAssembler* masm) {
3224 DCHECK(state() == CompareIC::NUMBER); 3223 DCHECK(state() == CompareIC::NUMBER);
3225 ASM_LOCATION("ICCompareStub[HeapNumbers]"); 3224 ASM_LOCATION("CompareICStub[HeapNumbers]");
3226 3225
3227 Label unordered, maybe_undefined1, maybe_undefined2; 3226 Label unordered, maybe_undefined1, maybe_undefined2;
3228 Label miss, handle_lhs, values_in_d_regs; 3227 Label miss, handle_lhs, values_in_d_regs;
3229 Label untag_rhs, untag_lhs; 3228 Label untag_rhs, untag_lhs;
3230 3229
3231 Register result = x0; 3230 Register result = x0;
3232 Register rhs = x0; 3231 Register rhs = x0;
3233 Register lhs = x1; 3232 Register lhs = x1;
3234 FPRegister rhs_d = d0; 3233 FPRegister rhs_d = d0;
3235 FPRegister lhs_d = d1; 3234 FPRegister lhs_d = d1;
(...skipping 23 matching lines...) Expand all
3259 3258
3260 __ Bind(&values_in_d_regs); 3259 __ Bind(&values_in_d_regs);
3261 __ Fcmp(lhs_d, rhs_d); 3260 __ Fcmp(lhs_d, rhs_d);
3262 __ B(vs, &unordered); // Overflow flag set if either is NaN. 3261 __ B(vs, &unordered); // Overflow flag set if either is NaN.
3263 STATIC_ASSERT((LESS == -1) && (EQUAL == 0) && (GREATER == 1)); 3262 STATIC_ASSERT((LESS == -1) && (EQUAL == 0) && (GREATER == 1));
3264 __ Cset(result, gt); // gt => 1, otherwise (lt, eq) => 0 (EQUAL). 3263 __ Cset(result, gt); // gt => 1, otherwise (lt, eq) => 0 (EQUAL).
3265 __ Csinv(result, result, xzr, ge); // lt => -1, gt => 1, eq => 0. 3264 __ Csinv(result, result, xzr, ge); // lt => -1, gt => 1, eq => 0.
3266 __ Ret(); 3265 __ Ret();
3267 3266
3268 __ Bind(&unordered); 3267 __ Bind(&unordered);
3269 ICCompareStub stub(isolate(), op(), CompareIC::GENERIC, CompareIC::GENERIC, 3268 CompareICStub stub(isolate(), op(), CompareIC::GENERIC, CompareIC::GENERIC,
3270 CompareIC::GENERIC); 3269 CompareIC::GENERIC);
3271 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); 3270 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
3272 3271
3273 __ Bind(&maybe_undefined1); 3272 __ Bind(&maybe_undefined1);
3274 if (Token::IsOrderedRelationalCompareOp(op())) { 3273 if (Token::IsOrderedRelationalCompareOp(op())) {
3275 __ JumpIfNotRoot(rhs, Heap::kUndefinedValueRootIndex, &miss); 3274 __ JumpIfNotRoot(rhs, Heap::kUndefinedValueRootIndex, &miss);
3276 __ JumpIfSmi(lhs, &unordered); 3275 __ JumpIfSmi(lhs, &unordered);
3277 __ JumpIfNotObjectType(lhs, x10, x10, HEAP_NUMBER_TYPE, &maybe_undefined2); 3276 __ JumpIfNotObjectType(lhs, x10, x10, HEAP_NUMBER_TYPE, &maybe_undefined2);
3278 __ B(&unordered); 3277 __ B(&unordered);
3279 } 3278 }
3280 3279
3281 __ Bind(&maybe_undefined2); 3280 __ Bind(&maybe_undefined2);
3282 if (Token::IsOrderedRelationalCompareOp(op())) { 3281 if (Token::IsOrderedRelationalCompareOp(op())) {
3283 __ JumpIfRoot(lhs, Heap::kUndefinedValueRootIndex, &unordered); 3282 __ JumpIfRoot(lhs, Heap::kUndefinedValueRootIndex, &unordered);
3284 } 3283 }
3285 3284
3286 __ Bind(&miss); 3285 __ Bind(&miss);
3287 GenerateMiss(masm); 3286 GenerateMiss(masm);
3288 } 3287 }
3289 3288
3290 3289
3291 void ICCompareStub::GenerateInternalizedStrings(MacroAssembler* masm) { 3290 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) {
3292 DCHECK(state() == CompareIC::INTERNALIZED_STRING); 3291 DCHECK(state() == CompareIC::INTERNALIZED_STRING);
3293 ASM_LOCATION("ICCompareStub[InternalizedStrings]"); 3292 ASM_LOCATION("CompareICStub[InternalizedStrings]");
3294 Label miss; 3293 Label miss;
3295 3294
3296 Register result = x0; 3295 Register result = x0;
3297 Register rhs = x0; 3296 Register rhs = x0;
3298 Register lhs = x1; 3297 Register lhs = x1;
3299 3298
3300 // Check that both operands are heap objects. 3299 // Check that both operands are heap objects.
3301 __ JumpIfEitherSmi(lhs, rhs, &miss); 3300 __ JumpIfEitherSmi(lhs, rhs, &miss);
3302 3301
3303 // Check that both operands are internalized strings. 3302 // Check that both operands are internalized strings.
(...skipping 15 matching lines...) Expand all
3319 STATIC_ASSERT(EQUAL == 0); 3318 STATIC_ASSERT(EQUAL == 0);
3320 __ Cmp(lhs, rhs); 3319 __ Cmp(lhs, rhs);
3321 __ Cset(result, ne); 3320 __ Cset(result, ne);
3322 __ Ret(); 3321 __ Ret();
3323 3322
3324 __ Bind(&miss); 3323 __ Bind(&miss);
3325 GenerateMiss(masm); 3324 GenerateMiss(masm);
3326 } 3325 }
3327 3326
3328 3327
3329 void ICCompareStub::GenerateUniqueNames(MacroAssembler* masm) { 3328 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) {
3330 DCHECK(state() == CompareIC::UNIQUE_NAME); 3329 DCHECK(state() == CompareIC::UNIQUE_NAME);
3331 ASM_LOCATION("ICCompareStub[UniqueNames]"); 3330 ASM_LOCATION("CompareICStub[UniqueNames]");
3332 DCHECK(GetCondition() == eq); 3331 DCHECK(GetCondition() == eq);
3333 Label miss; 3332 Label miss;
3334 3333
3335 Register result = x0; 3334 Register result = x0;
3336 Register rhs = x0; 3335 Register rhs = x0;
3337 Register lhs = x1; 3336 Register lhs = x1;
3338 3337
3339 Register lhs_instance_type = w2; 3338 Register lhs_instance_type = w2;
3340 Register rhs_instance_type = w3; 3339 Register rhs_instance_type = w3;
3341 3340
(...skipping 16 matching lines...) Expand all
3358 STATIC_ASSERT(EQUAL == 0); 3357 STATIC_ASSERT(EQUAL == 0);
3359 __ Cmp(lhs, rhs); 3358 __ Cmp(lhs, rhs);
3360 __ Cset(result, ne); 3359 __ Cset(result, ne);
3361 __ Ret(); 3360 __ Ret();
3362 3361
3363 __ Bind(&miss); 3362 __ Bind(&miss);
3364 GenerateMiss(masm); 3363 GenerateMiss(masm);
3365 } 3364 }
3366 3365
3367 3366
3368 void ICCompareStub::GenerateStrings(MacroAssembler* masm) { 3367 void CompareICStub::GenerateStrings(MacroAssembler* masm) {
3369 DCHECK(state() == CompareIC::STRING); 3368 DCHECK(state() == CompareIC::STRING);
3370 ASM_LOCATION("ICCompareStub[Strings]"); 3369 ASM_LOCATION("CompareICStub[Strings]");
3371 3370
3372 Label miss; 3371 Label miss;
3373 3372
3374 bool equality = Token::IsEqualityOp(op()); 3373 bool equality = Token::IsEqualityOp(op());
3375 3374
3376 Register result = x0; 3375 Register result = x0;
3377 Register rhs = x0; 3376 Register rhs = x0;
3378 Register lhs = x1; 3377 Register lhs = x1;
3379 3378
3380 // Check that both operands are heap objects. 3379 // Check that both operands are heap objects.
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
3438 __ TailCallRuntime(Runtime::kStringEquals, 2, 1); 3437 __ TailCallRuntime(Runtime::kStringEquals, 2, 1);
3439 } else { 3438 } else {
3440 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); 3439 __ TailCallRuntime(Runtime::kStringCompare, 2, 1);
3441 } 3440 }
3442 3441
3443 __ Bind(&miss); 3442 __ Bind(&miss);
3444 GenerateMiss(masm); 3443 GenerateMiss(masm);
3445 } 3444 }
3446 3445
3447 3446
3448 void ICCompareStub::GenerateObjects(MacroAssembler* masm) { 3447 void CompareICStub::GenerateObjects(MacroAssembler* masm) {
3449 DCHECK(state() == CompareIC::OBJECT); 3448 DCHECK(state() == CompareIC::OBJECT);
3450 ASM_LOCATION("ICCompareStub[Objects]"); 3449 ASM_LOCATION("CompareICStub[Objects]");
3451 3450
3452 Label miss; 3451 Label miss;
3453 3452
3454 Register result = x0; 3453 Register result = x0;
3455 Register rhs = x0; 3454 Register rhs = x0;
3456 Register lhs = x1; 3455 Register lhs = x1;
3457 3456
3458 __ JumpIfEitherSmi(rhs, lhs, &miss); 3457 __ JumpIfEitherSmi(rhs, lhs, &miss);
3459 3458
3460 __ JumpIfNotObjectType(rhs, x10, x10, JS_OBJECT_TYPE, &miss); 3459 __ JumpIfNotObjectType(rhs, x10, x10, JS_OBJECT_TYPE, &miss);
3461 __ JumpIfNotObjectType(lhs, x10, x10, JS_OBJECT_TYPE, &miss); 3460 __ JumpIfNotObjectType(lhs, x10, x10, JS_OBJECT_TYPE, &miss);
3462 3461
3463 DCHECK(GetCondition() == eq); 3462 DCHECK(GetCondition() == eq);
3464 __ Sub(result, rhs, lhs); 3463 __ Sub(result, rhs, lhs);
3465 __ Ret(); 3464 __ Ret();
3466 3465
3467 __ Bind(&miss); 3466 __ Bind(&miss);
3468 GenerateMiss(masm); 3467 GenerateMiss(masm);
3469 } 3468 }
3470 3469
3471 3470
3472 void ICCompareStub::GenerateKnownObjects(MacroAssembler* masm) { 3471 void CompareICStub::GenerateKnownObjects(MacroAssembler* masm) {
3473 ASM_LOCATION("ICCompareStub[KnownObjects]"); 3472 ASM_LOCATION("CompareICStub[KnownObjects]");
3474 3473
3475 Label miss; 3474 Label miss;
3476 3475
3477 Register result = x0; 3476 Register result = x0;
3478 Register rhs = x0; 3477 Register rhs = x0;
3479 Register lhs = x1; 3478 Register lhs = x1;
3480 3479
3481 __ JumpIfEitherSmi(rhs, lhs, &miss); 3480 __ JumpIfEitherSmi(rhs, lhs, &miss);
3482 3481
3483 Register rhs_map = x10; 3482 Register rhs_map = x10;
3484 Register lhs_map = x11; 3483 Register lhs_map = x11;
3485 __ Ldr(rhs_map, FieldMemOperand(rhs, HeapObject::kMapOffset)); 3484 __ Ldr(rhs_map, FieldMemOperand(rhs, HeapObject::kMapOffset));
3486 __ Ldr(lhs_map, FieldMemOperand(lhs, HeapObject::kMapOffset)); 3485 __ Ldr(lhs_map, FieldMemOperand(lhs, HeapObject::kMapOffset));
3487 __ Cmp(rhs_map, Operand(known_map_)); 3486 __ Cmp(rhs_map, Operand(known_map_));
3488 __ B(ne, &miss); 3487 __ B(ne, &miss);
3489 __ Cmp(lhs_map, Operand(known_map_)); 3488 __ Cmp(lhs_map, Operand(known_map_));
3490 __ B(ne, &miss); 3489 __ B(ne, &miss);
3491 3490
3492 __ Sub(result, rhs, lhs); 3491 __ Sub(result, rhs, lhs);
3493 __ Ret(); 3492 __ Ret();
3494 3493
3495 __ Bind(&miss); 3494 __ Bind(&miss);
3496 GenerateMiss(masm); 3495 GenerateMiss(masm);
3497 } 3496 }
3498 3497
3499 3498
3500 // This method handles the case where a compare stub had the wrong 3499 // This method handles the case where a compare stub had the wrong
3501 // implementation. It calls a miss handler, which re-writes the stub. All other 3500 // implementation. It calls a miss handler, which re-writes the stub. All other
3502 // ICCompareStub::Generate* methods should fall back into this one if their 3501 // CompareICStub::Generate* methods should fall back into this one if their
3503 // operands were not the expected types. 3502 // operands were not the expected types.
3504 void ICCompareStub::GenerateMiss(MacroAssembler* masm) { 3503 void CompareICStub::GenerateMiss(MacroAssembler* masm) {
3505 ASM_LOCATION("ICCompareStub[Miss]"); 3504 ASM_LOCATION("CompareICStub[Miss]");
3506 3505
3507 Register stub_entry = x11; 3506 Register stub_entry = x11;
3508 { 3507 {
3509 ExternalReference miss = 3508 ExternalReference miss =
3510 ExternalReference(IC_Utility(IC::kCompareIC_Miss), isolate()); 3509 ExternalReference(IC_Utility(IC::kCompareIC_Miss), isolate());
3511 3510
3512 FrameScope scope(masm, StackFrame::INTERNAL); 3511 FrameScope scope(masm, StackFrame::INTERNAL);
3513 Register op = x10; 3512 Register op = x10;
3514 Register left = x1; 3513 Register left = x1;
3515 Register right = x0; 3514 Register right = x0;
(...skipping 1599 matching lines...) Expand 10 before | Expand all | Expand 10 after
5115 MemOperand(fp, 6 * kPointerSize), 5114 MemOperand(fp, 6 * kPointerSize),
5116 NULL); 5115 NULL);
5117 } 5116 }
5118 5117
5119 5118
5120 #undef __ 5119 #undef __
5121 5120
5122 } } // namespace v8::internal 5121 } } // namespace v8::internal
5123 5122
5124 #endif // V8_TARGET_ARCH_ARM64 5123 #endif // V8_TARGET_ARCH_ARM64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698