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

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

Issue 713993002: Fix unsigned multiplication in MIPS simulator (add assembler regression test). (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 1 month 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
« no previous file with comments | « runtime/vm/intrinsifier_arm.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <setjmp.h> 5 #include <setjmp.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 7
8 #include "vm/globals.h" 8 #include "vm/globals.h"
9 #if defined(TARGET_ARCH_MIPS) 9 #if defined(TARGET_ARCH_MIPS)
10 10
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 void Debug(); 87 void Debug();
88 char* ReadLine(const char* prompt); 88 char* ReadLine(const char* prompt);
89 89
90 private: 90 private:
91 Simulator* sim_; 91 Simulator* sim_;
92 92
93 bool GetValue(char* desc, uint32_t* value); 93 bool GetValue(char* desc, uint32_t* value);
94 bool GetFValue(char* desc, double* value); 94 bool GetFValue(char* desc, double* value);
95 bool GetDValue(char* desc, double* value); 95 bool GetDValue(char* desc, double* value);
96 96
97 static const int32_t kSimulatorBreakpointInstruction =
98 Instr::kBreakPointInstruction |
99 (Instr::kSimulatorBreakCode << kBreakCodeShift);
100
97 // Set or delete a breakpoint. Returns true if successful. 101 // Set or delete a breakpoint. Returns true if successful.
98 bool SetBreakpoint(Instr* breakpc); 102 bool SetBreakpoint(Instr* breakpc);
99 bool DeleteBreakpoint(Instr* breakpc); 103 bool DeleteBreakpoint(Instr* breakpc);
100 104
101 // Undo and redo all breakpoints. This is needed to bracket disassembly and 105 // Undo and redo all breakpoints. This is needed to bracket disassembly and
102 // execution to skip past breakpoints when run from the debugger. 106 // execution to skip past breakpoints when run from the debugger.
103 void UndoBreakpoints(); 107 void UndoBreakpoints();
104 void RedoBreakpoints(); 108 void RedoBreakpoints();
105 }; 109 };
106 110
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 279
276 void SimulatorDebugger::UndoBreakpoints() { 280 void SimulatorDebugger::UndoBreakpoints() {
277 if (sim_->break_pc_ != NULL) { 281 if (sim_->break_pc_ != NULL) {
278 sim_->break_pc_->SetInstructionBits(sim_->break_instr_); 282 sim_->break_pc_->SetInstructionBits(sim_->break_instr_);
279 } 283 }
280 } 284 }
281 285
282 286
283 void SimulatorDebugger::RedoBreakpoints() { 287 void SimulatorDebugger::RedoBreakpoints() {
284 if (sim_->break_pc_ != NULL) { 288 if (sim_->break_pc_ != NULL) {
285 sim_->break_pc_->SetInstructionBits(Instr::kBreakPointInstruction); 289 sim_->break_pc_->SetInstructionBits(kSimulatorBreakpointInstruction);
286 } 290 }
287 } 291 }
288 292
289 293
290 void SimulatorDebugger::Debug() { 294 void SimulatorDebugger::Debug() {
291 intptr_t last_pc = -1; 295 intptr_t last_pc = -1;
292 bool done = false; 296 bool done = false;
293 297
294 #define COMMAND_SIZE 63 298 #define COMMAND_SIZE 63
295 #define ARG_SIZE 255 299 #define ARG_SIZE 255
(...skipping 899 matching lines...) Expand 10 before | Expand all | Expand 10 after
1195 } 1199 }
1196 1200
1197 // Return. Subtract to account for pc_ increment after return. 1201 // Return. Subtract to account for pc_ increment after return.
1198 set_pc(saved_ra - Instr::kInstrSize); 1202 set_pc(saved_ra - Instr::kInstrSize);
1199 } else { 1203 } else {
1200 // Coming via long jump from a throw. Continue to exception handler. 1204 // Coming via long jump from a throw. Continue to exception handler.
1201 set_top_exit_frame_info(0); 1205 set_top_exit_frame_info(0);
1202 // Adjust for extra pc increment. 1206 // Adjust for extra pc increment.
1203 set_pc(get_pc() - Instr::kInstrSize); 1207 set_pc(get_pc() - Instr::kInstrSize);
1204 } 1208 }
1209 } else if (instr->BreakCodeField() == Instr::kSimulatorBreakCode) {
1210 SimulatorDebugger dbg(this);
1211 dbg.Stop(instr, "breakpoint");
1212 // Adjust for extra pc increment.
1213 set_pc(get_pc() - Instr::kInstrSize);
1205 } else { 1214 } else {
1206 SimulatorDebugger dbg(this); 1215 SimulatorDebugger dbg(this);
1207 dbg.Stop(instr, "breakpoint"); 1216 set_pc(get_pc() + Instr::kInstrSize);
1217 char buffer[32];
1218 snprintf(buffer, sizeof(buffer), "break #0x%x", instr->BreakCodeField());
1219 dbg.Stop(instr, buffer);
1208 // Adjust for extra pc increment. 1220 // Adjust for extra pc increment.
1209 set_pc(get_pc() - Instr::kInstrSize); 1221 set_pc(get_pc() - Instr::kInstrSize);
1210 } 1222 }
1211 } 1223 }
1212 1224
1213 1225
1214 void Simulator::DecodeSpecial(Instr* instr) { 1226 void Simulator::DecodeSpecial(Instr* instr) {
1215 ASSERT(instr->OpcodeField() == SPECIAL); 1227 ASSERT(instr->OpcodeField() == SPECIAL);
1216 switch (instr->FunctionField()) { 1228 switch (instr->FunctionField()) {
1217 case ADDU: { 1229 case ADDU: {
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1358 ASSERT(instr->RdField() == 0); 1370 ASSERT(instr->RdField() == 0);
1359 ASSERT(instr->SaField() == 0); 1371 ASSERT(instr->SaField() == 0);
1360 // Format(instr, "mflo 'rd"); 1372 // Format(instr, "mflo 'rd");
1361 set_lo_register(get_register(instr->RsField())); 1373 set_lo_register(get_register(instr->RsField()));
1362 break; 1374 break;
1363 } 1375 }
1364 case MULT: { 1376 case MULT: {
1365 ASSERT(instr->RdField() == 0); 1377 ASSERT(instr->RdField() == 0);
1366 ASSERT(instr->SaField() == 0); 1378 ASSERT(instr->SaField() == 0);
1367 // Format(instr, "mult 'rs, 'rt"); 1379 // Format(instr, "mult 'rs, 'rt");
1368 int64_t rs = static_cast<int64_t>(get_register(instr->RsField())); 1380 int64_t rs = get_register(instr->RsField());
1369 int64_t rt = static_cast<int64_t>(get_register(instr->RtField())); 1381 int64_t rt = get_register(instr->RtField());
1370 int64_t res = rs * rt; 1382 int64_t res = rs * rt;
1371 set_hi_register(Utils::High32Bits(res)); 1383 set_hi_register(Utils::High32Bits(res));
1372 set_lo_register(Utils::Low32Bits(res)); 1384 set_lo_register(Utils::Low32Bits(res));
1373 break; 1385 break;
1374 } 1386 }
1375 case MULTU: { 1387 case MULTU: {
1376 ASSERT(instr->RdField() == 0); 1388 ASSERT(instr->RdField() == 0);
1377 ASSERT(instr->SaField() == 0); 1389 ASSERT(instr->SaField() == 0);
1378 // Format(instr, "multu 'rs, 'rt"); 1390 // Format(instr, "multu 'rs, 'rt");
1379 uint64_t rs = static_cast<uint64_t>(get_register(instr->RsField())); 1391 uint64_t rs = static_cast<uint32_t>(get_register(instr->RsField()));
1380 uint64_t rt = static_cast<uint64_t>(get_register(instr->RtField())); 1392 uint64_t rt = static_cast<uint32_t>(get_register(instr->RtField()));
1381 uint64_t res = rs * rt; 1393 uint64_t res = rs * rt;
1382 set_hi_register(Utils::High32Bits(res)); 1394 set_hi_register(Utils::High32Bits(res));
1383 set_lo_register(Utils::Low32Bits(res)); 1395 set_lo_register(Utils::Low32Bits(res));
1384 break; 1396 break;
1385 } 1397 }
1386 case NOR: { 1398 case NOR: {
1387 ASSERT(instr->SaField() == 0); 1399 ASSERT(instr->SaField() == 0);
1388 // Format(instr, "nor 'rd, 'rs, 'rt"); 1400 // Format(instr, "nor 'rd, 'rs, 'rt");
1389 int32_t rs_val = get_register(instr->RsField()); 1401 int32_t rs_val = get_register(instr->RsField());
1390 int32_t rt_val = get_register(instr->RtField()); 1402 int32_t rt_val = get_register(instr->RtField());
(...skipping 958 matching lines...) Expand 10 before | Expand all | Expand 10 after
2349 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception)); 2361 set_register(kExceptionObjectReg, bit_cast<int32_t>(raw_exception));
2350 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace)); 2362 set_register(kStackTraceObjectReg, bit_cast<int32_t>(raw_stacktrace));
2351 buf->Longjmp(); 2363 buf->Longjmp();
2352 } 2364 }
2353 2365
2354 } // namespace dart 2366 } // namespace dart
2355 2367
2356 #endif // !defined(HOST_ARCH_MIPS) 2368 #endif // !defined(HOST_ARCH_MIPS)
2357 2369
2358 #endif // defined TARGET_ARCH_MIPS 2370 #endif // defined TARGET_ARCH_MIPS
OLDNEW
« no previous file with comments | « runtime/vm/intrinsifier_arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698