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/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" |
11 #include "src/compiler/osr.h" | 11 #include "src/compiler/osr.h" |
| 12 #include "src/wasm/wasm-module.h" |
12 #include "src/x64/assembler-x64.h" | 13 #include "src/x64/assembler-x64.h" |
13 #include "src/x64/macro-assembler-x64.h" | 14 #include "src/x64/macro-assembler-x64.h" |
14 | 15 |
15 namespace v8 { | 16 namespace v8 { |
16 namespace internal { | 17 namespace internal { |
17 namespace compiler { | 18 namespace compiler { |
18 | 19 |
19 #define __ masm()-> | 20 #define __ masm()-> |
20 | 21 |
21 // Adds X64 specific methods for decoding operands. | 22 // Adds X64 specific methods for decoding operands. |
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 | 254 |
254 private: | 255 private: |
255 Register const object_; | 256 Register const object_; |
256 Operand const operand_; | 257 Operand const operand_; |
257 Register const value_; | 258 Register const value_; |
258 Register const scratch0_; | 259 Register const scratch0_; |
259 Register const scratch1_; | 260 Register const scratch1_; |
260 RecordWriteMode const mode_; | 261 RecordWriteMode const mode_; |
261 }; | 262 }; |
262 | 263 |
| 264 class WasmOutOfLineTrap final : public OutOfLineCode { |
| 265 public: |
| 266 WasmOutOfLineTrap(CodeGenerator* gen, Address pc, bool frame_elided, |
| 267 Register context, int32_t position) |
| 268 : OutOfLineCode(gen), |
| 269 pc_(pc), |
| 270 frame_elided_(frame_elided), |
| 271 context_(context), |
| 272 position_(position) {} |
| 273 |
| 274 void Generate() final { |
| 275 // TODO(eholk): record pc_ and the current pc in a table so that |
| 276 // the signal handler can find it. |
| 277 USE(pc_); |
| 278 |
| 279 if (frame_elided_) { |
| 280 __ EnterFrame(StackFrame::WASM); |
| 281 } |
| 282 |
| 283 wasm::TrapReason trap_id = wasm::kTrapMemOutOfBounds; |
| 284 int trap_reason = wasm::WasmOpcodes::TrapReasonToMessageId(trap_id); |
| 285 __ Push(Smi::FromInt(trap_reason)); |
| 286 __ Push(Smi::FromInt(position_)); |
| 287 __ Move(rsi, context_); |
| 288 __ CallRuntime(Runtime::kThrowWasmError); |
| 289 } |
| 290 |
| 291 private: |
| 292 Address pc_; |
| 293 bool frame_elided_; |
| 294 Register context_; |
| 295 int32_t position_; |
| 296 }; |
| 297 |
263 } // namespace | 298 } // namespace |
264 | 299 |
265 | 300 |
266 #define ASSEMBLE_UNOP(asm_instr) \ | 301 #define ASSEMBLE_UNOP(asm_instr) \ |
267 do { \ | 302 do { \ |
268 if (instr->Output()->IsRegister()) { \ | 303 if (instr->Output()->IsRegister()) { \ |
269 __ asm_instr(i.OutputRegister()); \ | 304 __ asm_instr(i.OutputRegister()); \ |
270 } else { \ | 305 } else { \ |
271 __ asm_instr(i.OutputOperand()); \ | 306 __ asm_instr(i.OutputOperand()); \ |
272 } \ | 307 } \ |
(...skipping 1569 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1842 size_t index = 0; | 1877 size_t index = 0; |
1843 Operand operand = i.MemoryOperand(&index); | 1878 Operand operand = i.MemoryOperand(&index); |
1844 if (HasImmediateInput(instr, index)) { | 1879 if (HasImmediateInput(instr, index)) { |
1845 __ movw(operand, Immediate(i.InputInt16(index))); | 1880 __ movw(operand, Immediate(i.InputInt16(index))); |
1846 } else { | 1881 } else { |
1847 __ movw(operand, i.InputRegister(index)); | 1882 __ movw(operand, i.InputRegister(index)); |
1848 } | 1883 } |
1849 break; | 1884 break; |
1850 } | 1885 } |
1851 case kX64Movl: | 1886 case kX64Movl: |
| 1887 case kX64TrapMovl: |
1852 if (instr->HasOutput()) { | 1888 if (instr->HasOutput()) { |
1853 if (instr->addressing_mode() == kMode_None) { | 1889 if (instr->addressing_mode() == kMode_None) { |
1854 if (instr->InputAt(0)->IsRegister()) { | 1890 if (instr->InputAt(0)->IsRegister()) { |
1855 __ movl(i.OutputRegister(), i.InputRegister(0)); | 1891 __ movl(i.OutputRegister(), i.InputRegister(0)); |
1856 } else { | 1892 } else { |
1857 __ movl(i.OutputRegister(), i.InputOperand(0)); | 1893 __ movl(i.OutputRegister(), i.InputOperand(0)); |
1858 } | 1894 } |
1859 } else { | 1895 } else { |
| 1896 Address pc = __ pc(); |
1860 __ movl(i.OutputRegister(), i.MemoryOperand()); | 1897 __ movl(i.OutputRegister(), i.MemoryOperand()); |
| 1898 |
| 1899 if (arch_opcode == kX64TrapMovl) { |
| 1900 bool frame_elided = !frame_access_state()->has_frame(); |
| 1901 new (zone()) WasmOutOfLineTrap(this, pc, frame_elided, |
| 1902 i.InputRegister(2), i.InputInt32(3)); |
| 1903 } |
1861 } | 1904 } |
1862 __ AssertZeroExtended(i.OutputRegister()); | 1905 __ AssertZeroExtended(i.OutputRegister()); |
1863 } else { | 1906 } else { |
1864 size_t index = 0; | 1907 size_t index = 0; |
1865 Operand operand = i.MemoryOperand(&index); | 1908 Operand operand = i.MemoryOperand(&index); |
1866 if (HasImmediateInput(instr, index)) { | 1909 if (HasImmediateInput(instr, index)) { |
1867 __ movl(operand, i.InputImmediate(index)); | 1910 __ movl(operand, i.InputImmediate(index)); |
1868 } else { | 1911 } else { |
1869 __ movl(operand, i.InputRegister(index)); | 1912 __ movl(operand, i.InputRegister(index)); |
1870 } | 1913 } |
(...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2674 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; | 2717 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; |
2675 __ Nop(padding_size); | 2718 __ Nop(padding_size); |
2676 } | 2719 } |
2677 } | 2720 } |
2678 | 2721 |
2679 #undef __ | 2722 #undef __ |
2680 | 2723 |
2681 } // namespace compiler | 2724 } // namespace compiler |
2682 } // namespace internal | 2725 } // namespace internal |
2683 } // namespace v8 | 2726 } // namespace v8 |
OLD | NEW |