2 * Copyright 2009 The Android Open Source Project
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
9 #include "SkUtils_opts_SSE2.h"
11 void sk_memset16_SSE2(uint16_t *dst, uint16_t value, int count)
13 SkASSERT(dst != NULL && count >= 0);
15 // dst must be 2-byte aligned.
16 SkASSERT((((size_t) dst) & 0x01) == 0);
19 while (((size_t)dst) & 0x0F) {
23 __m128i *d = reinterpret_cast<__m128i*>(dst);
24 __m128i value_wide = _mm_set1_epi16(value);
26 _mm_store_si128(d , value_wide);
27 _mm_store_si128(d + 1, value_wide);
28 _mm_store_si128(d + 2, value_wide);
29 _mm_store_si128(d + 3, value_wide);
33 dst = reinterpret_cast<uint16_t*>(d);
41 void sk_memset32_SSE2(uint32_t *dst, uint32_t value, int count)
43 SkASSERT(dst != NULL && count >= 0);
45 // dst must be 4-byte aligned.
46 SkASSERT((((size_t) dst) & 0x03) == 0);
49 while (((size_t)dst) & 0x0F) {
53 __m128i *d = reinterpret_cast<__m128i*>(dst);
54 __m128i value_wide = _mm_set1_epi32(value);
56 _mm_store_si128(d , value_wide);
57 _mm_store_si128(d + 1, value_wide);
58 _mm_store_si128(d + 2, value_wide);
59 _mm_store_si128(d + 3, value_wide);
63 dst = reinterpret_cast<uint32_t*>(d);