| OLD | NEW |
| 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 #if V8_TARGET_ARCH_X87 | 5 #if V8_TARGET_ARCH_X87 |
| 6 | 6 |
| 7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 1359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1370 | 1370 |
| 1371 // Test for NaN. Compare heap numbers in a general way, | 1371 // Test for NaN. Compare heap numbers in a general way, |
| 1372 // to handle NaNs correctly. | 1372 // to handle NaNs correctly. |
| 1373 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), | 1373 __ cmp(FieldOperand(edx, HeapObject::kMapOffset), |
| 1374 Immediate(isolate()->factory()->heap_number_map())); | 1374 Immediate(isolate()->factory()->heap_number_map())); |
| 1375 __ j(equal, &generic_heap_number_comparison, Label::kNear); | 1375 __ j(equal, &generic_heap_number_comparison, Label::kNear); |
| 1376 if (cc != equal) { | 1376 if (cc != equal) { |
| 1377 __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); | 1377 __ mov(ecx, FieldOperand(eax, HeapObject::kMapOffset)); |
| 1378 __ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset)); | 1378 __ movzx_b(ecx, FieldOperand(ecx, Map::kInstanceTypeOffset)); |
| 1379 // Call runtime on identical JSObjects. Otherwise return equal. | 1379 // Call runtime on identical JSObjects. Otherwise return equal. |
| 1380 __ cmpb(ecx, static_cast<uint8_t>(FIRST_SPEC_OBJECT_TYPE)); | 1380 __ cmpb(ecx, static_cast<uint8_t>(FIRST_JS_RECEIVER_TYPE)); |
| 1381 __ j(above_equal, &runtime_call, Label::kFar); | 1381 __ j(above_equal, &runtime_call, Label::kFar); |
| 1382 // Call runtime on identical symbols since we need to throw a TypeError. | 1382 // Call runtime on identical symbols since we need to throw a TypeError. |
| 1383 __ cmpb(ecx, static_cast<uint8_t>(SYMBOL_TYPE)); | 1383 __ cmpb(ecx, static_cast<uint8_t>(SYMBOL_TYPE)); |
| 1384 __ j(equal, &runtime_call, Label::kFar); | 1384 __ j(equal, &runtime_call, Label::kFar); |
| 1385 // Call runtime on identical SIMD values since we must throw a TypeError. | 1385 // Call runtime on identical SIMD values since we must throw a TypeError. |
| 1386 __ cmpb(ecx, static_cast<uint8_t>(SIMD128_VALUE_TYPE)); | 1386 __ cmpb(ecx, static_cast<uint8_t>(SIMD128_VALUE_TYPE)); |
| 1387 __ j(equal, &runtime_call, Label::kFar); | 1387 __ j(equal, &runtime_call, Label::kFar); |
| 1388 if (is_strong(strength())) { | 1388 if (is_strong(strength())) { |
| 1389 // We have already tested for smis and heap numbers, so if both | 1389 // We have already tested for smis and heap numbers, so if both |
| 1390 // arguments are not strings we must proceed to the slow case. | 1390 // arguments are not strings we must proceed to the slow case. |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1438 __ ret(0); | 1438 __ ret(0); |
| 1439 | 1439 |
| 1440 __ bind(¬_smis); | 1440 __ bind(¬_smis); |
| 1441 // If either operand is a JSObject or an oddball value, then they are not | 1441 // If either operand is a JSObject or an oddball value, then they are not |
| 1442 // equal since their pointers are different | 1442 // equal since their pointers are different |
| 1443 // There is no test for undetectability in strict equality. | 1443 // There is no test for undetectability in strict equality. |
| 1444 | 1444 |
| 1445 // Get the type of the first operand. | 1445 // Get the type of the first operand. |
| 1446 // If the first object is a JS object, we have done pointer comparison. | 1446 // If the first object is a JS object, we have done pointer comparison. |
| 1447 Label first_non_object; | 1447 Label first_non_object; |
| 1448 STATIC_ASSERT(LAST_TYPE == LAST_SPEC_OBJECT_TYPE); | 1448 STATIC_ASSERT(LAST_TYPE == LAST_JS_RECEIVER_TYPE); |
| 1449 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); | 1449 __ CmpObjectType(eax, FIRST_JS_RECEIVER_TYPE, ecx); |
| 1450 __ j(below, &first_non_object, Label::kNear); | 1450 __ j(below, &first_non_object, Label::kNear); |
| 1451 | 1451 |
| 1452 // Return non-zero (eax is not zero) | 1452 // Return non-zero (eax is not zero) |
| 1453 Label return_not_equal; | 1453 Label return_not_equal; |
| 1454 STATIC_ASSERT(kHeapObjectTag != 0); | 1454 STATIC_ASSERT(kHeapObjectTag != 0); |
| 1455 __ bind(&return_not_equal); | 1455 __ bind(&return_not_equal); |
| 1456 __ ret(0); | 1456 __ ret(0); |
| 1457 | 1457 |
| 1458 __ bind(&first_non_object); | 1458 __ bind(&first_non_object); |
| 1459 // Check for oddballs: true, false, null, undefined. | 1459 // Check for oddballs: true, false, null, undefined. |
| 1460 __ CmpInstanceType(ecx, ODDBALL_TYPE); | 1460 __ CmpInstanceType(ecx, ODDBALL_TYPE); |
| 1461 __ j(equal, &return_not_equal); | 1461 __ j(equal, &return_not_equal); |
| 1462 | 1462 |
| 1463 __ CmpObjectType(edx, FIRST_SPEC_OBJECT_TYPE, ecx); | 1463 __ CmpObjectType(edx, FIRST_JS_RECEIVER_TYPE, ecx); |
| 1464 __ j(above_equal, &return_not_equal); | 1464 __ j(above_equal, &return_not_equal); |
| 1465 | 1465 |
| 1466 // Check for oddballs: true, false, null, undefined. | 1466 // Check for oddballs: true, false, null, undefined. |
| 1467 __ CmpInstanceType(ecx, ODDBALL_TYPE); | 1467 __ CmpInstanceType(ecx, ODDBALL_TYPE); |
| 1468 __ j(equal, &return_not_equal); | 1468 __ j(equal, &return_not_equal); |
| 1469 | 1469 |
| 1470 // Fall through to the general case. | 1470 // Fall through to the general case. |
| 1471 __ bind(&slow); | 1471 __ bind(&slow); |
| 1472 } | 1472 } |
| 1473 | 1473 |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1549 // and their pointers are different. | 1549 // and their pointers are different. |
| 1550 Label return_unequal; | 1550 Label return_unequal; |
| 1551 // At most one is a smi, so we can test for smi by adding the two. | 1551 // At most one is a smi, so we can test for smi by adding the two. |
| 1552 // A smi plus a heap object has the low bit set, a heap object plus | 1552 // A smi plus a heap object has the low bit set, a heap object plus |
| 1553 // a heap object has the low bit clear. | 1553 // a heap object has the low bit clear. |
| 1554 STATIC_ASSERT(kSmiTag == 0); | 1554 STATIC_ASSERT(kSmiTag == 0); |
| 1555 STATIC_ASSERT(kSmiTagMask == 1); | 1555 STATIC_ASSERT(kSmiTagMask == 1); |
| 1556 __ lea(ecx, Operand(eax, edx, times_1, 0)); | 1556 __ lea(ecx, Operand(eax, edx, times_1, 0)); |
| 1557 __ test(ecx, Immediate(kSmiTagMask)); | 1557 __ test(ecx, Immediate(kSmiTagMask)); |
| 1558 __ j(not_zero, &runtime_call, Label::kNear); | 1558 __ j(not_zero, &runtime_call, Label::kNear); |
| 1559 __ CmpObjectType(eax, FIRST_SPEC_OBJECT_TYPE, ecx); | 1559 __ CmpObjectType(eax, FIRST_JS_RECEIVER_TYPE, ecx); |
| 1560 __ j(below, &runtime_call, Label::kNear); | 1560 __ j(below, &runtime_call, Label::kNear); |
| 1561 __ CmpObjectType(edx, FIRST_SPEC_OBJECT_TYPE, ebx); | 1561 __ CmpObjectType(edx, FIRST_JS_RECEIVER_TYPE, ebx); |
| 1562 __ j(below, &runtime_call, Label::kNear); | 1562 __ j(below, &runtime_call, Label::kNear); |
| 1563 // We do not bail out after this point. Both are JSObjects, and | 1563 // We do not bail out after this point. Both are JSObjects, and |
| 1564 // they are equal if and only if both are undetectable. | 1564 // they are equal if and only if both are undetectable. |
| 1565 // The and of the undetectable flags is 1 if and only if they are equal. | 1565 // The and of the undetectable flags is 1 if and only if they are equal. |
| 1566 __ test_b(FieldOperand(ecx, Map::kBitFieldOffset), | 1566 __ test_b(FieldOperand(ecx, Map::kBitFieldOffset), |
| 1567 1 << Map::kIsUndetectable); | 1567 1 << Map::kIsUndetectable); |
| 1568 __ j(zero, &return_unequal, Label::kNear); | 1568 __ j(zero, &return_unequal, Label::kNear); |
| 1569 __ test_b(FieldOperand(ebx, Map::kBitFieldOffset), | 1569 __ test_b(FieldOperand(ebx, Map::kBitFieldOffset), |
| 1570 1 << Map::kIsUndetectable); | 1570 1 << Map::kIsUndetectable); |
| 1571 __ j(zero, &return_unequal, Label::kNear); | 1571 __ j(zero, &return_unequal, Label::kNear); |
| (...skipping 3491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5063 Label ok; | 5063 Label ok; |
| 5064 Register return_value = eax; | 5064 Register return_value = eax; |
| 5065 Register map = ecx; | 5065 Register map = ecx; |
| 5066 | 5066 |
| 5067 __ JumpIfSmi(return_value, &ok, Label::kNear); | 5067 __ JumpIfSmi(return_value, &ok, Label::kNear); |
| 5068 __ mov(map, FieldOperand(return_value, HeapObject::kMapOffset)); | 5068 __ mov(map, FieldOperand(return_value, HeapObject::kMapOffset)); |
| 5069 | 5069 |
| 5070 __ CmpInstanceType(map, LAST_NAME_TYPE); | 5070 __ CmpInstanceType(map, LAST_NAME_TYPE); |
| 5071 __ j(below_equal, &ok, Label::kNear); | 5071 __ j(below_equal, &ok, Label::kNear); |
| 5072 | 5072 |
| 5073 __ CmpInstanceType(map, FIRST_SPEC_OBJECT_TYPE); | 5073 __ CmpInstanceType(map, FIRST_JS_RECEIVER_TYPE); |
| 5074 __ j(above_equal, &ok, Label::kNear); | 5074 __ j(above_equal, &ok, Label::kNear); |
| 5075 | 5075 |
| 5076 __ cmp(map, isolate->factory()->heap_number_map()); | 5076 __ cmp(map, isolate->factory()->heap_number_map()); |
| 5077 __ j(equal, &ok, Label::kNear); | 5077 __ j(equal, &ok, Label::kNear); |
| 5078 | 5078 |
| 5079 __ cmp(return_value, isolate->factory()->undefined_value()); | 5079 __ cmp(return_value, isolate->factory()->undefined_value()); |
| 5080 __ j(equal, &ok, Label::kNear); | 5080 __ j(equal, &ok, Label::kNear); |
| 5081 | 5081 |
| 5082 __ cmp(return_value, isolate->factory()->true_value()); | 5082 __ cmp(return_value, isolate->factory()->true_value()); |
| 5083 __ j(equal, &ok, Label::kNear); | 5083 __ j(equal, &ok, Label::kNear); |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5320 Operand(ebp, 7 * kPointerSize), NULL); | 5320 Operand(ebp, 7 * kPointerSize), NULL); |
| 5321 } | 5321 } |
| 5322 | 5322 |
| 5323 | 5323 |
| 5324 #undef __ | 5324 #undef __ |
| 5325 | 5325 |
| 5326 } // namespace internal | 5326 } // namespace internal |
| 5327 } // namespace v8 | 5327 } // namespace v8 |
| 5328 | 5328 |
| 5329 #endif // V8_TARGET_ARCH_X87 | 5329 #endif // V8_TARGET_ARCH_X87 |
| OLD | NEW |