Index: src/mips/macro-assembler-mips.cc |
diff --git a/src/mips/macro-assembler-mips.cc b/src/mips/macro-assembler-mips.cc |
index 913bfa5e683e5d4aeecfb2bb623c3b7d94e40002..a520562b32abce8e22fa429e1ffddadab6937998 100644 |
--- a/src/mips/macro-assembler-mips.cc |
+++ b/src/mips/macro-assembler-mips.cc |
@@ -837,11 +837,11 @@ void MacroAssembler::Trunc_uw_d(FPURegister fd, FPURegister fs) { |
void MacroAssembler::Trunc_uw_d(FPURegister fd, Register rs) { |
ASSERT(!fd.is(f22)); |
- ASSERT(!rs.is(t6)); |
+ ASSERT(!rs.is(t8)); |
// Load 2^31 into f22. |
- Or(t6, zero_reg, 0x80000000); |
- Cvt_d_uw(f22, t6); |
+ Or(t8, zero_reg, 0x80000000); |
+ Cvt_d_uw(f22, t8); |
// Test if f22 > fd. |
c(OLT, D, fd, f22); |
@@ -856,7 +856,7 @@ void MacroAssembler::Trunc_uw_d(FPURegister fd, Register rs) { |
sub_d(f22, fd, f22); |
trunc_w_d(f22, f22); |
mfc1(rs, f22); |
- or_(rs, rs, t6); |
+ or_(rs, rs, t8); |
Label done; |
Branch(&done); |
@@ -2563,8 +2563,8 @@ void MacroAssembler::AllocateHeapNumberWithValue(Register result, |
Register scratch1, |
Register scratch2, |
Label* gc_required) { |
- LoadRoot(t6, Heap::kHeapNumberMapRootIndex); |
- AllocateHeapNumber(result, scratch1, scratch2, t6, gc_required); |
+ LoadRoot(t8, Heap::kHeapNumberMapRootIndex); |
+ AllocateHeapNumber(result, scratch1, scratch2, t8, gc_required); |
sdc1(value, FieldMemOperand(result, HeapNumber::kValueOffset)); |
} |
@@ -3249,23 +3249,18 @@ void MacroAssembler::AdduAndCheckForOverflow(Register dst, |
ASSERT(!overflow_dst.is(right)); |
ASSERT(!left.is(right)); |
- // TODO(kalmard) There must be a way to optimize dst == left and dst == right |
- // cases. |
- |
if (dst.is(left)) { |
- addu(overflow_dst, left, right); |
- xor_(dst, overflow_dst, left); |
- xor_(scratch, overflow_dst, right); |
- and_(scratch, scratch, dst); |
- mov(dst, overflow_dst); |
- mov(overflow_dst, scratch); |
+ mov(scratch, left); // Preserve left. |
+ addu(dst, left, right); // Left is overwritten. |
+ xor_(scratch, dst, scratch); // Original left. |
+ xor_(overflow_dst, dst, right); |
+ and_(overflow_dst, overflow_dst, scratch); |
} else if (dst.is(right)) { |
- addu(overflow_dst, left, right); |
- xor_(dst, overflow_dst, right); |
- xor_(scratch, overflow_dst, left); |
- and_(scratch, scratch, dst); |
- mov(dst, overflow_dst); |
- mov(overflow_dst, scratch); |
+ mov(scratch, right); // Preserve right. |
+ addu(dst, left, right); // Right is overwritten. |
+ xor_(scratch, dst, scratch); // Original right. |
+ xor_(overflow_dst, dst, left); |
+ and_(overflow_dst, overflow_dst, scratch); |
} else { |
addu(dst, left, right); |
xor_(overflow_dst, dst, left); |
@@ -3289,23 +3284,18 @@ void MacroAssembler::SubuAndCheckForOverflow(Register dst, |
ASSERT(!scratch.is(left)); |
ASSERT(!scratch.is(right)); |
- // TODO(kalmard) There must be a way to optimize dst == left and dst == right |
- // cases. |
- |
if (dst.is(left)) { |
- subu(overflow_dst, left, right); |
- xor_(scratch, overflow_dst, left); |
- xor_(dst, left, right); |
- and_(scratch, scratch, dst); |
- mov(dst, overflow_dst); |
- mov(overflow_dst, scratch); |
+ mov(scratch, left); // Preserve left. |
+ subu(dst, left, right); // Left is overwritten. |
+ xor_(overflow_dst, dst, scratch); // scratch is original left. |
+ xor_(scratch, scratch, right); // scratch is original left. |
+ and_(overflow_dst, scratch, overflow_dst); |
} else if (dst.is(right)) { |
- subu(overflow_dst, left, right); |
- xor_(dst, left, right); |
- xor_(scratch, overflow_dst, left); |
- and_(scratch, scratch, dst); |
- mov(dst, overflow_dst); |
- mov(overflow_dst, scratch); |
+ mov(scratch, right); // Preserve right. |
+ subu(dst, left, right); // Right is overwritten. |
+ xor_(overflow_dst, dst, left); |
+ xor_(scratch, left, scratch); // Original right. |
+ and_(overflow_dst, scratch, overflow_dst); |
} else { |
subu(dst, left, right); |
xor_(overflow_dst, dst, left); |