OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/wasm-compiler.h" | 5 #include "src/compiler/wasm-compiler.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/isolate-inl.h" | 9 #include "src/isolate-inl.h" |
10 | 10 |
(...skipping 1849 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1860 Node* WasmGraphBuilder::BuildI32RemU(Node* left, Node* right, | 1860 Node* WasmGraphBuilder::BuildI32RemU(Node* left, Node* right, |
1861 wasm::WasmCodePosition position) { | 1861 wasm::WasmCodePosition position) { |
1862 MachineOperatorBuilder* m = jsgraph()->machine(); | 1862 MachineOperatorBuilder* m = jsgraph()->machine(); |
1863 return graph()->NewNode( | 1863 return graph()->NewNode( |
1864 m->Uint32Mod(), left, right, | 1864 m->Uint32Mod(), left, right, |
1865 trap_->ZeroCheck32(wasm::kTrapRemByZero, right, position)); | 1865 trap_->ZeroCheck32(wasm::kTrapRemByZero, right, position)); |
1866 } | 1866 } |
1867 | 1867 |
1868 Node* WasmGraphBuilder::BuildI32AsmjsDivS(Node* left, Node* right) { | 1868 Node* WasmGraphBuilder::BuildI32AsmjsDivS(Node* left, Node* right) { |
1869 MachineOperatorBuilder* m = jsgraph()->machine(); | 1869 MachineOperatorBuilder* m = jsgraph()->machine(); |
| 1870 |
| 1871 Int32Matcher mr(right); |
| 1872 if (mr.HasValue()) { |
| 1873 if (mr.Value() == 0) { |
| 1874 return jsgraph()->Int32Constant(0); |
| 1875 } else if (mr.Value() == -1) { |
| 1876 // The result is the negation of the left input. |
| 1877 return graph()->NewNode(m->Int32Sub(), jsgraph()->Int32Constant(0), left); |
| 1878 } |
| 1879 return graph()->NewNode(m->Int32Div(), left, right, *control_); |
| 1880 } |
| 1881 |
1870 // asm.js semantics return 0 on divide or mod by zero. | 1882 // asm.js semantics return 0 on divide or mod by zero. |
1871 if (m->Int32DivIsSafe()) { | 1883 if (m->Int32DivIsSafe()) { |
1872 // The hardware instruction does the right thing (e.g. arm). | 1884 // The hardware instruction does the right thing (e.g. arm). |
1873 return graph()->NewNode(m->Int32Div(), left, right, graph()->start()); | 1885 return graph()->NewNode(m->Int32Div(), left, right, graph()->start()); |
1874 } | 1886 } |
1875 | 1887 |
1876 // Check denominator for zero. | 1888 // Check denominator for zero. |
1877 Diamond z( | 1889 Diamond z( |
1878 graph(), jsgraph()->common(), | 1890 graph(), jsgraph()->common(), |
1879 graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(0)), | 1891 graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(0)), |
1880 BranchHint::kFalse); | 1892 BranchHint::kFalse); |
1881 | 1893 |
1882 // Check numerator for -1. (avoid minint / -1 case). | 1894 // Check numerator for -1. (avoid minint / -1 case). |
1883 Diamond n( | 1895 Diamond n( |
1884 graph(), jsgraph()->common(), | 1896 graph(), jsgraph()->common(), |
1885 graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(-1)), | 1897 graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(-1)), |
1886 BranchHint::kFalse); | 1898 BranchHint::kFalse); |
1887 | 1899 |
1888 Node* div = graph()->NewNode(m->Int32Div(), left, right, z.if_false); | 1900 Node* div = graph()->NewNode(m->Int32Div(), left, right, z.if_false); |
1889 Node* neg = | 1901 Node* neg = |
1890 graph()->NewNode(m->Int32Sub(), jsgraph()->Int32Constant(0), left); | 1902 graph()->NewNode(m->Int32Sub(), jsgraph()->Int32Constant(0), left); |
1891 | 1903 |
1892 return n.Phi( | 1904 return n.Phi( |
1893 MachineRepresentation::kWord32, neg, | 1905 MachineRepresentation::kWord32, neg, |
1894 z.Phi(MachineRepresentation::kWord32, jsgraph()->Int32Constant(0), div)); | 1906 z.Phi(MachineRepresentation::kWord32, jsgraph()->Int32Constant(0), div)); |
1895 } | 1907 } |
1896 | 1908 |
1897 Node* WasmGraphBuilder::BuildI32AsmjsRemS(Node* left, Node* right) { | 1909 Node* WasmGraphBuilder::BuildI32AsmjsRemS(Node* left, Node* right) { |
1898 MachineOperatorBuilder* m = jsgraph()->machine(); | 1910 MachineOperatorBuilder* m = jsgraph()->machine(); |
| 1911 |
| 1912 Int32Matcher mr(right); |
| 1913 if (mr.HasValue()) { |
| 1914 if (mr.Value() == 0) { |
| 1915 return jsgraph()->Int32Constant(0); |
| 1916 } else if (mr.Value() == -1) { |
| 1917 return jsgraph()->Int32Constant(0); |
| 1918 } |
| 1919 return graph()->NewNode(m->Int32Mod(), left, right, *control_); |
| 1920 } |
| 1921 |
1899 // asm.js semantics return 0 on divide or mod by zero. | 1922 // asm.js semantics return 0 on divide or mod by zero. |
1900 // Explicit check for x % 0. | 1923 // Explicit check for x % 0. |
1901 Diamond z( | 1924 Diamond z( |
1902 graph(), jsgraph()->common(), | 1925 graph(), jsgraph()->common(), |
1903 graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(0)), | 1926 graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(0)), |
1904 BranchHint::kFalse); | 1927 BranchHint::kFalse); |
1905 | 1928 |
1906 // Explicit check for x % -1. | 1929 // Explicit check for x % -1. |
1907 Diamond d( | 1930 Diamond d( |
1908 graph(), jsgraph()->common(), | 1931 graph(), jsgraph()->common(), |
(...skipping 1550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3459 function_->code_start_offset), | 3482 function_->code_start_offset), |
3460 compile_ms); | 3483 compile_ms); |
3461 } | 3484 } |
3462 | 3485 |
3463 return code; | 3486 return code; |
3464 } | 3487 } |
3465 | 3488 |
3466 } // namespace compiler | 3489 } // namespace compiler |
3467 } // namespace internal | 3490 } // namespace internal |
3468 } // namespace v8 | 3491 } // namespace v8 |
OLD | NEW |