File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -1559,7 +1559,10 @@ void CodeGenerator::FinishFrame(Frame* frame) {
15591559
15601560 const RegList saves_fp = descriptor->CalleeSavedFPRegisters ();
15611561 if (saves_fp != 0 ) {
1562- frame->AlignFrame ();
1562+ frame->AlignSavedCalleeRegisterSlots ();
1563+ }
1564+
1565+ if (saves_fp != 0 ) {
15631566 // Save callee-saved FP registers.
15641567 STATIC_ASSERT (DwVfpRegister::kMaxNumRegisters == 32 );
15651568 uint32_t last = base::bits::CountLeadingZeros32 (saves_fp) - 1 ;
Original file line number Diff line number Diff line change @@ -98,6 +98,15 @@ class Frame : public ZoneObject {
9898 return !allocated_double_registers_->IsEmpty ();
9999 }
100100
101+ void AlignSavedCalleeRegisterSlots (int alignment = kDoubleSize ) {
102+ int alignment_slots = alignment / kPointerSize ;
103+ int delta = alignment_slots - (frame_slot_count_ & (alignment_slots - 1 ));
104+ if (delta != alignment_slots) {
105+ frame_slot_count_ += delta;
106+ }
107+ spill_slot_count_ += delta;
108+ }
109+
101110 void AllocateSavedCalleeRegisterSlots (int count) {
102111 frame_slot_count_ += count;
103112 }
Original file line number Diff line number Diff line change @@ -1822,7 +1822,10 @@ void CodeGenerator::FinishFrame(Frame* frame) {
18221822
18231823 const RegList saves_fpu = descriptor->CalleeSavedFPRegisters ();
18241824 if (saves_fpu != 0 ) {
1825- frame->AlignFrame ();
1825+ frame->AlignSavedCalleeRegisterSlots ();
1826+ }
1827+
1828+ if (saves_fpu != 0 ) {
18261829 int count = base::bits::CountPopulation32 (saves_fpu);
18271830 DCHECK (kNumCalleeSavedFPU == count);
18281831 frame->AllocateSavedCalleeRegisterSlots (count *
Original file line number Diff line number Diff line change @@ -1993,7 +1993,7 @@ void CodeGenerator::FinishFrame(Frame* frame) {
19931993
19941994 // Save callee-saved Double registers.
19951995 if (double_saves != 0 ) {
1996- frame->AlignFrame ();
1996+ frame->AlignSavedCalleeRegisterSlots ();
19971997 DCHECK (kNumCalleeSavedDoubles ==
19981998 base::bits::CountPopulation32 (double_saves));
19991999 frame->AllocateSavedCalleeRegisterSlots (kNumCalleeSavedDoubles *
Original file line number Diff line number Diff line change @@ -2015,7 +2015,7 @@ void CodeGenerator::FinishFrame(Frame* frame) {
20152015
20162016 // Save callee-saved Double registers.
20172017 if (double_saves != 0 ) {
2018- frame->AlignFrame ();
2018+ frame->AlignSavedCalleeRegisterSlots ();
20192019 DCHECK (kNumCalleeSavedDoubles ==
20202020 base::bits::CountPopulation32 (double_saves));
20212021 frame->AllocateSavedCalleeRegisterSlots (kNumCalleeSavedDoubles *
Original file line number Diff line number Diff line change @@ -2124,15 +2124,22 @@ void CodeGenerator::FinishFrame(Frame* frame) {
21242124 CallDescriptor* descriptor = linkage ()->GetIncomingDescriptor ();
21252125
21262126 const RegList saves_fp = descriptor->CalleeSavedFPRegisters ();
2127- if (saves_fp != 0 ) { // Save callee-saved XMM registers.
2128- frame->AlignFrame ();
2129- uint32_t count = base::bits::CountPopulation32 (saves_fp);
2130- frame->AllocateSavedCalleeRegisterSlots (count *
2131- (kQuadWordSize / kPointerSize ));
2127+ if (saves_fp != 0 ) {
2128+ frame->AlignSavedCalleeRegisterSlots ();
2129+ if (saves_fp != 0 ) { // Save callee-saved XMM registers.
2130+ const uint32_t saves_fp_count = base::bits::CountPopulation32 (saves_fp);
2131+ frame->AllocateSavedCalleeRegisterSlots (saves_fp_count *
2132+ (kQuadWordSize / kPointerSize ));
2133+ }
21322134 }
21332135 const RegList saves = descriptor->CalleeSavedRegisters ();
21342136 if (saves != 0 ) { // Save callee-saved registers.
2135- uint32_t count = base::bits::CountPopulation32 (saves);
2137+ int count = 0 ;
2138+ for (int i = Register::kNumRegisters - 1 ; i >= 0 ; i--) {
2139+ if (((1 << i) & saves)) {
2140+ ++count;
2141+ }
2142+ }
21362143 frame->AllocateSavedCalleeRegisterSlots (count);
21372144 }
21382145}
You can’t perform that action at this time.
0 commit comments