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

Side by Side Diff: src/arm/stub-cache-arm.cc

Issue 14119008: ARM: VFP cleanup now that VFP2 is the baseline. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 8 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 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 1602 matching lines...) Expand 10 before | Expand all | Expand 10 after
1613 __ add(r0, r0, Operand(Smi::FromInt(argc))); 1613 __ add(r0, r0, Operand(Smi::FromInt(argc)));
1614 1614
1615 // Get the elements' length. 1615 // Get the elements' length.
1616 __ ldr(r4, FieldMemOperand(elements, FixedArray::kLengthOffset)); 1616 __ ldr(r4, FieldMemOperand(elements, FixedArray::kLengthOffset));
1617 1617
1618 // Check if we could survive without allocation. 1618 // Check if we could survive without allocation.
1619 __ cmp(r0, r4); 1619 __ cmp(r0, r4);
1620 __ b(gt, &call_builtin); 1620 __ b(gt, &call_builtin);
1621 1621
1622 __ ldr(r4, MemOperand(sp, (argc - 1) * kPointerSize)); 1622 __ ldr(r4, MemOperand(sp, (argc - 1) * kPointerSize));
1623 __ StoreNumberToDoubleElements( 1623 __ StoreNumberToDoubleElements(r4, r0, elements, r5,
1624 r4, r0, elements, r5, r2, r3, r9, 1624 &call_builtin, argc * kDoubleSize);
1625 &call_builtin, argc * kDoubleSize);
1626 1625
1627 // Save new length. 1626 // Save new length.
1628 __ str(r0, FieldMemOperand(receiver, JSArray::kLengthOffset)); 1627 __ str(r0, FieldMemOperand(receiver, JSArray::kLengthOffset));
1629 1628
1630 // Check for a smi. 1629 // Check for a smi.
1631 __ Drop(argc + 1); 1630 __ Drop(argc + 1);
1632 __ Ret(); 1631 __ Ret();
1633 1632
1634 __ bind(&with_write_barrier); 1633 __ bind(&with_write_barrier);
1635 1634
(...skipping 1603 matching lines...) Expand 10 before | Expand all | Expand 10 after
3239 case EXTERNAL_INT_ELEMENTS: 3238 case EXTERNAL_INT_ELEMENTS:
3240 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 3239 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
3241 __ str(r5, MemOperand(r3, key, LSL, 1)); 3240 __ str(r5, MemOperand(r3, key, LSL, 1));
3242 break; 3241 break;
3243 case EXTERNAL_FLOAT_ELEMENTS: 3242 case EXTERNAL_FLOAT_ELEMENTS:
3244 // Perform int-to-float conversion and store to memory. 3243 // Perform int-to-float conversion and store to memory.
3245 __ SmiUntag(r4, key); 3244 __ SmiUntag(r4, key);
3246 StoreIntAsFloat(masm, r3, r4, r5, r7); 3245 StoreIntAsFloat(masm, r3, r4, r5, r7);
3247 break; 3246 break;
3248 case EXTERNAL_DOUBLE_ELEMENTS: 3247 case EXTERNAL_DOUBLE_ELEMENTS:
3248 __ vmov(s2, r5);
3249 __ vcvt_f64_s32(d0, s2);
3249 __ add(r3, r3, Operand(key, LSL, 2)); 3250 __ add(r3, r3, Operand(key, LSL, 2));
3250 // r3: effective address of the double element 3251 // r3: effective address of the double element
3251 FloatingPointHelper::Destination destination;
3252 destination = FloatingPointHelper::kVFPRegisters;
3253 FloatingPointHelper::ConvertIntToDouble(
3254 masm, r5, destination,
3255 d0, r6, r7, // These are: double_dst, dst_mantissa, dst_exponent.
3256 r4, s2); // These are: scratch2, single_scratch.
3257 __ vstr(d0, r3, 0); 3252 __ vstr(d0, r3, 0);
3258 break; 3253 break;
3259 case FAST_ELEMENTS: 3254 case FAST_ELEMENTS:
3260 case FAST_SMI_ELEMENTS: 3255 case FAST_SMI_ELEMENTS:
3261 case FAST_DOUBLE_ELEMENTS: 3256 case FAST_DOUBLE_ELEMENTS:
3262 case FAST_HOLEY_ELEMENTS: 3257 case FAST_HOLEY_ELEMENTS:
3263 case FAST_HOLEY_SMI_ELEMENTS: 3258 case FAST_HOLEY_SMI_ELEMENTS:
3264 case FAST_HOLEY_DOUBLE_ELEMENTS: 3259 case FAST_HOLEY_DOUBLE_ELEMENTS:
3265 case DICTIONARY_ELEMENTS: 3260 case DICTIONARY_ELEMENTS:
3266 case NON_STRICT_ARGUMENTS_ELEMENTS: 3261 case NON_STRICT_ARGUMENTS_ELEMENTS:
(...skipping 29 matching lines...) Expand all
3296 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 3291 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
3297 __ sub(r5, r0, Operand(kHeapObjectTag)); 3292 __ sub(r5, r0, Operand(kHeapObjectTag));
3298 __ vldr(d0, r5, HeapNumber::kValueOffset); 3293 __ vldr(d0, r5, HeapNumber::kValueOffset);
3299 __ add(r5, r3, Operand(key, LSL, 2)); 3294 __ add(r5, r3, Operand(key, LSL, 2));
3300 __ vstr(d0, r5, 0); 3295 __ vstr(d0, r5, 0);
3301 } else { 3296 } else {
3302 // Hoisted load. vldr requires offset to be a multiple of 4 so we can 3297 // Hoisted load. vldr requires offset to be a multiple of 4 so we can
3303 // not include -kHeapObjectTag into it. 3298 // not include -kHeapObjectTag into it.
3304 __ sub(r5, value, Operand(kHeapObjectTag)); 3299 __ sub(r5, value, Operand(kHeapObjectTag));
3305 __ vldr(d0, r5, HeapNumber::kValueOffset); 3300 __ vldr(d0, r5, HeapNumber::kValueOffset);
3306 __ ECMAToInt32(r5, d0, d1, r6, r7, r9); 3301 __ ECMAToInt32(r5, d0, r6, r7, r9, d1);
3307 3302
3308 switch (elements_kind) { 3303 switch (elements_kind) {
3309 case EXTERNAL_BYTE_ELEMENTS: 3304 case EXTERNAL_BYTE_ELEMENTS:
3310 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 3305 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3311 __ strb(r5, MemOperand(r3, key, LSR, 1)); 3306 __ strb(r5, MemOperand(r3, key, LSR, 1));
3312 break; 3307 break;
3313 case EXTERNAL_SHORT_ELEMENTS: 3308 case EXTERNAL_SHORT_ELEMENTS:
3314 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 3309 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3315 __ strh(r5, MemOperand(r3, key, LSL, 0)); 3310 __ strh(r5, MemOperand(r3, key, LSL, 0));
3316 break; 3311 break;
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
3530 bool is_js_array, 3525 bool is_js_array,
3531 KeyedAccessStoreMode store_mode) { 3526 KeyedAccessStoreMode store_mode) {
3532 // ----------- S t a t e ------------- 3527 // ----------- S t a t e -------------
3533 // -- r0 : value 3528 // -- r0 : value
3534 // -- r1 : key 3529 // -- r1 : key
3535 // -- r2 : receiver 3530 // -- r2 : receiver
3536 // -- lr : return address 3531 // -- lr : return address
3537 // -- r3 : scratch (elements backing store) 3532 // -- r3 : scratch (elements backing store)
3538 // -- r4 : scratch 3533 // -- r4 : scratch
3539 // -- r5 : scratch 3534 // -- r5 : scratch
3540 // -- r6 : scratch
3541 // -- r7 : scratch
3542 // -- r9 : scratch
3543 // ----------------------------------- 3535 // -----------------------------------
3544 Label miss_force_generic, transition_elements_kind, grow, slow; 3536 Label miss_force_generic, transition_elements_kind, grow, slow;
3545 Label finish_store, check_capacity; 3537 Label finish_store, check_capacity;
3546 3538
3547 Register value_reg = r0; 3539 Register value_reg = r0;
3548 Register key_reg = r1; 3540 Register key_reg = r1;
3549 Register receiver_reg = r2; 3541 Register receiver_reg = r2;
3550 Register elements_reg = r3; 3542 Register elements_reg = r3;
3551 Register scratch1 = r4; 3543 Register scratch1 = r4;
3552 Register scratch2 = r5; 3544 Register scratch2 = r5;
3553 Register scratch3 = r6;
3554 Register scratch4 = r7;
3555 Register scratch5 = r9;
3556 Register length_reg = r7; 3545 Register length_reg = r7;
3557 3546
3558 // This stub is meant to be tail-jumped to, the receiver must already 3547 // This stub is meant to be tail-jumped to, the receiver must already
3559 // have been verified by the caller to not be a smi. 3548 // have been verified by the caller to not be a smi.
3560 3549
3561 // Check that the key is a smi or a heap number convertible to a smi. 3550 // Check that the key is a smi or a heap number convertible to a smi.
3562 GenerateSmiKeyCheck(masm, key_reg, r4, r5, d1, d2, &miss_force_generic); 3551 GenerateSmiKeyCheck(masm, key_reg, r4, r5, d1, d2, &miss_force_generic);
3563 3552
3564 __ ldr(elements_reg, 3553 __ ldr(elements_reg,
3565 FieldMemOperand(receiver_reg, JSObject::kElementsOffset)); 3554 FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
3566 3555
3567 // Check that the key is within bounds. 3556 // Check that the key is within bounds.
3568 if (is_js_array) { 3557 if (is_js_array) {
3569 __ ldr(scratch1, FieldMemOperand(receiver_reg, JSArray::kLengthOffset)); 3558 __ ldr(scratch1, FieldMemOperand(receiver_reg, JSArray::kLengthOffset));
3570 } else { 3559 } else {
3571 __ ldr(scratch1, 3560 __ ldr(scratch1,
3572 FieldMemOperand(elements_reg, FixedArray::kLengthOffset)); 3561 FieldMemOperand(elements_reg, FixedArray::kLengthOffset));
3573 } 3562 }
3574 // Compare smis, unsigned compare catches both negative and out-of-bound 3563 // Compare smis, unsigned compare catches both negative and out-of-bound
3575 // indexes. 3564 // indexes.
3576 __ cmp(key_reg, scratch1); 3565 __ cmp(key_reg, scratch1);
3577 if (IsGrowStoreMode(store_mode)) { 3566 if (IsGrowStoreMode(store_mode)) {
3578 __ b(hs, &grow); 3567 __ b(hs, &grow);
3579 } else { 3568 } else {
3580 __ b(hs, &miss_force_generic); 3569 __ b(hs, &miss_force_generic);
3581 } 3570 }
3582 3571
3583 __ bind(&finish_store); 3572 __ bind(&finish_store);
3584 __ StoreNumberToDoubleElements(value_reg, 3573 __ StoreNumberToDoubleElements(value_reg, key_reg, elements_reg,
3585 key_reg, 3574 scratch1, &transition_elements_kind);
3586 // All registers after this are overwritten.
3587 elements_reg,
3588 scratch1,
3589 scratch3,
3590 scratch4,
3591 scratch2,
3592 &transition_elements_kind);
3593 __ Ret(); 3575 __ Ret();
3594 3576
3595 // Handle store cache miss, replacing the ic with the generic stub. 3577 // Handle store cache miss, replacing the ic with the generic stub.
3596 __ bind(&miss_force_generic); 3578 __ bind(&miss_force_generic);
3597 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_MissForceGeneric); 3579 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_MissForceGeneric);
3598 3580
3599 __ bind(&transition_elements_kind); 3581 __ bind(&transition_elements_kind);
3600 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Miss); 3582 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Miss);
3601 3583
3602 if (is_js_array && IsGrowStoreMode(store_mode)) { 3584 if (is_js_array && IsGrowStoreMode(store_mode)) {
(...skipping 26 matching lines...) Expand all
3629 3611
3630 // Initialize the new FixedDoubleArray. 3612 // Initialize the new FixedDoubleArray.
3631 __ LoadRoot(scratch1, Heap::kFixedDoubleArrayMapRootIndex); 3613 __ LoadRoot(scratch1, Heap::kFixedDoubleArrayMapRootIndex);
3632 __ str(scratch1, FieldMemOperand(elements_reg, JSObject::kMapOffset)); 3614 __ str(scratch1, FieldMemOperand(elements_reg, JSObject::kMapOffset));
3633 __ mov(scratch1, 3615 __ mov(scratch1,
3634 Operand(Smi::FromInt(JSArray::kPreallocatedArrayElements))); 3616 Operand(Smi::FromInt(JSArray::kPreallocatedArrayElements)));
3635 __ str(scratch1, 3617 __ str(scratch1,
3636 FieldMemOperand(elements_reg, FixedDoubleArray::kLengthOffset)); 3618 FieldMemOperand(elements_reg, FixedDoubleArray::kLengthOffset));
3637 3619
3638 __ mov(scratch1, elements_reg); 3620 __ mov(scratch1, elements_reg);
3639 __ StoreNumberToDoubleElements(value_reg, 3621 __ StoreNumberToDoubleElements(value_reg, key_reg, scratch1,
3640 key_reg, 3622 scratch2, &transition_elements_kind);
3641 // All registers after this are overwritten.
3642 scratch1,
3643 scratch2,
3644 scratch3,
3645 scratch4,
3646 scratch5,
3647 &transition_elements_kind);
3648 3623
3649 __ mov(scratch1, Operand(kHoleNanLower32)); 3624 __ mov(scratch1, Operand(kHoleNanLower32));
3650 __ mov(scratch2, Operand(kHoleNanUpper32)); 3625 __ mov(scratch2, Operand(kHoleNanUpper32));
3651 for (int i = 1; i < JSArray::kPreallocatedArrayElements; i++) { 3626 for (int i = 1; i < JSArray::kPreallocatedArrayElements; i++) {
3652 int offset = FixedDoubleArray::OffsetOfElementAt(i); 3627 int offset = FixedDoubleArray::OffsetOfElementAt(i);
3653 __ str(scratch1, FieldMemOperand(elements_reg, offset)); 3628 __ str(scratch1, FieldMemOperand(elements_reg, offset));
3654 __ str(scratch2, FieldMemOperand(elements_reg, offset + kPointerSize)); 3629 __ str(scratch2, FieldMemOperand(elements_reg, offset + kPointerSize));
3655 } 3630 }
3656 3631
3657 // Install the new backing store in the JSArray. 3632 // Install the new backing store in the JSArray.
(...skipping 26 matching lines...) Expand all
3684 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow); 3659 TailCallBuiltin(masm, Builtins::kKeyedStoreIC_Slow);
3685 } 3660 }
3686 } 3661 }
3687 3662
3688 3663
3689 #undef __ 3664 #undef __
3690 3665
3691 } } // namespace v8::internal 3666 } } // namespace v8::internal
3692 3667
3693 #endif // V8_TARGET_ARCH_ARM 3668 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« src/arm/macro-assembler-arm.h ('K') | « src/arm/macro-assembler-arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698