| Index: src/ia32/lithium-ia32.h
|
| ===================================================================
|
| --- src/ia32/lithium-ia32.h (revision 16062)
|
| +++ src/ia32/lithium-ia32.h (working copy)
|
| @@ -210,7 +210,10 @@
|
| LInstruction()
|
| : environment_(NULL),
|
| hydrogen_value_(NULL),
|
| - is_call_(false) { }
|
| + bit_field_(IsCallBits::encode(false)) {
|
| + set_position(RelocInfo::kNoPosition);
|
| + }
|
| +
|
| virtual ~LInstruction() { }
|
|
|
| virtual void CompileToNative(LCodeGen* generator) = 0;
|
| @@ -249,19 +252,28 @@
|
| LPointerMap* pointer_map() const { return pointer_map_.get(); }
|
| bool HasPointerMap() const { return pointer_map_.is_set(); }
|
|
|
| + // The 31 bits PositionBits is used to store the int position value. And the
|
| + // position value may be RelocInfo::kNoPosition (-1). The accessor always
|
| + // +1/-1 so that the encoded value of position in bit_field_ is always >= 0
|
| + // and can fit into the 31 bits PositionBits.
|
| + void set_position(int pos) {
|
| + bit_field_ = PositionBits::update(bit_field_, pos + 1);
|
| + }
|
| + int position() { return PositionBits::decode(bit_field_) - 1; }
|
|
|
| void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; }
|
| HValue* hydrogen_value() const { return hydrogen_value_; }
|
|
|
| virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment* env) { }
|
|
|
| - void MarkAsCall() { is_call_ = true; }
|
| + void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); }
|
| + bool IsCall() const { return IsCallBits::decode(bit_field_); }
|
|
|
| // Interface to the register allocator and iterators.
|
| - bool ClobbersTemps() const { return is_call_; }
|
| - bool ClobbersRegisters() const { return is_call_; }
|
| + bool ClobbersTemps() const { return IsCall(); }
|
| + bool ClobbersRegisters() const { return IsCall(); }
|
| virtual bool ClobbersDoubleRegisters() const {
|
| - return is_call_ ||
|
| + return IsCall() ||
|
| (!CpuFeatures::IsSupported(SSE2) &&
|
| // We only have rudimentary X87Stack tracking, thus in general
|
| // cannot handle deoptimization nor phi-nodes.
|
| @@ -294,10 +306,13 @@
|
| virtual int TempCount() = 0;
|
| virtual LOperand* TempAt(int i) = 0;
|
|
|
| + class IsCallBits: public BitField<bool, 0, 1> {};
|
| + class PositionBits: public BitField<int, 1, 31> {};
|
| +
|
| LEnvironment* environment_;
|
| SetOncePointer<LPointerMap> pointer_map_;
|
| HValue* hydrogen_value_;
|
| - bool is_call_;
|
| + int bit_field_;
|
| };
|
|
|
|
|
|
|