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

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

Issue 10790143: MIPS: Optimize Smi keys for KeyedLoads (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: 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/mips/lithium-codegen-mips.h ('k') | src/mips/lithium-mips.h » ('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 // 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 2510 matching lines...) Expand 10 before | Expand all | Expand 10 after
2521 } 2521 }
2522 2522
2523 2523
2524 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { 2524 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) {
2525 Register elements = ToRegister(instr->elements()); 2525 Register elements = ToRegister(instr->elements());
2526 Register key = EmitLoadRegister(instr->key(), scratch0()); 2526 Register key = EmitLoadRegister(instr->key(), scratch0());
2527 Register result = ToRegister(instr->result()); 2527 Register result = ToRegister(instr->result());
2528 Register scratch = scratch0(); 2528 Register scratch = scratch0();
2529 2529
2530 // Load the result. 2530 // Load the result.
2531 __ sll(scratch, key, kPointerSizeLog2); // Key indexes words. 2531 if (instr->hydrogen()->key()->representation().IsTagged()) {
2532 __ addu(scratch, elements, scratch); 2532 __ sll(scratch, key, kPointerSizeLog2 - kSmiTagSize);
2533 __ addu(scratch, elements, scratch);
2534 } else {
2535 __ sll(scratch, key, kPointerSizeLog2);
2536 __ addu(scratch, elements, scratch);
2537 }
2533 uint32_t offset = FixedArray::kHeaderSize + 2538 uint32_t offset = FixedArray::kHeaderSize +
2534 (instr->additional_index() << kPointerSizeLog2); 2539 (instr->additional_index() << kPointerSizeLog2);
2535 __ lw(result, FieldMemOperand(scratch, offset)); 2540 __ lw(result, FieldMemOperand(scratch, offset));
2536 2541
2537 // Check for the hole value. 2542 // Check for the hole value.
2538 if (instr->hydrogen()->RequiresHoleCheck()) { 2543 if (instr->hydrogen()->RequiresHoleCheck()) {
2539 if (IsFastSmiElementsKind(instr->hydrogen()->elements_kind())) { 2544 if (IsFastSmiElementsKind(instr->hydrogen()->elements_kind())) {
2540 __ And(scratch, result, Operand(kSmiTagMask)); 2545 __ And(scratch, result, Operand(kSmiTagMask));
2541 DeoptimizeIf(ne, instr->environment(), scratch, Operand(zero_reg)); 2546 DeoptimizeIf(ne, instr->environment(), scratch, Operand(zero_reg));
2542 } else { 2547 } else {
2543 __ LoadRoot(scratch, Heap::kTheHoleValueRootIndex); 2548 __ LoadRoot(scratch, Heap::kTheHoleValueRootIndex);
2544 DeoptimizeIf(eq, instr->environment(), result, Operand(scratch)); 2549 DeoptimizeIf(eq, instr->environment(), result, Operand(scratch));
2545 } 2550 }
2546 } 2551 }
2547 } 2552 }
2548 2553
2549 2554
2550 void LCodeGen::DoLoadKeyedFastDoubleElement( 2555 void LCodeGen::DoLoadKeyedFastDoubleElement(
2551 LLoadKeyedFastDoubleElement* instr) { 2556 LLoadKeyedFastDoubleElement* instr) {
2552 Register elements = ToRegister(instr->elements()); 2557 Register elements = ToRegister(instr->elements());
2553 bool key_is_constant = instr->key()->IsConstantOperand(); 2558 bool key_is_constant = instr->key()->IsConstantOperand();
2554 Register key = no_reg; 2559 Register key = no_reg;
2555 DoubleRegister result = ToDoubleRegister(instr->result()); 2560 DoubleRegister result = ToDoubleRegister(instr->result());
2556 Register scratch = scratch0(); 2561 Register scratch = scratch0();
2557 2562
2558 int shift_size = 2563 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS);
2559 ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); 2564 int shift_size = (instr->hydrogen()->key()->representation().IsTagged())
2565 ? (element_size_shift - kSmiTagSize) : element_size_shift;
2560 int constant_key = 0; 2566 int constant_key = 0;
2561 if (key_is_constant) { 2567 if (key_is_constant) {
2562 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 2568 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
2563 if (constant_key & 0xF0000000) { 2569 if (constant_key & 0xF0000000) {
2564 Abort("array index constant value too big."); 2570 Abort("array index constant value too big.");
2565 } 2571 }
2566 } else { 2572 } else {
2567 key = ToRegister(instr->key()); 2573 key = ToRegister(instr->key());
2568 } 2574 }
2569 2575
2570 if (key_is_constant) { 2576 if (key_is_constant) {
2571 __ Addu(elements, elements, 2577 __ Addu(elements, elements,
2572 Operand(((constant_key + instr->additional_index()) << shift_size) + 2578 Operand(((constant_key + instr->additional_index()) <<
2579 element_size_shift) +
2573 FixedDoubleArray::kHeaderSize - kHeapObjectTag)); 2580 FixedDoubleArray::kHeaderSize - kHeapObjectTag));
2574 } else { 2581 } else {
2575 __ sll(scratch, key, shift_size); 2582 __ sll(scratch, key, shift_size);
2576 __ Addu(elements, elements, Operand(scratch)); 2583 __ Addu(elements, elements, Operand(scratch));
2577 __ Addu(elements, elements, 2584 __ Addu(elements, elements,
2578 Operand((FixedDoubleArray::kHeaderSize - kHeapObjectTag) + 2585 Operand((FixedDoubleArray::kHeaderSize - kHeapObjectTag) +
2579 (instr->additional_index() << shift_size))); 2586 (instr->additional_index() << element_size_shift)));
2580 } 2587 }
2581 2588
2582 if (instr->hydrogen()->RequiresHoleCheck()) { 2589 if (instr->hydrogen()->RequiresHoleCheck()) {
2583 __ lw(scratch, MemOperand(elements, sizeof(kHoleNanLower32))); 2590 __ lw(scratch, MemOperand(elements, sizeof(kHoleNanLower32)));
2584 DeoptimizeIf(eq, instr->environment(), scratch, Operand(kHoleNanUpper32)); 2591 DeoptimizeIf(eq, instr->environment(), scratch, Operand(kHoleNanUpper32));
2585 } 2592 }
2586 2593
2587 __ ldc1(result, MemOperand(elements)); 2594 __ ldc1(result, MemOperand(elements));
2588 } 2595 }
2589 2596
2590 2597
2598 MemOperand LCodeGen::PrepareKeyedOperand(Register key,
2599 Register base,
2600 bool key_is_constant,
2601 int constant_key,
2602 int element_size,
2603 int shift_size,
2604 int additional_index,
2605 int additional_offset) {
2606 if (additional_index != 0 && !key_is_constant) {
2607 additional_index *= 1 << (element_size - shift_size);
2608 __ Addu(scratch0(), key, Operand(additional_index));
2609 }
2610
2611 if (key_is_constant) {
2612 return MemOperand(base,
2613 (constant_key << element_size) + additional_offset);
2614 }
2615
2616 if (additional_index == 0) {
2617 if (shift_size >= 0) {
2618 __ sll(scratch0(), key, shift_size);
2619 __ Addu(scratch0(), base, scratch0());
2620 return MemOperand(scratch0());
2621 } else {
2622 ASSERT_EQ(-1, shift_size);
2623 __ srl(scratch0(), key, 1);
2624 __ Addu(scratch0(), base, scratch0());
2625 return MemOperand(scratch0());
2626 }
2627 }
2628
2629 if (shift_size >= 0) {
2630 __ sll(scratch0(), scratch0(), shift_size);
2631 __ Addu(scratch0(), base, scratch0());
2632 return MemOperand(scratch0());
2633 } else {
2634 ASSERT_EQ(-1, shift_size);
2635 __ srl(scratch0(), scratch0(), 1);
2636 __ Addu(scratch0(), base, scratch0());
2637 return MemOperand(scratch0());
2638 }
2639 }
2640
2641
2591 void LCodeGen::DoLoadKeyedSpecializedArrayElement( 2642 void LCodeGen::DoLoadKeyedSpecializedArrayElement(
2592 LLoadKeyedSpecializedArrayElement* instr) { 2643 LLoadKeyedSpecializedArrayElement* instr) {
2593 Register external_pointer = ToRegister(instr->external_pointer()); 2644 Register external_pointer = ToRegister(instr->external_pointer());
2594 Register key = no_reg; 2645 Register key = no_reg;
2595 ElementsKind elements_kind = instr->elements_kind(); 2646 ElementsKind elements_kind = instr->elements_kind();
2596 bool key_is_constant = instr->key()->IsConstantOperand(); 2647 bool key_is_constant = instr->key()->IsConstantOperand();
2597 int constant_key = 0; 2648 int constant_key = 0;
2598 if (key_is_constant) { 2649 if (key_is_constant) {
2599 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 2650 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
2600 if (constant_key & 0xF0000000) { 2651 if (constant_key & 0xF0000000) {
2601 Abort("array index constant value too big."); 2652 Abort("array index constant value too big.");
2602 } 2653 }
2603 } else { 2654 } else {
2604 key = ToRegister(instr->key()); 2655 key = ToRegister(instr->key());
2605 } 2656 }
2606 int shift_size = ElementsKindToShiftSize(elements_kind); 2657 int element_size_shift = ElementsKindToShiftSize(elements_kind);
2607 int additional_offset = instr->additional_index() << shift_size; 2658 int shift_size = (instr->hydrogen()->key()->representation().IsTagged())
2659 ? (element_size_shift - kSmiTagSize) : element_size_shift;
2660 int additional_offset = instr->additional_index() << element_size_shift;
2608 2661
2609 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 2662 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
2610 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 2663 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
2611 FPURegister result = ToDoubleRegister(instr->result()); 2664 FPURegister result = ToDoubleRegister(instr->result());
2612 if (key_is_constant) { 2665 if (key_is_constant) {
2613 __ Addu(scratch0(), external_pointer, constant_key << shift_size); 2666 __ Addu(scratch0(), external_pointer, constant_key << element_size_shift);
2614 } else { 2667 } else {
2615 __ sll(scratch0(), key, shift_size); 2668 __ sll(scratch0(), key, shift_size);
2616 __ Addu(scratch0(), scratch0(), external_pointer); 2669 __ Addu(scratch0(), scratch0(), external_pointer);
2617 } 2670 }
2618 2671
2619 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { 2672 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) {
2620 __ lwc1(result, MemOperand(scratch0(), additional_offset)); 2673 __ lwc1(result, MemOperand(scratch0(), additional_offset));
2621 __ cvt_d_s(result, result); 2674 __ cvt_d_s(result, result);
2622 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS 2675 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS
2623 __ ldc1(result, MemOperand(scratch0(), additional_offset)); 2676 __ ldc1(result, MemOperand(scratch0(), additional_offset));
2624 } 2677 }
2625 } else { 2678 } else {
2626 Register result = ToRegister(instr->result()); 2679 Register result = ToRegister(instr->result());
2627 Register scratch = scratch0(); 2680 MemOperand mem_operand = PrepareKeyedOperand(
2628 if (instr->additional_index() != 0 && !key_is_constant) { 2681 key, external_pointer, key_is_constant, constant_key,
2629 __ Addu(scratch, key, instr->additional_index()); 2682 element_size_shift, shift_size,
2630 } 2683 instr->additional_index(), additional_offset);
2631 MemOperand mem_operand(zero_reg);
2632 if (key_is_constant) {
2633 mem_operand =
2634 MemOperand(external_pointer,
2635 (constant_key << shift_size) + additional_offset);
2636 } else {
2637 if (instr->additional_index() == 0) {
2638 __ sll(scratch, key, shift_size);
2639 } else {
2640 __ sll(scratch, scratch, shift_size);
2641 }
2642 __ Addu(scratch, scratch, external_pointer);
2643 mem_operand = MemOperand(scratch);
2644 }
2645 switch (elements_kind) { 2684 switch (elements_kind) {
2646 case EXTERNAL_BYTE_ELEMENTS: 2685 case EXTERNAL_BYTE_ELEMENTS:
2647 __ lb(result, mem_operand); 2686 __ lb(result, mem_operand);
2648 break; 2687 break;
2649 case EXTERNAL_PIXEL_ELEMENTS: 2688 case EXTERNAL_PIXEL_ELEMENTS:
2650 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 2689 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
2651 __ lbu(result, mem_operand); 2690 __ lbu(result, mem_operand);
2652 break; 2691 break;
2653 case EXTERNAL_SHORT_ELEMENTS: 2692 case EXTERNAL_SHORT_ELEMENTS:
2654 __ lh(result, mem_operand); 2693 __ lh(result, mem_operand);
(...skipping 910 matching lines...) Expand 10 before | Expand all | Expand 10 after
3565 3604
3566 // Do the store. 3605 // Do the store.
3567 if (instr->key()->IsConstantOperand()) { 3606 if (instr->key()->IsConstantOperand()) {
3568 ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); 3607 ASSERT(!instr->hydrogen()->NeedsWriteBarrier());
3569 LConstantOperand* const_operand = LConstantOperand::cast(instr->key()); 3608 LConstantOperand* const_operand = LConstantOperand::cast(instr->key());
3570 int offset = 3609 int offset =
3571 (ToInteger32(const_operand) + instr->additional_index()) * kPointerSize 3610 (ToInteger32(const_operand) + instr->additional_index()) * kPointerSize
3572 + FixedArray::kHeaderSize; 3611 + FixedArray::kHeaderSize;
3573 __ sw(value, FieldMemOperand(elements, offset)); 3612 __ sw(value, FieldMemOperand(elements, offset));
3574 } else { 3613 } else {
3575 __ sll(scratch, key, kPointerSizeLog2); 3614 if (instr->hydrogen()->key()->representation().IsTagged()) {
3576 __ addu(scratch, elements, scratch); 3615 __ sll(scratch, key, kPointerSizeLog2 - kSmiTagSize);
3616 __ addu(scratch, elements, scratch);
3617 } else {
3618 __ sll(scratch, key, kPointerSizeLog2);
3619 __ addu(scratch, elements, scratch);
3620 }
3577 if (instr->additional_index() != 0) { 3621 if (instr->additional_index() != 0) {
3578 __ Addu(scratch, 3622 __ Addu(scratch,
3579 scratch, 3623 scratch,
3580 instr->additional_index() << kPointerSizeLog2); 3624 instr->additional_index() << kPointerSizeLog2);
3581 } 3625 }
3582 __ sw(value, FieldMemOperand(scratch, FixedArray::kHeaderSize)); 3626 __ sw(value, FieldMemOperand(scratch, FixedArray::kHeaderSize));
3583 } 3627 }
3584 3628
3585 if (instr->hydrogen()->NeedsWriteBarrier()) { 3629 if (instr->hydrogen()->NeedsWriteBarrier()) {
3586 HType type = instr->hydrogen()->value()->type(); 3630 HType type = instr->hydrogen()->value()->type();
(...skipping 25 matching lines...) Expand all
3612 // Calculate the effective address of the slot in the array to store the 3656 // Calculate the effective address of the slot in the array to store the
3613 // double value. 3657 // double value.
3614 if (key_is_constant) { 3658 if (key_is_constant) {
3615 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 3659 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
3616 if (constant_key & 0xF0000000) { 3660 if (constant_key & 0xF0000000) {
3617 Abort("array index constant value too big."); 3661 Abort("array index constant value too big.");
3618 } 3662 }
3619 } else { 3663 } else {
3620 key = ToRegister(instr->key()); 3664 key = ToRegister(instr->key());
3621 } 3665 }
3622 int shift_size = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS); 3666 int element_size_shift = ElementsKindToShiftSize(FAST_DOUBLE_ELEMENTS);
3667 int shift_size = (instr->hydrogen()->key()->representation().IsTagged())
3668 ? (element_size_shift - kSmiTagSize) : element_size_shift;
3623 if (key_is_constant) { 3669 if (key_is_constant) {
3624 __ Addu(scratch, elements, Operand((constant_key << shift_size) + 3670 __ Addu(scratch, elements, Operand((constant_key << element_size_shift) +
3625 FixedDoubleArray::kHeaderSize - kHeapObjectTag)); 3671 FixedDoubleArray::kHeaderSize - kHeapObjectTag));
3626 } else { 3672 } else {
3627 __ sll(scratch, key, shift_size); 3673 __ sll(scratch, key, shift_size);
3628 __ Addu(scratch, elements, Operand(scratch)); 3674 __ Addu(scratch, elements, Operand(scratch));
3629 __ Addu(scratch, scratch, 3675 __ Addu(scratch, scratch,
3630 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag)); 3676 Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag));
3631 } 3677 }
3632 3678
3633 if (instr->NeedsCanonicalization()) { 3679 if (instr->NeedsCanonicalization()) {
3634 Label is_nan; 3680 Label is_nan;
3635 // Check for NaN. All NaNs must be canonicalized. 3681 // Check for NaN. All NaNs must be canonicalized.
3636 __ BranchF(NULL, &is_nan, eq, value, value); 3682 __ BranchF(NULL, &is_nan, eq, value, value);
3637 __ Branch(&not_nan); 3683 __ Branch(&not_nan);
3638 3684
3639 // Only load canonical NaN if the comparison above set the overflow. 3685 // Only load canonical NaN if the comparison above set the overflow.
3640 __ bind(&is_nan); 3686 __ bind(&is_nan);
3641 __ Move(value, FixedDoubleArray::canonical_not_the_hole_nan_as_double()); 3687 __ Move(value, FixedDoubleArray::canonical_not_the_hole_nan_as_double());
3642 } 3688 }
3643 3689
3644 __ bind(&not_nan); 3690 __ bind(&not_nan);
3645 __ sdc1(value, MemOperand(scratch, instr->additional_index() << shift_size)); 3691 __ sdc1(value, MemOperand(scratch, instr->additional_index() <<
3692 element_size_shift));
3646 } 3693 }
3647 3694
3648 3695
3649 void LCodeGen::DoStoreKeyedSpecializedArrayElement( 3696 void LCodeGen::DoStoreKeyedSpecializedArrayElement(
3650 LStoreKeyedSpecializedArrayElement* instr) { 3697 LStoreKeyedSpecializedArrayElement* instr) {
3651 3698
3652 Register external_pointer = ToRegister(instr->external_pointer()); 3699 Register external_pointer = ToRegister(instr->external_pointer());
3653 Register key = no_reg; 3700 Register key = no_reg;
3654 ElementsKind elements_kind = instr->elements_kind(); 3701 ElementsKind elements_kind = instr->elements_kind();
3655 bool key_is_constant = instr->key()->IsConstantOperand(); 3702 bool key_is_constant = instr->key()->IsConstantOperand();
3656 int constant_key = 0; 3703 int constant_key = 0;
3657 if (key_is_constant) { 3704 if (key_is_constant) {
3658 constant_key = ToInteger32(LConstantOperand::cast(instr->key())); 3705 constant_key = ToInteger32(LConstantOperand::cast(instr->key()));
3659 if (constant_key & 0xF0000000) { 3706 if (constant_key & 0xF0000000) {
3660 Abort("array index constant value too big."); 3707 Abort("array index constant value too big.");
3661 } 3708 }
3662 } else { 3709 } else {
3663 key = ToRegister(instr->key()); 3710 key = ToRegister(instr->key());
3664 } 3711 }
3665 int shift_size = ElementsKindToShiftSize(elements_kind); 3712 int element_size_shift = ElementsKindToShiftSize(elements_kind);
3666 int additional_offset = instr->additional_index() << shift_size; 3713 int shift_size = (instr->hydrogen()->key()->representation().IsTagged())
3714 ? (element_size_shift - kSmiTagSize) : element_size_shift;
3715 int additional_offset = instr->additional_index() << element_size_shift;
3667 3716
3668 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 3717 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
3669 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 3718 elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
3670 FPURegister value(ToDoubleRegister(instr->value())); 3719 FPURegister value(ToDoubleRegister(instr->value()));
3671 if (key_is_constant) { 3720 if (key_is_constant) {
3672 __ Addu(scratch0(), external_pointer, constant_key << shift_size); 3721 __ Addu(scratch0(), external_pointer, constant_key <<
3722 element_size_shift);
3673 } else { 3723 } else {
3674 __ sll(scratch0(), key, shift_size); 3724 __ sll(scratch0(), key, shift_size);
3675 __ Addu(scratch0(), scratch0(), external_pointer); 3725 __ Addu(scratch0(), scratch0(), external_pointer);
3676 } 3726 }
3677 3727
3678 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { 3728 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) {
3679 __ cvt_s_d(double_scratch0(), value); 3729 __ cvt_s_d(double_scratch0(), value);
3680 __ swc1(double_scratch0(), MemOperand(scratch0(), additional_offset)); 3730 __ swc1(double_scratch0(), MemOperand(scratch0(), additional_offset));
3681 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS 3731 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS
3682 __ sdc1(value, MemOperand(scratch0(), additional_offset)); 3732 __ sdc1(value, MemOperand(scratch0(), additional_offset));
3683 } 3733 }
3684 } else { 3734 } else {
3685 Register value(ToRegister(instr->value())); 3735 Register value(ToRegister(instr->value()));
3686 Register scratch = scratch0(); 3736 MemOperand mem_operand = PrepareKeyedOperand(
3687 if (instr->additional_index() != 0 && !key_is_constant) { 3737 key, external_pointer, key_is_constant, constant_key,
3688 __ Addu(scratch, key, instr->additional_index()); 3738 element_size_shift, shift_size,
3689 } 3739 instr->additional_index(), additional_offset);
3690 MemOperand mem_operand(zero_reg);
3691 if (key_is_constant) {
3692 mem_operand = MemOperand(external_pointer,
3693 ((constant_key + instr->additional_index())
3694 << shift_size));
3695 } else {
3696 if (instr->additional_index() == 0) {
3697 __ sll(scratch, key, shift_size);
3698 } else {
3699 __ sll(scratch, scratch, shift_size);
3700 }
3701 __ Addu(scratch, scratch, external_pointer);
3702 mem_operand = MemOperand(scratch);
3703 }
3704 switch (elements_kind) { 3740 switch (elements_kind) {
3705 case EXTERNAL_PIXEL_ELEMENTS: 3741 case EXTERNAL_PIXEL_ELEMENTS:
3706 case EXTERNAL_BYTE_ELEMENTS: 3742 case EXTERNAL_BYTE_ELEMENTS:
3707 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 3743 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3708 __ sb(value, mem_operand); 3744 __ sb(value, mem_operand);
3709 break; 3745 break;
3710 case EXTERNAL_SHORT_ELEMENTS: 3746 case EXTERNAL_SHORT_ELEMENTS:
3711 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 3747 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3712 __ sh(value, mem_operand); 3748 __ sh(value, mem_operand);
3713 break; 3749 break;
(...skipping 1493 matching lines...) Expand 10 before | Expand all | Expand 10 after
5207 __ Subu(scratch, result, scratch); 5243 __ Subu(scratch, result, scratch);
5208 __ lw(result, FieldMemOperand(scratch, 5244 __ lw(result, FieldMemOperand(scratch,
5209 FixedArray::kHeaderSize - kPointerSize)); 5245 FixedArray::kHeaderSize - kPointerSize));
5210 __ bind(&done); 5246 __ bind(&done);
5211 } 5247 }
5212 5248
5213 5249
5214 #undef __ 5250 #undef __
5215 5251
5216 } } // namespace v8::internal 5252 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/mips/lithium-codegen-mips.h ('k') | src/mips/lithium-mips.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698