Index: runtime/vm/assembler_mips.cc |
=================================================================== |
--- runtime/vm/assembler_mips.cc (revision 20999) |
+++ runtime/vm/assembler_mips.cc (working copy) |
@@ -79,6 +79,49 @@ |
} |
+void Assembler::AdduDetectOverflow(Register rd, Register rs, Register rt, |
+ Register ro) { |
+ ASSERT(rd != ro); |
+ ASSERT(rd != TMP); |
+ ASSERT(ro != TMP); |
+ ASSERT(ro != rs); |
+ ASSERT(ro != rt); |
+ |
+ if ((rs == rt) && (rd == rs)) { |
+ ASSERT(rd != T9); |
regis
2013/04/05 23:23:45
This macro should take a scratch register argument
zra
2013/04/06 00:04:19
I thought it might be clearer to require a scratch
|
+ ASSERT(ro != T9); |
+ mov(T9, rt); |
+ rt = T9; |
+ } |
+ |
+ if (rd == rs) { |
+ mov(TMP, rs); // Preserve rs. |
+ addu(rd, rs, rt); // rs is overwritten. |
+ xor_(TMP, rd, TMP); // Original rs. |
+ xor_(ro, rd, rt); |
+ and_(ro, ro, TMP); |
+ } else if (rd == rt) { |
+ mov(TMP, rt); // Preserve rt. |
+ addu(rd, rs, rt); // rt is overwritten. |
+ xor_(TMP, rd, TMP); // Original rt. |
+ xor_(ro, rd, rs); |
+ and_(ro, ro, TMP); |
+ } else { |
+ addu(rd, rs, rt); |
+ xor_(ro, rd, rs); |
+ xor_(TMP, rd, rt); |
+ and_(ro, TMP, ro); |
+ } |
+} |
+ |
+ |
+void Assembler::AddiuDetectOverflow(Register rt, Register rs, |
+ const Immediate& imm, Register ro) { |
regis
2013/04/05 23:23:45
ditto, scratch argument instead of T8.
zra
2013/04/06 00:04:19
I decided to remove this function. Otherwise it wo
|
+ addiu(T8, ZR, imm); |
+ AdduDetectOverflow(rt, rs, T8, ro); |
+} |
+ |
+ |
void Assembler::LoadObject(Register rd, const Object& object) { |
// Smi's and VM heap objects are never relocated; do not use object pool. |
if (object.IsSmi()) { |