| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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_ARM64 | 5 #if V8_TARGET_ARCH_ARM64 |
| 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/codegen.h" | 9 #include "src/codegen.h" |
| 10 #include "src/compiler.h" | 10 #include "src/compiler.h" |
| (...skipping 4674 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4685 __ JumpIfRoot(x0, Heap::kUndefinedValueRootIndex, if_true); | 4685 __ JumpIfRoot(x0, Heap::kUndefinedValueRootIndex, if_true); |
| 4686 __ JumpIfSmi(x0, if_false); | 4686 __ JumpIfSmi(x0, if_false); |
| 4687 // Check for undetectable objects => true. | 4687 // Check for undetectable objects => true. |
| 4688 __ Ldr(x0, FieldMemOperand(x0, HeapObject::kMapOffset)); | 4688 __ Ldr(x0, FieldMemOperand(x0, HeapObject::kMapOffset)); |
| 4689 __ Ldrb(x1, FieldMemOperand(x0, Map::kBitFieldOffset)); | 4689 __ Ldrb(x1, FieldMemOperand(x0, Map::kBitFieldOffset)); |
| 4690 __ TestAndSplit(x1, 1 << Map::kIsUndetectable, if_false, if_true, | 4690 __ TestAndSplit(x1, 1 << Map::kIsUndetectable, if_false, if_true, |
| 4691 fall_through); | 4691 fall_through); |
| 4692 } else if (String::Equals(check, factory->function_string())) { | 4692 } else if (String::Equals(check, factory->function_string())) { |
| 4693 ASM_LOCATION("FullCodeGenerator::EmitLiteralCompareTypeof function_string"); | 4693 ASM_LOCATION("FullCodeGenerator::EmitLiteralCompareTypeof function_string"); |
| 4694 __ JumpIfSmi(x0, if_false); | 4694 __ JumpIfSmi(x0, if_false); |
| 4695 STATIC_ASSERT(NUM_OF_CALLABLE_SPEC_OBJECT_TYPES == 2); | 4695 __ Ldr(x0, FieldMemOperand(x0, HeapObject::kMapOffset)); |
| 4696 __ JumpIfObjectType(x0, x10, x11, JS_FUNCTION_TYPE, if_true); | 4696 __ Ldrb(x1, FieldMemOperand(x0, Map::kBitFieldOffset)); |
| 4697 __ CompareAndSplit(x11, JS_FUNCTION_PROXY_TYPE, eq, if_true, if_false, | 4697 __ And(x1, x1, (1 << Map::kIsCallable) | (1 << Map::kIsUndetectable)); |
| 4698 fall_through); | 4698 __ CompareAndSplit(x1, Operand(1 << Map::kIsCallable), eq, if_true, |
| 4699 if_false, fall_through); |
| 4699 } else if (String::Equals(check, factory->object_string())) { | 4700 } else if (String::Equals(check, factory->object_string())) { |
| 4700 ASM_LOCATION("FullCodeGenerator::EmitLiteralCompareTypeof object_string"); | 4701 ASM_LOCATION("FullCodeGenerator::EmitLiteralCompareTypeof object_string"); |
| 4701 __ JumpIfSmi(x0, if_false); | 4702 __ JumpIfSmi(x0, if_false); |
| 4702 __ JumpIfRoot(x0, Heap::kNullValueRootIndex, if_true); | 4703 __ JumpIfRoot(x0, Heap::kNullValueRootIndex, if_true); |
| 4703 // Check for JS objects => true. | 4704 STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE); |
| 4704 Register map = x10; | 4705 __ JumpIfObjectType(x0, x10, x11, FIRST_SPEC_OBJECT_TYPE, if_false, lt); |
| 4705 __ JumpIfObjectType(x0, map, x11, FIRST_NONCALLABLE_SPEC_OBJECT_TYPE, | 4706 // Check for callable or undetectable objects => false. |
| 4706 if_false, lt); | 4707 __ Ldrb(x10, FieldMemOperand(x10, Map::kBitFieldOffset)); |
| 4707 __ CompareInstanceType(map, x11, LAST_NONCALLABLE_SPEC_OBJECT_TYPE); | 4708 __ TestAndSplit(x10, (1 << Map::kIsCallable) | (1 << Map::kIsUndetectable), |
| 4708 __ B(gt, if_false); | 4709 if_true, if_false, fall_through); |
| 4709 // Check for undetectable objects => false. | |
| 4710 __ Ldrb(x10, FieldMemOperand(map, Map::kBitFieldOffset)); | |
| 4711 | |
| 4712 __ TestAndSplit(x10, 1 << Map::kIsUndetectable, if_true, if_false, | |
| 4713 fall_through); | |
| 4714 // clang-format off | 4710 // clang-format off |
| 4715 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \ | 4711 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \ |
| 4716 } else if (String::Equals(check, factory->type##_string())) { \ | 4712 } else if (String::Equals(check, factory->type##_string())) { \ |
| 4717 ASM_LOCATION("FullCodeGenerator::EmitLiteralCompareTypeof " \ | 4713 ASM_LOCATION("FullCodeGenerator::EmitLiteralCompareTypeof " \ |
| 4718 #type "_string"); \ | 4714 #type "_string"); \ |
| 4719 __ JumpIfSmi(x0, if_true); \ | 4715 __ JumpIfSmi(x0, if_true); \ |
| 4720 __ Ldr(x0, FieldMemOperand(x0, HeapObject::kMapOffset)); \ | 4716 __ Ldr(x0, FieldMemOperand(x0, HeapObject::kMapOffset)); \ |
| 4721 __ CompareRoot(x0, Heap::k##Type##MapRootIndex); \ | 4717 __ CompareRoot(x0, Heap::k##Type##MapRootIndex); \ |
| 4722 Split(eq, if_true, if_false, fall_through); | 4718 Split(eq, if_true, if_false, fall_through); |
| 4723 SIMD128_TYPES(SIMD128_TYPE) | 4719 SIMD128_TYPES(SIMD128_TYPE) |
| (...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5366 } | 5362 } |
| 5367 | 5363 |
| 5368 return INTERRUPT; | 5364 return INTERRUPT; |
| 5369 } | 5365 } |
| 5370 | 5366 |
| 5371 | 5367 |
| 5372 } // namespace internal | 5368 } // namespace internal |
| 5373 } // namespace v8 | 5369 } // namespace v8 |
| 5374 | 5370 |
| 5375 #endif // V8_TARGET_ARCH_ARM64 | 5371 #endif // V8_TARGET_ARCH_ARM64 |
| OLD | NEW |