• David Daney's avatar
    [MIPS] Fix asm constraints for 'ins' instructions. · 94daeb90
    David Daney authored
    The third operand to 'ins' must be a constant int, not a register.
    
    [Ralf: The bug was actually intensional.  Some versions used to throw an
    error under certain circumstances for code like:
    
    static inline void f(unsigned nr, unsigned *p)
    {
    	unsigned short bit = nr & 5;
    
    	if (__builtin_constant_p(bit)) {
    		__asm__ __volatile__ ("  foo %0, %1" : "=m" (*p) : "i" (bit));
      	} else {
    		/* Do something else. */
    	}
    }
    
    because gcc was not able to figure out that the "i" constraint was possibly
    at the early stage when the constraint are getting verified.  The solution
    was using "ri" instead of "i".  The "ri" would keep gcc happy but in the
    end for code generation always the "i" constraint would be satisfied.  The
    problem afair originally appeared in the i386 io.h and also hit it's mips
    equivalent.  From there the workaround spread to many of the inline
    assembler functions.]
    Signed-off-by: default avatarDavid Daney <ddaney@avtrex.com>
    Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    94daeb90
bitops.h 16.1 KB