Index: src/arm64/macro-assembler-arm64.cc |
diff --git a/src/arm64/macro-assembler-arm64.cc b/src/arm64/macro-assembler-arm64.cc |
index 658497b9f76985ff64f7b9245d8063b448f70fd0..c13fba7716daca2fdc1c7c415acb69b9439bd13e 100644 |
--- a/src/arm64/macro-assembler-arm64.cc |
+++ b/src/arm64/macro-assembler-arm64.cc |
@@ -3013,12 +3013,22 @@ void MacroAssembler::TryConvertDoubleToInt64(Register result, |
void MacroAssembler::TruncateDoubleToI(Register result, |
DoubleRegister double_input) { |
Label done; |
- DCHECK(jssp.Is(StackPointer())); |
// Try to convert the double to an int64. If successful, the bottom 32 bits |
// contain our truncated int32 result. |
TryConvertDoubleToInt64(result, double_input, &done); |
+ const Register old_stack_pointer = StackPointer(); |
+ if (csp.Is(old_stack_pointer)) { |
+ // This currently only happens during compiler-unittest. If it arises |
+ // during regular code generation the DoubleToI stub should be updated to |
+ // cope with csp and have an extra parameter indicating which stack pointer |
+ // it should use. |
+ Push(jssp, xzr); // Push xzr to maintain csp required 16-bytes alignment. |
+ Mov(jssp, csp); |
+ SetStackPointer(jssp); |
+ } |
+ |
// If we fell through then inline version didn't succeed - call stub instead. |
Push(lr, double_input); |
@@ -3030,8 +3040,15 @@ void MacroAssembler::TruncateDoubleToI(Register result, |
true); // skip_fastpath |
CallStub(&stub); // DoubleToIStub preserves any registers it needs to clobber |
- Drop(1, kDoubleSize); // Drop the double input on the stack. |
- Pop(lr); |
+ DCHECK_EQ(xzr.SizeInBytes(), double_input.SizeInBytes()); |
+ Pop(xzr, lr); // xzr to drop the double input on the stack. |
+ |
+ if (csp.Is(old_stack_pointer)) { |
+ Mov(csp, jssp); |
+ SetStackPointer(csp); |
+ AssertStackConsistency(); |
+ Pop(xzr, jssp); |
+ } |
Bind(&done); |
} |