1
- use crate :: core:: instruction:: VPushPopParams ;
1
+ use crate :: core:: instruction:: {
2
+ AddressingMode , VPushPopParams , VStoreMultipleParams32 , VStoreMultipleParams64 ,
3
+ } ;
2
4
use crate :: Processor ;
3
5
4
6
use crate :: executor:: { ExecuteSuccess , ExecutorHelper } ;
@@ -18,6 +20,8 @@ pub trait IsaFloatingPointLoadAndStore {
18
20
fn exec_vstr ( & mut self , params : & VLoadAndStoreParams ) -> ExecuteResult ;
19
21
fn exec_vpush ( & mut self , params : & VPushPopParams ) -> ExecuteResult ;
20
22
fn exec_vpop ( & mut self , params : & VPushPopParams ) -> ExecuteResult ;
23
+ fn exec_vstm_t1 ( & mut self , params : & VStoreMultipleParams64 ) -> ExecuteResult ;
24
+ fn exec_vstm_t2 ( & mut self , params : & VStoreMultipleParams32 ) -> ExecuteResult ;
21
25
}
22
26
23
27
impl IsaFloatingPointLoadAndStore for Processor {
@@ -139,4 +143,70 @@ impl IsaFloatingPointLoadAndStore for Processor {
139
143
}
140
144
Ok ( ExecuteSuccess :: NotTaken )
141
145
}
146
+
147
+ fn exec_vstm_t1 ( & mut self , params : & VStoreMultipleParams64 ) -> ExecuteResult {
148
+ if self . condition_passed ( ) {
149
+ //self.execute_fp_check();
150
+
151
+ let mut address = if params. mode == AddressingMode :: IncrementAfter {
152
+ self . get_r ( params. rn )
153
+ } else {
154
+ self . get_r ( params. rn ) - params. imm32
155
+ } ;
156
+
157
+ if params. write_back {
158
+ let write_back_value = if params. mode == AddressingMode :: IncrementAfter {
159
+ self . get_r ( params. rn ) + params. imm32
160
+ } else {
161
+ self . get_r ( params. rn ) - params. imm32
162
+ } ;
163
+ self . set_r ( params. rn , write_back_value) ;
164
+ }
165
+
166
+ for reg in & params. list {
167
+ let ( low_word, high_word) = self . get_dr ( reg) ;
168
+ if self . big_endian ( ) {
169
+ self . write32 ( address, high_word) ?;
170
+ self . write32 ( address + 4 , low_word) ?;
171
+ } else {
172
+ self . write32 ( address, low_word) ?;
173
+ self . write32 ( address + 4 , high_word) ?;
174
+ }
175
+ address += 8 ;
176
+ }
177
+
178
+ return Ok ( ExecuteSuccess :: Taken { cycles : 1 } ) ;
179
+ }
180
+ Ok ( ExecuteSuccess :: NotTaken )
181
+ }
182
+
183
+ fn exec_vstm_t2 ( & mut self , params : & VStoreMultipleParams32 ) -> ExecuteResult {
184
+ if self . condition_passed ( ) {
185
+ //self.execute_fp_check();
186
+
187
+ let mut address = if params. mode == AddressingMode :: IncrementAfter {
188
+ self . get_r ( params. rn )
189
+ } else {
190
+ self . get_r ( params. rn ) - params. imm32
191
+ } ;
192
+
193
+ if params. write_back {
194
+ let write_back_value = if params. mode == AddressingMode :: IncrementAfter {
195
+ self . get_r ( params. rn ) + params. imm32
196
+ } else {
197
+ self . get_r ( params. rn ) - params. imm32
198
+ } ;
199
+ self . set_r ( params. rn , write_back_value) ;
200
+ }
201
+
202
+ for reg in & params. list {
203
+ let value = self . get_sr ( reg) ;
204
+ self . write32 ( address, value) ?;
205
+ address += 4 ;
206
+ }
207
+
208
+ return Ok ( ExecuteSuccess :: Taken { cycles : 1 } ) ;
209
+ }
210
+ Ok ( ExecuteSuccess :: NotTaken )
211
+ }
142
212
}
0 commit comments