• James Hogan's avatar
    MIPS: uasm: Handle low values in uasm_in_compat_space_p() · f7d9afea
    James Hogan authored
    uasm_in_compat_space_p() determines whether the given value is in the
    32-bit compatibility part of the 64-bit address space, i.e. is in 32-bit
    sign-extended form, however it only handles the top half of the value
    space (corresponding to the kernel compatibility segments in the upper
    half of the address space). Since values < 2^31 (corresponding to the
    low 2GiB of the address space) can also be handled using 32-bit
    instructions (e.g. a LUI and ADDIU) rather than convoluted 64-bit
    immediate generation, rewrite it with a cast to check whether the
    address matches its 32-bit sign extended form.
    
    This allows UASM_i_LA to be used to generate arbitrary 32-bit immediates
    more efficiently on 64-bit CPUs, i.e. more like the li (load immediate)
    pseudo-instruction.
    
    For example this code to load the immediate (ST0_EXL | KSU_USER |
    ST0_BEV | ST0_KX) into k0 with UASM_i_LA():
    
     lui        k0,0x0
     dsll       k0,k0,0x10
     daddiu     k0,k0,64
     dsll       k0,k0,0x10
     daddiu     k0,k0,146
    
    Changes to this more efficient version:
    
     lui        k0,0x40
     addiu      k0,k0,146
    Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
    Cc: linux-mips@linux-mips.org
    Patchwork: https://patchwork.linux-mips.org/patch/13778/Signed-off-by: default avatarRalf Baechle <ralf@linux-mips.org>
    f7d9afea
uasm.c 13.5 KB