| Index: src/compiler/instruction.h
|
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
|
| index 6614d479780948ab8b9a0bb5bca5825949c60032..d78a5e8abb2b9a47228812ea12156b1ea73a3f26 100644
|
| --- a/src/compiler/instruction.h
|
| +++ b/src/compiler/instruction.h
|
| @@ -35,7 +35,7 @@ const InstructionCode kSourcePositionInstruction = -2;
|
| V(Register, REGISTER, RegisterConfiguration::kMaxGeneralRegisters) \
|
| V(DoubleRegister, DOUBLE_REGISTER, RegisterConfiguration::kMaxDoubleRegisters)
|
|
|
| -class InstructionOperand : public ZoneObject {
|
| +class InstructionOperand {
|
| public:
|
| static const int kInvalidVirtualRegister = -1;
|
|
|
| @@ -50,6 +50,10 @@ class InstructionOperand : public ZoneObject {
|
| DOUBLE_REGISTER
|
| };
|
|
|
| + InstructionOperand() : virtual_register_(kInvalidVirtualRegister) {
|
| + ConvertTo(INVALID, 0);
|
| + }
|
| +
|
| InstructionOperand(Kind kind, int index)
|
| : virtual_register_(kInvalidVirtualRegister) {
|
| DCHECK(kind != INVALID);
|
| @@ -62,6 +66,7 @@ class InstructionOperand : public ZoneObject {
|
| bool Is##name() const { return kind() == type; }
|
| INSTRUCTION_OPERAND_LIST(INSTRUCTION_OPERAND_PREDICATE)
|
| INSTRUCTION_OPERAND_PREDICATE(Unallocated, UNALLOCATED, 0)
|
| + INSTRUCTION_OPERAND_PREDICATE(Invalid, INVALID, 0)
|
| #undef INSTRUCTION_OPERAND_PREDICATE
|
| bool Equals(const InstructionOperand* other) const {
|
| return value_ == other->value_;
|
| @@ -79,6 +84,12 @@ class InstructionOperand : public ZoneObject {
|
| static void SetUpCaches();
|
| static void TearDownCaches();
|
|
|
| + // TODO(dcarney): get rid of these
|
| + void* operator new(size_t, void* location) { return location; }
|
| + void* operator new(size_t size, Zone* zone) {
|
| + return zone->New(static_cast<int>(size));
|
| + }
|
| +
|
| protected:
|
| InstructionOperand(Kind kind, int index, int virtual_register)
|
| : virtual_register_(virtual_register) {
|
| @@ -91,8 +102,6 @@ class InstructionOperand : public ZoneObject {
|
| int32_t virtual_register_;
|
| };
|
|
|
| -typedef ZoneVector<InstructionOperand*> InstructionOperandVector;
|
| -
|
| struct PrintableInstructionOperand {
|
| const RegisterConfiguration* register_configuration_;
|
| const InstructionOperand* op_;
|
| @@ -131,10 +140,6 @@ class UnallocatedOperand : public InstructionOperand {
|
| // TODO(dcarney): remove this.
|
| static const int kInvalidVirtualRegister = -1;
|
|
|
| - // This is only for array initialization.
|
| - UnallocatedOperand()
|
| - : InstructionOperand(INVALID, 0, kInvalidVirtualRegister) {}
|
| -
|
| UnallocatedOperand(ExtendedPolicy policy, int virtual_register)
|
| : InstructionOperand(UNALLOCATED, 0, virtual_register) {
|
| value_ |= BasicPolicyField::encode(EXTENDED_POLICY);
|
| @@ -181,6 +186,11 @@ class UnallocatedOperand : public InstructionOperand {
|
| return static_cast<UnallocatedOperand*>(op);
|
| }
|
|
|
| + static UnallocatedOperand cast(const InstructionOperand& op) {
|
| + DCHECK(op.IsUnallocated());
|
| + return *static_cast<const UnallocatedOperand*>(&op);
|
| + }
|
| +
|
| // The encoding used for UnallocatedOperand operands depends on the policy
|
| // that is
|
| // stored within the operand. The FIXED_SLOT policy uses a compact encoding
|
| @@ -341,6 +351,9 @@ std::ostream& operator<<(std::ostream& os, const PrintableMoveOperands& mo);
|
| template <InstructionOperand::Kind kOperandKind, int kNumCachedOperands>
|
| class SubKindOperand FINAL : public InstructionOperand {
|
| public:
|
| + explicit SubKindOperand(int index)
|
| + : InstructionOperand(kOperandKind, index) {}
|
| +
|
| static SubKindOperand* Create(int index, Zone* zone) {
|
| DCHECK(index >= 0);
|
| if (index < kNumCachedOperands) return &cache[index];
|
| @@ -357,6 +370,11 @@ class SubKindOperand FINAL : public InstructionOperand {
|
| return reinterpret_cast<const SubKindOperand*>(op);
|
| }
|
|
|
| + static SubKindOperand cast(const InstructionOperand& op) {
|
| + DCHECK(op.kind() == kOperandKind);
|
| + return *static_cast<const SubKindOperand*>(&op);
|
| + }
|
| +
|
| static void SetUpCache();
|
| static void TearDownCache();
|
|
|
| @@ -364,8 +382,6 @@ class SubKindOperand FINAL : public InstructionOperand {
|
| static SubKindOperand* cache;
|
|
|
| SubKindOperand() : InstructionOperand(kOperandKind, 0) {} // For the caches.
|
| - explicit SubKindOperand(int index)
|
| - : InstructionOperand(kOperandKind, index) {}
|
| };
|
|
|
|
|
| @@ -492,9 +508,9 @@ class Instruction : public ZoneObject {
|
| }
|
|
|
| static Instruction* New(Zone* zone, InstructionCode opcode,
|
| - size_t output_count, InstructionOperand** outputs,
|
| - size_t input_count, InstructionOperand** inputs,
|
| - size_t temp_count, InstructionOperand** temps) {
|
| + size_t output_count, InstructionOperand* outputs,
|
| + size_t input_count, InstructionOperand* inputs,
|
| + size_t temp_count, InstructionOperand* temps) {
|
| DCHECK(opcode >= 0);
|
| DCHECK(output_count == 0 || outputs != NULL);
|
| DCHECK(input_count == 0 || inputs != NULL);
|
| @@ -502,8 +518,8 @@ class Instruction : public ZoneObject {
|
| size_t total_extra_ops = output_count + input_count + temp_count;
|
| if (total_extra_ops != 0) total_extra_ops--;
|
| int size = static_cast<int>(
|
| - RoundUp(sizeof(Instruction), sizeof(UnallocatedOperand)) +
|
| - total_extra_ops * sizeof(UnallocatedOperand));
|
| + RoundUp(sizeof(Instruction), sizeof(InstructionOperand)) +
|
| + total_extra_ops * sizeof(InstructionOperand));
|
| return new (zone->New(size)) Instruction(
|
| opcode, output_count, outputs, input_count, inputs, temp_count, temps);
|
| }
|
| @@ -559,9 +575,9 @@ class Instruction : public ZoneObject {
|
| protected:
|
| explicit Instruction(InstructionCode opcode);
|
| Instruction(InstructionCode opcode, size_t output_count,
|
| - InstructionOperand** outputs, size_t input_count,
|
| - InstructionOperand** inputs, size_t temp_count,
|
| - InstructionOperand** temps);
|
| + InstructionOperand* outputs, size_t input_count,
|
| + InstructionOperand* inputs, size_t temp_count,
|
| + InstructionOperand* temps);
|
|
|
| protected:
|
| typedef BitField<size_t, 0, 8> OutputCountField;
|
| @@ -573,7 +589,7 @@ class Instruction : public ZoneObject {
|
| InstructionCode opcode_;
|
| uint32_t bit_field_;
|
| PointerMap* pointer_map_;
|
| - UnallocatedOperand operands_[1];
|
| + InstructionOperand operands_[1];
|
| };
|
|
|
|
|
|
|