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

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: Self-review Created 7 years 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 3397 matching lines...) Expand 10 before | Expand all | Expand 10 after
3408 elements_kind)) { 3408 elements_kind)) {
3409 __ SmiUntag(ToRegister(key)); 3409 __ SmiUntag(ToRegister(key));
3410 } 3410 }
3411 Operand operand(BuildFastArrayOperand( 3411 Operand operand(BuildFastArrayOperand(
3412 instr->elements(), 3412 instr->elements(),
3413 key, 3413 key,
3414 instr->hydrogen()->key()->representation(), 3414 instr->hydrogen()->key()->representation(),
3415 elements_kind, 3415 elements_kind,
3416 0, 3416 0,
3417 instr->additional_index())); 3417 instr->additional_index()));
3418 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { 3418 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
3419 elements_kind == FLOAT32_ELEMENTS) {
3419 if (CpuFeatures::IsSupported(SSE2)) { 3420 if (CpuFeatures::IsSupported(SSE2)) {
3420 CpuFeatureScope scope(masm(), SSE2); 3421 CpuFeatureScope scope(masm(), SSE2);
3421 XMMRegister result(ToDoubleRegister(instr->result())); 3422 XMMRegister result(ToDoubleRegister(instr->result()));
3422 __ movss(result, operand); 3423 __ movss(result, operand);
3423 __ cvtss2sd(result, result); 3424 __ cvtss2sd(result, result);
3424 } else { 3425 } else {
3425 X87Mov(ToX87Register(instr->result()), operand, kX87FloatOperand); 3426 X87Mov(ToX87Register(instr->result()), operand, kX87FloatOperand);
3426 } 3427 }
3427 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 3428 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS ||
3429 elements_kind == FLOAT64_ELEMENTS) {
3428 if (CpuFeatures::IsSupported(SSE2)) { 3430 if (CpuFeatures::IsSupported(SSE2)) {
3429 CpuFeatureScope scope(masm(), SSE2); 3431 CpuFeatureScope scope(masm(), SSE2);
3430 __ movsd(ToDoubleRegister(instr->result()), operand); 3432 __ movsd(ToDoubleRegister(instr->result()), operand);
3431 } else { 3433 } else {
3432 X87Mov(ToX87Register(instr->result()), operand); 3434 X87Mov(ToX87Register(instr->result()), operand);
3433 } 3435 }
3434 } else { 3436 } else {
3435 Register result(ToRegister(instr->result())); 3437 Register result(ToRegister(instr->result()));
3436 switch (elements_kind) { 3438 switch (elements_kind) {
3437 case EXTERNAL_BYTE_ELEMENTS: 3439 case EXTERNAL_BYTE_ELEMENTS:
3440 case INT8_ELEMENTS:
3438 __ movsx_b(result, operand); 3441 __ movsx_b(result, operand);
3439 break; 3442 break;
3440 case EXTERNAL_PIXEL_ELEMENTS: 3443 case EXTERNAL_PIXEL_ELEMENTS:
3441 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 3444 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3445 case UINT8_ELEMENTS:
3446 case UINT8_CLAMPED_ELEMENTS:
3442 __ movzx_b(result, operand); 3447 __ movzx_b(result, operand);
3443 break; 3448 break;
3444 case EXTERNAL_SHORT_ELEMENTS: 3449 case EXTERNAL_SHORT_ELEMENTS:
3450 case INT16_ELEMENTS:
3445 __ movsx_w(result, operand); 3451 __ movsx_w(result, operand);
3446 break; 3452 break;
3447 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 3453 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3454 case UINT16_ELEMENTS:
3448 __ movzx_w(result, operand); 3455 __ movzx_w(result, operand);
3449 break; 3456 break;
3450 case EXTERNAL_INT_ELEMENTS: 3457 case EXTERNAL_INT_ELEMENTS:
3458 case INT32_ELEMENTS:
3451 __ mov(result, operand); 3459 __ mov(result, operand);
3452 break; 3460 break;
3453 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 3461 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
3462 case UINT32_ELEMENTS:
3454 __ mov(result, operand); 3463 __ mov(result, operand);
3455 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { 3464 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) {
3456 __ test(result, Operand(result)); 3465 __ test(result, Operand(result));
3457 DeoptimizeIf(negative, instr->environment()); 3466 DeoptimizeIf(negative, instr->environment());
3458 } 3467 }
3459 break; 3468 break;
3460 case EXTERNAL_FLOAT_ELEMENTS: 3469 case EXTERNAL_FLOAT_ELEMENTS:
3461 case EXTERNAL_DOUBLE_ELEMENTS: 3470 case EXTERNAL_DOUBLE_ELEMENTS:
3471 case FLOAT32_ELEMENTS:
3472 case FLOAT64_ELEMENTS:
3462 case FAST_SMI_ELEMENTS: 3473 case FAST_SMI_ELEMENTS:
3463 case FAST_ELEMENTS: 3474 case FAST_ELEMENTS:
3464 case FAST_DOUBLE_ELEMENTS: 3475 case FAST_DOUBLE_ELEMENTS:
3465 case FAST_HOLEY_SMI_ELEMENTS: 3476 case FAST_HOLEY_SMI_ELEMENTS:
3466 case FAST_HOLEY_ELEMENTS: 3477 case FAST_HOLEY_ELEMENTS:
3467 case FAST_HOLEY_DOUBLE_ELEMENTS: 3478 case FAST_HOLEY_DOUBLE_ELEMENTS:
3468 case DICTIONARY_ELEMENTS: 3479 case DICTIONARY_ELEMENTS:
3469 case NON_STRICT_ARGUMENTS_ELEMENTS: 3480 case NON_STRICT_ARGUMENTS_ELEMENTS:
3470 UNREACHABLE(); 3481 UNREACHABLE();
3471 break; 3482 break;
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
3524 DeoptimizeIf(not_equal, instr->environment()); 3535 DeoptimizeIf(not_equal, instr->environment());
3525 } else { 3536 } else {
3526 __ cmp(result, factory()->the_hole_value()); 3537 __ cmp(result, factory()->the_hole_value());
3527 DeoptimizeIf(equal, instr->environment()); 3538 DeoptimizeIf(equal, instr->environment());
3528 } 3539 }
3529 } 3540 }
3530 } 3541 }
3531 3542
3532 3543
3533 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { 3544 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) {
3534 if (instr->is_external()) { 3545 if (instr->is_external() || instr->is_fixed_typed_array()) {
3535 DoLoadKeyedExternalArray(instr); 3546 DoLoadKeyedExternalArray(instr);
3536 } else if (instr->hydrogen()->representation().IsDouble()) { 3547 } else if (instr->hydrogen()->representation().IsDouble()) {
3537 DoLoadKeyedFixedDoubleArray(instr); 3548 DoLoadKeyedFixedDoubleArray(instr);
3538 } else { 3549 } else {
3539 DoLoadKeyedFixedArray(instr); 3550 DoLoadKeyedFixedArray(instr);
3540 } 3551 }
3541 } 3552 }
3542 3553
3543 3554
3544 Operand LCodeGen::BuildFastArrayOperand( 3555 Operand LCodeGen::BuildFastArrayOperand(
3545 LOperand* elements_pointer, 3556 LOperand* elements_pointer,
3546 LOperand* key, 3557 LOperand* key,
3547 Representation key_representation, 3558 Representation key_representation,
3548 ElementsKind elements_kind, 3559 ElementsKind elements_kind,
3549 uint32_t offset, 3560 uint32_t offset,
3550 uint32_t additional_index) { 3561 uint32_t additional_index) {
3551 Register elements_pointer_reg = ToRegister(elements_pointer); 3562 Register elements_pointer_reg = ToRegister(elements_pointer);
3552 int element_shift_size = ElementsKindToShiftSize(elements_kind); 3563 int element_shift_size = ElementsKindToShiftSize(elements_kind);
3564 if (IsFixedTypedArrayElementsKind(elements_kind)) {
3565 offset += FixedTypedArrayBase::kDataOffset - kHeapObjectTag;
3566 }
3553 int shift_size = element_shift_size; 3567 int shift_size = element_shift_size;
3554 if (key->IsConstantOperand()) { 3568 if (key->IsConstantOperand()) {
3555 int constant_value = ToInteger32(LConstantOperand::cast(key)); 3569 int constant_value = ToInteger32(LConstantOperand::cast(key));
3556 if (constant_value & 0xF0000000) { 3570 if (constant_value & 0xF0000000) {
3557 Abort(kArrayIndexConstantValueTooBig); 3571 Abort(kArrayIndexConstantValueTooBig);
3558 } 3572 }
3559 return Operand(elements_pointer_reg, 3573 return Operand(elements_pointer_reg,
3560 ((constant_value + additional_index) << shift_size) 3574 ((constant_value + additional_index) << shift_size)
3561 + offset); 3575 + offset);
3562 } else { 3576 } else {
(...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after
4543 elements_kind)) { 4557 elements_kind)) {
4544 __ SmiUntag(ToRegister(key)); 4558 __ SmiUntag(ToRegister(key));
4545 } 4559 }
4546 Operand operand(BuildFastArrayOperand( 4560 Operand operand(BuildFastArrayOperand(
4547 instr->elements(), 4561 instr->elements(),
4548 key, 4562 key,
4549 instr->hydrogen()->key()->representation(), 4563 instr->hydrogen()->key()->representation(),
4550 elements_kind, 4564 elements_kind,
4551 0, 4565 0,
4552 instr->additional_index())); 4566 instr->additional_index()));
4553 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { 4567 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS ||
4568 elements_kind == FLOAT32_ELEMENTS) {
4554 if (CpuFeatures::IsSafeForSnapshot(SSE2)) { 4569 if (CpuFeatures::IsSafeForSnapshot(SSE2)) {
4555 CpuFeatureScope scope(masm(), SSE2); 4570 CpuFeatureScope scope(masm(), SSE2);
4556 XMMRegister xmm_scratch = double_scratch0(); 4571 XMMRegister xmm_scratch = double_scratch0();
4557 __ cvtsd2ss(xmm_scratch, ToDoubleRegister(instr->value())); 4572 __ cvtsd2ss(xmm_scratch, ToDoubleRegister(instr->value()));
4558 __ movss(operand, xmm_scratch); 4573 __ movss(operand, xmm_scratch);
4559 } else { 4574 } else {
4560 __ fld(0); 4575 __ fld(0);
4561 __ fstp_s(operand); 4576 __ fstp_s(operand);
4562 } 4577 }
4563 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 4578 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS ||
4579 elements_kind == FLOAT64_ELEMENTS) {
4564 if (CpuFeatures::IsSafeForSnapshot(SSE2)) { 4580 if (CpuFeatures::IsSafeForSnapshot(SSE2)) {
4565 CpuFeatureScope scope(masm(), SSE2); 4581 CpuFeatureScope scope(masm(), SSE2);
4566 __ movsd(operand, ToDoubleRegister(instr->value())); 4582 __ movsd(operand, ToDoubleRegister(instr->value()));
4567 } else { 4583 } else {
4568 X87Mov(operand, ToX87Register(instr->value())); 4584 X87Mov(operand, ToX87Register(instr->value()));
4569 } 4585 }
4570 } else { 4586 } else {
4571 Register value = ToRegister(instr->value()); 4587 Register value = ToRegister(instr->value());
4572 switch (elements_kind) { 4588 switch (elements_kind) {
4573 case EXTERNAL_PIXEL_ELEMENTS: 4589 case EXTERNAL_PIXEL_ELEMENTS:
4574 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS: 4590 case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
4575 case EXTERNAL_BYTE_ELEMENTS: 4591 case EXTERNAL_BYTE_ELEMENTS:
4592 case UINT8_ELEMENTS:
4593 case INT8_ELEMENTS:
4594 case UINT8_CLAMPED_ELEMENTS:
4576 __ mov_b(operand, value); 4595 __ mov_b(operand, value);
4577 break; 4596 break;
4578 case EXTERNAL_SHORT_ELEMENTS: 4597 case EXTERNAL_SHORT_ELEMENTS:
4579 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS: 4598 case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
4599 case UINT16_ELEMENTS:
4600 case INT16_ELEMENTS:
4580 __ mov_w(operand, value); 4601 __ mov_w(operand, value);
4581 break; 4602 break;
4582 case EXTERNAL_INT_ELEMENTS: 4603 case EXTERNAL_INT_ELEMENTS:
4583 case EXTERNAL_UNSIGNED_INT_ELEMENTS: 4604 case EXTERNAL_UNSIGNED_INT_ELEMENTS:
4605 case UINT32_ELEMENTS:
4606 case INT32_ELEMENTS:
4584 __ mov(operand, value); 4607 __ mov(operand, value);
4585 break; 4608 break;
4586 case EXTERNAL_FLOAT_ELEMENTS: 4609 case EXTERNAL_FLOAT_ELEMENTS:
4587 case EXTERNAL_DOUBLE_ELEMENTS: 4610 case EXTERNAL_DOUBLE_ELEMENTS:
4611 case FLOAT32_ELEMENTS:
4612 case FLOAT64_ELEMENTS:
4588 case FAST_SMI_ELEMENTS: 4613 case FAST_SMI_ELEMENTS:
4589 case FAST_ELEMENTS: 4614 case FAST_ELEMENTS:
4590 case FAST_DOUBLE_ELEMENTS: 4615 case FAST_DOUBLE_ELEMENTS:
4591 case FAST_HOLEY_SMI_ELEMENTS: 4616 case FAST_HOLEY_SMI_ELEMENTS:
4592 case FAST_HOLEY_ELEMENTS: 4617 case FAST_HOLEY_ELEMENTS:
4593 case FAST_HOLEY_DOUBLE_ELEMENTS: 4618 case FAST_HOLEY_DOUBLE_ELEMENTS:
4594 case DICTIONARY_ELEMENTS: 4619 case DICTIONARY_ELEMENTS:
4595 case NON_STRICT_ARGUMENTS_ELEMENTS: 4620 case NON_STRICT_ARGUMENTS_ELEMENTS:
4596 UNREACHABLE(); 4621 UNREACHABLE();
4597 break; 4622 break;
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
4715 value, 4740 value,
4716 GetSaveFPRegsMode(), 4741 GetSaveFPRegsMode(),
4717 EMIT_REMEMBERED_SET, 4742 EMIT_REMEMBERED_SET,
4718 check_needed); 4743 check_needed);
4719 } 4744 }
4720 } 4745 }
4721 4746
4722 4747
4723 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { 4748 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) {
4724 // By cases...external, fast-double, fast 4749 // By cases...external, fast-double, fast
4725 if (instr->is_external()) { 4750 if (instr->is_external() || instr->is_fixed_typed_array()) {
4726 DoStoreKeyedExternalArray(instr); 4751 DoStoreKeyedExternalArray(instr);
4727 } else if (instr->hydrogen()->value()->representation().IsDouble()) { 4752 } else if (instr->hydrogen()->value()->representation().IsDouble()) {
4728 DoStoreKeyedFixedDoubleArray(instr); 4753 DoStoreKeyedFixedDoubleArray(instr);
4729 } else { 4754 } else {
4730 DoStoreKeyedFixedArray(instr); 4755 DoStoreKeyedFixedArray(instr);
4731 } 4756 }
4732 } 4757 }
4733 4758
4734 4759
4735 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { 4760 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
(...skipping 1627 matching lines...) Expand 10 before | Expand all | Expand 10 after
6363 FixedArray::kHeaderSize - kPointerSize)); 6388 FixedArray::kHeaderSize - kPointerSize));
6364 __ bind(&done); 6389 __ bind(&done);
6365 } 6390 }
6366 6391
6367 6392
6368 #undef __ 6393 #undef __
6369 6394
6370 } } // namespace v8::internal 6395 } } // namespace v8::internal
6371 6396
6372 #endif // V8_TARGET_ARCH_IA32 6397 #endif // V8_TARGET_ARCH_IA32
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698