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

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

Issue 19749004: With >= 64 non-string instance types, I removed an optimization (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review comments Created 7 years, 5 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/hydrogen-instructions.cc ('k') | src/ia32/ic-ia32.cc » ('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 4094 matching lines...) Expand 10 before | Expand all | Expand 10 after
4105 } 4105 }
4106 4106
4107 4107
4108 static void BranchIfNotInternalizedString(MacroAssembler* masm, 4108 static void BranchIfNotInternalizedString(MacroAssembler* masm,
4109 Label* label, 4109 Label* label,
4110 Register object, 4110 Register object,
4111 Register scratch) { 4111 Register scratch) {
4112 __ JumpIfSmi(object, label); 4112 __ JumpIfSmi(object, label);
4113 __ mov(scratch, FieldOperand(object, HeapObject::kMapOffset)); 4113 __ mov(scratch, FieldOperand(object, HeapObject::kMapOffset));
4114 __ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset)); 4114 __ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset));
4115 __ and_(scratch, kIsInternalizedMask | kIsNotStringMask); 4115 STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0);
4116 __ cmp(scratch, kInternalizedTag | kStringTag); 4116 __ test(scratch, Immediate(kIsNotStringMask | kIsNotInternalizedMask));
4117 __ j(not_equal, label); 4117 __ j(not_zero, label);
4118 } 4118 }
4119 4119
4120 4120
4121 void ICCompareStub::GenerateGeneric(MacroAssembler* masm) { 4121 void ICCompareStub::GenerateGeneric(MacroAssembler* masm) {
4122 Label check_unequal_objects; 4122 Label check_unequal_objects;
4123 Condition cc = GetCondition(); 4123 Condition cc = GetCondition();
4124 4124
4125 Label miss; 4125 Label miss;
4126 CheckInputType(masm, edx, left_, &miss); 4126 CheckInputType(masm, edx, left_, &miss);
4127 CheckInputType(masm, eax, right_, &miss); 4127 CheckInputType(masm, eax, right_, &miss);
(...skipping 2474 matching lines...) Expand 10 before | Expand all | Expand 10 after
6602 __ mov(tmp1, left); 6602 __ mov(tmp1, left);
6603 STATIC_ASSERT(kSmiTag == 0); 6603 STATIC_ASSERT(kSmiTag == 0);
6604 __ and_(tmp1, right); 6604 __ and_(tmp1, right);
6605 __ JumpIfSmi(tmp1, &miss, Label::kNear); 6605 __ JumpIfSmi(tmp1, &miss, Label::kNear);
6606 6606
6607 // Check that both operands are internalized strings. 6607 // Check that both operands are internalized strings.
6608 __ mov(tmp1, FieldOperand(left, HeapObject::kMapOffset)); 6608 __ mov(tmp1, FieldOperand(left, HeapObject::kMapOffset));
6609 __ mov(tmp2, FieldOperand(right, HeapObject::kMapOffset)); 6609 __ mov(tmp2, FieldOperand(right, HeapObject::kMapOffset));
6610 __ movzx_b(tmp1, FieldOperand(tmp1, Map::kInstanceTypeOffset)); 6610 __ movzx_b(tmp1, FieldOperand(tmp1, Map::kInstanceTypeOffset));
6611 __ movzx_b(tmp2, FieldOperand(tmp2, Map::kInstanceTypeOffset)); 6611 __ movzx_b(tmp2, FieldOperand(tmp2, Map::kInstanceTypeOffset));
6612 STATIC_ASSERT(kInternalizedTag != 0); 6612 STATIC_ASSERT(kInternalizedTag == 0 && kStringTag == 0);
6613 __ and_(tmp1, Immediate(kIsNotStringMask | kIsInternalizedMask)); 6613 __ or_(tmp1, tmp2);
6614 __ cmpb(tmp1, kInternalizedTag | kStringTag); 6614 __ test(tmp1, Immediate(kIsNotStringMask | kIsNotInternalizedMask));
6615 __ j(not_equal, &miss, Label::kNear); 6615 __ j(not_zero, &miss, Label::kNear);
6616
6617 __ and_(tmp2, Immediate(kIsNotStringMask | kIsInternalizedMask));
6618 __ cmpb(tmp2, kInternalizedTag | kStringTag);
6619 __ j(not_equal, &miss, Label::kNear);
6620 6616
6621 // Internalized strings are compared by identity. 6617 // Internalized strings are compared by identity.
6622 Label done; 6618 Label done;
6623 __ cmp(left, right); 6619 __ cmp(left, right);
6624 // Make sure eax is non-zero. At this point input operands are 6620 // Make sure eax is non-zero. At this point input operands are
6625 // guaranteed to be non-zero. 6621 // guaranteed to be non-zero.
6626 ASSERT(right.is(eax)); 6622 ASSERT(right.is(eax));
6627 __ j(not_equal, &done, Label::kNear); 6623 __ j(not_equal, &done, Label::kNear);
6628 STATIC_ASSERT(EQUAL == 0); 6624 STATIC_ASSERT(EQUAL == 0);
6629 STATIC_ASSERT(kSmiTag == 0); 6625 STATIC_ASSERT(kSmiTag == 0);
(...skipping 18 matching lines...) Expand all
6648 6644
6649 // Check that both operands are heap objects. 6645 // Check that both operands are heap objects.
6650 Label miss; 6646 Label miss;
6651 __ mov(tmp1, left); 6647 __ mov(tmp1, left);
6652 STATIC_ASSERT(kSmiTag == 0); 6648 STATIC_ASSERT(kSmiTag == 0);
6653 __ and_(tmp1, right); 6649 __ and_(tmp1, right);
6654 __ JumpIfSmi(tmp1, &miss, Label::kNear); 6650 __ JumpIfSmi(tmp1, &miss, Label::kNear);
6655 6651
6656 // Check that both operands are unique names. This leaves the instance 6652 // Check that both operands are unique names. This leaves the instance
6657 // types loaded in tmp1 and tmp2. 6653 // types loaded in tmp1 and tmp2.
6658 STATIC_ASSERT(kInternalizedTag != 0);
6659 __ mov(tmp1, FieldOperand(left, HeapObject::kMapOffset)); 6654 __ mov(tmp1, FieldOperand(left, HeapObject::kMapOffset));
6660 __ mov(tmp2, FieldOperand(right, HeapObject::kMapOffset)); 6655 __ mov(tmp2, FieldOperand(right, HeapObject::kMapOffset));
6661 __ movzx_b(tmp1, FieldOperand(tmp1, Map::kInstanceTypeOffset)); 6656 __ movzx_b(tmp1, FieldOperand(tmp1, Map::kInstanceTypeOffset));
6662 __ movzx_b(tmp2, FieldOperand(tmp2, Map::kInstanceTypeOffset)); 6657 __ movzx_b(tmp2, FieldOperand(tmp2, Map::kInstanceTypeOffset));
6663 6658
6664 __ JumpIfNotUniqueName(tmp1, &miss, Label::kNear); 6659 __ JumpIfNotUniqueName(tmp1, &miss, Label::kNear);
6665 __ JumpIfNotUniqueName(tmp2, &miss, Label::kNear); 6660 __ JumpIfNotUniqueName(tmp2, &miss, Label::kNear);
6666 6661
6667 // Unique names are compared by identity. 6662 // Unique names are compared by identity.
6668 Label done; 6663 Label done;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
6724 6719
6725 // Handle not identical strings. 6720 // Handle not identical strings.
6726 __ bind(&not_same); 6721 __ bind(&not_same);
6727 6722
6728 // Check that both strings are internalized. If they are, we're done 6723 // Check that both strings are internalized. If they are, we're done
6729 // because we already know they are not identical. But in the case of 6724 // because we already know they are not identical. But in the case of
6730 // non-equality compare, we still need to determine the order. We 6725 // non-equality compare, we still need to determine the order. We
6731 // also know they are both strings. 6726 // also know they are both strings.
6732 if (equality) { 6727 if (equality) {
6733 Label do_compare; 6728 Label do_compare;
6734 STATIC_ASSERT(kInternalizedTag != 0); 6729 STATIC_ASSERT(kInternalizedTag == 0);
6735 __ and_(tmp1, tmp2); 6730 __ or_(tmp1, tmp2);
6736 __ test(tmp1, Immediate(kIsInternalizedMask)); 6731 __ test(tmp1, Immediate(kIsNotInternalizedMask));
6737 __ j(zero, &do_compare, Label::kNear); 6732 __ j(not_zero, &do_compare, Label::kNear);
6738 // Make sure eax is non-zero. At this point input operands are 6733 // Make sure eax is non-zero. At this point input operands are
6739 // guaranteed to be non-zero. 6734 // guaranteed to be non-zero.
6740 ASSERT(right.is(eax)); 6735 ASSERT(right.is(eax));
6741 __ ret(0); 6736 __ ret(0);
6742 __ bind(&do_compare); 6737 __ bind(&do_compare);
6743 } 6738 }
6744 6739
6745 // Check that both strings are sequential ASCII. 6740 // Check that both strings are sequential ASCII.
6746 Label runtime; 6741 Label runtime;
6747 __ JumpIfNotBothSequentialAsciiStrings(left, right, tmp1, tmp2, &runtime); 6742 __ JumpIfNotBothSequentialAsciiStrings(left, right, tmp1, tmp2, &runtime);
(...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after
7781 __ bind(&fast_elements_case); 7776 __ bind(&fast_elements_case);
7782 GenerateCase(masm, FAST_ELEMENTS); 7777 GenerateCase(masm, FAST_ELEMENTS);
7783 } 7778 }
7784 7779
7785 7780
7786 #undef __ 7781 #undef __
7787 7782
7788 } } // namespace v8::internal 7783 } } // namespace v8::internal
7789 7784
7790 #endif // V8_TARGET_ARCH_IA32 7785 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.cc ('k') | src/ia32/ic-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698