| Index: runtime/vm/intermediate_language_mips.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_mips.cc (revision 29964)
|
| +++ runtime/vm/intermediate_language_mips.cc (working copy)
|
| @@ -473,7 +473,7 @@
|
| }
|
|
|
|
|
| -// Branches on condition c assuming comparison results in CMPRES and CMPRES2.
|
| +// Branches on condition c assuming comparison results in CMPRES1 and CMPRES2.
|
| static void EmitBranchAfterCompare(
|
| FlowGraphCompiler* compiler, Condition c, Label* is_true) {
|
| switch (c) {
|
| @@ -635,6 +635,43 @@
|
| }
|
|
|
|
|
| +LocationSummary* TestSmiInstr::MakeLocationSummary() const {
|
| + const intptr_t kNumInputs = 2;
|
| + const intptr_t kNumTemps = 0;
|
| + LocationSummary* locs =
|
| + new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall);
|
| + locs->set_in(0, Location::RequiresRegister());
|
| + // Only one input can be a constant operand. The case of two constant
|
| + // operands should be handled by constant propagation.
|
| + locs->set_in(1, Location::RegisterOrConstant(right()));
|
| + return locs;
|
| +}
|
| +
|
| +
|
| +void TestSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| + // Never emitted outside of the BranchInstr.
|
| + UNREACHABLE();
|
| +}
|
| +
|
| +
|
| +void TestSmiInstr::EmitBranchCode(FlowGraphCompiler* compiler,
|
| + BranchInstr* branch) {
|
| + Condition branch_condition = (kind() == Token::kNE) ? NE : EQ;
|
| + Register left = locs()->in(0).reg();
|
| + Location right = locs()->in(1);
|
| + if (right.IsConstant()) {
|
| + ASSERT(right.constant().IsSmi());
|
| + const int32_t imm =
|
| + reinterpret_cast<int32_t>(right.constant().raw());
|
| + __ AndImmediate(CMPRES1, left, imm);
|
| + } else {
|
| + __ and_(CMPRES1, left, right.reg());
|
| + }
|
| + __ mov(CMPRES2, ZR);
|
| + branch->EmitBranchOnCondition(compiler, branch_condition);
|
| +}
|
| +
|
| +
|
| LocationSummary* RelationalOpInstr::MakeLocationSummary() const {
|
| const intptr_t kNumInputs = 2;
|
| const intptr_t kNumTemps = 0;
|
| @@ -777,9 +814,9 @@
|
| __ LoadImmediate(result,
|
| reinterpret_cast<uword>(Symbols::PredefinedAddress()));
|
| __ AddImmediate(result, Symbols::kNullCharCodeSymbolOffset * kWordSize);
|
| - __ sll(TMP1, char_code, 1); // Char code is a smi.
|
| - __ addu(TMP1, TMP1, result);
|
| - __ lw(result, Address(TMP1));
|
| + __ sll(TMP, char_code, 1); // Char code is a smi.
|
| + __ addu(TMP, TMP, result);
|
| + __ lw(result, Address(TMP));
|
| }
|
|
|
|
|
| @@ -836,8 +873,8 @@
|
| Register object = locs()->in(0).reg();
|
| Register result = locs()->out().reg();
|
| Label load, done;
|
| - __ andi(CMPRES, object, Immediate(kSmiTagMask));
|
| - __ bne(CMPRES, ZR, &load);
|
| + __ andi(CMPRES1, object, Immediate(kSmiTagMask));
|
| + __ bne(CMPRES1, ZR, &load);
|
| __ LoadImmediate(result, Smi::RawValue(kSmiCid));
|
| __ b(&done);
|
| __ Bind(&load);
|
| @@ -1055,9 +1092,9 @@
|
| Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptUint32Load);
|
| __ lw(result, element_address);
|
| // Verify that the unsigned value in 'result' can fit inside a Smi.
|
| - __ LoadImmediate(TMP1, 0xC0000000);
|
| - __ and_(CMPRES, result, TMP1);
|
| - __ bne(CMPRES, ZR, deopt);
|
| + __ LoadImmediate(TMP, 0xC0000000);
|
| + __ and_(CMPRES1, result, TMP);
|
| + __ bne(CMPRES1, ZR, deopt);
|
| __ SmiTag(result);
|
| }
|
| break;
|
| @@ -1240,8 +1277,8 @@
|
| __ SmiUntag(value);
|
| __ BranchUnsignedLess(value, 0xFF + 1, &store_value);
|
| __ LoadImmediate(TMP, 0xFF);
|
| - __ slti(CMPRES, value, Immediate(1));
|
| - __ movn(TMP, ZR, CMPRES);
|
| + __ slti(CMPRES1, value, Immediate(1));
|
| + __ movn(TMP, ZR, CMPRES1);
|
| __ mov(value, TMP);
|
| __ Bind(&store_value);
|
| __ sb(value, element_address);
|
| @@ -1429,31 +1466,29 @@
|
| __ bne(CMPRES1, ZR, fail);
|
| }
|
| __ Bind(&skip_length_check);
|
| - __ lw(TMP1, field_nullability_operand);
|
| - __ subu(CMPRES, value_cid_reg, TMP1);
|
| + __ lw(TMP, field_nullability_operand);
|
| + __ subu(CMPRES1, value_cid_reg, TMP);
|
| } else if (value_cid == kNullCid) {
|
| - // TODO(regis): TMP1 may conflict. Revisit.
|
| - __ lw(TMP1, field_nullability_operand);
|
| - __ LoadImmediate(CMPRES, value_cid);
|
| - __ subu(CMPRES, TMP1, CMPRES);
|
| + __ lw(TMP, field_nullability_operand);
|
| + __ LoadImmediate(CMPRES1, value_cid);
|
| + __ subu(CMPRES1, TMP, CMPRES1);
|
| } else {
|
| Label skip_length_check;
|
| - // TODO(regis): TMP1 may conflict. Revisit.
|
| - __ lw(TMP1, field_cid_operand);
|
| - __ LoadImmediate(CMPRES, value_cid);
|
| - __ subu(CMPRES, TMP1, CMPRES);
|
| - __ bne(CMPRES, ZR, &skip_length_check);
|
| + __ lw(TMP, field_cid_operand);
|
| + __ LoadImmediate(CMPRES1, value_cid);
|
| + __ subu(CMPRES1, TMP, CMPRES1);
|
| + __ bne(CMPRES1, ZR, &skip_length_check);
|
| // Insert length check.
|
| if (field_has_length) {
|
| ASSERT(value_cid_reg != kNoRegister);
|
| if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
|
| __ lw(TMP, FieldAddress(value_reg, Array::length_offset()));
|
| - __ LoadImmediate(CMPRES, Smi::RawValue(field_length));
|
| - __ subu(CMPRES, TMP, CMPRES);
|
| + __ LoadImmediate(CMPRES1, Smi::RawValue(field_length));
|
| + __ subu(CMPRES1, TMP, CMPRES1);
|
| } else if (RawObject::IsTypedDataClassId(value_cid)) {
|
| __ lw(TMP, FieldAddress(value_reg, TypedData::length_offset()));
|
| - __ LoadImmediate(CMPRES, Smi::RawValue(field_length));
|
| - __ subu(CMPRES, TMP, CMPRES);
|
| + __ LoadImmediate(CMPRES1, Smi::RawValue(field_length));
|
| + __ subu(CMPRES1, TMP, CMPRES1);
|
| } else if (field_cid != kIllegalCid) {
|
| ASSERT(field_cid != value_cid);
|
| ASSERT(field_length >= 0);
|
| @@ -1465,11 +1500,11 @@
|
| ASSERT(field_length == Field::kUnknownFixedLength);
|
| // Following jump cannot not occur, fall through.
|
| }
|
| - __ bne(CMPRES, ZR, fail);
|
| + __ bne(CMPRES1, ZR, fail);
|
| }
|
| __ Bind(&skip_length_check);
|
| }
|
| - __ beq(CMPRES, ZR, &ok);
|
| + __ beq(CMPRES1, ZR, &ok);
|
|
|
| __ lw(CMPRES1, field_cid_operand);
|
| __ BranchNotEqual(CMPRES1, kIllegalCid, fail);
|
| @@ -1503,16 +1538,15 @@
|
| // Updated field length from regular array.
|
| __ b(&length_set);
|
| __ Bind(&no_fixed_length);
|
| - // TODO(regis): TMP1 may conflict. Revisit.
|
| - __ LoadImmediate(TMP1, Smi::RawValue(Field::kNoFixedLength));
|
| - __ sw(TMP1, field_length_operand);
|
| + __ LoadImmediate(TMP, Smi::RawValue(Field::kNoFixedLength));
|
| + __ sw(TMP, field_length_operand);
|
| __ Bind(&length_set);
|
| }
|
| } else {
|
| ASSERT(field_reg != kNoRegister);
|
| - __ LoadImmediate(TMP1, value_cid);
|
| - __ sw(TMP1, field_cid_operand);
|
| - __ sw(TMP1, field_nullability_operand);
|
| + __ LoadImmediate(TMP, value_cid);
|
| + __ sw(TMP, field_cid_operand);
|
| + __ sw(TMP, field_nullability_operand);
|
| if (field_has_length) {
|
| ASSERT(value_cid_reg != kNoRegister);
|
| if ((value_cid == kArrayCid) || (value_cid == kImmutableArrayCid)) {
|
| @@ -1541,18 +1575,18 @@
|
| }
|
| if (value_cid == kDynamicCid) {
|
| // Field's guarded class id is fixed by value's class id is not known.
|
| - __ andi(CMPRES, value_reg, Immediate(kSmiTagMask));
|
| + __ andi(CMPRES1, value_reg, Immediate(kSmiTagMask));
|
|
|
| if (field_cid != kSmiCid) {
|
| - __ beq(CMPRES, ZR, fail);
|
| + __ beq(CMPRES1, ZR, fail);
|
| __ LoadClassId(value_cid_reg, value_reg);
|
| - __ LoadImmediate(TMP1, field_cid);
|
| - __ subu(CMPRES, value_cid_reg, TMP1);
|
| + __ LoadImmediate(TMP, field_cid);
|
| + __ subu(CMPRES1, value_cid_reg, TMP);
|
| }
|
|
|
| if (field_has_length) {
|
| // Jump when Value CID != Field guard CID
|
| - __ bne(CMPRES, ZR, fail);
|
| + __ bne(CMPRES1, ZR, fail);
|
| // Classes are same, perform guarded list length check.
|
| ASSERT(field_reg != kNoRegister);
|
| ASSERT(value_cid_reg != kNoRegister);
|
| @@ -1567,20 +1601,20 @@
|
| __ lw(value_cid_reg,
|
| FieldAddress(value_reg, TypedData::length_offset()));
|
| }
|
| - __ lw(TMP1, field_length_operand);
|
| - __ subu(CMPRES, value_cid_reg, TMP1);
|
| + __ lw(TMP, field_length_operand);
|
| + __ subu(CMPRES1, value_cid_reg, TMP);
|
| }
|
|
|
| if (field().is_nullable() && (field_cid != kNullCid)) {
|
| - __ beq(CMPRES, ZR, &ok);
|
| + __ beq(CMPRES1, ZR, &ok);
|
| __ LoadImmediate(TMP, reinterpret_cast<int32_t>(Object::null()));
|
| - __ subu(CMPRES, value_reg, TMP);
|
| + __ subu(CMPRES1, value_reg, TMP);
|
| }
|
|
|
| if (ok_is_fall_through) {
|
| - __ bne(CMPRES, ZR, fail);
|
| + __ bne(CMPRES1, ZR, fail);
|
| } else {
|
| - __ beq(CMPRES, ZR, &ok);
|
| + __ beq(CMPRES1, ZR, &ok);
|
| }
|
| } else {
|
| // Both value's and field's class id is known.
|
| @@ -1599,10 +1633,10 @@
|
| __ lw(value_cid_reg,
|
| FieldAddress(value_reg, TypedData::length_offset()));
|
| }
|
| - __ LoadImmediate(TMP1, Smi::RawValue(field_length));
|
| - __ subu(CMPRES, value_cid_reg, TMP1);
|
| + __ LoadImmediate(TMP, Smi::RawValue(field_length));
|
| + __ subu(CMPRES1, value_cid_reg, TMP);
|
| if (ok_is_fall_through) {
|
| - __ bne(CMPRES, ZR, fail);
|
| + __ bne(CMPRES1, ZR, fail);
|
| }
|
| } else {
|
| // Nothing to emit.
|
| @@ -1821,10 +1855,10 @@
|
| // (or null).
|
| // A runtime call to instantiate the type is required.
|
| __ addiu(SP, SP, Immediate(-3 * kWordSize));
|
| - __ LoadObject(TMP1, Object::ZoneHandle());
|
| - __ sw(TMP1, Address(SP, 2 * kWordSize)); // Make room for the result.
|
| - __ LoadObject(TMP1, type());
|
| - __ sw(TMP1, Address(SP, 1 * kWordSize));
|
| + __ LoadObject(TMP, Object::ZoneHandle());
|
| + __ sw(TMP, Address(SP, 2 * kWordSize)); // Make room for the result.
|
| + __ LoadObject(TMP, type());
|
| + __ sw(TMP, Address(SP, 1 * kWordSize));
|
| // Push instantiator type arguments.
|
| __ sw(instantiator_reg, Address(SP, 0 * kWordSize));
|
|
|
| @@ -1875,10 +1909,10 @@
|
| // Instantiate non-null type arguments.
|
| // A runtime call to instantiate the type arguments is required.
|
| __ addiu(SP, SP, Immediate(-3 * kWordSize));
|
| - __ LoadObject(TMP1, Object::ZoneHandle());
|
| - __ sw(TMP1, Address(SP, 2 * kWordSize)); // Make room for the result.
|
| - __ LoadObject(TMP1, type_arguments());
|
| - __ sw(TMP1, Address(SP, 1 * kWordSize));
|
| + __ LoadObject(TMP, Object::ZoneHandle());
|
| + __ sw(TMP, Address(SP, 2 * kWordSize)); // Make room for the result.
|
| + __ LoadObject(TMP, type_arguments());
|
| + __ sw(TMP, Address(SP, 1 * kWordSize));
|
| // Push instantiator type arguments.
|
| __ sw(instantiator_reg, Address(SP, 0 * kWordSize));
|
|
|
| @@ -2021,8 +2055,8 @@
|
| __ TraceSimMsg("CloneContextInstr");
|
|
|
| __ addiu(SP, SP, Immediate(-2 * kWordSize));
|
| - __ LoadObject(TMP1, Object::ZoneHandle()); // Make room for the result.
|
| - __ sw(TMP1, Address(SP, 1 * kWordSize));
|
| + __ LoadObject(TMP, Object::ZoneHandle()); // Make room for the result.
|
| + __ sw(TMP, Address(SP, 1 * kWordSize));
|
| __ sw(context_value, Address(SP, 0 * kWordSize));
|
|
|
| compiler->GenerateRuntimeCall(token_pos(),
|
| @@ -2049,11 +2083,11 @@
|
| catch_handler_types_,
|
| needs_stacktrace());
|
| // Restore pool pointer.
|
| - __ GetNextPC(CMPRES, TMP);
|
| + __ GetNextPC(CMPRES1, TMP);
|
| const intptr_t object_pool_pc_dist =
|
| Instructions::HeaderSize() - Instructions::object_pool_offset() +
|
| compiler->assembler()->CodeSize() - 1 * Instr::kInstrSize;
|
| - __ LoadFromOffset(PP, CMPRES, -object_pool_pc_dist);
|
| + __ LoadFromOffset(PP, CMPRES1, -object_pool_pc_dist);
|
|
|
| if (HasParallelMove()) {
|
| compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
|
| @@ -2129,9 +2163,9 @@
|
| CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this);
|
| compiler->AddSlowPathCode(slow_path);
|
|
|
| - __ LoadImmediate(TMP1, Isolate::Current()->stack_limit_address());
|
| + __ LoadImmediate(TMP, Isolate::Current()->stack_limit_address());
|
|
|
| - __ lw(CMPRES1, Address(TMP1));
|
| + __ lw(CMPRES1, Address(TMP));
|
| __ BranchUnsignedLessEqual(SP, CMPRES1, slow_path->entry_label());
|
| if (compiler->CanOSRFunction() && in_loop()) {
|
| Register temp = locs()->temp(0).reg();
|
| @@ -2181,8 +2215,8 @@
|
| } else {
|
| if (!is_truncating) {
|
| // Check for overflow (preserve left).
|
| - __ sll(TMP1, left, value);
|
| - __ sra(CMPRES1, TMP1, value);
|
| + __ sll(TMP, left, value);
|
| + __ sra(CMPRES1, TMP, value);
|
| __ bne(CMPRES1, left, deopt); // Overflow.
|
| }
|
| // Shift for result now we know there is no overflow.
|
| @@ -2232,13 +2266,13 @@
|
| }
|
| Label done, is_not_zero;
|
|
|
| - __ sltiu(CMPRES,
|
| + __ sltiu(CMPRES1,
|
| right, Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
|
| - __ movz(result, ZR, CMPRES); // result = right >= kBits ? 0 : result.
|
| - __ sra(TMP1, right, kSmiTagSize);
|
| - __ sllv(TMP1, left, TMP1);
|
| + __ movz(result, ZR, CMPRES1); // result = right >= kBits ? 0 : result.
|
| + __ sra(TMP, right, kSmiTagSize);
|
| + __ sllv(TMP, left, TMP);
|
| // result = right < kBits ? left << right : result.
|
| - __ movn(result, TMP1, CMPRES);
|
| + __ movn(result, TMP, CMPRES1);
|
| } else {
|
| __ sra(TMP, right, kSmiTagSize);
|
| __ sllv(result, left, TMP);
|
| @@ -2321,8 +2355,8 @@
|
| if (deopt == NULL) {
|
| __ AddImmediate(result, left, -imm);
|
| } else {
|
| - __ SubImmediateDetectOverflow(result, left, imm, CMPRES);
|
| - __ bltz(CMPRES, deopt);
|
| + __ SubImmediateDetectOverflow(result, left, imm, CMPRES1);
|
| + __ bltz(CMPRES1, deopt);
|
| }
|
| break;
|
| }
|
| @@ -2331,8 +2365,8 @@
|
| __ AddImmediate(result, left, imm);
|
| } else {
|
| Register temp = locs()->temp(0).reg();
|
| - __ AddImmediateDetectOverflow(result, left, imm, CMPRES, temp);
|
| - __ bltz(CMPRES, deopt);
|
| + __ AddImmediateDetectOverflow(result, left, imm, CMPRES1, temp);
|
| + __ bltz(CMPRES1, deopt);
|
| }
|
| break;
|
| }
|
| @@ -2343,8 +2377,8 @@
|
| if (value == 2) {
|
| __ sll(result, left, 1);
|
| } else {
|
| - __ LoadImmediate(TMP1, value);
|
| - __ mult(left, TMP1);
|
| + __ LoadImmediate(TMP, value);
|
| + __ mult(left, TMP);
|
| __ mflo(result);
|
| }
|
| } else {
|
| @@ -2352,12 +2386,12 @@
|
| __ sra(CMPRES2, left, 31); // CMPRES2 = sign of left.
|
| __ sll(result, left, 1);
|
| } else {
|
| - __ LoadImmediate(TMP1, value);
|
| - __ mult(left, TMP1);
|
| + __ LoadImmediate(TMP, value);
|
| + __ mult(left, TMP);
|
| __ mflo(result);
|
| __ mfhi(CMPRES2);
|
| }
|
| - __ sra(CMPRES, result, 31);
|
| + __ sra(CMPRES1, result, 31);
|
| __ bne(CMPRES1, CMPRES2, deopt);
|
| }
|
| break;
|
| @@ -2398,8 +2432,8 @@
|
| if (Utils::IsUint(kImmBits, imm)) {
|
| __ andi(result, left, Immediate(imm));
|
| } else {
|
| - __ LoadImmediate(TMP1, imm);
|
| - __ and_(result, left, TMP1);
|
| + __ LoadImmediate(TMP, imm);
|
| + __ and_(result, left, TMP);
|
| }
|
| break;
|
| }
|
| @@ -2408,8 +2442,8 @@
|
| if (Utils::IsUint(kImmBits, imm)) {
|
| __ ori(result, left, Immediate(imm));
|
| } else {
|
| - __ LoadImmediate(TMP1, imm);
|
| - __ or_(result, left, TMP1);
|
| + __ LoadImmediate(TMP, imm);
|
| + __ or_(result, left, TMP);
|
| }
|
| break;
|
| }
|
| @@ -2418,8 +2452,8 @@
|
| if (Utils::IsUint(kImmBits, imm)) {
|
| __ xori(result, left, Immediate(imm));
|
| } else {
|
| - __ LoadImmediate(TMP1, imm);
|
| - __ xor_(result, left, TMP1);
|
| + __ LoadImmediate(TMP, imm);
|
| + __ xor_(result, left, TMP);
|
| }
|
| break;
|
| }
|
| @@ -2464,8 +2498,8 @@
|
| __ addu(result, left, right);
|
| } else {
|
| Register temp = locs()->temp(0).reg();
|
| - __ AdduDetectOverflow(result, left, right, CMPRES, temp);
|
| - __ bltz(CMPRES, deopt);
|
| + __ AdduDetectOverflow(result, left, right, CMPRES1, temp);
|
| + __ bltz(CMPRES1, deopt);
|
| }
|
| break;
|
| }
|
| @@ -2474,8 +2508,8 @@
|
| if (deopt == NULL) {
|
| __ subu(result, left, right);
|
| } else {
|
| - __ SubuDetectOverflow(result, left, right, CMPRES);
|
| - __ bltz(CMPRES, deopt);
|
| + __ SubuDetectOverflow(result, left, right, CMPRES1);
|
| + __ bltz(CMPRES1, deopt);
|
| }
|
| break;
|
| }
|
| @@ -2588,14 +2622,14 @@
|
| Register left = locs()->in(0).reg();
|
| Register right = locs()->in(1).reg();
|
| if (left_cid == kSmiCid) {
|
| - __ andi(CMPRES, right, Immediate(kSmiTagMask));
|
| + __ andi(CMPRES1, right, Immediate(kSmiTagMask));
|
| } else if (right_cid == kSmiCid) {
|
| - __ andi(CMPRES, left, Immediate(kSmiTagMask));
|
| + __ andi(CMPRES1, left, Immediate(kSmiTagMask));
|
| } else {
|
| __ or_(TMP, left, right);
|
| - __ andi(CMPRES, TMP, Immediate(kSmiTagMask));
|
| + __ andi(CMPRES1, TMP, Immediate(kSmiTagMask));
|
| }
|
| - __ beq(CMPRES, ZR, deopt);
|
| + __ beq(CMPRES1, ZR, deopt);
|
| }
|
|
|
|
|
| @@ -2691,8 +2725,8 @@
|
| Label* deopt = compiler->AddDeoptStub(deopt_id_, kDeoptBinaryDoubleOp);
|
| Label is_smi, done;
|
|
|
| - __ andi(CMPRES, value, Immediate(kSmiTagMask));
|
| - __ beq(CMPRES, ZR, &is_smi);
|
| + __ andi(CMPRES1, value, Immediate(kSmiTagMask));
|
| + __ beq(CMPRES1, ZR, &is_smi);
|
| __ LoadClassId(CMPRES1, value);
|
| __ BranchNotEqual(CMPRES1, kDoubleCid, deopt);
|
| __ LoadDFromOffset(result, value, Double::value_offset() - kHeapObjectTag);
|
| @@ -3150,8 +3184,8 @@
|
| case Token::kNEGATE: {
|
| Label* deopt = compiler->AddDeoptStub(deopt_id(),
|
| kDeoptUnaryOp);
|
| - __ SubuDetectOverflow(result, ZR, value, CMPRES);
|
| - __ bltz(CMPRES, deopt);
|
| + __ SubuDetectOverflow(result, ZR, value, CMPRES1);
|
| + __ bltz(CMPRES1, deopt);
|
| break;
|
| }
|
| case Token::kBIT_NOT:
|
| @@ -3233,8 +3267,8 @@
|
| Label do_call, done;
|
| // Check for overflow and that it fits into Smi.
|
| __ LoadImmediate(TMP, 0xC0000000);
|
| - __ subu(CMPRES, result, TMP);
|
| - __ bltz(CMPRES, &do_call);
|
| + __ subu(CMPRES1, result, TMP);
|
| + __ bltz(CMPRES1, &do_call);
|
| __ SmiTag(result);
|
| __ b(&done);
|
| __ Bind(&do_call);
|
| @@ -3275,8 +3309,8 @@
|
|
|
| // Check for overflow and that it fits into Smi.
|
| __ LoadImmediate(TMP, 0xC0000000);
|
| - __ subu(CMPRES, result, TMP);
|
| - __ bltz(CMPRES, deopt);
|
| + __ subu(CMPRES1, result, TMP);
|
| + __ bltz(CMPRES1, deopt);
|
| __ SmiTag(result);
|
| }
|
|
|
| @@ -3440,23 +3474,23 @@
|
| Label is_ok;
|
| intptr_t cix = 0;
|
| if (unary_checks().GetReceiverClassIdAt(cix) == kSmiCid) {
|
| - __ andi(CMPRES, value, Immediate(kSmiTagMask));
|
| - __ beq(CMPRES, ZR, &is_ok);
|
| + __ andi(CMPRES1, value, Immediate(kSmiTagMask));
|
| + __ beq(CMPRES1, ZR, &is_ok);
|
| cix++; // Skip first check.
|
| } else {
|
| - __ andi(CMPRES, value, Immediate(kSmiTagMask));
|
| - __ beq(CMPRES, ZR, deopt);
|
| + __ andi(CMPRES1, value, Immediate(kSmiTagMask));
|
| + __ beq(CMPRES1, ZR, deopt);
|
| }
|
| __ LoadClassId(temp, value);
|
| const intptr_t num_checks = unary_checks().NumberOfChecks();
|
| for (intptr_t i = cix; i < num_checks; i++) {
|
| ASSERT(unary_checks().GetReceiverClassIdAt(i) != kSmiCid);
|
| - __ LoadImmediate(TMP1, unary_checks().GetReceiverClassIdAt(i));
|
| - __ subu(CMPRES, temp, TMP1);
|
| + __ LoadImmediate(TMP, unary_checks().GetReceiverClassIdAt(i));
|
| + __ subu(CMPRES1, temp, TMP);
|
| if (i == (num_checks - 1)) {
|
| - __ bne(CMPRES, ZR, deopt);
|
| + __ bne(CMPRES1, ZR, deopt);
|
| } else {
|
| - __ beq(CMPRES, ZR, &is_ok);
|
| + __ beq(CMPRES1, ZR, &is_ok);
|
| }
|
| }
|
| __ Bind(&is_ok);
|
| @@ -3687,7 +3721,7 @@
|
| }
|
|
|
|
|
| -// The comparison result is in CMPRES.
|
| +// The comparison result is in CMPRES1.
|
| void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler,
|
| Condition true_condition) {
|
| __ TraceSimMsg("ControlInstruction::EmitBranchOnCondition");
|
| @@ -3828,9 +3862,9 @@
|
| Register result = locs()->out().reg();
|
|
|
| __ LoadObject(result, Bool::True());
|
| - __ LoadObject(TMP1, Bool::False());
|
| - __ subu(CMPRES, value, result);
|
| - __ movz(result, TMP1, CMPRES); // If value is True, move False into result.
|
| + __ LoadObject(TMP, Bool::False());
|
| + __ subu(CMPRES1, value, result);
|
| + __ movz(result, TMP, CMPRES1); // If value is True, move False into result.
|
| }
|
|
|
|
|
|
|