Index: src/ia32/codegen-ia32.cc |
=================================================================== |
--- src/ia32/codegen-ia32.cc (revision 2063) |
+++ src/ia32/codegen-ia32.cc (working copy) |
@@ -318,9 +318,7 @@ |
DeleteFrame(); |
// Process any deferred code using the register allocator. |
- if (HasStackOverflow()) { |
- ClearDeferred(); |
- } else { |
+ if (!HasStackOverflow()) { |
HistogramTimerScope deferred_timer(&Counters::deferred_code_generation); |
JumpTarget::set_compiling_deferred_code(true); |
ProcessDeferred(); |
@@ -784,11 +782,10 @@ |
// the GenericBinaryOpStub stub for slow cases. |
class DeferredInlineBinaryOperation: public DeferredCode { |
public: |
- DeferredInlineBinaryOperation(CodeGenerator* generator, |
- Token::Value op, |
+ DeferredInlineBinaryOperation(Token::Value op, |
OverwriteMode mode, |
GenericBinaryFlags flags) |
- : DeferredCode(generator), stub_(op, mode, flags), op_(op) { |
+ : stub_(op, mode, flags), op_(op) { |
set_comment("[ DeferredInlineBinaryOperation"); |
} |
@@ -807,9 +804,9 @@ |
Result left; |
Result right; |
enter()->Bind(&left, &right); |
- generator()->frame()->Push(&left); |
- generator()->frame()->Push(&right); |
- Result answer = generator()->frame()->CallStub(&stub_, 2); |
+ cgen()->frame()->Push(&left); |
+ cgen()->frame()->Push(&right); |
+ Result answer = cgen()->frame()->CallStub(&stub_, 2); |
exit_.Jump(&answer); |
} |
@@ -1013,8 +1010,7 @@ |
// Implements a binary operation using a deferred code object |
// and some inline code to operate on smis quickly. |
DeferredInlineBinaryOperation* deferred = |
- new DeferredInlineBinaryOperation(this, op, overwrite_mode, |
- SMI_CODE_INLINED); |
+ new DeferredInlineBinaryOperation(op, overwrite_mode, SMI_CODE_INLINED); |
// Generate the inline code that handles some smi operations, |
// and jumps to the deferred code for everything else. |
Result answer = deferred->GenerateInlineCode(left, right); |
@@ -1025,12 +1021,10 @@ |
class DeferredInlineSmiOperation: public DeferredCode { |
public: |
- DeferredInlineSmiOperation(CodeGenerator* generator, |
- Token::Value op, |
+ DeferredInlineSmiOperation(Token::Value op, |
Smi* value, |
OverwriteMode overwrite_mode) |
- : DeferredCode(generator), |
- op_(op), |
+ : op_(op), |
value_(value), |
overwrite_mode_(overwrite_mode) { |
set_comment("[ DeferredInlineSmiOperation"); |
@@ -1048,22 +1042,20 @@ |
void DeferredInlineSmiOperation::Generate() { |
Result left; |
enter()->Bind(&left); |
- generator()->frame()->Push(&left); |
- generator()->frame()->Push(value_); |
+ cgen()->frame()->Push(&left); |
+ cgen()->frame()->Push(value_); |
GenericBinaryOpStub igostub(op_, overwrite_mode_, SMI_CODE_INLINED); |
- Result answer = generator()->frame()->CallStub(&igostub, 2); |
+ Result answer = cgen()->frame()->CallStub(&igostub, 2); |
exit_.Jump(&answer); |
} |
class DeferredInlineSmiOperationReversed: public DeferredCode { |
public: |
- DeferredInlineSmiOperationReversed(CodeGenerator* generator, |
- Token::Value op, |
+ DeferredInlineSmiOperationReversed(Token::Value op, |
Smi* value, |
OverwriteMode overwrite_mode) |
- : DeferredCode(generator), |
- op_(op), |
+ : op_(op), |
value_(value), |
overwrite_mode_(overwrite_mode) { |
set_comment("[ DeferredInlineSmiOperationReversed"); |
@@ -1081,21 +1073,19 @@ |
void DeferredInlineSmiOperationReversed::Generate() { |
Result right; |
enter()->Bind(&right); |
- generator()->frame()->Push(value_); |
- generator()->frame()->Push(&right); |
+ cgen()->frame()->Push(value_); |
+ cgen()->frame()->Push(&right); |
GenericBinaryOpStub igostub(op_, overwrite_mode_, SMI_CODE_INLINED); |
- Result answer = generator()->frame()->CallStub(&igostub, 2); |
+ Result answer = cgen()->frame()->CallStub(&igostub, 2); |
exit_.Jump(&answer); |
} |
class DeferredInlineSmiAdd: public DeferredCode { |
public: |
- DeferredInlineSmiAdd(CodeGenerator* generator, |
- Smi* value, |
+ DeferredInlineSmiAdd(Smi* value, |
OverwriteMode overwrite_mode) |
- : DeferredCode(generator), |
- value_(value), |
+ : value_(value), |
overwrite_mode_(overwrite_mode) { |
set_comment("[ DeferredInlineSmiAdd"); |
} |
@@ -1108,28 +1098,11 @@ |
}; |
-void DeferredInlineSmiAdd::Generate() { |
- // Undo the optimistic add operation and call the shared stub. |
- Result left; // Initially left + value_. |
- enter()->Bind(&left); |
- left.ToRegister(); |
- generator()->frame()->Spill(left.reg()); |
- __ sub(Operand(left.reg()), Immediate(value_)); |
- generator()->frame()->Push(&left); |
- generator()->frame()->Push(value_); |
- GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_, SMI_CODE_INLINED); |
- Result answer = generator()->frame()->CallStub(&igostub, 2); |
- exit_.Jump(&answer); |
-} |
- |
- |
class DeferredInlineSmiAddReversed: public DeferredCode { |
public: |
- DeferredInlineSmiAddReversed(CodeGenerator* generator, |
- Smi* value, |
+ DeferredInlineSmiAddReversed(Smi* value, |
OverwriteMode overwrite_mode) |
- : DeferredCode(generator), |
- value_(value), |
+ : value_(value), |
overwrite_mode_(overwrite_mode) { |
set_comment("[ DeferredInlineSmiAddReversed"); |
} |
@@ -1142,28 +1115,11 @@ |
}; |
-void DeferredInlineSmiAddReversed::Generate() { |
- // Undo the optimistic add operation and call the shared stub. |
- Result right; // Initially value_ + right. |
- enter()->Bind(&right); |
- right.ToRegister(); |
- generator()->frame()->Spill(right.reg()); |
- __ sub(Operand(right.reg()), Immediate(value_)); |
- generator()->frame()->Push(value_); |
- generator()->frame()->Push(&right); |
- GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_, SMI_CODE_INLINED); |
- Result answer = generator()->frame()->CallStub(&igostub, 2); |
- exit_.Jump(&answer); |
-} |
- |
- |
class DeferredInlineSmiSub: public DeferredCode { |
public: |
- DeferredInlineSmiSub(CodeGenerator* generator, |
- Smi* value, |
+ DeferredInlineSmiSub(Smi* value, |
OverwriteMode overwrite_mode) |
- : DeferredCode(generator), |
- value_(value), |
+ : value_(value), |
overwrite_mode_(overwrite_mode) { |
set_comment("[ DeferredInlineSmiSub"); |
} |
@@ -1176,28 +1132,64 @@ |
}; |
+#undef __ |
+#define __ ACCESS_MASM(cgen()->masm()) |
+ |
+ |
+void DeferredInlineSmiAdd::Generate() { |
+ // Undo the optimistic add operation and call the shared stub. |
+ Result left; // Initially left + value_. |
+ enter()->Bind(&left); |
+ left.ToRegister(); |
+ cgen()->frame()->Spill(left.reg()); |
+ __ sub(Operand(left.reg()), Immediate(value_)); |
+ cgen()->frame()->Push(&left); |
+ cgen()->frame()->Push(value_); |
+ GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_, SMI_CODE_INLINED); |
+ Result answer = cgen()->frame()->CallStub(&igostub, 2); |
+ exit_.Jump(&answer); |
+} |
+ |
+ |
+void DeferredInlineSmiAddReversed::Generate() { |
+ // Undo the optimistic add operation and call the shared stub. |
+ Result right; // Initially value_ + right. |
+ enter()->Bind(&right); |
+ right.ToRegister(); |
+ cgen()->frame()->Spill(right.reg()); |
+ __ sub(Operand(right.reg()), Immediate(value_)); |
+ cgen()->frame()->Push(value_); |
+ cgen()->frame()->Push(&right); |
+ GenericBinaryOpStub igostub(Token::ADD, overwrite_mode_, SMI_CODE_INLINED); |
+ Result answer = cgen()->frame()->CallStub(&igostub, 2); |
+ exit_.Jump(&answer); |
+} |
+ |
+ |
void DeferredInlineSmiSub::Generate() { |
// Undo the optimistic sub operation and call the shared stub. |
Result left; // Initially left - value_. |
enter()->Bind(&left); |
left.ToRegister(); |
- generator()->frame()->Spill(left.reg()); |
+ cgen()->frame()->Spill(left.reg()); |
__ add(Operand(left.reg()), Immediate(value_)); |
- generator()->frame()->Push(&left); |
- generator()->frame()->Push(value_); |
+ cgen()->frame()->Push(&left); |
+ cgen()->frame()->Push(value_); |
GenericBinaryOpStub igostub(Token::SUB, overwrite_mode_, SMI_CODE_INLINED); |
- Result answer = generator()->frame()->CallStub(&igostub, 2); |
+ Result answer = cgen()->frame()->CallStub(&igostub, 2); |
exit_.Jump(&answer); |
} |
+#undef __ |
+#define __ ACCESS_MASM(masm_) |
+ |
+ |
class DeferredInlineSmiSubReversed: public DeferredCode { |
public: |
- DeferredInlineSmiSubReversed(CodeGenerator* generator, |
- Smi* value, |
+ DeferredInlineSmiSubReversed(Smi* value, |
OverwriteMode overwrite_mode) |
- : DeferredCode(generator), |
- value_(value), |
+ : value_(value), |
overwrite_mode_(overwrite_mode) { |
set_comment("[ DeferredInlineSmiSubReversed"); |
} |
@@ -1214,10 +1206,10 @@ |
// Call the shared stub. |
Result right; |
enter()->Bind(&right); |
- generator()->frame()->Push(value_); |
- generator()->frame()->Push(&right); |
+ cgen()->frame()->Push(value_); |
+ cgen()->frame()->Push(&right); |
GenericBinaryOpStub igostub(Token::SUB, overwrite_mode_, SMI_CODE_INLINED); |
- Result answer = generator()->frame()->CallStub(&igostub, 2); |
+ Result answer = cgen()->frame()->CallStub(&igostub, 2); |
exit_.Jump(&answer); |
} |
@@ -1260,10 +1252,9 @@ |
DeferredCode* deferred = NULL; |
if (reversed) { |
- deferred = new DeferredInlineSmiAddReversed(this, smi_value, |
- overwrite_mode); |
+ deferred = new DeferredInlineSmiAddReversed(smi_value, overwrite_mode); |
} else { |
- deferred = new DeferredInlineSmiAdd(this, smi_value, overwrite_mode); |
+ deferred = new DeferredInlineSmiAdd(smi_value, overwrite_mode); |
} |
deferred->SetEntryFrame(operand); |
deferred->enter()->Branch(overflow, operand, not_taken); |
@@ -1280,8 +1271,7 @@ |
if (reversed) { |
answer = allocator()->Allocate(); |
ASSERT(answer.is_valid()); |
- deferred = new DeferredInlineSmiSubReversed(this, smi_value, |
- overwrite_mode); |
+ deferred = new DeferredInlineSmiSubReversed(smi_value, overwrite_mode); |
__ Set(answer.reg(), Immediate(value)); |
// We are in the reversed case so they can't both be Smi constants. |
ASSERT(operand->is_register()); |
@@ -1289,7 +1279,7 @@ |
} else { |
operand->ToRegister(); |
frame_->Spill(operand->reg()); |
- deferred = new DeferredInlineSmiSub(this, smi_value, overwrite_mode); |
+ deferred = new DeferredInlineSmiSub(smi_value, overwrite_mode); |
__ sub(Operand(operand->reg()), Immediate(value)); |
answer = *operand; |
} |
@@ -1313,8 +1303,7 @@ |
// In the slow case, this masking is done inside the runtime call. |
int shift_value = int_value & 0x1f; |
DeferredCode* deferred = |
- new DeferredInlineSmiOperation(this, Token::SAR, smi_value, |
- overwrite_mode); |
+ new DeferredInlineSmiOperation(op, smi_value, overwrite_mode); |
operand->ToRegister(); |
__ test(operand->reg(), Immediate(kSmiTagMask)); |
deferred->enter()->Branch(not_zero, operand, not_taken); |
@@ -1339,8 +1328,7 @@ |
// In the slow case, this masking is done inside the runtime call. |
int shift_value = int_value & 0x1f; |
DeferredCode* deferred = |
- new DeferredInlineSmiOperation(this, Token::SHR, smi_value, |
- overwrite_mode); |
+ new DeferredInlineSmiOperation(op, smi_value, overwrite_mode); |
operand->ToRegister(); |
__ test(operand->reg(), Immediate(kSmiTagMask)); |
deferred->enter()->Branch(not_zero, operand, not_taken); |
@@ -1374,8 +1362,7 @@ |
// In the slow case, this masking is done inside the runtime call. |
int shift_value = int_value & 0x1f; |
DeferredCode* deferred = |
- new DeferredInlineSmiOperation(this, Token::SHL, smi_value, |
- overwrite_mode); |
+ new DeferredInlineSmiOperation(op, smi_value, overwrite_mode); |
operand->ToRegister(); |
__ test(operand->reg(), Immediate(kSmiTagMask)); |
deferred->enter()->Branch(not_zero, operand, not_taken); |
@@ -1408,10 +1395,10 @@ |
case Token::BIT_AND: { |
DeferredCode* deferred = NULL; |
if (reversed) { |
- deferred = new DeferredInlineSmiOperationReversed(this, op, smi_value, |
+ deferred = new DeferredInlineSmiOperationReversed(op, smi_value, |
overwrite_mode); |
} else { |
- deferred = new DeferredInlineSmiOperation(this, op, smi_value, |
+ deferred = new DeferredInlineSmiOperation(op, smi_value, |
overwrite_mode); |
} |
operand->ToRegister(); |
@@ -1697,8 +1684,7 @@ |
class DeferredStackCheck: public DeferredCode { |
public: |
- explicit DeferredStackCheck(CodeGenerator* generator) |
- : DeferredCode(generator) { |
+ explicit DeferredStackCheck() { |
set_comment("[ DeferredStackCheck"); |
} |
@@ -1709,7 +1695,7 @@ |
void DeferredStackCheck::Generate() { |
enter()->Bind(); |
StackCheckStub stub; |
- Result ignored = generator()->frame()->CallStub(&stub, 0); |
+ Result ignored = cgen()->frame()->CallStub(&stub, 0); |
ignored.Unuse(); |
exit_.Jump(); |
} |
@@ -1717,7 +1703,7 @@ |
void CodeGenerator::CheckStack() { |
if (FLAG_check_stack) { |
- DeferredStackCheck* deferred = new DeferredStackCheck(this); |
+ DeferredStackCheck* deferred = new DeferredStackCheck; |
ExternalReference stack_guard_limit = |
ExternalReference::address_of_stack_guard_limit(); |
__ cmp(esp, Operand::StaticVariable(stack_guard_limit)); |
@@ -3575,8 +3561,7 @@ |
class DeferredRegExpLiteral: public DeferredCode { |
public: |
- DeferredRegExpLiteral(CodeGenerator* generator, RegExpLiteral* node) |
- : DeferredCode(generator), node_(node) { |
+ DeferredRegExpLiteral(RegExpLiteral* node) : node_(node) { |
set_comment("[ DeferredRegExpLiteral"); |
} |
@@ -3593,7 +3578,7 @@ |
// Since the entry is undefined we call the runtime system to |
// compute the literal. |
- VirtualFrame* frame = generator()->frame(); |
+ VirtualFrame* frame = cgen()->frame(); |
// Literal array (0). |
frame->Push(&literals); |
// Literal index (1). |
@@ -3610,7 +3595,7 @@ |
void CodeGenerator::VisitRegExpLiteral(RegExpLiteral* node) { |
Comment cmnt(masm_, "[ RegExp Literal"); |
- DeferredRegExpLiteral* deferred = new DeferredRegExpLiteral(this, node); |
+ DeferredRegExpLiteral* deferred = new DeferredRegExpLiteral(node); |
// Retrieve the literals array and check the allocated entry. Begin |
// with a writable copy of the function of this activation in a |
@@ -3651,9 +3636,7 @@ |
// therefore context dependent. |
class DeferredObjectLiteral: public DeferredCode { |
public: |
- DeferredObjectLiteral(CodeGenerator* generator, |
- ObjectLiteral* node) |
- : DeferredCode(generator), node_(node) { |
+ DeferredObjectLiteral(ObjectLiteral* node) : node_(node) { |
set_comment("[ DeferredObjectLiteral"); |
} |
@@ -3670,7 +3653,7 @@ |
// Since the entry is undefined we call the runtime system to |
// compute the literal. |
- VirtualFrame* frame = generator()->frame(); |
+ VirtualFrame* frame = cgen()->frame(); |
// Literal array (0). |
frame->Push(&literals); |
// Literal index (1). |
@@ -3685,7 +3668,7 @@ |
void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { |
Comment cmnt(masm_, "[ ObjectLiteral"); |
- DeferredObjectLiteral* deferred = new DeferredObjectLiteral(this, node); |
+ DeferredObjectLiteral* deferred = new DeferredObjectLiteral(node); |
// Retrieve the literals array and check the allocated entry. Begin |
// with a writable copy of the function of this activation in a |
@@ -3789,9 +3772,7 @@ |
// therefore context dependent. |
class DeferredArrayLiteral: public DeferredCode { |
public: |
- DeferredArrayLiteral(CodeGenerator* generator, |
- ArrayLiteral* node) |
- : DeferredCode(generator), node_(node) { |
+ DeferredArrayLiteral(ArrayLiteral* node) : node_(node) { |
set_comment("[ DeferredArrayLiteral"); |
} |
@@ -3808,7 +3789,7 @@ |
// Since the entry is undefined we call the runtime system to |
// compute the literal. |
- VirtualFrame* frame = generator()->frame(); |
+ VirtualFrame* frame = cgen()->frame(); |
// Literal array (0). |
frame->Push(&literals); |
// Literal index (1). |
@@ -3823,7 +3804,7 @@ |
void CodeGenerator::VisitArrayLiteral(ArrayLiteral* node) { |
Comment cmnt(masm_, "[ ArrayLiteral"); |
- DeferredArrayLiteral* deferred = new DeferredArrayLiteral(this, node); |
+ DeferredArrayLiteral* deferred = new DeferredArrayLiteral(node); |
// Retrieve the literals array and check the allocated entry. Begin |
// with a writable copy of the function of this activation in a |
@@ -4778,12 +4759,10 @@ |
class DeferredCountOperation: public DeferredCode { |
public: |
- DeferredCountOperation(CodeGenerator* generator, |
- bool is_postfix, |
+ DeferredCountOperation(bool is_postfix, |
bool is_increment, |
int target_size) |
- : DeferredCode(generator), |
- is_postfix_(is_postfix), |
+ : is_postfix_(is_postfix), |
is_increment_(is_increment), |
target_size_(target_size) { |
set_comment("[ DeferredCountOperation"); |
@@ -4798,11 +4777,14 @@ |
}; |
+#undef __ |
+#define __ ACCESS_MASM(cgen()->masm()) |
+ |
+ |
void DeferredCountOperation::Generate() { |
- CodeGenerator* cgen = generator(); |
Result value; |
enter()->Bind(&value); |
- VirtualFrame* frame = cgen->frame(); |
+ VirtualFrame* frame = cgen()->frame(); |
// Undo the optimistic smi operation. |
value.ToRegister(); |
frame->Spill(value.reg()); |
@@ -4830,6 +4812,10 @@ |
} |
+#undef __ |
+#define __ ACCESS_MASM(masm_) |
+ |
+ |
void CodeGenerator::VisitCountOperation(CountOperation* node) { |
Comment cmnt(masm_, "[ CountOperation"); |
@@ -4857,8 +4843,7 @@ |
target.TakeValue(NOT_INSIDE_TYPEOF); |
DeferredCountOperation* deferred = |
- new DeferredCountOperation(this, is_postfix, |
- is_increment, target.size()); |
+ new DeferredCountOperation(is_postfix, is_increment, target.size()); |
Result value = frame_->Pop(); |
value.ToRegister(); |
@@ -5282,8 +5267,7 @@ |
class DeferredReferenceGetNamedValue: public DeferredCode { |
public: |
- DeferredReferenceGetNamedValue(CodeGenerator* cgen, Handle<String> name) |
- : DeferredCode(cgen), name_(name) { |
+ DeferredReferenceGetNamedValue(Handle<String> name) : name_(name) { |
set_comment("[ DeferredReferenceGetNamedValue"); |
} |
@@ -5297,35 +5281,9 @@ |
}; |
-void DeferredReferenceGetNamedValue::Generate() { |
- CodeGenerator* cgen = generator(); |
- Result receiver; |
- enter()->Bind(&receiver); |
- |
- cgen->frame()->Push(&receiver); |
- cgen->frame()->Push(name_); |
- Result answer = cgen->frame()->CallLoadIC(RelocInfo::CODE_TARGET); |
- // The call must be followed by a test eax instruction to indicate |
- // that the inobject property case was inlined. |
- ASSERT(answer.is_register() && answer.reg().is(eax)); |
- // Store the delta to the map check instruction here in the test instruction. |
- // Use masm_-> instead of the double underscore macro since the latter can't |
- // return a value. |
- int delta_to_patch_site = masm_->SizeOfCodeGeneratedSince(patch_site()); |
- // Here we use masm_-> instead of the double underscore macro because |
- // this is the instruction that gets patched and coverage code gets in |
- // the way. |
- masm_->test(answer.reg(), Immediate(-delta_to_patch_site)); |
- __ IncrementCounter(&Counters::named_load_inline_miss, 1); |
- receiver = cgen->frame()->Pop(); |
- exit_.Jump(&receiver, &answer); |
-} |
- |
- |
class DeferredReferenceGetKeyedValue: public DeferredCode { |
public: |
- DeferredReferenceGetKeyedValue(CodeGenerator* generator, bool is_global) |
- : DeferredCode(generator), is_global_(is_global) { |
+ DeferredReferenceGetKeyedValue(bool is_global) : is_global_(is_global) { |
set_comment("[ DeferredReferenceGetKeyedValue"); |
} |
@@ -5339,13 +5297,41 @@ |
}; |
+#undef __ |
+#define __ ACCESS_MASM(cgen()->masm()) |
+ |
+ |
+void DeferredReferenceGetNamedValue::Generate() { |
+ Result receiver; |
+ enter()->Bind(&receiver); |
+ |
+ cgen()->frame()->Push(&receiver); |
+ cgen()->frame()->Push(name_); |
+ Result answer = cgen()->frame()->CallLoadIC(RelocInfo::CODE_TARGET); |
+ // The call must be followed by a test eax instruction to indicate |
+ // that the inobject property case was inlined. |
+ ASSERT(answer.is_register() && answer.reg().is(eax)); |
+ // Store the delta to the map check instruction here in the test |
+ // instruction. Use cgen()->masm()-> instead of the __ macro since |
+ // the latter can't return a value. |
+ int delta_to_patch_site = |
+ cgen()->masm()->SizeOfCodeGeneratedSince(patch_site()); |
+ // Here we use cgen()->masm()-> instead of the __ macro because this |
+ // is the instruction that gets patched and coverage code gets in the |
+ // way. |
+ cgen()->masm()->test(answer.reg(), Immediate(-delta_to_patch_site)); |
+ __ IncrementCounter(&Counters::named_load_inline_miss, 1); |
+ receiver = cgen()->frame()->Pop(); |
+ exit_.Jump(&receiver, &answer); |
+} |
+ |
+ |
void DeferredReferenceGetKeyedValue::Generate() { |
- CodeGenerator* cgen = generator(); |
Result receiver; |
Result key; |
enter()->Bind(&receiver, &key); |
- cgen->frame()->Push(&receiver); // First IC argument. |
- cgen->frame()->Push(&key); // Second IC argument. |
+ cgen()->frame()->Push(&receiver); // First IC argument. |
+ cgen()->frame()->Push(&key); // Second IC argument. |
// Calculate the delta from the IC call instruction to the map check |
// cmp instruction in the inlined version. This delta is stored in |
@@ -5356,28 +5342,30 @@ |
RelocInfo::Mode mode = is_global_ |
? RelocInfo::CODE_TARGET_CONTEXT |
: RelocInfo::CODE_TARGET; |
- Result value = cgen->frame()->CallKeyedLoadIC(mode); |
+ Result value = cgen()->frame()->CallKeyedLoadIC(mode); |
// The result needs to be specifically the eax register because the |
// offset to the patch site will be expected in a test eax |
// instruction. |
ASSERT(value.is_register() && value.reg().is(eax)); |
- // The delta from the start of the map-compare instruction to the |
- // test instruction. We use masm_ directly here instead of the |
- // 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()); |
- // Here we use masm_-> instead of the double underscore macro because this |
- // is the instruction that gets patched and coverage code gets in the way. |
- masm_->test(value.reg(), Immediate(-delta_to_patch_site)); |
+ // The delta from the start of the map-compare instruction to the test |
+ // instruction. We use cgen()->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. |
+ int delta_to_patch_site = |
+ cgen()->masm()->SizeOfCodeGeneratedSince(patch_site()); |
+ // Here we use cgen()->masm()-> instead of the __ macro because this |
+ // is the instruction that gets patched and coverage code gets in the |
+ // way. |
+ cgen()->masm()->test(value.reg(), Immediate(-delta_to_patch_site)); |
__ IncrementCounter(&Counters::keyed_load_inline_miss, 1); |
// The receiver and key were spilled by the call, so their state as |
// constants or copies has been changed. Thus, they need to be |
// "mergable" in the block at the exit label and are therefore |
// passed as return results here. |
- key = cgen->frame()->Pop(); |
- receiver = cgen->frame()->Pop(); |
+ key = cgen()->frame()->Pop(); |
+ receiver = cgen()->frame()->Pop(); |
exit_.Jump(&receiver, &key, &value); |
} |
@@ -5450,7 +5438,7 @@ |
// Inline the inobject property case. |
Comment cmnt(masm, "[ Inlined named property load"); |
DeferredReferenceGetNamedValue* deferred = |
- new DeferredReferenceGetNamedValue(cgen_, GetName()); |
+ new DeferredReferenceGetNamedValue(GetName()); |
Result receiver = cgen_->frame()->Pop(); |
receiver.ToRegister(); |
@@ -5515,7 +5503,7 @@ |
if (cgen_->loop_nesting() > 0) { |
Comment cmnt(masm, "[ Inlined array index load"); |
DeferredReferenceGetKeyedValue* deferred = |
- new DeferredReferenceGetKeyedValue(cgen_, is_global); |
+ new DeferredReferenceGetKeyedValue(is_global); |
Result key = cgen_->frame()->Pop(); |
Result receiver = cgen_->frame()->Pop(); |
@@ -5743,11 +5731,9 @@ |
} |
-#undef __ |
-#define __ ACCESS_MASM(masm_) |
- |
Result DeferredInlineBinaryOperation::GenerateInlineCode(Result* left, |
Result* right) { |
+ MacroAssembler* masm = cgen()->masm(); |
// Perform fast-case smi code for the operation (left <op> right) and |
// returns the result in a Result. |
// If any fast-case tests fail, it jumps to the slow-case deferred code, |
@@ -5761,7 +5747,7 @@ |
// A newly allocated register answer is used to hold the answer. |
// The registers containing left and right are not modified in |
// most cases, so they usually don't need to be spilled in the fast case. |
- Result answer = generator()->allocator()->Allocate(); |
+ Result answer = cgen()->allocator()->Allocate(); |
ASSERT(answer.is_valid()); |
// Perform the smi check. |
@@ -5832,8 +5818,8 @@ |
// from left and right, and is spilled. |
// The value in left is copied to answer. |
- Result reg_eax = generator()->allocator()->Allocate(eax); |
- Result reg_edx = generator()->allocator()->Allocate(edx); |
+ Result reg_eax = cgen()->allocator()->Allocate(eax); |
+ Result reg_edx = cgen()->allocator()->Allocate(edx); |
// These allocations may have failed, if one of left, right, or answer |
// is in register eax or edx. |
bool left_copied_to_eax = false; // We will make sure this becomes true. |
@@ -5847,7 +5833,7 @@ |
// We use answer if it is not edx, otherwise we allocate one. |
if (answer.reg().is(edx)) { |
reg_edx = answer; |
- answer = generator()->allocator()->Allocate(); |
+ answer = cgen()->allocator()->Allocate(); |
ASSERT(answer.is_valid()); |
} |
@@ -5878,7 +5864,7 @@ |
// Is answer used? |
if (answer.reg().is(eax) || answer.reg().is(left->reg()) || |
answer.reg().is(right->reg())) { |
- answer = generator()->allocator()->Allocate(); |
+ answer = cgen()->allocator()->Allocate(); |
ASSERT(answer.is_valid()); // We cannot hit both Allocate() calls. |
} |
if (left->reg().is(edx)) { |
@@ -5897,12 +5883,12 @@ |
ASSERT(!right->reg().is(eax)); |
answer = reg_eax; // May free answer, if it was never used. |
- generator()->frame()->Spill(eax); |
+ cgen()->frame()->Spill(eax); |
if (!left_copied_to_eax) { |
__ mov(eax, left->reg()); |
left_copied_to_eax = true; |
} |
- generator()->frame()->Spill(edx); |
+ cgen()->frame()->Spill(edx); |
// Postcondition: |
// reg_eax, reg_edx are valid, correct, and spilled. |
@@ -5992,7 +5978,7 @@ |
// spilling left. |
*left = answer; |
} else if (left->reg().is(ecx)) { |
- generator()->frame()->Spill(left->reg()); |
+ cgen()->frame()->Spill(left->reg()); |
__ mov(left->reg(), right->reg()); |
*right = *left; |
*left = answer; // Use copy of left in answer as left. |
@@ -6000,7 +5986,7 @@ |
__ mov(answer.reg(), right->reg()); |
*right = answer; |
} else { |
- Result reg_ecx = generator()->allocator()->Allocate(ecx); |
+ Result reg_ecx = cgen()->allocator()->Allocate(ecx); |
ASSERT(reg_ecx.is_valid()); |
__ mov(ecx, right->reg()); |
*right = reg_ecx; |
@@ -6018,8 +6004,8 @@ |
// the same answer. |
// We are modifying left and right. They must be spilled! |
- generator()->frame()->Spill(left->reg()); |
- generator()->frame()->Spill(right->reg()); |
+ cgen()->frame()->Spill(left->reg()); |
+ cgen()->frame()->Spill(right->reg()); |
// Remove tags from operands (but keep sign). |
__ sar(left->reg(), kSmiTagSize); |
@@ -6089,9 +6075,6 @@ |
} |
-#undef __ |
-#define __ ACCESS_MASM(masm) |
- |
void GenericBinaryOpStub::GenerateSmiCode(MacroAssembler* masm, Label* slow) { |
// Perform fast-case smi code for the operation (eax <op> ebx) and |
// leave result in register eax. |