Index: src/compiler/wasm-compiler.cc |
diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc |
index 05468f7b4f244cb52d13a342485a125093d8735f..f2c48769fb98a2d1beceff828fc32d8e3451afc3 100644 |
--- a/src/compiler/wasm-compiler.cc |
+++ b/src/compiler/wasm-compiler.cc |
@@ -628,6 +628,16 @@ Node* WasmGraphBuilder::Binop(wasm::WasmOpcode opcode, Node* left, Node* right, |
return BuildI32AsmjsRemS(left, right); |
case wasm::kExprI32AsmjsRemU: |
return BuildI32AsmjsRemU(left, right); |
+ case wasm::kExprI32AsmjsStoreMem8: |
+ return BuildAsmjsStoreMem(MachineType::Int8(), left, right); |
+ case wasm::kExprI32AsmjsStoreMem16: |
+ return BuildAsmjsStoreMem(MachineType::Int16(), left, right); |
+ case wasm::kExprI32AsmjsStoreMem: |
+ return BuildAsmjsStoreMem(MachineType::Int32(), left, right); |
+ case wasm::kExprF32AsmjsStoreMem: |
+ return BuildAsmjsStoreMem(MachineType::Float32(), left, right); |
+ case wasm::kExprF64AsmjsStoreMem: |
+ return BuildAsmjsStoreMem(MachineType::Float64(), left, right); |
default: |
op = UnsupportedOpcode(opcode); |
} |
@@ -857,18 +867,28 @@ Node* WasmGraphBuilder::Unop(wasm::WasmOpcode opcode, Node* input, |
} |
op = m->RoundUint64ToFloat64(); |
break; |
- case wasm::kExprI64SConvertF32: { |
+ case wasm::kExprI64SConvertF32: |
return BuildI64SConvertF32(input, position); |
- } |
- case wasm::kExprI64SConvertF64: { |
+ case wasm::kExprI64SConvertF64: |
return BuildI64SConvertF64(input, position); |
- } |
- case wasm::kExprI64UConvertF32: { |
+ case wasm::kExprI64UConvertF32: |
return BuildI64UConvertF32(input, position); |
- } |
- case wasm::kExprI64UConvertF64: { |
+ case wasm::kExprI64UConvertF64: |
return BuildI64UConvertF64(input, position); |
- } |
+ case wasm::kExprI32AsmjsLoadMem8S: |
+ return BuildAsmjsLoadMem(MachineType::Int8(), input); |
+ case wasm::kExprI32AsmjsLoadMem8U: |
+ return BuildAsmjsLoadMem(MachineType::Uint8(), input); |
+ case wasm::kExprI32AsmjsLoadMem16S: |
+ return BuildAsmjsLoadMem(MachineType::Int16(), input); |
+ case wasm::kExprI32AsmjsLoadMem16U: |
+ return BuildAsmjsLoadMem(MachineType::Uint16(), input); |
+ case wasm::kExprI32AsmjsLoadMem: |
+ return BuildAsmjsLoadMem(MachineType::Int32(), input); |
+ case wasm::kExprF32AsmjsLoadMem: |
+ return BuildAsmjsLoadMem(MachineType::Float32(), input); |
+ case wasm::kExprF64AsmjsLoadMem: |
+ return BuildAsmjsLoadMem(MachineType::Float64(), input); |
default: |
op = UnsupportedOpcode(opcode); |
} |
@@ -2631,19 +2651,10 @@ Node* WasmGraphBuilder::LoadMem(wasm::LocalType type, MachineType memtype, |
Node* index, uint32_t offset, |
wasm::WasmCodePosition position) { |
Node* load; |
- |
- if (module_ && module_->asm_js()) { |
- // asm.js semantics use CheckedLoad (i.e. OOB reads return 0ish). |
- DCHECK_EQ(0, offset); |
- const Operator* op = jsgraph()->machine()->CheckedLoad(memtype); |
- load = graph()->NewNode(op, MemBuffer(0), index, MemSize(0), *effect_, |
- *control_); |
- } else { |
- // WASM semantics throw on OOB. Introduce explicit bounds check. |
- BoundsCheckMem(memtype, index, offset, position); |
- load = graph()->NewNode(jsgraph()->machine()->Load(memtype), |
- MemBuffer(offset), index, *effect_, *control_); |
- } |
+ // WASM semantics throw on OOB. Introduce explicit bounds check. |
+ BoundsCheckMem(memtype, index, offset, position); |
+ load = graph()->NewNode(jsgraph()->machine()->Load(memtype), |
+ MemBuffer(offset), index, *effect_, *control_); |
*effect_ = load; |
@@ -2667,25 +2678,36 @@ Node* WasmGraphBuilder::StoreMem(MachineType memtype, Node* index, |
uint32_t offset, Node* val, |
wasm::WasmCodePosition position) { |
Node* store; |
- if (module_ && module_->asm_js()) { |
- // asm.js semantics use CheckedStore (i.e. ignore OOB writes). |
- DCHECK_EQ(0, offset); |
- const Operator* op = |
- jsgraph()->machine()->CheckedStore(memtype.representation()); |
- store = graph()->NewNode(op, MemBuffer(0), index, MemSize(0), val, *effect_, |
- *control_); |
- } else { |
- // WASM semantics throw on OOB. Introduce explicit bounds check. |
- BoundsCheckMem(memtype, index, offset, position); |
- StoreRepresentation rep(memtype.representation(), kNoWriteBarrier); |
- store = |
- graph()->NewNode(jsgraph()->machine()->Store(rep), MemBuffer(offset), |
- index, val, *effect_, *control_); |
- } |
+ // WASM semantics throw on OOB. Introduce explicit bounds check. |
+ BoundsCheckMem(memtype, index, offset, position); |
+ StoreRepresentation rep(memtype.representation(), kNoWriteBarrier); |
+ store = graph()->NewNode(jsgraph()->machine()->Store(rep), MemBuffer(offset), |
+ index, val, *effect_, *control_); |
*effect_ = store; |
return store; |
} |
+Node* WasmGraphBuilder::BuildAsmjsLoadMem(MachineType type, Node* index) { |
+ // TODO(turbofan): fold bounds checks for constant asm.js loads. |
+ // asm.js semantics use CheckedLoad (i.e. OOB reads return 0ish). |
+ const Operator* op = jsgraph()->machine()->CheckedLoad(type); |
+ Node* load = graph()->NewNode(op, MemBuffer(0), index, MemSize(0), *effect_, |
+ *control_); |
+ *effect_ = load; |
+ return load; |
+} |
+ |
+Node* WasmGraphBuilder::BuildAsmjsStoreMem(MachineType type, Node* index, |
+ Node* val) { |
+ // TODO(turbofan): fold bounds checks for constant asm.js stores. |
+ // asm.js semantics use CheckedStore (i.e. ignore OOB writes). |
+ const Operator* op = |
+ jsgraph()->machine()->CheckedStore(type.representation()); |
+ Node* store = graph()->NewNode(op, MemBuffer(0), index, MemSize(0), val, |
+ *effect_, *control_); |
+ *effect_ = store; |
+ return val; |
+} |
void WasmGraphBuilder::PrintDebugName(Node* node) { |
PrintF("#%d:%s", node->id(), node->op()->mnemonic()); |