| 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 3134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3145 virtual void Generate(); | 3145 virtual void Generate(); |
| 3146 | 3146 |
| 3147 private: | 3147 private: |
| 3148 Register dst_; | 3148 Register dst_; |
| 3149 bool is_increment_; | 3149 bool is_increment_; |
| 3150 TypeInfo input_type_; | 3150 TypeInfo input_type_; |
| 3151 }; | 3151 }; |
| 3152 | 3152 |
| 3153 | 3153 |
| 3154 void DeferredPrefixCountOperation::Generate() { | 3154 void DeferredPrefixCountOperation::Generate() { |
| 3155 __ push(dst_); | 3155 Register left; |
| 3156 if (!input_type_.IsNumber()) { | 3156 if (input_type_.IsNumber()) { |
| 3157 left = dst_; |
| 3158 } else { |
| 3159 __ push(dst_); |
| 3157 __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); | 3160 __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); |
| 3158 __ push(rax); | 3161 left = rax; |
| 3159 } | 3162 } |
| 3160 __ Push(Smi::FromInt(1)); | 3163 |
| 3161 if (is_increment_) { | 3164 GenericBinaryOpStub stub(is_increment_ ? Token::ADD : Token::SUB, |
| 3162 __ CallRuntime(Runtime::kNumberAdd, 2); | 3165 NO_OVERWRITE, |
| 3163 } else { | 3166 NO_GENERIC_BINARY_FLAGS, |
| 3164 __ CallRuntime(Runtime::kNumberSub, 2); | 3167 TypeInfo::Number()); |
| 3165 } | 3168 stub.GenerateCall(masm_, left, Smi::FromInt(1)); |
| 3169 |
| 3166 if (!dst_.is(rax)) __ movq(dst_, rax); | 3170 if (!dst_.is(rax)) __ movq(dst_, rax); |
| 3167 } | 3171 } |
| 3168 | 3172 |
| 3169 | 3173 |
| 3170 // The value in dst was optimistically incremented or decremented. | 3174 // The value in dst was optimistically incremented or decremented. |
| 3171 // The result overflowed or was not smi tagged. Call into the runtime | 3175 // The result overflowed or was not smi tagged. Call into the runtime |
| 3172 // to convert the argument to a number. Update the original value in | 3176 // to convert the argument to a number. Update the original value in |
| 3173 // old. Call the specialized add or subtract stub. The result is | 3177 // old. Call the specialized add or subtract stub. The result is |
| 3174 // left in dst. | 3178 // left in dst. |
| 3175 class DeferredPostfixCountOperation: public DeferredCode { | 3179 class DeferredPostfixCountOperation: public DeferredCode { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3189 | 3193 |
| 3190 private: | 3194 private: |
| 3191 Register dst_; | 3195 Register dst_; |
| 3192 Register old_; | 3196 Register old_; |
| 3193 bool is_increment_; | 3197 bool is_increment_; |
| 3194 TypeInfo input_type_; | 3198 TypeInfo input_type_; |
| 3195 }; | 3199 }; |
| 3196 | 3200 |
| 3197 | 3201 |
| 3198 void DeferredPostfixCountOperation::Generate() { | 3202 void DeferredPostfixCountOperation::Generate() { |
| 3203 Register left; |
| 3199 if (input_type_.IsNumber()) { | 3204 if (input_type_.IsNumber()) { |
| 3200 __ push(dst_); // Save the input to use as the old value. | 3205 __ push(dst_); // Save the input to use as the old value. |
| 3201 __ push(dst_); | 3206 left = dst_; |
| 3202 } else { | 3207 } else { |
| 3203 __ push(dst_); | 3208 __ push(dst_); |
| 3204 __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); | 3209 __ InvokeBuiltin(Builtins::TO_NUMBER, CALL_FUNCTION); |
| 3205 __ push(rax); // Save the result of ToNumber to use as the old value. | 3210 __ push(rax); // Save the result of ToNumber to use as the old value. |
| 3206 __ push(rax); | 3211 left = rax; |
| 3207 } | 3212 } |
| 3208 | 3213 |
| 3209 // Call the runtime for the addition or subtraction. | 3214 GenericBinaryOpStub stub(is_increment_ ? Token::ADD : Token::SUB, |
| 3210 __ Push(Smi::FromInt(1)); | 3215 NO_OVERWRITE, |
| 3211 if (is_increment_) { | 3216 NO_GENERIC_BINARY_FLAGS, |
| 3212 __ CallRuntime(Runtime::kNumberAdd, 2); | 3217 TypeInfo::Number()); |
| 3213 } else { | 3218 stub.GenerateCall(masm_, left, Smi::FromInt(1)); |
| 3214 __ CallRuntime(Runtime::kNumberSub, 2); | 3219 |
| 3215 } | |
| 3216 if (!dst_.is(rax)) __ movq(dst_, rax); | 3220 if (!dst_.is(rax)) __ movq(dst_, rax); |
| 3217 __ pop(old_); | 3221 __ pop(old_); |
| 3218 } | 3222 } |
| 3219 | 3223 |
| 3220 | 3224 |
| 3221 void CodeGenerator::VisitCountOperation(CountOperation* node) { | 3225 void CodeGenerator::VisitCountOperation(CountOperation* node) { |
| 3222 Comment cmnt(masm_, "[ CountOperation"); | 3226 Comment cmnt(masm_, "[ CountOperation"); |
| 3223 | 3227 |
| 3224 bool is_postfix = node->is_postfix(); | 3228 bool is_postfix = node->is_postfix(); |
| 3225 bool is_increment = node->op() == Token::INC; | 3229 bool is_increment = node->op() == Token::INC; |
| (...skipping 6811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10037 // Call the function from C++. | 10041 // Call the function from C++. |
| 10038 return FUNCTION_CAST<ModuloFunction>(buffer); | 10042 return FUNCTION_CAST<ModuloFunction>(buffer); |
| 10039 } | 10043 } |
| 10040 | 10044 |
| 10041 #endif | 10045 #endif |
| 10042 | 10046 |
| 10043 | 10047 |
| 10044 #undef __ | 10048 #undef __ |
| 10045 | 10049 |
| 10046 } } // namespace v8::internal | 10050 } } // namespace v8::internal |
| OLD | NEW |