Index: src/ia32/codegen-ia32.h |
=================================================================== |
--- src/ia32/codegen-ia32.h (revision 4147) |
+++ src/ia32/codegen-ia32.h (working copy) |
@@ -357,6 +357,23 @@ |
// State |
ControlDestination* destination() const { return state_->destination(); } |
+ // Control of side-effect-free int32 expression compilation. |
+ bool in_safe_int32_mode() { return in_safe_int32_mode_; } |
+ void set_in_safe_int32_mode(bool value) { in_safe_int32_mode_ = value; } |
+ bool safe_int32_mode_enabled() { |
+ return FLAG_safe_int32_compiler && safe_int32_mode_enabled_; |
+ } |
+ void set_safe_int32_mode_enabled(bool value) { |
+ safe_int32_mode_enabled_ = value; |
+ } |
+ void set_unsafe_bailout(BreakTarget* unsafe_bailout) { |
+ unsafe_bailout_ = unsafe_bailout; |
+ } |
+ |
+ // Take the Result that is an untagged int32, and convert it to a tagged |
+ // Smi or HeapNumber. Remove the untagged_int32 flag from the result. |
+ void ConvertInt32ResultToNumber(Result* value); |
+ |
// Track loop nesting level. |
int loop_nesting() const { return loop_nesting_; } |
void IncrementLoopNesting() { loop_nesting_++; } |
@@ -413,7 +430,7 @@ |
return ContextOperand(esi, Context::GLOBAL_INDEX); |
} |
- void LoadCondition(Expression* x, |
+ void LoadCondition(Expression* expr, |
ControlDestination* destination, |
bool force_control); |
void Load(Expression* expr); |
@@ -425,6 +442,11 @@ |
// temporarily while the code generator is being transformed. |
void LoadAndSpill(Expression* expression); |
+ // Evaluate an expression and place its value on top of the frame, |
+ // using, or not using, the side-effect-free expression compiler. |
+ void LoadInSafeInt32Mode(Expression* expr, BreakTarget* unsafe_bailout); |
+ void LoadWithSafeInt32ModeDisabled(Expression* expr); |
+ |
// Read a value from a slot and leave it on top of the expression stack. |
Result LoadFromSlot(Slot* slot, TypeofState typeof_state); |
Result LoadFromSlotCheckForArguments(Slot* slot, TypeofState typeof_state); |
@@ -496,6 +518,12 @@ |
OverwriteMode overwrite_mode, |
bool no_negative_zero); |
+ |
+ // Emit code to perform a binary operation on two untagged int32 values. |
+ // The values are on top of the frame, and the result is pushed on the frame. |
+ void Int32BinaryOperation(BinaryOperation* node); |
+ |
+ |
void Comparison(AstNode* node, |
Condition cc, |
bool strict, |
@@ -642,10 +670,14 @@ |
RegisterAllocator* allocator_; |
CodeGenState* state_; |
int loop_nesting_; |
+ bool in_safe_int32_mode_; |
+ bool safe_int32_mode_enabled_; |
// Jump targets. |
// The target of the return from the function. |
BreakTarget function_return_; |
+ // The target of the bailout from a side-effect-free int32 subexpression. |
+ BreakTarget* unsafe_bailout_; |
// True if the function return is shadowed (ie, jumping to the target |
// function_return_ does not jump to the true function return, but rather |