Paul Koning via Gcc <gcc@gcc.gnu.org> writes: >> On Jun 4, 2021, at 2:02 PM, Andreas Krebbel via Gcc <gcc@gcc.gnu.org> wrote: >> >> Hi, >> >> I wonder if we could replace the register asm construct for >> inline assemblies with something a bit nicer and more obvious. >> E.g. turning this (real world example from IBM Z kernel code): >> >> int diag8_response(int cmdlen, char *response, int *rlen) >> { >> register unsigned long reg2 asm ("2") = (addr_t) cpcmd_buf; >> register unsigned long reg3 asm ("3") = (addr_t) response; >> register unsigned long reg4 asm ("4") = cmdlen | 0x40000000L; >> register unsigned long reg5 asm ("5") = *rlen; /* <-- */ >> asm volatile( >> " diag %2,%0,0x8\n" >> " brc 8,1f\n" >> " agr %1,%4\n" >> "1:\n" >> : "+d" (reg4), "+d" (reg5) >> : "d" (reg2), "d" (reg3), "d" (*rlen): "cc"); >> *rlen = reg5; >> return reg4; >> } >> >> into this: >> >> int diag8_response(int cmdlen, char *response, int *rlen) >> { >> unsigned long len = cmdlen | 0x40000000L; >> >> asm volatile( >> " diag %2,%0,0x8\n" >> " brc 8,1f\n" >> " agr %1,%4\n" >> "1:\n" >> : "+{r4}" (len), "+{r5}" (*rlen) >> : "{r2}" ((addr_t)cpcmd_buf), "{r3}" ((addr_t)response), "d" >> (*rlen): "cc"); >> return len; >> } >> >> Apart from being much easier to read because the hard regs become part >> of the inline assembly it solves also a couple of other issues: >> >> - function calls might clobber register asm variables see BZ100908 >> - the constraints for the register asm operands are superfluous >> - one register asm variable cannot be used for 2 different inline >> assemblies if the value is expected in different hard regs >> >> I've started with a hackish implementation for IBM Z using the >> TARGET_MD_ASM_ADJUST hook and let all the places parsing constraints >> skip over the {} parts. But perhaps it would be useful to make this a >> generic mechanism for all targets?! >> >> Andreas > > Yes, I would think this should be made a general mechanism that any target > could use.
+1 FWIW. I think this would also avoid the common confusion around the semantics of register asms. We would need to check whether { is used as a constraint string by any target (hepefully not). Richard