| 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 |