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

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

Issue 1655883002: [wasm] Initial commit for the Int64Reducer. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Initialize replacement array Created 4 years, 10 months 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 #include "src/compiler/wasm-compiler.h" 5 #include "src/compiler/wasm-compiler.h"
6 6
7 #include "src/isolate-inl.h" 7 #include "src/isolate-inl.h"
8 8
9 #include "src/base/platform/platform.h" 9 #include "src/base/platform/platform.h"
10 10
11 #include "src/compiler/access-builder.h" 11 #include "src/compiler/access-builder.h"
12 #include "src/compiler/change-lowering.h" 12 #include "src/compiler/change-lowering.h"
13 #include "src/compiler/common-operator.h" 13 #include "src/compiler/common-operator.h"
14 #include "src/compiler/diamond.h" 14 #include "src/compiler/diamond.h"
15 #include "src/compiler/graph.h" 15 #include "src/compiler/graph.h"
16 #include "src/compiler/graph-visualizer.h" 16 #include "src/compiler/graph-visualizer.h"
17 #include "src/compiler/instruction-selector.h" 17 #include "src/compiler/instruction-selector.h"
18 #include "src/compiler/int64-lowering.h"
18 #include "src/compiler/js-generic-lowering.h" 19 #include "src/compiler/js-generic-lowering.h"
19 #include "src/compiler/js-graph.h" 20 #include "src/compiler/js-graph.h"
20 #include "src/compiler/js-operator.h" 21 #include "src/compiler/js-operator.h"
21 #include "src/compiler/linkage.h" 22 #include "src/compiler/linkage.h"
22 #include "src/compiler/machine-operator.h" 23 #include "src/compiler/machine-operator.h"
23 #include "src/compiler/node-matchers.h" 24 #include "src/compiler/node-matchers.h"
24 #include "src/compiler/pipeline.h" 25 #include "src/compiler/pipeline.h"
25 #include "src/compiler/simplified-lowering.h" 26 #include "src/compiler/simplified-lowering.h"
26 #include "src/compiler/simplified-operator.h" 27 #include "src/compiler/simplified-operator.h"
27 #include "src/compiler/source-position.h" 28 #include "src/compiler/source-position.h"
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 std::swap(left, right); 475 std::swap(left, right);
475 break; 476 break;
476 case wasm::kExprI32GtU: 477 case wasm::kExprI32GtU:
477 op = m->Uint32LessThan(); 478 op = m->Uint32LessThan();
478 std::swap(left, right); 479 std::swap(left, right);
479 break; 480 break;
480 case wasm::kExprI32GeU: 481 case wasm::kExprI32GeU:
481 op = m->Uint32LessThanOrEqual(); 482 op = m->Uint32LessThanOrEqual();
482 std::swap(left, right); 483 std::swap(left, right);
483 break; 484 break;
485 case wasm::kExprI64And:
486 op = m->Word64And();
487 break;
484 #if WASM_64 488 #if WASM_64
485 // Opcodes only supported on 64-bit platforms. 489 // Opcodes only supported on 64-bit platforms.
486 // TODO(titzer): query the machine operator builder here instead of #ifdef. 490 // TODO(titzer): query the machine operator builder here instead of #ifdef.
487 case wasm::kExprI64Add: 491 case wasm::kExprI64Add:
488 op = m->Int64Add(); 492 op = m->Int64Add();
489 break; 493 break;
490 case wasm::kExprI64Sub: 494 case wasm::kExprI64Sub:
491 op = m->Int64Sub(); 495 op = m->Int64Sub();
492 break; 496 break;
493 case wasm::kExprI64Mul: 497 case wasm::kExprI64Mul:
(...skipping 30 matching lines...) Expand all
524 528
525 Node* rem = graph()->NewNode(m->Int64Mod(), left, right, d.if_false); 529 Node* rem = graph()->NewNode(m->Int64Mod(), left, right, d.if_false);
526 530
527 return d.Phi(MachineRepresentation::kWord64, jsgraph()->Int64Constant(0), 531 return d.Phi(MachineRepresentation::kWord64, jsgraph()->Int64Constant(0),
528 rem); 532 rem);
529 } 533 }
530 case wasm::kExprI64RemU: 534 case wasm::kExprI64RemU:
531 op = m->Uint64Mod(); 535 op = m->Uint64Mod();
532 return graph()->NewNode(op, left, right, 536 return graph()->NewNode(op, left, right,
533 trap_->ZeroCheck64(kTrapRemByZero, right)); 537 trap_->ZeroCheck64(kTrapRemByZero, right));
534 case wasm::kExprI64And:
535 op = m->Word64And();
536 break;
537 case wasm::kExprI64Ior: 538 case wasm::kExprI64Ior:
538 op = m->Word64Or(); 539 op = m->Word64Or();
539 break; 540 break;
540 case wasm::kExprI64Xor: 541 case wasm::kExprI64Xor:
541 op = m->Word64Xor(); 542 op = m->Word64Xor();
542 break; 543 break;
543 case wasm::kExprI64Shl: 544 case wasm::kExprI64Shl:
544 op = m->Word64Shl(); 545 op = m->Word64Shl();
545 break; 546 break;
546 case wasm::kExprI64ShrU: 547 case wasm::kExprI64ShrU:
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 if (!m->Float64RoundTruncate().IsSupported()) return BuildF64Trunc(input); 777 if (!m->Float64RoundTruncate().IsSupported()) return BuildF64Trunc(input);
777 op = m->Float64RoundTruncate().op(); 778 op = m->Float64RoundTruncate().op();
778 break; 779 break;
779 } 780 }
780 case wasm::kExprF64NearestInt: { 781 case wasm::kExprF64NearestInt: {
781 if (!m->Float64RoundTiesEven().IsSupported()) 782 if (!m->Float64RoundTiesEven().IsSupported())
782 return BuildF64NearestInt(input); 783 return BuildF64NearestInt(input);
783 op = m->Float64RoundTiesEven().op(); 784 op = m->Float64RoundTiesEven().op();
784 break; 785 break;
785 } 786 }
786 787 case wasm::kExprI32ConvertI64:
788 op = m->TruncateInt64ToInt32();
789 break;
787 #if WASM_64 790 #if WASM_64
788 // Opcodes only supported on 64-bit platforms. 791 // Opcodes only supported on 64-bit platforms.
789 // TODO(titzer): query the machine operator builder here instead of #ifdef. 792 // TODO(titzer): query the machine operator builder here instead of #ifdef.
790 case wasm::kExprI32ConvertI64:
791 op = m->TruncateInt64ToInt32();
792 break;
793 case wasm::kExprI64SConvertI32: 793 case wasm::kExprI64SConvertI32:
794 op = m->ChangeInt32ToInt64(); 794 op = m->ChangeInt32ToInt64();
795 break; 795 break;
796 case wasm::kExprI64UConvertI32: 796 case wasm::kExprI64UConvertI32:
797 op = m->ChangeUint32ToUint64(); 797 op = m->ChangeUint32ToUint64();
798 break; 798 break;
799 case wasm::kExprF32SConvertI64: 799 case wasm::kExprF32SConvertI64:
800 op = m->RoundInt64ToFloat32(); 800 op = m->RoundInt64ToFloat32();
801 break; 801 break;
802 case wasm::kExprF32UConvertI64: 802 case wasm::kExprF32UConvertI64:
(...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after
1881 1881
1882 1882
1883 Node* WasmGraphBuilder::String(const char* string) { 1883 Node* WasmGraphBuilder::String(const char* string) {
1884 return jsgraph()->Constant( 1884 return jsgraph()->Constant(
1885 jsgraph()->isolate()->factory()->NewStringFromAsciiChecked(string)); 1885 jsgraph()->isolate()->factory()->NewStringFromAsciiChecked(string));
1886 } 1886 }
1887 1887
1888 1888
1889 Graph* WasmGraphBuilder::graph() { return jsgraph()->graph(); } 1889 Graph* WasmGraphBuilder::graph() { return jsgraph()->graph(); }
1890 1890
1891 void WasmGraphBuilder::Int64LoweringForTesting() {
1892 #if !WASM_64
1893 Int64Lowering r(jsgraph()->graph(), jsgraph()->machine(), jsgraph()->common(),
1894 jsgraph()->zone());
1895 r.ReduceGraph();
1896 #endif
1897 }
1891 1898
1892 static void RecordFunctionCompilation(Logger::LogEventsAndTags tag, 1899 static void RecordFunctionCompilation(Logger::LogEventsAndTags tag,
1893 CompilationInfo* info, 1900 CompilationInfo* info,
1894 const char* message, uint32_t index, 1901 const char* message, uint32_t index,
1895 const char* func_name) { 1902 const char* func_name) {
1896 Isolate* isolate = info->isolate(); 1903 Isolate* isolate = info->isolate();
1897 if (isolate->logger()->is_logging_code_events() || 1904 if (isolate->logger()->is_logging_code_events() ||
1898 isolate->cpu_profiler()->is_profiling()) { 1905 isolate->cpu_profiler()->is_profiling()) {
1899 ScopedVector<char> buffer(128); 1906 ScopedVector<char> buffer(128);
1900 SNPrintF(buffer, "%s#%d:%s", message, index, func_name); 1907 SNPrintF(buffer, "%s#%d:%s", message, index, func_name);
1901 Handle<String> name_str = 1908 Handle<String> name_str =
1902 isolate->factory()->NewStringFromAsciiChecked(buffer.start()); 1909 isolate->factory()->NewStringFromAsciiChecked(buffer.start());
1903 Handle<String> script_str = 1910 Handle<String> script_str =
1904 isolate->factory()->NewStringFromAsciiChecked("(WASM)"); 1911 isolate->factory()->NewStringFromAsciiChecked("(WASM)");
1905 Handle<Code> code = info->code(); 1912 Handle<Code> code = info->code();
1906 Handle<SharedFunctionInfo> shared = 1913 Handle<SharedFunctionInfo> shared =
1907 isolate->factory()->NewSharedFunctionInfo(name_str, code, false); 1914 isolate->factory()->NewSharedFunctionInfo(name_str, code, false);
1908 PROFILE(isolate, 1915 PROFILE(isolate,
1909 CodeCreateEvent(tag, *code, *shared, info, *script_str, 0, 0)); 1916 CodeCreateEvent(tag, *code, *shared, info, *script_str, 0, 0));
1910 } 1917 }
1911 } 1918 }
1912 1919
1913
1914 Handle<JSFunction> CompileJSToWasmWrapper( 1920 Handle<JSFunction> CompileJSToWasmWrapper(
1915 Isolate* isolate, wasm::ModuleEnv* module, Handle<String> name, 1921 Isolate* isolate, wasm::ModuleEnv* module, Handle<String> name,
1916 Handle<Code> wasm_code, Handle<JSObject> module_object, uint32_t index) { 1922 Handle<Code> wasm_code, Handle<JSObject> module_object, uint32_t index) {
1917 wasm::WasmFunction* func = &module->module->functions->at(index); 1923 wasm::WasmFunction* func = &module->module->functions->at(index);
1918 1924
1919 //---------------------------------------------------------------------------- 1925 //----------------------------------------------------------------------------
1920 // Create the JSFunction object. 1926 // Create the JSFunction object.
1921 //---------------------------------------------------------------------------- 1927 //----------------------------------------------------------------------------
1922 Handle<SharedFunctionInfo> shared = 1928 Handle<SharedFunctionInfo> shared =
1923 isolate->factory()->NewSharedFunctionInfo(name, wasm_code, false); 1929 isolate->factory()->NewSharedFunctionInfo(name, wasm_code, false);
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
2112 FLAG_print_opt_code || FLAG_trace_turbo || FLAG_trace_turbo_graph; 2118 FLAG_print_opt_code || FLAG_trace_turbo || FLAG_trace_turbo_graph;
2113 const char* func_name = "wasm"; 2119 const char* func_name = "wasm";
2114 Vector<char> buffer; 2120 Vector<char> buffer;
2115 if (debugging) { 2121 if (debugging) {
2116 buffer = Vector<char>::New(128); 2122 buffer = Vector<char>::New(128);
2117 SNPrintF(buffer, "WASM_function_#%d:%s", index, 2123 SNPrintF(buffer, "WASM_function_#%d:%s", index,
2118 module_env->module->GetName(function.name_offset)); 2124 module_env->module->GetName(function.name_offset));
2119 func_name = buffer.start(); 2125 func_name = buffer.start();
2120 } 2126 }
2121 CompilationInfo info(func_name, isolate, &zone, flags); 2127 CompilationInfo info(func_name, isolate, &zone, flags);
2128
2122 Handle<Code> code = 2129 Handle<Code> code =
2123 Pipeline::GenerateCodeForTesting(&info, descriptor, &graph); 2130 Pipeline::GenerateCodeForTesting(&info, descriptor, &graph);
2124 if (debugging) { 2131 if (debugging) {
2125 buffer.Dispose(); 2132 buffer.Dispose();
2126 } 2133 }
2127 if (!code.is_null()) { 2134 if (!code.is_null()) {
2128 RecordFunctionCompilation( 2135 RecordFunctionCompilation(
2129 Logger::FUNCTION_TAG, &info, "WASM_function", index, 2136 Logger::FUNCTION_TAG, &info, "WASM_function", index,
2130 module_env->module->GetName(function.name_offset)); 2137 module_env->module->GetName(function.name_offset));
2131 } 2138 }
2132 2139
2133 return code; 2140 return code;
2134 } 2141 }
2135 2142
2136 2143
2137 } // namespace compiler 2144 } // namespace compiler
2138 } // namespace internal 2145 } // namespace internal
2139 } // namespace v8 2146 } // 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