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 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
11 #include "src/codegen.h" | 11 #include "src/codegen.h" |
12 #include "src/ic/handler-compiler.h" | 12 #include "src/ic/handler-compiler.h" |
| 13 #include "src/ic/ic.h" |
13 #include "src/isolate.h" | 14 #include "src/isolate.h" |
14 #include "src/jsregexp.h" | 15 #include "src/jsregexp.h" |
15 #include "src/regexp-macro-assembler.h" | 16 #include "src/regexp-macro-assembler.h" |
16 #include "src/runtime.h" | 17 #include "src/runtime.h" |
17 | 18 |
18 namespace v8 { | 19 namespace v8 { |
19 namespace internal { | 20 namespace internal { |
20 | 21 |
21 | 22 |
22 static void InitializeArrayConstructorDescriptor( | 23 static void InitializeArrayConstructorDescriptor( |
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 __ Ldrb(left_bitfield, FieldMemOperand(left_map, Map::kBitFieldOffset)); | 466 __ Ldrb(left_bitfield, FieldMemOperand(left_map, Map::kBitFieldOffset)); |
466 __ And(result, right_bitfield, left_bitfield); | 467 __ And(result, right_bitfield, left_bitfield); |
467 __ And(result, result, 1 << Map::kIsUndetectable); | 468 __ And(result, result, 1 << Map::kIsUndetectable); |
468 __ Eor(result, result, 1 << Map::kIsUndetectable); | 469 __ Eor(result, result, 1 << Map::kIsUndetectable); |
469 __ Ret(); | 470 __ Ret(); |
470 } | 471 } |
471 | 472 |
472 | 473 |
473 static void CompareICStub_CheckInputType(MacroAssembler* masm, Register input, | 474 static void CompareICStub_CheckInputType(MacroAssembler* masm, Register input, |
474 Register scratch, | 475 Register scratch, |
475 CompareIC::State expected, | 476 CompareICState::State expected, |
476 Label* fail) { | 477 Label* fail) { |
477 Label ok; | 478 Label ok; |
478 if (expected == CompareIC::SMI) { | 479 if (expected == CompareICState::SMI) { |
479 __ JumpIfNotSmi(input, fail); | 480 __ JumpIfNotSmi(input, fail); |
480 } else if (expected == CompareIC::NUMBER) { | 481 } else if (expected == CompareICState::NUMBER) { |
481 __ JumpIfSmi(input, &ok); | 482 __ JumpIfSmi(input, &ok); |
482 __ CheckMap(input, scratch, Heap::kHeapNumberMapRootIndex, fail, | 483 __ CheckMap(input, scratch, Heap::kHeapNumberMapRootIndex, fail, |
483 DONT_DO_SMI_CHECK); | 484 DONT_DO_SMI_CHECK); |
484 } | 485 } |
485 // We could be strict about internalized/non-internalized here, but as long as | 486 // We could be strict about internalized/non-internalized here, but as long as |
486 // hydrogen doesn't care, the stub doesn't have to care either. | 487 // hydrogen doesn't care, the stub doesn't have to care either. |
487 __ Bind(&ok); | 488 __ Bind(&ok); |
488 } | 489 } |
489 | 490 |
490 | 491 |
(...skipping 2455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2946 Register map = x5; | 2947 Register map = x5; |
2947 __ Ldr(map, FieldMemOperand(scratch, HeapObject::kMapOffset)); | 2948 __ Ldr(map, FieldMemOperand(scratch, HeapObject::kMapOffset)); |
2948 __ JumpIfNotRoot(map, Heap::kAllocationSiteMapRootIndex, &miss); | 2949 __ JumpIfNotRoot(map, Heap::kAllocationSiteMapRootIndex, &miss); |
2949 | 2950 |
2950 Register allocation_site = feedback_vector; | 2951 Register allocation_site = feedback_vector; |
2951 __ Mov(allocation_site, scratch); | 2952 __ Mov(allocation_site, scratch); |
2952 ArrayConstructorStub stub(masm->isolate(), arg_count()); | 2953 ArrayConstructorStub stub(masm->isolate(), arg_count()); |
2953 __ TailCallStub(&stub); | 2954 __ TailCallStub(&stub); |
2954 | 2955 |
2955 __ bind(&miss); | 2956 __ bind(&miss); |
2956 GenerateMiss(masm, IC::kCallIC_Customization_Miss); | 2957 GenerateMiss(masm); |
2957 | 2958 |
2958 // The slow case, we need this no matter what to complete a call after a miss. | 2959 // The slow case, we need this no matter what to complete a call after a miss. |
2959 CallFunctionNoFeedback(masm, | 2960 CallFunctionNoFeedback(masm, |
2960 arg_count(), | 2961 arg_count(), |
2961 true, | 2962 true, |
2962 CallAsMethod()); | 2963 CallAsMethod()); |
2963 | 2964 |
2964 __ Unreachable(); | 2965 __ Unreachable(); |
2965 } | 2966 } |
2966 | 2967 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3030 __ JumpIfNotObjectType(x4, x5, x5, JS_FUNCTION_TYPE, &miss); | 3031 __ JumpIfNotObjectType(x4, x5, x5, JS_FUNCTION_TYPE, &miss); |
3031 __ Add(x4, feedback_vector, | 3032 __ Add(x4, feedback_vector, |
3032 Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 3033 Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
3033 __ LoadRoot(x5, Heap::kMegamorphicSymbolRootIndex); | 3034 __ LoadRoot(x5, Heap::kMegamorphicSymbolRootIndex); |
3034 __ Str(x5, FieldMemOperand(x4, FixedArray::kHeaderSize)); | 3035 __ Str(x5, FieldMemOperand(x4, FixedArray::kHeaderSize)); |
3035 __ B(&slow_start); | 3036 __ B(&slow_start); |
3036 } | 3037 } |
3037 | 3038 |
3038 // We are here because tracing is on or we are going monomorphic. | 3039 // We are here because tracing is on or we are going monomorphic. |
3039 __ bind(&miss); | 3040 __ bind(&miss); |
3040 GenerateMiss(masm, IC::kCallIC_Miss); | 3041 GenerateMiss(masm); |
3041 | 3042 |
3042 // the slow case | 3043 // the slow case |
3043 __ bind(&slow_start); | 3044 __ bind(&slow_start); |
3044 | 3045 |
3045 // Check that the function is really a JavaScript function. | 3046 // Check that the function is really a JavaScript function. |
3046 __ JumpIfSmi(function, &non_function); | 3047 __ JumpIfSmi(function, &non_function); |
3047 | 3048 |
3048 // Goto slow case if we do not have a function. | 3049 // Goto slow case if we do not have a function. |
3049 __ JumpIfNotObjectType(function, x10, type, JS_FUNCTION_TYPE, &slow); | 3050 __ JumpIfNotObjectType(function, x10, type, JS_FUNCTION_TYPE, &slow); |
3050 __ B(&have_js_function); | 3051 __ B(&have_js_function); |
3051 } | 3052 } |
3052 | 3053 |
3053 | 3054 |
3054 void CallICStub::GenerateMiss(MacroAssembler* masm, IC::UtilityId id) { | 3055 void CallICStub::GenerateMiss(MacroAssembler* masm) { |
3055 ASM_LOCATION("CallICStub[Miss]"); | 3056 ASM_LOCATION("CallICStub[Miss]"); |
3056 | 3057 |
3057 // Get the receiver of the function from the stack; 1 ~ return address. | 3058 // Get the receiver of the function from the stack; 1 ~ return address. |
3058 __ Peek(x4, (arg_count() + 1) * kPointerSize); | 3059 __ Peek(x4, (arg_count() + 1) * kPointerSize); |
3059 | 3060 |
3060 { | 3061 { |
3061 FrameScope scope(masm, StackFrame::INTERNAL); | 3062 FrameScope scope(masm, StackFrame::INTERNAL); |
3062 | 3063 |
3063 // Push the receiver and the function and feedback info. | 3064 // Push the receiver and the function and feedback info. |
3064 __ Push(x4, x1, x2, x3); | 3065 __ Push(x4, x1, x2, x3); |
3065 | 3066 |
3066 // Call the entry. | 3067 // Call the entry. |
| 3068 IC::UtilityId id = GetICState() == DEFAULT ? IC::kCallIC_Miss |
| 3069 : IC::kCallIC_Customization_Miss; |
| 3070 |
3067 ExternalReference miss = ExternalReference(IC_Utility(id), | 3071 ExternalReference miss = ExternalReference(IC_Utility(id), |
3068 masm->isolate()); | 3072 masm->isolate()); |
3069 __ CallExternalReference(miss, 4); | 3073 __ CallExternalReference(miss, 4); |
3070 | 3074 |
3071 // Move result to edi and exit the internal frame. | 3075 // Move result to edi and exit the internal frame. |
3072 __ Mov(x1, x0); | 3076 __ Mov(x1, x0); |
3073 } | 3077 } |
3074 } | 3078 } |
3075 | 3079 |
3076 | 3080 |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3184 __ Mov(result_, x0); | 3188 __ Mov(result_, x0); |
3185 call_helper.AfterCall(masm); | 3189 call_helper.AfterCall(masm); |
3186 __ B(&exit_); | 3190 __ B(&exit_); |
3187 | 3191 |
3188 __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase); | 3192 __ Abort(kUnexpectedFallthroughFromCharFromCodeSlowCase); |
3189 } | 3193 } |
3190 | 3194 |
3191 | 3195 |
3192 void CompareICStub::GenerateSmis(MacroAssembler* masm) { | 3196 void CompareICStub::GenerateSmis(MacroAssembler* masm) { |
3193 // Inputs are in x0 (lhs) and x1 (rhs). | 3197 // Inputs are in x0 (lhs) and x1 (rhs). |
3194 DCHECK(state() == CompareIC::SMI); | 3198 DCHECK(state() == CompareICState::SMI); |
3195 ASM_LOCATION("CompareICStub[Smis]"); | 3199 ASM_LOCATION("CompareICStub[Smis]"); |
3196 Label miss; | 3200 Label miss; |
3197 // Bail out (to 'miss') unless both x0 and x1 are smis. | 3201 // Bail out (to 'miss') unless both x0 and x1 are smis. |
3198 __ JumpIfEitherNotSmi(x0, x1, &miss); | 3202 __ JumpIfEitherNotSmi(x0, x1, &miss); |
3199 | 3203 |
3200 if (GetCondition() == eq) { | 3204 if (GetCondition() == eq) { |
3201 // For equality we do not care about the sign of the result. | 3205 // For equality we do not care about the sign of the result. |
3202 __ Sub(x0, x0, x1); | 3206 __ Sub(x0, x0, x1); |
3203 } else { | 3207 } else { |
3204 // Untag before subtracting to avoid handling overflow. | 3208 // Untag before subtracting to avoid handling overflow. |
3205 __ SmiUntag(x1); | 3209 __ SmiUntag(x1); |
3206 __ Sub(x0, x1, Operand::UntagSmi(x0)); | 3210 __ Sub(x0, x1, Operand::UntagSmi(x0)); |
3207 } | 3211 } |
3208 __ Ret(); | 3212 __ Ret(); |
3209 | 3213 |
3210 __ Bind(&miss); | 3214 __ Bind(&miss); |
3211 GenerateMiss(masm); | 3215 GenerateMiss(masm); |
3212 } | 3216 } |
3213 | 3217 |
3214 | 3218 |
3215 void CompareICStub::GenerateNumbers(MacroAssembler* masm) { | 3219 void CompareICStub::GenerateNumbers(MacroAssembler* masm) { |
3216 DCHECK(state() == CompareIC::NUMBER); | 3220 DCHECK(state() == CompareICState::NUMBER); |
3217 ASM_LOCATION("CompareICStub[HeapNumbers]"); | 3221 ASM_LOCATION("CompareICStub[HeapNumbers]"); |
3218 | 3222 |
3219 Label unordered, maybe_undefined1, maybe_undefined2; | 3223 Label unordered, maybe_undefined1, maybe_undefined2; |
3220 Label miss, handle_lhs, values_in_d_regs; | 3224 Label miss, handle_lhs, values_in_d_regs; |
3221 Label untag_rhs, untag_lhs; | 3225 Label untag_rhs, untag_lhs; |
3222 | 3226 |
3223 Register result = x0; | 3227 Register result = x0; |
3224 Register rhs = x0; | 3228 Register rhs = x0; |
3225 Register lhs = x1; | 3229 Register lhs = x1; |
3226 FPRegister rhs_d = d0; | 3230 FPRegister rhs_d = d0; |
3227 FPRegister lhs_d = d1; | 3231 FPRegister lhs_d = d1; |
3228 | 3232 |
3229 if (left() == CompareIC::SMI) { | 3233 if (left() == CompareICState::SMI) { |
3230 __ JumpIfNotSmi(lhs, &miss); | 3234 __ JumpIfNotSmi(lhs, &miss); |
3231 } | 3235 } |
3232 if (right() == CompareIC::SMI) { | 3236 if (right() == CompareICState::SMI) { |
3233 __ JumpIfNotSmi(rhs, &miss); | 3237 __ JumpIfNotSmi(rhs, &miss); |
3234 } | 3238 } |
3235 | 3239 |
3236 __ SmiUntagToDouble(rhs_d, rhs, kSpeculativeUntag); | 3240 __ SmiUntagToDouble(rhs_d, rhs, kSpeculativeUntag); |
3237 __ SmiUntagToDouble(lhs_d, lhs, kSpeculativeUntag); | 3241 __ SmiUntagToDouble(lhs_d, lhs, kSpeculativeUntag); |
3238 | 3242 |
3239 // Load rhs if it's a heap number. | 3243 // Load rhs if it's a heap number. |
3240 __ JumpIfSmi(rhs, &handle_lhs); | 3244 __ JumpIfSmi(rhs, &handle_lhs); |
3241 __ CheckMap(rhs, x10, Heap::kHeapNumberMapRootIndex, &maybe_undefined1, | 3245 __ CheckMap(rhs, x10, Heap::kHeapNumberMapRootIndex, &maybe_undefined1, |
3242 DONT_DO_SMI_CHECK); | 3246 DONT_DO_SMI_CHECK); |
3243 __ Ldr(rhs_d, FieldMemOperand(rhs, HeapNumber::kValueOffset)); | 3247 __ Ldr(rhs_d, FieldMemOperand(rhs, HeapNumber::kValueOffset)); |
3244 | 3248 |
3245 // Load lhs if it's a heap number. | 3249 // Load lhs if it's a heap number. |
3246 __ Bind(&handle_lhs); | 3250 __ Bind(&handle_lhs); |
3247 __ JumpIfSmi(lhs, &values_in_d_regs); | 3251 __ JumpIfSmi(lhs, &values_in_d_regs); |
3248 __ CheckMap(lhs, x10, Heap::kHeapNumberMapRootIndex, &maybe_undefined2, | 3252 __ CheckMap(lhs, x10, Heap::kHeapNumberMapRootIndex, &maybe_undefined2, |
3249 DONT_DO_SMI_CHECK); | 3253 DONT_DO_SMI_CHECK); |
3250 __ Ldr(lhs_d, FieldMemOperand(lhs, HeapNumber::kValueOffset)); | 3254 __ Ldr(lhs_d, FieldMemOperand(lhs, HeapNumber::kValueOffset)); |
3251 | 3255 |
3252 __ Bind(&values_in_d_regs); | 3256 __ Bind(&values_in_d_regs); |
3253 __ Fcmp(lhs_d, rhs_d); | 3257 __ Fcmp(lhs_d, rhs_d); |
3254 __ B(vs, &unordered); // Overflow flag set if either is NaN. | 3258 __ B(vs, &unordered); // Overflow flag set if either is NaN. |
3255 STATIC_ASSERT((LESS == -1) && (EQUAL == 0) && (GREATER == 1)); | 3259 STATIC_ASSERT((LESS == -1) && (EQUAL == 0) && (GREATER == 1)); |
3256 __ Cset(result, gt); // gt => 1, otherwise (lt, eq) => 0 (EQUAL). | 3260 __ Cset(result, gt); // gt => 1, otherwise (lt, eq) => 0 (EQUAL). |
3257 __ Csinv(result, result, xzr, ge); // lt => -1, gt => 1, eq => 0. | 3261 __ Csinv(result, result, xzr, ge); // lt => -1, gt => 1, eq => 0. |
3258 __ Ret(); | 3262 __ Ret(); |
3259 | 3263 |
3260 __ Bind(&unordered); | 3264 __ Bind(&unordered); |
3261 CompareICStub stub(isolate(), op(), CompareIC::GENERIC, CompareIC::GENERIC, | 3265 CompareICStub stub(isolate(), op(), CompareICState::GENERIC, |
3262 CompareIC::GENERIC); | 3266 CompareICState::GENERIC, CompareICState::GENERIC); |
3263 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); | 3267 __ Jump(stub.GetCode(), RelocInfo::CODE_TARGET); |
3264 | 3268 |
3265 __ Bind(&maybe_undefined1); | 3269 __ Bind(&maybe_undefined1); |
3266 if (Token::IsOrderedRelationalCompareOp(op())) { | 3270 if (Token::IsOrderedRelationalCompareOp(op())) { |
3267 __ JumpIfNotRoot(rhs, Heap::kUndefinedValueRootIndex, &miss); | 3271 __ JumpIfNotRoot(rhs, Heap::kUndefinedValueRootIndex, &miss); |
3268 __ JumpIfSmi(lhs, &unordered); | 3272 __ JumpIfSmi(lhs, &unordered); |
3269 __ JumpIfNotObjectType(lhs, x10, x10, HEAP_NUMBER_TYPE, &maybe_undefined2); | 3273 __ JumpIfNotObjectType(lhs, x10, x10, HEAP_NUMBER_TYPE, &maybe_undefined2); |
3270 __ B(&unordered); | 3274 __ B(&unordered); |
3271 } | 3275 } |
3272 | 3276 |
3273 __ Bind(&maybe_undefined2); | 3277 __ Bind(&maybe_undefined2); |
3274 if (Token::IsOrderedRelationalCompareOp(op())) { | 3278 if (Token::IsOrderedRelationalCompareOp(op())) { |
3275 __ JumpIfRoot(lhs, Heap::kUndefinedValueRootIndex, &unordered); | 3279 __ JumpIfRoot(lhs, Heap::kUndefinedValueRootIndex, &unordered); |
3276 } | 3280 } |
3277 | 3281 |
3278 __ Bind(&miss); | 3282 __ Bind(&miss); |
3279 GenerateMiss(masm); | 3283 GenerateMiss(masm); |
3280 } | 3284 } |
3281 | 3285 |
3282 | 3286 |
3283 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) { | 3287 void CompareICStub::GenerateInternalizedStrings(MacroAssembler* masm) { |
3284 DCHECK(state() == CompareIC::INTERNALIZED_STRING); | 3288 DCHECK(state() == CompareICState::INTERNALIZED_STRING); |
3285 ASM_LOCATION("CompareICStub[InternalizedStrings]"); | 3289 ASM_LOCATION("CompareICStub[InternalizedStrings]"); |
3286 Label miss; | 3290 Label miss; |
3287 | 3291 |
3288 Register result = x0; | 3292 Register result = x0; |
3289 Register rhs = x0; | 3293 Register rhs = x0; |
3290 Register lhs = x1; | 3294 Register lhs = x1; |
3291 | 3295 |
3292 // Check that both operands are heap objects. | 3296 // Check that both operands are heap objects. |
3293 __ JumpIfEitherSmi(lhs, rhs, &miss); | 3297 __ JumpIfEitherSmi(lhs, rhs, &miss); |
3294 | 3298 |
(...skipping 17 matching lines...) Expand all Loading... |
3312 __ Cmp(lhs, rhs); | 3316 __ Cmp(lhs, rhs); |
3313 __ Cset(result, ne); | 3317 __ Cset(result, ne); |
3314 __ Ret(); | 3318 __ Ret(); |
3315 | 3319 |
3316 __ Bind(&miss); | 3320 __ Bind(&miss); |
3317 GenerateMiss(masm); | 3321 GenerateMiss(masm); |
3318 } | 3322 } |
3319 | 3323 |
3320 | 3324 |
3321 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) { | 3325 void CompareICStub::GenerateUniqueNames(MacroAssembler* masm) { |
3322 DCHECK(state() == CompareIC::UNIQUE_NAME); | 3326 DCHECK(state() == CompareICState::UNIQUE_NAME); |
3323 ASM_LOCATION("CompareICStub[UniqueNames]"); | 3327 ASM_LOCATION("CompareICStub[UniqueNames]"); |
3324 DCHECK(GetCondition() == eq); | 3328 DCHECK(GetCondition() == eq); |
3325 Label miss; | 3329 Label miss; |
3326 | 3330 |
3327 Register result = x0; | 3331 Register result = x0; |
3328 Register rhs = x0; | 3332 Register rhs = x0; |
3329 Register lhs = x1; | 3333 Register lhs = x1; |
3330 | 3334 |
3331 Register lhs_instance_type = w2; | 3335 Register lhs_instance_type = w2; |
3332 Register rhs_instance_type = w3; | 3336 Register rhs_instance_type = w3; |
(...skipping 18 matching lines...) Expand all Loading... |
3351 __ Cmp(lhs, rhs); | 3355 __ Cmp(lhs, rhs); |
3352 __ Cset(result, ne); | 3356 __ Cset(result, ne); |
3353 __ Ret(); | 3357 __ Ret(); |
3354 | 3358 |
3355 __ Bind(&miss); | 3359 __ Bind(&miss); |
3356 GenerateMiss(masm); | 3360 GenerateMiss(masm); |
3357 } | 3361 } |
3358 | 3362 |
3359 | 3363 |
3360 void CompareICStub::GenerateStrings(MacroAssembler* masm) { | 3364 void CompareICStub::GenerateStrings(MacroAssembler* masm) { |
3361 DCHECK(state() == CompareIC::STRING); | 3365 DCHECK(state() == CompareICState::STRING); |
3362 ASM_LOCATION("CompareICStub[Strings]"); | 3366 ASM_LOCATION("CompareICStub[Strings]"); |
3363 | 3367 |
3364 Label miss; | 3368 Label miss; |
3365 | 3369 |
3366 bool equality = Token::IsEqualityOp(op()); | 3370 bool equality = Token::IsEqualityOp(op()); |
3367 | 3371 |
3368 Register result = x0; | 3372 Register result = x0; |
3369 Register rhs = x0; | 3373 Register rhs = x0; |
3370 Register lhs = x1; | 3374 Register lhs = x1; |
3371 | 3375 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3432 } else { | 3436 } else { |
3433 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 3437 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
3434 } | 3438 } |
3435 | 3439 |
3436 __ Bind(&miss); | 3440 __ Bind(&miss); |
3437 GenerateMiss(masm); | 3441 GenerateMiss(masm); |
3438 } | 3442 } |
3439 | 3443 |
3440 | 3444 |
3441 void CompareICStub::GenerateObjects(MacroAssembler* masm) { | 3445 void CompareICStub::GenerateObjects(MacroAssembler* masm) { |
3442 DCHECK(state() == CompareIC::OBJECT); | 3446 DCHECK(state() == CompareICState::OBJECT); |
3443 ASM_LOCATION("CompareICStub[Objects]"); | 3447 ASM_LOCATION("CompareICStub[Objects]"); |
3444 | 3448 |
3445 Label miss; | 3449 Label miss; |
3446 | 3450 |
3447 Register result = x0; | 3451 Register result = x0; |
3448 Register rhs = x0; | 3452 Register rhs = x0; |
3449 Register lhs = x1; | 3453 Register lhs = x1; |
3450 | 3454 |
3451 __ JumpIfEitherSmi(rhs, lhs, &miss); | 3455 __ JumpIfEitherSmi(rhs, lhs, &miss); |
3452 | 3456 |
(...skipping 1592 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5045 MemOperand(fp, 6 * kPointerSize), | 5049 MemOperand(fp, 6 * kPointerSize), |
5046 NULL); | 5050 NULL); |
5047 } | 5051 } |
5048 | 5052 |
5049 | 5053 |
5050 #undef __ | 5054 #undef __ |
5051 | 5055 |
5052 } } // namespace v8::internal | 5056 } } // namespace v8::internal |
5053 | 5057 |
5054 #endif // V8_TARGET_ARCH_ARM64 | 5058 #endif // V8_TARGET_ARCH_ARM64 |
OLD | NEW |