| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 | 6 |
| 7 #include "src/compilation-info.h" | 7 #include "src/compilation-info.h" |
| 8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
| 9 #include "src/compiler/gap-resolver.h" | 9 #include "src/compiler/gap-resolver.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 753 __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \ | 753 __ CallCFunction(ExternalReference::ieee754_##name##_function(isolate()), \ |
| 754 2); \ | 754 2); \ |
| 755 /* Return value is in st(0) on ia32. */ \ | 755 /* Return value is in st(0) on ia32. */ \ |
| 756 /* Store it into the result register. */ \ | 756 /* Store it into the result register. */ \ |
| 757 __ sub(esp, Immediate(kDoubleSize)); \ | 757 __ sub(esp, Immediate(kDoubleSize)); \ |
| 758 __ fstp_d(Operand(esp, 0)); \ | 758 __ fstp_d(Operand(esp, 0)); \ |
| 759 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); \ | 759 __ movsd(i.OutputDoubleRegister(), Operand(esp, 0)); \ |
| 760 __ add(esp, Immediate(kDoubleSize)); \ | 760 __ add(esp, Immediate(kDoubleSize)); \ |
| 761 } while (false) | 761 } while (false) |
| 762 | 762 |
| 763 #define ASSEMBLE_BINOP(asm_instr) \ |
| 764 do { \ |
| 765 if (AddressingModeField::decode(instr->opcode()) != kMode_None) { \ |
| 766 size_t index = 1; \ |
| 767 Operand right = i.MemoryOperand(&index); \ |
| 768 __ asm_instr(i.InputRegister(0), right); \ |
| 769 } else { \ |
| 770 if (HasImmediateInput(instr, 1)) { \ |
| 771 __ asm_instr(i.InputOperand(0), i.InputImmediate(1)); \ |
| 772 } else { \ |
| 773 __ asm_instr(i.InputRegister(0), i.InputOperand(1)); \ |
| 774 } \ |
| 775 } \ |
| 776 } while (0) |
| 777 |
| 763 void CodeGenerator::AssembleDeconstructFrame() { | 778 void CodeGenerator::AssembleDeconstructFrame() { |
| 764 __ mov(esp, ebp); | 779 __ mov(esp, ebp); |
| 765 __ pop(ebp); | 780 __ pop(ebp); |
| 766 } | 781 } |
| 767 | 782 |
| 768 void CodeGenerator::AssemblePrepareTailCall() { | 783 void CodeGenerator::AssemblePrepareTailCall() { |
| 769 if (frame_access_state()->has_frame()) { | 784 if (frame_access_state()->has_frame()) { |
| 770 __ mov(ebp, MemOperand(ebp, 0)); | 785 __ mov(ebp, MemOperand(ebp, 0)); |
| 771 } | 786 } |
| 772 frame_access_state()->SetFrameAccessToSP(); | 787 frame_access_state()->SetFrameAccessToSP(); |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1123 case kIeee754Float64Sinh: | 1138 case kIeee754Float64Sinh: |
| 1124 ASSEMBLE_IEEE754_UNOP(sinh); | 1139 ASSEMBLE_IEEE754_UNOP(sinh); |
| 1125 break; | 1140 break; |
| 1126 case kIeee754Float64Tan: | 1141 case kIeee754Float64Tan: |
| 1127 ASSEMBLE_IEEE754_UNOP(tan); | 1142 ASSEMBLE_IEEE754_UNOP(tan); |
| 1128 break; | 1143 break; |
| 1129 case kIeee754Float64Tanh: | 1144 case kIeee754Float64Tanh: |
| 1130 ASSEMBLE_IEEE754_UNOP(tanh); | 1145 ASSEMBLE_IEEE754_UNOP(tanh); |
| 1131 break; | 1146 break; |
| 1132 case kIA32Add: | 1147 case kIA32Add: |
| 1133 if (HasImmediateInput(instr, 1)) { | 1148 ASSEMBLE_BINOP(add); |
| 1134 __ add(i.InputOperand(0), i.InputImmediate(1)); | |
| 1135 } else { | |
| 1136 __ add(i.InputRegister(0), i.InputOperand(1)); | |
| 1137 } | |
| 1138 break; | 1149 break; |
| 1139 case kIA32And: | 1150 case kIA32And: |
| 1140 if (HasImmediateInput(instr, 1)) { | 1151 ASSEMBLE_BINOP(and_); |
| 1141 __ and_(i.InputOperand(0), i.InputImmediate(1)); | |
| 1142 } else { | |
| 1143 __ and_(i.InputRegister(0), i.InputOperand(1)); | |
| 1144 } | |
| 1145 break; | 1152 break; |
| 1146 case kIA32Cmp: | 1153 case kIA32Cmp: |
| 1147 ASSEMBLE_COMPARE(cmp); | 1154 ASSEMBLE_COMPARE(cmp); |
| 1148 break; | 1155 break; |
| 1149 case kIA32Cmp16: | 1156 case kIA32Cmp16: |
| 1150 ASSEMBLE_COMPARE(cmpw); | 1157 ASSEMBLE_COMPARE(cmpw); |
| 1151 break; | 1158 break; |
| 1152 case kIA32Cmp8: | 1159 case kIA32Cmp8: |
| 1153 ASSEMBLE_COMPARE(cmpb); | 1160 ASSEMBLE_COMPARE(cmpb); |
| 1154 break; | 1161 break; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1182 __ Move(edx, Immediate(0)); | 1189 __ Move(edx, Immediate(0)); |
| 1183 __ div(i.InputOperand(1)); | 1190 __ div(i.InputOperand(1)); |
| 1184 break; | 1191 break; |
| 1185 case kIA32Not: | 1192 case kIA32Not: |
| 1186 __ not_(i.OutputOperand()); | 1193 __ not_(i.OutputOperand()); |
| 1187 break; | 1194 break; |
| 1188 case kIA32Neg: | 1195 case kIA32Neg: |
| 1189 __ neg(i.OutputOperand()); | 1196 __ neg(i.OutputOperand()); |
| 1190 break; | 1197 break; |
| 1191 case kIA32Or: | 1198 case kIA32Or: |
| 1192 if (HasImmediateInput(instr, 1)) { | 1199 ASSEMBLE_BINOP(or_); |
| 1193 __ or_(i.InputOperand(0), i.InputImmediate(1)); | |
| 1194 } else { | |
| 1195 __ or_(i.InputRegister(0), i.InputOperand(1)); | |
| 1196 } | |
| 1197 break; | 1200 break; |
| 1198 case kIA32Xor: | 1201 case kIA32Xor: |
| 1199 if (HasImmediateInput(instr, 1)) { | 1202 ASSEMBLE_BINOP(xor_); |
| 1200 __ xor_(i.InputOperand(0), i.InputImmediate(1)); | |
| 1201 } else { | |
| 1202 __ xor_(i.InputRegister(0), i.InputOperand(1)); | |
| 1203 } | |
| 1204 break; | 1203 break; |
| 1205 case kIA32Sub: | 1204 case kIA32Sub: |
| 1206 if (HasImmediateInput(instr, 1)) { | 1205 ASSEMBLE_BINOP(sub); |
| 1207 __ sub(i.InputOperand(0), i.InputImmediate(1)); | |
| 1208 } else { | |
| 1209 __ sub(i.InputRegister(0), i.InputOperand(1)); | |
| 1210 } | |
| 1211 break; | 1206 break; |
| 1212 case kIA32Shl: | 1207 case kIA32Shl: |
| 1213 if (HasImmediateInput(instr, 1)) { | 1208 if (HasImmediateInput(instr, 1)) { |
| 1214 __ shl(i.OutputOperand(), i.InputInt5(1)); | 1209 __ shl(i.OutputOperand(), i.InputInt5(1)); |
| 1215 } else { | 1210 } else { |
| 1216 __ shl_cl(i.OutputOperand()); | 1211 __ shl_cl(i.OutputOperand()); |
| 1217 } | 1212 } |
| 1218 break; | 1213 break; |
| 1219 case kIA32Shr: | 1214 case kIA32Shr: |
| 1220 if (HasImmediateInput(instr, 1)) { | 1215 if (HasImmediateInput(instr, 1)) { |
| (...skipping 1485 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2706 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 2701 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
| 2707 __ Nop(padding_size); | 2702 __ Nop(padding_size); |
| 2708 } | 2703 } |
| 2709 } | 2704 } |
| 2710 | 2705 |
| 2711 #undef __ | 2706 #undef __ |
| 2712 | 2707 |
| 2713 } // namespace compiler | 2708 } // namespace compiler |
| 2714 } // namespace internal | 2709 } // namespace internal |
| 2715 } // namespace v8 | 2710 } // namespace v8 |
| OLD | NEW |