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

Unified Diff: runtime/vm/simulator_mips.cc

Issue 16272004: Implements intrinsics for MIPS. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/intrinsifier_mips.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/simulator_mips.cc
===================================================================
--- runtime/vm/simulator_mips.cc (revision 23484)
+++ runtime/vm/simulator_mips.cc (working copy)
@@ -1067,7 +1067,6 @@
// TODO(zra): Drop into the debugger here.
break;
}
-
set_lo_register(rs_val / rt_val);
set_hi_register(rs_val % rt_val);
break;
@@ -1130,6 +1129,22 @@
}
break;
}
+ case MTHI: {
+ ASSERT(instr->RtField() == 0);
+ ASSERT(instr->RdField() == 0);
+ ASSERT(instr->SaField() == 0);
+ // Format(instr, "mthi 'rd");
+ set_hi_register(get_register(instr->RsField()));
+ break;
+ }
+ case MTLO: {
+ ASSERT(instr->RtField() == 0);
+ ASSERT(instr->RdField() == 0);
+ ASSERT(instr->SaField() == 0);
+ // Format(instr, "mflo 'rd");
+ set_lo_register(get_register(instr->RsField()));
+ break;
+ }
case MULT: {
ASSERT(instr->RdField() == 0);
ASSERT(instr->SaField() == 0);
@@ -1266,6 +1281,34 @@
void Simulator::DecodeSpecial2(Instr* instr) {
ASSERT(instr->OpcodeField() == SPECIAL2);
switch (instr->FunctionField()) {
+ case MADD: {
+ ASSERT(instr->RdField() == 0);
+ ASSERT(instr->SaField() == 0);
+ // Format(instr, "madd 'rs, 'rt");
+ uint32_t lo = get_lo_register();
+ int32_t hi = get_hi_register();
+ int64_t accum = Utils::LowHighTo64Bits(lo, hi);
+ int64_t rs = static_cast<int64_t>(get_register(instr->RsField()));
+ int64_t rt = static_cast<int64_t>(get_register(instr->RtField()));
+ int64_t res = accum + rs * rt;
+ set_hi_register(Utils::High32Bits(res));
+ set_lo_register(Utils::Low32Bits(res));
+ break;
+ }
+ case MADDU: {
+ ASSERT(instr->RdField() == 0);
+ ASSERT(instr->SaField() == 0);
+ // Format(instr, "maddu 'rs, 'rt");
+ uint32_t lo = get_lo_register();
+ uint32_t hi = get_hi_register();
+ uint64_t accum = Utils::LowHighTo64Bits(lo, hi);
+ uint64_t rs = static_cast<int64_t>(get_register(instr->RsField()));
+ uint64_t rt = static_cast<int64_t>(get_register(instr->RtField()));
+ uint64_t res = accum + rs * rt;
+ set_hi_register(Utils::High32Bits(res));
+ set_lo_register(Utils::Low32Bits(res));
+ break;
+ }
case CLO: {
ASSERT(instr->SaField() == 0);
ASSERT(instr->RtField() == instr->RdField());
« no previous file with comments | « runtime/vm/intrinsifier_mips.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698