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_, | |
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 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 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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |