From: David Laight > Sent: 10 September 2020 10:26 ... > > > I had an 'interesting' idea. > > > > > > Can you use a local asm register variable as an input and output to > > > an 'asm volatile goto' statement? > > > > > > Well you can - but is it guaranteed to work :-) > > > > > > > With gcc at least it should work according to > > https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html > > > > They even explicitely tell: "The only supported use for this feature is > > to specify registers for input and output operands when calling Extended > > asm " > > A quick test isn't good.... > > int bar(char *z) > { > __label__ label; > register int eax asm ("eax") = 6; > asm volatile goto (" mov $1, %%eax" ::: "eax" : label); > label: > return eax; > } > > 0000000000000040 <bar>: > 40: b8 01 00 00 00 mov $0x1,%eax > 45: b8 06 00 00 00 mov $0x6,%eax > 4a: c3 retq > > although adding: > asm volatile ("" : "+r" (eax)); > either side of the 'asm volatile goto' does fix it.
Actually this is pretty sound: __label__ label; register int eax asm ("eax"); // Ensure eax can't be reloaded from anywhere // In particular it can't be reloaded after the asm goto line asm volatile ("" : "=r" (eax)); // Provided gcc doesn't save eax here... asm volatile goto ("xxxxx" ::: "eax" : label); // ... and reload the saved value here. // The input value here will be that modified by the 'asm goto'. // Since this modifies eax it can't be moved before the 'asm goto'. asm volatile ("" : "+r" (eax)); // So here eax must contain the value set by the "xxxxx" instructions. David - Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK Registration No: 1397386 (Wales)