Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(524)

Side by Side Diff: src/arm64/lithium-codegen-arm64.cc

Issue 1250733005: SIMD.js Add the other SIMD Phase 1 types. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Make _IsSimdObject an assembly intrinsic in fullcodegen. Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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, &not_simd);
1939 __ CompareInstanceType(map, scratch, LAST_SIMD_VALUE_TYPE);
1940 __ B(le, true_label);
1941 __ Bind(&not_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, &not_heap_number); 1946 __ JumpIfNotRoot(map, Heap::kHeapNumberMapRootIndex, &not_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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/arm64/code-stubs-arm64.cc ('k') | src/bootstrapper.cc » ('j') | src/macros.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698