Chromium Code Reviews| 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/typing-asm.h" | 5 #include "src/typing-asm.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 | 8 |
| 9 #include "src/v8.h" | 9 #include "src/v8.h" |
| 10 | 10 |
| (...skipping 1191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1202 case Token::MOD: { | 1202 case Token::MOD: { |
| 1203 RECURSE(VisitWithExpectation( | 1203 RECURSE(VisitWithExpectation( |
| 1204 expr->left(), Type::Number(), | 1204 expr->left(), Type::Number(), |
| 1205 "left arithmetic operand expected to be number")); | 1205 "left arithmetic operand expected to be number")); |
| 1206 Type* left_type = computed_type_; | 1206 Type* left_type = computed_type_; |
| 1207 int left_intish = intish_; | 1207 int left_intish = intish_; |
| 1208 RECURSE(VisitWithExpectation( | 1208 RECURSE(VisitWithExpectation( |
| 1209 expr->right(), Type::Number(), | 1209 expr->right(), Type::Number(), |
| 1210 "right arithmetic operand expected to be number")); | 1210 "right arithmetic operand expected to be number")); |
| 1211 Type* right_type = computed_type_; | 1211 Type* right_type = computed_type_; |
| 1212 int right_intish = intish_; | 1212 int right_intish = intish_; |
|
titzer
2016/02/23 15:52:18
probably want int32_t here?
bradn
2016/02/23 16:27:09
I suppose. Done.
| |
| 1213 Type* type = Type::Union(left_type, right_type, zone()); | 1213 Type* type = Type::Union(left_type, right_type, zone()); |
| 1214 if (type->Is(cache_.kAsmInt)) { | 1214 if (type->Is(cache_.kAsmInt)) { |
| 1215 if (expr->op() == Token::MUL) { | 1215 if (expr->op() == Token::MUL) { |
| 1216 int32_t i; | |
| 1217 Literal* left = expr->left()->AsLiteral(); | |
| 1216 Literal* right = expr->right()->AsLiteral(); | 1218 Literal* right = expr->right()->AsLiteral(); |
| 1217 if (!right) { | 1219 if (left != nullptr && left->value()->IsNumber() && |
| 1218 FAIL(expr, "direct integer multiply forbidden"); | 1220 left->value()->ToInt32(&i)) { |
| 1219 } | 1221 if (right_intish != 0) { |
| 1220 if (!right->value()->IsNumber()) { | 1222 FAIL(expr, "intish not allowed in multiply"); |
| 1221 FAIL(expr, "multiply must be by an integer"); | 1223 } |
| 1222 } | 1224 } else if (right != nullptr && right->value()->IsNumber() && |
| 1223 int32_t i; | 1225 right->value()->ToInt32(&i)) { |
| 1224 if (!right->value()->ToInt32(&i)) { | 1226 if (left_intish != 0) { |
| 1225 FAIL(expr, "multiply must be a signed integer"); | 1227 FAIL(expr, "intish not allowed in multiply"); |
| 1228 } | |
| 1229 } else { | |
| 1230 FAIL(expr, "multiply must be by an literal integer"); | |
|
titzer
2016/02/23 15:52:18
by "an integer literal" ?
bradn
2016/02/23 16:27:09
Done.
| |
| 1226 } | 1231 } |
| 1227 i = abs(i); | 1232 i = abs(i); |
| 1228 if (i >= 1 << 20) { | 1233 if (i >= (1 << 20)) { |
| 1229 FAIL(expr, "multiply must be by value in -2^20 < n < 2^20"); | 1234 FAIL(expr, "multiply must be by value in -2^20 < n < 2^20"); |
| 1230 } | 1235 } |
| 1231 intish_ = i; | 1236 intish_ = i; |
| 1232 IntersectResult(expr, cache_.kAsmInt); | 1237 IntersectResult(expr, cache_.kAsmInt); |
| 1233 return; | 1238 return; |
| 1234 } else { | 1239 } else { |
| 1235 intish_ = left_intish + right_intish + 1; | 1240 intish_ = left_intish + right_intish + 1; |
| 1236 if (expr->op() == Token::ADD || expr->op() == Token::SUB) { | 1241 if (expr->op() == Token::ADD || expr->op() == Token::SUB) { |
| 1237 if (intish_ > kMaxUncombinedAdditiveSteps) { | 1242 if (intish_ > kMaxUncombinedAdditiveSteps) { |
| 1238 FAIL(expr, "too many consecutive additive ops"); | 1243 FAIL(expr, "too many consecutive additive ops"); |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1555 } | 1560 } |
| 1556 | 1561 |
| 1557 | 1562 |
| 1558 void AsmTyper::VisitRewritableExpression(RewritableExpression* expr) { | 1563 void AsmTyper::VisitRewritableExpression(RewritableExpression* expr) { |
| 1559 RECURSE(Visit(expr->expression())); | 1564 RECURSE(Visit(expr->expression())); |
| 1560 } | 1565 } |
| 1561 | 1566 |
| 1562 | 1567 |
| 1563 } // namespace internal | 1568 } // namespace internal |
| 1564 } // namespace v8 | 1569 } // namespace v8 |
| OLD | NEW |