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 |