• Show log

    Commit

  • Hash : 1120ff29
    Author : DRC
    Date : 2016-07-13T12:15:02

    Fix AArch64 ABI conformance issue in SIMD code
    
    In the AArch64 ABI, the high (unused) DWORD of a 32-bit argument's
    register is undefined, so it was incorrect to use 64-bit
    instructions to transfer a JDIMENSION argument in the 64-bit NEON SIMD
    functions.  The code worked thus far only because the existing compiler
    optimizers weren't smart enough to do anything else with the register in
    question, so the upper 32 bits happened to be all zeroes.
    
    The latest builds of Clang/LLVM have a smarter optimizer, and under
    certain circumstances, it will attempt to load-combine adjacent 32-bit
    integers from one of the libjpeg structures into a single 64-bit integer
    and pass that 64-bit integer as a 32-bit argument to one of the SIMD
    functions (which is allowed by the ABI, since the upper 32 bits of the
    32-bit argument's register are undefined.)  This caused the
    libjpeg-turbo regression tests to crash.
    
    This patch tries to use the Wn registers whenever possible.  Otherwise,
    it uses a zero-extend instruction to avoid using the upper 32 bits of
    the 64-bit registers, which are not guaranteed to be valid for 32-bit
    arguments.
    
    Based on https://github.com/sebpop/libjpeg-turbo/commit/1fbae13021eb98f6fffdfaf8678fcdb00b0b04d9
    
    Closes #91.  Refer also to android-ndk/ndk#110 and
    https://llvm.org/bugs/show_bug.cgi?id=28393
    

  • Properties

  • Git HTTP https://git.kmx.io/kc3-lang/libjpeg-turbo.git
    Git SSH git@git.kmx.io:kc3-lang/libjpeg-turbo.git
    Public access ? public
    Description

    Fork of libjpeg with SIMD

    Users
    thodg_m kc3_lang_org thodg_w www_kmx_io thodg_l thodg
    Tags