Chromium Code Reviews| 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 7001 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7012 | 7012 |
| 7013 switch (op) { | 7013 switch (op) { |
| 7014 case Token::COMMA: | 7014 case Token::COMMA: |
| 7015 case Token::OR: | 7015 case Token::OR: |
| 7016 case Token::AND: | 7016 case Token::AND: |
| 7017 UNREACHABLE(); | 7017 UNREACHABLE(); |
| 7018 break; | 7018 break; |
| 7019 case Token::BIT_OR: | 7019 case Token::BIT_OR: |
| 7020 case Token::BIT_XOR: | 7020 case Token::BIT_XOR: |
| 7021 case Token::BIT_AND: | 7021 case Token::BIT_AND: |
| 7022 left.ToRegister(); | 7022 if (left.is_constant() || right.is_constant()) { |
| 7023 right.ToRegister(); | 7023 int32_t value; // Put constant in value, non-constant in left. |
| 7024 if (op == Token::BIT_OR) { | 7024 // Constants are known to be int32 values, from static analysis, |
| 7025 __ or_(left.reg(), Operand(right.reg())); | 7025 // or else will be converted to int32 by implicit ECMA [[ToInt32]]. |
| 7026 } else if (op == Token::BIT_XOR) { | 7026 if (left.is_constant()) { |
| 7027 __ xor_(left.reg(), Operand(right.reg())); | 7027 ASSERT(left.handle()->IsSmi() || left.handle()->IsHeapNumber()); |
| 7028 value = NumberToInt32(*left.handle()); | |
| 7029 left = right; | |
| 7030 } else { | |
| 7031 ASSERT(right.handle()->IsSmi() || right.handle()->IsHeapNumber()); | |
| 7032 value = NumberToInt32(*right.handle()); | |
| 7033 } | |
| 7034 | |
| 7035 left.ToRegister(); | |
| 7036 if (op == Token::BIT_OR) { | |
| 7037 __ or_(Operand(left.reg()), Immediate(value)); | |
| 7038 } else if (op == Token::BIT_XOR) { | |
| 7039 __ xor_(Operand(left.reg()), Immediate(value)); | |
| 7040 } else { | |
| 7041 ASSERT(op == Token::BIT_AND); | |
| 7042 __ and_(Operand(left.reg()), Immediate(value)); | |
| 7043 } | |
| 7028 } else { | 7044 } else { |
| 7029 ASSERT(op == Token::BIT_AND); | 7045 ASSERT(left.is_register()); |
| 7030 __ and_(left.reg(), Operand(right.reg())); | 7046 ASSERT(right.is_register()); |
| 7047 if (op == Token::BIT_OR) { | |
| 7048 __ or_(left.reg(), Operand(right.reg())); | |
| 7049 } else if (op == Token::BIT_XOR) { | |
| 7050 __ xor_(left.reg(), Operand(right.reg())); | |
| 7051 } else { | |
| 7052 ASSERT(op == Token::BIT_AND); | |
| 7053 __ and_(left.reg(), Operand(right.reg())); | |
| 7054 } | |
| 7031 } | 7055 } |
| 7032 frame_->Push(&left); | 7056 frame_->Push(&left); |
| 7033 right.Unuse(); | 7057 right.Unuse(); |
| 7034 break; | 7058 break; |
| 7035 case Token::SAR: | 7059 case Token::SAR: |
| 7036 case Token::SHL: | 7060 case Token::SHL: |
| 7037 case Token::SHR: { | 7061 case Token::SHR: { |
| 7038 bool test_shr_overflow = false; | 7062 bool test_shr_overflow = false; |
| 7039 left.ToRegister(); | 7063 left.ToRegister(); |
| 7040 if (right.is_constant()) { | 7064 if (right.is_constant()) { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7079 // Test is needed because shr with shift amount 0 does not set flags. | 7103 // Test is needed because shr with shift amount 0 does not set flags. |
| 7080 __ test(left_reg, Operand(left_reg)); | 7104 __ test(left_reg, Operand(left_reg)); |
| 7081 unsafe_bailout_->Branch(sign); | 7105 unsafe_bailout_->Branch(sign); |
| 7082 } | 7106 } |
| 7083 } | 7107 } |
| 7084 break; | 7108 break; |
| 7085 } | 7109 } |
| 7086 case Token::ADD: | 7110 case Token::ADD: |
| 7087 case Token::SUB: | 7111 case Token::SUB: |
| 7088 case Token::MUL: | 7112 case Token::MUL: |
| 7089 left.ToRegister(); | 7113 if ((left.is_constant() && op != Token::SUB) || right.is_constant()) { |
| 7090 right.ToRegister(); | 7114 int32_t value; // Put constant in value, non-constant in left. |
| 7091 if (op == Token::ADD) { | 7115 if (right.is_constant()) { |
| 7092 __ add(left.reg(), Operand(right.reg())); | 7116 ASSERT(right.handle()->IsSmi() || right.handle()->IsHeapNumber()); |
| 7093 } else if (op == Token::SUB) { | 7117 value = NumberToInt32(*right.handle()); |
| 7094 __ sub(left.reg(), Operand(right.reg())); | 7118 } else { |
| 7119 ASSERT(left.handle()->IsSmi() || left.handle()->IsHeapNumber()); | |
| 7120 value = NumberToInt32(*left.handle()); | |
| 7121 left = right; | |
| 7122 } | |
| 7123 | |
| 7124 left.ToRegister(); | |
| 7125 if (op == Token::ADD) { | |
| 7126 __ add(Operand(left.reg()), Immediate(value)); | |
| 7127 } else if (op == Token::SUB) { | |
| 7128 __ sub(Operand(left.reg()), Immediate(value)); | |
| 7129 } else { | |
| 7130 ASSERT(op == Token::MUL); | |
| 7131 __ imul(left.reg(), left.reg(), value); | |
| 7132 } | |
| 7095 } else { | 7133 } else { |
| 7096 ASSERT(op == Token::MUL); | 7134 left.ToRegister(); |
|
fschneider
2010/03/22 10:30:42
Do we need right.ToRegister() here as well?
William Hesse
2010/03/23 10:19:45
No. If right is a constant we never get to this b
| |
| 7097 // We have statically verified that a negative zero can be ignored. | 7135 ASSERT(left.is_register()); |
| 7098 __ imul(left.reg(), Operand(right.reg())); | 7136 ASSERT(right.is_register()); |
| 7137 if (op == Token::ADD) { | |
| 7138 __ add(left.reg(), Operand(right.reg())); | |
| 7139 } else if (op == Token::SUB) { | |
| 7140 __ sub(left.reg(), Operand(right.reg())); | |
| 7141 } else { | |
| 7142 ASSERT(op == Token::MUL); | |
| 7143 // We have statically verified that a negative zero can be ignored. | |
| 7144 __ imul(left.reg(), Operand(right.reg())); | |
| 7145 } | |
| 7099 } | 7146 } |
| 7100 right.Unuse(); | 7147 right.Unuse(); |
| 7101 frame_->Push(&left); | 7148 frame_->Push(&left); |
| 7102 if (!node->to_int32()) { | 7149 if (!node->to_int32()) { |
| 7103 // If ToInt32 is called on the result of ADD, SUB, or MUL, we don't | 7150 // If ToInt32 is called on the result of ADD, SUB, or MUL, we don't |
| 7104 // care about overflows. | 7151 // care about overflows. |
| 7105 unsafe_bailout_->Branch(overflow); | 7152 unsafe_bailout_->Branch(overflow); |
| 7106 } | 7153 } |
| 7107 break; | 7154 break; |
| 7108 case Token::DIV: | 7155 case Token::DIV: |
| (...skipping 5161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 12270 | 12317 |
| 12271 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 12318 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
| 12272 // tagged as a small integer. | 12319 // tagged as a small integer. |
| 12273 __ bind(&runtime); | 12320 __ bind(&runtime); |
| 12274 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 12321 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
| 12275 } | 12322 } |
| 12276 | 12323 |
| 12277 #undef __ | 12324 #undef __ |
| 12278 | 12325 |
| 12279 } } // namespace v8::internal | 12326 } } // namespace v8::internal |
| OLD | NEW |