| OLD | NEW |
| 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. | 1 // Copyright (c) 1994-2006 Sun Microsystems Inc. |
| 2 // All Rights Reserved. | 2 // All Rights Reserved. |
| 3 // | 3 // |
| 4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
| 5 // modification, are permitted provided that the following conditions | 5 // modification, are permitted provided that the following conditions |
| 6 // are met: | 6 // are met: |
| 7 // | 7 // |
| 8 // - Redistributions of source code must retain the above copyright notice, | 8 // - Redistributions of source code must retain the above copyright notice, |
| 9 // this list of conditions and the following disclaimer. | 9 // this list of conditions and the following disclaimer. |
| 10 // | 10 // |
| (...skipping 2527 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2538 vldr(dst, MemOperand(pp, ip)); | 2538 vldr(dst, MemOperand(pp, ip)); |
| 2539 } else { | 2539 } else { |
| 2540 DCHECK(section == ConstantPoolArray::SMALL_SECTION); | 2540 DCHECK(section == ConstantPoolArray::SMALL_SECTION); |
| 2541 vldr(dst, MemOperand(FLAG_enable_ool_constant_pool ? pp : pc, 0)); | 2541 vldr(dst, MemOperand(FLAG_enable_ool_constant_pool ? pp : pc, 0)); |
| 2542 } | 2542 } |
| 2543 } else { | 2543 } else { |
| 2544 // Synthesise the double from ARM immediates. | 2544 // Synthesise the double from ARM immediates. |
| 2545 uint32_t lo, hi; | 2545 uint32_t lo, hi; |
| 2546 DoubleAsTwoUInt32(imm, &lo, &hi); | 2546 DoubleAsTwoUInt32(imm, &lo, &hi); |
| 2547 | 2547 |
| 2548 if (scratch.is(no_reg)) { | 2548 if (lo == hi) { |
| 2549 if (dst.code() < 16) { | 2549 // Move the low and high parts of the double to a D register in one |
| 2550 const LowDwVfpRegister loc = LowDwVfpRegister::from_code(dst.code()); | 2550 // instruction. |
| 2551 // Move the low part of the double into the lower of the corresponsing S | 2551 mov(ip, Operand(lo)); |
| 2552 // registers of D register dst. | 2552 vmov(dst, ip, ip); |
| 2553 mov(ip, Operand(lo)); | 2553 } else if (scratch.is(no_reg)) { |
| 2554 vmov(loc.low(), ip); | 2554 mov(ip, Operand(lo)); |
| 2555 | 2555 vmov(dst, VmovIndexLo, ip); |
| 2556 // Move the high part of the double into the higher of the | 2556 if ((lo & 0xffff) == (hi & 0xffff)) { |
| 2557 // corresponsing S registers of D register dst. | 2557 movt(ip, hi >> 16); |
| 2558 } else { |
| 2558 mov(ip, Operand(hi)); | 2559 mov(ip, Operand(hi)); |
| 2559 vmov(loc.high(), ip); | |
| 2560 } else { | |
| 2561 // D16-D31 does not have S registers, so move the low and high parts | |
| 2562 // directly to the D register using vmov.32. | |
| 2563 // Note: This may be slower, so we only do this when we have to. | |
| 2564 mov(ip, Operand(lo)); | |
| 2565 vmov(dst, VmovIndexLo, ip); | |
| 2566 mov(ip, Operand(hi)); | |
| 2567 vmov(dst, VmovIndexHi, ip); | |
| 2568 } | 2560 } |
| 2561 vmov(dst, VmovIndexHi, ip); |
| 2569 } else { | 2562 } else { |
| 2570 // Move the low and high parts of the double to a D register in one | 2563 // Move the low and high parts of the double to a D register in one |
| 2571 // instruction. | 2564 // instruction. |
| 2572 mov(ip, Operand(lo)); | 2565 mov(ip, Operand(lo)); |
| 2573 mov(scratch, Operand(hi)); | 2566 mov(scratch, Operand(hi)); |
| 2574 vmov(dst, ip, scratch); | 2567 vmov(dst, ip, scratch); |
| 2575 } | 2568 } |
| 2576 } | 2569 } |
| 2577 } | 2570 } |
| 2578 | 2571 |
| (...skipping 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3924 assm->instr_at_put( | 3917 assm->instr_at_put( |
| 3925 rinfo.pc(), Assembler::SetLdrRegisterImmediateOffset(instr, offset)); | 3918 rinfo.pc(), Assembler::SetLdrRegisterImmediateOffset(instr, offset)); |
| 3926 } | 3919 } |
| 3927 } | 3920 } |
| 3928 } | 3921 } |
| 3929 | 3922 |
| 3930 | 3923 |
| 3931 } } // namespace v8::internal | 3924 } } // namespace v8::internal |
| 3932 | 3925 |
| 3933 #endif // V8_TARGET_ARCH_ARM | 3926 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |