Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: runtime/vm/simulator_arm.cc

Issue 12390039: Adds vstm, vldm to ARM simulator, assembler, disassembler (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include <math.h> // for isnan. 5 #include <math.h> // for isnan.
6 #include <setjmp.h> 6 #include <setjmp.h>
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include "vm/globals.h" 9 #include "vm/globals.h"
10 #if defined(TARGET_ARCH_ARM) 10 #if defined(TARGET_ARCH_ARM)
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 if (reg == PC) { 188 if (reg == PC) {
189 *value = sim_->get_pc(); 189 *value = sim_->get_pc();
190 } else { 190 } else {
191 *value = sim_->get_register(reg); 191 *value = sim_->get_register(reg);
192 } 192 }
193 return true; 193 return true;
194 } 194 }
195 if ((desc[0] == '*')) { 195 if ((desc[0] == '*')) {
196 uint32_t addr; 196 uint32_t addr;
197 if (GetValue(desc + 1, &addr)) { 197 if (GetValue(desc + 1, &addr)) {
198 if (Simulator::IsIllegalAddress(addr)) {
199 return false;
200 }
198 *value = *(reinterpret_cast<uint32_t*>(addr)); 201 *value = *(reinterpret_cast<uint32_t*>(addr));
199 return true; 202 return true;
200 } 203 }
201 } 204 }
202 bool retval = SScanF(desc, "0x%x", value) == 1; 205 bool retval = SScanF(desc, "0x%x", value) == 1;
203 if (!retval) { 206 if (!retval) {
204 retval = SScanF(desc, "%x", value) == 1; 207 retval = SScanF(desc, "%x", value) == 1;
205 } 208 }
206 return retval; 209 return retval;
207 } 210 }
208 211
209 212
210 bool SimulatorDebugger::GetFValue(char* desc, float* value) { 213 bool SimulatorDebugger::GetFValue(char* desc, float* value) {
211 SRegister sreg = LookupSRegisterByName(desc); 214 SRegister sreg = LookupSRegisterByName(desc);
212 if (sreg != kNoSRegister) { 215 if (sreg != kNoSRegister) {
213 *value = sim_->get_sregister(sreg); 216 *value = sim_->get_sregister(sreg);
214 return true; 217 return true;
215 } 218 }
216 if ((desc[0] == '*')) { 219 if ((desc[0] == '*')) {
217 uint32_t addr; 220 uint32_t addr;
218 if (GetValue(desc + 1, &addr)) { 221 if (GetValue(desc + 1, &addr)) {
222 if (Simulator::IsIllegalAddress(addr)) {
223 return false;
224 }
219 *value = *(reinterpret_cast<float*>(addr)); 225 *value = *(reinterpret_cast<float*>(addr));
220 return true; 226 return true;
221 } 227 }
222 } 228 }
223 return false; 229 return false;
224 } 230 }
225 231
226 232
227 bool SimulatorDebugger::GetDValue(char* desc, double* value) { 233 bool SimulatorDebugger::GetDValue(char* desc, double* value) {
228 DRegister dreg = LookupDRegisterByName(desc); 234 DRegister dreg = LookupDRegisterByName(desc);
229 if (dreg != kNoDRegister) { 235 if (dreg != kNoDRegister) {
230 *value = sim_->get_dregister(dreg); 236 *value = sim_->get_dregister(dreg);
231 return true; 237 return true;
232 } 238 }
233 if ((desc[0] == '*')) { 239 if ((desc[0] == '*')) {
234 uint32_t addr; 240 uint32_t addr;
235 if (GetValue(desc + 1, &addr)) { 241 if (GetValue(desc + 1, &addr)) {
242 if (Simulator::IsIllegalAddress(addr)) {
243 return false;
244 }
236 *value = *(reinterpret_cast<double*>(addr)); 245 *value = *(reinterpret_cast<double*>(addr));
237 return true; 246 return true;
238 } 247 }
239 } 248 }
240 return false; 249 return false;
241 } 250 }
242 251
243 252
244 bool SimulatorDebugger::SetBreakpoint(Instr* breakpc) { 253 bool SimulatorDebugger::SetBreakpoint(Instr* breakpc) {
245 // Check if a breakpoint can be set. If not return without any side-effects. 254 // Check if a breakpoint can be set. If not return without any side-effects.
(...skipping 1898 matching lines...) Expand 10 before | Expand all | Expand 10 after
2144 set_dregister(dd, bit_cast<double, int64_t>(dd_val)); 2153 set_dregister(dd, bit_cast<double, int64_t>(dd_val));
2145 } else { // vstrd 2154 } else { // vstrd
2146 // Format(instr, "vstrd'cond 'dd, ['rn, #+'off10]"); 2155 // Format(instr, "vstrd'cond 'dd, ['rn, #+'off10]");
2147 // Format(instr, "vstrd'cond 'dd, ['rn, #-'off10]"); 2156 // Format(instr, "vstrd'cond 'dd, ['rn, #-'off10]");
2148 int64_t dd_val = bit_cast<int64_t, double>(get_dregister(dd)); 2157 int64_t dd_val = bit_cast<int64_t, double>(get_dregister(dd));
2149 WriteW(addr, Utils::Low32Bits(dd_val), instr); 2158 WriteW(addr, Utils::Low32Bits(dd_val), instr);
2150 WriteW(addr + 4, Utils::High32Bits(dd_val), instr); 2159 WriteW(addr + 4, Utils::High32Bits(dd_val), instr);
2151 } 2160 }
2152 } 2161 }
2153 } 2162 }
2163 } else if (instr->IsVFPMultipleLoadStore()) {
2164 Register rn = instr->RnField();
2165 int32_t addr = get_register(rn);
2166 int32_t imm_val = instr->Bits(0, 8);
2167 if (instr->Bit(23) == 0) {
2168 addr -= (imm_val << 2);
2169 }
2170 if (instr->HasW()) {
2171 if (instr->Bit(23) == 1) {
2172 set_register(rn, addr + (imm_val << 2));
2173 } else {
2174 set_register(rn, addr); // already subtracted from addr
2175 }
2176 }
2177 if (IsIllegalAddress(addr)) {
2178 HandleIllegalAccess(addr, instr);
2179 } else {
2180 if (instr->Bit(8) == 0) {
2181 int32_t regs_cnt = imm_val;
2182 int32_t start = instr->Bit(22) | (instr->Bits(12, 4) << 1);
2183 for (int i = start; i < start + regs_cnt; i++) {
2184 SRegister sd = static_cast<SRegister>(i);
2185 if (instr->Bit(20) == 1) {
2186 // Format(instr, "vldms'cond'pu 'rn'w, 'slist");
2187 set_sregister(sd, bit_cast<float, int32_t>(ReadW(addr, instr)));
2188 } else {
2189 // Format(instr, "vstms'cond'pu 'rn'w, 'slist");
2190 WriteW(addr, bit_cast<int32_t, float>(get_sregister(sd)), instr);
2191 }
2192 addr += 4;
2193 }
2194 } else {
2195 int32_t regs_cnt = imm_val >> 1;
2196 int32_t start = (instr->Bit(22) << 4) | instr->Bits(12, 4);
2197 for (int i = start; i < start + regs_cnt; i++) {
2198 DRegister dd = static_cast<DRegister>(i);
2199 if (instr->Bit(20) == 1) {
2200 // Format(instr, "vldmd'cond'pu 'rn'w, 'dlist");
2201 int64_t dd_val = Utils::LowHighTo64Bits(ReadW(addr, instr),
2202 ReadW(addr + 4, instr));
2203 set_dregister(dd, bit_cast<double, int64_t>(dd_val));
2204 } else {
2205 // Format(instr, "vstmd'cond'pu 'rn'w, 'dlist");
2206 int64_t dd_val = bit_cast<int64_t, double>(get_dregister(dd));
2207 WriteW(addr, Utils::Low32Bits(dd_val), instr);
2208 WriteW(addr + 4, Utils::High32Bits(dd_val), instr);
2209 }
2210 addr += 8;
2211 }
2212 }
2213 }
2154 } else { 2214 } else {
2155 UNIMPLEMENTED(); 2215 UNIMPLEMENTED();
2156 } 2216 }
2157 } 2217 }
2158 2218
2159 2219
2160 void Simulator::DecodeType7(Instr* instr) { 2220 void Simulator::DecodeType7(Instr* instr) {
2161 if (instr->Bit(24) == 1) { 2221 if (instr->Bit(24) == 1) {
2162 // Format(instr, "svc #'svc"); 2222 // Format(instr, "svc #'svc");
2163 SupervisorCall(instr); 2223 SupervisorCall(instr);
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
2740 // isolate->ChangeStateToGeneratedCode(); 2800 // isolate->ChangeStateToGeneratedCode();
2741 set_register(kExceptionObjectReg, bit_cast<int32_t>(object.raw())); 2801 set_register(kExceptionObjectReg, bit_cast<int32_t>(object.raw()));
2742 buf->Longjmp(); 2802 buf->Longjmp();
2743 } 2803 }
2744 2804
2745 } // namespace dart 2805 } // namespace dart
2746 2806
2747 #endif // !defined(HOST_ARCH_ARM) 2807 #endif // !defined(HOST_ARCH_ARM)
2748 2808
2749 #endif // defined TARGET_ARCH_ARM 2809 #endif // defined TARGET_ARCH_ARM
OLDNEW
« runtime/vm/disassembler_arm.cc ('K') | « runtime/vm/disassembler_arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698