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

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

Issue 9583038: MIPS: Inline ordered relational compares of mixed double/undefined values. (Closed)
Patch Set: 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
« no previous file with comments | « no previous file | no next file » | 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 6767 matching lines...) Expand 10 before | Expand all | Expand 10 after
6778 6778
6779 __ bind(&miss); 6779 __ bind(&miss);
6780 GenerateMiss(masm); 6780 GenerateMiss(masm);
6781 } 6781 }
6782 6782
6783 6783
6784 void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) { 6784 void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) {
6785 ASSERT(state_ == CompareIC::HEAP_NUMBERS); 6785 ASSERT(state_ == CompareIC::HEAP_NUMBERS);
6786 6786
6787 Label generic_stub; 6787 Label generic_stub;
6788 Label unordered; 6788 Label unordered, maybe_undefined1, maybe_undefined2;
6789 Label miss; 6789 Label miss;
6790 __ And(a2, a1, Operand(a0)); 6790 __ And(a2, a1, Operand(a0));
6791 __ JumpIfSmi(a2, &generic_stub); 6791 __ JumpIfSmi(a2, &generic_stub);
6792 6792
6793 __ GetObjectType(a0, a2, a2); 6793 __ GetObjectType(a0, a2, a2);
6794 __ Branch(&miss, ne, a2, Operand(HEAP_NUMBER_TYPE)); 6794 __ Branch(&maybe_undefined1, ne, a2, Operand(HEAP_NUMBER_TYPE));
6795 __ GetObjectType(a1, a2, a2); 6795 __ GetObjectType(a1, a2, a2);
6796 __ Branch(&miss, ne, a2, Operand(HEAP_NUMBER_TYPE)); 6796 __ Branch(&maybe_undefined2, ne, a2, Operand(HEAP_NUMBER_TYPE));
6797 6797
6798 // Inlining the double comparison and falling back to the general compare 6798 // Inlining the double comparison and falling back to the general compare
6799 // stub if NaN is involved or FPU is unsupported. 6799 // stub if NaN is involved or FPU is unsupported.
6800 if (CpuFeatures::IsSupported(FPU)) { 6800 if (CpuFeatures::IsSupported(FPU)) {
6801 CpuFeatures::Scope scope(FPU); 6801 CpuFeatures::Scope scope(FPU);
6802 6802
6803 // Load left and right operand. 6803 // Load left and right operand.
6804 __ Subu(a2, a1, Operand(kHeapObjectTag)); 6804 __ Subu(a2, a1, Operand(kHeapObjectTag));
6805 __ ldc1(f0, MemOperand(a2, HeapNumber::kValueOffset)); 6805 __ ldc1(f0, MemOperand(a2, HeapNumber::kValueOffset));
6806 __ Subu(a2, a0, Operand(kHeapObjectTag)); 6806 __ Subu(a2, a0, Operand(kHeapObjectTag));
(...skipping 11 matching lines...) Expand all
6818 __ Ret(USE_DELAY_SLOT); 6818 __ Ret(USE_DELAY_SLOT);
6819 __ li(v0, Operand(GREATER)); // In delay slot. 6819 __ li(v0, Operand(GREATER)); // In delay slot.
6820 6820
6821 __ bind(&fpu_eq); 6821 __ bind(&fpu_eq);
6822 __ Ret(USE_DELAY_SLOT); 6822 __ Ret(USE_DELAY_SLOT);
6823 __ li(v0, Operand(EQUAL)); // In delay slot. 6823 __ li(v0, Operand(EQUAL)); // In delay slot.
6824 6824
6825 __ bind(&fpu_lt); 6825 __ bind(&fpu_lt);
6826 __ Ret(USE_DELAY_SLOT); 6826 __ Ret(USE_DELAY_SLOT);
6827 __ li(v0, Operand(LESS)); // In delay slot. 6827 __ li(v0, Operand(LESS)); // In delay slot.
6828 }
6828 6829
6829 __ bind(&unordered); 6830 __ bind(&unordered);
6830 }
6831 6831
6832 CompareStub stub(GetCondition(), strict(), NO_COMPARE_FLAGS, a1, a0); 6832 CompareStub stub(GetCondition(), strict(), NO_COMPARE_FLAGS, a1, a0);
6833 __ bind(&generic_stub); 6833 __ bind(&generic_stub);
6834 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); 6834 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
6835 6835
6836 __ bind(&maybe_undefined1);
6837 if (Token::IsOrderedRelationalCompareOp(op_)) {
6838 __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
6839 __ Branch(&miss, ne, a0, Operand(at));
6840 __ GetObjectType(a1, a2, a2);
6841 __ Branch(&maybe_undefined2, ne, a2, Operand(HEAP_NUMBER_TYPE));
6842 __ jmp(&unordered);
6843 }
6844
6845 __ bind(&maybe_undefined2);
6846 if (Token::IsOrderedRelationalCompareOp(op_)) {
6847 __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
6848 __ Branch(&unordered, eq, a1, Operand(at));
6849 }
6850
6836 __ bind(&miss); 6851 __ bind(&miss);
6837 GenerateMiss(masm); 6852 GenerateMiss(masm);
6838 } 6853 }
6839 6854
6840 6855
6841 void ICCompareStub::GenerateSymbols(MacroAssembler* masm) { 6856 void ICCompareStub::GenerateSymbols(MacroAssembler* masm) {
6842 ASSERT(state_ == CompareIC::SYMBOLS); 6857 ASSERT(state_ == CompareIC::SYMBOLS);
6843 Label miss; 6858 Label miss;
6844 6859
6845 // Registers containing left and right operands respectively. 6860 // Registers containing left and right operands respectively.
(...skipping 808 matching lines...) Expand 10 before | Expand all | Expand 10 after
7654 __ Ret(USE_DELAY_SLOT); 7669 __ Ret(USE_DELAY_SLOT);
7655 __ mov(v0, a0); 7670 __ mov(v0, a0);
7656 } 7671 }
7657 7672
7658 7673
7659 #undef __ 7674 #undef __
7660 7675
7661 } } // namespace v8::internal 7676 } } // namespace v8::internal
7662 7677
7663 #endif // V8_TARGET_ARCH_MIPS 7678 #endif // V8_TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698