| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |