In Agner's forum post linked a few days ago[1], it sounded like it was quite limited. I mean, super impressive, but as far as I understood, it didn't handle nesting (just the single pointer/memory access + offset)[2]. I'm not very well versed on this stuff though, so maybe I misunderstood.
[2] > The mechanism works only under certain conditions. It must use general purpose registers, and the operand size must be 32 or 64 bits. The memory operand must use a pointer and optionally an index. It does not work with absolute or rip-relative addresses.
> It seems that the CPU makes assumptions about whether memory operands have the same address before the addresses have been calculated. This may cause problems in case of pointer aliasing.
Or from the PDF:
•The instructions must use general purpose registers.
•The memory operands must have the same address.
•The operand size must be 32 or 64 bits.
•You may have a32 bit read after a 64 bit write to the same address, but not vice versa.
•The memory address must have a base pointer, no absolute address, and no rip-relative address. The memory address may have an index register,a scale factor, and an offset no bigger than 8 bits.
•The memory operand must be specified in exactly the same way with the same unmodified pointer and index registers in all the instructions involved.
•The memory address cannot cross a cache line boundary.
•The instructions can be simple MOV instructions, read-modify instructions,or read-modify-write instructions.It also works with PUSH and POP instructions.
•Complex instructions with multiple μops cannot be used.
[1] https://news.ycombinator.com/item?id=24302057
[2] > The mechanism works only under certain conditions. It must use general purpose registers, and the operand size must be 32 or 64 bits. The memory operand must use a pointer and optionally an index. It does not work with absolute or rip-relative addresses.
> It seems that the CPU makes assumptions about whether memory operands have the same address before the addresses have been calculated. This may cause problems in case of pointer aliasing.
Or from the PDF:
•The instructions must use general purpose registers.
•The memory operands must have the same address.
•The operand size must be 32 or 64 bits.
•You may have a32 bit read after a 64 bit write to the same address, but not vice versa.
•The memory address must have a base pointer, no absolute address, and no rip-relative address. The memory address may have an index register,a scale factor, and an offset no bigger than 8 bits.
•The memory operand must be specified in exactly the same way with the same unmodified pointer and index registers in all the instructions involved.
•The memory address cannot cross a cache line boundary.
•The instructions can be simple MOV instructions, read-modify instructions,or read-modify-write instructions.It also works with PUSH and POP instructions.
•Complex instructions with multiple μops cannot be used.