Index: runtime/vm/intrinsifier_mips.cc |
=================================================================== |
--- runtime/vm/intrinsifier_mips.cc (revision 24426) |
+++ runtime/vm/intrinsifier_mips.cc (working copy) |
@@ -864,10 +864,9 @@ |
// Check for overflow by shifting left and shifting back arithmetically. |
// If the result is different from the original, there was overflow. |
- __ mov(T2, T1); |
- __ sllv(T1, T1, T0); |
- __ srlv(T1, T1, T0); |
- __ bne(T1, T2, &overflow); |
+ __ sllv(TMP, T1, T0); |
+ __ srav(TMP, TMP, T0); |
+ __ bne(TMP, T1, &overflow); |
// No overflow, result in V0. |
__ Ret(); |
@@ -875,23 +874,23 @@ |
__ Bind(&overflow); |
// Arguments are Smi but the shift produced an overflow to Mint. |
- __ bltz(T2, &fall_through); |
- __ SmiUntag(T2); |
+ __ bltz(T1, &fall_through); |
+ __ SmiUntag(T1); |
- // Pull off high bits that will be shifted off of T2 by making a mask |
- // ((1 << T0) - 1), shifting it to the right, masking T2, then shifting back. |
- // high bits = (((1 << T0) - 1) << (32 - T0)) & T2) >> (32 - T0) |
- // lo bits = T2 << T0 |
+ // Pull off high bits that will be shifted off of T1 by making a mask |
+ // ((1 << T0) - 1), shifting it to the right, masking T1, then shifting back. |
+ // high bits = (((1 << T0) - 1) << (32 - T0)) & T1) >> (32 - T0) |
+ // lo bits = T1 << T0 |
__ LoadImmediate(T3, 1); |
__ sllv(T3, T3, T0); // T3 <- T3 << T0 |
__ addiu(T3, T3, Immediate(-1)); // T3 <- T3 - 1 |
- __ addu(T4, ZR, T0); // T4 <- -T0 |
+ __ subu(T4, ZR, T0); // T4 <- -T0 |
__ addiu(T4, T4, Immediate(32)); // T4 <- 32 - T0 |
__ sllv(T3, T3, T4); // T3 <- T3 << T4 |
- __ and_(T3, T3, T2); // T3 <- T3 & T2 |
+ __ and_(T3, T3, T1); // T3 <- T3 & T1 |
__ srlv(T3, T3, T4); // T3 <- T3 >> T4 |
- // Now T3 has the bits that fall off of T2 on a left shift. |
- __ sllv(T0, T2, T0); // T0 gets low bits. |
+ // Now T3 has the bits that fall off of T1 on a left shift. |
+ __ sllv(T0, T1, T0); // T0 gets low bits. |
const Class& mint_class = Class::Handle( |
Isolate::Current()->object_store()->mint_class()); |
@@ -1371,14 +1370,17 @@ |
bool Intrinsifier::Double_toInt(Assembler* assembler) { |
__ lw(T0, Address(SP, 0 * kWordSize)); |
- __ lwc1(F0, FieldAddress(T0, Double::value_offset())); |
- __ lwc1(F1, FieldAddress(T0, Double::value_offset() + kWordSize)); |
+ __ LoadDFromOffset(D0, T0, Double::value_offset() - kHeapObjectTag); |
+ |
__ cvtwd(F2, D0); |
__ mfc1(V0, F2); |
+ |
// Overflow is signaled with minint. |
Label fall_through; |
// Check for overflow and that it fits into Smi. |
- __ BranchSignedLess(V0, 0xC0000000, &fall_through); |
+ __ LoadImmediate(TMP, 0xC0000000); |
+ __ subu(CMPRES, V0, TMP); |
+ __ bltz(CMPRES, &fall_through); |
__ Ret(); |
__ delay_slot()->SmiTag(V0); |
__ Bind(&fall_through); |