1. 07 Feb, 2021 1 commit
    • Evan Nemerson's avatar
      detect-clang: fix version numbers for clang < 4.0 · 1d3e007d
      Evan Nemerson authored
      This caused the header to be useless for detecting versions of clang
      prior to 4.0.
      
      I also changed a couple of the warnings we use to detect the version;
      AFAICT the old ones would have worked, but these seem a bit more
      likely to work everywhere.
      1d3e007d
  2. 05 Feb, 2021 3 commits
  3. 24 Jan, 2021 3 commits
  4. 13 Jan, 2021 4 commits
  5. 12 Jan, 2021 1 commit
  6. 11 Jan, 2021 2 commits
  7. 09 Jan, 2021 7 commits
  8. 08 Jan, 2021 3 commits
  9. 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
  10. 04 Jan, 2021 2 commits
  11. 02 Jan, 2021 1 commit
  12. 01 Jan, 2021 1 commit
  13. 31 Dec, 2020 2 commits
  14. 29 Dec, 2020 5 commits
  15. 28 Dec, 2020 2 commits