Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: src/compiler/arm/code-generator-arm.cc

Issue 1191513003: [turbofan] Add CalleeSavedFPRegisters to CallDescriptor. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Added ports (except ppc). Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1218 } 1239 }
1219 } 1240 }
1220 MarkLazyDeoptSite(); 1241 MarkLazyDeoptSite();
1221 } 1242 }
1222 1243
1223 #undef __ 1244 #undef __
1224 1245
1225 } // namespace compiler 1246 } // namespace compiler
1226 } // namespace internal 1247 } // namespace internal
1227 } // namespace v8 1248 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/arm/linkage-arm.cc » ('j') | src/compiler/arm64/code-generator-arm64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698