I am looking into optimizing the fast_increment_function in
Zend/zend-operators.h for better performance on aarch64 systems by adding
some inline assembly that will reproduce what currently exists for x86_64
and i386 systems.
My main issue at the moment is understanding what occurs in the x86_64
assembly section when the incremented register overflows. I understand that
it moves a some constant values into the registers, but I don't understand
the significance of these values or why we use them.
asm(
"incq (%0)\n\t"
"jno 0f\n\t"
"movl $0x0, (%0)\n\t"
"movl $0x43e00000, 0x4(%0)\n\t"
"movb %1, %c2(%0)\n"
"0:"
:
: "r"(&op1->value),
"n"(IS_DOUBLE),
"n"(ZVAL_OFFSETOF_TYPE)
: "cc");
Can anyone clarify the purpose of the 3 'mov' instructions?
Thanks,
Justin