| 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 #include "src/arm64/lithium-codegen-arm64.h" | 7 #include "src/arm64/lithium-codegen-arm64.h" |
| 8 #include "src/arm64/lithium-gap-resolver-arm64.h" | 8 #include "src/arm64/lithium-gap-resolver-arm64.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 1915 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1926 } | 1926 } |
| 1927 | 1927 |
| 1928 if (expected.Contains(ToBooleanStub::SYMBOL)) { | 1928 if (expected.Contains(ToBooleanStub::SYMBOL)) { |
| 1929 // Symbol value -> true. | 1929 // Symbol value -> true. |
| 1930 __ CompareInstanceType(map, scratch, SYMBOL_TYPE); | 1930 __ CompareInstanceType(map, scratch, SYMBOL_TYPE); |
| 1931 __ B(eq, true_label); | 1931 __ B(eq, true_label); |
| 1932 } | 1932 } |
| 1933 | 1933 |
| 1934 if (expected.Contains(ToBooleanStub::SIMD_VALUE)) { | 1934 if (expected.Contains(ToBooleanStub::SIMD_VALUE)) { |
| 1935 // SIMD value -> true. | 1935 // SIMD value -> true. |
| 1936 __ CompareInstanceType(map, scratch, FLOAT32X4_TYPE); | 1936 Label not_simd; |
| 1937 __ B(eq, true_label); | 1937 __ CompareInstanceType(map, scratch, FIRST_SIMD_VALUE_TYPE); |
| 1938 __ B(lt, ¬_simd); |
| 1939 __ CompareInstanceType(map, scratch, LAST_SIMD_VALUE_TYPE); |
| 1940 __ B(le, true_label); |
| 1941 __ Bind(¬_simd); |
| 1938 } | 1942 } |
| 1939 | 1943 |
| 1940 if (expected.Contains(ToBooleanStub::HEAP_NUMBER)) { | 1944 if (expected.Contains(ToBooleanStub::HEAP_NUMBER)) { |
| 1941 Label not_heap_number; | 1945 Label not_heap_number; |
| 1942 __ JumpIfNotRoot(map, Heap::kHeapNumberMapRootIndex, ¬_heap_number); | 1946 __ JumpIfNotRoot(map, Heap::kHeapNumberMapRootIndex, ¬_heap_number); |
| 1943 | 1947 |
| 1944 __ Ldr(double_scratch(), | 1948 __ Ldr(double_scratch(), |
| 1945 FieldMemOperand(value, HeapNumber::kValueOffset)); | 1949 FieldMemOperand(value, HeapNumber::kValueOffset)); |
| 1946 __ Fcmp(double_scratch(), 0.0); | 1950 __ Fcmp(double_scratch(), 0.0); |
| 1947 // If we got a NaN (overflow bit is set), jump to the false branch. | 1951 // If we got a NaN (overflow bit is set), jump to the false branch. |
| (...skipping 1429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3377 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode(), | 3381 CodeFactory::LoadICInOptimizedCode(isolate(), instr->typeof_mode(), |
| 3378 SLOPPY, PREMONOMORPHIC).code(); | 3382 SLOPPY, PREMONOMORPHIC).code(); |
| 3379 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3383 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 3380 } | 3384 } |
| 3381 | 3385 |
| 3382 | 3386 |
| 3383 void LCodeGen::DoLoadGlobalViaContext(LLoadGlobalViaContext* instr) { | 3387 void LCodeGen::DoLoadGlobalViaContext(LLoadGlobalViaContext* instr) { |
| 3384 DCHECK(ToRegister(instr->context()).is(cp)); | 3388 DCHECK(ToRegister(instr->context()).is(cp)); |
| 3385 DCHECK(ToRegister(instr->result()).is(x0)); | 3389 DCHECK(ToRegister(instr->result()).is(x0)); |
| 3386 | 3390 |
| 3387 int const slot = instr->slot_index(); | 3391 __ Mov(LoadGlobalViaContextDescriptor::DepthRegister(), |
| 3388 int const depth = instr->depth(); | 3392 Operand(Smi::FromInt(instr->depth()))); |
| 3389 if (depth <= LoadGlobalViaContextStub::kMaximumDepth) { | 3393 __ Mov(LoadGlobalViaContextDescriptor::SlotRegister(), |
| 3390 __ Mov(LoadGlobalViaContextDescriptor::SlotRegister(), Operand(slot)); | 3394 Operand(Smi::FromInt(instr->slot_index()))); |
| 3391 Handle<Code> stub = | 3395 __ Mov(LoadGlobalViaContextDescriptor::NameRegister(), |
| 3392 CodeFactory::LoadGlobalViaContext(isolate(), depth).code(); | 3396 Operand(instr->name())); |
| 3393 CallCode(stub, RelocInfo::CODE_TARGET, instr); | 3397 |
| 3394 } else { | 3398 Handle<Code> stub = |
| 3395 __ Push(Smi::FromInt(slot)); | 3399 CodeFactory::LoadGlobalViaContext(isolate(), instr->depth()).code(); |
| 3396 __ CallRuntime(Runtime::kLoadGlobalViaContext, 1); | 3400 CallCode(stub, RelocInfo::CODE_TARGET, instr); |
| 3397 } | |
| 3398 } | 3401 } |
| 3399 | 3402 |
| 3400 | 3403 |
| 3401 MemOperand LCodeGen::PrepareKeyedExternalArrayOperand( | 3404 MemOperand LCodeGen::PrepareKeyedExternalArrayOperand( |
| 3402 Register key, | 3405 Register key, |
| 3403 Register base, | 3406 Register base, |
| 3404 Register scratch, | 3407 Register scratch, |
| 3405 bool key_is_smi, | 3408 bool key_is_smi, |
| 3406 bool key_is_constant, | 3409 bool key_is_constant, |
| 3407 int constant_key, | 3410 int constant_key, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3448 scratch = ToRegister(instr->temp()); | 3451 scratch = ToRegister(instr->temp()); |
| 3449 key = ToRegister(instr->key()); | 3452 key = ToRegister(instr->key()); |
| 3450 } | 3453 } |
| 3451 | 3454 |
| 3452 MemOperand mem_op = | 3455 MemOperand mem_op = |
| 3453 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, | 3456 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, |
| 3454 key_is_constant, constant_key, | 3457 key_is_constant, constant_key, |
| 3455 elements_kind, | 3458 elements_kind, |
| 3456 instr->base_offset()); | 3459 instr->base_offset()); |
| 3457 | 3460 |
| 3458 if (elements_kind == FLOAT32_ELEMENTS) { | 3461 if ((elements_kind == EXTERNAL_FLOAT32_ELEMENTS) || |
| 3462 (elements_kind == FLOAT32_ELEMENTS)) { |
| 3459 DoubleRegister result = ToDoubleRegister(instr->result()); | 3463 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 3460 __ Ldr(result.S(), mem_op); | 3464 __ Ldr(result.S(), mem_op); |
| 3461 __ Fcvt(result, result.S()); | 3465 __ Fcvt(result, result.S()); |
| 3462 } else if (elements_kind == FLOAT64_ELEMENTS) { | 3466 } else if ((elements_kind == EXTERNAL_FLOAT64_ELEMENTS) || |
| 3467 (elements_kind == FLOAT64_ELEMENTS)) { |
| 3463 DoubleRegister result = ToDoubleRegister(instr->result()); | 3468 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 3464 __ Ldr(result, mem_op); | 3469 __ Ldr(result, mem_op); |
| 3465 } else { | 3470 } else { |
| 3466 Register result = ToRegister(instr->result()); | 3471 Register result = ToRegister(instr->result()); |
| 3467 | 3472 |
| 3468 switch (elements_kind) { | 3473 switch (elements_kind) { |
| 3474 case EXTERNAL_INT8_ELEMENTS: |
| 3469 case INT8_ELEMENTS: | 3475 case INT8_ELEMENTS: |
| 3470 __ Ldrsb(result, mem_op); | 3476 __ Ldrsb(result, mem_op); |
| 3471 break; | 3477 break; |
| 3478 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: |
| 3479 case EXTERNAL_UINT8_ELEMENTS: |
| 3472 case UINT8_ELEMENTS: | 3480 case UINT8_ELEMENTS: |
| 3473 case UINT8_CLAMPED_ELEMENTS: | 3481 case UINT8_CLAMPED_ELEMENTS: |
| 3474 __ Ldrb(result, mem_op); | 3482 __ Ldrb(result, mem_op); |
| 3475 break; | 3483 break; |
| 3484 case EXTERNAL_INT16_ELEMENTS: |
| 3476 case INT16_ELEMENTS: | 3485 case INT16_ELEMENTS: |
| 3477 __ Ldrsh(result, mem_op); | 3486 __ Ldrsh(result, mem_op); |
| 3478 break; | 3487 break; |
| 3488 case EXTERNAL_UINT16_ELEMENTS: |
| 3479 case UINT16_ELEMENTS: | 3489 case UINT16_ELEMENTS: |
| 3480 __ Ldrh(result, mem_op); | 3490 __ Ldrh(result, mem_op); |
| 3481 break; | 3491 break; |
| 3492 case EXTERNAL_INT32_ELEMENTS: |
| 3482 case INT32_ELEMENTS: | 3493 case INT32_ELEMENTS: |
| 3483 __ Ldrsw(result, mem_op); | 3494 __ Ldrsw(result, mem_op); |
| 3484 break; | 3495 break; |
| 3496 case EXTERNAL_UINT32_ELEMENTS: |
| 3485 case UINT32_ELEMENTS: | 3497 case UINT32_ELEMENTS: |
| 3486 __ Ldr(result.W(), mem_op); | 3498 __ Ldr(result.W(), mem_op); |
| 3487 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { | 3499 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { |
| 3488 // Deopt if value > 0x80000000. | 3500 // Deopt if value > 0x80000000. |
| 3489 __ Tst(result, 0xFFFFFFFF80000000); | 3501 __ Tst(result, 0xFFFFFFFF80000000); |
| 3490 DeoptimizeIf(ne, instr, Deoptimizer::kNegativeValue); | 3502 DeoptimizeIf(ne, instr, Deoptimizer::kNegativeValue); |
| 3491 } | 3503 } |
| 3492 break; | 3504 break; |
| 3493 case FLOAT32_ELEMENTS: | 3505 case FLOAT32_ELEMENTS: |
| 3494 case FLOAT64_ELEMENTS: | 3506 case FLOAT64_ELEMENTS: |
| 3507 case EXTERNAL_FLOAT32_ELEMENTS: |
| 3508 case EXTERNAL_FLOAT64_ELEMENTS: |
| 3495 case FAST_HOLEY_DOUBLE_ELEMENTS: | 3509 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 3496 case FAST_HOLEY_ELEMENTS: | 3510 case FAST_HOLEY_ELEMENTS: |
| 3497 case FAST_HOLEY_SMI_ELEMENTS: | 3511 case FAST_HOLEY_SMI_ELEMENTS: |
| 3498 case FAST_DOUBLE_ELEMENTS: | 3512 case FAST_DOUBLE_ELEMENTS: |
| 3499 case FAST_ELEMENTS: | 3513 case FAST_ELEMENTS: |
| 3500 case FAST_SMI_ELEMENTS: | 3514 case FAST_SMI_ELEMENTS: |
| 3501 case DICTIONARY_ELEMENTS: | 3515 case DICTIONARY_ELEMENTS: |
| 3502 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 3516 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3503 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 3517 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3504 UNREACHABLE(); | 3518 UNREACHABLE(); |
| (...skipping 1523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5028 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { | 5042 void LCodeGen::DoDeclareGlobals(LDeclareGlobals* instr) { |
| 5029 DCHECK(ToRegister(instr->context()).is(cp)); | 5043 DCHECK(ToRegister(instr->context()).is(cp)); |
| 5030 Register scratch1 = x5; | 5044 Register scratch1 = x5; |
| 5031 Register scratch2 = x6; | 5045 Register scratch2 = x6; |
| 5032 DCHECK(instr->IsMarkedAsCall()); | 5046 DCHECK(instr->IsMarkedAsCall()); |
| 5033 | 5047 |
| 5034 // TODO(all): if Mov could handle object in new space then it could be used | 5048 // TODO(all): if Mov could handle object in new space then it could be used |
| 5035 // here. | 5049 // here. |
| 5036 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); | 5050 __ LoadHeapObject(scratch1, instr->hydrogen()->pairs()); |
| 5037 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); | 5051 __ Mov(scratch2, Smi::FromInt(instr->hydrogen()->flags())); |
| 5038 __ Push(scratch1, scratch2); | 5052 __ Push(cp, scratch1, scratch2); // The context is the first argument. |
| 5039 CallRuntime(Runtime::kDeclareGlobals, 2, instr); | 5053 CallRuntime(Runtime::kDeclareGlobals, 3, instr); |
| 5040 } | 5054 } |
| 5041 | 5055 |
| 5042 | 5056 |
| 5043 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { | 5057 void LCodeGen::DoDeferredStackCheck(LStackCheck* instr) { |
| 5044 PushSafepointRegistersScope scope(this); | 5058 PushSafepointRegistersScope scope(this); |
| 5045 LoadContextFromDeferred(instr->context()); | 5059 LoadContextFromDeferred(instr->context()); |
| 5046 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); | 5060 __ CallRuntimeSaveDoubles(Runtime::kStackGuard); |
| 5047 RecordSafepointWithLazyDeopt( | 5061 RecordSafepointWithLazyDeopt( |
| 5048 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); | 5062 instr, RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS); |
| 5049 DCHECK(instr->HasEnvironment()); | 5063 DCHECK(instr->HasEnvironment()); |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5159 key = ToRegister(instr->key()); | 5173 key = ToRegister(instr->key()); |
| 5160 scratch = ToRegister(instr->temp()); | 5174 scratch = ToRegister(instr->temp()); |
| 5161 } | 5175 } |
| 5162 | 5176 |
| 5163 MemOperand dst = | 5177 MemOperand dst = |
| 5164 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, | 5178 PrepareKeyedExternalArrayOperand(key, ext_ptr, scratch, key_is_smi, |
| 5165 key_is_constant, constant_key, | 5179 key_is_constant, constant_key, |
| 5166 elements_kind, | 5180 elements_kind, |
| 5167 instr->base_offset()); | 5181 instr->base_offset()); |
| 5168 | 5182 |
| 5169 if (elements_kind == FLOAT32_ELEMENTS) { | 5183 if ((elements_kind == EXTERNAL_FLOAT32_ELEMENTS) || |
| 5184 (elements_kind == FLOAT32_ELEMENTS)) { |
| 5170 DoubleRegister value = ToDoubleRegister(instr->value()); | 5185 DoubleRegister value = ToDoubleRegister(instr->value()); |
| 5171 DoubleRegister dbl_scratch = double_scratch(); | 5186 DoubleRegister dbl_scratch = double_scratch(); |
| 5172 __ Fcvt(dbl_scratch.S(), value); | 5187 __ Fcvt(dbl_scratch.S(), value); |
| 5173 __ Str(dbl_scratch.S(), dst); | 5188 __ Str(dbl_scratch.S(), dst); |
| 5174 } else if (elements_kind == FLOAT64_ELEMENTS) { | 5189 } else if ((elements_kind == EXTERNAL_FLOAT64_ELEMENTS) || |
| 5190 (elements_kind == FLOAT64_ELEMENTS)) { |
| 5175 DoubleRegister value = ToDoubleRegister(instr->value()); | 5191 DoubleRegister value = ToDoubleRegister(instr->value()); |
| 5176 __ Str(value, dst); | 5192 __ Str(value, dst); |
| 5177 } else { | 5193 } else { |
| 5178 Register value = ToRegister(instr->value()); | 5194 Register value = ToRegister(instr->value()); |
| 5179 | 5195 |
| 5180 switch (elements_kind) { | 5196 switch (elements_kind) { |
| 5197 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: |
| 5198 case EXTERNAL_INT8_ELEMENTS: |
| 5199 case EXTERNAL_UINT8_ELEMENTS: |
| 5181 case UINT8_ELEMENTS: | 5200 case UINT8_ELEMENTS: |
| 5182 case UINT8_CLAMPED_ELEMENTS: | 5201 case UINT8_CLAMPED_ELEMENTS: |
| 5183 case INT8_ELEMENTS: | 5202 case INT8_ELEMENTS: |
| 5184 __ Strb(value, dst); | 5203 __ Strb(value, dst); |
| 5185 break; | 5204 break; |
| 5205 case EXTERNAL_INT16_ELEMENTS: |
| 5206 case EXTERNAL_UINT16_ELEMENTS: |
| 5186 case INT16_ELEMENTS: | 5207 case INT16_ELEMENTS: |
| 5187 case UINT16_ELEMENTS: | 5208 case UINT16_ELEMENTS: |
| 5188 __ Strh(value, dst); | 5209 __ Strh(value, dst); |
| 5189 break; | 5210 break; |
| 5211 case EXTERNAL_INT32_ELEMENTS: |
| 5212 case EXTERNAL_UINT32_ELEMENTS: |
| 5190 case INT32_ELEMENTS: | 5213 case INT32_ELEMENTS: |
| 5191 case UINT32_ELEMENTS: | 5214 case UINT32_ELEMENTS: |
| 5192 __ Str(value.W(), dst); | 5215 __ Str(value.W(), dst); |
| 5193 break; | 5216 break; |
| 5194 case FLOAT32_ELEMENTS: | 5217 case FLOAT32_ELEMENTS: |
| 5195 case FLOAT64_ELEMENTS: | 5218 case FLOAT64_ELEMENTS: |
| 5219 case EXTERNAL_FLOAT32_ELEMENTS: |
| 5220 case EXTERNAL_FLOAT64_ELEMENTS: |
| 5196 case FAST_DOUBLE_ELEMENTS: | 5221 case FAST_DOUBLE_ELEMENTS: |
| 5197 case FAST_ELEMENTS: | 5222 case FAST_ELEMENTS: |
| 5198 case FAST_SMI_ELEMENTS: | 5223 case FAST_SMI_ELEMENTS: |
| 5199 case FAST_HOLEY_DOUBLE_ELEMENTS: | 5224 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 5200 case FAST_HOLEY_ELEMENTS: | 5225 case FAST_HOLEY_ELEMENTS: |
| 5201 case FAST_HOLEY_SMI_ELEMENTS: | 5226 case FAST_HOLEY_SMI_ELEMENTS: |
| 5202 case DICTIONARY_ELEMENTS: | 5227 case DICTIONARY_ELEMENTS: |
| 5203 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 5228 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 5204 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 5229 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 5205 UNREACHABLE(); | 5230 UNREACHABLE(); |
| (...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5512 instr->hydrogen()->initialization_state()).code(); | 5537 instr->hydrogen()->initialization_state()).code(); |
| 5513 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 5538 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
| 5514 } | 5539 } |
| 5515 | 5540 |
| 5516 | 5541 |
| 5517 void LCodeGen::DoStoreGlobalViaContext(LStoreGlobalViaContext* instr) { | 5542 void LCodeGen::DoStoreGlobalViaContext(LStoreGlobalViaContext* instr) { |
| 5518 DCHECK(ToRegister(instr->context()).is(cp)); | 5543 DCHECK(ToRegister(instr->context()).is(cp)); |
| 5519 DCHECK(ToRegister(instr->value()) | 5544 DCHECK(ToRegister(instr->value()) |
| 5520 .is(StoreGlobalViaContextDescriptor::ValueRegister())); | 5545 .is(StoreGlobalViaContextDescriptor::ValueRegister())); |
| 5521 | 5546 |
| 5522 int const slot = instr->slot_index(); | 5547 __ Mov(StoreGlobalViaContextDescriptor::DepthRegister(), |
| 5523 int const depth = instr->depth(); | 5548 Operand(Smi::FromInt(instr->depth()))); |
| 5524 if (depth <= StoreGlobalViaContextStub::kMaximumDepth) { | 5549 __ Mov(StoreGlobalViaContextDescriptor::SlotRegister(), |
| 5525 __ Mov(StoreGlobalViaContextDescriptor::SlotRegister(), Operand(slot)); | 5550 Operand(Smi::FromInt(instr->slot_index()))); |
| 5526 Handle<Code> stub = CodeFactory::StoreGlobalViaContext( | 5551 __ Mov(StoreGlobalViaContextDescriptor::NameRegister(), |
| 5527 isolate(), depth, instr->language_mode()) | 5552 Operand(instr->name())); |
| 5528 .code(); | 5553 |
| 5529 CallCode(stub, RelocInfo::CODE_TARGET, instr); | 5554 Handle<Code> stub = CodeFactory::StoreGlobalViaContext( |
| 5530 } else { | 5555 isolate(), instr->depth(), instr->language_mode()) |
| 5531 __ Push(Smi::FromInt(slot)); | 5556 .code(); |
| 5532 __ Push(StoreGlobalViaContextDescriptor::ValueRegister()); | 5557 CallCode(stub, RelocInfo::CODE_TARGET, instr); |
| 5533 __ CallRuntime(is_strict(instr->language_mode()) | |
| 5534 ? Runtime::kStoreGlobalViaContext_Strict | |
| 5535 : Runtime::kStoreGlobalViaContext_Sloppy, | |
| 5536 2); | |
| 5537 } | |
| 5538 } | 5558 } |
| 5539 | 5559 |
| 5540 | 5560 |
| 5541 void LCodeGen::DoStringAdd(LStringAdd* instr) { | 5561 void LCodeGen::DoStringAdd(LStringAdd* instr) { |
| 5542 DCHECK(ToRegister(instr->context()).is(cp)); | 5562 DCHECK(ToRegister(instr->context()).is(cp)); |
| 5543 DCHECK(ToRegister(instr->left()).Is(x1)); | 5563 DCHECK(ToRegister(instr->left()).Is(x1)); |
| 5544 DCHECK(ToRegister(instr->right()).Is(x0)); | 5564 DCHECK(ToRegister(instr->right()).Is(x0)); |
| 5545 StringAddStub stub(isolate(), | 5565 StringAddStub stub(isolate(), |
| 5546 instr->hydrogen()->flags(), | 5566 instr->hydrogen()->flags(), |
| 5547 instr->hydrogen()->pretenure_flag()); | 5567 instr->hydrogen()->pretenure_flag()); |
| (...skipping 447 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5995 | 6015 |
| 5996 } else if (String::Equals(type_name, factory->float32x4_string())) { | 6016 } else if (String::Equals(type_name, factory->float32x4_string())) { |
| 5997 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); | 6017 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); |
| 5998 Register map = ToRegister(instr->temp1()); | 6018 Register map = ToRegister(instr->temp1()); |
| 5999 Register scratch = ToRegister(instr->temp2()); | 6019 Register scratch = ToRegister(instr->temp2()); |
| 6000 | 6020 |
| 6001 __ JumpIfSmi(value, false_label); | 6021 __ JumpIfSmi(value, false_label); |
| 6002 __ CompareObjectType(value, map, scratch, FLOAT32X4_TYPE); | 6022 __ CompareObjectType(value, map, scratch, FLOAT32X4_TYPE); |
| 6003 EmitBranch(instr, eq); | 6023 EmitBranch(instr, eq); |
| 6004 | 6024 |
| 6025 } else if (String::Equals(type_name, factory->int32x4_string())) { |
| 6026 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); |
| 6027 Register map = ToRegister(instr->temp1()); |
| 6028 Register scratch = ToRegister(instr->temp2()); |
| 6029 |
| 6030 __ JumpIfSmi(value, false_label); |
| 6031 __ CompareObjectType(value, map, scratch, INT32X4_TYPE); |
| 6032 EmitBranch(instr, eq); |
| 6033 |
| 6034 } else if (String::Equals(type_name, factory->bool32x4_string())) { |
| 6035 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); |
| 6036 Register map = ToRegister(instr->temp1()); |
| 6037 Register scratch = ToRegister(instr->temp2()); |
| 6038 |
| 6039 __ JumpIfSmi(value, false_label); |
| 6040 __ CompareObjectType(value, map, scratch, BOOL32X4_TYPE); |
| 6041 EmitBranch(instr, eq); |
| 6042 |
| 6043 } else if (String::Equals(type_name, factory->int16x8_string())) { |
| 6044 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); |
| 6045 Register map = ToRegister(instr->temp1()); |
| 6046 Register scratch = ToRegister(instr->temp2()); |
| 6047 |
| 6048 __ JumpIfSmi(value, false_label); |
| 6049 __ CompareObjectType(value, map, scratch, INT16X8_TYPE); |
| 6050 EmitBranch(instr, eq); |
| 6051 |
| 6052 } else if (String::Equals(type_name, factory->bool16x8_string())) { |
| 6053 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); |
| 6054 Register map = ToRegister(instr->temp1()); |
| 6055 Register scratch = ToRegister(instr->temp2()); |
| 6056 |
| 6057 __ JumpIfSmi(value, false_label); |
| 6058 __ CompareObjectType(value, map, scratch, BOOL16X8_TYPE); |
| 6059 EmitBranch(instr, eq); |
| 6060 |
| 6061 } else if (String::Equals(type_name, factory->int8x16_string())) { |
| 6062 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); |
| 6063 Register map = ToRegister(instr->temp1()); |
| 6064 Register scratch = ToRegister(instr->temp2()); |
| 6065 |
| 6066 __ JumpIfSmi(value, false_label); |
| 6067 __ CompareObjectType(value, map, scratch, INT8X16_TYPE); |
| 6068 EmitBranch(instr, eq); |
| 6069 |
| 6070 } else if (String::Equals(type_name, factory->bool8x16_string())) { |
| 6071 DCHECK((instr->temp1() != NULL) && (instr->temp2() != NULL)); |
| 6072 Register map = ToRegister(instr->temp1()); |
| 6073 Register scratch = ToRegister(instr->temp2()); |
| 6074 |
| 6075 __ JumpIfSmi(value, false_label); |
| 6076 __ CompareObjectType(value, map, scratch, BOOL8X16_TYPE); |
| 6077 EmitBranch(instr, eq); |
| 6078 |
| 6005 } else { | 6079 } else { |
| 6006 __ B(false_label); | 6080 __ B(false_label); |
| 6007 } | 6081 } |
| 6008 } | 6082 } |
| 6009 | 6083 |
| 6010 | 6084 |
| 6011 void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) { | 6085 void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) { |
| 6012 __ Ucvtf(ToDoubleRegister(instr->result()), ToRegister32(instr->value())); | 6086 __ Ucvtf(ToDoubleRegister(instr->result()), ToRegister32(instr->value())); |
| 6013 } | 6087 } |
| 6014 | 6088 |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6156 Handle<ScopeInfo> scope_info = instr->scope_info(); | 6230 Handle<ScopeInfo> scope_info = instr->scope_info(); |
| 6157 __ Push(scope_info); | 6231 __ Push(scope_info); |
| 6158 __ Push(ToRegister(instr->function())); | 6232 __ Push(ToRegister(instr->function())); |
| 6159 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6233 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6160 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6234 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6161 } | 6235 } |
| 6162 | 6236 |
| 6163 | 6237 |
| 6164 } // namespace internal | 6238 } // namespace internal |
| 6165 } // namespace v8 | 6239 } // namespace v8 |
| OLD | NEW |