| Index: runtime/vm/intrinsifier_mips.cc
|
| ===================================================================
|
| --- runtime/vm/intrinsifier_mips.cc (revision 24294)
|
| +++ runtime/vm/intrinsifier_mips.cc (working copy)
|
| @@ -204,8 +204,8 @@
|
| // Null value is valid for any type.
|
| __ LoadImmediate(T7, reinterpret_cast<int32_t>(Object::null()));
|
| __ beq(T2, T7, &checked_ok);
|
| - __ delay_slot()->lw(T1, Address(SP, 2 * kWordSize)); // Array.
|
|
|
| + __ lw(T1, Address(SP, 2 * kWordSize)); // Array.
|
| __ lw(T1, FieldAddress(T1, type_args_field_offset));
|
|
|
| // T1: Type arguments of array.
|
| @@ -232,8 +232,8 @@
|
| __ andi(CMPRES, T1, Immediate(kSmiTagMask));
|
| // Index not Smi.
|
| __ bne(CMPRES, ZR, &fall_through);
|
| - __ delay_slot()->lw(T0, Address(SP, 2 * kWordSize)); // Array.
|
|
|
| + __ lw(T0, Address(SP, 2 * kWordSize)); // Array.
|
| // Range check.
|
| __ lw(T3, FieldAddress(T0, Array::length_offset())); // Array length.
|
| // Runtime throws exception.
|
| @@ -248,7 +248,7 @@
|
| __ StoreIntoObject(T0,
|
| FieldAddress(T1, Array::data_offset()),
|
| T2);
|
| - // Caller is responsible of preserving the value if necessary.
|
| + // Caller is responsible for preserving the value if necessary.
|
| __ Ret();
|
| __ Bind(&fall_through);
|
| return false;
|
| @@ -1338,16 +1338,15 @@
|
| bool Intrinsifier::Double_getIsNegative(Assembler* assembler) {
|
| Label is_false, is_true, is_zero;
|
| __ 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);
|
|
|
| __ cund(D0, D0);
|
| __ bc1t(&is_false); // NaN -> false.
|
|
|
| + __ LoadImmediate(D1, 0.0);
|
| __ ceqd(D0, D1);
|
| __ bc1t(&is_zero); // Check for negative zero.
|
|
|
| - __ LoadImmediate(D1, 0.0);
|
| __ coled(D1, D0);
|
| __ bc1t(&is_false); // >= 0 -> false.
|
|
|
| @@ -1448,24 +1447,25 @@
|
| __ lw(T1, FieldAddress(T0, state_field.Offset())); // Field '_state'.
|
|
|
| // Addresses of _state[0] and _state[1].
|
| - const int64_t disp_0 =
|
| - FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
|
| + const Address& addr_0 = FieldAddress(T1,
|
| + FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid));
|
|
|
| - const int64_t disp_1 =
|
| + const Address& addr_1 = FieldAddress(T1,
|
| FlowGraphCompiler::ElementSizeFor(kTypedDataUint32ArrayCid) +
|
| - FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid);
|
| + FlowGraphCompiler::DataOffsetFor(kTypedDataUint32ArrayCid));
|
| +
|
| __ LoadImmediate(T0, a_int32_value);
|
| - __ lw(T2, FieldAddress(T1, disp_0));
|
| - __ lw(T3, FieldAddress(T1, disp_1));
|
| + __ lw(T2, addr_0);
|
| + __ lw(T3, addr_1);
|
| __ sra(T6, T3, 31); // Sign extend T3 into T6.
|
| __ mtlo(T3);
|
| __ mthi(T6); // HI:LO <- T6:T3
|
| // 64-bit multiply and accumulate into T6:T3.
|
| - __ madd(T0, T2); // HI:LO <- HI:LO + T0 * T3.
|
| + __ madd(T0, T2); // HI:LO <- HI:LO + T0 * T2.
|
| __ mflo(T3);
|
| __ mfhi(T6);
|
| - __ sw(T3, FieldAddress(T1, disp_0));
|
| - __ sw(T6, FieldAddress(T1, disp_1));
|
| + __ sw(T3, addr_0);
|
| + __ sw(T6, addr_1);
|
| __ Ret();
|
| return true;
|
| }
|
|
|