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

Side by Side Diff: src/x64/lithium-codegen-x64.cc

Issue 10831049: Improve constant element index access code generation (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 8 years, 4 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
« no previous file with comments | « src/ia32/lithium-codegen-ia32.cc ('k') | 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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2488 matching lines...) Expand 10 before | Expand all | Expand 10 after
2499 // Subtracting from length accounts for one of them add one more. 2499 // Subtracting from length accounts for one of them add one more.
2500 __ movq(result, Operand(arguments, length, times_pointer_size, kPointerSize)); 2500 __ movq(result, Operand(arguments, length, times_pointer_size, kPointerSize));
2501 } 2501 }
2502 2502
2503 2503
2504 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { 2504 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) {
2505 Register result = ToRegister(instr->result()); 2505 Register result = ToRegister(instr->result());
2506 LOperand* key = instr->key(); 2506 LOperand* key = instr->key();
2507 if (!key->IsConstantOperand()) { 2507 if (!key->IsConstantOperand()) {
2508 Register key_reg = ToRegister(key); 2508 Register key_reg = ToRegister(key);
2509 // Even though the HLoad/StoreKeyedFastElement instructions force the input
2510 // representation for the key to be an integer, the input gets replaced
2511 // during bound check elimination with the index argument to the bounds
2512 // check, which can be tagged, so that case must be handled here, too.
2509 if (instr->hydrogen()->key()->representation().IsTagged()) { 2513 if (instr->hydrogen()->key()->representation().IsTagged()) {
2510 __ SmiToInteger64(key_reg, key_reg); 2514 __ SmiToInteger64(key_reg, key_reg);
2511 } else if (instr->hydrogen()->IsDehoisted()) { 2515 } else if (instr->hydrogen()->IsDehoisted()) {
2512 // Sign extend key because it could be a 32 bit negative value 2516 // Sign extend key because it could be a 32 bit negative value
2513 // and the dehoisted address computation happens in 64 bits 2517 // and the dehoisted address computation happens in 64 bits
2514 __ movsxlq(key_reg, key_reg); 2518 __ movsxlq(key_reg, key_reg);
2515 } 2519 }
2516 } 2520 }
2517 2521
2518 // Load the result. 2522 // Load the result.
(...skipping 16 matching lines...) Expand all
2535 } 2539 }
2536 } 2540 }
2537 2541
2538 2542
2539 void LCodeGen::DoLoadKeyedFastDoubleElement( 2543 void LCodeGen::DoLoadKeyedFastDoubleElement(
2540 LLoadKeyedFastDoubleElement* instr) { 2544 LLoadKeyedFastDoubleElement* instr) {
2541 XMMRegister result(ToDoubleRegister(instr->result())); 2545 XMMRegister result(ToDoubleRegister(instr->result()));
2542 LOperand* key = instr->key(); 2546 LOperand* key = instr->key();
2543 if (!key->IsConstantOperand()) { 2547 if (!key->IsConstantOperand()) {
2544 Register key_reg = ToRegister(key); 2548 Register key_reg = ToRegister(key);
2549 // Even though the HLoad/StoreKeyedFastElement instructions force the input
2550 // representation for the key to be an integer, the input gets replaced
2551 // during bound check elimination with the index argument to the bounds
2552 // check, which can be tagged, so that case must be handled here, too.
2545 if (instr->hydrogen()->key()->representation().IsTagged()) { 2553 if (instr->hydrogen()->key()->representation().IsTagged()) {
2546 __ SmiToInteger64(key_reg, key_reg); 2554 __ SmiToInteger64(key_reg, key_reg);
2547 } else if (instr->hydrogen()->IsDehoisted()) { 2555 } else if (instr->hydrogen()->IsDehoisted()) {
2548 // Sign extend key because it could be a 32 bit negative value 2556 // Sign extend key because it could be a 32 bit negative value
2549 // and the dehoisted address computation happens in 64 bits 2557 // and the dehoisted address computation happens in 64 bits
2550 __ movsxlq(key_reg, key_reg); 2558 __ movsxlq(key_reg, key_reg);
2551 } 2559 }
2552 } 2560 }
2553 2561
2554 if (instr->hydrogen()->RequiresHoleCheck()) { 2562 if (instr->hydrogen()->RequiresHoleCheck()) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2599 } 2607 }
2600 } 2608 }
2601 2609
2602 2610
2603 void LCodeGen::DoLoadKeyedSpecializedArrayElement( 2611 void LCodeGen::DoLoadKeyedSpecializedArrayElement(
2604 LLoadKeyedSpecializedArrayElement* instr) { 2612 LLoadKeyedSpecializedArrayElement* instr) {
2605 ElementsKind elements_kind = instr->elements_kind(); 2613 ElementsKind elements_kind = instr->elements_kind();
2606 LOperand* key = instr->key(); 2614 LOperand* key = instr->key();
2607 if (!key->IsConstantOperand()) { 2615 if (!key->IsConstantOperand()) {
2608 Register key_reg = ToRegister(key); 2616 Register key_reg = ToRegister(key);
2617 // Even though the HLoad/StoreKeyedFastElement instructions force the input
2618 // representation for the key to be an integer, the input gets replaced
2619 // during bound check elimination with the index argument to the bounds
2620 // check, which can be tagged, so that case must be handled here, too.
2609 if (instr->hydrogen()->key()->representation().IsTagged()) { 2621 if (instr->hydrogen()->key()->representation().IsTagged()) {
2610 __ SmiToInteger64(key_reg, key_reg); 2622 __ SmiToInteger64(key_reg, key_reg);
2611 } else if (instr->hydrogen()->IsDehoisted()) { 2623 } else if (instr->hydrogen()->IsDehoisted()) {
2612 // Sign extend key because it could be a 32 bit negative value 2624 // Sign extend key because it could be a 32 bit negative value
2613 // and the dehoisted address computation happens in 64 bits 2625 // and the dehoisted address computation happens in 64 bits
2614 __ movsxlq(key_reg, key_reg); 2626 __ movsxlq(key_reg, key_reg);
2615 } 2627 }
2616 } 2628 }
2617 Operand operand(BuildFastArrayOperand( 2629 Operand operand(BuildFastArrayOperand(
2618 instr->external_pointer(), 2630 instr->external_pointer(),
(...skipping 929 matching lines...) Expand 10 before | Expand all | Expand 10 after
3548 CallCode(ic, RelocInfo::CODE_TARGET, instr); 3560 CallCode(ic, RelocInfo::CODE_TARGET, instr);
3549 } 3561 }
3550 3562
3551 3563
3552 void LCodeGen::DoStoreKeyedSpecializedArrayElement( 3564 void LCodeGen::DoStoreKeyedSpecializedArrayElement(
3553 LStoreKeyedSpecializedArrayElement* instr) { 3565 LStoreKeyedSpecializedArrayElement* instr) {
3554 ElementsKind elements_kind = instr->elements_kind(); 3566 ElementsKind elements_kind = instr->elements_kind();
3555 LOperand* key = instr->key(); 3567 LOperand* key = instr->key();
3556 if (!key->IsConstantOperand()) { 3568 if (!key->IsConstantOperand()) {
3557 Register key_reg = ToRegister(key); 3569 Register key_reg = ToRegister(key);
3570 // Even though the HLoad/StoreKeyedFastElement instructions force the input
3571 // representation for the key to be an integer, the input gets replaced
3572 // during bound check elimination with the index argument to the bounds
3573 // check, which can be tagged, so that case must be handled here, too.
3558 if (instr->hydrogen()->key()->representation().IsTagged()) { 3574 if (instr->hydrogen()->key()->representation().IsTagged()) {
3559 __ SmiToInteger64(key_reg, key_reg); 3575 __ SmiToInteger64(key_reg, key_reg);
3560 } else if (instr->hydrogen()->IsDehoisted()) { 3576 } else if (instr->hydrogen()->IsDehoisted()) {
3561 // Sign extend key because it could be a 32 bit negative value 3577 // Sign extend key because it could be a 32 bit negative value
3562 // and the dehoisted address computation happens in 64 bits 3578 // and the dehoisted address computation happens in 64 bits
3563 __ movsxlq(key_reg, key_reg); 3579 __ movsxlq(key_reg, key_reg);
3564 } 3580 }
3565 } 3581 }
3566 Operand operand(BuildFastArrayOperand( 3582 Operand operand(BuildFastArrayOperand(
3567 instr->external_pointer(), 3583 instr->external_pointer(),
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3610 3626
3611 3627
3612 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { 3628 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) {
3613 if (instr->length()->IsRegister()) { 3629 if (instr->length()->IsRegister()) {
3614 Register reg = ToRegister(instr->length()); 3630 Register reg = ToRegister(instr->length());
3615 if (FLAG_debug_code && 3631 if (FLAG_debug_code &&
3616 !instr->hydrogen()->index()->representation().IsTagged()) { 3632 !instr->hydrogen()->index()->representation().IsTagged()) {
3617 __ AbortIfNotZeroExtended(reg); 3633 __ AbortIfNotZeroExtended(reg);
3618 } 3634 }
3619 if (instr->index()->IsConstantOperand()) { 3635 if (instr->index()->IsConstantOperand()) {
3620 __ cmpq(reg, 3636 int constant_index =
3621 Immediate(ToInteger32(LConstantOperand::cast(instr->index())))); 3637 ToInteger32(LConstantOperand::cast(instr->index()));
3638 if (instr->hydrogen()->length()->representation().IsTagged()) {
3639 __ Cmp(reg, Smi::FromInt(constant_index));
3640 } else {
3641 __ cmpq(reg, Immediate(constant_index));
3642 }
3622 } else { 3643 } else {
3623 Register reg2 = ToRegister(instr->index()); 3644 Register reg2 = ToRegister(instr->index());
3624 if (FLAG_debug_code && 3645 if (FLAG_debug_code &&
3625 !instr->hydrogen()->index()->representation().IsTagged()) { 3646 !instr->hydrogen()->index()->representation().IsTagged()) {
3626 __ AbortIfNotZeroExtended(reg2); 3647 __ AbortIfNotZeroExtended(reg2);
3627 } 3648 }
3628 __ cmpq(reg, reg2); 3649 __ cmpq(reg, reg2);
3629 } 3650 }
3630 } else { 3651 } else {
3631 if (instr->index()->IsConstantOperand()) { 3652 if (instr->index()->IsConstantOperand()) {
3632 __ cmpq(ToOperand(instr->length()), 3653 __ cmpq(ToOperand(instr->length()),
3633 Immediate(ToInteger32(LConstantOperand::cast(instr->index())))); 3654 Immediate(ToInteger32(LConstantOperand::cast(instr->index()))));
3634 } else { 3655 } else {
3635 __ cmpq(ToOperand(instr->length()), ToRegister(instr->index())); 3656 __ cmpq(ToOperand(instr->length()), ToRegister(instr->index()));
3636 } 3657 }
3637 } 3658 }
3638 DeoptimizeIf(below_equal, instr->environment()); 3659 DeoptimizeIf(below_equal, instr->environment());
3639 } 3660 }
3640 3661
3641 3662
3642 void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) { 3663 void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) {
3643 Register value = ToRegister(instr->value()); 3664 Register value = ToRegister(instr->value());
3644 Register elements = ToRegister(instr->object()); 3665 Register elements = ToRegister(instr->object());
3645 LOperand* key = instr->key(); 3666 LOperand* key = instr->key();
3646 if (!key->IsConstantOperand()) { 3667 if (!key->IsConstantOperand()) {
3647 Register key_reg = ToRegister(key); 3668 Register key_reg = ToRegister(key);
3669 // Even though the HLoad/StoreKeyedFastElement instructions force the input
3670 // representation for the key to be an integer, the input gets replaced
3671 // during bound check elimination with the index argument to the bounds
3672 // check, which can be tagged, so that case must be handled here, too.
3648 if (instr->hydrogen()->key()->representation().IsTagged()) { 3673 if (instr->hydrogen()->key()->representation().IsTagged()) {
3649 __ SmiToInteger64(key_reg, key_reg); 3674 __ SmiToInteger64(key_reg, key_reg);
3650 } else if (instr->hydrogen()->IsDehoisted()) { 3675 } else if (instr->hydrogen()->IsDehoisted()) {
3651 // Sign extend key because it could be a 32 bit negative value 3676 // Sign extend key because it could be a 32 bit negative value
3652 // and the dehoisted address computation happens in 64 bits 3677 // and the dehoisted address computation happens in 64 bits
3653 __ movsxlq(key_reg, key_reg); 3678 __ movsxlq(key_reg, key_reg);
3654 } 3679 }
3655 } 3680 }
3656 3681
3657 Operand operand = 3682 Operand operand =
(...skipping 23 matching lines...) Expand all
3681 } 3706 }
3682 } 3707 }
3683 3708
3684 3709
3685 void LCodeGen::DoStoreKeyedFastDoubleElement( 3710 void LCodeGen::DoStoreKeyedFastDoubleElement(
3686 LStoreKeyedFastDoubleElement* instr) { 3711 LStoreKeyedFastDoubleElement* instr) {
3687 XMMRegister value = ToDoubleRegister(instr->value()); 3712 XMMRegister value = ToDoubleRegister(instr->value());
3688 LOperand* key = instr->key(); 3713 LOperand* key = instr->key();
3689 if (!key->IsConstantOperand()) { 3714 if (!key->IsConstantOperand()) {
3690 Register key_reg = ToRegister(key); 3715 Register key_reg = ToRegister(key);
3716 // Even though the HLoad/StoreKeyedFastElement instructions force the input
3717 // representation for the key to be an integer, the input gets replaced
3718 // during bound check elimination with the index argument to the bounds
3719 // check, which can be tagged, so that case must be handled here, too.
3691 if (instr->hydrogen()->key()->representation().IsTagged()) { 3720 if (instr->hydrogen()->key()->representation().IsTagged()) {
3692 __ SmiToInteger64(key_reg, key_reg); 3721 __ SmiToInteger64(key_reg, key_reg);
3693 } else if (instr->hydrogen()->IsDehoisted()) { 3722 } else if (instr->hydrogen()->IsDehoisted()) {
3694 // Sign extend key because it could be a 32 bit negative value 3723 // Sign extend key because it could be a 32 bit negative value
3695 // and the dehoisted address computation happens in 64 bits 3724 // and the dehoisted address computation happens in 64 bits
3696 __ movsxlq(key_reg, key_reg); 3725 __ movsxlq(key_reg, key_reg);
3697 } 3726 }
3698 } 3727 }
3699 3728
3700 if (instr->NeedsCanonicalization()) { 3729 if (instr->NeedsCanonicalization()) {
(...skipping 1376 matching lines...) Expand 10 before | Expand all | Expand 10 after
5077 FixedArray::kHeaderSize - kPointerSize)); 5106 FixedArray::kHeaderSize - kPointerSize));
5078 __ bind(&done); 5107 __ bind(&done);
5079 } 5108 }
5080 5109
5081 5110
5082 #undef __ 5111 #undef __
5083 5112
5084 } } // namespace v8::internal 5113 } } // namespace v8::internal
5085 5114
5086 #endif // V8_TARGET_ARCH_X64 5115 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/ia32/lithium-codegen-ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698