OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 2165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2176 | 2176 |
2177 BinaryOpStub stub(instr->op(), NO_OVERWRITE); | 2177 BinaryOpStub stub(instr->op(), NO_OVERWRITE); |
2178 // Block literal pool emission to ensure nop indicating no inlined smi code | 2178 // Block literal pool emission to ensure nop indicating no inlined smi code |
2179 // is in the correct position. | 2179 // is in the correct position. |
2180 Assembler::BlockConstPoolScope block_const_pool(masm()); | 2180 Assembler::BlockConstPoolScope block_const_pool(masm()); |
2181 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 2181 CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); |
2182 __ nop(); // Signals no inlined code. | 2182 __ nop(); // Signals no inlined code. |
2183 } | 2183 } |
2184 | 2184 |
2185 | 2185 |
2186 int LCodeGen::GetNextEmittedBlock(int block) { | 2186 int LCodeGen::GetNextEmittedBlock() { |
2187 for (int i = block + 1; i < graph()->blocks()->length(); ++i) { | 2187 for (int i = current_block_ + 1; i < graph()->blocks()->length(); ++i) { |
2188 LLabel* label = chunk_->GetLabel(i); | 2188 if (!chunk_->GetLabel(i)->HasReplacement()) return i; |
2189 if (!label->HasReplacement()) return i; | |
2190 } | 2189 } |
2191 return -1; | 2190 return -1; |
2192 } | 2191 } |
2193 | 2192 |
2194 | 2193 |
2195 void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) { | 2194 void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) { |
2196 int next_block = GetNextEmittedBlock(current_block_); | 2195 int next_block = GetNextEmittedBlock(); |
2197 right_block = chunk_->LookupDestination(right_block); | 2196 right_block = chunk_->LookupDestination(right_block); |
2198 left_block = chunk_->LookupDestination(left_block); | 2197 left_block = chunk_->LookupDestination(left_block); |
2199 | 2198 |
2200 if (right_block == left_block) { | 2199 if (right_block == left_block) { |
2201 EmitGoto(left_block); | 2200 EmitGoto(left_block); |
2202 } else if (left_block == next_block) { | 2201 } else if (left_block == next_block) { |
2203 __ b(NegateCondition(cc), chunk_->GetAssemblyLabel(right_block)); | 2202 __ b(NegateCondition(cc), chunk_->GetAssemblyLabel(right_block)); |
2204 } else if (right_block == next_block) { | 2203 } else if (right_block == next_block) { |
2205 __ b(cc, chunk_->GetAssemblyLabel(left_block)); | 2204 __ b(cc, chunk_->GetAssemblyLabel(left_block)); |
2206 } else { | 2205 } else { |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2323 } | 2322 } |
2324 | 2323 |
2325 // We've seen something for the first time -> deopt. | 2324 // We've seen something for the first time -> deopt. |
2326 DeoptimizeIf(al, instr->environment()); | 2325 DeoptimizeIf(al, instr->environment()); |
2327 } | 2326 } |
2328 } | 2327 } |
2329 } | 2328 } |
2330 | 2329 |
2331 | 2330 |
2332 void LCodeGen::EmitGoto(int block) { | 2331 void LCodeGen::EmitGoto(int block) { |
2333 block = chunk_->LookupDestination(block); | 2332 int destination = chunk_->LookupDestination(block); |
2334 int next_block = GetNextEmittedBlock(current_block_); | 2333 if (destination != GetNextEmittedBlock()) { |
2335 if (block != next_block) { | 2334 __ jmp(chunk_->GetAssemblyLabel(destination)); |
2336 __ jmp(chunk_->GetAssemblyLabel(block)); | |
2337 } | 2335 } |
2338 } | 2336 } |
2339 | 2337 |
2340 | 2338 |
2341 void LCodeGen::DoGoto(LGoto* instr) { | 2339 void LCodeGen::DoGoto(LGoto* instr) { |
2342 EmitGoto(instr->block_id()); | 2340 EmitGoto(instr->block_id()); |
2343 } | 2341 } |
2344 | 2342 |
2345 | 2343 |
2346 Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) { | 2344 Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) { |
(...skipping 3661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6008 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); | 6006 __ sub(scratch, result, Operand(index, LSL, kPointerSizeLog2 - kSmiTagSize)); |
6009 __ ldr(result, FieldMemOperand(scratch, | 6007 __ ldr(result, FieldMemOperand(scratch, |
6010 FixedArray::kHeaderSize - kPointerSize)); | 6008 FixedArray::kHeaderSize - kPointerSize)); |
6011 __ bind(&done); | 6009 __ bind(&done); |
6012 } | 6010 } |
6013 | 6011 |
6014 | 6012 |
6015 #undef __ | 6013 #undef __ |
6016 | 6014 |
6017 } } // namespace v8::internal | 6015 } } // namespace v8::internal |
OLD | NEW |