| Index: src/compiler/instruction.h
|
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
|
| index 38fc433744679f580cc6b9e531dcfbc37ee2b89a..a5616b2a56352eac3961538edb52b2ec667f8d72 100644
|
| --- a/src/compiler/instruction.h
|
| +++ b/src/compiler/instruction.h
|
| @@ -25,8 +25,7 @@ namespace compiler {
|
| class Schedule;
|
|
|
| // A couple of reserved opcodes are used for internal use.
|
| -const InstructionCode kGapInstruction = -1;
|
| -const InstructionCode kSourcePositionInstruction = -2;
|
| +const InstructionCode kSourcePositionInstruction = -1;
|
|
|
| #define INSTRUCTION_OPERAND_LIST(V) \
|
| V(Constant, CONSTANT) \
|
| @@ -543,7 +542,6 @@ class Instruction {
|
| bool NeedsPointerMap() const { return IsCall(); }
|
| bool HasPointerMap() const { return pointer_map_ != NULL; }
|
|
|
| - bool IsGapMoves() const { return opcode() == kGapInstruction; }
|
| bool IsSourcePosition() const {
|
| return opcode() == kSourcePositionInstruction;
|
| }
|
| @@ -570,8 +568,37 @@ class Instruction {
|
| OutputCount() == 0 && TempCount() == 0;
|
| }
|
|
|
| + enum GapPosition {
|
| + START,
|
| + END,
|
| + FIRST_GAP_POSITION = START,
|
| + LAST_GAP_POSITION = END
|
| + };
|
| +
|
| + ParallelMove* GetOrCreateParallelMove(GapPosition pos, Zone* zone) {
|
| + if (parallel_moves_[pos] == nullptr) {
|
| + parallel_moves_[pos] = new (zone) ParallelMove(zone);
|
| + }
|
| + return parallel_moves_[pos];
|
| + }
|
| +
|
| + ParallelMove* GetParallelMove(GapPosition pos) {
|
| + return parallel_moves_[pos];
|
| + }
|
| +
|
| + const ParallelMove* GetParallelMove(GapPosition pos) const {
|
| + return parallel_moves_[pos];
|
| + }
|
| +
|
| + bool AreMovesRedundant() const;
|
| +
|
| + ParallelMove* const* parallel_moves() const { return ¶llel_moves_[0]; }
|
| + ParallelMove** parallel_moves() { return ¶llel_moves_[0]; }
|
| +
|
| protected:
|
| explicit Instruction(InstructionCode opcode);
|
| +
|
| + private:
|
| Instruction(InstructionCode opcode, size_t output_count,
|
| InstructionOperand* outputs, size_t input_count,
|
| InstructionOperand* inputs, size_t temp_count,
|
| @@ -584,6 +611,7 @@ class Instruction {
|
|
|
| InstructionCode opcode_;
|
| uint32_t bit_field_;
|
| + ParallelMove* parallel_moves_[2];
|
| PointerMap* pointer_map_;
|
| InstructionOperand operands_[1];
|
|
|
| @@ -599,65 +627,6 @@ struct PrintableInstruction {
|
| std::ostream& operator<<(std::ostream& os, const PrintableInstruction& instr);
|
|
|
|
|
| -// Represents moves inserted before an instruction due to register allocation.
|
| -// TODO(titzer): squash GapInstruction back into Instruction, since essentially
|
| -// every instruction can possibly have moves inserted before it.
|
| -class GapInstruction : public Instruction {
|
| - public:
|
| - enum InnerPosition {
|
| - START,
|
| - END,
|
| - FIRST_INNER_POSITION = START,
|
| - LAST_INNER_POSITION = END
|
| - };
|
| -
|
| - ParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone) {
|
| - if (parallel_moves_[pos] == NULL) {
|
| - parallel_moves_[pos] = new (zone) ParallelMove(zone);
|
| - }
|
| - return parallel_moves_[pos];
|
| - }
|
| -
|
| - ParallelMove* GetParallelMove(InnerPosition pos) {
|
| - return parallel_moves_[pos];
|
| - }
|
| -
|
| - const ParallelMove* GetParallelMove(InnerPosition pos) const {
|
| - return parallel_moves_[pos];
|
| - }
|
| -
|
| - bool IsRedundant() const;
|
| -
|
| - ParallelMove** parallel_moves() { return parallel_moves_; }
|
| -
|
| - static GapInstruction* New(Zone* zone) {
|
| - void* buffer = zone->New(sizeof(GapInstruction));
|
| - return new (buffer) GapInstruction(kGapInstruction);
|
| - }
|
| -
|
| - static GapInstruction* cast(Instruction* instr) {
|
| - DCHECK(instr->IsGapMoves());
|
| - return static_cast<GapInstruction*>(instr);
|
| - }
|
| -
|
| - static const GapInstruction* cast(const Instruction* instr) {
|
| - DCHECK(instr->IsGapMoves());
|
| - return static_cast<const GapInstruction*>(instr);
|
| - }
|
| -
|
| - protected:
|
| - explicit GapInstruction(InstructionCode opcode) : Instruction(opcode) {
|
| - parallel_moves_[START] = NULL;
|
| - parallel_moves_[END] = NULL;
|
| - }
|
| -
|
| - private:
|
| - friend std::ostream& operator<<(std::ostream& os,
|
| - const PrintableInstruction& instr);
|
| - ParallelMove* parallel_moves_[LAST_INNER_POSITION + 1];
|
| -};
|
| -
|
| -
|
| class SourcePositionInstruction FINAL : public Instruction {
|
| public:
|
| static SourcePositionInstruction* New(Zone* zone, SourcePosition position) {
|
| @@ -982,19 +951,13 @@ class InstructionSequence FINAL : public ZoneObject {
|
| void MarkAsReference(int virtual_register);
|
| void MarkAsDouble(int virtual_register);
|
|
|
| - void AddGapMove(int index, InstructionOperand* from, InstructionOperand* to);
|
| -
|
| - GapInstruction* GetBlockStart(RpoNumber rpo) const;
|
| + Instruction* GetBlockStart(RpoNumber rpo) const;
|
|
|
| typedef InstructionDeque::const_iterator const_iterator;
|
| const_iterator begin() const { return instructions_.begin(); }
|
| const_iterator end() const { return instructions_.end(); }
|
| const InstructionDeque& instructions() const { return instructions_; }
|
|
|
| - GapInstruction* GapAt(int index) const {
|
| - return GapInstruction::cast(InstructionAt(index));
|
| - }
|
| - bool IsGapAt(int index) const { return InstructionAt(index)->IsGapMoves(); }
|
| Instruction* InstructionAt(int index) const {
|
| DCHECK(index >= 0);
|
| DCHECK(index < static_cast<int>(instructions_.size()));
|
|
|