Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(193)

Side by Side Diff: src/compiler/ia32/code-generator-ia32.cc

Issue 2728533003: [turbofan] Enable complex memory operands for binops on ia32/x64 (Closed)
Patch Set: Rebase and Add tests for the 64-bit variants Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/compiler/ia32/instruction-selector-ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | src/compiler/ia32/instruction-selector-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698