extended asm and register clobbers
ishare
june.tune.sea at gmail.com
Sat Mar 30 23:25:51 EDT 2013
On Sat, Mar 30, 2013 at 02:04:04PM -0700, dw wrote:
> 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):
>
> __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.
> The error:
>
> error: can't find a register in class 'DIREG' while reloading 'asm'
> error: 'asm' operand has impossible constraints
>
> Without 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],al
>
> Since 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
More information about the Kernelnewbies
mailing list