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 9848 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9859 case Token::MUL: | 9859 case Token::MUL: |
| 9860 case Token::DIV: { | 9860 case Token::DIV: { |
| 9861 if (runtime_operands_type_ == BinaryOpIC::DEFAULT && | 9861 if (runtime_operands_type_ == BinaryOpIC::DEFAULT && |
| 9862 HasSmiCodeInStub()) { | 9862 HasSmiCodeInStub()) { |
| 9863 // Execution reaches this point when the first non-smi argument occurs | 9863 // Execution reaches this point when the first non-smi argument occurs |
| 9864 // (and only if smi code is generated). This is the right moment to | 9864 // (and only if smi code is generated). This is the right moment to |
| 9865 // patch to HEAP_NUMBERS state. The transition is attempted only for | 9865 // patch to HEAP_NUMBERS state. The transition is attempted only for |
| 9866 // the four basic operations. The stub stays in the DEFAULT state | 9866 // the four basic operations. The stub stays in the DEFAULT state |
| 9867 // forever for all other operations (also if smi code is skipped). | 9867 // forever for all other operations (also if smi code is skipped). |
| 9868 GenerateTypeTransition(masm); | 9868 GenerateTypeTransition(masm); |
| 9869 break; | |
| 9869 } | 9870 } |
| 9870 | 9871 |
| 9871 Label not_floats; | 9872 Label not_floats; |
| 9872 if (CpuFeatures::IsSupported(SSE2)) { | 9873 if (CpuFeatures::IsSupported(SSE2)) { |
| 9873 CpuFeatures::Scope use_sse2(SSE2); | 9874 CpuFeatures::Scope use_sse2(SSE2); |
| 9874 if (static_operands_type_.IsNumber()) { | 9875 if (static_operands_type_.IsNumber()) { |
| 9875 if (FLAG_debug_code) { | 9876 if (FLAG_debug_code) { |
| 9876 // Assert at runtime that inputs are only numbers. | 9877 // Assert at runtime that inputs are only numbers. |
| 9877 __ AbortIfNotNumber(edx); | 9878 __ AbortIfNotNumber(edx); |
| 9878 __ AbortIfNotNumber(eax); | 9879 __ AbortIfNotNumber(eax); |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 10206 __ push(edx); | 10207 __ push(edx); |
| 10207 } else { | 10208 } else { |
| 10208 __ push(edx); | 10209 __ push(edx); |
| 10209 __ push(eax); | 10210 __ push(eax); |
| 10210 } | 10211 } |
| 10211 __ push(ecx); | 10212 __ push(ecx); |
| 10212 } | 10213 } |
| 10213 | 10214 |
| 10214 | 10215 |
| 10215 void GenericBinaryOpStub::GenerateTypeTransition(MacroAssembler* masm) { | 10216 void GenericBinaryOpStub::GenerateTypeTransition(MacroAssembler* masm) { |
| 10216 Label get_result; | 10217 // Ensure the operands are on the stack. |
| 10217 | |
| 10218 // Keep a copy of operands on the stack and make sure they are also in | |
| 10219 // edx, eax. | |
| 10220 if (HasArgsInRegisters()) { | 10218 if (HasArgsInRegisters()) { |
| 10221 GenerateRegisterArgsPush(masm); | 10219 GenerateRegisterArgsPush(masm); |
| 10222 } else { | |
| 10223 GenerateLoadArguments(masm); | |
| 10224 } | 10220 } |
| 10225 | 10221 |
| 10226 // Internal frame is necessary to handle exceptions properly. | 10222 __ pop(ecx); // Save return address. |
| 10227 __ EnterInternalFrame(); | |
| 10228 | 10223 |
| 10229 // Push arguments on stack if the stub expects them there. | |
| 10230 if (!HasArgsInRegisters()) { | |
| 10231 __ push(edx); | |
| 10232 __ push(eax); | |
| 10233 } | |
| 10234 // Call the stub proper to get the result in eax. | |
| 10235 __ call(&get_result); | |
| 10236 __ LeaveInternalFrame(); | |
| 10237 | |
| 10238 __ pop(ecx); // Return address. | |
| 10239 // Left and right arguments are now on top. | 10224 // Left and right arguments are now on top. |
| 10240 // Push the operation result. The tail call to BinaryOp_Patch will | |
| 10241 // return it to the original caller. | |
| 10242 __ push(eax); | |
| 10243 // Push this stub's key. Although the operation and the type info are | 10225 // Push this stub's key. Although the operation and the type info are |
| 10244 // encoded into the key, the encoding is opaque, so push them too. | 10226 // encoded into the key, the encoding is opaque, so push them too. |
| 10245 __ push(Immediate(Smi::FromInt(MinorKey()))); | 10227 __ push(Immediate(Smi::FromInt(MinorKey()))); |
| 10246 __ push(Immediate(Smi::FromInt(op_))); | 10228 __ push(Immediate(Smi::FromInt(op_))); |
| 10247 __ push(Immediate(Smi::FromInt(runtime_operands_type_))); | 10229 __ push(Immediate(Smi::FromInt(runtime_operands_type_))); |
| 10248 | 10230 |
| 10249 __ push(ecx); // Return address. | 10231 __ push(ecx); // Push return address. |
| 10250 | 10232 |
| 10251 // Patch the caller to an appropriate specialized stub | 10233 // Patch the caller to an appropriate specialized stub and return the |
|
Kasper Lund
2010/07/06 11:56:35
I guess it doesn't really return anymore? Does it?
Erik Corry
2010/07/06 12:53:21
Well it's a tail call so it returns the answer to
| |
| 10252 // and return the operation result. | 10234 // operation result. |
| 10253 __ TailCallExternalReference( | 10235 __ TailCallExternalReference( |
| 10254 ExternalReference(IC_Utility(IC::kBinaryOp_Patch)), | 10236 ExternalReference(IC_Utility(IC::kBinaryOp_Patch)), |
| 10255 6, | 10237 5, |
| 10256 1); | 10238 1); |
| 10257 | |
| 10258 // The entry point for the result calculation is assumed to be immediately | |
| 10259 // after this sequence. | |
| 10260 __ bind(&get_result); | |
| 10261 } | 10239 } |
| 10262 | 10240 |
| 10263 | 10241 |
| 10264 Handle<Code> GetBinaryOpStub(int key, BinaryOpIC::TypeInfo type_info) { | 10242 Handle<Code> GetBinaryOpStub(int key, BinaryOpIC::TypeInfo type_info) { |
| 10265 GenericBinaryOpStub stub(key, type_info); | 10243 GenericBinaryOpStub stub(key, type_info); |
| 10266 return stub.GetCode(); | 10244 return stub.GetCode(); |
| 10267 } | 10245 } |
| 10268 | 10246 |
| 10269 | 10247 |
| 10270 void TranscendentalCacheStub::Generate(MacroAssembler* masm) { | 10248 void TranscendentalCacheStub::Generate(MacroAssembler* masm) { |
| (...skipping 3503 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 13774 masm.GetCode(&desc); | 13752 masm.GetCode(&desc); |
| 13775 // Call the function from C++. | 13753 // Call the function from C++. |
| 13776 return FUNCTION_CAST<MemCopyFunction>(buffer); | 13754 return FUNCTION_CAST<MemCopyFunction>(buffer); |
| 13777 } | 13755 } |
| 13778 | 13756 |
| 13779 #undef __ | 13757 #undef __ |
| 13780 | 13758 |
| 13781 } } // namespace v8::internal | 13759 } } // namespace v8::internal |
| 13782 | 13760 |
| 13783 #endif // V8_TARGET_ARCH_IA32 | 13761 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |