OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 2648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2659 __ b(ne, &return_heap_number); | 2659 __ b(ne, &return_heap_number); |
2660 __ bind(¬_zero); | 2660 __ bind(¬_zero); |
2661 | 2661 |
2662 // Tag the result and return. | 2662 // Tag the result and return. |
2663 __ SmiTag(r0, scratch1); | 2663 __ SmiTag(r0, scratch1); |
2664 __ Ret(); | 2664 __ Ret(); |
2665 } else { | 2665 } else { |
2666 // DIV just falls through to allocating a heap number. | 2666 // DIV just falls through to allocating a heap number. |
2667 } | 2667 } |
2668 | 2668 |
| 2669 __ bind(&return_heap_number); |
| 2670 // Return a heap number, or fall through to type transition or runtime |
| 2671 // call if we can't. |
2669 if (result_type_ >= (op_ == Token::DIV) ? BinaryOpIC::HEAP_NUMBER | 2672 if (result_type_ >= (op_ == Token::DIV) ? BinaryOpIC::HEAP_NUMBER |
2670 : BinaryOpIC::INT32) { | 2673 : BinaryOpIC::INT32) { |
2671 __ bind(&return_heap_number); | |
2672 // We are using vfp registers so r5 is available. | 2674 // We are using vfp registers so r5 is available. |
2673 heap_number_result = r5; | 2675 heap_number_result = r5; |
2674 GenerateHeapResultAllocation(masm, | 2676 GenerateHeapResultAllocation(masm, |
2675 heap_number_result, | 2677 heap_number_result, |
2676 heap_number_map, | 2678 heap_number_map, |
2677 scratch1, | 2679 scratch1, |
2678 scratch2, | 2680 scratch2, |
2679 &call_runtime); | 2681 &call_runtime); |
2680 __ sub(r0, heap_number_result, Operand(kHeapObjectTag)); | 2682 __ sub(r0, heap_number_result, Operand(kHeapObjectTag)); |
2681 __ vstr(d5, r0, HeapNumber::kValueOffset); | 2683 __ vstr(d5, r0, HeapNumber::kValueOffset); |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2835 __ TailCallStub(&stub); | 2837 __ TailCallStub(&stub); |
2836 } | 2838 } |
2837 | 2839 |
2838 break; | 2840 break; |
2839 } | 2841 } |
2840 | 2842 |
2841 default: | 2843 default: |
2842 UNREACHABLE(); | 2844 UNREACHABLE(); |
2843 } | 2845 } |
2844 | 2846 |
2845 if (transition.is_linked()) { | 2847 // We never expect DIV to yield an integer result, so we always generate |
| 2848 // type transition code for DIV operations expecting an integer result: the |
| 2849 // code will fall through to this type transition. |
| 2850 if (transition.is_linked() || |
| 2851 ((op_ == Token::DIV) && (result_type_ <= BinaryOpIC::INT32))) { |
2846 __ bind(&transition); | 2852 __ bind(&transition); |
2847 GenerateTypeTransition(masm); | 2853 GenerateTypeTransition(masm); |
2848 } | 2854 } |
2849 | 2855 |
2850 __ bind(&call_runtime); | 2856 __ bind(&call_runtime); |
2851 GenerateCallRuntime(masm); | 2857 GenerateCallRuntime(masm); |
2852 } | 2858 } |
2853 | 2859 |
2854 | 2860 |
2855 void BinaryOpStub::GenerateOddballStub(MacroAssembler* masm) { | 2861 void BinaryOpStub::GenerateOddballStub(MacroAssembler* masm) { |
(...skipping 3554 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6410 __ mov(result, Operand(0)); | 6416 __ mov(result, Operand(0)); |
6411 __ Ret(); | 6417 __ Ret(); |
6412 } | 6418 } |
6413 | 6419 |
6414 | 6420 |
6415 #undef __ | 6421 #undef __ |
6416 | 6422 |
6417 } } // namespace v8::internal | 6423 } } // namespace v8::internal |
6418 | 6424 |
6419 #endif // V8_TARGET_ARCH_ARM | 6425 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |