OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 import "../../../lib/compiler/implementation/ssa/ssa.dart"; | 5 import "../../../lib/compiler/implementation/ssa/ssa.dart"; |
6 import "../../../lib/compiler/implementation/dart2jslib.dart"; | 6 import "../../../lib/compiler/implementation/dart2jslib.dart"; |
| 7 import "../../../lib/compiler/implementation/js_backend/js_backend.dart"; |
7 | 8 |
8 Value instructionValue = new InstructionValue(new HReturn(null)); | 9 ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem()); |
9 Value lengthValue = new LengthValue(new HReturn(null)); | |
10 | 10 |
11 Range createSingleRange(Value value) => new Range(value, value); | 11 Value instructionValue = info.newInstructionValue(new HReturn(null)); |
12 Range createSingleIntRange(int value) => createSingleRange(new IntValue(value)); | 12 Value lengthValue = info.newLengthValue(new HReturn(null)); |
| 13 |
| 14 Range createSingleRange(Value value) => info.newRange(value, value); |
| 15 Range createSingleIntRange(int value) => createSingleRange(info.newIntValue(valu
e)); |
13 Range createSingleInstructionRange() => createSingleRange(instructionValue); | 16 Range createSingleInstructionRange() => createSingleRange(instructionValue); |
14 Range createSingleLengthRange() => createSingleRange(lengthValue); | 17 Range createSingleLengthRange() => createSingleRange(lengthValue); |
15 Range createIntRange(int lower, int upper) { | 18 Range createIntRange(int lower, int upper) { |
16 return new Range(new IntValue(lower), new IntValue(upper)); | 19 return info.newRange(info.newIntValue(lower), info.newIntValue(upper)); |
17 } | 20 } |
18 Range createLengthRange(int lower) { | 21 Range createLengthRange(int lower) { |
19 return new Range(new IntValue(lower), lengthValue); | 22 return info.newRange(info.newIntValue(lower), lengthValue); |
20 } | 23 } |
21 Range createInstructionRange(int lower) { | 24 Range createInstructionRange(int lower) { |
22 return new Range(new IntValue(lower), instructionValue); | 25 return info.newRange(info.newIntValue(lower), instructionValue); |
23 } | 26 } |
24 | 27 |
25 Range instruction = createSingleInstructionRange(); | 28 Range instruction = createSingleInstructionRange(); |
26 Range FF = createSingleIntRange(0xFF); | 29 Range FF = createSingleIntRange(0xFF); |
27 Range FA = createSingleIntRange(0xFA); | 30 Range FA = createSingleIntRange(0xFA); |
28 Range nFF = createSingleIntRange(-0xFF); | 31 Range nFF = createSingleIntRange(-0xFF); |
29 Range length = createSingleLengthRange(); | 32 Range length = createSingleLengthRange(); |
30 Range _FA_FF = createIntRange(0xFA, 0xFF); | 33 Range _FA_FF = createIntRange(0xFA, 0xFF); |
31 Range _0_FF = createIntRange(0, 0xFF); | 34 Range _0_FF = createIntRange(0, 0xFF); |
32 Range _nFF_FF = createIntRange(-0xFF, 0xFF); | 35 Range _nFF_FF = createIntRange(-0xFF, 0xFF); |
33 Range _nFF_0 = createIntRange(-0xFF, 0); | 36 Range _nFF_0 = createIntRange(-0xFF, 0); |
34 Range _0_length = createLengthRange(0); | 37 Range _0_length = createLengthRange(0); |
35 Range _0_instruction = createInstructionRange(0); | 38 Range _0_instruction = createInstructionRange(0); |
36 | 39 |
37 checkAndRange(Range one, Range two, lower, upper) { | 40 checkAndRange(Range one, Range two, lower, upper) { |
38 if (lower is num) lower = new IntValue(lower); | 41 if (lower is num) lower = info.newIntValue(lower); |
39 if (upper is num) upper = new IntValue(upper); | 42 if (upper is num) upper = info.newIntValue(upper); |
40 Range range = new Range(lower, upper); | 43 Range range = info.newRange(lower, upper); |
41 Expect.equals(range, one & two); | 44 Expect.equals(range, one & two); |
42 } | 45 } |
43 | 46 |
44 checkSubRange(Range one, Range two, [lower, upper]) { | 47 checkSubRange(Range one, Range two, [lower, upper]) { |
45 | 48 |
46 buildBound(one, two) { | 49 buildBound(one, two) { |
47 // Create a bound just like our current implementation in dart2js does. | 50 // Create a bound just like our current implementation in dart2js does. |
48 if (two is IntValue) { | 51 if (two is IntValue) { |
49 if (two.isNegative) { | 52 if (two.isNegative) { |
50 return new AddValue(one, -two); | 53 return info.newAddValue(one, -two); |
51 } else if (two.isZero) { | 54 } else if (two.isZero) { |
52 return one; | 55 return one; |
53 } | 56 } |
54 } | 57 } |
55 if (one is IntValue) { | 58 if (one is IntValue) { |
56 if (one.isNegative) { | 59 if (one.isNegative) { |
57 return new SubtractValue(-two, -one); | 60 return info.newSubtractValue(-two, -one); |
58 } else if (one.isZero) { | 61 } else if (one.isZero) { |
59 return -two; | 62 return -two; |
60 } | 63 } |
61 } | 64 } |
62 return new SubtractValue(one, two); | 65 return info.newSubtractValue(one, two); |
63 } | 66 } |
64 | 67 |
65 if (lower == null) { | 68 if (lower == null) { |
66 lower = buildBound(one.lower, two.upper); | 69 lower = buildBound(one.lower, two.upper); |
67 } else if (lower is num) { | 70 } else if (lower is num) { |
68 lower = new IntValue(lower); | 71 lower = info.newIntValue(lower); |
69 } | 72 } |
70 if (upper == null) { | 73 if (upper == null) { |
71 upper = buildBound(one.upper, two.lower); | 74 upper = buildBound(one.upper, two.lower); |
72 } else if (upper is num) { | 75 } else if (upper is num) { |
73 upper = new IntValue(upper); | 76 upper = info.newIntValue(upper); |
74 } | 77 } |
75 | 78 |
76 Expect.equals(new Range(lower, upper), one - two); | 79 Expect.equals(info.newRange(lower, upper), one - two); |
77 } | 80 } |
78 | 81 |
79 checkNegateRange(Range range, [arg1, arg2]) { | 82 checkNegateRange(Range range, [arg1, arg2]) { |
80 if (arg1 is Range) { | 83 if (arg1 is Range) { |
81 Expect.equals(arg1, -range); | 84 Expect.equals(arg1, -range); |
82 } else { | 85 } else { |
83 Value low, up; | 86 Value low, up; |
84 if (arg1 is num) { | 87 if (arg1 is num) { |
85 low = new IntValue(arg1); | 88 low = info.newIntValue(arg1); |
86 } else if (arg1 == null) { | 89 } else if (arg1 == null) { |
87 low = new NegateValue(range.upper); | 90 low = info.newNegateValue(range.upper); |
88 } else { | 91 } else { |
89 low = arg1; | 92 low = arg1; |
90 } | 93 } |
91 if (arg2 is num) { | 94 if (arg2 is num) { |
92 up = new IntValue(arg2); | 95 up = info.newIntValue(arg2); |
93 } else if (arg2 == null) { | 96 } else if (arg2 == null) { |
94 up = new NegateValue(range.lower); | 97 up = info.newNegateValue(range.lower); |
95 } else { | 98 } else { |
96 up = arg2; | 99 up = arg2; |
97 } | 100 } |
98 Expect.equals(new Range(low, up), -range); | 101 Expect.equals(info.newRange(low, up), -range); |
99 } | 102 } |
100 } | 103 } |
101 | 104 |
102 testNegate() { | 105 testNegate() { |
103 checkNegateRange(instruction); | 106 checkNegateRange(instruction); |
104 checkNegateRange(FF, nFF); | 107 checkNegateRange(FF, nFF); |
105 checkNegateRange(nFF, FF); | 108 checkNegateRange(nFF, FF); |
106 checkNegateRange(FA, -0xFA, -0xFA); | 109 checkNegateRange(FA, -0xFA, -0xFA); |
107 checkNegateRange(length); | 110 checkNegateRange(length); |
108 checkNegateRange(_FA_FF, -0xFF, -0xFA); | 111 checkNegateRange(_FA_FF, -0xFF, -0xFA); |
109 checkNegateRange(_0_FF, _nFF_0); | 112 checkNegateRange(_0_FF, _nFF_0); |
110 checkNegateRange(_nFF_FF, _nFF_FF); | 113 checkNegateRange(_nFF_FF, _nFF_FF); |
111 checkNegateRange(_nFF_0, _0_FF); | 114 checkNegateRange(_nFF_0, _0_FF); |
112 checkNegateRange(_0_length, -lengthValue, 0); | 115 checkNegateRange(_0_length, -lengthValue, 0); |
113 checkNegateRange(_0_instruction, -instructionValue, 0); | 116 checkNegateRange(_0_instruction, -instructionValue, 0); |
114 } | 117 } |
115 | 118 |
| 119 bits32(value) => value & 0xFFFFFFFF; |
| 120 |
116 testAnd() { | 121 testAnd() { |
117 checkAndRange( | 122 checkAndRange( |
118 instruction, instruction, const MinIntValue(), const MaxIntValue()); | 123 instruction, instruction, const MinIntValue(), const MaxIntValue()); |
119 checkAndRange(instruction, FF, 0, 0xFF); | 124 checkAndRange(instruction, FF, 0, 0xFF); |
120 checkAndRange(instruction, FA, 0, 0xFA); | 125 checkAndRange(instruction, FA, 0, 0xFA); |
121 checkAndRange(instruction, nFF, const MinIntValue(), const MaxIntValue()); | 126 checkAndRange(instruction, nFF, const MinIntValue(), const MaxIntValue()); |
122 checkAndRange(instruction, length, 0, length.upper); | 127 checkAndRange(instruction, length, 0, length.upper); |
123 checkAndRange(instruction, _FA_FF, 0, 0xFF); | 128 checkAndRange(instruction, _FA_FF, 0, 0xFF); |
124 checkAndRange(instruction, _0_FF, 0, 0xFF); | 129 checkAndRange(instruction, _0_FF, 0, 0xFF); |
125 checkAndRange(instruction, _nFF_FF, const MinIntValue(), const MaxIntValue()); | 130 checkAndRange(instruction, _nFF_FF, const MinIntValue(), const MaxIntValue()); |
(...skipping 29 matching lines...) Expand all Loading... |
155 checkAndRange(FA, length, 0, 0xFA); | 160 checkAndRange(FA, length, 0, 0xFA); |
156 checkAndRange(FA, _FA_FF, 0, 0xFA); | 161 checkAndRange(FA, _FA_FF, 0, 0xFA); |
157 checkAndRange(FA, _0_FF, 0, 0xFA); | 162 checkAndRange(FA, _0_FF, 0, 0xFA); |
158 checkAndRange(FA, _nFF_FF, 0, 0xFA); | 163 checkAndRange(FA, _nFF_FF, 0, 0xFA); |
159 checkAndRange(FA, _nFF_0, 0, 0xFA); | 164 checkAndRange(FA, _nFF_0, 0, 0xFA); |
160 checkAndRange(FA, _0_length, 0, 0xFA); | 165 checkAndRange(FA, _0_length, 0, 0xFA); |
161 checkAndRange(FA, _0_instruction, 0, 0xFA); | 166 checkAndRange(FA, _0_instruction, 0, 0xFA); |
162 | 167 |
163 checkAndRange(nFF, FF, 1, 1); | 168 checkAndRange(nFF, FF, 1, 1); |
164 checkAndRange(nFF, FA, 0, 0); | 169 checkAndRange(nFF, FA, 0, 0); |
165 checkAndRange(nFF, nFF, -0xFF, -0xFF); | 170 checkAndRange(nFF, nFF, bits32(-0xFF), bits32(-0xFF)); |
166 checkAndRange(nFF, length, 0, length.upper); | 171 checkAndRange(nFF, length, 0, length.upper); |
167 checkAndRange(nFF, _FA_FF, 0, 0xFF); | 172 checkAndRange(nFF, _FA_FF, 0, 0xFF); |
168 checkAndRange(nFF, _0_FF, 0, 0xFF); | 173 checkAndRange(nFF, _0_FF, 0, 0xFF); |
169 checkAndRange(nFF, _nFF_FF, const MinIntValue(), const MaxIntValue()); | 174 checkAndRange(nFF, _nFF_FF, const MinIntValue(), const MaxIntValue()); |
170 checkAndRange(nFF, _nFF_0, const MinIntValue(), const MaxIntValue()); | 175 checkAndRange(nFF, _nFF_0, const MinIntValue(), const MaxIntValue()); |
171 checkAndRange(nFF, _0_length, 0, _0_length.upper); | 176 checkAndRange(nFF, _0_length, 0, _0_length.upper); |
172 checkAndRange(nFF, _0_instruction, 0, _0_instruction.upper); | 177 checkAndRange(nFF, _0_instruction, 0, _0_instruction.upper); |
173 | 178 |
174 checkAndRange(_FA_FF, FF, 0, 0xFF); | 179 checkAndRange(_FA_FF, FF, 0, 0xFF); |
175 checkAndRange(_FA_FF, FA, 0, 0xFA); | 180 checkAndRange(_FA_FF, FA, 0, 0xFA); |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
361 checkSubRange(_0_instruction, _0_length, null, _0_instruction.upper); | 366 checkSubRange(_0_instruction, _0_length, null, _0_instruction.upper); |
362 checkSubRange(_0_instruction, _0_instruction, null, _0_instruction.upper); | 367 checkSubRange(_0_instruction, _0_instruction, null, _0_instruction.upper); |
363 } | 368 } |
364 | 369 |
365 main() { | 370 main() { |
366 HInstruction.idCounter = 0; | 371 HInstruction.idCounter = 0; |
367 testAnd(); | 372 testAnd(); |
368 testSub(); | 373 testSub(); |
369 testNegate(); | 374 testNegate(); |
370 } | 375 } |
OLD | NEW |