packages feed

ptr-poker 0.1.1.3 → 0.1.1.4

raw patch · 3 files changed

+49/−41 lines, 3 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

cbits/text.c view
@@ -13,6 +13,10 @@ #include <stdint.h> #include <stdio.h> +#if defined(__x86_64__)+#include <xmmintrin.h>+#include <emmintrin.h>+#endif  uint8_t* encode_text (@@ -23,11 +27,10 @@ ) #if defined(__x86_64__) {-   src += src_offset;      const uint16_t* src_end = src + src_length;-  const uint16_t* full_word_src_end = src_end - 4;+  const uint16_t* full_xmm_src_end = src_end - 8;    while (src < src_end) {     uint16_t x = *src++;@@ -35,30 +38,30 @@     if (x <= 0x7F) {       *dest++ = x; -      while (src < full_word_src_end) {-        uint64_t x = *((uint64_t *) src);+      while (src < full_xmm_src_end) {+        union { uint64_t halves[2]; __m128i whole; } eight_chars;+        eight_chars.whole = _mm_loadu_si128((__m128i *) src); -        if (x & 0xFF80FF80FF80FF80ULL) {-          if (!(x & 0x000000000000FF80ULL)) {-            *dest++ = x & 0xFFFF;-            src++;-            if (!(x & 0x00000000FF800000ULL)) {-              *dest++ = (x >> 16) & 0xFFFF;-              src++;-              if (!(x & 0x0000FF8000000000ULL)) {-                *dest++ = (x >> 32) & 0xFFFF;-                src++;-              }-            }-          }+        const uint64_t h1 = eight_chars.halves[0];+        const uint64_t non_asciiness_of_the_first_half = h1 & 0xFF80FF80FF80FF80ULL;++        if (non_asciiness_of_the_first_half) {           break;         }-        -        *dest++ = x & 0xFFFF;-        *dest++ = (x >> 16) & 0xFFFF;-        *dest++ = (x >> 32) & 0xFFFF;-        *dest++ = x >> 48;-        src += 4;++        const __m128i eight_ascii_chars = _mm_packus_epi16(eight_chars.whole, eight_chars.whole);+        _mm_storel_epi64((__m128i *)dest, eight_ascii_chars);++        const uint64_t non_asciiness_of_the_second_half = eight_chars.halves[1] & 0xFF80FF80FF80FF80ULL;+        if (non_asciiness_of_the_second_half) {+          const int ascii_char_count = __builtin_ctz(non_asciiness_of_the_second_half) / 16;+          dest += 4 + ascii_char_count;+          src += 4 + ascii_char_count;+          break;+        }++        dest += 8;+        src += 8;       }     }     else if (x <= 0x7FF) {@@ -156,22 +159,14 @@       while (src_ptr < full_word_after_src_ptr) {         uint64_t x = *((uint64_t*) src_ptr); -        if (x & 0xFF80FF80FF80FF80ULL) {-          if (!(x & 0x000000000000FF80ULL)) {-            size++;-            src_ptr++;-            if (!(x & 0x00000000FF800000ULL)) {-              size++;-              src_ptr++;-              if (!(x & 0x0000FF8000000000ULL)) {-                size++;-                src_ptr++;-              }-            }-          }+        const uint64_t non_asciiness = x & 0xFF80FF80FF80FF80ULL;+        if (non_asciiness) {+          const int ascii_char_count = __builtin_ctz(non_asciiness) / 16;+          size += ascii_char_count;+          src_ptr += ascii_char_count;           break;         }-        +         size += 4;         src_ptr += 4;       }
ptr-poker.cabal view
@@ -1,5 +1,5 @@ name: ptr-poker-version: 0.1.1.3+version: 0.1.1.4 synopsis: Pointer poking action construction and composition toolkit homepage: https://github.com/nikita-volkov/ptr-poker bug-reports: https://github.com/nikita-volkov/ptr-poker/issues
test/Main.hs view
@@ -84,17 +84,30 @@ prop_sizeOfTextUtf8 =   withTests 999 $   property $ do-    a <- forAll (Gen.text (Range.exponential 0 9999) Gen.unicode)+    a <- forAll (Gen.text (Range.exponential 0 9999) (Gen.choice [Gen.ascii, Gen.unicode]))     Size.textUtf8 a       === Char8ByteString.length (Text.encodeUtf8 a) -prop_textUtf8 =+prop_sizeOfTextASCII =   withTests 999 $   property $ do-    a <- forAll (Gen.text (Range.exponential 0 9999) Gen.unicode)+    a <- forAll (Gen.text (Range.exponential 0 9999) Gen.ascii)+    Size.textUtf8 a+      === Char8ByteString.length (Text.encodeUtf8 a)++prop_textASCII =+  withTests 999 $+  property $ do+    a <- forAll (Gen.text (Range.exponential 0 9999) Gen.ascii)     Write.writeToByteString (Write.textUtf8 a)       === Text.encodeUtf8 a +prop_textUtf8 =+  withTests 999 $+  property $ do+    a <- forAll (Gen.text (Range.exponential 0 9999) (Gen.choice [Gen.ascii, Gen.unicode]))+    Write.writeToByteString (Write.textUtf8 a)+      === Text.encodeUtf8 a  -- * Gens -------------------------