Chromium Code Reviews| 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 1711 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1722 EmitBranch(true_block, false_block, ne); | 1722 EmitBranch(true_block, false_block, ne); |
| 1723 } | 1723 } |
| 1724 } | 1724 } |
| 1725 | 1725 |
| 1726 | 1726 |
| 1727 Condition LCodeGen::EmitIsObject(Register input, | 1727 Condition LCodeGen::EmitIsObject(Register input, |
| 1728 Register temp1, | 1728 Register temp1, |
| 1729 Register temp2, | 1729 Register temp2, |
| 1730 Label* is_not_object, | 1730 Label* is_not_object, |
| 1731 Label* is_object) { | 1731 Label* is_object) { |
| 1732 Abort("EmitIsObject unimplemented."); | 1732 __ BranchOnSmi(input, is_not_object); |
| 1733 return ne; | 1733 |
| 1734 __ LoadRoot(temp1, Heap::kNullValueRootIndex); | |
| 1735 __ cmp(input, temp1); | |
| 1736 __ b(eq, is_object); | |
| 1737 | |
| 1738 // Load map. | |
| 1739 __ ldr(temp1, FieldMemOperand(input, HeapObject::kMapOffset)); | |
| 1740 // Undetectable objects behave like undefined. | |
| 1741 __ ldrb(temp2, FieldMemOperand(temp1, Map::kBitFieldOffset)); | |
| 1742 __ tst(temp2, Operand(1 << Map::kIsUndetectable)); | |
| 1743 __ b(ne, is_not_object); | |
| 1744 | |
| 1745 // Load instance type and check that it is in object type range. | |
| 1746 __ ldrb(temp2, FieldMemOperand(temp1, Map::kInstanceTypeOffset)); | |
| 1747 __ cmp(temp2, Operand(FIRST_JS_OBJECT_TYPE)); | |
| 1748 __ b(lt, is_not_object); | |
| 1749 __ cmp(temp2, Operand(LAST_JS_OBJECT_TYPE)); | |
| 1750 return le; | |
| 1734 } | 1751 } |
| 1735 | 1752 |
| 1736 | 1753 |
| 1737 void LCodeGen::DoIsObject(LIsObject* instr) { | 1754 void LCodeGen::DoIsObject(LIsObject* instr) { |
| 1738 Abort("DoIsObject unimplemented."); | 1755 Register reg = ToRegister(instr->input()); |
| 1756 Register result = ToRegister(instr->result()); | |
| 1757 Register temp = scratch0(); | |
| 1758 Label is_false, is_true, done; | |
| 1759 | |
| 1760 Condition true_cond = EmitIsObject(reg, result, temp, &is_false, &is_true); | |
| 1761 __ b(true_cond, &is_true); | |
| 1762 | |
| 1763 __ bind(&is_false); | |
| 1764 __ LoadRoot(result, Heap::kFalseValueRootIndex); | |
| 1765 __ b(al, &done); | |
|
Mads Ager (chromium)
2011/01/24 12:24:46
This is the same as __ b(&done);
I'll change that
| |
| 1766 | |
| 1767 __ bind(&is_true); | |
| 1768 __ LoadRoot(result, Heap::kTrueValueRootIndex); | |
| 1769 | |
| 1770 __ bind(&done); | |
| 1739 } | 1771 } |
| 1740 | 1772 |
| 1741 | 1773 |
| 1742 void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) { | 1774 void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) { |
| 1743 Abort("DoIsObjectAndBranch unimplemented."); | 1775 Register reg = ToRegister(instr->input()); |
| 1776 Register temp1 = ToRegister(instr->temp()); | |
| 1777 Register temp2 = scratch0(); | |
| 1778 | |
| 1779 int true_block = chunk_->LookupDestination(instr->true_block_id()); | |
| 1780 int false_block = chunk_->LookupDestination(instr->false_block_id()); | |
| 1781 Label* true_label = chunk_->GetAssemblyLabel(true_block); | |
| 1782 Label* false_label = chunk_->GetAssemblyLabel(false_block); | |
| 1783 | |
| 1784 Condition true_cond = EmitIsObject(reg, temp1, temp2, false_label, | |
| 1785 true_label); | |
| 1786 | |
| 1787 EmitBranch(true_block, false_block, true_cond); | |
| 1744 } | 1788 } |
| 1745 | 1789 |
| 1746 | 1790 |
| 1747 void LCodeGen::DoIsSmi(LIsSmi* instr) { | 1791 void LCodeGen::DoIsSmi(LIsSmi* instr) { |
| 1748 ASSERT(instr->hydrogen()->value()->representation().IsTagged()); | 1792 ASSERT(instr->hydrogen()->value()->representation().IsTagged()); |
| 1749 Register result = ToRegister(instr->result()); | 1793 Register result = ToRegister(instr->result()); |
| 1750 Register input_reg = EmitLoadRegister(instr->input(), ip); | 1794 Register input_reg = EmitLoadRegister(instr->input(), ip); |
| 1751 __ tst(input_reg, Operand(kSmiTagMask)); | 1795 __ tst(input_reg, Operand(kSmiTagMask)); |
| 1752 __ LoadRoot(result, Heap::kTrueValueRootIndex); | 1796 __ LoadRoot(result, Heap::kTrueValueRootIndex); |
| 1753 Label done; | 1797 Label done; |
| (...skipping 1878 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3632 | 3676 |
| 3633 | 3677 |
| 3634 void LCodeGen::DoOsrEntry(LOsrEntry* instr) { | 3678 void LCodeGen::DoOsrEntry(LOsrEntry* instr) { |
| 3635 Abort("DoOsrEntry unimplemented."); | 3679 Abort("DoOsrEntry unimplemented."); |
| 3636 } | 3680 } |
| 3637 | 3681 |
| 3638 | 3682 |
| 3639 #undef __ | 3683 #undef __ |
| 3640 | 3684 |
| 3641 } } // namespace v8::internal | 3685 } } // namespace v8::internal |
| OLD | NEW |