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 |