| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1711 __ li(a0, Operand(Smi::FromInt(ncr))); | 1711 __ li(a0, Operand(Smi::FromInt(ncr))); |
| 1712 __ push(a0); | 1712 __ push(a0); |
| 1713 } | 1713 } |
| 1714 | 1714 |
| 1715 // Call the native; it returns -1 (less), 0 (equal), or 1 (greater) | 1715 // Call the native; it returns -1 (less), 0 (equal), or 1 (greater) |
| 1716 // tagged as a small integer. | 1716 // tagged as a small integer. |
| 1717 __ InvokeBuiltin(native, JUMP_FUNCTION); | 1717 __ InvokeBuiltin(native, JUMP_FUNCTION); |
| 1718 } | 1718 } |
| 1719 | 1719 |
| 1720 | 1720 |
| 1721 // This stub does not handle the inlined cases (Smis, Booleans, undefined). | |
| 1722 // The stub returns zero for false, and a non-zero value for true. | 1721 // The stub returns zero for false, and a non-zero value for true. |
| 1723 void ToBooleanStub::Generate(MacroAssembler* masm) { | 1722 void ToBooleanStub::Generate(MacroAssembler* masm) { |
| 1724 // This stub uses FPU instructions. | 1723 // This stub uses FPU instructions. |
| 1725 CpuFeatures::Scope scope(FPU); | 1724 CpuFeatures::Scope scope(FPU); |
| 1726 | 1725 |
| 1727 Label false_result; | 1726 Label false_result; |
| 1728 Label not_heap_number; | 1727 Label not_heap_number; |
| 1729 Register scratch0 = t5.is(tos_) ? t3 : t5; | 1728 Register scratch0 = t5.is(tos_) ? t3 : t5; |
| 1730 | 1729 |
| 1731 // undefined -> false | 1730 // undefined -> false |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1775 __ And(scratch0, scratch0, Operand(1 << Map::kIsUndetectable)); | 1774 __ And(scratch0, scratch0, Operand(1 << Map::kIsUndetectable)); |
| 1776 __ Branch(&false_result, eq, scratch0, Operand(1 << Map::kIsUndetectable)); | 1775 __ Branch(&false_result, eq, scratch0, Operand(1 << Map::kIsUndetectable)); |
| 1777 | 1776 |
| 1778 // JavaScript object => true. | 1777 // JavaScript object => true. |
| 1779 __ lw(scratch0, FieldMemOperand(tos_, HeapObject::kMapOffset)); | 1778 __ lw(scratch0, FieldMemOperand(tos_, HeapObject::kMapOffset)); |
| 1780 __ lbu(scratch0, FieldMemOperand(scratch0, Map::kInstanceTypeOffset)); | 1779 __ lbu(scratch0, FieldMemOperand(scratch0, Map::kInstanceTypeOffset)); |
| 1781 | 1780 |
| 1782 // "tos_" is a register and contains a non-zero value. | 1781 // "tos_" is a register and contains a non-zero value. |
| 1783 // Hence we implicitly return true if the greater than | 1782 // Hence we implicitly return true if the greater than |
| 1784 // condition is satisfied. | 1783 // condition is satisfied. |
| 1785 __ Ret(gt, scratch0, Operand(FIRST_SPEC_OBJECT_TYPE)); | 1784 __ Ret(ge, scratch0, Operand(FIRST_SPEC_OBJECT_TYPE)); |
| 1786 | 1785 |
| 1787 // Check for string. | 1786 // Check for string. |
| 1788 __ lw(scratch0, FieldMemOperand(tos_, HeapObject::kMapOffset)); | 1787 __ lw(scratch0, FieldMemOperand(tos_, HeapObject::kMapOffset)); |
| 1789 __ lbu(scratch0, FieldMemOperand(scratch0, Map::kInstanceTypeOffset)); | 1788 __ lbu(scratch0, FieldMemOperand(scratch0, Map::kInstanceTypeOffset)); |
| 1790 // "tos_" is a register and contains a non-zero value. | 1789 // "tos_" is a register and contains a non-zero value. |
| 1791 // Hence we implicitly return true if the greater than | 1790 // Hence we implicitly return true if the greater than |
| 1792 // condition is satisfied. | 1791 // condition is satisfied. |
| 1793 __ Ret(gt, scratch0, Operand(FIRST_NONSTRING_TYPE)); | 1792 __ Ret(ge, scratch0, Operand(FIRST_NONSTRING_TYPE)); |
| 1794 | 1793 |
| 1795 // String value => false iff empty, i.e., length is zero. | 1794 // String value => false iff empty, i.e., length is zero. |
| 1796 __ lw(tos_, FieldMemOperand(tos_, String::kLengthOffset)); | 1795 __ lw(tos_, FieldMemOperand(tos_, String::kLengthOffset)); |
| 1797 // If length is zero, "tos_" contains zero ==> false. | 1796 // If length is zero, "tos_" contains zero ==> false. |
| 1798 // If length is not zero, "tos_" contains a non-zero value ==> true. | 1797 // If length is not zero, "tos_" contains a non-zero value ==> true. |
| 1799 __ Ret(); | 1798 __ Ret(); |
| 1800 | 1799 |
| 1801 // Return 0 in "tos_" for false. | 1800 // Return 0 in "tos_" for false. |
| 1802 __ bind(&false_result); | 1801 __ bind(&false_result); |
| 1803 __ mov(tos_, zero_reg); | 1802 __ mov(tos_, zero_reg); |
| (...skipping 5084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6888 __ mov(result, zero_reg); | 6887 __ mov(result, zero_reg); |
| 6889 __ Ret(); | 6888 __ Ret(); |
| 6890 } | 6889 } |
| 6891 | 6890 |
| 6892 | 6891 |
| 6893 #undef __ | 6892 #undef __ |
| 6894 | 6893 |
| 6895 } } // namespace v8::internal | 6894 } } // namespace v8::internal |
| 6896 | 6895 |
| 6897 #endif // V8_TARGET_ARCH_MIPS | 6896 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |