OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 7406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7417 frame_->Push(&eax_result); | 7417 frame_->Push(&eax_result); |
7418 } | 7418 } |
7419 break; | 7419 break; |
7420 } | 7420 } |
7421 default: | 7421 default: |
7422 UNREACHABLE(); | 7422 UNREACHABLE(); |
7423 break; | 7423 break; |
7424 } | 7424 } |
7425 } | 7425 } |
7426 | 7426 |
7427 void CodeGenerator::VisitBinaryOperation(BinaryOperation* node) { | |
7428 Comment cmnt(masm_, "[ BinaryOperation"); | |
7429 Token::Value op = node->op(); | |
7430 | 7427 |
| 7428 void CodeGenerator::GenerateLogicalBooleanOperation(BinaryOperation* node) { |
7431 // According to ECMA-262 section 11.11, page 58, the binary logical | 7429 // According to ECMA-262 section 11.11, page 58, the binary logical |
7432 // operators must yield the result of one of the two expressions | 7430 // operators must yield the result of one of the two expressions |
7433 // before any ToBoolean() conversions. This means that the value | 7431 // before any ToBoolean() conversions. This means that the value |
7434 // produced by a && or || operator is not necessarily a boolean. | 7432 // produced by a && or || operator is not necessarily a boolean. |
7435 | 7433 |
7436 // NOTE: If the left hand side produces a materialized value (not | 7434 // NOTE: If the left hand side produces a materialized value (not |
7437 // control flow), we force the right hand side to do the same. This | 7435 // control flow), we force the right hand side to do the same. This |
7438 // is necessary because we assume that if we get control flow on the | 7436 // is necessary because we assume that if we get control flow on the |
7439 // last path out of an expression we got it on all paths. | 7437 // last path out of an expression we got it on all paths. |
7440 if (op == Token::AND) { | 7438 if (node->op() == Token::AND) { |
7441 ASSERT(!in_safe_int32_mode()); | 7439 ASSERT(!in_safe_int32_mode()); |
7442 JumpTarget is_true; | 7440 JumpTarget is_true; |
7443 ControlDestination dest(&is_true, destination()->false_target(), true); | 7441 ControlDestination dest(&is_true, destination()->false_target(), true); |
7444 LoadCondition(node->left(), &dest, false); | 7442 LoadCondition(node->left(), &dest, false); |
7445 | 7443 |
7446 if (dest.false_was_fall_through()) { | 7444 if (dest.false_was_fall_through()) { |
7447 // The current false target was used as the fall-through. If | 7445 // The current false target was used as the fall-through. If |
7448 // there are no dangling jumps to is_true then the left | 7446 // there are no dangling jumps to is_true then the left |
7449 // subexpression was unconditionally false. Otherwise we have | 7447 // subexpression was unconditionally false. Otherwise we have |
7450 // paths where we do have to evaluate the right subexpression. | 7448 // paths where we do have to evaluate the right subexpression. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7494 frame_->Drop(); | 7492 frame_->Drop(); |
7495 | 7493 |
7496 // Compile right side expression. | 7494 // Compile right side expression. |
7497 is_true.Bind(); | 7495 is_true.Bind(); |
7498 Load(node->right()); | 7496 Load(node->right()); |
7499 | 7497 |
7500 // Exit (always with a materialized value). | 7498 // Exit (always with a materialized value). |
7501 exit.Bind(); | 7499 exit.Bind(); |
7502 } | 7500 } |
7503 | 7501 |
7504 } else if (op == Token::OR) { | 7502 } else { |
| 7503 ASSERT(node->op() == Token::OR); |
7505 ASSERT(!in_safe_int32_mode()); | 7504 ASSERT(!in_safe_int32_mode()); |
7506 JumpTarget is_false; | 7505 JumpTarget is_false; |
7507 ControlDestination dest(destination()->true_target(), &is_false, false); | 7506 ControlDestination dest(destination()->true_target(), &is_false, false); |
7508 LoadCondition(node->left(), &dest, false); | 7507 LoadCondition(node->left(), &dest, false); |
7509 | 7508 |
7510 if (dest.true_was_fall_through()) { | 7509 if (dest.true_was_fall_through()) { |
7511 // The current true target was used as the fall-through. If | 7510 // The current true target was used as the fall-through. If |
7512 // there are no dangling jumps to is_false then the left | 7511 // there are no dangling jumps to is_false then the left |
7513 // subexpression was unconditionally true. Otherwise we have | 7512 // subexpression was unconditionally true. Otherwise we have |
7514 // paths where we do have to evaluate the right subexpression. | 7513 // paths where we do have to evaluate the right subexpression. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7556 // Pop the result of evaluating the first part. | 7555 // Pop the result of evaluating the first part. |
7557 frame_->Drop(); | 7556 frame_->Drop(); |
7558 | 7557 |
7559 // Compile right side expression. | 7558 // Compile right side expression. |
7560 is_false.Bind(); | 7559 is_false.Bind(); |
7561 Load(node->right()); | 7560 Load(node->right()); |
7562 | 7561 |
7563 // Exit (always with a materialized value). | 7562 // Exit (always with a materialized value). |
7564 exit.Bind(); | 7563 exit.Bind(); |
7565 } | 7564 } |
| 7565 } |
| 7566 } |
7566 | 7567 |
| 7568 |
| 7569 void CodeGenerator::VisitBinaryOperation(BinaryOperation* node) { |
| 7570 Comment cmnt(masm_, "[ BinaryOperation"); |
| 7571 |
| 7572 if (node->op() == Token::AND || node->op() == Token::OR) { |
| 7573 GenerateLogicalBooleanOperation(node); |
7567 } else if (in_safe_int32_mode()) { | 7574 } else if (in_safe_int32_mode()) { |
7568 Visit(node->left()); | 7575 Visit(node->left()); |
7569 Visit(node->right()); | 7576 Visit(node->right()); |
7570 Int32BinaryOperation(node); | 7577 Int32BinaryOperation(node); |
7571 } else { | 7578 } else { |
7572 // NOTE: The code below assumes that the slow cases (calls to runtime) | 7579 // NOTE: The code below assumes that the slow cases (calls to runtime) |
7573 // never return a constant/immutable object. | 7580 // never return a constant/immutable object. |
7574 OverwriteMode overwrite_mode = NO_OVERWRITE; | 7581 OverwriteMode overwrite_mode = NO_OVERWRITE; |
7575 if (node->left()->AsBinaryOperation() != NULL && | 7582 if (node->left()->AsBinaryOperation() != NULL && |
7576 node->left()->AsBinaryOperation()->ResultOverwriteAllowed()) { | 7583 node->left()->AsBinaryOperation()->ResultOverwriteAllowed()) { |
(...skipping 4980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12557 | 12564 |
12558 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 12565 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
12559 // tagged as a small integer. | 12566 // tagged as a small integer. |
12560 __ bind(&runtime); | 12567 __ bind(&runtime); |
12561 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 12568 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
12562 } | 12569 } |
12563 | 12570 |
12564 #undef __ | 12571 #undef __ |
12565 | 12572 |
12566 } } // namespace v8::internal | 12573 } } // namespace v8::internal |
OLD | NEW |