| Index: src/compiler/instruction.h
|
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
|
| index 7d5105b93a8435de4c0c7b0b52e46594e9bbc0e2..9b9728224ce35e8a78c8c89481cf230311c5aea6 100644
|
| --- a/src/compiler/instruction.h
|
| +++ b/src/compiler/instruction.h
|
| @@ -50,6 +50,19 @@
|
| inline bool IsStackSlot() const;
|
| inline bool IsDoubleStackSlot() const;
|
|
|
| + // Useful for map/set keys.
|
| + bool operator<(const InstructionOperand& op) const {
|
| + return value_ < op.value_;
|
| + }
|
| +
|
| + bool operator==(const InstructionOperand& op) const {
|
| + return value_ == op.value_;
|
| + }
|
| +
|
| + bool operator!=(const InstructionOperand& op) const {
|
| + return value_ != op.value_;
|
| + }
|
| +
|
| template <typename SubKindOperand>
|
| static SubKindOperand* New(Zone* zone, const SubKindOperand& op) {
|
| void* buffer = zone->New(sizeof(op));
|
| @@ -61,42 +74,21 @@
|
| *dest = *src;
|
| }
|
|
|
| - bool Equals(const InstructionOperand& that) const {
|
| - return this->value_ == that.value_;
|
| - }
|
| -
|
| - bool Compare(const InstructionOperand& that) const {
|
| - return this->value_ < that.value_;
|
| - }
|
| -
|
| - bool EqualsModuloType(const InstructionOperand& that) const {
|
| - return this->GetValueModuloType() == that.GetValueModuloType();
|
| - }
|
| -
|
| - bool CompareModuloType(const InstructionOperand& that) const {
|
| - return this->GetValueModuloType() < that.GetValueModuloType();
|
| - }
|
| -
|
| protected:
|
| explicit InstructionOperand(Kind kind) : value_(KindField::encode(kind)) {}
|
|
|
| - inline uint64_t GetValueModuloType() const;
|
| -
|
| class KindField : public BitField64<Kind, 0, 3> {};
|
|
|
| uint64_t value_;
|
| };
|
| -
|
|
|
| struct PrintableInstructionOperand {
|
| const RegisterConfiguration* register_configuration_;
|
| InstructionOperand op_;
|
| };
|
|
|
| -
|
| std::ostream& operator<<(std::ostream& os,
|
| const PrintableInstructionOperand& op);
|
| -
|
|
|
| #define INSTRUCTION_OPERAND_CASTS(OperandType, OperandKind) \
|
| \
|
| @@ -354,8 +346,6 @@
|
|
|
| class AllocatedOperand : public InstructionOperand {
|
| public:
|
| - // TODO(dcarney): machine_type makes this now redundant. Just need to know is
|
| - // the operand is a slot or a register.
|
| enum AllocatedKind {
|
| STACK_SLOT,
|
| DOUBLE_STACK_SLOT,
|
| @@ -363,12 +353,10 @@
|
| DOUBLE_REGISTER
|
| };
|
|
|
| - AllocatedOperand(AllocatedKind kind, MachineType machine_type, int index)
|
| + AllocatedOperand(AllocatedKind kind, int index)
|
| : InstructionOperand(ALLOCATED) {
|
| DCHECK_IMPLIES(kind == REGISTER || kind == DOUBLE_REGISTER, index >= 0);
|
| - DCHECK(IsSupportedMachineType(machine_type));
|
| value_ |= AllocatedKindField::encode(kind);
|
| - value_ |= MachineTypeField::encode(machine_type);
|
| value_ |= static_cast<int64_t>(index) << IndexField::kShift;
|
| }
|
|
|
| @@ -380,33 +368,14 @@
|
| return AllocatedKindField::decode(value_);
|
| }
|
|
|
| - MachineType machine_type() const { return MachineTypeField::decode(value_); }
|
| -
|
| - static AllocatedOperand* New(Zone* zone, AllocatedKind kind,
|
| - MachineType machine_type, int index) {
|
| - return InstructionOperand::New(zone,
|
| - AllocatedOperand(kind, machine_type, index));
|
| - }
|
| -
|
| - static bool IsSupportedMachineType(MachineType machine_type) {
|
| - if (RepresentationOf(machine_type) != machine_type) return false;
|
| - switch (machine_type) {
|
| - case kRepWord32:
|
| - case kRepWord64:
|
| - case kRepFloat32:
|
| - case kRepFloat64:
|
| - case kRepTagged:
|
| - return true;
|
| - default:
|
| - return false;
|
| - }
|
| + static AllocatedOperand* New(Zone* zone, AllocatedKind kind, int index) {
|
| + return InstructionOperand::New(zone, AllocatedOperand(kind, index));
|
| }
|
|
|
| INSTRUCTION_OPERAND_CASTS(AllocatedOperand, ALLOCATED);
|
|
|
| STATIC_ASSERT(KindField::kSize == 3);
|
| class AllocatedKindField : public BitField64<AllocatedKind, 3, 2> {};
|
| - class MachineTypeField : public BitField64<MachineType, 5, 16> {};
|
| class IndexField : public BitField64<int32_t, 35, 29> {};
|
| };
|
|
|
| @@ -431,17 +400,14 @@
|
| #undef ALLOCATED_OPERAND_IS
|
|
|
|
|
| -// TODO(dcarney): these subkinds are now pretty useless, nuke.
|
| #define ALLOCATED_OPERAND_CLASS(SubKind, kOperandKind) \
|
| class SubKind##Operand final : public AllocatedOperand { \
|
| public: \
|
| - explicit SubKind##Operand(MachineType machine_type, int index) \
|
| - : AllocatedOperand(kOperandKind, machine_type, index) {} \
|
| + explicit SubKind##Operand(int index) \
|
| + : AllocatedOperand(kOperandKind, index) {} \
|
| \
|
| - static SubKind##Operand* New(Zone* zone, MachineType machine_type, \
|
| - int index) { \
|
| - return InstructionOperand::New(zone, \
|
| - SubKind##Operand(machine_type, index)); \
|
| + static SubKind##Operand* New(Zone* zone, int index) { \
|
| + return InstructionOperand::New(zone, SubKind##Operand(index)); \
|
| } \
|
| \
|
| static SubKind##Operand* cast(InstructionOperand* op) { \
|
| @@ -463,24 +429,6 @@
|
| #undef ALLOCATED_OPERAND_CLASS
|
|
|
|
|
| -uint64_t InstructionOperand::GetValueModuloType() const {
|
| - if (IsAllocated()) {
|
| - // TODO(dcarney): put machine type last and mask.
|
| - return AllocatedOperand::MachineTypeField::update(this->value_, kMachNone);
|
| - }
|
| - return this->value_;
|
| -}
|
| -
|
| -
|
| -// Required for maps that don't care about machine type.
|
| -struct CompareOperandModuloType {
|
| - bool operator()(const InstructionOperand& a,
|
| - const InstructionOperand& b) const {
|
| - return a.CompareModuloType(b);
|
| - }
|
| -};
|
| -
|
| -
|
| class MoveOperands final : public ZoneObject {
|
| public:
|
| MoveOperands(const InstructionOperand& source,
|
| @@ -508,14 +456,14 @@
|
|
|
| // True if this move a move into the given destination operand.
|
| bool Blocks(const InstructionOperand& operand) const {
|
| - return !IsEliminated() && source().EqualsModuloType(operand);
|
| + return !IsEliminated() && source() == operand;
|
| }
|
|
|
| // A move is redundant if it's been eliminated or if its source and
|
| // destination are the same.
|
| bool IsRedundant() const {
|
| DCHECK_IMPLIES(!destination_.IsInvalid(), !destination_.IsConstant());
|
| - return IsEliminated() || source_.EqualsModuloType(destination_);
|
| + return IsEliminated() || source_ == destination_;
|
| }
|
|
|
| // We clear both operands to indicate move that's been eliminated.
|
| @@ -603,7 +551,7 @@
|
|
|
| std::ostream& operator<<(std::ostream& os, const ReferenceMap& pm);
|
|
|
| -class Instruction final {
|
| +class Instruction {
|
| public:
|
| size_t OutputCount() const { return OutputCountField::decode(bit_field_); }
|
| const InstructionOperand* OutputAt(size_t i) const {
|
| @@ -728,9 +676,10 @@
|
| ParallelMove* const* parallel_moves() const { return ¶llel_moves_[0]; }
|
| ParallelMove** parallel_moves() { return ¶llel_moves_[0]; }
|
|
|
| + protected:
|
| + explicit Instruction(InstructionCode opcode);
|
| +
|
| private:
|
| - explicit Instruction(InstructionCode opcode);
|
| -
|
| Instruction(InstructionCode opcode, size_t output_count,
|
| InstructionOperand* outputs, size_t input_count,
|
| InstructionOperand* inputs, size_t temp_count,
|
| @@ -747,6 +696,7 @@
|
| ReferenceMap* reference_map_;
|
| InstructionOperand operands_[1];
|
|
|
| + private:
|
| DISALLOW_COPY_AND_ASSIGN(Instruction);
|
| };
|
|
|
| @@ -1054,24 +1004,11 @@
|
|
|
| const InstructionBlock* GetInstructionBlock(int instruction_index) const;
|
|
|
| - static MachineType DefaultRepresentation() {
|
| - return kPointerSize == 8 ? kRepWord64 : kRepWord32;
|
| - }
|
| - MachineType GetRepresentation(int virtual_register) const;
|
| - void MarkAsRepresentation(MachineType machine_type, int virtual_register);
|
| -
|
| - bool IsReference(int virtual_register) const {
|
| - return GetRepresentation(virtual_register) == kRepTagged;
|
| - }
|
| - bool IsFloat(int virtual_register) const {
|
| - switch (GetRepresentation(virtual_register)) {
|
| - case kRepFloat32:
|
| - case kRepFloat64:
|
| - return true;
|
| - default:
|
| - return false;
|
| - }
|
| - }
|
| + bool IsReference(int virtual_register) const;
|
| + bool IsDouble(int virtual_register) const;
|
| +
|
| + void MarkAsReference(int virtual_register);
|
| + void MarkAsDouble(int virtual_register);
|
|
|
| Instruction* GetBlockStart(RpoNumber rpo) const;
|
|
|
| @@ -1174,7 +1111,8 @@
|
| InstructionDeque instructions_;
|
| int next_virtual_register_;
|
| ReferenceMapDeque reference_maps_;
|
| - ZoneVector<MachineType> representations_;
|
| + VirtualRegisterSet doubles_;
|
| + VirtualRegisterSet references_;
|
| DeoptimizationVector deoptimization_entries_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InstructionSequence);
|
|
|