| 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 463 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 | 474 |
| 475 // For 1 or -1 we need to or in the 0 exponent (biased to 1023). | 475 // For 1 or -1 we need to or in the 0 exponent (biased to 1023). |
| 476 const uint32_t exponent_word_for_1 = | 476 const uint32_t exponent_word_for_1 = |
| 477 HeapNumber::kExponentBias << HeapNumber::kExponentShift; | 477 HeapNumber::kExponentBias << HeapNumber::kExponentShift; |
| 478 __ orr(exponent, exponent, Operand(exponent_word_for_1), LeaveCC, eq); | 478 __ orr(exponent, exponent, Operand(exponent_word_for_1), LeaveCC, eq); |
| 479 // 1, 0 and -1 all have 0 for the second word. | 479 // 1, 0 and -1 all have 0 for the second word. |
| 480 __ mov(mantissa, Operand::Zero()); | 480 __ mov(mantissa, Operand::Zero()); |
| 481 __ Ret(); | 481 __ Ret(); |
| 482 | 482 |
| 483 __ bind(¬_special); | 483 __ bind(¬_special); |
| 484 // Count leading zeros. Uses mantissa for a scratch register on pre-ARM5. | 484 __ clz(zeros_, source_); |
| 485 // Gets the wrong answer for 0, but we already checked for that case above. | |
| 486 __ CountLeadingZeros(zeros_, source_, mantissa); | |
| 487 // Compute exponent and or it into the exponent register. | 485 // Compute exponent and or it into the exponent register. |
| 488 // We use mantissa as a scratch register here. Use a fudge factor to | 486 // We use mantissa as a scratch register here. Use a fudge factor to |
| 489 // divide the constant 31 + HeapNumber::kExponentBias, 0x41d, into two parts | 487 // divide the constant 31 + HeapNumber::kExponentBias, 0x41d, into two parts |
| 490 // that fit in the ARM's constant field. | 488 // that fit in the ARM's constant field. |
| 491 int fudge = 0x400; | 489 int fudge = 0x400; |
| 492 __ rsb(mantissa, zeros_, Operand(31 + HeapNumber::kExponentBias - fudge)); | 490 __ rsb(mantissa, zeros_, Operand(31 + HeapNumber::kExponentBias - fudge)); |
| 493 __ add(mantissa, mantissa, Operand(fudge)); | 491 __ add(mantissa, mantissa, Operand(fudge)); |
| 494 __ orr(exponent, | 492 __ orr(exponent, |
| 495 exponent, | 493 exponent, |
| 496 Operand(mantissa, LSL, HeapNumber::kExponentShift)); | 494 Operand(mantissa, LSL, HeapNumber::kExponentShift)); |
| (...skipping 1527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2024 __ b(mi, &div_with_sdiv); | 2022 __ b(mi, &div_with_sdiv); |
| 2025 } else { | 2023 } else { |
| 2026 __ b(ne, ¬_smi_result); | 2024 __ b(ne, ¬_smi_result); |
| 2027 // Check for positive and no remainder. | 2025 // Check for positive and no remainder. |
| 2028 __ orr(scratch2, scratch1, Operand(0x80000000u)); | 2026 __ orr(scratch2, scratch1, Operand(0x80000000u)); |
| 2029 __ tst(left, scratch2); | 2027 __ tst(left, scratch2); |
| 2030 __ b(ne, ¬_smi_result); | 2028 __ b(ne, ¬_smi_result); |
| 2031 } | 2029 } |
| 2032 | 2030 |
| 2033 // Perform division by shifting. | 2031 // Perform division by shifting. |
| 2034 __ CountLeadingZeros(scratch1, scratch1, scratch2); | 2032 __ clz(scratch1, scratch1); |
| 2035 __ rsb(scratch1, scratch1, Operand(31)); | 2033 __ rsb(scratch1, scratch1, Operand(31)); |
| 2036 __ mov(right, Operand(left, LSR, scratch1)); | 2034 __ mov(right, Operand(left, LSR, scratch1)); |
| 2037 __ Ret(); | 2035 __ Ret(); |
| 2038 | 2036 |
| 2039 if (CpuFeatures::IsSupported(SUDIV)) { | 2037 if (CpuFeatures::IsSupported(SUDIV)) { |
| 2040 Label result_not_zero; | 2038 Label result_not_zero; |
| 2041 | 2039 |
| 2042 __ bind(&div_with_sdiv); | 2040 __ bind(&div_with_sdiv); |
| 2043 // Do division. | 2041 // Do division. |
| 2044 __ sdiv(scratch1, left, right); | 2042 __ sdiv(scratch1, left, right); |
| (...skipping 5483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7528 | 7526 |
| 7529 __ Pop(lr, r5, r1); | 7527 __ Pop(lr, r5, r1); |
| 7530 __ Ret(); | 7528 __ Ret(); |
| 7531 } | 7529 } |
| 7532 | 7530 |
| 7533 #undef __ | 7531 #undef __ |
| 7534 | 7532 |
| 7535 } } // namespace v8::internal | 7533 } } // namespace v8::internal |
| 7536 | 7534 |
| 7537 #endif // V8_TARGET_ARCH_ARM | 7535 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |