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 2216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2227 | 2227 |
2228 void LCodeGen::DoDebugBreak(LDebugBreak* instr) { | 2228 void LCodeGen::DoDebugBreak(LDebugBreak* instr) { |
2229 __ stop("LBreak"); | 2229 __ stop("LBreak"); |
2230 } | 2230 } |
2231 | 2231 |
2232 | 2232 |
2233 void LCodeGen::DoBranch(LBranch* instr) { | 2233 void LCodeGen::DoBranch(LBranch* instr) { |
2234 int true_block = chunk_->LookupDestination(instr->true_block_id()); | 2234 int true_block = chunk_->LookupDestination(instr->true_block_id()); |
2235 int false_block = chunk_->LookupDestination(instr->false_block_id()); | 2235 int false_block = chunk_->LookupDestination(instr->false_block_id()); |
2236 | 2236 |
| 2237 FOR_ASSERT(bool considered_typefeedback = false); |
2237 Representation r = instr->hydrogen()->value()->representation(); | 2238 Representation r = instr->hydrogen()->value()->representation(); |
2238 if (r.IsInteger32() || r.IsSmi()) { | 2239 if (r.IsInteger32() || r.IsSmi()) { |
2239 Register reg = ToRegister(instr->value()); | 2240 Register reg = ToRegister(instr->value()); |
2240 __ cmp(reg, Operand::Zero()); | 2241 __ cmp(reg, Operand::Zero()); |
2241 EmitBranch(true_block, false_block, ne); | 2242 EmitBranch(true_block, false_block, ne); |
2242 } else if (r.IsDouble()) { | 2243 } else if (r.IsDouble()) { |
2243 DwVfpRegister reg = ToDoubleRegister(instr->value()); | 2244 DwVfpRegister reg = ToDoubleRegister(instr->value()); |
2244 // Test the double value. Zero and NaN are false. | 2245 // Test the double value. Zero and NaN are false. |
2245 __ VFPCompareAndSetFlags(reg, 0.0); | 2246 __ VFPCompareAndSetFlags(reg, 0.0); |
2246 __ cmp(r0, r0, vs); // If NaN, set the Z flag. | 2247 __ cmp(r0, r0, vs); // If NaN, set the Z flag. |
2247 EmitBranch(true_block, false_block, ne); | 2248 EmitBranch(true_block, false_block, ne); |
2248 } else { | 2249 } else { |
2249 ASSERT(r.IsTagged()); | 2250 ASSERT(r.IsTagged()); |
2250 Register reg = ToRegister(instr->value()); | 2251 Register reg = ToRegister(instr->value()); |
2251 HType type = instr->hydrogen()->value()->type(); | 2252 HType type = instr->hydrogen()->value()->type(); |
2252 if (type.IsBoolean()) { | 2253 if (type.IsBoolean()) { |
2253 __ CompareRoot(reg, Heap::kTrueValueRootIndex); | 2254 __ CompareRoot(reg, Heap::kTrueValueRootIndex); |
2254 EmitBranch(true_block, false_block, eq); | 2255 EmitBranch(true_block, false_block, eq); |
2255 } else if (type.IsSmi()) { | 2256 } else if (type.IsSmi()) { |
2256 __ cmp(reg, Operand::Zero()); | 2257 __ cmp(reg, Operand::Zero()); |
2257 EmitBranch(true_block, false_block, ne); | 2258 EmitBranch(true_block, false_block, ne); |
2258 } else { | 2259 } else { |
2259 Label* true_label = chunk_->GetAssemblyLabel(true_block); | 2260 Label* true_label = chunk_->GetAssemblyLabel(true_block); |
2260 Label* false_label = chunk_->GetAssemblyLabel(false_block); | 2261 Label* false_label = chunk_->GetAssemblyLabel(false_block); |
2261 | 2262 |
| 2263 FOR_ASSERT(considered_typefeedback = true); |
2262 ToBooleanStub::Types expected = instr->hydrogen()->expected_input_types(); | 2264 ToBooleanStub::Types expected = instr->hydrogen()->expected_input_types(); |
2263 // Avoid deopts in the case where we've never executed this path before. | 2265 // Avoid deopts in the case where we've never executed this path before. |
2264 if (expected.IsEmpty()) expected = ToBooleanStub::all_types(); | 2266 if (expected.IsEmpty()) expected = ToBooleanStub::all_types(); |
2265 | 2267 |
2266 if (expected.Contains(ToBooleanStub::UNDEFINED)) { | 2268 if (expected.Contains(ToBooleanStub::UNDEFINED)) { |
2267 // undefined -> false. | 2269 // undefined -> false. |
2268 __ CompareRoot(reg, Heap::kUndefinedValueRootIndex); | 2270 __ CompareRoot(reg, Heap::kUndefinedValueRootIndex); |
2269 __ b(eq, false_label); | 2271 __ b(eq, false_label); |
2270 } | 2272 } |
2271 if (expected.Contains(ToBooleanStub::BOOLEAN)) { | 2273 if (expected.Contains(ToBooleanStub::BOOLEAN)) { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2339 __ cmp(r0, r0, vs); // NaN -> false. | 2341 __ cmp(r0, r0, vs); // NaN -> false. |
2340 __ b(eq, false_label); // +0, -0 -> false. | 2342 __ b(eq, false_label); // +0, -0 -> false. |
2341 __ b(true_label); | 2343 __ b(true_label); |
2342 __ bind(¬_heap_number); | 2344 __ bind(¬_heap_number); |
2343 } | 2345 } |
2344 | 2346 |
2345 // We've seen something for the first time -> deopt. | 2347 // We've seen something for the first time -> deopt. |
2346 DeoptimizeIf(al, instr->environment()); | 2348 DeoptimizeIf(al, instr->environment()); |
2347 } | 2349 } |
2348 } | 2350 } |
| 2351 // Make sure not to poison the stub cache. |
| 2352 ASSERT(info()->IsStub() ? considered_typefeedback : true); |
2349 } | 2353 } |
2350 | 2354 |
2351 | 2355 |
2352 void LCodeGen::EmitGoto(int block) { | 2356 void LCodeGen::EmitGoto(int block) { |
2353 if (!IsNextEmittedBlock(block)) { | 2357 if (!IsNextEmittedBlock(block)) { |
2354 __ jmp(chunk_->GetAssemblyLabel(chunk_->LookupDestination(block))); | 2358 __ jmp(chunk_->GetAssemblyLabel(chunk_->LookupDestination(block))); |
2355 } | 2359 } |
2356 } | 2360 } |
2357 | 2361 |
2358 | 2362 |
(...skipping 3620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5979 __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); | 5983 __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); |
5980 __ ldr(result, FieldMemOperand(scratch, | 5984 __ ldr(result, FieldMemOperand(scratch, |
5981 FixedArray::kHeaderSize - kPointerSize)); | 5985 FixedArray::kHeaderSize - kPointerSize)); |
5982 __ bind(&done); | 5986 __ bind(&done); |
5983 } | 5987 } |
5984 | 5988 |
5985 | 5989 |
5986 #undef __ | 5990 #undef __ |
5987 | 5991 |
5988 } } // namespace v8::internal | 5992 } } // namespace v8::internal |
OLD | NEW |