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/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 Loading... |
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_, |
| 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 Loading... |
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 kArchRecordWrite: { |
| 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 = (mode > RecordWriteMode::kValueIsMap) |
| 704 ? i.InputRegister(index) |
| 705 : no_reg; |
| 706 Register scratch0 = i.TempRegister(0); |
| 707 Register scratch1 = i.TempRegister(1); |
| 708 auto ool = new (zone()) OutOfLineRecordWrite(this, object, operand, value, |
| 709 scratch0, scratch1, mode); |
| 710 __ CheckPageFlag(object, scratch0, |
| 711 MemoryChunk::kPointersFromHereAreInterestingMask, |
| 712 not_zero, ool->entry()); |
| 713 __ bind(ool->exit()); |
| 714 break; |
| 715 } |
657 case kX64Add32: | 716 case kX64Add32: |
658 ASSEMBLE_BINOP(addl); | 717 ASSEMBLE_BINOP(addl); |
659 break; | 718 break; |
660 case kX64Add: | 719 case kX64Add: |
661 ASSEMBLE_BINOP(addq); | 720 ASSEMBLE_BINOP(addq); |
662 break; | 721 break; |
663 case kX64Sub32: | 722 case kX64Sub32: |
664 ASSEMBLE_BINOP(subl); | 723 ASSEMBLE_BINOP(subl); |
665 break; | 724 break; |
666 case kX64Sub: | 725 case kX64Sub: |
(...skipping 625 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1292 break; | 1351 break; |
1293 case kX64Poke: { | 1352 case kX64Poke: { |
1294 int const slot = MiscField::decode(instr->opcode()); | 1353 int const slot = MiscField::decode(instr->opcode()); |
1295 if (HasImmediateInput(instr, 0)) { | 1354 if (HasImmediateInput(instr, 0)) { |
1296 __ movq(Operand(rsp, slot * kPointerSize), i.InputImmediate(0)); | 1355 __ movq(Operand(rsp, slot * kPointerSize), i.InputImmediate(0)); |
1297 } else { | 1356 } else { |
1298 __ movq(Operand(rsp, slot * kPointerSize), i.InputRegister(0)); | 1357 __ movq(Operand(rsp, slot * kPointerSize), i.InputRegister(0)); |
1299 } | 1358 } |
1300 break; | 1359 break; |
1301 } | 1360 } |
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: | 1361 case kCheckedLoadInt8: |
1321 ASSEMBLE_CHECKED_LOAD_INTEGER(movsxbl); | 1362 ASSEMBLE_CHECKED_LOAD_INTEGER(movsxbl); |
1322 break; | 1363 break; |
1323 case kCheckedLoadUint8: | 1364 case kCheckedLoadUint8: |
1324 ASSEMBLE_CHECKED_LOAD_INTEGER(movzxbl); | 1365 ASSEMBLE_CHECKED_LOAD_INTEGER(movzxbl); |
1325 break; | 1366 break; |
1326 case kCheckedLoadInt16: | 1367 case kCheckedLoadInt16: |
1327 ASSEMBLE_CHECKED_LOAD_INTEGER(movsxwl); | 1368 ASSEMBLE_CHECKED_LOAD_INTEGER(movsxwl); |
1328 break; | 1369 break; |
1329 case kCheckedLoadUint16: | 1370 case kCheckedLoadUint16: |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1845 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 1886 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
1846 __ Nop(padding_size); | 1887 __ Nop(padding_size); |
1847 } | 1888 } |
1848 } | 1889 } |
1849 | 1890 |
1850 #undef __ | 1891 #undef __ |
1851 | 1892 |
1852 } // namespace compiler | 1893 } // namespace compiler |
1853 } // namespace internal | 1894 } // namespace internal |
1854 } // namespace v8 | 1895 } // namespace v8 |
OLD | NEW |