faster packAlphaValues

This commit is contained in:
Ryan Oldenburg 2021-12-14 19:31:36 -06:00
parent 7195d0a74d
commit f7205a6ebe

View file

@ -164,14 +164,12 @@ proc isOpaque*(data: var seq[ColorRGBX], start, len: int): bool =
when defined(amd64) and not defined(pixieNoSimd): when defined(amd64) and not defined(pixieNoSimd):
proc packAlphaValues*(v: M128i): M128i {.inline, raises: [].} = proc packAlphaValues*(v: M128i): M128i {.inline, raises: [].} =
## Shuffle the alpha values for these 4 colors to the first 4 bytes ## Shuffle the alpha values for these 4 colors to the first 4 bytes
result = mm_srli_epi32(v, 24) let mask = mm_set1_epi32(cast[int32](0xff000000))
let result = mm_and_si128(v, mask)
i = mm_srli_si128(result, 3) result = mm_srli_epi32(result, 24)
j = mm_srli_si128(result, 6) result = mm_packus_epi16(result, result)
k = mm_srli_si128(result, 9) result = mm_packus_epi16(result, result)
first32 = cast[M128i]([uint32.high, 0, 0, 0]) result = mm_srli_si128(result, 12)
result = mm_or_si128(mm_or_si128(result, i), mm_or_si128(j, k))
result = mm_and_si128(result, first32)
proc pack4xAlphaValues*(i, j, k, l: M128i): M128i {.inline, raises: [].} = proc pack4xAlphaValues*(i, j, k, l: M128i): M128i {.inline, raises: [].} =
let let