| Index: src/compiler/wasm-compiler.cc
|
| diff --git a/src/compiler/wasm-compiler.cc b/src/compiler/wasm-compiler.cc
|
| index d2f2eda136a7b72daae0df5ac18625df26a65bec..f675d96803e3874c4628e6c22913fcd0f8ced97b 100644
|
| --- a/src/compiler/wasm-compiler.cc
|
| +++ b/src/compiler/wasm-compiler.cc
|
| @@ -615,42 +615,14 @@ Node* WasmGraphBuilder::Binop(wasm::WasmOpcode opcode, Node* left,
|
| op = m->Float64LessThanOrEqual();
|
| std::swap(left, right);
|
| break;
|
| - case wasm::kExprF32Min: {
|
| - if (m->Float32Min().IsSupported()) {
|
| - op = m->Float32Min().op();
|
| - break;
|
| - } else {
|
| - op = UnsupportedOpcode(opcode);
|
| - break;
|
| - }
|
| - }
|
| - case wasm::kExprF64Min: {
|
| - if (m->Float64Min().IsSupported()) {
|
| - op = m->Float64Min().op();
|
| - break;
|
| - } else {
|
| - op = UnsupportedOpcode(opcode);
|
| - break;
|
| - }
|
| - }
|
| - case wasm::kExprF32Max: {
|
| - if (m->Float32Max().IsSupported()) {
|
| - op = m->Float32Max().op();
|
| - break;
|
| - } else {
|
| - op = UnsupportedOpcode(opcode);
|
| - break;
|
| - }
|
| - }
|
| - case wasm::kExprF64Max: {
|
| - if (m->Float64Max().IsSupported()) {
|
| - op = m->Float64Max().op();
|
| - break;
|
| - } else {
|
| - op = UnsupportedOpcode(opcode);
|
| - break;
|
| - }
|
| - }
|
| + case wasm::kExprF32Min:
|
| + return BuildF32Min(left, right);
|
| + case wasm::kExprF64Min:
|
| + return BuildF64Min(left, right);
|
| + case wasm::kExprF32Max:
|
| + return BuildF32Max(left, right);
|
| + case wasm::kExprF64Max:
|
| + return BuildF64Max(left, right);
|
| default:
|
| op = UnsupportedOpcode(opcode);
|
| }
|
| @@ -991,6 +963,74 @@ Node* WasmGraphBuilder::BuildF64CopySign(Node* left, Node* right) {
|
| }
|
|
|
|
|
| +Node* WasmGraphBuilder::BuildF32Min(Node* left, Node* right) {
|
| + Diamond left_le_right(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF32Le, left, right));
|
| +
|
| + Diamond right_lt_left(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF32Lt, right, left));
|
| +
|
| + Diamond left_is_not_nan(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF32Eq, left, left));
|
| +
|
| + return left_le_right.Phi(
|
| + wasm::kAstF32, left,
|
| + right_lt_left.Phi(wasm::kAstF32, right,
|
| + left_is_not_nan.Phi(wasm::kAstF32, right, left)));
|
| +}
|
| +
|
| +
|
| +Node* WasmGraphBuilder::BuildF32Max(Node* left, Node* right) {
|
| + Diamond left_ge_right(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF32Ge, left, right));
|
| +
|
| + Diamond right_gt_left(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF32Gt, right, left));
|
| +
|
| + Diamond left_is_not_nan(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF32Eq, left, left));
|
| +
|
| + return left_ge_right.Phi(
|
| + wasm::kAstF32, left,
|
| + right_gt_left.Phi(wasm::kAstF32, right,
|
| + left_is_not_nan.Phi(wasm::kAstF32, right, left)));
|
| +}
|
| +
|
| +
|
| +Node* WasmGraphBuilder::BuildF64Min(Node* left, Node* right) {
|
| + Diamond left_le_right(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF64Le, left, right));
|
| +
|
| + Diamond right_lt_left(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF64Lt, right, left));
|
| +
|
| + Diamond left_is_not_nan(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF64Eq, left, left));
|
| +
|
| + return left_le_right.Phi(
|
| + wasm::kAstF64, left,
|
| + right_lt_left.Phi(wasm::kAstF64, right,
|
| + left_is_not_nan.Phi(wasm::kAstF64, right, left)));
|
| +}
|
| +
|
| +
|
| +Node* WasmGraphBuilder::BuildF64Max(Node* left, Node* right) {
|
| + Diamond left_ge_right(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF64Ge, left, right));
|
| +
|
| + Diamond right_gt_left(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF64Lt, right, left));
|
| +
|
| + Diamond left_is_not_nan(graph(), jsgraph()->common(),
|
| + Binop(wasm::kExprF64Eq, left, left));
|
| +
|
| + return left_ge_right.Phi(
|
| + wasm::kAstF64, left,
|
| + right_gt_left.Phi(wasm::kAstF64, right,
|
| + left_is_not_nan.Phi(wasm::kAstF64, right, left)));
|
| +}
|
| +
|
| +
|
| Node* WasmGraphBuilder::BuildI32Ctz(Node* input) {
|
| //// Implement the following code as TF graph.
|
| // value = value | (value << 1);
|
|
|