| 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 | 6 |
| 7 #include "src/arm/macro-assembler-arm.h" | 7 #include "src/arm/macro-assembler-arm.h" |
| 8 #include "src/compiler/code-generator-impl.h" | 8 #include "src/compiler/code-generator-impl.h" |
| 9 #include "src/compiler/gap-resolver.h" | 9 #include "src/compiler/gap-resolver.h" |
| 10 #include "src/compiler/node-matchers.h" | 10 #include "src/compiler/node-matchers.h" |
| (...skipping 922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 933 if (FLAG_enable_embedded_constant_pool) { | 933 if (FLAG_enable_embedded_constant_pool) { |
| 934 __ Push(lr, fp, pp); | 934 __ Push(lr, fp, pp); |
| 935 // Adjust FP to point to saved FP. | 935 // Adjust FP to point to saved FP. |
| 936 __ sub(fp, sp, Operand(StandardFrameConstants::kConstantPoolOffset)); | 936 __ sub(fp, sp, Operand(StandardFrameConstants::kConstantPoolOffset)); |
| 937 saved_pp = true; | 937 saved_pp = true; |
| 938 } else { | 938 } else { |
| 939 __ Push(lr, fp); | 939 __ Push(lr, fp); |
| 940 __ mov(fp, sp); | 940 __ mov(fp, sp); |
| 941 saved_pp = false; | 941 saved_pp = false; |
| 942 } | 942 } |
| 943 int register_save_area_size = saved_pp ? kPointerSize : 0; |
| 943 const RegList saves = descriptor->CalleeSavedRegisters(); | 944 const RegList saves = descriptor->CalleeSavedRegisters(); |
| 944 if (saves != 0 || saved_pp) { | 945 if (saves != 0 || saved_pp) { |
| 945 // Save callee-saved registers. | 946 // Save callee-saved registers. |
| 946 int register_save_area_size = saved_pp ? kPointerSize : 0; | 947 __ stm(db_w, sp, saves); |
| 947 for (int i = Register::kNumRegisters - 1; i >= 0; i--) { | 948 register_save_area_size += |
| 948 if (!((1 << i) & saves)) continue; | 949 kPointerSize * base::bits::CountPopulation32(saves); |
| 949 register_save_area_size += kPointerSize; | 950 } |
| 950 } | 951 const RegList saves_fp = descriptor->CalleeSavedFPRegisters(); |
| 952 if (saves_fp != 0) { |
| 953 // Save callee-saved FP registers. |
| 954 DCHECK(DwVfpRegister::kMaxNumRegisters == 32); |
| 955 uint32_t last = base::bits::CountLeadingZeros32(saves_fp) - 1; |
| 956 uint32_t first = base::bits::CountTrailingZeros32(saves_fp); |
| 957 DCHECK((last - first + 1) == base::bits::CountPopulation32(saves_fp)); |
| 958 |
| 959 __ vstm(db_w, sp, DwVfpRegister::from_code(first), |
| 960 DwVfpRegister::from_code(last)); |
| 961 register_save_area_size += 2 * kPointerSize * (last - first + 1); |
| 962 } |
| 963 if (register_save_area_size > 0) { |
| 951 frame()->SetRegisterSaveAreaSize(register_save_area_size); | 964 frame()->SetRegisterSaveAreaSize(register_save_area_size); |
| 952 __ stm(db_w, sp, saves); | |
| 953 } | 965 } |
| 954 } else if (descriptor->IsJSFunctionCall()) { | 966 } else if (descriptor->IsJSFunctionCall()) { |
| 955 CompilationInfo* info = this->info(); | 967 CompilationInfo* info = this->info(); |
| 956 __ Prologue(info->IsCodePreAgingActive()); | 968 __ Prologue(info->IsCodePreAgingActive()); |
| 957 frame()->SetRegisterSaveAreaSize( | 969 frame()->SetRegisterSaveAreaSize( |
| 958 StandardFrameConstants::kFixedFrameSizeFromFp); | 970 StandardFrameConstants::kFixedFrameSizeFromFp); |
| 959 } else if (needs_frame_) { | 971 } else if (needs_frame_) { |
| 960 __ StubPrologue(); | 972 __ StubPrologue(); |
| 961 frame()->SetRegisterSaveAreaSize( | 973 frame()->SetRegisterSaveAreaSize( |
| 962 StandardFrameConstants::kFixedFrameSizeFromFp); | 974 StandardFrameConstants::kFixedFrameSizeFromFp); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 986 | 998 |
| 987 void CodeGenerator::AssembleReturn() { | 999 void CodeGenerator::AssembleReturn() { |
| 988 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); | 1000 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); |
| 989 int stack_slots = frame()->GetSpillSlotCount(); | 1001 int stack_slots = frame()->GetSpillSlotCount(); |
| 990 if (descriptor->kind() == CallDescriptor::kCallAddress) { | 1002 if (descriptor->kind() == CallDescriptor::kCallAddress) { |
| 991 if (frame()->GetRegisterSaveAreaSize() > 0) { | 1003 if (frame()->GetRegisterSaveAreaSize() > 0) { |
| 992 // Remove this frame's spill slots first. | 1004 // Remove this frame's spill slots first. |
| 993 if (stack_slots > 0) { | 1005 if (stack_slots > 0) { |
| 994 __ add(sp, sp, Operand(stack_slots * kPointerSize)); | 1006 __ add(sp, sp, Operand(stack_slots * kPointerSize)); |
| 995 } | 1007 } |
| 1008 // Restore FP registers. |
| 1009 const RegList saves_fp = descriptor->CalleeSavedFPRegisters(); |
| 1010 if (saves_fp != 0) { |
| 1011 DCHECK(DwVfpRegister::kMaxNumRegisters == 32); |
| 1012 uint32_t last = base::bits::CountLeadingZeros32(saves_fp) - 1; |
| 1013 uint32_t first = base::bits::CountTrailingZeros32(saves_fp); |
| 1014 __ vldm(ia_w, sp, DwVfpRegister::from_code(first), |
| 1015 DwVfpRegister::from_code(last)); |
| 1016 } |
| 996 // Restore registers. | 1017 // Restore registers. |
| 997 const RegList saves = descriptor->CalleeSavedRegisters(); | 1018 const RegList saves = descriptor->CalleeSavedRegisters(); |
| 998 if (saves != 0) { | 1019 if (saves != 0) { |
| 999 __ ldm(ia_w, sp, saves); | 1020 __ ldm(ia_w, sp, saves); |
| 1000 } | 1021 } |
| 1001 } | 1022 } |
| 1002 __ LeaveFrame(StackFrame::MANUAL); | 1023 __ LeaveFrame(StackFrame::MANUAL); |
| 1003 __ Ret(); | 1024 __ Ret(); |
| 1004 } else if (descriptor->IsJSFunctionCall() || needs_frame_) { | 1025 } else if (descriptor->IsJSFunctionCall() || needs_frame_) { |
| 1005 __ LeaveFrame(StackFrame::MANUAL); | 1026 __ LeaveFrame(StackFrame::MANUAL); |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1217 } | 1238 } |
| 1218 } | 1239 } |
| 1219 } | 1240 } |
| 1220 } | 1241 } |
| 1221 | 1242 |
| 1222 #undef __ | 1243 #undef __ |
| 1223 | 1244 |
| 1224 } // namespace compiler | 1245 } // namespace compiler |
| 1225 } // namespace internal | 1246 } // namespace internal |
| 1226 } // namespace v8 | 1247 } // namespace v8 |
| OLD | NEW |