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

Side by Side Diff: src/objects.cc

Issue 1695743003: [builtins] Support SameValue and SameValueZero via runtime functions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Address bug in SameValue and SameValueZero for SIMD types. Created 4 years, 10 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/js/v8natives.js ('k') | src/runtime/runtime.h » ('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 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 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/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 1478 matching lines...) Expand 10 before | Expand all | Expand 10 after
1489 // SameValue(NaN, NaN) is true. 1489 // SameValue(NaN, NaN) is true.
1490 if (this_value != other_value) { 1490 if (this_value != other_value) {
1491 return std::isnan(this_value) && std::isnan(other_value); 1491 return std::isnan(this_value) && std::isnan(other_value);
1492 } 1492 }
1493 // SameValue(0.0, -0.0) is false. 1493 // SameValue(0.0, -0.0) is false.
1494 return (std::signbit(this_value) == std::signbit(other_value)); 1494 return (std::signbit(this_value) == std::signbit(other_value));
1495 } 1495 }
1496 if (IsString() && other->IsString()) { 1496 if (IsString() && other->IsString()) {
1497 return String::cast(this)->Equals(String::cast(other)); 1497 return String::cast(this)->Equals(String::cast(other));
1498 } 1498 }
1499 if (IsSimd128Value() && other->IsSimd128Value()) { 1499 if (IsFloat32x4() && other->IsFloat32x4()) {
1500 if (IsFloat32x4() && other->IsFloat32x4()) { 1500 Float32x4* a = Float32x4::cast(this);
1501 Float32x4* a = Float32x4::cast(this); 1501 Float32x4* b = Float32x4::cast(other);
1502 Float32x4* b = Float32x4::cast(other); 1502 for (int i = 0; i < 4; i++) {
1503 for (int i = 0; i < 4; i++) { 1503 float x = a->get_lane(i);
1504 float x = a->get_lane(i); 1504 float y = b->get_lane(i);
1505 float y = b->get_lane(i); 1505 // Implements the ES5 SameValue operation for floating point types.
1506 // Implements the ES5 SameValue operation for floating point types. 1506 // http://www.ecma-international.org/ecma-262/6.0/#sec-samevalue
1507 // http://www.ecma-international.org/ecma-262/6.0/#sec-samevalue 1507 if (x != y && !(std::isnan(x) && std::isnan(y))) return false;
1508 if (x != y && !(std::isnan(x) && std::isnan(y))) return false; 1508 if (std::signbit(x) != std::signbit(y)) return false;
1509 if (std::signbit(x) != std::signbit(y)) return false;
1510 }
1511 return true;
1512 } else {
1513 Simd128Value* a = Simd128Value::cast(this);
1514 Simd128Value* b = Simd128Value::cast(other);
1515 return a->map()->instance_type() == b->map()->instance_type() &&
1516 a->BitwiseEquals(b);
1517 } 1509 }
1510 return true;
1511 } else if (IsSimd128Value() && other->IsSimd128Value()) {
1512 Simd128Value* a = Simd128Value::cast(this);
1513 Simd128Value* b = Simd128Value::cast(other);
1514 return a->map() == b->map() && a->BitwiseEquals(b);
1518 } 1515 }
1519 return false; 1516 return false;
1520 } 1517 }
1521 1518
1522 1519
1523 bool Object::SameValueZero(Object* other) { 1520 bool Object::SameValueZero(Object* other) {
1524 if (other == this) return true; 1521 if (other == this) return true;
1525 1522
1526 // The object is either a number, a name, an odd-ball, 1523 // The object is either a number, a name, an odd-ball,
1527 // a real JS object, or a Harmony proxy. 1524 // a real JS object, or a Harmony proxy.
1528 if (IsNumber() && other->IsNumber()) { 1525 if (IsNumber() && other->IsNumber()) {
1529 double this_value = Number(); 1526 double this_value = Number();
1530 double other_value = other->Number(); 1527 double other_value = other->Number();
1531 // +0 == -0 is true 1528 // +0 == -0 is true
1532 return this_value == other_value || 1529 return this_value == other_value ||
1533 (std::isnan(this_value) && std::isnan(other_value)); 1530 (std::isnan(this_value) && std::isnan(other_value));
1534 } 1531 }
1535 if (IsString() && other->IsString()) { 1532 if (IsString() && other->IsString()) {
1536 return String::cast(this)->Equals(String::cast(other)); 1533 return String::cast(this)->Equals(String::cast(other));
1537 } 1534 }
1538 if (IsSimd128Value() && other->IsSimd128Value()) { 1535 if (IsFloat32x4() && other->IsFloat32x4()) {
1539 if (IsFloat32x4() && other->IsFloat32x4()) { 1536 Float32x4* a = Float32x4::cast(this);
1540 Float32x4* a = Float32x4::cast(this); 1537 Float32x4* b = Float32x4::cast(other);
1541 Float32x4* b = Float32x4::cast(other); 1538 for (int i = 0; i < 4; i++) {
1542 for (int i = 0; i < 4; i++) { 1539 float x = a->get_lane(i);
1543 float x = a->get_lane(i); 1540 float y = b->get_lane(i);
1544 float y = b->get_lane(i); 1541 // Implements the ES6 SameValueZero operation for floating point types.
1545 // Implements the ES6 SameValueZero operation for floating point types. 1542 // http://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero
1546 // http://www.ecma-international.org/ecma-262/6.0/#sec-samevaluezero 1543 if (x != y && !(std::isnan(x) && std::isnan(y))) return false;
1547 if (x != y && !(std::isnan(x) && std::isnan(y))) return false; 1544 // SameValueZero doesn't distinguish between 0 and -0.
1548 // SameValueZero doesn't distinguish between 0 and -0.
1549 }
1550 return true;
1551 } else {
1552 Simd128Value* a = Simd128Value::cast(this);
1553 Simd128Value* b = Simd128Value::cast(other);
1554 return a->map()->instance_type() == b->map()->instance_type() &&
1555 a->BitwiseEquals(b);
1556 } 1545 }
1546 return true;
1547 } else if (IsSimd128Value() && other->IsSimd128Value()) {
1548 Simd128Value* a = Simd128Value::cast(this);
1549 Simd128Value* b = Simd128Value::cast(other);
1550 return a->map() == b->map() && a->BitwiseEquals(b);
1557 } 1551 }
1558 return false; 1552 return false;
1559 } 1553 }
1560 1554
1561 1555
1562 MaybeHandle<Object> Object::ArraySpeciesConstructor( 1556 MaybeHandle<Object> Object::ArraySpeciesConstructor(
1563 Isolate* isolate, Handle<Object> original_array) { 1557 Isolate* isolate, Handle<Object> original_array) {
1564 Handle<Context> native_context = isolate->native_context(); 1558 Handle<Context> native_context = isolate->native_context();
1565 if (!FLAG_harmony_species) { 1559 if (!FLAG_harmony_species) {
1566 return Handle<Object>(native_context->array_function(), isolate); 1560 return Handle<Object>(native_context->array_function(), isolate);
(...skipping 18355 matching lines...) Expand 10 before | Expand all | Expand 10 after
19922 if (cell->value() != *new_value) { 19916 if (cell->value() != *new_value) {
19923 cell->set_value(*new_value); 19917 cell->set_value(*new_value);
19924 Isolate* isolate = cell->GetIsolate(); 19918 Isolate* isolate = cell->GetIsolate();
19925 cell->dependent_code()->DeoptimizeDependentCodeGroup( 19919 cell->dependent_code()->DeoptimizeDependentCodeGroup(
19926 isolate, DependentCode::kPropertyCellChangedGroup); 19920 isolate, DependentCode::kPropertyCellChangedGroup);
19927 } 19921 }
19928 } 19922 }
19929 19923
19930 } // namespace internal 19924 } // namespace internal
19931 } // namespace v8 19925 } // namespace v8
OLDNEW
« no previous file with comments | « src/js/v8natives.js ('k') | src/runtime/runtime.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698