extended asm and register clobbers
A message that is not in the archive (sent off-list or not yet received): [email protected]
Quoted 12 lines · dw
I read this line from the docs:
"If you refer to a particular hardware register from the assembler code, you probably have to list the register after the third colon to tell the compiler the register's value is modified."
My own observation shows that this is true. However, attempting to add the register in question to the clobber list is returning a compile error.
The asm (essentially memset):
Quoted 11 lines
__CRT_INLINE VOID __stosb(PBYTE Dest, BYTE Data, SIZE_T Count)
{
__asm__
(
"cld; rep; stosb"
:
: "D" (Dest), "a" (Data), "c" (Count)
: "edi", "memory", "cc"
);
}It is probably because the compile finds the input will modify some regs before save its value , in case its value is important for others .
try to save original edi on stack ,then use it ,then pop it ,like recovering from an irq.
Quoted 31 lines
The error:
error: can't find a register in class 'DIREG' while reloading 'asm'
error: 'asm' operand has impossible constraintsWithout the edi clobber, this c++ code:
__stosb((PBYTE)&c, 0, sizeof(c)); __stosb((PBYTE)&c, 0, sizeof(c));generates this asm:
402cd3: cld 402cd4: rep stos BYTE PTR es:[rdi],al 402cd6: cld 402cd7: rep stos BYTE PTR es:[rdi],alSince rdi is not clobbered, gcc doesn't reload it between calls (likewise with rcx).
While I might be able to fake the compiler out by specifying outputs (probably need the volatile qualifier too), I don't really want to change Dest, I just want to use it as an input.
What's the right way to go here?
dw