OLD | NEW |
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 597 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 op = m->Float64LessThanOrEqual(); | 608 op = m->Float64LessThanOrEqual(); |
609 break; | 609 break; |
610 case wasm::kExprF64Gt: | 610 case wasm::kExprF64Gt: |
611 op = m->Float64LessThan(); | 611 op = m->Float64LessThan(); |
612 std::swap(left, right); | 612 std::swap(left, right); |
613 break; | 613 break; |
614 case wasm::kExprF64Ge: | 614 case wasm::kExprF64Ge: |
615 op = m->Float64LessThanOrEqual(); | 615 op = m->Float64LessThanOrEqual(); |
616 std::swap(left, right); | 616 std::swap(left, right); |
617 break; | 617 break; |
618 case wasm::kExprF32Min: { | 618 case wasm::kExprF32Min: |
619 if (m->Float32Min().IsSupported()) { | 619 return BuildF32Min(left, right); |
620 op = m->Float32Min().op(); | 620 case wasm::kExprF64Min: |
621 break; | 621 return BuildF64Min(left, right); |
622 } else { | 622 case wasm::kExprF32Max: |
623 op = UnsupportedOpcode(opcode); | 623 return BuildF32Max(left, right); |
624 break; | 624 case wasm::kExprF64Max: |
625 } | 625 return BuildF64Max(left, right); |
626 } | |
627 case wasm::kExprF64Min: { | |
628 if (m->Float64Min().IsSupported()) { | |
629 op = m->Float64Min().op(); | |
630 break; | |
631 } else { | |
632 op = UnsupportedOpcode(opcode); | |
633 break; | |
634 } | |
635 } | |
636 case wasm::kExprF32Max: { | |
637 if (m->Float32Max().IsSupported()) { | |
638 op = m->Float32Max().op(); | |
639 break; | |
640 } else { | |
641 op = UnsupportedOpcode(opcode); | |
642 break; | |
643 } | |
644 } | |
645 case wasm::kExprF64Max: { | |
646 if (m->Float64Max().IsSupported()) { | |
647 op = m->Float64Max().op(); | |
648 break; | |
649 } else { | |
650 op = UnsupportedOpcode(opcode); | |
651 break; | |
652 } | |
653 } | |
654 default: | 626 default: |
655 op = UnsupportedOpcode(opcode); | 627 op = UnsupportedOpcode(opcode); |
656 } | 628 } |
657 return graph()->NewNode(op, left, right); | 629 return graph()->NewNode(op, left, right); |
658 } | 630 } |
659 | 631 |
660 | 632 |
661 Node* WasmGraphBuilder::Unop(wasm::WasmOpcode opcode, Node* input) { | 633 Node* WasmGraphBuilder::Unop(wasm::WasmOpcode opcode, Node* input) { |
662 const Operator* op; | 634 const Operator* op; |
663 MachineOperatorBuilder* m = jsgraph()->machine(); | 635 MachineOperatorBuilder* m = jsgraph()->machine(); |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
984 Binop(wasm::kExprI32Ior, Binop(wasm::kExprI32And, high_word_left, | 956 Binop(wasm::kExprI32Ior, Binop(wasm::kExprI32And, high_word_left, |
985 jsgraph()->Int32Constant(0x7fffffff)), | 957 jsgraph()->Int32Constant(0x7fffffff)), |
986 Binop(wasm::kExprI32And, high_word_right, | 958 Binop(wasm::kExprI32And, high_word_right, |
987 jsgraph()->Int32Constant(0x80000000))); | 959 jsgraph()->Int32Constant(0x80000000))); |
988 | 960 |
989 return graph()->NewNode(m->Float64InsertHighWord32(), left, new_high_word); | 961 return graph()->NewNode(m->Float64InsertHighWord32(), left, new_high_word); |
990 #endif | 962 #endif |
991 } | 963 } |
992 | 964 |
993 | 965 |
| 966 Node* WasmGraphBuilder::BuildF32Min(Node* left, Node* right) { |
| 967 Diamond left_le_right(graph(), jsgraph()->common(), |
| 968 Binop(wasm::kExprF32Le, left, right)); |
| 969 |
| 970 Diamond right_lt_left(graph(), jsgraph()->common(), |
| 971 Binop(wasm::kExprF32Lt, right, left)); |
| 972 |
| 973 Diamond left_is_not_nan(graph(), jsgraph()->common(), |
| 974 Binop(wasm::kExprF32Eq, left, left)); |
| 975 |
| 976 return left_le_right.Phi( |
| 977 wasm::kAstF32, left, |
| 978 right_lt_left.Phi(wasm::kAstF32, right, |
| 979 left_is_not_nan.Phi(wasm::kAstF32, right, left))); |
| 980 } |
| 981 |
| 982 |
| 983 Node* WasmGraphBuilder::BuildF32Max(Node* left, Node* right) { |
| 984 Diamond left_ge_right(graph(), jsgraph()->common(), |
| 985 Binop(wasm::kExprF32Ge, left, right)); |
| 986 |
| 987 Diamond right_gt_left(graph(), jsgraph()->common(), |
| 988 Binop(wasm::kExprF32Gt, right, left)); |
| 989 |
| 990 Diamond left_is_not_nan(graph(), jsgraph()->common(), |
| 991 Binop(wasm::kExprF32Eq, left, left)); |
| 992 |
| 993 return left_ge_right.Phi( |
| 994 wasm::kAstF32, left, |
| 995 right_gt_left.Phi(wasm::kAstF32, right, |
| 996 left_is_not_nan.Phi(wasm::kAstF32, right, left))); |
| 997 } |
| 998 |
| 999 |
| 1000 Node* WasmGraphBuilder::BuildF64Min(Node* left, Node* right) { |
| 1001 Diamond left_le_right(graph(), jsgraph()->common(), |
| 1002 Binop(wasm::kExprF64Le, left, right)); |
| 1003 |
| 1004 Diamond right_lt_left(graph(), jsgraph()->common(), |
| 1005 Binop(wasm::kExprF64Lt, right, left)); |
| 1006 |
| 1007 Diamond left_is_not_nan(graph(), jsgraph()->common(), |
| 1008 Binop(wasm::kExprF64Eq, left, left)); |
| 1009 |
| 1010 return left_le_right.Phi( |
| 1011 wasm::kAstF64, left, |
| 1012 right_lt_left.Phi(wasm::kAstF64, right, |
| 1013 left_is_not_nan.Phi(wasm::kAstF64, right, left))); |
| 1014 } |
| 1015 |
| 1016 |
| 1017 Node* WasmGraphBuilder::BuildF64Max(Node* left, Node* right) { |
| 1018 Diamond left_ge_right(graph(), jsgraph()->common(), |
| 1019 Binop(wasm::kExprF64Ge, left, right)); |
| 1020 |
| 1021 Diamond right_gt_left(graph(), jsgraph()->common(), |
| 1022 Binop(wasm::kExprF64Lt, right, left)); |
| 1023 |
| 1024 Diamond left_is_not_nan(graph(), jsgraph()->common(), |
| 1025 Binop(wasm::kExprF64Eq, left, left)); |
| 1026 |
| 1027 return left_ge_right.Phi( |
| 1028 wasm::kAstF64, left, |
| 1029 right_gt_left.Phi(wasm::kAstF64, right, |
| 1030 left_is_not_nan.Phi(wasm::kAstF64, right, left))); |
| 1031 } |
| 1032 |
| 1033 |
994 Node* WasmGraphBuilder::BuildI32Ctz(Node* input) { | 1034 Node* WasmGraphBuilder::BuildI32Ctz(Node* input) { |
995 //// Implement the following code as TF graph. | 1035 //// Implement the following code as TF graph. |
996 // value = value | (value << 1); | 1036 // value = value | (value << 1); |
997 // value = value | (value << 2); | 1037 // value = value | (value << 2); |
998 // value = value | (value << 4); | 1038 // value = value | (value << 4); |
999 // value = value | (value << 8); | 1039 // value = value | (value << 8); |
1000 // value = value | (value << 16); | 1040 // value = value | (value << 16); |
1001 // return CountPopulation32(0xffffffff XOR value); | 1041 // return CountPopulation32(0xffffffff XOR value); |
1002 | 1042 |
1003 Node* result = | 1043 Node* result = |
(...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1830 code->Disassemble(buffer, os); | 1870 code->Disassemble(buffer, os); |
1831 } | 1871 } |
1832 #endif | 1872 #endif |
1833 return code; | 1873 return code; |
1834 } | 1874 } |
1835 | 1875 |
1836 | 1876 |
1837 } // namespace compiler | 1877 } // namespace compiler |
1838 } // namespace internal | 1878 } // namespace internal |
1839 } // namespace v8 | 1879 } // namespace v8 |
OLD | NEW |