• Dave Martin's avatar
    ARM: 7509/1: opcodes: Make opcode byteswapping macros assembly-compatible · 0ce3de23
    Dave Martin authored
    Most of the existing macros don't work with assembler, due to the
    use of type casts and C functions from <linux/swab.h>.
    
    This patch abstracts out those operations and provides simple
    explicit versions for use in assembly code.
    
    __opcode_is_thumb32() and __opcode_is_thumb16() are also converted
    to do bitmask-based testing to avoid confusion if these are used in
    assembly code (the assembler typically treats all arithmetic values
    as signed).
    
    These changes avoid the need for the compiler to pre-evaluate
    constant expressions used to generate opcodes.  By ensuring that
    the forms of these expressions can be evaluated directly by the
    assembler, we can just stringify the expressions directly into the
    asm during the preprocessing pass.  The alternative approach
    (passing the evaluated expression via an inline asm "i" constraint)
    gets painful because the contents of the asm and the constraints
    must be kept in sync.  This makes the resulting macros awkward to
    use.
    
    Retaining the C forms of the macros allows more efficient code to
    be generated when opcodes are generated programmatically at run-
    time, but there is no way to embed run-time-generated opcodes in
    asm() blocks.
    Signed-off-by: default avatarDave Martin <dave.martin@linaro.org>
    Acked-by: default avatarNicolas Pitre <nico@linaro.org>
    Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
    0ce3de23
opcodes.h 5.34 KB