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