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); |