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

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

Issue 275433004: Require SSE2 support for the ia32 port. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 7 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/macro-assembler-ia32.cc ('k') | src/ic.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 // 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 "v8.h" 5 #include "v8.h"
6 6
7 #if V8_TARGET_ARCH_IA32 7 #if V8_TARGET_ARCH_IA32
8 8
9 #include "ic-inl.h" 9 #include "ic-inl.h"
10 #include "codegen.h" 10 #include "codegen.h"
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 __ j(equal, &do_store, Label::kNear); 520 __ j(equal, &do_store, Label::kNear);
521 } 521 }
522 __ bind(&do_store); 522 __ bind(&do_store);
523 } 523 }
524 } else if (representation.IsDouble()) { 524 } else if (representation.IsDouble()) {
525 Label do_store, heap_number; 525 Label do_store, heap_number;
526 __ AllocateHeapNumber(storage_reg, scratch1, scratch2, slow); 526 __ AllocateHeapNumber(storage_reg, scratch1, scratch2, slow);
527 527
528 __ JumpIfNotSmi(value_reg, &heap_number); 528 __ JumpIfNotSmi(value_reg, &heap_number);
529 __ SmiUntag(value_reg); 529 __ SmiUntag(value_reg);
530 if (CpuFeatures::IsSupported(SSE2)) { 530 __ Cvtsi2sd(xmm0, value_reg);
531 CpuFeatureScope use_sse2(masm, SSE2);
532 __ Cvtsi2sd(xmm0, value_reg);
533 } else {
534 __ push(value_reg);
535 __ fild_s(Operand(esp, 0));
536 __ pop(value_reg);
537 }
538 __ SmiTag(value_reg); 531 __ SmiTag(value_reg);
539 __ jmp(&do_store); 532 __ jmp(&do_store);
540 533
541 __ bind(&heap_number); 534 __ bind(&heap_number);
542 __ CheckMap(value_reg, masm->isolate()->factory()->heap_number_map(), 535 __ CheckMap(value_reg, masm->isolate()->factory()->heap_number_map(),
543 miss_label, DONT_DO_SMI_CHECK); 536 miss_label, DONT_DO_SMI_CHECK);
544 if (CpuFeatures::IsSupported(SSE2)) { 537 __ movsd(xmm0, FieldOperand(value_reg, HeapNumber::kValueOffset));
545 CpuFeatureScope use_sse2(masm, SSE2);
546 __ movsd(xmm0, FieldOperand(value_reg, HeapNumber::kValueOffset));
547 } else {
548 __ fld_d(FieldOperand(value_reg, HeapNumber::kValueOffset));
549 }
550 538
551 __ bind(&do_store); 539 __ bind(&do_store);
552 if (CpuFeatures::IsSupported(SSE2)) { 540 __ movsd(FieldOperand(storage_reg, HeapNumber::kValueOffset), xmm0);
553 CpuFeatureScope use_sse2(masm, SSE2);
554 __ movsd(FieldOperand(storage_reg, HeapNumber::kValueOffset), xmm0);
555 } else {
556 __ fstp_d(FieldOperand(storage_reg, HeapNumber::kValueOffset));
557 }
558 } 541 }
559 542
560 // Stub never generated for non-global objects that require access 543 // Stub never generated for non-global objects that require access
561 // checks. 544 // checks.
562 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded()); 545 ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
563 546
564 // Perform map transition for the receiver if necessary. 547 // Perform map transition for the receiver if necessary.
565 if (details.type() == FIELD && 548 if (details.type() == FIELD &&
566 object->map()->unused_property_fields() == 0) { 549 object->map()->unused_property_fields() == 0) {
567 // The properties must be extended before we can store the value. 550 // The properties must be extended before we can store the value.
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 } else { 697 } else {
715 __ mov(scratch1, FieldOperand(receiver_reg, JSObject::kPropertiesOffset)); 698 __ mov(scratch1, FieldOperand(receiver_reg, JSObject::kPropertiesOffset));
716 int offset = index * kPointerSize + FixedArray::kHeaderSize; 699 int offset = index * kPointerSize + FixedArray::kHeaderSize;
717 __ mov(scratch1, FieldOperand(scratch1, offset)); 700 __ mov(scratch1, FieldOperand(scratch1, offset));
718 } 701 }
719 702
720 // Store the value into the storage. 703 // Store the value into the storage.
721 Label do_store, heap_number; 704 Label do_store, heap_number;
722 __ JumpIfNotSmi(value_reg, &heap_number); 705 __ JumpIfNotSmi(value_reg, &heap_number);
723 __ SmiUntag(value_reg); 706 __ SmiUntag(value_reg);
724 if (CpuFeatures::IsSupported(SSE2)) { 707 __ Cvtsi2sd(xmm0, value_reg);
725 CpuFeatureScope use_sse2(masm, SSE2);
726 __ Cvtsi2sd(xmm0, value_reg);
727 } else {
728 __ push(value_reg);
729 __ fild_s(Operand(esp, 0));
730 __ pop(value_reg);
731 }
732 __ SmiTag(value_reg); 708 __ SmiTag(value_reg);
733 __ jmp(&do_store); 709 __ jmp(&do_store);
734 __ bind(&heap_number); 710 __ bind(&heap_number);
735 __ CheckMap(value_reg, masm->isolate()->factory()->heap_number_map(), 711 __ CheckMap(value_reg, masm->isolate()->factory()->heap_number_map(),
736 miss_label, DONT_DO_SMI_CHECK); 712 miss_label, DONT_DO_SMI_CHECK);
737 if (CpuFeatures::IsSupported(SSE2)) { 713 __ movsd(xmm0, FieldOperand(value_reg, HeapNumber::kValueOffset));
738 CpuFeatureScope use_sse2(masm, SSE2);
739 __ movsd(xmm0, FieldOperand(value_reg, HeapNumber::kValueOffset));
740 } else {
741 __ fld_d(FieldOperand(value_reg, HeapNumber::kValueOffset));
742 }
743 __ bind(&do_store); 714 __ bind(&do_store);
744 if (CpuFeatures::IsSupported(SSE2)) { 715 __ movsd(FieldOperand(scratch1, HeapNumber::kValueOffset), xmm0);
745 CpuFeatureScope use_sse2(masm, SSE2);
746 __ movsd(FieldOperand(scratch1, HeapNumber::kValueOffset), xmm0);
747 } else {
748 __ fstp_d(FieldOperand(scratch1, HeapNumber::kValueOffset));
749 }
750 // Return the value (register eax). 716 // Return the value (register eax).
751 ASSERT(value_reg.is(eax)); 717 ASSERT(value_reg.is(eax));
752 __ ret(0); 718 __ ret(0);
753 return; 719 return;
754 } 720 }
755 721
756 ASSERT(!representation.IsDouble()); 722 ASSERT(!representation.IsDouble());
757 // TODO(verwaest): Share this code as a code stub. 723 // TODO(verwaest): Share this code as a code stub.
758 SmiCheck smi_check = representation.IsTagged() 724 SmiCheck smi_check = representation.IsTagged()
759 ? INLINE_SMI_CHECK : OMIT_SMI_CHECK; 725 ? INLINE_SMI_CHECK : OMIT_SMI_CHECK;
(...skipping 774 matching lines...) Expand 10 before | Expand all | Expand 10 after
1534 // ----------------------------------- 1500 // -----------------------------------
1535 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss); 1501 TailCallBuiltin(masm, Builtins::kKeyedLoadIC_Miss);
1536 } 1502 }
1537 1503
1538 1504
1539 #undef __ 1505 #undef __
1540 1506
1541 } } // namespace v8::internal 1507 } } // namespace v8::internal
1542 1508
1543 #endif // V8_TARGET_ARCH_IA32 1509 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/ia32/macro-assembler-ia32.cc ('k') | src/ic.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698