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 #include "src/compiler/representation-change.h" | 5 #include "src/compiler/representation-change.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
11 #include "src/compiler/machine-operator.h" | 11 #include "src/compiler/machine-operator.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 namespace compiler { | 15 namespace compiler { |
16 | 16 |
17 const char* Truncation::description() const { | 17 const char* Truncation::description() const { |
18 switch (kind()) { | 18 switch (kind()) { |
19 case TruncationKind::kNone: | 19 case TruncationKind::kNone: |
20 return "no-value-use"; | 20 return "no-value-use"; |
21 case TruncationKind::kBool: | 21 case TruncationKind::kBool: |
22 return "truncate-to-bool"; | 22 return "truncate-to-bool"; |
23 case TruncationKind::kWord32: | 23 case TruncationKind::kWord32: |
24 return "truncate-to-word32"; | 24 return "truncate-to-word32"; |
25 case TruncationKind::kWord64: | 25 case TruncationKind::kWord64: |
26 return "truncate-to-word64"; | 26 return "truncate-to-word64"; |
27 case TruncationKind::kFloat32: | |
28 return "truncate-to-float32"; | |
29 case TruncationKind::kFloat64: | 27 case TruncationKind::kFloat64: |
30 return "truncate-to-float64"; | 28 return "truncate-to-float64"; |
31 case TruncationKind::kAny: | 29 case TruncationKind::kAny: |
32 return "no-truncation"; | 30 return "no-truncation"; |
33 } | 31 } |
34 UNREACHABLE(); | 32 UNREACHABLE(); |
35 return nullptr; | 33 return nullptr; |
36 } | 34 } |
37 | 35 |
38 | 36 |
39 // Partial order for truncations: | 37 // Partial order for truncations: |
40 // | 38 // |
41 // kWord64 kAny | 39 // kWord64 kAny |
42 // ^ ^ | 40 // ^ ^ |
43 // \ | | 41 // \ | |
44 // \ kFloat64 <--+ | 42 // \ kFloat64 <--+ |
45 // \ ^ ^ | | 43 // \ ^ | |
46 // \ / | | | 44 // \ / | |
47 // kWord32 kFloat32 kBool | 45 // kWord32 kBool |
48 // ^ ^ ^ | 46 // ^ ^ |
49 // \ | / | 47 // \ / |
50 // \ | / | 48 // \ / |
51 // \ | / | 49 // \ / |
52 // \ | / | 50 // \ / |
53 // \ | / | 51 // \ / |
54 // kNone | 52 // kNone |
55 | 53 |
56 // static | 54 // static |
57 Truncation::TruncationKind Truncation::Generalize(TruncationKind rep1, | 55 Truncation::TruncationKind Truncation::Generalize(TruncationKind rep1, |
58 TruncationKind rep2) { | 56 TruncationKind rep2) { |
59 if (LessGeneral(rep1, rep2)) return rep2; | 57 if (LessGeneral(rep1, rep2)) return rep2; |
60 if (LessGeneral(rep2, rep1)) return rep1; | 58 if (LessGeneral(rep2, rep1)) return rep1; |
61 // Handle the generalization of float64-representable values. | 59 // Handle the generalization of float64-representable values. |
62 if (LessGeneral(rep1, TruncationKind::kFloat64) && | 60 if (LessGeneral(rep1, TruncationKind::kFloat64) && |
63 LessGeneral(rep2, TruncationKind::kFloat64)) { | 61 LessGeneral(rep2, TruncationKind::kFloat64)) { |
(...skipping 16 matching lines...) Expand all Loading... |
80 case TruncationKind::kNone: | 78 case TruncationKind::kNone: |
81 return true; | 79 return true; |
82 case TruncationKind::kBool: | 80 case TruncationKind::kBool: |
83 return rep2 == TruncationKind::kBool || rep2 == TruncationKind::kAny; | 81 return rep2 == TruncationKind::kBool || rep2 == TruncationKind::kAny; |
84 case TruncationKind::kWord32: | 82 case TruncationKind::kWord32: |
85 return rep2 == TruncationKind::kWord32 || | 83 return rep2 == TruncationKind::kWord32 || |
86 rep2 == TruncationKind::kWord64 || | 84 rep2 == TruncationKind::kWord64 || |
87 rep2 == TruncationKind::kFloat64 || rep2 == TruncationKind::kAny; | 85 rep2 == TruncationKind::kFloat64 || rep2 == TruncationKind::kAny; |
88 case TruncationKind::kWord64: | 86 case TruncationKind::kWord64: |
89 return rep2 == TruncationKind::kWord64; | 87 return rep2 == TruncationKind::kWord64; |
90 case TruncationKind::kFloat32: | |
91 return rep2 == TruncationKind::kFloat32 || | |
92 rep2 == TruncationKind::kFloat64 || rep2 == TruncationKind::kAny; | |
93 case TruncationKind::kFloat64: | 88 case TruncationKind::kFloat64: |
94 return rep2 == TruncationKind::kFloat64 || rep2 == TruncationKind::kAny; | 89 return rep2 == TruncationKind::kFloat64 || rep2 == TruncationKind::kAny; |
95 case TruncationKind::kAny: | 90 case TruncationKind::kAny: |
96 return rep2 == TruncationKind::kAny; | 91 return rep2 == TruncationKind::kAny; |
97 } | 92 } |
98 UNREACHABLE(); | 93 UNREACHABLE(); |
99 return false; | 94 return false; |
100 } | 95 } |
101 | 96 |
102 | 97 |
(...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
989 } | 984 } |
990 | 985 |
991 Node* RepresentationChanger::InsertChangeTaggedToFloat64(Node* node) { | 986 Node* RepresentationChanger::InsertChangeTaggedToFloat64(Node* node) { |
992 return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(), | 987 return jsgraph()->graph()->NewNode(simplified()->ChangeTaggedToFloat64(), |
993 node); | 988 node); |
994 } | 989 } |
995 | 990 |
996 } // namespace compiler | 991 } // namespace compiler |
997 } // namespace internal | 992 } // namespace internal |
998 } // namespace v8 | 993 } // namespace v8 |
OLD | NEW |