Chromium Code Reviews| 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 |