• Marko Mäkelä's avatar
    MDEV-24745 Generic CRC-32C computation wrongly uses SSE4.2 instructions · 58f184a4
    Marko Mäkelä authored
    In commit d25f806d (MDEV-22749)
    the CRC-32C implementation of MariaDB was broken on some
    IA-32 and AMD64 builds, depending on the compiler version and
    build options. This was verified for IA-32 on GCC 10.2.1.
    
    Even though we try to identify the SSE4.2 extensions and the
    availaibility of the PCLMULQDQ instruction by executing CPUID,
    the fall-back code could be generated with extended instructions,
    because the entire file mysys/crc32/crc32c.c was being compiled
    with -msse4.2 -mpclmul. This would cause SIGILL on a PINSRD
    instruction on affected IA-32 targets (such as some Intel Atom
    processors). This might also affect old AMD64 processors
    (predating the 2007 Intel Nehalem microarchitecture), if some
    compiler chose to emit the offending instructions.
    
    While it is fine to pass a target-specific option to a target-specific
    compilation unit (like -mpclmul to a PCLMUL-specific compilation unit),
    that is not safe for mixed-architecture compilation units.
    
    For mixed-architecture compilation units, the correct way is to set
    target attributes on the target-specific functions.
    
    There does not seem to be a way to pass target attributes to
    function template instantiation. Hence, we must replace the
    ExtendImpl template with plain functions crc32_sse42() and
    crc32_slow().
    
    We will also remove some inconsistency between
    my_crc32_implementation() and mysys_namespace::crc32::Choose_Extend().
    
    The function crc32_pclmul_enabled() will be moved to mysys/crc32/crc32c.cc
    so that the detection code will be compiled without -msse4.2 -mpclmul.
    
    The AMD64 PCLMUL accelerated crc32c_3way() will be moved to a new
    file crc32c_amd64.cc. In this way, only a few functions that depend
    on -msse4.2 in mysys/crc32/crc32c.cc can be declared with
    __attribute__((target("sse4.2"))), and most of the file can be compiled
    for the generic target.
    
    Last, the file mysys/crc32ieee.cc will be omitted on 64-bit POWER,
    because it was dead code (no symbols were exported).
    
    Reviewed by: Vladislav Vaintroub
    58f184a4
crc32_x86.c 10.2 KB