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

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

Issue 2452193003: [crankshaft] Support all oddballs for truncating TaggedToI changes. (Closed)
Patch Set: Created 4 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/crankshaft/arm/lithium-codegen-arm.h" 5 #include "src/crankshaft/arm/lithium-codegen-arm.h"
6 6
7 #include "src/base/bits.h" 7 #include "src/base/bits.h"
8 #include "src/code-factory.h" 8 #include "src/code-factory.h"
9 #include "src/code-stubs.h" 9 #include "src/code-stubs.h"
10 #include "src/crankshaft/arm/lithium-gap-resolver-arm.h" 10 #include "src/crankshaft/arm/lithium-gap-resolver-arm.h"
(...skipping 4520 matching lines...) Expand 10 before | Expand all | Expand 10 after
4531 // SmiUntag(heap_object, SetCC) 4531 // SmiUntag(heap_object, SetCC)
4532 STATIC_ASSERT(kHeapObjectTag == 1); 4532 STATIC_ASSERT(kHeapObjectTag == 1);
4533 __ adc(scratch2, input_reg, Operand(input_reg)); 4533 __ adc(scratch2, input_reg, Operand(input_reg));
4534 4534
4535 // Heap number map check. 4535 // Heap number map check.
4536 __ ldr(scratch1, FieldMemOperand(scratch2, HeapObject::kMapOffset)); 4536 __ ldr(scratch1, FieldMemOperand(scratch2, HeapObject::kMapOffset));
4537 __ LoadRoot(ip, Heap::kHeapNumberMapRootIndex); 4537 __ LoadRoot(ip, Heap::kHeapNumberMapRootIndex);
4538 __ cmp(scratch1, Operand(ip)); 4538 __ cmp(scratch1, Operand(ip));
4539 4539
4540 if (instr->truncating()) { 4540 if (instr->truncating()) {
4541 // Performs a truncating conversion of a floating point number as used by 4541 Label truncate;
4542 // the JS bitwise operations. 4542 __ b(eq, &truncate);
4543 Label no_heap_number, check_bools, check_false; 4543 __ CompareInstanceType(scratch1, scratch1, ODDBALL_TYPE);
4544 __ b(ne, &no_heap_number); 4544 DeoptimizeIf(ne, instr, DeoptimizeReason::kNotANumberOrOddball);
4545 __ bind(&truncate);
4545 __ TruncateHeapNumberToI(input_reg, scratch2); 4546 __ TruncateHeapNumberToI(input_reg, scratch2);
4546 __ b(&done);
4547
4548 // Check for Oddballs. Undefined/False is converted to zero and True to one
4549 // for truncating conversions.
4550 __ bind(&no_heap_number);
4551 __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
4552 __ cmp(scratch2, Operand(ip));
4553 __ b(ne, &check_bools);
4554 __ mov(input_reg, Operand::Zero());
4555 __ b(&done);
4556
4557 __ bind(&check_bools);
4558 __ LoadRoot(ip, Heap::kTrueValueRootIndex);
4559 __ cmp(scratch2, Operand(ip));
4560 __ b(ne, &check_false);
4561 __ mov(input_reg, Operand(1));
4562 __ b(&done);
4563
4564 __ bind(&check_false);
4565 __ LoadRoot(ip, Heap::kFalseValueRootIndex);
4566 __ cmp(scratch2, Operand(ip));
4567 DeoptimizeIf(ne, instr, DeoptimizeReason::kNotAHeapNumberUndefinedBoolean);
4568 __ mov(input_reg, Operand::Zero());
4569 } else { 4547 } else {
4570 DeoptimizeIf(ne, instr, DeoptimizeReason::kNotAHeapNumber); 4548 DeoptimizeIf(ne, instr, DeoptimizeReason::kNotAHeapNumber);
4571 4549
4572 __ sub(ip, scratch2, Operand(kHeapObjectTag)); 4550 __ sub(ip, scratch2, Operand(kHeapObjectTag));
4573 __ vldr(double_scratch2, ip, HeapNumber::kValueOffset); 4551 __ vldr(double_scratch2, ip, HeapNumber::kValueOffset);
4574 __ TryDoubleToInt32Exact(input_reg, double_scratch2, double_scratch); 4552 __ TryDoubleToInt32Exact(input_reg, double_scratch2, double_scratch);
4575 DeoptimizeIf(ne, instr, DeoptimizeReason::kLostPrecisionOrNaN); 4553 DeoptimizeIf(ne, instr, DeoptimizeReason::kLostPrecisionOrNaN);
4576 4554
4577 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) { 4555 if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
4578 __ cmp(input_reg, Operand::Zero()); 4556 __ cmp(input_reg, Operand::Zero());
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after
5406 __ ldr(result, FieldMemOperand(scratch, 5384 __ ldr(result, FieldMemOperand(scratch,
5407 FixedArray::kHeaderSize - kPointerSize)); 5385 FixedArray::kHeaderSize - kPointerSize));
5408 __ bind(deferred->exit()); 5386 __ bind(deferred->exit());
5409 __ bind(&done); 5387 __ bind(&done);
5410 } 5388 }
5411 5389
5412 #undef __ 5390 #undef __
5413 5391
5414 } // namespace internal 5392 } // namespace internal
5415 } // namespace v8 5393 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/effect-control-linearizer.cc ('k') | src/crankshaft/arm64/lithium-codegen-arm64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698