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

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

Issue 1414183006: [turbofan] Avoid unnecessary write barriers and improve code generation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix typo. Created 5 years, 1 month 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 | « src/compiler/simplified-lowering.cc ('k') | src/compiler/x64/instruction-codes-x64.h » ('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/compiler/code-generator-impl.h" 7 #include "src/compiler/code-generator-impl.h"
8 #include "src/compiler/gap-resolver.h" 8 #include "src/compiler/gap-resolver.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/osr.h" 10 #include "src/compiler/osr.h"
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 __ Movsd(MemOperand(rsp, 0), input_); 184 __ Movsd(MemOperand(rsp, 0), input_);
185 __ SlowTruncateToI(result_, rsp, 0); 185 __ SlowTruncateToI(result_, rsp, 0);
186 __ addp(rsp, Immediate(kDoubleSize)); 186 __ addp(rsp, Immediate(kDoubleSize));
187 } 187 }
188 188
189 private: 189 private:
190 Register const result_; 190 Register const result_;
191 XMMRegister const input_; 191 XMMRegister const input_;
192 }; 192 };
193 193
194
195 class OutOfLineRecordWrite final : public OutOfLineCode {
196 public:
197 OutOfLineRecordWrite(CodeGenerator* gen, Register object, Operand operand,
198 Register value, Register scratch0, Register scratch1,
199 RecordWriteMode mode)
200 : OutOfLineCode(gen),
201 object_(object),
202 operand_(operand),
203 value_(value),
204 scratch0_(scratch0),
205 scratch1_(scratch1),
206 mode_(mode) {}
207
208 void Generate() final {
209 if (mode_ > RecordWriteMode::kValueIsPointer) {
210 __ JumpIfSmi(value_, exit());
211 }
212 if (mode_ > RecordWriteMode::kValueIsMap) {
213 __ CheckPageFlag(value_, scratch0_,
ulan 2016/02/19 15:02:32 Eliding kPointersToHereAreInterestingMask check fo
214 MemoryChunk::kPointersToHereAreInterestingMask, zero,
215 exit());
216 }
217 SaveFPRegsMode const save_fp_mode =
218 frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs;
219 RecordWriteStub stub(isolate(), object_, scratch0_, scratch1_,
220 EMIT_REMEMBERED_SET, save_fp_mode);
221 __ leap(scratch1_, operand_);
222 __ CallStub(&stub);
223 }
224
225 private:
226 Register const object_;
227 Operand const operand_;
228 Register const value_;
229 Register const scratch0_;
230 Register const scratch1_;
231 RecordWriteMode const mode_;
232 };
233
194 } // namespace 234 } // namespace
195 235
196 236
197 #define ASSEMBLE_UNOP(asm_instr) \ 237 #define ASSEMBLE_UNOP(asm_instr) \
198 do { \ 238 do { \
199 if (instr->Output()->IsRegister()) { \ 239 if (instr->Output()->IsRegister()) { \
200 __ asm_instr(i.OutputRegister()); \ 240 __ asm_instr(i.OutputRegister()); \
201 } else { \ 241 } else { \
202 __ asm_instr(i.OutputOperand()); \ 242 __ asm_instr(i.OutputOperand()); \
203 } \ 243 } \
(...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 case kArchTruncateDoubleToI: { 687 case kArchTruncateDoubleToI: {
648 auto result = i.OutputRegister(); 688 auto result = i.OutputRegister();
649 auto input = i.InputDoubleRegister(0); 689 auto input = i.InputDoubleRegister(0);
650 auto ool = new (zone()) OutOfLineTruncateDoubleToI(this, result, input); 690 auto ool = new (zone()) OutOfLineTruncateDoubleToI(this, result, input);
651 __ Cvttsd2siq(result, input); 691 __ Cvttsd2siq(result, input);
652 __ cmpq(result, Immediate(1)); 692 __ cmpq(result, Immediate(1));
653 __ j(overflow, ool->entry()); 693 __ j(overflow, ool->entry());
654 __ bind(ool->exit()); 694 __ bind(ool->exit());
655 break; 695 break;
656 } 696 }
697 case kArchStoreWithWriteBarrier: {
698 RecordWriteMode mode =
699 static_cast<RecordWriteMode>(MiscField::decode(instr->opcode()));
700 Register object = i.InputRegister(0);
701 size_t index = 0;
702 Operand operand = i.MemoryOperand(&index);
703 Register value = i.InputRegister(index);
704 Register scratch0 = i.TempRegister(0);
705 Register scratch1 = i.TempRegister(1);
706 auto ool = new (zone()) OutOfLineRecordWrite(this, object, operand, value,
707 scratch0, scratch1, mode);
708 __ movp(operand, value);
709 __ CheckPageFlag(object, scratch0,
710 MemoryChunk::kPointersFromHereAreInterestingMask,
711 not_zero, ool->entry());
712 __ bind(ool->exit());
713 break;
714 }
657 case kX64Add32: 715 case kX64Add32:
658 ASSEMBLE_BINOP(addl); 716 ASSEMBLE_BINOP(addl);
659 break; 717 break;
660 case kX64Add: 718 case kX64Add:
661 ASSEMBLE_BINOP(addq); 719 ASSEMBLE_BINOP(addq);
662 break; 720 break;
663 case kX64Sub32: 721 case kX64Sub32:
664 ASSEMBLE_BINOP(subl); 722 ASSEMBLE_BINOP(subl);
665 break; 723 break;
666 case kX64Sub: 724 case kX64Sub:
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 break; 1350 break;
1293 case kX64Poke: { 1351 case kX64Poke: {
1294 int const slot = MiscField::decode(instr->opcode()); 1352 int const slot = MiscField::decode(instr->opcode());
1295 if (HasImmediateInput(instr, 0)) { 1353 if (HasImmediateInput(instr, 0)) {
1296 __ movq(Operand(rsp, slot * kPointerSize), i.InputImmediate(0)); 1354 __ movq(Operand(rsp, slot * kPointerSize), i.InputImmediate(0));
1297 } else { 1355 } else {
1298 __ movq(Operand(rsp, slot * kPointerSize), i.InputRegister(0)); 1356 __ movq(Operand(rsp, slot * kPointerSize), i.InputRegister(0));
1299 } 1357 }
1300 break; 1358 break;
1301 } 1359 }
1302 case kX64StoreWriteBarrier: {
1303 Register object = i.InputRegister(0);
1304 Register value = i.InputRegister(2);
1305 SaveFPRegsMode mode =
1306 frame()->DidAllocateDoubleRegisters() ? kSaveFPRegs : kDontSaveFPRegs;
1307 if (HasImmediateInput(instr, 1)) {
1308 int index = i.InputInt32(1);
1309 Register scratch = i.TempRegister(1);
1310 __ movq(Operand(object, index), value);
1311 __ RecordWriteContextSlot(object, index, value, scratch, mode);
1312 } else {
1313 Register index = i.InputRegister(1);
1314 __ movq(Operand(object, index, times_1, 0), value);
1315 __ leaq(index, Operand(object, index, times_1, 0));
1316 __ RecordWrite(object, index, value, mode);
1317 }
1318 break;
1319 }
1320 case kCheckedLoadInt8: 1360 case kCheckedLoadInt8:
1321 ASSEMBLE_CHECKED_LOAD_INTEGER(movsxbl); 1361 ASSEMBLE_CHECKED_LOAD_INTEGER(movsxbl);
1322 break; 1362 break;
1323 case kCheckedLoadUint8: 1363 case kCheckedLoadUint8:
1324 ASSEMBLE_CHECKED_LOAD_INTEGER(movzxbl); 1364 ASSEMBLE_CHECKED_LOAD_INTEGER(movzxbl);
1325 break; 1365 break;
1326 case kCheckedLoadInt16: 1366 case kCheckedLoadInt16:
1327 ASSEMBLE_CHECKED_LOAD_INTEGER(movsxwl); 1367 ASSEMBLE_CHECKED_LOAD_INTEGER(movsxwl);
1328 break; 1368 break;
1329 case kCheckedLoadUint16: 1369 case kCheckedLoadUint16:
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
1845 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 1885 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
1846 __ Nop(padding_size); 1886 __ Nop(padding_size);
1847 } 1887 }
1848 } 1888 }
1849 1889
1850 #undef __ 1890 #undef __
1851 1891
1852 } // namespace compiler 1892 } // namespace compiler
1853 } // namespace internal 1893 } // namespace internal
1854 } // namespace v8 1894 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/simplified-lowering.cc ('k') | src/compiler/x64/instruction-codes-x64.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698