| Index: src/compiler/instruction.h
|
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
|
| index 0379509840e9eec6f09826316cc36e3a077b0ffa..36b445eb3d58e428ac9a8ce701b69643ed87448d 100644
|
| --- a/src/compiler/instruction.h
|
| +++ b/src/compiler/instruction.h
|
| @@ -317,22 +317,35 @@ class ConstantOperand : public InstructionOperand {
|
|
|
| class ImmediateOperand : public InstructionOperand {
|
| public:
|
| - explicit ImmediateOperand(int index) : InstructionOperand(IMMEDIATE) {
|
| - value_ |= static_cast<int64_t>(index) << IndexField::kShift;
|
| + enum ImmediateType { INLINE, INDEXED };
|
| +
|
| + explicit ImmediateOperand(ImmediateType type, int32_t value)
|
| + : InstructionOperand(IMMEDIATE) {
|
| + value_ |= TypeField::encode(type);
|
| + value_ |= static_cast<int64_t>(value) << ValueField::kShift;
|
| }
|
|
|
| - int index() const {
|
| - return static_cast<int64_t>(value_) >> IndexField::kShift;
|
| + ImmediateType type() const { return TypeField::decode(value_); }
|
| +
|
| + int32_t inline_value() const {
|
| + DCHECK_EQ(INLINE, type());
|
| + return static_cast<int64_t>(value_) >> ValueField::kShift;
|
| + }
|
| +
|
| + int32_t indexed_value() const {
|
| + DCHECK_EQ(INDEXED, type());
|
| + return static_cast<int64_t>(value_) >> ValueField::kShift;
|
| }
|
|
|
| - static ImmediateOperand* New(Zone* zone, int index) {
|
| - return InstructionOperand::New(zone, ImmediateOperand(index));
|
| + static ImmediateOperand* New(Zone* zone, ImmediateType type, int32_t value) {
|
| + return InstructionOperand::New(zone, ImmediateOperand(type, value));
|
| }
|
|
|
| INSTRUCTION_OPERAND_CASTS(ImmediateOperand, IMMEDIATE);
|
|
|
| STATIC_ASSERT(KindField::kSize == 3);
|
| - class IndexField : public BitField64<int32_t, 35, 29> {};
|
| + class TypeField : public BitField64<ImmediateType, 3, 1> {};
|
| + class ValueField : public BitField64<int32_t, 32, 32> {};
|
| };
|
|
|
|
|
| @@ -1066,15 +1079,28 @@ class InstructionSequence FINAL : public ZoneObject {
|
| typedef ZoneVector<Constant> Immediates;
|
| Immediates& immediates() { return immediates_; }
|
|
|
| - int AddImmediate(Constant constant) {
|
| + ImmediateOperand AddImmediate(const Constant& constant) {
|
| + if (constant.type() == Constant::kInt32) {
|
| + return ImmediateOperand(ImmediateOperand::INLINE, constant.ToInt32());
|
| + }
|
| int index = static_cast<int>(immediates_.size());
|
| immediates_.push_back(constant);
|
| - return index;
|
| - }
|
| - Constant GetImmediate(int index) const {
|
| - DCHECK(index >= 0);
|
| - DCHECK(index < static_cast<int>(immediates_.size()));
|
| - return immediates_[index];
|
| + return ImmediateOperand(ImmediateOperand::INDEXED, index);
|
| + }
|
| +
|
| + Constant GetImmediate(const ImmediateOperand* op) const {
|
| + switch (op->type()) {
|
| + case ImmediateOperand::INLINE:
|
| + return Constant(op->inline_value());
|
| + case ImmediateOperand::INDEXED: {
|
| + int index = op->indexed_value();
|
| + DCHECK(index >= 0);
|
| + DCHECK(index < static_cast<int>(immediates_.size()));
|
| + return immediates_[index];
|
| + }
|
| + }
|
| + UNREACHABLE();
|
| + return Constant(static_cast<int32_t>(0));
|
| }
|
|
|
| class StateId {
|
|
|