Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(655)

Side by Side Diff: src/compiler/wasm-compiler.cc

Issue 1519013003: [wasm] Change the return type of traps for tests, and added ftoi64 instructions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@f32toui64
Patch Set: Fixed nits. Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | test/cctest/wasm/test-run-wasm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 5
6 #include "src/compiler/access-builder.h" 6 #include "src/compiler/access-builder.h"
7 #include "src/compiler/change-lowering.h" 7 #include "src/compiler/change-lowering.h"
8 #include "src/compiler/common-operator.h" 8 #include "src/compiler/common-operator.h"
9 #include "src/compiler/diamond.h" 9 #include "src/compiler/diamond.h"
10 #include "src/compiler/graph.h" 10 #include "src/compiler/graph.h"
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 *effect_ptr = node; 216 *effect_ptr = node;
217 } 217 }
218 if (false) { 218 if (false) {
219 // End the control flow with a throw 219 // End the control flow with a throw
220 Node* thrw = 220 Node* thrw =
221 graph()->NewNode(common()->Throw(), jsgraph()->ZeroConstant(), 221 graph()->NewNode(common()->Throw(), jsgraph()->ZeroConstant(),
222 *effect_ptr, *control_ptr); 222 *effect_ptr, *control_ptr);
223 end = thrw; 223 end = thrw;
224 } else { 224 } else {
225 // End the control flow with returning 0xdeadbeef 225 // End the control flow with returning 0xdeadbeef
226 Node* ret_dead = graph()->NewNode(common()->Return(), 226 Node* ret_value;
227 jsgraph()->Int32Constant(0xdeadbeef), 227 if (builder_->GetFunctionSignature()->return_count() > 0) {
228 *effect_ptr, *control_ptr); 228 switch (builder_->GetFunctionSignature()->GetReturn()) {
229 end = ret_dead; 229 case wasm::kAstI32:
230 ret_value = jsgraph()->Int32Constant(0xdeadbeef);
231 break;
232 case wasm::kAstI64:
233 ret_value = jsgraph()->Int64Constant(0xdeadbeefdeadbeef);
234 break;
235 case wasm::kAstF32:
236 ret_value = jsgraph()->Float32Constant(bit_cast<float>(0xdeadbeef));
237 break;
238 case wasm::kAstF64:
239 ret_value = jsgraph()->Float64Constant(
240 bit_cast<double>(0xdeadbeefdeadbeef));
241 break;
242 default:
243 UNREACHABLE();
244 ret_value = nullptr;
245 }
246 } else {
247 ret_value = jsgraph()->Int32Constant(0xdeadbeef);
248 }
249 end = graph()->NewNode(jsgraph()->common()->Return(), ret_value,
250 *effect_ptr, *control_ptr);
230 } 251 }
231 252
232 MergeControlToEnd(jsgraph(), end); 253 MergeControlToEnd(jsgraph(), end);
233 } 254 }
234 }; 255 };
235 256
236 257
237 WasmGraphBuilder::WasmGraphBuilder(Zone* zone, JSGraph* jsgraph) 258 WasmGraphBuilder::WasmGraphBuilder(Zone* zone, JSGraph* jsgraph,
259 wasm::FunctionSig* function_signature)
238 : zone_(zone), 260 : zone_(zone),
239 jsgraph_(jsgraph), 261 jsgraph_(jsgraph),
240 module_(nullptr), 262 module_(nullptr),
241 mem_buffer_(nullptr), 263 mem_buffer_(nullptr),
242 mem_size_(nullptr), 264 mem_size_(nullptr),
243 function_table_(nullptr), 265 function_table_(nullptr),
244 control_(nullptr), 266 control_(nullptr),
245 effect_(nullptr), 267 effect_(nullptr),
246 cur_buffer_(def_buffer_), 268 cur_buffer_(def_buffer_),
247 cur_bufsize_(kDefaultBufferSize), 269 cur_bufsize_(kDefaultBufferSize),
248 trap_(new (zone) WasmTrapHelper(this)) { 270 trap_(new (zone) WasmTrapHelper(this)),
271 function_signature_(function_signature) {
249 DCHECK_NOT_NULL(jsgraph_); 272 DCHECK_NOT_NULL(jsgraph_);
250 } 273 }
251 274
252 275
253 Node* WasmGraphBuilder::Error() { return jsgraph()->Dead(); } 276 Node* WasmGraphBuilder::Error() { return jsgraph()->Dead(); }
254 277
255 278
256 Node* WasmGraphBuilder::Start(unsigned params) { 279 Node* WasmGraphBuilder::Start(unsigned params) {
257 Node* start = graph()->NewNode(jsgraph()->common()->Start(params)); 280 Node* start = graph()->NewNode(jsgraph()->common()->Start(params));
258 graph()->SetStart(start); 281 graph()->SetStart(start);
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
836 break; 859 break;
837 case wasm::kExprF32UConvertI64: 860 case wasm::kExprF32UConvertI64:
838 op = m->RoundUint64ToFloat32(); 861 op = m->RoundUint64ToFloat32();
839 break; 862 break;
840 case wasm::kExprF64SConvertI64: 863 case wasm::kExprF64SConvertI64:
841 op = m->RoundInt64ToFloat64(); 864 op = m->RoundInt64ToFloat64();
842 break; 865 break;
843 case wasm::kExprF64UConvertI64: 866 case wasm::kExprF64UConvertI64:
844 op = m->RoundUint64ToFloat64(); 867 op = m->RoundUint64ToFloat64();
845 break; 868 break;
869 case wasm::kExprI64SConvertF32: {
870 Node* trunc = graph()->NewNode(m->TryTruncateFloat32ToInt64(), input);
871 Node* result =
872 graph()->NewNode(jsgraph()->common()->Projection(0), trunc);
873 Node* overflow =
874 graph()->NewNode(jsgraph()->common()->Projection(1), trunc);
875 trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow);
876 return result;
877 }
878 case wasm::kExprI64SConvertF64: {
879 Node* trunc = graph()->NewNode(m->TryTruncateFloat64ToInt64(), input);
880 Node* result =
881 graph()->NewNode(jsgraph()->common()->Projection(0), trunc);
882 Node* overflow =
883 graph()->NewNode(jsgraph()->common()->Projection(1), trunc);
884 trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow);
885 return result;
886 }
887 case wasm::kExprI64UConvertF32: {
888 Node* trunc = graph()->NewNode(m->TryTruncateFloat32ToUint64(), input);
889 Node* result =
890 graph()->NewNode(jsgraph()->common()->Projection(0), trunc);
891 Node* overflow =
892 graph()->NewNode(jsgraph()->common()->Projection(1), trunc);
893 trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow);
894 return result;
895 }
896 case wasm::kExprI64UConvertF64: {
897 Node* trunc = graph()->NewNode(m->TryTruncateFloat64ToUint64(), input);
898 Node* result =
899 graph()->NewNode(jsgraph()->common()->Projection(0), trunc);
900 Node* overflow =
901 graph()->NewNode(jsgraph()->common()->Projection(1), trunc);
902 trap_->ZeroCheck64(kTrapFloatUnrepresentable, overflow);
903 return result;
904 }
846 case wasm::kExprF64ReinterpretI64: 905 case wasm::kExprF64ReinterpretI64:
847 op = m->BitcastInt64ToFloat64(); 906 op = m->BitcastInt64ToFloat64();
848 break; 907 break;
849 case wasm::kExprI64ReinterpretF64: 908 case wasm::kExprI64ReinterpretF64:
850 op = m->BitcastFloat64ToInt64(); 909 op = m->BitcastFloat64ToInt64();
851 break; 910 break;
852 case wasm::kExprI64Clz: 911 case wasm::kExprI64Clz:
853 op = m->Word64Clz(); 912 op = m->Word64Clz();
854 break; 913 break;
855 case wasm::kExprI64Ctz: { 914 case wasm::kExprI64Ctz: {
(...skipping 753 matching lines...) Expand 10 before | Expand all | Expand 10 after
1609 Zone zone; 1668 Zone zone;
1610 Graph graph(&zone); 1669 Graph graph(&zone);
1611 CommonOperatorBuilder common(&zone); 1670 CommonOperatorBuilder common(&zone);
1612 JSOperatorBuilder javascript(&zone); 1671 JSOperatorBuilder javascript(&zone);
1613 MachineOperatorBuilder machine(&zone); 1672 MachineOperatorBuilder machine(&zone);
1614 JSGraph jsgraph(isolate, &graph, &common, &javascript, nullptr, &machine); 1673 JSGraph jsgraph(isolate, &graph, &common, &javascript, nullptr, &machine);
1615 1674
1616 Node* control = nullptr; 1675 Node* control = nullptr;
1617 Node* effect = nullptr; 1676 Node* effect = nullptr;
1618 1677
1619 WasmGraphBuilder builder(&zone, &jsgraph); 1678 WasmGraphBuilder builder(&zone, &jsgraph, func->sig);
1620 builder.set_control_ptr(&control); 1679 builder.set_control_ptr(&control);
1621 builder.set_effect_ptr(&effect); 1680 builder.set_effect_ptr(&effect);
1622 builder.set_module(module); 1681 builder.set_module(module);
1623 builder.BuildJSToWasmWrapper(wasm_code, func->sig); 1682 builder.BuildJSToWasmWrapper(wasm_code, func->sig);
1624 1683
1625 //---------------------------------------------------------------------------- 1684 //----------------------------------------------------------------------------
1626 // Run the compilation pipeline. 1685 // Run the compilation pipeline.
1627 //---------------------------------------------------------------------------- 1686 //----------------------------------------------------------------------------
1628 { 1687 {
1629 // Changes lowering requires types. 1688 // Changes lowering requires types.
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1691 Zone zone; 1750 Zone zone;
1692 Graph graph(&zone); 1751 Graph graph(&zone);
1693 CommonOperatorBuilder common(&zone); 1752 CommonOperatorBuilder common(&zone);
1694 JSOperatorBuilder javascript(&zone); 1753 JSOperatorBuilder javascript(&zone);
1695 MachineOperatorBuilder machine(&zone); 1754 MachineOperatorBuilder machine(&zone);
1696 JSGraph jsgraph(isolate, &graph, &common, &javascript, nullptr, &machine); 1755 JSGraph jsgraph(isolate, &graph, &common, &javascript, nullptr, &machine);
1697 1756
1698 Node* control = nullptr; 1757 Node* control = nullptr;
1699 Node* effect = nullptr; 1758 Node* effect = nullptr;
1700 1759
1701 WasmGraphBuilder builder(&zone, &jsgraph); 1760 WasmGraphBuilder builder(&zone, &jsgraph, func->sig);
1702 builder.set_control_ptr(&control); 1761 builder.set_control_ptr(&control);
1703 builder.set_effect_ptr(&effect); 1762 builder.set_effect_ptr(&effect);
1704 builder.set_module(module); 1763 builder.set_module(module);
1705 builder.BuildWasmToJSWrapper(function, func->sig); 1764 builder.BuildWasmToJSWrapper(function, func->sig);
1706 1765
1707 Handle<Code> code = Handle<Code>::null(); 1766 Handle<Code> code = Handle<Code>::null();
1708 { 1767 {
1709 // Changes lowering requires types. 1768 // Changes lowering requires types.
1710 Typer typer(isolate, &graph); 1769 Typer typer(isolate, &graph);
1711 NodeVector roots(&zone); 1770 NodeVector roots(&zone);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
1779 env.SumLocals(); 1838 env.SumLocals();
1780 1839
1781 // Create a TF graph during decoding. 1840 // Create a TF graph during decoding.
1782 Zone zone; 1841 Zone zone;
1783 Graph graph(&zone); 1842 Graph graph(&zone);
1784 CommonOperatorBuilder common(&zone); 1843 CommonOperatorBuilder common(&zone);
1785 MachineOperatorBuilder machine( 1844 MachineOperatorBuilder machine(
1786 &zone, MachineType::PointerRepresentation(), 1845 &zone, MachineType::PointerRepresentation(),
1787 InstructionSelector::SupportedMachineOperatorFlags()); 1846 InstructionSelector::SupportedMachineOperatorFlags());
1788 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); 1847 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine);
1789 WasmGraphBuilder builder(&zone, &jsgraph); 1848 WasmGraphBuilder builder(&zone, &jsgraph, function.sig);
1790 wasm::TreeResult result = wasm::BuildTFGraph( 1849 wasm::TreeResult result = wasm::BuildTFGraph(
1791 &builder, &env, // -- 1850 &builder, &env, // --
1792 module_env->module->module_start, // -- 1851 module_env->module->module_start, // --
1793 module_env->module->module_start + function.code_start_offset, // -- 1852 module_env->module->module_start + function.code_start_offset, // --
1794 module_env->module->module_start + function.code_end_offset); // -- 1853 module_env->module->module_start + function.code_end_offset); // --
1795 1854
1796 if (result.failed()) { 1855 if (result.failed()) {
1797 if (FLAG_trace_wasm_compiler) { 1856 if (FLAG_trace_wasm_compiler) {
1798 OFStream os(stdout); 1857 OFStream os(stdout);
1799 os << "Compilation failed: " << result << std::endl; 1858 os << "Compilation failed: " << result << std::endl;
(...skipping 30 matching lines...) Expand all
1830 code->Disassemble(buffer, os); 1889 code->Disassemble(buffer, os);
1831 } 1890 }
1832 #endif 1891 #endif
1833 return code; 1892 return code;
1834 } 1893 }
1835 1894
1836 1895
1837 } // namespace compiler 1896 } // namespace compiler
1838 } // namespace internal 1897 } // namespace internal
1839 } // namespace v8 1898 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/wasm-compiler.h ('k') | test/cctest/wasm/test-run-wasm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698