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

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

Issue 9584006: Inline ordered relative compares of mixed double/undefined values. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Tweak comment Created 8 years, 9 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/ic.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 6554 matching lines...) Expand 10 before | Expand all | Expand 10 after
6565 6565
6566 __ bind(&miss); 6566 __ bind(&miss);
6567 GenerateMiss(masm); 6567 GenerateMiss(masm);
6568 } 6568 }
6569 6569
6570 6570
6571 void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) { 6571 void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) {
6572 ASSERT(state_ == CompareIC::HEAP_NUMBERS); 6572 ASSERT(state_ == CompareIC::HEAP_NUMBERS);
6573 6573
6574 Label generic_stub; 6574 Label generic_stub;
6575 Label unordered; 6575 Label unordered, maybe_undefined1, maybe_undefined2;
6576 Label miss; 6576 Label miss;
6577 __ mov(ecx, edx); 6577 __ mov(ecx, edx);
6578 __ and_(ecx, eax); 6578 __ and_(ecx, eax);
6579 __ JumpIfSmi(ecx, &generic_stub, Label::kNear); 6579 __ JumpIfSmi(ecx, &generic_stub, Label::kNear);
6580 6580
6581 __ CmpObjectType(eax, HEAP_NUMBER_TYPE, ecx); 6581 __ CmpObjectType(eax, HEAP_NUMBER_TYPE, ecx);
6582 __ j(not_equal, &miss, Label::kNear); 6582 __ j(not_equal, &maybe_undefined1, Label::kNear);
6583 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx); 6583 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx);
6584 __ j(not_equal, &miss, Label::kNear); 6584 __ j(not_equal, &maybe_undefined2, Label::kNear);
6585 6585
6586 // Inlining the double comparison and falling back to the general compare 6586 // Inlining the double comparison and falling back to the general compare
6587 // stub if NaN is involved or SS2 or CMOV is unsupported. 6587 // stub if NaN is involved or SS2 or CMOV is unsupported.
6588 if (CpuFeatures::IsSupported(SSE2) && CpuFeatures::IsSupported(CMOV)) { 6588 if (CpuFeatures::IsSupported(SSE2) && CpuFeatures::IsSupported(CMOV)) {
6589 CpuFeatures::Scope scope1(SSE2); 6589 CpuFeatures::Scope scope1(SSE2);
6590 CpuFeatures::Scope scope2(CMOV); 6590 CpuFeatures::Scope scope2(CMOV);
6591 6591
6592 // Load left and right operand 6592 // Load left and right operand
6593 __ movdbl(xmm0, FieldOperand(edx, HeapNumber::kValueOffset)); 6593 __ movdbl(xmm0, FieldOperand(edx, HeapNumber::kValueOffset));
6594 __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset)); 6594 __ movdbl(xmm1, FieldOperand(eax, HeapNumber::kValueOffset));
6595 6595
6596 // Compare operands 6596 // Compare operands
6597 __ ucomisd(xmm0, xmm1); 6597 __ ucomisd(xmm0, xmm1);
6598 6598
6599 // Don't base result on EFLAGS when a NaN is involved. 6599 // Don't base result on EFLAGS when a NaN is involved.
6600 __ j(parity_even, &unordered, Label::kNear); 6600 __ j(parity_even, &unordered, Label::kNear);
6601 6601
6602 // Return a result of -1, 0, or 1, based on EFLAGS. 6602 // Return a result of -1, 0, or 1, based on EFLAGS.
6603 // Performing mov, because xor would destroy the flag register. 6603 // Performing mov, because xor would destroy the flag register.
6604 __ mov(eax, 0); // equal 6604 __ mov(eax, 0); // equal
6605 __ mov(ecx, Immediate(Smi::FromInt(1))); 6605 __ mov(ecx, Immediate(Smi::FromInt(1)));
6606 __ cmov(above, eax, ecx); 6606 __ cmov(above, eax, ecx);
6607 __ mov(ecx, Immediate(Smi::FromInt(-1))); 6607 __ mov(ecx, Immediate(Smi::FromInt(-1)));
6608 __ cmov(below, eax, ecx); 6608 __ cmov(below, eax, ecx);
6609 __ ret(0); 6609 __ ret(0);
6610
6611 __ bind(&unordered);
6612 } 6610 }
6613 6611
6612 __ bind(&unordered);
6614 CompareStub stub(GetCondition(), strict(), NO_COMPARE_FLAGS); 6613 CompareStub stub(GetCondition(), strict(), NO_COMPARE_FLAGS);
6615 __ bind(&generic_stub); 6614 __ bind(&generic_stub);
6616 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET); 6615 __ jmp(stub.GetCode(), RelocInfo::CODE_TARGET);
6617 6616
6617 __ bind(&maybe_undefined1);
6618 if (Token::IsOrderedRelationalCompareOp(op_)) {
6619 __ cmp(eax, Immediate(masm->isolate()->factory()->undefined_value()));
6620 __ j(not_equal, &miss);
6621 __ CmpObjectType(edx, HEAP_NUMBER_TYPE, ecx);
6622 __ j(not_equal, &maybe_undefined2, Label::kNear);
6623 __ jmp(&unordered);
6624 }
6625
6626 __ bind(&maybe_undefined2);
6627 if (Token::IsOrderedRelationalCompareOp(op_)) {
6628 __ cmp(edx, Immediate(masm->isolate()->factory()->undefined_value()));
6629 __ j(equal, &unordered);
6630 }
6631
6618 __ bind(&miss); 6632 __ bind(&miss);
6619 GenerateMiss(masm); 6633 GenerateMiss(masm);
6620 } 6634 }
6621 6635
6622 6636
6623 void ICCompareStub::GenerateSymbols(MacroAssembler* masm) { 6637 void ICCompareStub::GenerateSymbols(MacroAssembler* masm) {
6624 ASSERT(state_ == CompareIC::SYMBOLS); 6638 ASSERT(state_ == CompareIC::SYMBOLS);
6625 ASSERT(GetCondition() == equal); 6639 ASSERT(GetCondition() == equal);
6626 6640
6627 // Registers containing left and right operands respectively. 6641 // Registers containing left and right operands respectively.
(...skipping 757 matching lines...) Expand 10 before | Expand all | Expand 10 after
7385 false); 7399 false);
7386 __ pop(edx); 7400 __ pop(edx);
7387 __ ret(0); 7401 __ ret(0);
7388 } 7402 }
7389 7403
7390 #undef __ 7404 #undef __
7391 7405
7392 } } // namespace v8::internal 7406 } } // namespace v8::internal
7393 7407
7394 #endif // V8_TARGET_ARCH_IA32 7408 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.cc ('k') | src/ic.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698