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 1778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1789 *control_ = merge; | 1789 *control_ = merge; |
1790 *effect_ = effect_merge; | 1790 *effect_ = effect_merge; |
1791 return value_i32; | 1791 return value_i32; |
1792 } | 1792 } |
1793 | 1793 |
1794 Node* WasmGraphBuilder::BuildI32DivS(Node* left, Node* right, | 1794 Node* WasmGraphBuilder::BuildI32DivS(Node* left, Node* right, |
1795 wasm::WasmCodePosition position) { | 1795 wasm::WasmCodePosition position) { |
1796 MachineOperatorBuilder* m = jsgraph()->machine(); | 1796 MachineOperatorBuilder* m = jsgraph()->machine(); |
1797 trap_->ZeroCheck32(wasm::kTrapDivByZero, right, position); | 1797 trap_->ZeroCheck32(wasm::kTrapDivByZero, right, position); |
1798 Node* before = *control_; | 1798 Node* before = *control_; |
1799 Node* denom_is_m1; | 1799 Node* is_denom_m1 = |
titzer
2016/10/17 13:44:16
Can you add a branch hint to the old method so tha
| |
1800 Node* denom_is_not_m1; | 1800 graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(-1)); |
1801 Branch( | 1801 Node* branch = graph()->NewNode( |
1802 graph()->NewNode(m->Word32Equal(), right, jsgraph()->Int32Constant(-1)), | 1802 jsgraph()->common()->Branch(BranchHint::kFalse), is_denom_m1, *control_); |
1803 &denom_is_m1, &denom_is_not_m1); | 1803 Node* denom_is_m1 = graph()->NewNode(jsgraph()->common()->IfTrue(), branch); |
1804 Node* denom_is_not_m1 = | |
1805 graph()->NewNode(jsgraph()->common()->IfFalse(), branch); | |
1804 *control_ = denom_is_m1; | 1806 *control_ = denom_is_m1; |
1805 trap_->TrapIfEq32(wasm::kTrapDivUnrepresentable, left, kMinInt, position); | 1807 trap_->TrapIfEq32(wasm::kTrapDivUnrepresentable, left, kMinInt, position); |
1806 if (*control_ != denom_is_m1) { | 1808 if (*control_ != denom_is_m1) { |
1807 *control_ = graph()->NewNode(jsgraph()->common()->Merge(2), denom_is_not_m1, | 1809 *control_ = graph()->NewNode(jsgraph()->common()->Merge(2), denom_is_not_m1, |
1808 *control_); | 1810 *control_); |
1809 } else { | 1811 } else { |
1810 *control_ = before; | 1812 *control_ = before; |
1811 } | 1813 } |
1812 return graph()->NewNode(m->Int32Div(), left, right, *control_); | 1814 return graph()->NewNode(m->Int32Div(), left, right, *control_); |
1813 } | 1815 } |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1924 BranchHint::kFalse); | 1926 BranchHint::kFalse); |
1925 | 1927 |
1926 Node* rem = graph()->NewNode(jsgraph()->machine()->Uint32Mod(), left, right, | 1928 Node* rem = graph()->NewNode(jsgraph()->machine()->Uint32Mod(), left, right, |
1927 z.if_false); | 1929 z.if_false); |
1928 return z.Phi(MachineRepresentation::kWord32, jsgraph()->Int32Constant(0), | 1930 return z.Phi(MachineRepresentation::kWord32, jsgraph()->Int32Constant(0), |
1929 rem); | 1931 rem); |
1930 } | 1932 } |
1931 | 1933 |
1932 Node* WasmGraphBuilder::BuildI64DivS(Node* left, Node* right, | 1934 Node* WasmGraphBuilder::BuildI64DivS(Node* left, Node* right, |
1933 wasm::WasmCodePosition position) { | 1935 wasm::WasmCodePosition position) { |
1934 if (jsgraph()->machine()->Is32()) { | 1936 MachineOperatorBuilder* m = jsgraph()->machine(); |
1937 if (m->Is32()) { | |
1935 return BuildDiv64Call( | 1938 return BuildDiv64Call( |
1936 left, right, ExternalReference::wasm_int64_div(jsgraph()->isolate()), | 1939 left, right, ExternalReference::wasm_int64_div(jsgraph()->isolate()), |
1937 MachineType::Int64(), wasm::kTrapDivByZero, position); | 1940 MachineType::Int64(), wasm::kTrapDivByZero, position); |
1938 } | 1941 } |
1939 trap_->ZeroCheck64(wasm::kTrapDivByZero, right, position); | 1942 trap_->ZeroCheck64(wasm::kTrapDivByZero, right, position); |
1940 Node* before = *control_; | 1943 Node* before = *control_; |
1941 Node* denom_is_m1; | 1944 Node* is_denom_m1 = |
1942 Node* denom_is_not_m1; | 1945 graph()->NewNode(m->Word64Equal(), right, jsgraph()->Int64Constant(-1)); |
1943 Branch(graph()->NewNode(jsgraph()->machine()->Word64Equal(), right, | 1946 Node* branch = graph()->NewNode( |
1944 jsgraph()->Int64Constant(-1)), | 1947 jsgraph()->common()->Branch(BranchHint::kFalse), is_denom_m1, *control_); |
1945 &denom_is_m1, &denom_is_not_m1); | 1948 Node* denom_is_m1 = graph()->NewNode(jsgraph()->common()->IfTrue(), branch); |
1949 Node* denom_is_not_m1 = | |
1950 graph()->NewNode(jsgraph()->common()->IfFalse(), branch); | |
1946 *control_ = denom_is_m1; | 1951 *control_ = denom_is_m1; |
1947 trap_->TrapIfEq64(wasm::kTrapDivUnrepresentable, left, | 1952 trap_->TrapIfEq64(wasm::kTrapDivUnrepresentable, left, |
1948 std::numeric_limits<int64_t>::min(), position); | 1953 std::numeric_limits<int64_t>::min(), position); |
1949 if (*control_ != denom_is_m1) { | 1954 if (*control_ != denom_is_m1) { |
1950 *control_ = graph()->NewNode(jsgraph()->common()->Merge(2), denom_is_not_m1, | 1955 *control_ = graph()->NewNode(jsgraph()->common()->Merge(2), denom_is_not_m1, |
1951 *control_); | 1956 *control_); |
1952 } else { | 1957 } else { |
1953 *control_ = before; | 1958 *control_ = before; |
1954 } | 1959 } |
1955 return graph()->NewNode(jsgraph()->machine()->Int64Div(), left, right, | 1960 return graph()->NewNode(jsgraph()->machine()->Int64Div(), left, right, |
(...skipping 1460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3416 function_->code_start_offset), | 3421 function_->code_start_offset), |
3417 compile_ms); | 3422 compile_ms); |
3418 } | 3423 } |
3419 | 3424 |
3420 return code; | 3425 return code; |
3421 } | 3426 } |
3422 | 3427 |
3423 } // namespace compiler | 3428 } // namespace compiler |
3424 } // namespace internal | 3429 } // namespace internal |
3425 } // namespace v8 | 3430 } // namespace v8 |
OLD | NEW |