Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index 5fcfb701482e151cd5ea7d7a621d0a4d795103f1..1f215f993f1a5f4687737239f1150c30f1b205e8 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -23,6 +23,7 @@ |
#include "src/compiler/machine-operator.h" |
#include "src/compiler/node-matchers.h" |
#include "src/compiler/pipeline.h" |
+#include "src/compiler/simd-lowering.h" |
#include "src/compiler/source-position.h" |
#include "src/compiler/zone-pool.h" |
@@ -611,6 +612,10 @@ Node* WasmGraphBuilder::Binop(wasm::WasmOpcode opcode, Node* left, Node* right, |
break; |
case wasm::kExprF64Mod: |
return BuildF64Mod(left, right); |
+ case wasm::kExprI32x4ExtractLane: |
+ SetHasSimdOps(true); |
+ return graph()->NewNode(jsgraph()->machine()->Int32x4ExtractLane(), left, |
+ right); |
case wasm::kExprI32AsmjsDivS: |
return BuildI32AsmjsDivS(left, right); |
case wasm::kExprI32AsmjsDivU: |
@@ -884,6 +889,10 @@ Node* WasmGraphBuilder::Unop(wasm::WasmOpcode opcode, Node* input, |
return BuildI64UConvertF64(input, position); |
case wasm::kExprGrowMemory: |
return BuildGrowMemory(input); |
+ case wasm::kExprI32x4Splat: |
+ SetHasSimdOps(true); |
+ return graph()->NewNode(jsgraph()->machine()->CreateInt32x4(), input, |
+ input, input, input); |
case wasm::kExprI32AsmjsLoadMem8S: |
return BuildAsmjsLoadMem(MachineType::Int8(), input); |
case wasm::kExprI32AsmjsLoadMem8U: |
@@ -2246,6 +2255,12 @@ Node* WasmGraphBuilder::ToJS(Node* node, Node* context, wasm::LocalType type) { |
} |
} |
+Node* WasmGraphBuilder::BuildChangeTaggedToInt32(Node* value) { |
+ value = BuildChangeTaggedToFloat64(value); |
+ value = graph()->NewNode(jsgraph()->machine()->ChangeFloat64ToInt32(), value); |
+ return value; |
+} |
+ |
Node* WasmGraphBuilder::BuildJavaScriptToNumber(Node* node, Node* context, |
Node* effect, Node* control) { |
Callable callable = CodeFactory::ToNumber(jsgraph()->isolate()); |
@@ -2682,6 +2697,12 @@ Node* WasmGraphBuilder::MemSize(uint32_t offset) { |
} |
} |
+Node* WasmGraphBuilder::DefaultS128Value() { |
+ Node* zero = jsgraph()->Int32Constant(0); |
+ return graph()->NewNode(jsgraph()->machine()->CreateInt32x4(), zero, zero, |
+ zero, zero); |
+} |
+ |
Node* WasmGraphBuilder::FunctionTable() { |
DCHECK(module_ && module_->instance && |
!module_->instance->function_table.is_null()); |
@@ -3320,6 +3341,21 @@ SourcePositionTable* WasmCompilationUnit::BuildGraphForWasmFunction( |
} |
int index = static_cast<int>(function_->func_index); |
+ |
+ // Run lowering pass if SIMD ops are present in the function |
+ if (builder.HasSimdOps()) { |
+ SimdLowering simd(jsgraph_, &builder, module_env_->instance->context); |
+ GraphReducer graph_reducer(jsgraph_->zone(), graph); |
+ graph_reducer.AddReducer(&simd); |
+ graph_reducer.ReduceGraph(); |
+ |
+ if (FLAG_trace_turbo_graph) { // Simple textual RPO. |
+ OFStream os(stdout); |
+ os << "-- Graph after simd lowering -- " << std::endl; |
+ os << AsRPO(*graph); |
+ } |
+ } |
+ |
if (index >= FLAG_trace_wasm_ast_start && index < FLAG_trace_wasm_ast_end) { |
OFStream os(stdout); |
PrintAst(isolate_->allocator(), body, os, nullptr); |