| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 #include "vm/intermediate_language.h" | 5 #include "vm/intermediate_language.h" |
| 6 | 6 |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/bit_vector.h" | 8 #include "vm/bit_vector.h" |
| 9 #include "vm/cpu.h" | 9 #include "vm/cpu.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 1344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1355 return this; | 1355 return this; |
| 1356 } | 1356 } |
| 1357 | 1357 |
| 1358 | 1358 |
| 1359 Definition* FloatToDoubleInstr::Canonicalize(FlowGraph* flow_graph) { | 1359 Definition* FloatToDoubleInstr::Canonicalize(FlowGraph* flow_graph) { |
| 1360 return HasUses() ? this : NULL; | 1360 return HasUses() ? this : NULL; |
| 1361 } | 1361 } |
| 1362 | 1362 |
| 1363 | 1363 |
| 1364 Definition* BinaryDoubleOpInstr::Canonicalize(FlowGraph* flow_graph) { | 1364 Definition* BinaryDoubleOpInstr::Canonicalize(FlowGraph* flow_graph) { |
| 1365 if (!HasUses()) return NULL; |
| 1366 |
| 1365 Definition* result = NULL; | 1367 Definition* result = NULL; |
| 1366 | 1368 |
| 1367 result = CanonicalizeCommutativeArithmetic(op_kind(), | 1369 result = CanonicalizeCommutativeArithmetic(op_kind(), |
| 1368 kDoubleCid, | 1370 kDoubleCid, |
| 1369 left(), | 1371 left(), |
| 1370 right()); | 1372 right()); |
| 1373 if (result == NULL) { |
| 1374 result = CanonicalizeCommutativeArithmetic(op_kind(), |
| 1375 kDoubleCid, |
| 1376 right(), |
| 1377 left()); |
| 1378 } |
| 1371 if (result != NULL) { | 1379 if (result != NULL) { |
| 1372 return result; | 1380 return result; |
| 1373 } | 1381 } |
| 1374 | 1382 |
| 1375 result = CanonicalizeCommutativeArithmetic(op_kind(), | 1383 if ((op_kind() == Token::kMUL) && |
| 1376 kDoubleCid, | 1384 (left()->definition() == right()->definition())) { |
| 1377 right(), | 1385 MathUnaryInstr* math_unary = |
| 1378 left()); | 1386 new MathUnaryInstr(MathUnaryInstr::kDoubleSquare, |
| 1379 if (result != NULL) { | 1387 new Value(left()->definition()), |
| 1380 return result; | 1388 Isolate::kNoDeoptId); |
| 1389 flow_graph->InsertBefore(this, math_unary, NULL, Definition::kValue); |
| 1390 return math_unary; |
| 1381 } | 1391 } |
| 1382 | 1392 |
| 1383 return this; | 1393 return this; |
| 1384 } | 1394 } |
| 1385 | 1395 |
| 1386 | 1396 |
| 1387 Definition* BinarySmiOpInstr::Canonicalize(FlowGraph* flow_graph) { | 1397 Definition* BinarySmiOpInstr::Canonicalize(FlowGraph* flow_graph) { |
| 1388 Definition* result = NULL; | 1398 Definition* result = NULL; |
| 1389 | 1399 |
| 1390 result = CanonicalizeCommutativeArithmetic(op_kind(), | 1400 result = CanonicalizeCommutativeArithmetic(op_kind(), |
| (...skipping 1935 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3326 "libc_cos", reinterpret_cast<RuntimeFunction>( | 3336 "libc_cos", reinterpret_cast<RuntimeFunction>( |
| 3327 static_cast<UnaryMathCFunction>(&cos)), 1, true, true); | 3337 static_cast<UnaryMathCFunction>(&cos)), 1, true, true); |
| 3328 | 3338 |
| 3329 extern const RuntimeEntry kSinRuntimeEntry( | 3339 extern const RuntimeEntry kSinRuntimeEntry( |
| 3330 "libc_sin", reinterpret_cast<RuntimeFunction>( | 3340 "libc_sin", reinterpret_cast<RuntimeFunction>( |
| 3331 static_cast<UnaryMathCFunction>(&sin)), 1, true, true); | 3341 static_cast<UnaryMathCFunction>(&sin)), 1, true, true); |
| 3332 | 3342 |
| 3333 | 3343 |
| 3334 const RuntimeEntry& MathUnaryInstr::TargetFunction() const { | 3344 const RuntimeEntry& MathUnaryInstr::TargetFunction() const { |
| 3335 switch (kind()) { | 3345 switch (kind()) { |
| 3336 case MethodRecognizer::kMathSin: | 3346 case MathUnaryInstr::kSin: |
| 3337 return kSinRuntimeEntry; | 3347 return kSinRuntimeEntry; |
| 3338 case MethodRecognizer::kMathCos: | 3348 case MathUnaryInstr::kCos: |
| 3339 return kCosRuntimeEntry; | 3349 return kCosRuntimeEntry; |
| 3340 default: | 3350 default: |
| 3341 UNREACHABLE(); | 3351 UNREACHABLE(); |
| 3342 } | 3352 } |
| 3343 return kSinRuntimeEntry; | 3353 return kSinRuntimeEntry; |
| 3344 } | 3354 } |
| 3345 | 3355 |
| 3346 | 3356 |
| 3357 const char* MathUnaryInstr::KindToCString(MathUnaryKind kind) { |
| 3358 switch (kind) { |
| 3359 case kIllegal: return "illegal"; |
| 3360 case kSin: return "sin"; |
| 3361 case kCos: return "cos"; |
| 3362 case kSqrt: return "sqrt"; |
| 3363 case kDoubleSquare: return "double-square"; |
| 3364 } |
| 3365 UNREACHABLE(); |
| 3366 return ""; |
| 3367 } |
| 3368 |
| 3369 |
| 3347 MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs, | 3370 MergedMathInstr::MergedMathInstr(ZoneGrowableArray<Value*>* inputs, |
| 3348 intptr_t original_deopt_id, | 3371 intptr_t original_deopt_id, |
| 3349 MergedMathInstr::Kind kind) | 3372 MergedMathInstr::Kind kind) |
| 3350 : inputs_(inputs), | 3373 : inputs_(inputs), |
| 3351 kind_(kind) { | 3374 kind_(kind) { |
| 3352 ASSERT(inputs_->length() == InputCountFor(kind_)); | 3375 ASSERT(inputs_->length() == InputCountFor(kind_)); |
| 3353 for (intptr_t i = 0; i < inputs_->length(); ++i) { | 3376 for (intptr_t i = 0; i < inputs_->length(); ++i) { |
| 3354 ASSERT((*inputs)[i] != NULL); | 3377 ASSERT((*inputs)[i] != NULL); |
| 3355 (*inputs)[i]->set_instruction(this); | 3378 (*inputs)[i]->set_instruction(this); |
| 3356 (*inputs)[i]->set_use_index(i); | 3379 (*inputs)[i]->set_use_index(i); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 3373 case Token::kTRUNCDIV: return 0; | 3396 case Token::kTRUNCDIV: return 0; |
| 3374 case Token::kMOD: return 1; | 3397 case Token::kMOD: return 1; |
| 3375 default: UNIMPLEMENTED(); return -1; | 3398 default: UNIMPLEMENTED(); return -1; |
| 3376 } | 3399 } |
| 3377 } | 3400 } |
| 3378 | 3401 |
| 3379 | 3402 |
| 3380 #undef __ | 3403 #undef __ |
| 3381 | 3404 |
| 3382 } // namespace dart | 3405 } // namespace dart |
| OLD | NEW |