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

Side by Side Diff: src/arm64/lithium-codegen-arm64.cc

Issue 1316933002: [es6] Initial steps towards a correct implementation of IsCallable. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: ia32, arm and arm64 ports. Misc cleanups. Created 5 years, 3 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
OLDNEW
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 #include "src/arm64/frames-arm64.h" 5 #include "src/arm64/frames-arm64.h"
6 #include "src/arm64/lithium-codegen-arm64.h" 6 #include "src/arm64/lithium-codegen-arm64.h"
7 #include "src/arm64/lithium-gap-resolver-arm64.h" 7 #include "src/arm64/lithium-gap-resolver-arm64.h"
8 #include "src/base/bits.h" 8 #include "src/base/bits.h"
9 #include "src/code-factory.h" 9 #include "src/code-factory.h"
10 #include "src/code-stubs.h" 10 #include "src/code-stubs.h"
(...skipping 5835 matching lines...) Expand 10 before | Expand all | Expand 10 after
5846 Register scratch = ToRegister(instr->temp1()); 5846 Register scratch = ToRegister(instr->temp1());
5847 5847
5848 __ JumpIfRoot(value, Heap::kUndefinedValueRootIndex, true_label); 5848 __ JumpIfRoot(value, Heap::kUndefinedValueRootIndex, true_label);
5849 __ JumpIfSmi(value, false_label); 5849 __ JumpIfSmi(value, false_label);
5850 // Check for undetectable objects and jump to the true branch in this case. 5850 // Check for undetectable objects and jump to the true branch in this case.
5851 __ Ldr(scratch, FieldMemOperand(value, HeapObject::kMapOffset)); 5851 __ Ldr(scratch, FieldMemOperand(value, HeapObject::kMapOffset));
5852 __ Ldrb(scratch, FieldMemOperand(scratch, Map::kBitFieldOffset)); 5852 __ Ldrb(scratch, FieldMemOperand(scratch, Map::kBitFieldOffset));
5853 EmitTestAndBranch(instr, ne, scratch, 1 << Map::kIsUndetectable); 5853 EmitTestAndBranch(instr, ne, scratch, 1 << Map::kIsUndetectable);
5854 5854
5855 } else if (String::Equals(type_name, factory->function_string())) { 5855 } else if (String::Equals(type_name, factory->function_string())) {
5856 STATIC_ASSERT(NUM_OF_CALLABLE_SPEC_OBJECT_TYPES == 2);
5857 DCHECK(instr->temp1() != NULL); 5856 DCHECK(instr->temp1() != NULL);
5858 Register type = ToRegister(instr->temp1()); 5857 Register scratch = ToRegister(instr->temp1());
5859 5858
5860 __ JumpIfSmi(value, false_label); 5859 __ JumpIfSmi(value, false_label);
5861 __ JumpIfObjectType(value, type, type, JS_FUNCTION_TYPE, true_label); 5860 __ Ldr(scratch, FieldMemOperand(value, HeapObject::kMapOffset));
5862 // HeapObject's type has been loaded into type register by JumpIfObjectType. 5861 __ Ldrb(scratch, FieldMemOperand(scratch, Map::kBitFieldOffset));
5863 EmitCompareAndBranch(instr, eq, type, JS_FUNCTION_PROXY_TYPE); 5862 __ And(scratch, scratch,
5863 (1 << Map::kIsCallable) | (1 << Map::kIsUndetectable));
5864 EmitCompareAndBranch(instr, eq, scratch, 1 << Map::kIsCallable);
5864 5865
5865 } else if (String::Equals(type_name, factory->object_string())) { 5866 } else if (String::Equals(type_name, factory->object_string())) {
5866 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); 5867 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL));
5867 Register map = ToRegister(instr->temp1()); 5868 Register map = ToRegister(instr->temp1());
5868 Register scratch = ToRegister(instr->temp2()); 5869 Register scratch = ToRegister(instr->temp2());
5869 5870
5870 __ JumpIfSmi(value, false_label); 5871 __ JumpIfSmi(value, false_label);
5871 __ JumpIfRoot(value, Heap::kNullValueRootIndex, true_label); 5872 __ JumpIfRoot(value, Heap::kNullValueRootIndex, true_label);
5872 __ JumpIfObjectType(value, map, scratch, 5873 STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE);
5873 FIRST_NONCALLABLE_SPEC_OBJECT_TYPE, false_label, lt); 5874 __ JumpIfObjectType(value, map, scratch, FIRST_SPEC_OBJECT_TYPE,
5874 __ CompareInstanceType(map, scratch, LAST_NONCALLABLE_SPEC_OBJECT_TYPE); 5875 false_label, lt);
5875 __ B(gt, false_label); 5876 // Check for callable or undetectable objects => false.
5876 // Check for undetectable objects => false.
5877 __ Ldrb(scratch, FieldMemOperand(map, Map::kBitFieldOffset)); 5877 __ Ldrb(scratch, FieldMemOperand(map, Map::kBitFieldOffset));
5878 EmitTestAndBranch(instr, eq, scratch, 1 << Map::kIsUndetectable); 5878 EmitTestAndBranch(instr, eq, scratch,
5879 (1 << Map::kIsCallable) | (1 << Map::kIsUndetectable));
5879 5880
5880 // clang-format off 5881 // clang-format off
5881 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \ 5882 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \
5882 } else if (String::Equals(type_name, factory->type##_string())) { \ 5883 } else if (String::Equals(type_name, factory->type##_string())) { \
5883 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); \ 5884 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); \
5884 Register map = ToRegister(instr->temp1()); \ 5885 Register map = ToRegister(instr->temp1()); \
5885 \ 5886 \
5886 __ JumpIfSmi(value, false_label); \ 5887 __ JumpIfSmi(value, false_label); \
5887 __ Ldr(map, FieldMemOperand(value, HeapObject::kMapOffset)); \ 5888 __ Ldr(map, FieldMemOperand(value, HeapObject::kMapOffset)); \
5888 __ CompareRoot(map, Heap::k##Type##MapRootIndex); \ 5889 __ CompareRoot(map, Heap::k##Type##MapRootIndex); \
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
6045 Handle<ScopeInfo> scope_info = instr->scope_info(); 6046 Handle<ScopeInfo> scope_info = instr->scope_info();
6046 __ Push(scope_info); 6047 __ Push(scope_info);
6047 __ Push(ToRegister(instr->function())); 6048 __ Push(ToRegister(instr->function()));
6048 CallRuntime(Runtime::kPushBlockContext, 2, instr); 6049 CallRuntime(Runtime::kPushBlockContext, 2, instr);
6049 RecordSafepoint(Safepoint::kNoLazyDeopt); 6050 RecordSafepoint(Safepoint::kNoLazyDeopt);
6050 } 6051 }
6051 6052
6052 6053
6053 } // namespace internal 6054 } // namespace internal
6054 } // namespace v8 6055 } // namespace v8
OLDNEW
« no previous file with comments | « src/arm/macro-assembler-arm.cc ('k') | src/array.js » ('j') | src/execution.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698