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

Side by Side Diff: src/ia32/lithium-codegen-ia32.cc

Issue 8373029: [hydrogen] optimize switch with string clauses (Closed) Base URL: gh:v8/v8@master
Patch Set: remove unused var Created 9 years, 1 month 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
OLDNEW
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 1698 matching lines...) Expand 10 before | Expand all | Expand 10 after
1709 int false_block = chunk_->LookupDestination(instr->false_block_id()); 1709 int false_block = chunk_->LookupDestination(instr->false_block_id());
1710 Label* true_label = chunk_->GetAssemblyLabel(true_block); 1710 Label* true_label = chunk_->GetAssemblyLabel(true_block);
1711 Label* false_label = chunk_->GetAssemblyLabel(false_block); 1711 Label* false_label = chunk_->GetAssemblyLabel(false_block);
1712 1712
1713 Condition true_cond = EmitIsObject(reg, temp, false_label, true_label); 1713 Condition true_cond = EmitIsObject(reg, temp, false_label, true_label);
1714 1714
1715 EmitBranch(true_block, false_block, true_cond); 1715 EmitBranch(true_block, false_block, true_cond);
1716 } 1716 }
1717 1717
1718 1718
1719 Condition LCodeGen::EmitIsString(Register input,
1720 Register temp1,
1721 Label* is_not_string) {
1722 __ JumpIfSmi(input, is_not_string);
1723
1724 Condition cond = masm_->IsObjectStringType(input, temp1, temp1);
1725
1726 return cond;
1727 }
1728
1729
1730 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) {
1731 Register reg = ToRegister(instr->InputAt(0));
1732 Register temp = ToRegister(instr->TempAt(0));
1733
1734 int true_block = chunk_->LookupDestination(instr->true_block_id());
1735 int false_block = chunk_->LookupDestination(instr->false_block_id());
1736 Label* false_label = chunk_->GetAssemblyLabel(false_block);
1737
1738 Condition true_cond = EmitIsString(reg, temp, false_label);
1739
1740 EmitBranch(true_block, false_block, true_cond);
1741 }
1742
1743
1719 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { 1744 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
1720 Operand input = ToOperand(instr->InputAt(0)); 1745 Operand input = ToOperand(instr->InputAt(0));
1721 1746
1722 int true_block = chunk_->LookupDestination(instr->true_block_id()); 1747 int true_block = chunk_->LookupDestination(instr->true_block_id());
1723 int false_block = chunk_->LookupDestination(instr->false_block_id()); 1748 int false_block = chunk_->LookupDestination(instr->false_block_id());
1724 1749
1725 __ test(input, Immediate(kSmiTagMask)); 1750 __ test(input, Immediate(kSmiTagMask));
1726 EmitBranch(true_block, false_block, zero); 1751 EmitBranch(true_block, false_block, zero);
1727 } 1752 }
1728 1753
1729 1754
1730 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { 1755 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) {
1731 Register input = ToRegister(instr->InputAt(0)); 1756 Register input = ToRegister(instr->InputAt(0));
1732 Register temp = ToRegister(instr->TempAt(0)); 1757 Register temp = ToRegister(instr->TempAt(0));
1733 1758
1734 int true_block = chunk_->LookupDestination(instr->true_block_id()); 1759 int true_block = chunk_->LookupDestination(instr->true_block_id());
1735 int false_block = chunk_->LookupDestination(instr->false_block_id()); 1760 int false_block = chunk_->LookupDestination(instr->false_block_id());
1736 1761
1737 STATIC_ASSERT(kSmiTag == 0); 1762 STATIC_ASSERT(kSmiTag == 0);
1738 __ JumpIfSmi(input, chunk_->GetAssemblyLabel(false_block)); 1763 __ JumpIfSmi(input, chunk_->GetAssemblyLabel(false_block));
1739 __ mov(temp, FieldOperand(input, HeapObject::kMapOffset)); 1764 __ mov(temp, FieldOperand(input, HeapObject::kMapOffset));
1740 __ test_b(FieldOperand(temp, Map::kBitFieldOffset), 1765 __ test_b(FieldOperand(temp, Map::kBitFieldOffset),
1741 1 << Map::kIsUndetectable); 1766 1 << Map::kIsUndetectable);
1742 EmitBranch(true_block, false_block, not_zero); 1767 EmitBranch(true_block, false_block, not_zero);
1743 } 1768 }
1744 1769
1745 1770
1771 static Condition ComputeCompareCondition(Token::Value op) {
1772 switch (op) {
1773 case Token::EQ_STRICT:
1774 case Token::EQ:
1775 return equal;
1776 case Token::LT:
1777 return less;
1778 case Token::GT:
1779 return greater;
1780 case Token::LTE:
1781 return less_equal;
1782 case Token::GTE:
1783 return greater_equal;
1784 default:
1785 UNREACHABLE();
1786 return no_condition;
1787 }
1788 }
1789
1790
1791 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) {
1792 Token::Value op = instr->op();
1793 int true_block = chunk_->LookupDestination(instr->true_block_id());
1794 int false_block = chunk_->LookupDestination(instr->false_block_id());
1795
1796 Handle<Code> ic = CompareIC::GetUninitialized(op);
1797 CallCode(ic, RelocInfo::CODE_TARGET, instr);
1798
1799 Condition condition = ComputeCompareCondition(op);
1800 __ test(eax, Operand(eax));
1801
1802 EmitBranch(true_block, false_block, condition);
1803 }
1804
1805
1746 static InstanceType TestType(HHasInstanceTypeAndBranch* instr) { 1806 static InstanceType TestType(HHasInstanceTypeAndBranch* instr) {
1747 InstanceType from = instr->from(); 1807 InstanceType from = instr->from();
1748 InstanceType to = instr->to(); 1808 InstanceType to = instr->to();
1749 if (from == FIRST_TYPE) return to; 1809 if (from == FIRST_TYPE) return to;
1750 ASSERT(from == to || to == LAST_TYPE); 1810 ASSERT(from == to || to == LAST_TYPE);
1751 return from; 1811 return from;
1752 } 1812 }
1753 1813
1754 1814
1755 static Condition BranchCondition(HHasInstanceTypeAndBranch* instr) { 1815 static Condition BranchCondition(HHasInstanceTypeAndBranch* instr) {
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
2009 __ StoreToSafepointRegisterSlot(temp, temp); 2069 __ StoreToSafepointRegisterSlot(temp, temp);
2010 CallCodeGeneric(stub.GetCode(), 2070 CallCodeGeneric(stub.GetCode(),
2011 RelocInfo::CODE_TARGET, 2071 RelocInfo::CODE_TARGET,
2012 instr, 2072 instr,
2013 RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); 2073 RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
2014 // Put the result value into the eax slot and restore all registers. 2074 // Put the result value into the eax slot and restore all registers.
2015 __ StoreToSafepointRegisterSlot(eax, eax); 2075 __ StoreToSafepointRegisterSlot(eax, eax);
2016 } 2076 }
2017 2077
2018 2078
2019 static Condition ComputeCompareCondition(Token::Value op) {
2020 switch (op) {
2021 case Token::EQ_STRICT:
2022 case Token::EQ:
2023 return equal;
2024 case Token::LT:
2025 return less;
2026 case Token::GT:
2027 return greater;
2028 case Token::LTE:
2029 return less_equal;
2030 case Token::GTE:
2031 return greater_equal;
2032 default:
2033 UNREACHABLE();
2034 return no_condition;
2035 }
2036 }
2037
2038
2039 void LCodeGen::DoCmpT(LCmpT* instr) { 2079 void LCodeGen::DoCmpT(LCmpT* instr) {
2040 Token::Value op = instr->op(); 2080 Token::Value op = instr->op();
2041 2081
2042 Handle<Code> ic = CompareIC::GetUninitialized(op); 2082 Handle<Code> ic = CompareIC::GetUninitialized(op);
2043 CallCode(ic, RelocInfo::CODE_TARGET, instr); 2083 CallCode(ic, RelocInfo::CODE_TARGET, instr);
2044 2084
2045 Condition condition = ComputeCompareCondition(op); 2085 Condition condition = ComputeCompareCondition(op);
2046 Label true_value, done; 2086 Label true_value, done;
2047 __ test(eax, Operand(eax)); 2087 __ test(eax, Operand(eax));
2048 __ j(condition, &true_value, Label::kNear); 2088 __ j(condition, &true_value, Label::kNear);
(...skipping 2534 matching lines...) Expand 10 before | Expand all | Expand 10 after
4583 env->deoptimization_index()); 4623 env->deoptimization_index());
4584 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator); 4624 __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION, safepoint_generator);
4585 } 4625 }
4586 4626
4587 4627
4588 #undef __ 4628 #undef __
4589 4629
4590 } } // namespace v8::internal 4630 } } // namespace v8::internal
4591 4631
4592 #endif // V8_TARGET_ARCH_IA32 4632 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698