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

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

Issue 307903002: X87: Refactor HType to get rid of various hacks. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 6 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
« no previous file with comments | « no previous file | src/x87/lithium-x87.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 "v8.h" 5 #include "v8.h"
6 6
7 #if V8_TARGET_ARCH_X87 7 #if V8_TARGET_ARCH_X87
8 8
9 #include "x87/lithium-codegen-x87.h" 9 #include "x87/lithium-codegen-x87.h"
10 #include "ic.h" 10 #include "ic.h"
(...skipping 2515 matching lines...) Expand 10 before | Expand all | Expand 10 after
2526 2526
2527 return cond; 2527 return cond;
2528 } 2528 }
2529 2529
2530 2530
2531 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) { 2531 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) {
2532 Register reg = ToRegister(instr->value()); 2532 Register reg = ToRegister(instr->value());
2533 Register temp = ToRegister(instr->temp()); 2533 Register temp = ToRegister(instr->temp());
2534 2534
2535 SmiCheck check_needed = 2535 SmiCheck check_needed =
2536 instr->hydrogen()->value()->IsHeapObject() 2536 instr->hydrogen()->value()->type().IsHeapObject()
2537 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 2537 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
2538 2538
2539 Condition true_cond = EmitIsString( 2539 Condition true_cond = EmitIsString(
2540 reg, temp, instr->FalseLabel(chunk_), check_needed); 2540 reg, temp, instr->FalseLabel(chunk_), check_needed);
2541 2541
2542 EmitBranch(instr, true_cond); 2542 EmitBranch(instr, true_cond);
2543 } 2543 }
2544 2544
2545 2545
2546 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { 2546 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
2547 Operand input = ToOperand(instr->value()); 2547 Operand input = ToOperand(instr->value());
2548 2548
2549 __ test(input, Immediate(kSmiTagMask)); 2549 __ test(input, Immediate(kSmiTagMask));
2550 EmitBranch(instr, zero); 2550 EmitBranch(instr, zero);
2551 } 2551 }
2552 2552
2553 2553
2554 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { 2554 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) {
2555 Register input = ToRegister(instr->value()); 2555 Register input = ToRegister(instr->value());
2556 Register temp = ToRegister(instr->temp()); 2556 Register temp = ToRegister(instr->temp());
2557 2557
2558 if (!instr->hydrogen()->value()->IsHeapObject()) { 2558 if (!instr->hydrogen()->value()->type().IsHeapObject()) {
2559 STATIC_ASSERT(kSmiTag == 0); 2559 STATIC_ASSERT(kSmiTag == 0);
2560 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); 2560 __ JumpIfSmi(input, instr->FalseLabel(chunk_));
2561 } 2561 }
2562 __ mov(temp, FieldOperand(input, HeapObject::kMapOffset)); 2562 __ mov(temp, FieldOperand(input, HeapObject::kMapOffset));
2563 __ test_b(FieldOperand(temp, Map::kBitFieldOffset), 2563 __ test_b(FieldOperand(temp, Map::kBitFieldOffset),
2564 1 << Map::kIsUndetectable); 2564 1 << Map::kIsUndetectable);
2565 EmitBranch(instr, not_zero); 2565 EmitBranch(instr, not_zero);
2566 } 2566 }
2567 2567
2568 2568
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2616 if (from == FIRST_TYPE) return below_equal; 2616 if (from == FIRST_TYPE) return below_equal;
2617 UNREACHABLE(); 2617 UNREACHABLE();
2618 return equal; 2618 return equal;
2619 } 2619 }
2620 2620
2621 2621
2622 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { 2622 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) {
2623 Register input = ToRegister(instr->value()); 2623 Register input = ToRegister(instr->value());
2624 Register temp = ToRegister(instr->temp()); 2624 Register temp = ToRegister(instr->temp());
2625 2625
2626 if (!instr->hydrogen()->value()->IsHeapObject()) { 2626 if (!instr->hydrogen()->value()->type().IsHeapObject()) {
2627 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); 2627 __ JumpIfSmi(input, instr->FalseLabel(chunk_));
2628 } 2628 }
2629 2629
2630 __ CmpObjectType(input, TestType(instr->hydrogen()), temp); 2630 __ CmpObjectType(input, TestType(instr->hydrogen()), temp);
2631 EmitBranch(instr, BranchCondition(instr->hydrogen())); 2631 EmitBranch(instr, BranchCondition(instr->hydrogen()));
2632 } 2632 }
2633 2633
2634 2634
2635 void LCodeGen::DoGetCachedArrayIndex(LGetCachedArrayIndex* instr) { 2635 void LCodeGen::DoGetCachedArrayIndex(LGetCachedArrayIndex* instr) {
2636 Register input = ToRegister(instr->value()); 2636 Register input = ToRegister(instr->value());
(...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after
3022 if (instr->hydrogen()->DeoptimizesOnHole()) { 3022 if (instr->hydrogen()->DeoptimizesOnHole()) {
3023 DeoptimizeIf(equal, instr->environment()); 3023 DeoptimizeIf(equal, instr->environment());
3024 } else { 3024 } else {
3025 __ j(not_equal, &skip_assignment, Label::kNear); 3025 __ j(not_equal, &skip_assignment, Label::kNear);
3026 } 3026 }
3027 } 3027 }
3028 3028
3029 __ mov(target, value); 3029 __ mov(target, value);
3030 if (instr->hydrogen()->NeedsWriteBarrier()) { 3030 if (instr->hydrogen()->NeedsWriteBarrier()) {
3031 SmiCheck check_needed = 3031 SmiCheck check_needed =
3032 instr->hydrogen()->value()->IsHeapObject() 3032 instr->hydrogen()->value()->type().IsHeapObject()
3033 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 3033 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
3034 Register temp = ToRegister(instr->temp()); 3034 Register temp = ToRegister(instr->temp());
3035 int offset = Context::SlotOffset(instr->slot_index()); 3035 int offset = Context::SlotOffset(instr->slot_index());
3036 __ RecordWriteContextSlot(context, 3036 __ RecordWriteContextSlot(context,
3037 offset, 3037 offset,
3038 value, 3038 value,
3039 temp, 3039 temp,
3040 EMIT_REMEMBERED_SET, 3040 EMIT_REMEMBERED_SET,
3041 check_needed); 3041 check_needed);
3042 } 3042 }
(...skipping 1097 matching lines...) Expand 10 before | Expand all | Expand 10 after
4140 Handle<Object> handle_value = ToHandle(operand_value); 4140 Handle<Object> handle_value = ToHandle(operand_value);
4141 __ mov(operand, handle_value); 4141 __ mov(operand, handle_value);
4142 } 4142 }
4143 } 4143 }
4144 4144
4145 if (instr->hydrogen()->NeedsWriteBarrier()) { 4145 if (instr->hydrogen()->NeedsWriteBarrier()) {
4146 ASSERT(instr->value()->IsRegister()); 4146 ASSERT(instr->value()->IsRegister());
4147 Register value = ToRegister(instr->value()); 4147 Register value = ToRegister(instr->value());
4148 ASSERT(!instr->key()->IsConstantOperand()); 4148 ASSERT(!instr->key()->IsConstantOperand());
4149 SmiCheck check_needed = 4149 SmiCheck check_needed =
4150 instr->hydrogen()->value()->IsHeapObject() 4150 instr->hydrogen()->value()->type().IsHeapObject()
4151 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 4151 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
4152 // Compute address of modified element and store it into key register. 4152 // Compute address of modified element and store it into key register.
4153 __ lea(key, operand); 4153 __ lea(key, operand);
4154 __ RecordWrite(elements, 4154 __ RecordWrite(elements,
4155 key, 4155 key,
4156 value, 4156 value,
4157 EMIT_REMEMBERED_SET, 4157 EMIT_REMEMBERED_SET,
4158 check_needed); 4158 check_needed);
4159 } 4159 }
4160 } 4160 }
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after
4821 4821
4822 4822
4823 void LCodeGen::DoCheckSmi(LCheckSmi* instr) { 4823 void LCodeGen::DoCheckSmi(LCheckSmi* instr) {
4824 LOperand* input = instr->value(); 4824 LOperand* input = instr->value();
4825 __ test(ToOperand(input), Immediate(kSmiTagMask)); 4825 __ test(ToOperand(input), Immediate(kSmiTagMask));
4826 DeoptimizeIf(not_zero, instr->environment()); 4826 DeoptimizeIf(not_zero, instr->environment());
4827 } 4827 }
4828 4828
4829 4829
4830 void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) { 4830 void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) {
4831 if (!instr->hydrogen()->value()->IsHeapObject()) { 4831 if (!instr->hydrogen()->value()->type().IsHeapObject()) {
4832 LOperand* input = instr->value(); 4832 LOperand* input = instr->value();
4833 __ test(ToOperand(input), Immediate(kSmiTagMask)); 4833 __ test(ToOperand(input), Immediate(kSmiTagMask));
4834 DeoptimizeIf(zero, instr->environment()); 4834 DeoptimizeIf(zero, instr->environment());
4835 } 4835 }
4836 } 4836 }
4837 4837
4838 4838
4839 void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) { 4839 void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) {
4840 Register input = ToRegister(instr->value()); 4840 Register input = ToRegister(instr->value());
4841 Register temp = ToRegister(instr->temp()); 4841 Register temp = ToRegister(instr->temp());
(...skipping 849 matching lines...) Expand 10 before | Expand all | Expand 10 after
5691 __ bind(deferred->exit()); 5691 __ bind(deferred->exit());
5692 __ bind(&done); 5692 __ bind(&done);
5693 } 5693 }
5694 5694
5695 5695
5696 #undef __ 5696 #undef __
5697 5697
5698 } } // namespace v8::internal 5698 } } // namespace v8::internal
5699 5699
5700 #endif // V8_TARGET_ARCH_X87 5700 #endif // V8_TARGET_ARCH_X87
OLDNEW
« no previous file with comments | « no previous file | src/x87/lithium-x87.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698