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

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

Issue 101413006: Implement in-heap backing store for typed arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Platform ports Created 6 years, 11 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 3396 matching lines...) Expand 10 before | Expand all | Expand 10 after
3407 elements_kind)) { 3407 elements_kind)) {
3408 __ SmiUntag(ToRegister(key)); 3408 __ SmiUntag(ToRegister(key));
3409 } 3409 }
3410 Operand operand(BuildFastArrayOperand( 3410 Operand operand(BuildFastArrayOperand(
3411 instr->elements(), 3411 instr->elements(),
3412 key, 3412 key,
3413 instr->hydrogen()->key()->representation(), 3413 instr->hydrogen()->key()->representation(),
3414 elements_kind, 3414 elements_kind,
3415 0, 3415 0,
3416 instr->additional_index())); 3416 instr->additional_index()));
3417 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { 3417 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
3418 elements_kind == FLOAT32_ELEMENTS) {
3418 if (CpuFeatures::IsSupported(SSE2)) { 3419 if (CpuFeatures::IsSupported(SSE2)) {
3419 CpuFeatureScope scope(masm(), SSE2); 3420 CpuFeatureScope scope(masm(), SSE2);
3420 XMMRegister result(ToDoubleRegister(instr->result())); 3421 XMMRegister result(ToDoubleRegister(instr->result()));
3421 __ movss(result, operand); 3422 __ movss(result, operand);
3422 __ cvtss2sd(result, result); 3423 __ cvtss2sd(result, result);
3423 } else { 3424 } else {
3424 X87Mov(ToX87Register(instr->result()), operand, kX87FloatOperand); 3425 X87Mov(ToX87Register(instr->result()), operand, kX87FloatOperand);
3425 } 3426 }
3426 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 3427 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS ||
3428 elements_kind == FLOAT64_ELEMENTS) {
3427 if (CpuFeatures::IsSupported(SSE2)) { 3429 if (CpuFeatures::IsSupported(SSE2)) {
3428 CpuFeatureScope scope(masm(), SSE2); 3430 CpuFeatureScope scope(masm(), SSE2);
3429 __ movsd(ToDoubleRegister(instr->result()), operand); 3431 __ movsd(ToDoubleRegister(instr->result()), operand);
3430 } else { 3432 } else {
3431 X87Mov(ToX87Register(instr->result()), operand); 3433 X87Mov(ToX87Register(instr->result()), operand);
3432 } 3434 }
3433 } else { 3435 } else {
3434 Register result(ToRegister(instr->result())); 3436 Register result(ToRegister(instr->result()));
3435 switch (elements_kind) { 3437 switch (elements_kind) {
3436 case EXTERNAL_BYTE_ELEMENTS: 3438 case EXTERNAL_BYTE_ELEMENTS:
3439 case INT8_ELEMENTS:
3437 __ movsx_b(result, operand); 3440 __ movsx_b(result, operand);
3438 break; 3441 break;
3439 case EXTERNAL_PIXEL_ELEMENTS: 3442 case EXTERNAL_PIXEL_ELEMENTS:
3440 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 3443 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3444 case UINT8_ELEMENTS:
3445 case UINT8_CLAMPED_ELEMENTS:
3441 __ movzx_b(result, operand); 3446 __ movzx_b(result, operand);
3442 break; 3447 break;
3443 case EXTERNAL_SHORT_ELEMENTS: 3448 case EXTERNAL_SHORT_ELEMENTS:
3449 case INT16_ELEMENTS:
3444 __ movsx_w(result, operand); 3450 __ movsx_w(result, operand);
3445 break; 3451 break;
3446 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 3452 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3453 case UINT16_ELEMENTS:
3447 __ movzx_w(result, operand); 3454 __ movzx_w(result, operand);
3448 break; 3455 break;
3449 case EXTERNAL_INT_ELEMENTS: 3456 case EXTERNAL_INT_ELEMENTS:
3457 case INT32_ELEMENTS:
3450 __ mov(result, operand); 3458 __ mov(result, operand);
3451 break; 3459 break;
3452 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 3460 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
3461 case UINT32_ELEMENTS:
3453 __ mov(result, operand); 3462 __ mov(result, operand);
3454 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { 3463 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) {
3455 __ test(result, Operand(result)); 3464 __ test(result, Operand(result));
3456 DeoptimizeIf(negative, instr->environment()); 3465 DeoptimizeIf(negative, instr->environment());
3457 } 3466 }
3458 break; 3467 break;
3459 case EXTERNAL_FLOAT_ELEMENTS: 3468 case EXTERNAL_FLOAT_ELEMENTS:
3460 case EXTERNAL_DOUBLE_ELEMENTS: 3469 case EXTERNAL_DOUBLE_ELEMENTS:
3470 case FLOAT32_ELEMENTS:
3471 case FLOAT64_ELEMENTS:
3461 case FAST_SMI_ELEMENTS: 3472 case FAST_SMI_ELEMENTS:
3462 case FAST_ELEMENTS: 3473 case FAST_ELEMENTS:
3463 case FAST_DOUBLE_ELEMENTS: 3474 case FAST_DOUBLE_ELEMENTS:
3464 case FAST_HOLEY_SMI_ELEMENTS: 3475 case FAST_HOLEY_SMI_ELEMENTS:
3465 case FAST_HOLEY_ELEMENTS: 3476 case FAST_HOLEY_ELEMENTS:
3466 case FAST_HOLEY_DOUBLE_ELEMENTS: 3477 case FAST_HOLEY_DOUBLE_ELEMENTS:
3467 case DICTIONARY_ELEMENTS: 3478 case DICTIONARY_ELEMENTS:
3468 case NON_STRICT_ARGUMENTS_ELEMENTS: 3479 case NON_STRICT_ARGUMENTS_ELEMENTS:
3469 UNREACHABLE(); 3480 UNREACHABLE();
3470 break; 3481 break;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3523 DeoptimizeIf(not_equal, instr->environment()); 3534 DeoptimizeIf(not_equal, instr->environment());
3524 } else { 3535 } else {
3525 __ cmp(result, factory()->the_hole_value()); 3536 __ cmp(result, factory()->the_hole_value());
3526 DeoptimizeIf(equal, instr->environment()); 3537 DeoptimizeIf(equal, instr->environment());
3527 } 3538 }
3528 } 3539 }
3529 } 3540 }
3530 3541
3531 3542
3532 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { 3543 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) {
3533 if (instr->is_external()) { 3544 if (instr->is_external() || instr->is_fixed_typed_array()) {
3534 DoLoadKeyedExternalArray(instr); 3545 DoLoadKeyedExternalArray(instr);
3535 } else if (instr->hydrogen()->representation().IsDouble()) { 3546 } else if (instr->hydrogen()->representation().IsDouble()) {
3536 DoLoadKeyedFixedDoubleArray(instr); 3547 DoLoadKeyedFixedDoubleArray(instr);
3537 } else { 3548 } else {
3538 DoLoadKeyedFixedArray(instr); 3549 DoLoadKeyedFixedArray(instr);
3539 } 3550 }
3540 } 3551 }
3541 3552
3542 3553
3543 Operand LCodeGen::BuildFastArrayOperand( 3554 Operand LCodeGen::BuildFastArrayOperand(
3544 LOperand* elements_pointer, 3555 LOperand* elements_pointer,
3545 LOperand* key, 3556 LOperand* key,
3546 Representation key_representation, 3557 Representation key_representation,
3547 ElementsKind elements_kind, 3558 ElementsKind elements_kind,
3548 uint32_t offset, 3559 uint32_t offset,
3549 uint32_t additional_index) { 3560 uint32_t additional_index) {
3550 Register elements_pointer_reg = ToRegister(elements_pointer); 3561 Register elements_pointer_reg = ToRegister(elements_pointer);
3551 int element_shift_size = ElementsKindToShiftSize(elements_kind); 3562 int element_shift_size = ElementsKindToShiftSize(elements_kind);
3563 if (IsFixedTypedArrayElementsKind(elements_kind)) {
3564 offset += FixedTypedArrayBase::kDataOffset - kHeapObjectTag;
3565 }
3552 int shift_size = element_shift_size; 3566 int shift_size = element_shift_size;
3553 if (key->IsConstantOperand()) { 3567 if (key->IsConstantOperand()) {
3554 int constant_value = ToInteger32(LConstantOperand::cast(key)); 3568 int constant_value = ToInteger32(LConstantOperand::cast(key));
3555 if (constant_value & 0xF0000000) { 3569 if (constant_value & 0xF0000000) {
3556 Abort(kArrayIndexConstantValueTooBig); 3570 Abort(kArrayIndexConstantValueTooBig);
3557 } 3571 }
3558 return Operand(elements_pointer_reg, 3572 return Operand(elements_pointer_reg,
3559 ((constant_value + additional_index) << shift_size) 3573 ((constant_value + additional_index) << shift_size)
3560 + offset); 3574 + offset);
3561 } else { 3575 } else {
(...skipping 978 matching lines...) Expand 10 before | Expand all | Expand 10 after
4540 elements_kind)) { 4554 elements_kind)) {
4541 __ SmiUntag(ToRegister(key)); 4555 __ SmiUntag(ToRegister(key));
4542 } 4556 }
4543 Operand operand(BuildFastArrayOperand( 4557 Operand operand(BuildFastArrayOperand(
4544 instr->elements(), 4558 instr->elements(),
4545 key, 4559 key,
4546 instr->hydrogen()->key()->representation(), 4560 instr->hydrogen()->key()->representation(),
4547 elements_kind, 4561 elements_kind,
4548 0, 4562 0,
4549 instr->additional_index())); 4563 instr->additional_index()));
4550 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { 4564 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
4565 elements_kind == FLOAT32_ELEMENTS) {
4551 if (CpuFeatures::IsSafeForSnapshot(SSE2)) { 4566 if (CpuFeatures::IsSafeForSnapshot(SSE2)) {
4552 CpuFeatureScope scope(masm(), SSE2); 4567 CpuFeatureScope scope(masm(), SSE2);
4553 XMMRegister xmm_scratch = double_scratch0(); 4568 XMMRegister xmm_scratch = double_scratch0();
4554 __ cvtsd2ss(xmm_scratch, ToDoubleRegister(instr->value())); 4569 __ cvtsd2ss(xmm_scratch, ToDoubleRegister(instr->value()));
4555 __ movss(operand, xmm_scratch); 4570 __ movss(operand, xmm_scratch);
4556 } else { 4571 } else {
4557 __ fld(0); 4572 __ fld(0);
4558 __ fstp_s(operand); 4573 __ fstp_s(operand);
4559 } 4574 }
4560 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 4575 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS ||
4576 elements_kind == FLOAT64_ELEMENTS) {
4561 if (CpuFeatures::IsSafeForSnapshot(SSE2)) { 4577 if (CpuFeatures::IsSafeForSnapshot(SSE2)) {
4562 CpuFeatureScope scope(masm(), SSE2); 4578 CpuFeatureScope scope(masm(), SSE2);
4563 __ movsd(operand, ToDoubleRegister(instr->value())); 4579 __ movsd(operand, ToDoubleRegister(instr->value()));
4564 } else { 4580 } else {
4565 X87Mov(operand, ToX87Register(instr->value())); 4581 X87Mov(operand, ToX87Register(instr->value()));
4566 } 4582 }
4567 } else { 4583 } else {
4568 Register value = ToRegister(instr->value()); 4584 Register value = ToRegister(instr->value());
4569 switch (elements_kind) { 4585 switch (elements_kind) {
4570 case EXTERNAL_PIXEL_ELEMENTS: 4586 case EXTERNAL_PIXEL_ELEMENTS:
4571 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 4587 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
4572 case EXTERNAL_BYTE_ELEMENTS: 4588 case EXTERNAL_BYTE_ELEMENTS:
4589 case UINT8_ELEMENTS:
4590 case INT8_ELEMENTS:
4591 case UINT8_CLAMPED_ELEMENTS:
4573 __ mov_b(operand, value); 4592 __ mov_b(operand, value);
4574 break; 4593 break;
4575 case EXTERNAL_SHORT_ELEMENTS: 4594 case EXTERNAL_SHORT_ELEMENTS:
4576 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 4595 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
4596 case UINT16_ELEMENTS:
4597 case INT16_ELEMENTS:
4577 __ mov_w(operand, value); 4598 __ mov_w(operand, value);
4578 break; 4599 break;
4579 case EXTERNAL_INT_ELEMENTS: 4600 case EXTERNAL_INT_ELEMENTS:
4580 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 4601 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
4602 case UINT32_ELEMENTS:
4603 case INT32_ELEMENTS:
4581 __ mov(operand, value); 4604 __ mov(operand, value);
4582 break; 4605 break;
4583 case EXTERNAL_FLOAT_ELEMENTS: 4606 case EXTERNAL_FLOAT_ELEMENTS:
4584 case EXTERNAL_DOUBLE_ELEMENTS: 4607 case EXTERNAL_DOUBLE_ELEMENTS:
4608 case FLOAT32_ELEMENTS:
4609 case FLOAT64_ELEMENTS:
4585 case FAST_SMI_ELEMENTS: 4610 case FAST_SMI_ELEMENTS:
4586 case FAST_ELEMENTS: 4611 case FAST_ELEMENTS:
4587 case FAST_DOUBLE_ELEMENTS: 4612 case FAST_DOUBLE_ELEMENTS:
4588 case FAST_HOLEY_SMI_ELEMENTS: 4613 case FAST_HOLEY_SMI_ELEMENTS:
4589 case FAST_HOLEY_ELEMENTS: 4614 case FAST_HOLEY_ELEMENTS:
4590 case FAST_HOLEY_DOUBLE_ELEMENTS: 4615 case FAST_HOLEY_DOUBLE_ELEMENTS:
4591 case DICTIONARY_ELEMENTS: 4616 case DICTIONARY_ELEMENTS:
4592 case NON_STRICT_ARGUMENTS_ELEMENTS: 4617 case NON_STRICT_ARGUMENTS_ELEMENTS:
4593 UNREACHABLE(); 4618 UNREACHABLE();
4594 break; 4619 break;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
4712 value, 4737 value,
4713 GetSaveFPRegsMode(), 4738 GetSaveFPRegsMode(),
4714 EMIT_REMEMBERED_SET, 4739 EMIT_REMEMBERED_SET,
4715 check_needed); 4740 check_needed);
4716 } 4741 }
4717 } 4742 }
4718 4743
4719 4744
4720 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { 4745 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) {
4721 // By cases...external, fast-double, fast 4746 // By cases...external, fast-double, fast
4722 if (instr->is_external()) { 4747 if (instr->is_external() || instr->is_fixed_typed_array()) {
4723 DoStoreKeyedExternalArray(instr); 4748 DoStoreKeyedExternalArray(instr);
4724 } else if (instr->hydrogen()->value()->representation().IsDouble()) { 4749 } else if (instr->hydrogen()->value()->representation().IsDouble()) {
4725 DoStoreKeyedFixedDoubleArray(instr); 4750 DoStoreKeyedFixedDoubleArray(instr);
4726 } else { 4751 } else {
4727 DoStoreKeyedFixedArray(instr); 4752 DoStoreKeyedFixedArray(instr);
4728 } 4753 }
4729 } 4754 }
4730 4755
4731 4756
4732 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { 4757 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
(...skipping 1627 matching lines...) Expand 10 before | Expand all | Expand 10 after
6360 FixedArray::kHeaderSize - kPointerSize)); 6385 FixedArray::kHeaderSize - kPointerSize));
6361 __ bind(&done); 6386 __ bind(&done);
6362 } 6387 }
6363 6388
6364 6389
6365 #undef __ 6390 #undef __
6366 6391
6367 } } // namespace v8::internal 6392 } } // namespace v8::internal
6368 6393
6369 #endif // V8_TARGET_ARCH_IA32 6394 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698