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

Side by Side Diff: src/code-stubs.cc

Issue 1881003002: [stubs] Introduce LeftShift, SignedRightShift and UnsignedRightShift stubs. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 8 months 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/code-stubs.h ('k') | src/interpreter/interpreter.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/code-stubs.h" 5 #include "src/code-stubs.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/bootstrapper.h" 9 #include "src/bootstrapper.h"
10 #include "src/code-factory.h" 10 #include "src/code-factory.h"
(...skipping 1524 matching lines...) Expand 10 before | Expand all | Expand 10 after
1535 1535
1536 assembler->Bind(&do_fmod); 1536 assembler->Bind(&do_fmod);
1537 { 1537 {
1538 Node* value = assembler->Float64Mod(var_dividend_float64.value(), 1538 Node* value = assembler->Float64Mod(var_dividend_float64.value(),
1539 var_divisor_float64.value()); 1539 var_divisor_float64.value());
1540 Node* result = assembler->ChangeFloat64ToTagged(value); 1540 Node* result = assembler->ChangeFloat64ToTagged(value);
1541 assembler->Return(result); 1541 assembler->Return(result);
1542 } 1542 }
1543 } 1543 }
1544 1544
1545 void LeftShiftStub::GenerateAssembly(
1546 compiler::CodeStubAssembler* assembler) const {
1547 using compiler::Node;
1548
1549 Node* lhs = assembler->Parameter(0);
1550 Node* rhs = assembler->Parameter(1);
1551 Node* context = assembler->Parameter(2);
1552 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1553 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1554 Node* shift_count =
1555 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f));
1556 Node* value = assembler->Word32Shl(lhs_value, shift_count);
1557 Node* result = assembler->ChangeInt32ToTagged(value);
1558 assembler->Return(result);
1559 }
1560
1561 void SignedRightShiftStub::GenerateAssembly(
1562 compiler::CodeStubAssembler* assembler) const {
1563 using compiler::Node;
1564
1565 Node* lhs = assembler->Parameter(0);
1566 Node* rhs = assembler->Parameter(1);
1567 Node* context = assembler->Parameter(2);
1568 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1569 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1570 Node* shift_count =
1571 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f));
1572 Node* value = assembler->Word32Sar(lhs_value, shift_count);
1573 Node* result = assembler->ChangeInt32ToTagged(value);
1574 assembler->Return(result);
1575 }
1576
1577 void UnsignedRightShiftStub::GenerateAssembly(
1578 compiler::CodeStubAssembler* assembler) const {
1579 using compiler::Node;
1580 typedef compiler::CodeStubAssembler::Label Label;
1581
1582 Node* lhs = assembler->Parameter(0);
1583 Node* rhs = assembler->Parameter(1);
1584 Node* context = assembler->Parameter(2);
1585 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1586 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1587 Node* shift_count =
1588 assembler->Word32And(rhs_value, assembler->Int32Constant(0x1f));
1589 Node* value = assembler->Word32Shr(lhs_value, shift_count);
1590
1591 Label if_smi_overflow(assembler, Label::kDeferred),
Benedikt Meurer 2016/04/12 12:55:20 Nit: Can you wrap this into ChangeUint32ToTagged?
epertoso 2016/04/12 15:10:16 Sure.
1592 if_not_smi_overflow(assembler);
1593 // If the sign bit on {value} is set, we always need a heap number to
1594 // represent the unsigned value. This is sufficient for both 32 and 31 bit
1595 // Smis, as ChangeInt32ToTagged will allocate a HeapNumber for us when tagging
1596 // the Smi causes an 32-bit integer overflow.
1597 assembler->Branch(
1598 assembler->Int32LessThan(value, assembler->Int32Constant(0)),
1599 &if_smi_overflow, &if_not_smi_overflow);
1600
1601 assembler->Bind(&if_not_smi_overflow);
1602 {
1603 Node* result = assembler->ChangeInt32ToTagged(value);
1604 assembler->Return(result);
1605 }
1606
1607 assembler->Bind(&if_smi_overflow);
1608 {
1609 Node* float64_value = assembler->ChangeUint32ToFloat64(value);
1610 Node* result = assembler->AllocateHeapNumberWithValue(float64_value);
1611 assembler->Return(result);
1612 }
1613 }
1614
1545 void BitwiseOrStub::GenerateAssembly( 1615 void BitwiseOrStub::GenerateAssembly(
1546 compiler::CodeStubAssembler* assembler) const { 1616 compiler::CodeStubAssembler* assembler) const {
1547 using compiler::Node; 1617 using compiler::Node;
1548 1618
1549 Node* lhs = assembler->Parameter(0); 1619 Node* lhs = assembler->Parameter(0);
1550 Node* rhs = assembler->Parameter(1); 1620 Node* rhs = assembler->Parameter(1);
1551 Node* context = assembler->Parameter(2); 1621 Node* context = assembler->Parameter(2);
1552 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs); 1622 Node* lhs_value = assembler->TruncateTaggedToWord32(context, lhs);
1553 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs); 1623 Node* rhs_value = assembler->TruncateTaggedToWord32(context, rhs);
1554 Node* value = assembler->Word32Or(lhs_value, rhs_value); 1624 Node* value = assembler->Word32Or(lhs_value, rhs_value);
(...skipping 2456 matching lines...) Expand 10 before | Expand all | Expand 10 after
4011 if (type->Is(Type::UntaggedPointer())) { 4081 if (type->Is(Type::UntaggedPointer())) {
4012 return Representation::External(); 4082 return Representation::External();
4013 } 4083 }
4014 4084
4015 DCHECK(!type->Is(Type::Untagged())); 4085 DCHECK(!type->Is(Type::Untagged()));
4016 return Representation::Tagged(); 4086 return Representation::Tagged();
4017 } 4087 }
4018 4088
4019 } // namespace internal 4089 } // namespace internal
4020 } // namespace v8 4090 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stubs.h ('k') | src/interpreter/interpreter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698