| OLD | NEW |
| 1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 1788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1799 bool strict_; | 1799 bool strict_; |
| 1800 | 1800 |
| 1801 Major MajorKey() { return Compare; } | 1801 Major MajorKey() { return Compare; } |
| 1802 | 1802 |
| 1803 int MinorKey() { | 1803 int MinorKey() { |
| 1804 // Encode the three parameters in a unique 16 bit value. | 1804 // Encode the three parameters in a unique 16 bit value. |
| 1805 ASSERT(static_cast<int>(cc_) < (1 << 15)); | 1805 ASSERT(static_cast<int>(cc_) < (1 << 15)); |
| 1806 return (static_cast<int>(cc_) << 1) | (strict_ ? 1 : 0); | 1806 return (static_cast<int>(cc_) << 1) | (strict_ ? 1 : 0); |
| 1807 } | 1807 } |
| 1808 | 1808 |
| 1809 // Branch to the label if the given object isn't a symbol. |
| 1810 void BranchIfNonSymbol(MacroAssembler* masm, |
| 1811 Label* label, |
| 1812 Register object, |
| 1813 Register scratch); |
| 1814 |
| 1809 #ifdef DEBUG | 1815 #ifdef DEBUG |
| 1810 void Print() { | 1816 void Print() { |
| 1811 PrintF("CompareStub (cc %d), (strict %s)\n", | 1817 PrintF("CompareStub (cc %d), (strict %s)\n", |
| 1812 static_cast<int>(cc_), | 1818 static_cast<int>(cc_), |
| 1813 strict_ ? "true" : "false"); | 1819 strict_ ? "true" : "false"); |
| 1814 } | 1820 } |
| 1815 #endif | 1821 #endif |
| 1816 }; | 1822 }; |
| 1817 | 1823 |
| 1818 | 1824 |
| (...skipping 5166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6985 | 6991 |
| 6986 // Check for oddballs: true, false, null, undefined. | 6992 // Check for oddballs: true, false, null, undefined. |
| 6987 __ cmp(ecx, ODDBALL_TYPE); | 6993 __ cmp(ecx, ODDBALL_TYPE); |
| 6988 __ j(equal, &return_not_equal); | 6994 __ j(equal, &return_not_equal); |
| 6989 | 6995 |
| 6990 // Fall through to the general case. | 6996 // Fall through to the general case. |
| 6991 } | 6997 } |
| 6992 __ bind(&slow); | 6998 __ bind(&slow); |
| 6993 } | 6999 } |
| 6994 | 7000 |
| 6995 // Save the return address (and get it off the stack). | 7001 // Push arguments below the return address. |
| 6996 __ pop(ecx); | 7002 __ pop(ecx); |
| 6997 | |
| 6998 // Push arguments. | |
| 6999 __ push(eax); | 7003 __ push(eax); |
| 7000 __ push(edx); | 7004 __ push(edx); |
| 7001 __ push(ecx); | 7005 __ push(ecx); |
| 7002 | 7006 |
| 7003 // Inlined floating point compare. | 7007 // Inlined floating point compare. |
| 7004 // Call builtin if operands are not floating point or smi. | 7008 // Call builtin if operands are not floating point or smi. |
| 7005 FloatingPointHelper::CheckFloatOperands(masm, &call_builtin, ebx); | 7009 Label check_for_symbols; |
| 7010 FloatingPointHelper::CheckFloatOperands(masm, &check_for_symbols, ebx); |
| 7006 FloatingPointHelper::LoadFloatOperands(masm, ecx); | 7011 FloatingPointHelper::LoadFloatOperands(masm, ecx); |
| 7007 __ FCmp(); | 7012 __ FCmp(); |
| 7008 | 7013 |
| 7009 // Jump to builtin for NaN. | 7014 // Jump to builtin for NaN. |
| 7010 __ j(parity_even, &call_builtin, not_taken); | 7015 __ j(parity_even, &call_builtin, not_taken); |
| 7011 | 7016 |
| 7012 // TODO(1243847): Use cmov below once CpuFeatures are properly hooked up. | 7017 // TODO(1243847): Use cmov below once CpuFeatures are properly hooked up. |
| 7013 Label below_lbl, above_lbl; | 7018 Label below_lbl, above_lbl; |
| 7014 // use edx, eax to convert unsigned to signed comparison | 7019 // use edx, eax to convert unsigned to signed comparison |
| 7015 __ j(below, &below_lbl, not_taken); | 7020 __ j(below, &below_lbl, not_taken); |
| 7016 __ j(above, &above_lbl, not_taken); | 7021 __ j(above, &above_lbl, not_taken); |
| 7017 | 7022 |
| 7018 __ xor_(eax, Operand(eax)); // equal | 7023 __ xor_(eax, Operand(eax)); // equal |
| 7019 __ ret(2 * kPointerSize); | 7024 __ ret(2 * kPointerSize); |
| 7020 | 7025 |
| 7021 __ bind(&below_lbl); | 7026 __ bind(&below_lbl); |
| 7022 __ mov(eax, -1); | 7027 __ mov(eax, -1); |
| 7023 __ ret(2 * kPointerSize); | 7028 __ ret(2 * kPointerSize); |
| 7024 | 7029 |
| 7025 __ bind(&above_lbl); | 7030 __ bind(&above_lbl); |
| 7026 __ mov(eax, 1); | 7031 __ mov(eax, 1); |
| 7027 __ ret(2 * kPointerSize); // eax, edx were pushed | 7032 __ ret(2 * kPointerSize); // eax, edx were pushed |
| 7028 | 7033 |
| 7034 // Fast negative check for symbol-to-symbol equality. |
| 7035 __ bind(&check_for_symbols); |
| 7036 if (cc_ == equal) { |
| 7037 BranchIfNonSymbol(masm, &call_builtin, eax, ecx); |
| 7038 BranchIfNonSymbol(masm, &call_builtin, edx, ecx); |
| 7039 |
| 7040 // We've already checked for object identity, so if both operands |
| 7041 // are symbols they aren't equal. Register eax already holds a |
| 7042 // non-zero value, which indicates not equal, so just return. |
| 7043 __ ret(2 * kPointerSize); |
| 7044 } |
| 7045 |
| 7029 __ bind(&call_builtin); | 7046 __ bind(&call_builtin); |
| 7030 // must swap argument order | 7047 // must swap argument order |
| 7031 __ pop(ecx); | 7048 __ pop(ecx); |
| 7032 __ pop(edx); | 7049 __ pop(edx); |
| 7033 __ pop(eax); | 7050 __ pop(eax); |
| 7034 __ push(edx); | 7051 __ push(edx); |
| 7035 __ push(eax); | 7052 __ push(eax); |
| 7036 | 7053 |
| 7037 // Figure out which native to call and setup the arguments. | 7054 // Figure out which native to call and setup the arguments. |
| 7038 Builtins::JavaScript builtin; | 7055 Builtins::JavaScript builtin; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 7052 | 7069 |
| 7053 // Restore return address on the stack. | 7070 // Restore return address on the stack. |
| 7054 __ push(ecx); | 7071 __ push(ecx); |
| 7055 | 7072 |
| 7056 // Call the native; it returns -1 (less), 0 (equal), or 1 (greater) | 7073 // Call the native; it returns -1 (less), 0 (equal), or 1 (greater) |
| 7057 // tagged as a small integer. | 7074 // tagged as a small integer. |
| 7058 __ InvokeBuiltin(builtin, JUMP_FUNCTION); | 7075 __ InvokeBuiltin(builtin, JUMP_FUNCTION); |
| 7059 } | 7076 } |
| 7060 | 7077 |
| 7061 | 7078 |
| 7079 void CompareStub::BranchIfNonSymbol(MacroAssembler* masm, |
| 7080 Label* label, |
| 7081 Register object, |
| 7082 Register scratch) { |
| 7083 __ test(object, Immediate(kSmiTagMask)); |
| 7084 __ j(zero, label); |
| 7085 __ mov(scratch, FieldOperand(object, HeapObject::kMapOffset)); |
| 7086 __ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset)); |
| 7087 __ and_(scratch, kIsSymbolMask | kIsNotStringMask); |
| 7088 __ cmp(scratch, kSymbolTag | kStringTag); |
| 7089 __ j(not_equal, label); |
| 7090 } |
| 7091 |
| 7092 |
| 7062 void StackCheckStub::Generate(MacroAssembler* masm) { | 7093 void StackCheckStub::Generate(MacroAssembler* masm) { |
| 7063 // Because builtins always remove the receiver from the stack, we | 7094 // Because builtins always remove the receiver from the stack, we |
| 7064 // have to fake one to avoid underflowing the stack. The receiver | 7095 // have to fake one to avoid underflowing the stack. The receiver |
| 7065 // must be inserted below the return address on the stack so we | 7096 // must be inserted below the return address on the stack so we |
| 7066 // temporarily store that in a register. | 7097 // temporarily store that in a register. |
| 7067 __ pop(eax); | 7098 __ pop(eax); |
| 7068 __ push(Immediate(Smi::FromInt(0))); | 7099 __ push(Immediate(Smi::FromInt(0))); |
| 7069 __ push(eax); | 7100 __ push(eax); |
| 7070 | 7101 |
| 7071 // Do tail-call to runtime routine. | 7102 // Do tail-call to runtime routine. |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7482 | 7513 |
| 7483 // Slow-case: Go through the JavaScript implementation. | 7514 // Slow-case: Go through the JavaScript implementation. |
| 7484 __ bind(&slow); | 7515 __ bind(&slow); |
| 7485 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); | 7516 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); |
| 7486 } | 7517 } |
| 7487 | 7518 |
| 7488 | 7519 |
| 7489 #undef __ | 7520 #undef __ |
| 7490 | 7521 |
| 7491 } } // namespace v8::internal | 7522 } } // namespace v8::internal |
| OLD | NEW |