According to Intel 64 and IA-32 Architectures Software Developer's Manual Combined Volumes (Oct 2019) in section 4.1.1 "Alignment of Words, Doublewords, Quadwords, and Double Quadwords":
"Words, doublewords, and quadwords do not need to be aligned in memory on natural boundaries. The natural boundaries for words, double words, and quadwords are even-numbered addresses, addresses evenly divisible by four, and addresses evenly divisible by eight, respectively."
But a paragraph later the manual says:
"Some instructions that operate on double quadwords require memory operands to be aligned on a natural boundary. These instructions generate a general-protection exception (#GP) if an unaligned operand is specified. A natural boundary for a double quadword is any address evenly divisible by 16."
I just arranged my data section to align on 64-byte boundaries and organize all dq vars together to be set on a single cache line. Here are the first eight dqs:
section .data align=64
Return_Pointer_Array: dq 0, 0, 0
data_master_ptr: dq 0
n_ptr: dq 0
n_ctr: dq 0
n_length: dq 0
collect_ptr: dq 0
The data section is larger than that, but I ran it through Agner Fog's objconv and he shows no data alignment issues -- in earlier work I found that if there are alignment issues Fog's objconv will flag them.
My question is: Under what circumstances would I have to align each dq on an address divisible to 16, as Intel says in the last paragraph quoted above? What instructions would cause such a requirement?