Index: src/codegen-ia32.cc |
=================================================================== |
--- src/codegen-ia32.cc (revision 1760) |
+++ src/codegen-ia32.cc (working copy) |
@@ -1274,12 +1274,9 @@ |
smi_value, |
overwrite_mode); |
__ Set(answer.reg(), Immediate(value)); |
- if (operand->is_register()) { |
- __ sub(answer.reg(), Operand(operand->reg())); |
- } else { |
- ASSERT(operand->is_constant()); |
- __ sub(Operand(answer.reg()), Immediate(operand->handle())); |
- } |
+ // We are in the reversed case so they can't both be Smi constants. |
+ ASSERT(operand->is_register()); |
+ __ sub(answer.reg(), Operand(operand->reg())); |
} else { |
operand->ToRegister(); |
frame_->Spill(operand->reg()); |
@@ -1374,23 +1371,28 @@ |
operand->ToRegister(); |
__ test(operand->reg(), Immediate(kSmiTagMask)); |
deferred->enter()->Branch(not_zero, operand, not_taken); |
- Result answer = allocator()->Allocate(); |
- ASSERT(answer.is_valid()); |
- __ mov(answer.reg(), operand->reg()); |
- ASSERT(kSmiTag == 0); // adjust code if not the case |
- // We do no shifts, only the Smi conversion, if shift_value is 1. |
- if (shift_value == 0) { |
- __ sar(answer.reg(), kSmiTagSize); |
- } else if (shift_value > 1) { |
- __ shl(answer.reg(), shift_value - 1); |
+ if (shift_value != 0) { |
+ Result answer = allocator()->Allocate(); |
+ ASSERT(answer.is_valid()); |
+ __ mov(answer.reg(), operand->reg()); |
+ ASSERT(kSmiTag == 0); // adjust code if not the case |
+ // We do no shifts, only the Smi conversion, if shift_value is 1. |
+ if (shift_value == 0) { |
+ __ sar(answer.reg(), kSmiTagSize); |
iposva
2009/04/28 16:52:24
Somehow I feel this will never be reached, and I a
Erik Corry
2009/04/28 18:05:49
Presumably you mean "and I am sure that". It has
|
+ } else if (shift_value > 1) { |
+ __ shl(answer.reg(), shift_value - 1); |
+ } |
+ // Convert int result to Smi, checking that it is in int range. |
+ ASSERT(kSmiTagSize == times_2); // adjust code if not the case |
+ __ add(answer.reg(), Operand(answer.reg())); |
+ deferred->enter()->Branch(overflow, operand, not_taken); |
+ operand->Unuse(); |
+ deferred->BindExit(&answer); |
+ frame_->Push(&answer); |
+ } else { |
+ deferred->BindExit(operand); |
+ frame_->Push(operand); |
} |
- // Convert int result to Smi, checking that it is in int range. |
- ASSERT(kSmiTagSize == times_2); // adjust code if not the case |
- __ add(answer.reg(), Operand(answer.reg())); |
- deferred->enter()->Branch(overflow, operand, not_taken); |
- operand->Unuse(); |
- deferred->BindExit(&answer); |
- frame_->Push(&answer); |
} |
break; |
} |
@@ -1411,11 +1413,7 @@ |
deferred->enter()->Branch(not_zero, operand, not_taken); |
frame_->Spill(operand->reg()); |
if (op == Token::BIT_AND) { |
- if (int_value == 0) { |
- __ xor_(Operand(operand->reg()), operand->reg()); |
- } else { |
- __ and_(Operand(operand->reg()), Immediate(value)); |
- } |
+ __ and_(Operand(operand->reg()), Immediate(value)); |
} else if (op == Token::BIT_XOR) { |
if (int_value != 0) { |
__ xor_(Operand(operand->reg()), Immediate(value)); |
@@ -5278,9 +5276,9 @@ |
ASSERT(value.is_register() && value.reg().is(eax)); |
// The delta from the start of the map-compare instruction to the |
// test eax instruction. We use masm_ directly here instead of the |
- // __ macro because the __ macro sometimes uses macro expansion to turn |
- // into something that can't return a value. This is encountered when |
- // doing generated code coverage tests. |
+ // double underscore macro because the macro sometimes uses macro |
+ // expansion to turn into something that can't return a value. This |
+ // is encountered when doing generated code coverage tests. |
int delta_to_patch_site = masm_->SizeOfCodeGeneratedSince(patch_site()); |
__ test(value.reg(), Immediate(-delta_to_patch_site)); |
__ IncrementCounter(&Counters::keyed_load_inline_miss, 1); |
@@ -5381,7 +5379,9 @@ |
// Initially, use an invalid map. The map is patched in the IC |
// initialization code. |
__ bind(deferred->patch_site()); |
- __ cmp(FieldOperand(receiver.reg(), HeapObject::kMapOffset), |
+ // Use masm-> here instead of the double underscore macro since extra |
+ // coverage code can interfere with the patching. |
+ masm->cmp(FieldOperand(receiver.reg(), HeapObject::kMapOffset), |
Immediate(Factory::null_value())); |
deferred->enter()->Branch(not_equal, &receiver, &key, not_taken); |