Chromium Code Reviews| Index: src/arm/assembler-arm.cc |
| diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc |
| index 49b1975f6b73325262d1535e7cc21efb34e54ee8..801f791452548ad35a1ee2afbe9d5081d9b96ec9 100644 |
| --- a/src/arm/assembler-arm.cc |
| +++ b/src/arm/assembler-arm.cc |
| @@ -2035,6 +2035,84 @@ 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(26-20) | Rbase(19-16) | |
|
Rodolph Perfetta
2011/04/05 18:16:39
PUDW1 is bit 24-20.
Søren Thygesen Gjesse
2011/04/06 08:00:09
Done.
|
| + // first(15-12) | 1010(11-8) | (count/2) |
|
Rodolph Perfetta
2011/04/05 18:16:39
It should be count*2.
Søren Thygesen Gjesse
2011/04/06 08:00:09
Done.
|
| + ASSERT(CpuFeatures::IsEnabled(VFP3)); |
| + ASSERT_LE(first.code(), last.code()); |
| + ASSERT(am == ia || am == ia_w || am == db_w); |
|
Rodolph Perfetta
2011/04/05 18:16:39
if the base is r15 and writeback is on, the instru
Søren Thygesen Gjesse
2011/04/06 08:00:09
Done.
|
| + |
| + 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) { |
|
Rodolph Perfetta
2011/04/05 18:16:39
same as above.
Søren Thygesen Gjesse
2011/04/06 08:00:09
Done.
|
| + // Instruction details available in ARM DDI 0406A, A8-784. |
| + // cond(31-28) | 110(27-25)| PUDW0(26-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); |
| + |
| + 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) { |
|
Rodolph Perfetta
2011/04/05 18:16:39
same as above.
Søren Thygesen Gjesse
2011/04/06 08:00:09
Done.
|
| + // Instruction details available in ARM DDI 0406A, A8-626. |
| + // cond(31-28) | 110(27-25)| PUDW1(26-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); |
| + |
| + 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) { |
|
Rodolph Perfetta
2011/04/05 18:16:39
same as above.
Søren Thygesen Gjesse
2011/04/06 08:00:09
Done.
|
| + // Instruction details available in ARM DDI 0406A, A8-784. |
| + // cond(31-28) | 110(27-25)| PUDW0(26-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); |
| + |
| + 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); |