| 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 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 int deopt_state_id = | 702 int deopt_state_id = |
| 703 BuildTranslation(instr, -1, 0, OutputFrameStateCombine::Ignore()); | 703 BuildTranslation(instr, -1, 0, OutputFrameStateCombine::Ignore()); |
| 704 Deoptimizer::BailoutType bailout_type = | 704 Deoptimizer::BailoutType bailout_type = |
| 705 Deoptimizer::BailoutType(MiscField::decode(instr->opcode())); | 705 Deoptimizer::BailoutType(MiscField::decode(instr->opcode())); |
| 706 CodeGenResult result = AssembleDeoptimizerCall( | 706 CodeGenResult result = AssembleDeoptimizerCall( |
| 707 deopt_state_id, bailout_type, current_source_position_); | 707 deopt_state_id, bailout_type, current_source_position_); |
| 708 if (result != kSuccess) return result; | 708 if (result != kSuccess) return result; |
| 709 break; | 709 break; |
| 710 } | 710 } |
| 711 case kArchRet: | 711 case kArchRet: |
| 712 AssembleReturn(instr->InputAt(0)); | 712 AssembleReturn(); |
| 713 break; | 713 break; |
| 714 case kArchStackPointer: | 714 case kArchStackPointer: |
| 715 __ mov(i.OutputRegister(), sp); | 715 __ mov(i.OutputRegister(), sp); |
| 716 break; | 716 break; |
| 717 case kArchFramePointer: | 717 case kArchFramePointer: |
| 718 __ mov(i.OutputRegister(), fp); | 718 __ mov(i.OutputRegister(), fp); |
| 719 break; | 719 break; |
| 720 case kArchParentFramePointer: | 720 case kArchParentFramePointer: |
| 721 if (frame_access_state()->has_frame()) { | 721 if (frame_access_state()->has_frame()) { |
| 722 __ lw(i.OutputRegister(), MemOperand(fp, 0)); | 722 __ lw(i.OutputRegister(), MemOperand(fp, 0)); |
| (...skipping 1230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1953 } | 1953 } |
| 1954 | 1954 |
| 1955 const RegList saves = descriptor->CalleeSavedRegisters(); | 1955 const RegList saves = descriptor->CalleeSavedRegisters(); |
| 1956 if (saves != 0) { | 1956 if (saves != 0) { |
| 1957 // Save callee-saved registers. | 1957 // Save callee-saved registers. |
| 1958 __ MultiPush(saves); | 1958 __ MultiPush(saves); |
| 1959 DCHECK(kNumCalleeSaved == base::bits::CountPopulation32(saves) + 1); | 1959 DCHECK(kNumCalleeSaved == base::bits::CountPopulation32(saves) + 1); |
| 1960 } | 1960 } |
| 1961 } | 1961 } |
| 1962 | 1962 |
| 1963 void CodeGenerator::AssembleReturn(InstructionOperand* pop) { | 1963 |
| 1964 void CodeGenerator::AssembleReturn() { |
| 1964 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); | 1965 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
| 1965 int pop_count = static_cast<int>(descriptor->StackParameterCount()); | 1966 int pop_count = static_cast<int>(descriptor->StackParameterCount()); |
| 1966 | 1967 |
| 1967 // Restore GP registers. | 1968 // Restore GP registers. |
| 1968 const RegList saves = descriptor->CalleeSavedRegisters(); | 1969 const RegList saves = descriptor->CalleeSavedRegisters(); |
| 1969 if (saves != 0) { | 1970 if (saves != 0) { |
| 1970 __ MultiPop(saves); | 1971 __ MultiPop(saves); |
| 1971 } | 1972 } |
| 1972 | 1973 |
| 1973 // Restore FPU registers. | 1974 // Restore FPU registers. |
| 1974 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters(); | 1975 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters(); |
| 1975 if (saves_fpu != 0) { | 1976 if (saves_fpu != 0) { |
| 1976 __ MultiPopFPU(saves_fpu); | 1977 __ MultiPopFPU(saves_fpu); |
| 1977 } | 1978 } |
| 1978 | 1979 |
| 1979 MipsOperandConverter g(this, nullptr); | |
| 1980 if (descriptor->IsCFunctionCall()) { | 1980 if (descriptor->IsCFunctionCall()) { |
| 1981 AssembleDeconstructFrame(); | 1981 AssembleDeconstructFrame(); |
| 1982 } else if (frame_access_state()->has_frame()) { | 1982 } else if (frame_access_state()->has_frame()) { |
| 1983 // Canonicalize JSFunction return sites for now unless they have an variable | 1983 // Canonicalize JSFunction return sites for now. |
| 1984 // number of stack slot pops. | 1984 if (return_label_.is_bound()) { |
| 1985 if (pop->IsImmediate() && g.ToConstant(pop).ToInt32() == 0) { | 1985 __ Branch(&return_label_); |
| 1986 if (return_label_.is_bound()) { | 1986 return; |
| 1987 __ Branch(&return_label_); | |
| 1988 return; | |
| 1989 } else { | |
| 1990 __ bind(&return_label_); | |
| 1991 AssembleDeconstructFrame(); | |
| 1992 } | |
| 1993 } else { | 1987 } else { |
| 1988 __ bind(&return_label_); |
| 1994 AssembleDeconstructFrame(); | 1989 AssembleDeconstructFrame(); |
| 1995 } | 1990 } |
| 1996 } | 1991 } |
| 1997 if (pop->IsImmediate()) { | |
| 1998 DCHECK_EQ(Constant::kInt32, g.ToConstant(pop).type()); | |
| 1999 pop_count += g.ToConstant(pop).ToInt32(); | |
| 2000 } else { | |
| 2001 Register pop_reg = g.ToRegister(pop); | |
| 2002 __ sll(pop_reg, pop_reg, kPointerSizeLog2); | |
| 2003 __ Addu(sp, sp, Operand(pop_reg)); | |
| 2004 } | |
| 2005 if (pop_count != 0) { | 1992 if (pop_count != 0) { |
| 2006 __ DropAndRet(pop_count); | 1993 __ DropAndRet(pop_count); |
| 2007 } else { | 1994 } else { |
| 2008 __ Ret(); | 1995 __ Ret(); |
| 2009 } | 1996 } |
| 2010 } | 1997 } |
| 2011 | 1998 |
| 2012 | 1999 |
| 2013 void CodeGenerator::AssembleMove(InstructionOperand* source, | 2000 void CodeGenerator::AssembleMove(InstructionOperand* source, |
| 2014 InstructionOperand* destination) { | 2001 InstructionOperand* destination) { |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2264 padding_size -= v8::internal::Assembler::kInstrSize; | 2251 padding_size -= v8::internal::Assembler::kInstrSize; |
| 2265 } | 2252 } |
| 2266 } | 2253 } |
| 2267 } | 2254 } |
| 2268 | 2255 |
| 2269 #undef __ | 2256 #undef __ |
| 2270 | 2257 |
| 2271 } // namespace compiler | 2258 } // namespace compiler |
| 2272 } // namespace internal | 2259 } // namespace internal |
| 2273 } // namespace v8 | 2260 } // namespace v8 |
| OLD | NEW |