OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 2259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2270 if (allow_heapnumber_results == BinaryOpStub::ALLOW_HEAPNUMBER_RESULTS) { | 2270 if (allow_heapnumber_results == BinaryOpStub::ALLOW_HEAPNUMBER_RESULTS) { |
2271 BinaryOpStub_GenerateFPOperation( | 2271 BinaryOpStub_GenerateFPOperation( |
2272 masm, BinaryOpIC::UNINITIALIZED, BinaryOpIC::UNINITIALIZED, true, | 2272 masm, BinaryOpIC::UNINITIALIZED, BinaryOpIC::UNINITIALIZED, true, |
2273 use_runtime, gc_required, ¬_smis, op, mode); | 2273 use_runtime, gc_required, ¬_smis, op, mode); |
2274 } | 2274 } |
2275 __ bind(¬_smis); | 2275 __ bind(¬_smis); |
2276 } | 2276 } |
2277 | 2277 |
2278 | 2278 |
2279 void BinaryOpStub::GenerateSmiStub(MacroAssembler* masm) { | 2279 void BinaryOpStub::GenerateSmiStub(MacroAssembler* masm) { |
2280 Label not_smis, call_runtime; | 2280 Label right_arg_changed, call_runtime; |
| 2281 |
| 2282 if (op_ == Token::MOD && has_fixed_right_arg_) { |
| 2283 // It is guaranteed that the value will fit into a Smi, because if it |
| 2284 // didn't, we wouldn't be here, see BinaryOp_Patch. |
| 2285 __ Branch(&right_arg_changed, |
| 2286 ne, |
| 2287 a0, |
| 2288 Operand(Smi::FromInt(fixed_right_arg_value()))); |
| 2289 } |
2281 | 2290 |
2282 if (result_type_ == BinaryOpIC::UNINITIALIZED || | 2291 if (result_type_ == BinaryOpIC::UNINITIALIZED || |
2283 result_type_ == BinaryOpIC::SMI) { | 2292 result_type_ == BinaryOpIC::SMI) { |
2284 // Only allow smi results. | 2293 // Only allow smi results. |
2285 BinaryOpStub_GenerateSmiCode( | 2294 BinaryOpStub_GenerateSmiCode( |
2286 masm, &call_runtime, NULL, op_, NO_HEAPNUMBER_RESULTS, mode_); | 2295 masm, &call_runtime, NULL, op_, NO_HEAPNUMBER_RESULTS, mode_); |
2287 } else { | 2296 } else { |
2288 // Allow heap number result and don't make a transition if a heap number | 2297 // Allow heap number result and don't make a transition if a heap number |
2289 // cannot be allocated. | 2298 // cannot be allocated. |
2290 BinaryOpStub_GenerateSmiCode( | 2299 BinaryOpStub_GenerateSmiCode( |
2291 masm, &call_runtime, &call_runtime, op_, ALLOW_HEAPNUMBER_RESULTS, | 2300 masm, &call_runtime, &call_runtime, op_, ALLOW_HEAPNUMBER_RESULTS, |
2292 mode_); | 2301 mode_); |
2293 } | 2302 } |
2294 | 2303 |
2295 // Code falls through if the result is not returned as either a smi or heap | 2304 // Code falls through if the result is not returned as either a smi or heap |
2296 // number. | 2305 // number. |
| 2306 __ bind(&right_arg_changed); |
2297 GenerateTypeTransition(masm); | 2307 GenerateTypeTransition(masm); |
2298 | 2308 |
2299 __ bind(&call_runtime); | 2309 __ bind(&call_runtime); |
2300 { | 2310 { |
2301 FrameScope scope(masm, StackFrame::INTERNAL); | 2311 FrameScope scope(masm, StackFrame::INTERNAL); |
2302 GenerateRegisterArgsPush(masm); | 2312 GenerateRegisterArgsPush(masm); |
2303 GenerateCallRuntime(masm); | 2313 GenerateCallRuntime(masm); |
2304 } | 2314 } |
2305 __ Ret(); | 2315 __ Ret(); |
2306 } | 2316 } |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2487 &call_runtime, | 2497 &call_runtime, |
2488 mode_); | 2498 mode_); |
2489 __ mov(v0, heap_number_result); | 2499 __ mov(v0, heap_number_result); |
2490 __ sdc1(f10, FieldMemOperand(v0, HeapNumber::kValueOffset)); | 2500 __ sdc1(f10, FieldMemOperand(v0, HeapNumber::kValueOffset)); |
2491 __ Ret(); | 2501 __ Ret(); |
2492 | 2502 |
2493 // A DIV operation expecting an integer result falls through | 2503 // A DIV operation expecting an integer result falls through |
2494 // to type transition. | 2504 // to type transition. |
2495 | 2505 |
2496 } else { | 2506 } else { |
| 2507 if (has_fixed_right_arg_) { |
| 2508 __ Move(f16, fixed_right_arg_value()); |
| 2509 __ BranchF(&transition, NULL, ne, f14, f16); |
| 2510 } |
| 2511 |
2497 // We preserved a0 and a1 to be able to call runtime. | 2512 // We preserved a0 and a1 to be able to call runtime. |
2498 // Save the left value on the stack. | 2513 // Save the left value on the stack. |
2499 __ Push(t1, t0); | 2514 __ Push(t1, t0); |
2500 | 2515 |
2501 Label pop_and_call_runtime; | 2516 Label pop_and_call_runtime; |
2502 | 2517 |
2503 // Allocate a heap number to store the result. | 2518 // Allocate a heap number to store the result. |
2504 heap_number_result = s0; | 2519 heap_number_result = s0; |
2505 BinaryOpStub_GenerateHeapResultAllocation(masm, | 2520 BinaryOpStub_GenerateHeapResultAllocation(masm, |
2506 heap_number_result, | 2521 heap_number_result, |
(...skipping 5234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7741 __ Jump(generic_construct_stub, RelocInfo::CODE_TARGET); | 7756 __ Jump(generic_construct_stub, RelocInfo::CODE_TARGET); |
7742 } | 7757 } |
7743 } | 7758 } |
7744 | 7759 |
7745 | 7760 |
7746 #undef __ | 7761 #undef __ |
7747 | 7762 |
7748 } } // namespace v8::internal | 7763 } } // namespace v8::internal |
7749 | 7764 |
7750 #endif // V8_TARGET_ARCH_MIPS | 7765 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |