| Index: src/arm/assembler-arm.cc
|
| diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc
|
| index 49b1975f6b73325262d1535e7cc21efb34e54ee8..48000b4c8f1c2559c067a0003b4bd5400ffc2767 100644
|
| --- a/src/arm/assembler-arm.cc
|
| +++ b/src/arm/assembler-arm.cc
|
| @@ -32,7 +32,7 @@
|
|
|
| // The original source code covered by the above license above has been
|
| // modified significantly by Google Inc.
|
| -// Copyright 2010 the V8 project authors. All rights reserved.
|
| +// Copyright 2011 the V8 project authors. All rights reserved.
|
|
|
| #include "v8.h"
|
|
|
| @@ -2035,6 +2035,88 @@ void Assembler::vstr(const SwVfpRegister src,
|
| }
|
|
|
|
|
| +void Assembler::vldm(BlockAddrMode am,
|
| + Register base,
|
| + DwVfpRegister first,
|
| + DwVfpRegister last,
|
| + Condition cond) {
|
| + // Instruction details available in ARM DDI 0406A, A8-626.
|
| + // cond(31-28) | 110(27-25)| PUDW1(24-20) | Rbase(19-16) |
|
| + // first(15-12) | 1010(11-8) | (count * 2)
|
| + ASSERT(CpuFeatures::IsEnabled(VFP3));
|
| + ASSERT_LE(first.code(), last.code());
|
| + ASSERT(am == ia || am == ia_w || am == db_w);
|
| + ASSERT(!base.is(pc));
|
| +
|
| + int sd, d;
|
| + first.split_code(&sd, &d);
|
| + int count = last.code() - first.code() + 1;
|
| + emit(cond | B27 | B26 | am | d*B22 | B20 | base.code()*B16 | sd*B12 |
|
| + 0xB*B8 | count*2);
|
| +}
|
| +
|
| +
|
| +void Assembler::vstm(BlockAddrMode am,
|
| + Register base,
|
| + DwVfpRegister first,
|
| + DwVfpRegister last,
|
| + Condition cond) {
|
| + // Instruction details available in ARM DDI 0406A, A8-784.
|
| + // cond(31-28) | 110(27-25)| PUDW0(24-20) | Rbase(19-16) |
|
| + // first(15-12) | 1011(11-8) | (count * 2)
|
| + ASSERT(CpuFeatures::IsEnabled(VFP3));
|
| + ASSERT_LE(first.code(), last.code());
|
| + ASSERT(am == ia || am == ia_w || am == db_w);
|
| + ASSERT(!base.is(pc));
|
| +
|
| + int sd, d;
|
| + first.split_code(&sd, &d);
|
| + int count = last.code() - first.code() + 1;
|
| + emit(cond | B27 | B26 | am | d*B22 | base.code()*B16 | sd*B12 |
|
| + 0xB*B8 | count*2);
|
| +}
|
| +
|
| +void Assembler::vldm(BlockAddrMode am,
|
| + Register base,
|
| + SwVfpRegister first,
|
| + SwVfpRegister last,
|
| + Condition cond) {
|
| + // Instruction details available in ARM DDI 0406A, A8-626.
|
| + // cond(31-28) | 110(27-25)| PUDW1(24-20) | Rbase(19-16) |
|
| + // first(15-12) | 1010(11-8) | (count/2)
|
| + ASSERT(CpuFeatures::IsEnabled(VFP3));
|
| + ASSERT_LE(first.code(), last.code());
|
| + ASSERT(am == ia || am == ia_w || am == db_w);
|
| + ASSERT(!base.is(pc));
|
| +
|
| + int sd, d;
|
| + first.split_code(&sd, &d);
|
| + int count = last.code() - first.code() + 1;
|
| + emit(cond | B27 | B26 | am | d*B22 | B20 | base.code()*B16 | sd*B12 |
|
| + 0xA*B8 | count);
|
| +}
|
| +
|
| +
|
| +void Assembler::vstm(BlockAddrMode am,
|
| + Register base,
|
| + SwVfpRegister first,
|
| + SwVfpRegister last,
|
| + Condition cond) {
|
| + // Instruction details available in ARM DDI 0406A, A8-784.
|
| + // cond(31-28) | 110(27-25)| PUDW0(24-20) | Rbase(19-16) |
|
| + // first(15-12) | 1011(11-8) | (count/2)
|
| + ASSERT(CpuFeatures::IsEnabled(VFP3));
|
| + ASSERT_LE(first.code(), last.code());
|
| + ASSERT(am == ia || am == ia_w || am == db_w);
|
| + ASSERT(!base.is(pc));
|
| +
|
| + int sd, d;
|
| + first.split_code(&sd, &d);
|
| + int count = last.code() - first.code() + 1;
|
| + emit(cond | B27 | B26 | am | d*B22 | base.code()*B16 | sd*B12 |
|
| + 0xA*B8 | count);
|
| +}
|
| +
|
| static void DoubleAsTwoUInt32(double d, uint32_t* lo, uint32_t* hi) {
|
| uint64_t i;
|
| memcpy(&i, &d, 8);
|
|
|