Index: src/opts/SkNx_sse.h |
diff --git a/src/opts/SkNx_sse.h b/src/opts/SkNx_sse.h |
index b6da080317912fec77864bc9d69e6113b4f69a93..34b58c10edaee21d87f235f494c0ec52db149a92 100644 |
--- a/src/opts/SkNx_sse.h |
+++ b/src/opts/SkNx_sse.h |
@@ -235,12 +235,21 @@ public: |
template <> |
class SkNx<4, uint8_t> { |
public: |
+ SkNx() {} |
SkNx(const __m128i& vec) : fVec(vec) {} |
+ SkNx(uint8_t a, uint8_t b, uint8_t c, uint8_t d) |
+ : fVec(_mm_setr_epi8(a,b,c,d, 0,0,0,0, 0,0,0,0, 0,0,0,0)) {} |
+ |
- SkNx() {} |
static SkNx Load(const void* ptr) { return _mm_cvtsi32_si128(*(const int*)ptr); } |
void store(void* ptr) const { *(int*)ptr = _mm_cvtsi128_si32(fVec); } |
+ uint8_t operator[](int k) const { |
+ SkASSERT(0 <= k && k < 4); |
+ union { __m128i v; uint8_t us[16]; } pun = {fVec}; |
+ return pun.us[k&3]; |
+ } |
+ |
// TODO as needed |
__m128i fVec; |