| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
| 6 #include "src/compiler/code-generator-impl.h" | 6 #include "src/compiler/code-generator-impl.h" |
| 7 #include "src/compiler/gap-resolver.h" | 7 #include "src/compiler/gap-resolver.h" |
| 8 #include "src/compiler/node-matchers.h" | 8 #include "src/compiler/node-matchers.h" |
| 9 #include "src/mips/macro-assembler-mips.h" | 9 #include "src/mips/macro-assembler-mips.h" |
| 10 #include "src/scopes.h" | 10 #include "src/scopes.h" |
| (...skipping 21 matching lines...) Expand all Loading... |
| 32 PrintF("UNIMPLEMENTED code_generator_mips: %s at line %d\n", __FUNCTION__, \ | 32 PrintF("UNIMPLEMENTED code_generator_mips: %s at line %d\n", __FUNCTION__, \ |
| 33 __LINE__) | 33 __LINE__) |
| 34 | 34 |
| 35 | 35 |
| 36 // Adds Mips-specific methods to convert InstructionOperands. | 36 // Adds Mips-specific methods to convert InstructionOperands. |
| 37 class MipsOperandConverter FINAL : public InstructionOperandConverter { | 37 class MipsOperandConverter FINAL : public InstructionOperandConverter { |
| 38 public: | 38 public: |
| 39 MipsOperandConverter(CodeGenerator* gen, Instruction* instr) | 39 MipsOperandConverter(CodeGenerator* gen, Instruction* instr) |
| 40 : InstructionOperandConverter(gen, instr) {} | 40 : InstructionOperandConverter(gen, instr) {} |
| 41 | 41 |
| 42 FloatRegister OutputSingleRegister(int index = 0) { | 42 FloatRegister OutputSingleRegister(size_t index = 0) { |
| 43 return ToSingleRegister(instr_->OutputAt(index)); | 43 return ToSingleRegister(instr_->OutputAt(index)); |
| 44 } | 44 } |
| 45 | 45 |
| 46 FloatRegister InputSingleRegister(int index) { | 46 FloatRegister InputSingleRegister(size_t index) { |
| 47 return ToSingleRegister(instr_->InputAt(index)); | 47 return ToSingleRegister(instr_->InputAt(index)); |
| 48 } | 48 } |
| 49 | 49 |
| 50 FloatRegister ToSingleRegister(InstructionOperand* op) { | 50 FloatRegister ToSingleRegister(InstructionOperand* op) { |
| 51 // Single (Float) and Double register namespace is same on MIPS, | 51 // Single (Float) and Double register namespace is same on MIPS, |
| 52 // both are typedefs of FPURegister. | 52 // both are typedefs of FPURegister. |
| 53 return ToDoubleRegister(op); | 53 return ToDoubleRegister(op); |
| 54 } | 54 } |
| 55 | 55 |
| 56 Operand InputImmediate(int index) { | 56 Operand InputImmediate(size_t index) { |
| 57 Constant constant = ToConstant(instr_->InputAt(index)); | 57 Constant constant = ToConstant(instr_->InputAt(index)); |
| 58 switch (constant.type()) { | 58 switch (constant.type()) { |
| 59 case Constant::kInt32: | 59 case Constant::kInt32: |
| 60 return Operand(constant.ToInt32()); | 60 return Operand(constant.ToInt32()); |
| 61 case Constant::kFloat32: | 61 case Constant::kFloat32: |
| 62 return Operand( | 62 return Operand( |
| 63 isolate()->factory()->NewNumber(constant.ToFloat32(), TENURED)); | 63 isolate()->factory()->NewNumber(constant.ToFloat32(), TENURED)); |
| 64 case Constant::kFloat64: | 64 case Constant::kFloat64: |
| 65 return Operand( | 65 return Operand( |
| 66 isolate()->factory()->NewNumber(constant.ToFloat64(), TENURED)); | 66 isolate()->factory()->NewNumber(constant.ToFloat64(), TENURED)); |
| 67 case Constant::kInt64: | 67 case Constant::kInt64: |
| 68 case Constant::kExternalReference: | 68 case Constant::kExternalReference: |
| 69 case Constant::kHeapObject: | 69 case Constant::kHeapObject: |
| 70 // TODO(plind): Maybe we should handle ExtRef & HeapObj here? | 70 // TODO(plind): Maybe we should handle ExtRef & HeapObj here? |
| 71 // maybe not done on arm due to const pool ?? | 71 // maybe not done on arm due to const pool ?? |
| 72 break; | 72 break; |
| 73 case Constant::kRpoNumber: | 73 case Constant::kRpoNumber: |
| 74 UNREACHABLE(); // TODO(titzer): RPO immediates on mips? | 74 UNREACHABLE(); // TODO(titzer): RPO immediates on mips? |
| 75 break; | 75 break; |
| 76 } | 76 } |
| 77 UNREACHABLE(); | 77 UNREACHABLE(); |
| 78 return Operand(zero_reg); | 78 return Operand(zero_reg); |
| 79 } | 79 } |
| 80 | 80 |
| 81 Operand InputOperand(int index) { | 81 Operand InputOperand(size_t index) { |
| 82 InstructionOperand* op = instr_->InputAt(index); | 82 InstructionOperand* op = instr_->InputAt(index); |
| 83 if (op->IsRegister()) { | 83 if (op->IsRegister()) { |
| 84 return Operand(ToRegister(op)); | 84 return Operand(ToRegister(op)); |
| 85 } | 85 } |
| 86 return InputImmediate(index); | 86 return InputImmediate(index); |
| 87 } | 87 } |
| 88 | 88 |
| 89 MemOperand MemoryOperand(int* first_index) { | 89 MemOperand MemoryOperand(size_t* first_index) { |
| 90 const int index = *first_index; | 90 const size_t index = *first_index; |
| 91 switch (AddressingModeField::decode(instr_->opcode())) { | 91 switch (AddressingModeField::decode(instr_->opcode())) { |
| 92 case kMode_None: | 92 case kMode_None: |
| 93 break; | 93 break; |
| 94 case kMode_MRI: | 94 case kMode_MRI: |
| 95 *first_index += 2; | 95 *first_index += 2; |
| 96 return MemOperand(InputRegister(index + 0), InputInt32(index + 1)); | 96 return MemOperand(InputRegister(index + 0), InputInt32(index + 1)); |
| 97 case kMode_MRR: | 97 case kMode_MRR: |
| 98 // TODO(plind): r6 address mode, to be implemented ... | 98 // TODO(plind): r6 address mode, to be implemented ... |
| 99 UNREACHABLE(); | 99 UNREACHABLE(); |
| 100 } | 100 } |
| 101 UNREACHABLE(); | 101 UNREACHABLE(); |
| 102 return MemOperand(no_reg); | 102 return MemOperand(no_reg); |
| 103 } | 103 } |
| 104 | 104 |
| 105 MemOperand MemoryOperand(int index = 0) { return MemoryOperand(&index); } | 105 MemOperand MemoryOperand(size_t index = 0) { return MemoryOperand(&index); } |
| 106 | 106 |
| 107 MemOperand ToMemOperand(InstructionOperand* op) const { | 107 MemOperand ToMemOperand(InstructionOperand* op) const { |
| 108 DCHECK(op != NULL); | 108 DCHECK(op != NULL); |
| 109 DCHECK(!op->IsRegister()); | 109 DCHECK(!op->IsRegister()); |
| 110 DCHECK(!op->IsDoubleRegister()); | 110 DCHECK(!op->IsDoubleRegister()); |
| 111 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); | 111 DCHECK(op->IsStackSlot() || op->IsDoubleStackSlot()); |
| 112 // The linkage computes where all spill slots are located. | 112 // The linkage computes where all spill slots are located. |
| 113 FrameOffset offset = linkage()->GetFrameOffset(op->index(), frame(), 0); | 113 FrameOffset offset = linkage()->GetFrameOffset(op->index(), frame(), 0); |
| 114 return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); | 114 return MemOperand(offset.from_stack_pointer() ? sp : fp, offset.offset()); |
| 115 } | 115 } |
| 116 }; | 116 }; |
| 117 | 117 |
| 118 | 118 |
| 119 static inline bool HasRegisterInput(Instruction* instr, int index) { | 119 static inline bool HasRegisterInput(Instruction* instr, size_t index) { |
| 120 return instr->InputAt(index)->IsRegister(); | 120 return instr->InputAt(index)->IsRegister(); |
| 121 } | 121 } |
| 122 | 122 |
| 123 | 123 |
| 124 namespace { | 124 namespace { |
| 125 | 125 |
| 126 class OutOfLineLoadSingle FINAL : public OutOfLineCode { | 126 class OutOfLineLoadSingle FINAL : public OutOfLineCode { |
| 127 public: | 127 public: |
| 128 OutOfLineLoadSingle(CodeGenerator* gen, FloatRegister result) | 128 OutOfLineLoadSingle(CodeGenerator* gen, FloatRegister result) |
| 129 : OutOfLineCode(gen), result_(result) {} | 129 : OutOfLineCode(gen), result_(result) {} |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 639 __ lw(i.OutputRegister(), i.MemoryOperand()); | 639 __ lw(i.OutputRegister(), i.MemoryOperand()); |
| 640 break; | 640 break; |
| 641 case kMipsSw: | 641 case kMipsSw: |
| 642 __ sw(i.InputRegister(2), i.MemoryOperand()); | 642 __ sw(i.InputRegister(2), i.MemoryOperand()); |
| 643 break; | 643 break; |
| 644 case kMipsLwc1: { | 644 case kMipsLwc1: { |
| 645 __ lwc1(i.OutputSingleRegister(), i.MemoryOperand()); | 645 __ lwc1(i.OutputSingleRegister(), i.MemoryOperand()); |
| 646 break; | 646 break; |
| 647 } | 647 } |
| 648 case kMipsSwc1: { | 648 case kMipsSwc1: { |
| 649 int index = 0; | 649 size_t index = 0; |
| 650 MemOperand operand = i.MemoryOperand(&index); | 650 MemOperand operand = i.MemoryOperand(&index); |
| 651 __ swc1(i.InputSingleRegister(index), operand); | 651 __ swc1(i.InputSingleRegister(index), operand); |
| 652 break; | 652 break; |
| 653 } | 653 } |
| 654 case kMipsLdc1: | 654 case kMipsLdc1: |
| 655 __ ldc1(i.OutputDoubleRegister(), i.MemoryOperand()); | 655 __ ldc1(i.OutputDoubleRegister(), i.MemoryOperand()); |
| 656 break; | 656 break; |
| 657 case kMipsSdc1: | 657 case kMipsSdc1: |
| 658 __ sdc1(i.InputDoubleRegister(2), i.MemoryOperand()); | 658 __ sdc1(i.InputDoubleRegister(2), i.MemoryOperand()); |
| 659 break; | 659 break; |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1198 } | 1198 } |
| 1199 } | 1199 } |
| 1200 MarkLazyDeoptSite(); | 1200 MarkLazyDeoptSite(); |
| 1201 } | 1201 } |
| 1202 | 1202 |
| 1203 #undef __ | 1203 #undef __ |
| 1204 | 1204 |
| 1205 } // namespace compiler | 1205 } // namespace compiler |
| 1206 } // namespace internal | 1206 } // namespace internal |
| 1207 } // namespace v8 | 1207 } // namespace v8 |
| OLD | NEW |