Skip to content

Commit d22addf

Browse files
Ryan Diazv8-scoped@luci-project-accounts.iam.gserviceaccount.com
authored andcommitted
[x64-stack-align] Update frame constants and ArgumentPaddingSlots for 16-byte stack alignment
Establishes the shared frame-layout contract (ArgumentPaddingSlots, RegisterStackSlotCount, PaddingSlotCount, and the kNumExtraArgs constants) behind V8_X64_16BYTE_STACK_ALIGNMENT_BOOL before we update the code generators to actually emit the padding. Bug: 42212385 Change-Id: If4cc580f31d846874bac8caf872fbbf717abaf50 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/8489600 Reviewed-by: Jakob Kummerow <jkummerow@chromium.org> Auto-Submit: Ryan Diaz <ryandiaz@chromium.org> Commit-Queue: Jakob Kummerow <jkummerow@chromium.org> Cr-Commit-Position: refs/heads/main@{#110241}
1 parent 88619b0 commit d22addf

5 files changed

Lines changed: 19 additions & 12 deletions

File tree

‎src/builtins/builtins-utils.h‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,15 @@ class BuiltinArguments : public JavaScriptArguments {
5959
static constexpr int kTargetIndex = 1;
6060
static constexpr int kArgcIndex = 2;
6161

62-
// This padding is required only on arm64 to keep the SP 16-byte aligned.
62+
// This padding is required on arm64 (and x64 with 16-byte stack alignment) to
63+
// keep the SP 16-byte aligned.
6364
static constexpr int kOptionalPaddingIndex = 3;
64-
#if V8_TARGET_ARCH_ARM64
65+
#if V8_TARGET_ARCH_ARM64 || \
66+
(V8_TARGET_ARCH_X64 && V8_X64_16BYTE_STACK_ALIGNMENT_BOOL)
6567
static constexpr int kNumExtraArgs = 4;
6668
#else
6769
static constexpr int kNumExtraArgs = 3;
68-
#endif // V8_TARGET_ARCH_ARM64
70+
#endif
6971

7072
static constexpr int kNumExtraArgsWithReceiver = kNumExtraArgs + 1;
7173

‎src/builtins/superspread.h‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ namespace v8 {
1111
namespace internal {
1212

1313
struct SuperSpreadArgs {
14-
#ifdef V8_TARGET_ARCH_ARM64
14+
#if V8_TARGET_ARCH_ARM64 || \
15+
(V8_TARGET_ARCH_X64 && V8_X64_16BYTE_STACK_ALIGNMENT_BOOL)
1516
static constexpr int kNumExtraArgs = 5;
1617
#else
1718
static constexpr int kNumExtraArgs = 4;

‎src/codegen/x64/register-x64.h‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,7 @@ constexpr int kRegisterPassedArguments = arraysize(kCArgRegs);
252252

253253
// Returns the number of padding slots needed for stack pointer alignment.
254254
constexpr int ArgumentPaddingSlots(int argument_count) {
255-
// No argument padding required.
256-
return 0;
255+
return V8_X64_16BYTE_STACK_ALIGNMENT_BOOL ? (argument_count & 1) : 0;
257256
}
258257

259258
constexpr AliasingKind kFPAliasing = AliasingKind::kOverlap;

‎src/execution/frame-constants.h‎

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -501,13 +501,15 @@ class BuiltinExitFrameConstants : public ExitFrameConstants {
501501
static constexpr int kTargetIndex = 1;
502502
static constexpr int kArgcIndex = 2;
503503

504-
// This padding is required only on arm64 to keep the SP 16-byte aligned.
504+
// This padding is required on arm64 (and x64 with 16-byte stack alignment) to
505+
// keep the SP 16-byte aligned.
505506
static constexpr int kOptionalPaddingIndex = 3;
506-
#if V8_TARGET_ARCH_ARM64
507+
#if V8_TARGET_ARCH_ARM64 || \
508+
(V8_TARGET_ARCH_X64 && V8_X64_16BYTE_STACK_ALIGNMENT_BOOL)
507509
static constexpr int kNumExtraArgs = 4;
508510
#else
509511
static constexpr int kNumExtraArgs = 3;
510-
#endif // V8_TARGET_ARCH_ARM64
512+
#endif
511513

512514
static constexpr int kNumExtraArgsWithReceiver = kNumExtraArgs + 1;
513515

‎src/execution/x64/frame-constants-x64.cc‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,15 @@ Register JavaScriptFrame::context_register() { return rsi; }
1818
Register JavaScriptFrame::constant_pool_pointer_register() { UNREACHABLE(); }
1919

2020
int UnoptimizedFrameConstants::RegisterStackSlotCount(int register_count) {
21-
return register_count;
21+
return V8_X64_16BYTE_STACK_ALIGNMENT_BOOL ? RoundUp(register_count, 2)
22+
: register_count;
2223
}
2324

2425
int BuiltinContinuationFrameConstants::PaddingSlotCount(int register_count) {
25-
USE(register_count);
26-
return 0;
26+
return V8_X64_16BYTE_STACK_ALIGNMENT_BOOL
27+
? (RoundUp(kFixedSlotCount + register_count, 2) -
28+
(kFixedSlotCount + register_count))
29+
: 0;
2730
}
2831

2932
// static

0 commit comments

Comments
 (0)