| 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 |