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 7016 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7027 }; | 7027 }; |
7028 | 7028 |
7029 | 7029 |
7030 void DeferredPrefixCountOperation::Generate() { | 7030 void DeferredPrefixCountOperation::Generate() { |
7031 // Undo the optimistic smi operation. | 7031 // Undo the optimistic smi operation. |
7032 if (is_increment_) { | 7032 if (is_increment_) { |
7033 __ sub(Operand(dst_), Immediate(Smi::FromInt(1))); | 7033 __ sub(Operand(dst_), Immediate(Smi::FromInt(1))); |
7034 } else { | 7034 } else { |
7035 __ add(Operand(dst_), Immediate(Smi::FromInt(1))); | 7035 __ add(Operand(dst_), Immediate(Smi::FromInt(1))); |
7036 } | 7036 } |
7037 __ push(dst_); | 7037 Register left; |
7038 if (!input_type_.IsNumber()) { | 7038 if (input_type_.IsNumber()) { |
| 7039 left = dst_; |
| 7040 } else { |
| 7041 __ push(dst_); |
7039 __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); | 7042 __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); |
7040 __ push(eax); | 7043 left = eax; |
7041 } | 7044 } |
7042 __ push(Immediate(Smi::FromInt(1))); | 7045 |
7043 if (is_increment_) { | 7046 GenericBinaryOpStub stub(is_increment_ ? Token::ADD : Token::SUB, |
7044 __ CallRuntime(Runtime::kNumberAdd, 2); | 7047 NO_OVERWRITE, |
7045 } else { | 7048 NO_GENERIC_BINARY_FLAGS, |
7046 __ CallRuntime(Runtime::kNumberSub, 2); | 7049 TypeInfo::Number()); |
7047 } | 7050 stub.GenerateCall(masm_, left, Smi::FromInt(1)); |
| 7051 |
7048 if (!dst_.is(eax)) __ mov(dst_, eax); | 7052 if (!dst_.is(eax)) __ mov(dst_, eax); |
7049 } | 7053 } |
7050 | 7054 |
7051 | 7055 |
7052 // The value in dst was optimistically incremented or decremented. The | 7056 // The value in dst was optimistically incremented or decremented. The |
7053 // result overflowed or was not smi tagged. Undo the operation and call | 7057 // result overflowed or was not smi tagged. Undo the operation and call |
7054 // into the runtime to convert the argument to a number. Update the | 7058 // into the runtime to convert the argument to a number. Update the |
7055 // original value in old. Call the specialized add or subtract stub. | 7059 // original value in old. Call the specialized add or subtract stub. |
7056 // The result is left in dst. | 7060 // The result is left in dst. |
7057 class DeferredPostfixCountOperation: public DeferredCode { | 7061 class DeferredPostfixCountOperation: public DeferredCode { |
(...skipping 19 matching lines...) Expand all Loading... |
7077 }; | 7081 }; |
7078 | 7082 |
7079 | 7083 |
7080 void DeferredPostfixCountOperation::Generate() { | 7084 void DeferredPostfixCountOperation::Generate() { |
7081 // Undo the optimistic smi operation. | 7085 // Undo the optimistic smi operation. |
7082 if (is_increment_) { | 7086 if (is_increment_) { |
7083 __ sub(Operand(dst_), Immediate(Smi::FromInt(1))); | 7087 __ sub(Operand(dst_), Immediate(Smi::FromInt(1))); |
7084 } else { | 7088 } else { |
7085 __ add(Operand(dst_), Immediate(Smi::FromInt(1))); | 7089 __ add(Operand(dst_), Immediate(Smi::FromInt(1))); |
7086 } | 7090 } |
| 7091 Register left; |
7087 if (input_type_.IsNumber()) { | 7092 if (input_type_.IsNumber()) { |
7088 __ push(dst_); // Save the input to use as the old value. | 7093 __ push(dst_); // Save the input to use as the old value. |
7089 __ push(dst_); | 7094 left = dst_; |
7090 } else { | 7095 } else { |
7091 __ push(dst_); | 7096 __ push(dst_); |
7092 __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); | 7097 __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); |
7093 __ push(eax); // Save the result of ToNumber to use as the old value. | 7098 __ push(eax); // Save the result of ToNumber to use as the old value. |
7094 __ push(eax); | 7099 left = eax; |
7095 } | 7100 } |
7096 | 7101 |
7097 // Call the runtime for the addition or subtraction. | 7102 GenericBinaryOpStub stub(is_increment_ ? Token::ADD : Token::SUB, |
7098 __ push(Immediate(Smi::FromInt(1))); | 7103 NO_OVERWRITE, |
7099 if (is_increment_) { | 7104 NO_GENERIC_BINARY_FLAGS, |
7100 __ CallRuntime(Runtime::kNumberAdd, 2); | 7105 TypeInfo::Number()); |
7101 } else { | 7106 stub.GenerateCall(masm_, left, Smi::FromInt(1)); |
7102 __ CallRuntime(Runtime::kNumberSub, 2); | 7107 |
7103 } | |
7104 if (!dst_.is(eax)) __ mov(dst_, eax); | 7108 if (!dst_.is(eax)) __ mov(dst_, eax); |
7105 __ pop(old_); | 7109 __ pop(old_); |
7106 } | 7110 } |
7107 | 7111 |
7108 | 7112 |
7109 void CodeGenerator::VisitCountOperation(CountOperation* node) { | 7113 void CodeGenerator::VisitCountOperation(CountOperation* node) { |
7110 ASSERT(!in_safe_int32_mode()); | 7114 ASSERT(!in_safe_int32_mode()); |
7111 Comment cmnt(masm_, "[ CountOperation"); | 7115 Comment cmnt(masm_, "[ CountOperation"); |
7112 | 7116 |
7113 bool is_postfix = node->is_postfix(); | 7117 bool is_postfix = node->is_postfix(); |
(...skipping 5486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12600 | 12604 |
12601 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) | 12605 // Call the runtime; it returns -1 (less), 0 (equal), or 1 (greater) |
12602 // tagged as a small integer. | 12606 // tagged as a small integer. |
12603 __ bind(&runtime); | 12607 __ bind(&runtime); |
12604 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); | 12608 __ TailCallRuntime(Runtime::kStringCompare, 2, 1); |
12605 } | 12609 } |
12606 | 12610 |
12607 #undef __ | 12611 #undef __ |
12608 | 12612 |
12609 } } // namespace v8::internal | 12613 } } // namespace v8::internal |
OLD | NEW |