OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 7535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7546 } | 7546 } |
7547 } | 7547 } |
7548 | 7548 |
7549 | 7549 |
7550 // Input: edx, eax are the left and right objects of a bit op. | 7550 // Input: edx, eax are the left and right objects of a bit op. |
7551 // Output: eax, ecx are left and right integers for a bit op. | 7551 // Output: eax, ecx are left and right integers for a bit op. |
7552 void FloatingPointHelper::LoadAsIntegers(MacroAssembler* masm, | 7552 void FloatingPointHelper::LoadAsIntegers(MacroAssembler* masm, |
7553 bool use_sse3, | 7553 bool use_sse3, |
7554 Label* conversion_failure) { | 7554 Label* conversion_failure) { |
7555 // Check float operands. | 7555 // Check float operands. |
7556 Label arg1_is_object, arg2_is_object, load_arg2; | 7556 Label arg1_is_object, check_undefined_arg1; |
7557 Label done; | 7557 Label arg2_is_object, check_undefined_arg2; |
| 7558 Label load_arg2, done; |
7558 | 7559 |
7559 __ test(edx, Immediate(kSmiTagMask)); | 7560 __ test(edx, Immediate(kSmiTagMask)); |
7560 __ j(not_zero, &arg1_is_object); | 7561 __ j(not_zero, &arg1_is_object); |
7561 __ SmiUntag(edx); | 7562 __ SmiUntag(edx); |
7562 __ jmp(&load_arg2); | 7563 __ jmp(&load_arg2); |
7563 | 7564 |
| 7565 // If the argument is undefined it converts to zero (ECMA-262, section 9.5). |
| 7566 __ bind(&check_undefined_arg1); |
| 7567 __ cmp(edx, Factory::undefined_value()); |
| 7568 __ j(not_equal, conversion_failure); |
| 7569 __ mov(edx, Immediate(0)); |
| 7570 __ jmp(&load_arg2); |
| 7571 |
7564 __ bind(&arg1_is_object); | 7572 __ bind(&arg1_is_object); |
7565 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); | 7573 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset)); |
7566 __ cmp(ebx, Factory::heap_number_map()); | 7574 __ cmp(ebx, Factory::heap_number_map()); |
7567 __ j(not_equal, conversion_failure); | 7575 __ j(not_equal, &check_undefined_arg1); |
7568 // Get the untagged integer version of the edx heap number in ecx. | 7576 // Get the untagged integer version of the edx heap number in ecx. |
7569 IntegerConvert(masm, edx, use_sse3, conversion_failure); | 7577 IntegerConvert(masm, edx, use_sse3, conversion_failure); |
7570 __ mov(edx, ecx); | 7578 __ mov(edx, ecx); |
7571 | 7579 |
7572 // Here edx has the untagged integer, eax has a Smi or a heap number. | 7580 // Here edx has the untagged integer, eax has a Smi or a heap number. |
7573 __ bind(&load_arg2); | 7581 __ bind(&load_arg2); |
7574 // Test if arg2 is a Smi. | 7582 // Test if arg2 is a Smi. |
7575 __ test(eax, Immediate(kSmiTagMask)); | 7583 __ test(eax, Immediate(kSmiTagMask)); |
7576 __ j(not_zero, &arg2_is_object); | 7584 __ j(not_zero, &arg2_is_object); |
7577 __ SmiUntag(eax); | 7585 __ SmiUntag(eax); |
7578 __ mov(ecx, eax); | 7586 __ mov(ecx, eax); |
7579 __ jmp(&done); | 7587 __ jmp(&done); |
7580 | 7588 |
| 7589 // If the argument is undefined it converts to zero (ECMA-262, section 9.5). |
| 7590 __ bind(&check_undefined_arg2); |
| 7591 __ cmp(eax, Factory::undefined_value()); |
| 7592 __ j(not_equal, conversion_failure); |
| 7593 __ mov(ecx, Immediate(0)); |
| 7594 __ jmp(&done); |
| 7595 |
7581 __ bind(&arg2_is_object); | 7596 __ bind(&arg2_is_object); |
7582 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); | 7597 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); |
7583 __ cmp(ebx, Factory::heap_number_map()); | 7598 __ cmp(ebx, Factory::heap_number_map()); |
7584 __ j(not_equal, conversion_failure); | 7599 __ j(not_equal, &check_undefined_arg2); |
7585 // Get the untagged integer version of the eax heap number in ecx. | 7600 // Get the untagged integer version of the eax heap number in ecx. |
7586 IntegerConvert(masm, eax, use_sse3, conversion_failure); | 7601 IntegerConvert(masm, eax, use_sse3, conversion_failure); |
7587 __ bind(&done); | 7602 __ bind(&done); |
7588 __ mov(eax, edx); | 7603 __ mov(eax, edx); |
7589 } | 7604 } |
7590 | 7605 |
7591 | 7606 |
7592 void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, | 7607 void FloatingPointHelper::LoadFloatOperand(MacroAssembler* masm, |
7593 Register number) { | 7608 Register number) { |
7594 Label load_smi, done; | 7609 Label load_smi, done; |
(...skipping 1331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8926 __ add(Operand(dest), Immediate(2)); | 8941 __ add(Operand(dest), Immediate(2)); |
8927 } | 8942 } |
8928 __ sub(Operand(count), Immediate(1)); | 8943 __ sub(Operand(count), Immediate(1)); |
8929 __ j(not_zero, &loop); | 8944 __ j(not_zero, &loop); |
8930 } | 8945 } |
8931 | 8946 |
8932 | 8947 |
8933 #undef __ | 8948 #undef __ |
8934 | 8949 |
8935 } } // namespace v8::internal | 8950 } } // namespace v8::internal |
OLD | NEW |