| Index: src/mips/lithium-mips.cc
|
| diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc
|
| index 1b94332320c771471abdab247d88e06d21caabc5..ba7fbd3f4fdc18b70aa1af35fecf0e35121780fc 100644
|
| --- a/src/mips/lithium-mips.cc
|
| +++ b/src/mips/lithium-mips.cc
|
| @@ -41,24 +41,6 @@ namespace internal {
|
| LITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
|
| #undef DEFINE_COMPILE
|
|
|
| -LOsrEntry::LOsrEntry() {
|
| - for (int i = 0; i < Register::NumAllocatableRegisters(); ++i) {
|
| - register_spills_[i] = NULL;
|
| - }
|
| - for (int i = 0; i < DoubleRegister::NumAllocatableRegisters(); ++i) {
|
| - double_register_spills_[i] = NULL;
|
| - }
|
| -}
|
| -
|
| -
|
| -void LOsrEntry::MarkSpilledRegister(int allocation_index,
|
| - LOperand* spill_operand) {
|
| - ASSERT(spill_operand->IsStackSlot());
|
| - ASSERT(register_spills_[allocation_index] == NULL);
|
| - register_spills_[allocation_index] = spill_operand;
|
| -}
|
| -
|
| -
|
| #ifdef DEBUG
|
| void LInstruction::VerifyCall() {
|
| // Call instructions can use only fixed registers as temporaries and
|
| @@ -81,14 +63,6 @@ void LInstruction::VerifyCall() {
|
| #endif
|
|
|
|
|
| -void LOsrEntry::MarkSpilledDoubleRegister(int allocation_index,
|
| - LOperand* spill_operand) {
|
| - ASSERT(spill_operand->IsDoubleStackSlot());
|
| - ASSERT(double_register_spills_[allocation_index] == NULL);
|
| - double_register_spills_[allocation_index] = spill_operand;
|
| -}
|
| -
|
| -
|
| void LInstruction::PrintTo(StringStream* stream) {
|
| stream->Add("%s ", this->Mnemonic());
|
|
|
| @@ -455,7 +429,7 @@ LOperand* LPlatformChunk::GetNextSpillSlot(bool is_double) {
|
| LPlatformChunk* LChunkBuilder::Build() {
|
| ASSERT(is_unused());
|
| chunk_ = new(zone()) LPlatformChunk(info(), graph());
|
| - HPhase phase("L_Building chunk", chunk_);
|
| + LPhase phase("L_Building chunk", chunk_);
|
| status_ = BUILDING;
|
| const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
|
| for (int i = 0; i < blocks->length(); i++) {
|
| @@ -1003,10 +977,13 @@ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
|
|
|
| LBranch* result = new(zone()) LBranch(UseRegister(value));
|
| // Tagged values that are not known smis or booleans require a
|
| - // deoptimization environment.
|
| + // deoptimization environment. If the instruction is generic no
|
| + // environment is needed since all cases are handled.
|
| Representation rep = value->representation();
|
| HType type = value->type();
|
| - if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean()) {
|
| + ToBooleanStub::Types expected = instr->expected_input_types();
|
| + if (rep.IsTagged() && !type.IsSmi() && !type.IsBoolean() &&
|
| + !expected.IsGeneric()) {
|
| return AssignEnvironment(result);
|
| }
|
| return result;
|
| @@ -1437,6 +1414,10 @@ LInstruction* LChunkBuilder::DoMod(HMod* instr) {
|
| instr->CheckFlag(HValue::kBailoutOnMinusZero))
|
| ? AssignEnvironment(result)
|
| : result;
|
| + } else if (instr->fixed_right_arg().has_value) {
|
| + LModI* mod = new(zone()) LModI(UseRegisterAtStart(left),
|
| + UseRegisterAtStart(right));
|
| + return AssignEnvironment(DefineAsRegister(mod));
|
| } else {
|
| LModI* mod = new(zone()) LModI(UseRegister(left),
|
| UseRegister(right),
|
| @@ -1939,7 +1920,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
|
| }
|
|
|
|
|
| -LInstruction* LChunkBuilder::DoCheckNonSmi(HCheckNonSmi* instr) {
|
| +LInstruction* LChunkBuilder::DoCheckHeapObject(HCheckHeapObject* instr) {
|
| LOperand* value = UseRegisterAtStart(instr->value());
|
| return AssignEnvironment(new(zone()) LCheckNonSmi(value));
|
| }
|
| @@ -2338,6 +2319,14 @@ LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) {
|
| }
|
|
|
|
|
| +LInstruction* LChunkBuilder::DoAllocateObject(HAllocateObject* instr) {
|
| + info()->MarkAsDeferredCalling();
|
| + LAllocateObject* result =
|
| + new(zone()) LAllocateObject(TempRegister(), TempRegister());
|
| + return AssignPointerMap(DefineAsRegister(result));
|
| +}
|
| +
|
| +
|
| LInstruction* LChunkBuilder::DoAllocate(HAllocate* instr) {
|
| info()->MarkAsDeferredCalling();
|
| LOperand* size = instr->size()->IsConstant()
|
|
|