1. 13 Jan, 2021 4 commits
  2. 12 Jan, 2021 1 commit
  3. 11 Jan, 2021 2 commits
  4. 09 Jan, 2021 7 commits
  5. 08 Jan, 2021 3 commits
  6. 07 Jan, 2021 3 commits
    • Evan Nemerson's avatar
      xop: add a bunch of NEON implementations · 2015796f
      Evan Nemerson authored
      This isn't complete, it's just to the point I got tired of working
      on it.
      2015796f
    • Evan Nemerson's avatar
      xop: initial implementation · 214b02a5
      Evan Nemerson authored
      XOP was an AMD ISA extension which Intel never adopted.  It is present
      on heavy-equipment CPUs (bulldozer, piledriver, etc.), but no longer
      supported on Zen.  It never really attained widespread use, but this
      could still be useful.
      
      Huge thanks to Jan Ringoš (@tringi) for testing this during
      development; I don't have access to any hardware that supports XOP
      so Jan's involvement was absolutely critical.
      
      This is just the portable version; we still need to go through and add
      accelerated implementations.
      
      Fixes #678
      214b02a5
    • Evan Nemerson's avatar
      sse2, avx: use void* for destinations of loadu functions · e4e2a2fa
      Evan Nemerson authored
      The vector types have alignment requirements, but these functions are
      specifically for storing *unaligned* data.  Some compilers (such as
      clang 11) have started to generate bad code for the old versions, but
      switching over to void* fixes that.
      
      This also moves the _mm_loadu_epi{8,16,32,64} functions from AVX-512
      over to SSE2 (for 128-bit) and AVX (for 256-bit), effectively replacing
      the simde_x_mm*_loadu_* functions which are now simply aliases for the
      AVX-512 functions.
      
      The only real issue here is that our loadu_si* function take a void*
      instead of a __m128i* or __m256i*, making them more permissive.  Code
      written against SIMDe will allow you to pass, for example, int8_t* data
      to these functions without warning, whereas the _loadu_si* functions
      will likely trigger a diagnostic.
      
      The solution for this is for code using SIMDe to call functions like
      _mm_loadu_epi8 instead of _mm_loadu_si128, even if they don't want to
      use AVX-512.  On SSE2, this will simply become a cast and call to
      _mm_loadu_si128 and all is good.  On other architectures we avoid
      undefined behavior becous void* has no alignment requirements.
      
      That means the only *real* problem is code which ifdefs SIMDe usage.
      In C I would suggest casting to void* instead of __m128i* or __m256i*
      when calling _mm_loadu_si128 or _mm_loadu_si256; everything will work
      as expected.  In C++, though, that will still generate a warning…
      probably the best (well, least bad at least) solution there would be
      to define a macro to use instead of _mm_loadu_si128/_mm256_loadu_si256
      and use an ifdef to define it differently depending on whether you're
      using SIMDe or not.
      e4e2a2fa
  7. 04 Jan, 2021 2 commits
  8. 02 Jan, 2021 1 commit
  9. 01 Jan, 2021 1 commit
  10. 31 Dec, 2020 2 commits
  11. 29 Dec, 2020 5 commits
  12. 28 Dec, 2020 3 commits
  13. 26 Dec, 2020 2 commits
  14. 24 Dec, 2020 1 commit
  15. 23 Dec, 2020 3 commits
    • Evan Nemerson's avatar
      neon/ld3, neon/ld4: disable -Wmaybe-uninitialized on GCC · 19fb220b
      Evan Nemerson authored
      This is basically the same false positive as #657.  As of GCC 10 the
      diagnostic is no longer emitted in C mode, but it is still emitted in
      C++ mode, so I'm removing the version check from the ld3 code, too.
      
      Fixes #676
      19fb220b
    • Evan Nemerson's avatar
      math: add modf · d6120b3b
      Evan Nemerson authored
      d6120b3b
    • Evan Nemerson's avatar
      sse: cast _MM_HINT_* values to enum _mm_hint on GCC · db7d8fb8
      Evan Nemerson authored
      _mm_prefetch is supposed to take an int, but when optimization enabled
      GCC uses an enum _mm_hint instead.  Without optimization _mm_prefetch
      is defined as a macro (as it is on clang) since there is no constant
      propagation.
      
      Since we can't rely on all hints being defined on all platforms we
      define our own, which are not part of the enum _mm_hint.  So, on GCC
      we cast each of the hints to enum _mm_hint to avoid a warning about
      an invalid conversion.
      
      IMHO this is technically a bug in the GCC API, but I appreciate the
      effort at getting the compiler to validate the input so I'm not going
      to complain to the GCC folks as long as this doesn't cause additional
      breakage.
      
      Fixes #673
      db7d8fb8