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

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

Issue 8373029: [hydrogen] optimize switch with string clauses (Closed) Base URL: gh:v8/v8@master
Patch Set: fix lint errors, improved test 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
« no previous file with comments | « src/arm/lithium-codegen-arm.h ('k') | src/ast.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1794 matching lines...) Expand 10 before | Expand all | Expand 10 after
1805 Label* true_label = chunk_->GetAssemblyLabel(true_block); 1805 Label* true_label = chunk_->GetAssemblyLabel(true_block);
1806 Label* false_label = chunk_->GetAssemblyLabel(false_block); 1806 Label* false_label = chunk_->GetAssemblyLabel(false_block);
1807 1807
1808 Condition true_cond = 1808 Condition true_cond =
1809 EmitIsObject(reg, temp1, false_label, true_label); 1809 EmitIsObject(reg, temp1, false_label, true_label);
1810 1810
1811 EmitBranch(true_block, false_block, true_cond); 1811 EmitBranch(true_block, false_block, true_cond);
1812 } 1812 }
1813 1813
1814 1814
1815 Condition LCodeGen::EmitIsString(Register input,
1816 Register temp1,
1817 Label* is_not_string) {
1818 __ JumpIfSmi(input, is_not_string);
1819 __ CompareObjectType(input, temp1, temp1, FIRST_NONSTRING_TYPE);
1820
1821 return lt;
1822 }
1823
1824
1825 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) {
1826 Register reg = ToRegister(instr->InputAt(0));
1827 Register temp1 = ToRegister(instr->TempAt(0));
1828
1829 int true_block = chunk_->LookupDestination(instr->true_block_id());
1830 int false_block = chunk_->LookupDestination(instr->false_block_id());
1831 Label* false_label = chunk_->GetAssemblyLabel(false_block);
1832
1833 Condition true_cond =
1834 EmitIsString(reg, temp1, false_label);
1835
1836 EmitBranch(true_block, false_block, true_cond);
1837 }
1838
1839
1815 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { 1840 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
1816 int true_block = chunk_->LookupDestination(instr->true_block_id()); 1841 int true_block = chunk_->LookupDestination(instr->true_block_id());
1817 int false_block = chunk_->LookupDestination(instr->false_block_id()); 1842 int false_block = chunk_->LookupDestination(instr->false_block_id());
1818 1843
1819 Register input_reg = EmitLoadRegister(instr->InputAt(0), ip); 1844 Register input_reg = EmitLoadRegister(instr->InputAt(0), ip);
1820 __ tst(input_reg, Operand(kSmiTagMask)); 1845 __ tst(input_reg, Operand(kSmiTagMask));
1821 EmitBranch(true_block, false_block, eq); 1846 EmitBranch(true_block, false_block, eq);
1822 } 1847 }
1823 1848
1824 1849
1825 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { 1850 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) {
1826 Register input = ToRegister(instr->InputAt(0)); 1851 Register input = ToRegister(instr->InputAt(0));
1827 Register temp = ToRegister(instr->TempAt(0)); 1852 Register temp = ToRegister(instr->TempAt(0));
1828 1853
1829 int true_block = chunk_->LookupDestination(instr->true_block_id()); 1854 int true_block = chunk_->LookupDestination(instr->true_block_id());
1830 int false_block = chunk_->LookupDestination(instr->false_block_id()); 1855 int false_block = chunk_->LookupDestination(instr->false_block_id());
1831 1856
1832 __ JumpIfSmi(input, chunk_->GetAssemblyLabel(false_block)); 1857 __ JumpIfSmi(input, chunk_->GetAssemblyLabel(false_block));
1833 __ ldr(temp, FieldMemOperand(input, HeapObject::kMapOffset)); 1858 __ ldr(temp, FieldMemOperand(input, HeapObject::kMapOffset));
1834 __ ldrb(temp, FieldMemOperand(temp, Map::kBitFieldOffset)); 1859 __ ldrb(temp, FieldMemOperand(temp, Map::kBitFieldOffset));
1835 __ tst(temp, Operand(1 << Map::kIsUndetectable)); 1860 __ tst(temp, Operand(1 << Map::kIsUndetectable));
1836 EmitBranch(true_block, false_block, ne); 1861 EmitBranch(true_block, false_block, ne);
1837 } 1862 }
1838 1863
1839 1864
1865 static Condition ComputeCompareCondition(Token::Value op) {
1866 switch (op) {
1867 case Token::EQ_STRICT:
1868 case Token::EQ:
1869 return eq;
1870 case Token::LT:
1871 return lt;
1872 case Token::GT:
1873 return gt;
1874 case Token::LTE:
1875 return le;
1876 case Token::GTE:
1877 return ge;
1878 default:
1879 UNREACHABLE();
1880 return kNoCondition;
1881 }
1882 }
1883
1884
1885 void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) {
1886 Token::Value op = instr->op();
1887 int true_block = chunk_->LookupDestination(instr->true_block_id());
1888 int false_block = chunk_->LookupDestination(instr->false_block_id());
1889
1890 Handle<Code> ic = CompareIC::GetUninitialized(op);
1891 CallCode(ic, RelocInfo::CODE_TARGET, instr);
1892 __ cmp(r0, Operand(0)); // This instruction also signals no smi code inlined.
1893
1894 Condition condition = ComputeCompareCondition(op);
1895
1896 EmitBranch(true_block, false_block, condition);
1897 }
1898
1899
1840 static InstanceType TestType(HHasInstanceTypeAndBranch* instr) { 1900 static InstanceType TestType(HHasInstanceTypeAndBranch* instr) {
1841 InstanceType from = instr->from(); 1901 InstanceType from = instr->from();
1842 InstanceType to = instr->to(); 1902 InstanceType to = instr->to();
1843 if (from == FIRST_TYPE) return to; 1903 if (from == FIRST_TYPE) return to;
1844 ASSERT(from == to || to == LAST_TYPE); 1904 ASSERT(from == to || to == LAST_TYPE);
1845 return from; 1905 return from;
1846 } 1906 }
1847 1907
1848 1908
1849 static Condition BranchCondition(HHasInstanceTypeAndBranch* instr) { 1909 static Condition BranchCondition(HHasInstanceTypeAndBranch* instr) {
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
2118 RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); 2178 RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS);
2119 ASSERT(instr->HasDeoptimizationEnvironment()); 2179 ASSERT(instr->HasDeoptimizationEnvironment());
2120 LEnvironment* env = instr->deoptimization_environment(); 2180 LEnvironment* env = instr->deoptimization_environment();
2121 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index()); 2181 safepoints_.RecordLazyDeoptimizationIndex(env->deoptimization_index());
2122 // Put the result value into the result register slot and 2182 // Put the result value into the result register slot and
2123 // restore all registers. 2183 // restore all registers.
2124 __ StoreToSafepointRegisterSlot(result, result); 2184 __ StoreToSafepointRegisterSlot(result, result);
2125 } 2185 }
2126 2186
2127 2187
2128 static Condition ComputeCompareCondition(Token::Value op) {
2129 switch (op) {
2130 case Token::EQ_STRICT:
2131 case Token::EQ:
2132 return eq;
2133 case Token::LT:
2134 return lt;
2135 case Token::GT:
2136 return gt;
2137 case Token::LTE:
2138 return le;
2139 case Token::GTE:
2140 return ge;
2141 default:
2142 UNREACHABLE();
2143 return kNoCondition;
2144 }
2145 }
2146
2147
2148 void LCodeGen::DoCmpT(LCmpT* instr) { 2188 void LCodeGen::DoCmpT(LCmpT* instr) {
2149 Token::Value op = instr->op(); 2189 Token::Value op = instr->op();
2150 2190
2151 Handle<Code> ic = CompareIC::GetUninitialized(op); 2191 Handle<Code> ic = CompareIC::GetUninitialized(op);
2152 CallCode(ic, RelocInfo::CODE_TARGET, instr); 2192 CallCode(ic, RelocInfo::CODE_TARGET, instr);
2153 __ cmp(r0, Operand(0)); // This instruction also signals no smi code inlined. 2193 __ cmp(r0, Operand(0)); // This instruction also signals no smi code inlined.
2154 2194
2155 Condition condition = ComputeCompareCondition(op); 2195 Condition condition = ComputeCompareCondition(op);
2156 __ LoadRoot(ToRegister(instr->result()), 2196 __ LoadRoot(ToRegister(instr->result()),
2157 Heap::kTrueValueRootIndex, 2197 Heap::kTrueValueRootIndex,
(...skipping 2484 matching lines...) Expand 10 before | Expand all | Expand 10 after
4642 ASSERT(osr_pc_offset_ == -1); 4682 ASSERT(osr_pc_offset_ == -1);
4643 osr_pc_offset_ = masm()->pc_offset(); 4683 osr_pc_offset_ = masm()->pc_offset();
4644 } 4684 }
4645 4685
4646 4686
4647 4687
4648 4688
4649 #undef __ 4689 #undef __
4650 4690
4651 } } // namespace v8::internal 4691 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm/lithium-codegen-arm.h ('k') | src/ast.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698