Chromium Code Reviews| Index: src/compiler/arm64/code-generator-arm64.cc |
| diff --git a/src/compiler/arm64/code-generator-arm64.cc b/src/compiler/arm64/code-generator-arm64.cc |
| index 928b2c6dbb93dfd7658334eeed810a72a2d161cf..6e90c0529e6c4a3b7fb8530eb4d3d1f06850e727 100644 |
| --- a/src/compiler/arm64/code-generator-arm64.cc |
| +++ b/src/compiler/arm64/code-generator-arm64.cc |
| @@ -877,12 +877,22 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) { |
| } |
| case kArm64Poke: { |
| Operand operand(i.InputInt32(1) * kPointerSize); |
| - __ Poke(i.InputRegister(0), operand); |
| + if (instr->InputAt(0)->IsDoubleRegister()) { |
| + __ Poke(i.InputFloat64Register(0), operand); |
| + } else { |
| + __ Poke(i.InputRegister(0), operand); |
| + } |
| break; |
| } |
| case kArm64PokePair: { |
| int slot = i.InputInt32(2) - 1; |
| - __ PokePair(i.InputRegister(1), i.InputRegister(0), slot * kPointerSize); |
| + if (instr->InputAt(0)->IsDoubleRegister()) { |
| + __ PokePair(i.InputFloat64Register(1), i.InputFloat64Register(0), |
|
jbramley
2015/12/03 11:22:34
Consider: DCHECK(instr->InputAt(1)->IsDoubleRegist
ahaas
2015/12/03 15:25:06
I didn't add this DCHECK because i.InputFloat64Reg
|
| + slot * kPointerSize); |
| + } else { |
| + __ PokePair(i.InputRegister(1), i.InputRegister(0), |
| + slot * kPointerSize); |
| + } |
| break; |
| } |
| case kArm64Clz: |
| @@ -1292,9 +1302,16 @@ void CodeGenerator::AssemblePrologue() { |
| __ SetStackPointer(jssp); |
| __ Prologue(info->IsCodePreAgingActive()); |
| } else if (frame()->needs_frame()) { |
| - __ SetStackPointer(jssp); |
| + if (descriptor->UseNativeStack()) { |
| + __ SetStackPointer(csp); |
| + } else { |
| + __ SetStackPointer(jssp); |
| + } |
| __ StubPrologue(); |
| } else { |
| + if (descriptor->UseNativeStack()) { |
| + __ SetStackPointer(csp); |
|
jbramley
2015/12/03 11:22:34
Is it jssp by default? (I can't remember.) If it i
titzer
2015/12/03 11:31:59
Actually, I think it's best to be explicit in both
ahaas
2015/12/03 15:25:06
Done, I made it explicit in both cases.
|
| + } |
| frame()->SetElidedFrameSizeInSlots(0); |
| } |
| frame_access_state()->SetFrameAccessToDefault(); |
| @@ -1315,9 +1332,10 @@ void CodeGenerator::AssemblePrologue() { |
| stack_shrink_slots -= OsrHelper(info()).UnoptimizedFrameSlots(); |
| } |
| - if (csp.Is(masm()->StackPointer())) { |
| + if (csp.Is(masm()->StackPointer()) && !descriptor->UseNativeStack()) { |
|
jbramley
2015/12/03 11:22:34
Why not for the UseNativeStack() case?
In particu
ahaas
2015/12/03 15:25:06
The additional condition is required because Align
|
| // The system stack pointer requires 16-byte alignment at function call |
| // boundaries. |
| + |
| stack_shrink_slots += frame()->AlignSavedCalleeRegisterSlots(); |
| } |
| __ Claim(stack_shrink_slots); |
| @@ -1374,9 +1392,18 @@ void CodeGenerator::AssembleReturn() { |
| return; |
| } else { |
| __ Bind(&return_label_); |
| - __ Mov(jssp, fp); |
| + if (descriptor->UseNativeStack()) { |
| + __ Mov(csp, fp); |
| + } else { |
| + __ Mov(jssp, fp); |
| + } |
| __ Pop(fp, lr); |
| } |
| + } else if (descriptor->UseNativeStack()) { |
| + bool pop_count_uneven = pop_count & 1; |
| + if (pop_count_uneven) { |
| + pop_count++; |
| + } |
|
jbramley
2015/12/03 11:22:34
Why not just "pop_count += (pop_count & 1)"?
ahaas
2015/12/03 15:25:06
Done.
|
| } |
| __ Drop(pop_count); |
| __ Ret(); |