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 |