• Alexey Dobriyan's avatar
    x86/asm/64: Clean up memset16(), memset32(), memset64() assembly constraints in <asm/string_64.h> · 4c9a9380
    Alexey Dobriyan authored
    - Use "+" constraint modifier,
      simplify inputs and output lists,
      delete dummy variables with meaningless names,
    
      "&" only makes sense in complex assembly creating constraints on
      intermediate registers. But 1 instruction assemblies don't have
      inner body so to speak.
    
    - Write "rep stos*" on one line:
      Rep prefix is integral part of x86 instruction.  I'm not sure why
      people separate "rep" with newline.
    
      Uros Bizjak adds context: "some archaic assemblers rejected 'rep
      insn' on one line. I have checked that the minimum required
      binutils-2.25 assembles this without problems."
    
    - Use __auto_type for maximum copy pasta experience,
    
    - Reformat a bit to make everything looks nicer.
    
    Note that "memory" clobber is too much if "n" is known at compile time.
    However,
    
    	"=m" (*(T(*)[n])s)
    
    doesn't work because -Wvla even if "n" is compile time constant:
    
    	if (BCP(n)) {
    		rep stos
    		: "=m" (*(T(*)[n])s)
    	} else {
    		rep stosw
    		: "memory"
    	}
    
    The above doesn't work.
    Signed-off-by: default avatarAlexey Dobriyan <adobriyan@gmail.com>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Reviewed-by: default avatarUros Bizjak <ubizjak@gmail.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: "H. Peter Anvin" <hpa@zytor.com>
    Link: https://lore.kernel.org/r/20240314165715.31831-1-adobriyan@gmail.com
    4c9a9380
string_64.h 2.5 KB