Chromium Code Reviews| 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()) { |