OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/crankshaft/hydrogen-instructions.h" | 5 #include "src/crankshaft/hydrogen-instructions.h" |
6 | 6 |
7 #include "src/base/bits.h" | 7 #include "src/base/bits.h" |
8 #include "src/base/ieee754.h" | 8 #include "src/base/ieee754.h" |
9 #include "src/base/safe_math.h" | 9 #include "src/base/safe_math.h" |
10 #include "src/crankshaft/hydrogen-infer-representation.h" | 10 #include "src/crankshaft/hydrogen-infer-representation.h" |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 lower_ = kMinInt; | 252 lower_ = kMinInt; |
253 } | 253 } |
254 set_can_be_minus_zero(false); | 254 set_can_be_minus_zero(false); |
255 } | 255 } |
256 | 256 |
257 | 257 |
258 bool Range::AddAndCheckOverflow(const Representation& r, Range* other) { | 258 bool Range::AddAndCheckOverflow(const Representation& r, Range* other) { |
259 bool may_overflow = false; | 259 bool may_overflow = false; |
260 lower_ = AddWithoutOverflow(r, lower_, other->lower(), &may_overflow); | 260 lower_ = AddWithoutOverflow(r, lower_, other->lower(), &may_overflow); |
261 upper_ = AddWithoutOverflow(r, upper_, other->upper(), &may_overflow); | 261 upper_ = AddWithoutOverflow(r, upper_, other->upper(), &may_overflow); |
262 KeepOrder(); | 262 if (may_overflow) { |
| 263 Clear(); |
| 264 } else { |
| 265 KeepOrder(); |
| 266 } |
263 #ifdef DEBUG | 267 #ifdef DEBUG |
264 Verify(); | 268 Verify(); |
265 #endif | 269 #endif |
266 return may_overflow; | 270 return may_overflow; |
267 } | 271 } |
268 | 272 |
269 | 273 |
270 bool Range::SubAndCheckOverflow(const Representation& r, Range* other) { | 274 bool Range::SubAndCheckOverflow(const Representation& r, Range* other) { |
271 bool may_overflow = false; | 275 bool may_overflow = false; |
272 lower_ = SubWithoutOverflow(r, lower_, other->upper(), &may_overflow); | 276 lower_ = SubWithoutOverflow(r, lower_, other->upper(), &may_overflow); |
273 upper_ = SubWithoutOverflow(r, upper_, other->lower(), &may_overflow); | 277 upper_ = SubWithoutOverflow(r, upper_, other->lower(), &may_overflow); |
274 KeepOrder(); | 278 if (may_overflow) { |
| 279 Clear(); |
| 280 } else { |
| 281 KeepOrder(); |
| 282 } |
275 #ifdef DEBUG | 283 #ifdef DEBUG |
276 Verify(); | 284 Verify(); |
277 #endif | 285 #endif |
278 return may_overflow; | 286 return may_overflow; |
279 } | 287 } |
280 | 288 |
| 289 void Range::Clear() { |
| 290 lower_ = kMinInt; |
| 291 upper_ = kMaxInt; |
| 292 } |
281 | 293 |
282 void Range::KeepOrder() { | 294 void Range::KeepOrder() { |
283 if (lower_ > upper_) { | 295 if (lower_ > upper_) { |
284 int32_t tmp = lower_; | 296 int32_t tmp = lower_; |
285 lower_ = upper_; | 297 lower_ = upper_; |
286 upper_ = tmp; | 298 upper_ = tmp; |
287 } | 299 } |
288 } | 300 } |
289 | 301 |
290 | 302 |
291 #ifdef DEBUG | 303 #ifdef DEBUG |
292 void Range::Verify() const { | 304 void Range::Verify() const { |
293 DCHECK(lower_ <= upper_); | 305 DCHECK(lower_ <= upper_); |
294 } | 306 } |
295 #endif | 307 #endif |
296 | 308 |
297 | 309 |
298 bool Range::MulAndCheckOverflow(const Representation& r, Range* other) { | 310 bool Range::MulAndCheckOverflow(const Representation& r, Range* other) { |
299 bool may_overflow = false; | 311 bool may_overflow = false; |
300 int v1 = MulWithoutOverflow(r, lower_, other->lower(), &may_overflow); | 312 int v1 = MulWithoutOverflow(r, lower_, other->lower(), &may_overflow); |
301 int v2 = MulWithoutOverflow(r, lower_, other->upper(), &may_overflow); | 313 int v2 = MulWithoutOverflow(r, lower_, other->upper(), &may_overflow); |
302 int v3 = MulWithoutOverflow(r, upper_, other->lower(), &may_overflow); | 314 int v3 = MulWithoutOverflow(r, upper_, other->lower(), &may_overflow); |
303 int v4 = MulWithoutOverflow(r, upper_, other->upper(), &may_overflow); | 315 int v4 = MulWithoutOverflow(r, upper_, other->upper(), &may_overflow); |
304 lower_ = Min(Min(v1, v2), Min(v3, v4)); | 316 if (may_overflow) { |
305 upper_ = Max(Max(v1, v2), Max(v3, v4)); | 317 Clear(); |
| 318 } else { |
| 319 lower_ = Min(Min(v1, v2), Min(v3, v4)); |
| 320 upper_ = Max(Max(v1, v2), Max(v3, v4)); |
| 321 } |
306 #ifdef DEBUG | 322 #ifdef DEBUG |
307 Verify(); | 323 Verify(); |
308 #endif | 324 #endif |
309 return may_overflow; | 325 return may_overflow; |
310 } | 326 } |
311 | 327 |
312 | 328 |
313 bool HValue::IsDefinedAfter(HBasicBlock* other) const { | 329 bool HValue::IsDefinedAfter(HBasicBlock* other) const { |
314 return block()->block_id() > other->block_id(); | 330 return block()->block_id() > other->block_id(); |
315 } | 331 } |
(...skipping 3707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4023 case HObjectAccess::kExternalMemory: | 4039 case HObjectAccess::kExternalMemory: |
4024 os << "[external-memory]"; | 4040 os << "[external-memory]"; |
4025 break; | 4041 break; |
4026 } | 4042 } |
4027 | 4043 |
4028 return os << "@" << access.offset(); | 4044 return os << "@" << access.offset(); |
4029 } | 4045 } |
4030 | 4046 |
4031 } // namespace internal | 4047 } // namespace internal |
4032 } // namespace v8 | 4048 } // namespace v8 |
OLD | NEW |