vak: (Знайка)
[personal profile] vak
Держи голову в холоде, живот в голоде, а ноги в тепле стек выровненным.

Некоторые архитектуры ЦП требуют, чтобы указатель стека (SP) оставался выровненным по 16-байтовой границе. Это требование обеспечивает эффективный доступ к памяти, особенно для векторных/SIMD-операций, и помогает предотвратить ошибки выравнивания в некоторых случаях. Обратите внимание, что «всегда» обычно означает сохранение этого выравнивания во время нормального выполнения (например, при входе/выходе из функции и для стековых кадров), хотя временные нарушения выравнивания могут возникать во время кода пролога/эпилога.

Вот архитектуры, требующие этого:
  • x86-64 (AMD64): ABI System V требует 16-байтового выравнивания стека перед вызовами функций и в большинстве областей кода, в первую очередь для поддержки инструкций SSE/AVX, требующих выровненной памяти.
  • AArch64 (ARM64): Указатель стека всегда должен быть выровнен по 16 байтам, с аппаратной поддержкой генерации ошибки выравнивания в случае невыровненного выравнивания (через бит SCTLR,SA).
  • PowerPC64: ABI ELF требует, чтобы указатель стека всегда поддерживал выравнивание по четырём словам (16 байт).
  • RISC-V (64-бит): Стандартный ABI требует выравнивания указателя стека по 16 байтам (128 бит), особенно в реализациях с аппаратной поддержкой операций с плавающей запятой.
  • SPARC64: ABI определяет, что указатели стека и фрейма должны быть выровнены по 128-битной (16 байт) границе.
  • IA-64 (Itanium): Указатель стека всегда должен указывать на выровненный по 16 байтам адрес, согласно программным соглашениям.
Другие архитектуры не имеют такого 16-байтового требования, такие как 32-битная ARM (выравнивание обычно 4 или 8 байт), MIPS (8-байт для mips64) или 32-битная x86 (4 байта).

Date: 2025-10-18 22:21 (UTC)
kkapp: (Default)
From: [personal profile] kkapp
В AVX кстати есть отдельные инструкции загрузки в/из памяти по невыровненным указателям, типа https://www.felixcloutier.com/x86/movdqu:vmovdqu8:vmovdqu16:vmovdqu32:vmovdqu64.

Date: 2025-10-19 01:37 (UTC)
x86128: (Default)
From: [personal profile] x86128
Я так понимаю это вылезло в ходе отладки компилятора Би? 😉

Date: 2025-10-19 09:36 (UTC)
x86128: (Default)
From: [personal profile] x86128
Оказалось что маковский арм64 много каких вольностей не прощает. И приложи которые написаны на си или си++ и крашатся на маке как правило имеют какие-то ошибки работы с указателями и памятью