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

Side by Side Diff: src/crankshaft/mips64/lithium-codegen-mips64.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
« no previous file with comments | « src/crankshaft/mips/lithium-codegen-mips.cc ('k') | src/crankshaft/x64/lithium-codegen-x64.cc » ('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 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/mips64/lithium-codegen-mips64.h" 5 #include "src/crankshaft/mips64/lithium-codegen-mips64.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/crankshaft/hydrogen-osr.h" 9 #include "src/crankshaft/hydrogen-osr.h"
10 #include "src/crankshaft/mips64/lithium-gap-resolver-mips64.h" 10 #include "src/crankshaft/mips64/lithium-gap-resolver-mips64.h"
(...skipping 4677 matching lines...) Expand 10 before | Expand all | Expand 10 after
4688 Label done; 4688 Label done;
4689 4689
4690 // The input is a tagged HeapObject. 4690 // The input is a tagged HeapObject.
4691 // Heap number map check. 4691 // Heap number map check.
4692 __ ld(scratch1, FieldMemOperand(input_reg, HeapObject::kMapOffset)); 4692 __ ld(scratch1, FieldMemOperand(input_reg, HeapObject::kMapOffset));
4693 __ LoadRoot(at, Heap::kHeapNumberMapRootIndex); 4693 __ LoadRoot(at, Heap::kHeapNumberMapRootIndex);
4694 // This 'at' value and scratch1 map value are used for tests in both clauses 4694 // This 'at' value and scratch1 map value are used for tests in both clauses
4695 // of the if. 4695 // of the if.
4696 4696
4697 if (instr->truncating()) { 4697 if (instr->truncating()) {
4698 // Performs a truncating conversion of a floating point number as used by 4698 Label truncate;
4699 // the JS bitwise operations. 4699 __ Branch(USE_DELAY_SLOT, &truncate, eq, scratch1, Operand(at));
4700 Label no_heap_number, check_bools, check_false;
4701 // Check HeapNumber map.
4702 __ Branch(USE_DELAY_SLOT, &no_heap_number, ne, scratch1, Operand(at));
4703 __ mov(scratch2, input_reg); // In delay slot. 4700 __ mov(scratch2, input_reg); // In delay slot.
4701 __ lbu(scratch1, FieldMemOperand(scratch1, Map::kInstanceTypeOffset));
4702 DeoptimizeIf(ne, instr, DeoptimizeReason::kNotANumberOrOddball, scratch1,
4703 Operand(ODDBALL_TYPE));
4704 __ bind(&truncate);
4704 __ TruncateHeapNumberToI(input_reg, scratch2); 4705 __ TruncateHeapNumberToI(input_reg, scratch2);
4705 __ Branch(&done);
4706
4707 // Check for Oddballs. Undefined/False is converted to zero and True to one
4708 // for truncating conversions.
4709 __ bind(&no_heap_number);
4710 __ LoadRoot(at, Heap::kUndefinedValueRootIndex);
4711 __ Branch(&check_bools, ne, input_reg, Operand(at));
4712 DCHECK(ToRegister(instr->result()).is(input_reg));
4713 __ Branch(USE_DELAY_SLOT, &done);
4714 __ mov(input_reg, zero_reg); // In delay slot.
4715
4716 __ bind(&check_bools);
4717 __ LoadRoot(at, Heap::kTrueValueRootIndex);
4718 __ Branch(&check_false, ne, scratch2, Operand(at));
4719 __ Branch(USE_DELAY_SLOT, &done);
4720 __ li(input_reg, Operand(1)); // In delay slot.
4721
4722 __ bind(&check_false);
4723 __ LoadRoot(at, Heap::kFalseValueRootIndex);
4724 DeoptimizeIf(ne, instr, DeoptimizeReason::kNotAHeapNumberUndefinedBoolean,
4725 scratch2, Operand(at));
4726 __ Branch(USE_DELAY_SLOT, &done);
4727 __ mov(input_reg, zero_reg); // In delay slot.
4728 } else { 4706 } else {
4729 DeoptimizeIf(ne, instr, DeoptimizeReason::kNotAHeapNumber, scratch1, 4707 DeoptimizeIf(ne, instr, DeoptimizeReason::kNotAHeapNumber, scratch1,
4730 Operand(at)); 4708 Operand(at));
4731 4709
4732 // Load the double value. 4710 // Load the double value.
4733 __ ldc1(double_scratch, 4711 __ ldc1(double_scratch,
4734 FieldMemOperand(input_reg, HeapNumber::kValueOffset)); 4712 FieldMemOperand(input_reg, HeapNumber::kValueOffset));
4735 4713
4736 Register except_flag = scratch2; 4714 Register except_flag = scratch2;
4737 __ EmitFPUTruncate(kRoundToZero, 4715 __ EmitFPUTruncate(kRoundToZero,
(...skipping 888 matching lines...) Expand 10 before | Expand all | Expand 10 after
5626 __ ld(result, FieldMemOperand(scratch, 5604 __ ld(result, FieldMemOperand(scratch,
5627 FixedArray::kHeaderSize - kPointerSize)); 5605 FixedArray::kHeaderSize - kPointerSize));
5628 __ bind(deferred->exit()); 5606 __ bind(deferred->exit());
5629 __ bind(&done); 5607 __ bind(&done);
5630 } 5608 }
5631 5609
5632 #undef __ 5610 #undef __
5633 5611
5634 } // namespace internal 5612 } // namespace internal
5635 } // namespace v8 5613 } // namespace v8
OLDNEW
« no previous file with comments | « src/crankshaft/mips/lithium-codegen-mips.cc ('k') | src/crankshaft/x64/lithium-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698