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/base/bits.h" | 5 #include "src/base/bits.h" |
6 #include "src/compiler/instruction-selector-impl.h" | 6 #include "src/compiler/instruction-selector-impl.h" |
7 #include "src/compiler/node-matchers.h" | 7 #include "src/compiler/node-matchers.h" |
8 | 8 |
9 namespace v8 { | 9 namespace v8 { |
10 namespace internal { | 10 namespace internal { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
67 case kArmLdr: | 67 case kArmLdr: |
68 case kArmStr: | 68 case kArmStr: |
69 case kArmStoreWriteBarrier: | 69 case kArmStoreWriteBarrier: |
70 return value >= -4095 && value <= 4095; | 70 return value >= -4095 && value <= 4095; |
71 | 71 |
72 case kArmLdrh: | 72 case kArmLdrh: |
73 case kArmLdrsh: | 73 case kArmLdrsh: |
74 case kArmStrh: | 74 case kArmStrh: |
75 return value >= -255 && value <= 255; | 75 return value >= -255 && value <= 255; |
76 | 76 |
| 77 case kArchCallAddress: |
| 78 case kArchCallCodeObject: |
| 79 case kArchCallJSFunction: |
| 80 case kArchDeoptimize: |
| 81 case kArchDrop: |
77 case kArchJmp: | 82 case kArchJmp: |
78 case kArchNop: | 83 case kArchNop: |
79 case kArchRet: | 84 case kArchRet: |
80 case kArchDeoptimize: | |
81 case kArchTruncateDoubleToI: | 85 case kArchTruncateDoubleToI: |
82 case kArmMul: | 86 case kArmMul: |
83 case kArmMla: | 87 case kArmMla: |
84 case kArmMls: | 88 case kArmMls: |
85 case kArmSdiv: | 89 case kArmSdiv: |
86 case kArmUdiv: | 90 case kArmUdiv: |
87 case kArmBfc: | 91 case kArmBfc: |
88 case kArmUbfx: | 92 case kArmUbfx: |
89 case kArmCallCodeObject: | |
90 case kArmCallJSFunction: | |
91 case kArmCallAddress: | |
92 case kArmPush: | |
93 case kArmDrop: | |
94 case kArmVcmpF64: | 93 case kArmVcmpF64: |
95 case kArmVaddF64: | 94 case kArmVaddF64: |
96 case kArmVsubF64: | 95 case kArmVsubF64: |
97 case kArmVmulF64: | 96 case kArmVmulF64: |
98 case kArmVmlaF64: | 97 case kArmVmlaF64: |
99 case kArmVmlsF64: | 98 case kArmVmlsF64: |
100 case kArmVdivF64: | 99 case kArmVdivF64: |
101 case kArmVmodF64: | 100 case kArmVmodF64: |
102 case kArmVnegF64: | 101 case kArmVnegF64: |
103 case kArmVcvtF64S32: | 102 case kArmVcvtF64S32: |
104 case kArmVcvtF64U32: | 103 case kArmVcvtF64U32: |
105 case kArmVcvtS32F64: | 104 case kArmVcvtS32F64: |
106 case kArmVcvtU32F64: | 105 case kArmVcvtU32F64: |
| 106 case kArmPush: |
107 return false; | 107 return false; |
108 } | 108 } |
109 UNREACHABLE(); | 109 UNREACHABLE(); |
110 return false; | 110 return false; |
111 } | 111 } |
112 | 112 |
113 private: | 113 private: |
114 bool ImmediateFitsAddrMode1Instruction(int32_t imm) const { | 114 bool ImmediateFitsAddrMode1Instruction(int32_t imm) const { |
115 return Assembler::ImmediateFitsAddrMode1Instruction(imm); | 115 return Assembler::ImmediateFitsAddrMode1Instruction(imm); |
116 } | 116 } |
(...skipping 684 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
801 // Push any stack arguments. | 801 // Push any stack arguments. |
802 for (NodeVectorRIter input = buffer.pushed_nodes.rbegin(); | 802 for (NodeVectorRIter input = buffer.pushed_nodes.rbegin(); |
803 input != buffer.pushed_nodes.rend(); input++) { | 803 input != buffer.pushed_nodes.rend(); input++) { |
804 Emit(kArmPush, NULL, g.UseRegister(*input)); | 804 Emit(kArmPush, NULL, g.UseRegister(*input)); |
805 } | 805 } |
806 | 806 |
807 // Select the appropriate opcode based on the call type. | 807 // Select the appropriate opcode based on the call type. |
808 InstructionCode opcode; | 808 InstructionCode opcode; |
809 switch (descriptor->kind()) { | 809 switch (descriptor->kind()) { |
810 case CallDescriptor::kCallCodeObject: { | 810 case CallDescriptor::kCallCodeObject: { |
811 opcode = kArmCallCodeObject; | 811 opcode = kArchCallCodeObject; |
812 break; | 812 break; |
813 } | 813 } |
814 case CallDescriptor::kCallAddress: | 814 case CallDescriptor::kCallAddress: |
815 opcode = kArmCallAddress; | 815 opcode = kArchCallAddress; |
816 break; | 816 break; |
817 case CallDescriptor::kCallJSFunction: | 817 case CallDescriptor::kCallJSFunction: |
818 opcode = kArmCallJSFunction; | 818 opcode = kArchCallJSFunction; |
819 break; | 819 break; |
820 default: | 820 default: |
821 UNREACHABLE(); | 821 UNREACHABLE(); |
822 return; | 822 return; |
823 } | 823 } |
824 opcode |= MiscField::encode(descriptor->deoptimization_support()); | 824 opcode |= MiscField::encode(descriptor->deoptimization_support()); |
825 | 825 |
826 // Emit the call instruction. | 826 // Emit the call instruction. |
827 Instruction* call_instr = | 827 Instruction* call_instr = |
828 Emit(opcode, buffer.outputs.size(), &buffer.outputs.front(), | 828 Emit(opcode, buffer.outputs.size(), &buffer.outputs.front(), |
829 buffer.instruction_args.size(), &buffer.instruction_args.front()); | 829 buffer.instruction_args.size(), &buffer.instruction_args.front()); |
830 | 830 |
831 call_instr->MarkAsCall(); | 831 call_instr->MarkAsCall(); |
832 if (deoptimization != NULL) { | 832 if (deoptimization != NULL) { |
833 DCHECK(continuation != NULL); | 833 DCHECK(continuation != NULL); |
834 call_instr->MarkAsControl(); | 834 call_instr->MarkAsControl(); |
835 } | 835 } |
836 | 836 |
837 // Caller clean up of stack for C-style calls. | 837 // Caller clean up of stack for C-style calls. |
838 if (descriptor->kind() == CallDescriptor::kCallAddress && | 838 if (descriptor->kind() == CallDescriptor::kCallAddress && |
839 !buffer.pushed_nodes.empty()) { | 839 !buffer.pushed_nodes.empty()) { |
840 DCHECK(deoptimization == NULL && continuation == NULL); | 840 DCHECK(deoptimization == NULL && continuation == NULL); |
841 Emit(kArmDrop | MiscField::encode(buffer.pushed_nodes.size()), NULL); | 841 Emit(kArchDrop | MiscField::encode(buffer.pushed_nodes.size()), NULL); |
842 } | 842 } |
843 } | 843 } |
844 | 844 |
845 | 845 |
846 void InstructionSelector::VisitInt32AddWithOverflow(Node* node, | 846 void InstructionSelector::VisitInt32AddWithOverflow(Node* node, |
847 FlagsContinuation* cont) { | 847 FlagsContinuation* cont) { |
848 VisitBinop(this, node, kArmAdd, kArmAdd, cont); | 848 VisitBinop(this, node, kArmAdd, kArmAdd, cont); |
849 } | 849 } |
850 | 850 |
851 | 851 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
954 } else { | 954 } else { |
955 DCHECK(cont->IsSet()); | 955 DCHECK(cont->IsSet()); |
956 Emit(cont->Encode(kArmVcmpF64), g.DefineAsRegister(cont->result()), | 956 Emit(cont->Encode(kArmVcmpF64), g.DefineAsRegister(cont->result()), |
957 g.UseRegister(m.left().node()), g.UseRegister(m.right().node())); | 957 g.UseRegister(m.left().node()), g.UseRegister(m.right().node())); |
958 } | 958 } |
959 } | 959 } |
960 | 960 |
961 } // namespace compiler | 961 } // namespace compiler |
962 } // namespace internal | 962 } // namespace internal |
963 } // namespace v8 | 963 } // namespace v8 |
OLD | NEW |