OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/code-generator.h" | 5 #include "src/compiler/code-generator.h" |
6 #include "src/compilation-info.h" | 6 #include "src/compilation-info.h" |
7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/osr.h" | 10 #include "src/compiler/osr.h" |
(...skipping 695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
706 int deopt_state_id = | 706 int deopt_state_id = |
707 BuildTranslation(instr, -1, 0, OutputFrameStateCombine::Ignore()); | 707 BuildTranslation(instr, -1, 0, OutputFrameStateCombine::Ignore()); |
708 Deoptimizer::BailoutType bailout_type = | 708 Deoptimizer::BailoutType bailout_type = |
709 Deoptimizer::BailoutType(MiscField::decode(instr->opcode())); | 709 Deoptimizer::BailoutType(MiscField::decode(instr->opcode())); |
710 CodeGenResult result = AssembleDeoptimizerCall( | 710 CodeGenResult result = AssembleDeoptimizerCall( |
711 deopt_state_id, bailout_type, current_source_position_); | 711 deopt_state_id, bailout_type, current_source_position_); |
712 if (result != kSuccess) return result; | 712 if (result != kSuccess) return result; |
713 break; | 713 break; |
714 } | 714 } |
715 case kArchRet: | 715 case kArchRet: |
716 AssembleReturn(); | 716 AssembleReturn(instr->InputAt(0)); |
717 break; | 717 break; |
718 case kArchStackPointer: | 718 case kArchStackPointer: |
719 __ mov(i.OutputRegister(), sp); | 719 __ mov(i.OutputRegister(), sp); |
720 break; | 720 break; |
721 case kArchFramePointer: | 721 case kArchFramePointer: |
722 __ mov(i.OutputRegister(), fp); | 722 __ mov(i.OutputRegister(), fp); |
723 break; | 723 break; |
724 case kArchParentFramePointer: | 724 case kArchParentFramePointer: |
725 if (frame_access_state()->has_frame()) { | 725 if (frame_access_state()->has_frame()) { |
726 __ lw(i.OutputRegister(), MemOperand(fp, 0)); | 726 __ lw(i.OutputRegister(), MemOperand(fp, 0)); |
(...skipping 1230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1957 } | 1957 } |
1958 | 1958 |
1959 const RegList saves = descriptor->CalleeSavedRegisters(); | 1959 const RegList saves = descriptor->CalleeSavedRegisters(); |
1960 if (saves != 0) { | 1960 if (saves != 0) { |
1961 // Save callee-saved registers. | 1961 // Save callee-saved registers. |
1962 __ MultiPush(saves); | 1962 __ MultiPush(saves); |
1963 DCHECK(kNumCalleeSaved == base::bits::CountPopulation32(saves) + 1); | 1963 DCHECK(kNumCalleeSaved == base::bits::CountPopulation32(saves) + 1); |
1964 } | 1964 } |
1965 } | 1965 } |
1966 | 1966 |
1967 | 1967 void CodeGenerator::AssembleReturn(InstructionOperand* pop) { |
1968 void CodeGenerator::AssembleReturn() { | |
1969 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); | 1968 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
1970 int pop_count = static_cast<int>(descriptor->StackParameterCount()); | 1969 int pop_count = static_cast<int>(descriptor->StackParameterCount()); |
1971 | 1970 |
1972 // Restore GP registers. | 1971 // Restore GP registers. |
1973 const RegList saves = descriptor->CalleeSavedRegisters(); | 1972 const RegList saves = descriptor->CalleeSavedRegisters(); |
1974 if (saves != 0) { | 1973 if (saves != 0) { |
1975 __ MultiPop(saves); | 1974 __ MultiPop(saves); |
1976 } | 1975 } |
1977 | 1976 |
1978 // Restore FPU registers. | 1977 // Restore FPU registers. |
1979 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters(); | 1978 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters(); |
1980 if (saves_fpu != 0) { | 1979 if (saves_fpu != 0) { |
1981 __ MultiPopFPU(saves_fpu); | 1980 __ MultiPopFPU(saves_fpu); |
1982 } | 1981 } |
1983 | 1982 |
1984 if (descriptor->IsCFunctionCall()) { | 1983 if (descriptor->IsCFunctionCall()) { |
1985 AssembleDeconstructFrame(); | 1984 AssembleDeconstructFrame(); |
1986 } else if (frame_access_state()->has_frame()) { | 1985 } else if (frame_access_state()->has_frame()) { |
1987 // Canonicalize JSFunction return sites for now. | 1986 // Canonicalize JSFunction return sites for now. |
1988 if (return_label_.is_bound()) { | 1987 if (return_label_.is_bound()) { |
1989 __ Branch(&return_label_); | 1988 __ Branch(&return_label_); |
1990 return; | 1989 return; |
1991 } else { | 1990 } else { |
1992 __ bind(&return_label_); | 1991 __ bind(&return_label_); |
1993 AssembleDeconstructFrame(); | 1992 AssembleDeconstructFrame(); |
1994 } | 1993 } |
1995 } | 1994 } |
| 1995 MipsOperandConverter g(this, nullptr); |
| 1996 if (pop->IsImmediate()) { |
| 1997 DCHECK_EQ(Constant::kInt32, g.ToConstant(pop).type()); |
| 1998 pop_count += g.ToConstant(pop).ToInt32(); |
| 1999 } else { |
| 2000 Register pop_reg = g.ToRegister(pop); |
| 2001 __ sll(pop_reg, pop_reg, Operand(kPointerSizeLog2)); |
| 2002 __ addu(sp, sp, Operand(pop_reg)); |
| 2003 } |
1996 if (pop_count != 0) { | 2004 if (pop_count != 0) { |
1997 __ DropAndRet(pop_count); | 2005 __ DropAndRet(pop_count); |
1998 } else { | 2006 } else { |
1999 __ Ret(); | 2007 __ Ret(); |
2000 } | 2008 } |
2001 } | 2009 } |
2002 | 2010 |
2003 | 2011 |
2004 void CodeGenerator::AssembleMove(InstructionOperand* source, | 2012 void CodeGenerator::AssembleMove(InstructionOperand* source, |
2005 InstructionOperand* destination) { | 2013 InstructionOperand* destination) { |
(...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2255 padding_size -= v8::internal::Assembler::kInstrSize; | 2263 padding_size -= v8::internal::Assembler::kInstrSize; |
2256 } | 2264 } |
2257 } | 2265 } |
2258 } | 2266 } |
2259 | 2267 |
2260 #undef __ | 2268 #undef __ |
2261 | 2269 |
2262 } // namespace compiler | 2270 } // namespace compiler |
2263 } // namespace internal | 2271 } // namespace internal |
2264 } // namespace v8 | 2272 } // namespace v8 |
OLD | NEW |