1cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#include "SkXfermode.h"
2cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#include "SkXfermode_proccoeff.h"
3cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#include "SkColorPriv.h"
4cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
5cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#include <arm_neon.h>
6cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#include "SkColor_opts_neon.h"
7cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#include "SkXfermode_opts_arm_neon.h"
8cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
9cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#define SkAlphaMulAlpha(a, b)   SkMulDiv255Round(a, b)
10cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
11cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
12cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
13cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org// NEONized skia functions
14cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
15cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
16cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t SkAlphaMulAlpha_neon8(uint8x8_t color, uint8x8_t alpha) {
17cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t tmp;
18cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8_t ret;
19cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
20cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vmull_u8(color, alpha);
21cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vaddq_u16(tmp, vdupq_n_u16(128));
22cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vaddq_u16(tmp, vshrq_n_u16(tmp, 8));
23cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
24cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = vshrn_n_u16(tmp, 8);
25cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
26cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
27cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
28cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
29cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint16x8_t SkAlphaMulAlpha_neon8_16(uint8x8_t color, uint8x8_t alpha) {
30cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t ret;
31cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
32cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = vmull_u8(color, alpha);
33cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = vaddq_u16(ret, vdupq_n_u16(128));
34cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = vaddq_u16(ret, vshrq_n_u16(ret, 8));
35cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
36cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = vshrq_n_u16(ret, 8);
37cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
38cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
39cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
40cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
41cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t SkDiv255Round_neon8_32_8(int32x4_t p1, int32x4_t p2) {
42cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t tmp;
43cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
446f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
456f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    tmp = vmovn_high_u32(vmovn_u32(vreinterpretq_u32_s32(p1)),
466f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org                         vreinterpretq_u32_s32(p2));
476f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
48cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vcombine_u16(vmovn_u32(vreinterpretq_u32_s32(p1)),
49cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                       vmovn_u32(vreinterpretq_u32_s32(p2)));
506f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
51cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
52cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp += vdupq_n_u16(128);
53cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp += vshrq_n_u16(tmp, 8);
54cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
55cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return vshrn_n_u16(tmp, 8);
56cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
57cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
58cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint16x8_t SkDiv255Round_neon8_16_16(uint16x8_t prod) {
59cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    prod += vdupq_n_u16(128);
60cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    prod += vshrq_n_u16(prod, 8);
61cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
62cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return vshrq_n_u16(prod, 8);
63cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
64cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
65cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t clamp_div255round_simd8_32(int32x4_t val1, int32x4_t val2) {
66cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8_t ret;
67cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint32x4_t cmp1, cmp2;
68cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t cmp16;
69cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8_t cmp8, cmp8_1;
70cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
71cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Test if <= 0
72cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp1 = vcleq_s32(val1, vdupq_n_s32(0));
73cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp2 = vcleq_s32(val2, vdupq_n_s32(0));
746f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
756f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    cmp16 = vmovn_high_u32(vmovn_u32(cmp1), cmp2);
766f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
77cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp16 = vcombine_u16(vmovn_u32(cmp1), vmovn_u32(cmp2));
786f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
79cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp8_1 = vmovn_u16(cmp16);
80cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
81cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Init to zero
82cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = vdup_n_u8(0);
83cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
84cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Test if >= 255*255
85cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp1 = vcgeq_s32(val1, vdupq_n_s32(255*255));
86cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp2 = vcgeq_s32(val2, vdupq_n_s32(255*255));
876f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
886f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    cmp16 = vmovn_high_u32(vmovn_u32(cmp1), cmp2);
896f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
90cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp16 = vcombine_u16(vmovn_u32(cmp1), vmovn_u32(cmp2));
916f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
92cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp8 = vmovn_u16(cmp16);
93cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
94cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Insert 255 where true
95cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = vbsl_u8(cmp8, vdup_n_u8(255), ret);
96cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
97cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Calc SkDiv255Round
98cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8_t div = SkDiv255Round_neon8_32_8(val1, val2);
99cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
100cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Insert where false and previous test false
101cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    cmp8 = cmp8 | cmp8_1;
102cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = vbsl_u8(cmp8, ret, div);
103cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
104cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Return the final combination
105cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
106cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
107cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
108cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
109d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org// 1 pixel modeprocs
110d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
111d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
112d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org//  kSrcATop_Mode,  //!< [Da, Sc * Da + (1 - Sa) * Dc]
113d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.orgSkPMColor srcatop_modeproc_neon(SkPMColor src, SkPMColor dst) {
114d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned sa = SkGetPackedA32(src);
115d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned da = SkGetPackedA32(dst);
116d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned isa = 255 - sa;
117d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
118d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint8x8_t vda, visa, vsrc, vdst;
119d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
120d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vda = vdup_n_u8(da);
121d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    visa = vdup_n_u8(isa);
122d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
123d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint16x8_t vsrc_wide, vdst_wide;
124d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide = vmull_u8(vda, vreinterpret_u8_u32(vdup_n_u32(src)));
125d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide = vmull_u8(visa, vreinterpret_u8_u32(vdup_n_u32(dst)));
126d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
127d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide += vdupq_n_u16(128);
128d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide += vshrq_n_u16(vsrc_wide, 8);
129d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
130d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide += vdupq_n_u16(128);
131d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide += vshrq_n_u16(vdst_wide, 8);
132d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
133d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vshrn_n_u16(vsrc_wide, 8);
134d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst = vshrn_n_u16(vdst_wide, 8);
135d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
136d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc += vdst;
137d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vset_lane_u8(da, vsrc, 3);
138d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
139d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    return vget_lane_u32(vreinterpret_u32_u8(vsrc), 0);
140d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org}
141d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
142d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org//  kDstATop_Mode,  //!< [Sa, Sa * Dc + Sc * (1 - Da)]
143d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.orgSkPMColor dstatop_modeproc_neon(SkPMColor src, SkPMColor dst) {
144d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned sa = SkGetPackedA32(src);
145d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned da = SkGetPackedA32(dst);
146d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned ida = 255 - da;
147d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
148d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint8x8_t vsa, vida, vsrc, vdst;
149d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
150d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsa = vdup_n_u8(sa);
151d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vida = vdup_n_u8(ida);
152d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
153d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint16x8_t vsrc_wide, vdst_wide;
154d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide = vmull_u8(vida, vreinterpret_u8_u32(vdup_n_u32(src)));
155d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide = vmull_u8(vsa, vreinterpret_u8_u32(vdup_n_u32(dst)));
156d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
157d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide += vdupq_n_u16(128);
158d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide += vshrq_n_u16(vsrc_wide, 8);
159d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
160d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide += vdupq_n_u16(128);
161d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide += vshrq_n_u16(vdst_wide, 8);
162d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
163d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vshrn_n_u16(vsrc_wide, 8);
164d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst = vshrn_n_u16(vdst_wide, 8);
165d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
166d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc += vdst;
167d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vset_lane_u8(sa, vsrc, 3);
168d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
169d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    return vget_lane_u32(vreinterpret_u32_u8(vsrc), 0);
170d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org}
171d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
172d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org//  kXor_Mode   [Sa + Da - 2 * Sa * Da, Sc * (1 - Da) + (1 - Sa) * Dc]
173d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.orgSkPMColor xor_modeproc_neon(SkPMColor src, SkPMColor dst) {
174d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned sa = SkGetPackedA32(src);
175d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned da = SkGetPackedA32(dst);
176d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned ret_alpha = sa + da - (SkAlphaMulAlpha(sa, da) << 1);
177d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned isa = 255 - sa;
178d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    unsigned ida = 255 - da;
179d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
180d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint8x8_t vsrc, vdst, visa, vida;
181d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint16x8_t vsrc_wide, vdst_wide;
182d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
183d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    visa = vdup_n_u8(isa);
184d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vida = vdup_n_u8(ida);
185d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vreinterpret_u8_u32(vdup_n_u32(src));
186d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst = vreinterpret_u8_u32(vdup_n_u32(dst));
187d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
188d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide = vmull_u8(vsrc, vida);
189d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide = vmull_u8(vdst, visa);
190d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
191d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide += vdupq_n_u16(128);
192d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc_wide += vshrq_n_u16(vsrc_wide, 8);
193d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
194d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide += vdupq_n_u16(128);
195d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst_wide += vshrq_n_u16(vdst_wide, 8);
196d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
197d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vshrn_n_u16(vsrc_wide, 8);
198d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst = vshrn_n_u16(vdst_wide, 8);
199d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
200d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc += vdst;
201d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
202d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vset_lane_u8(ret_alpha, vsrc, 3);
203d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
204d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    return vget_lane_u32(vreinterpret_u32_u8(vsrc), 0);
205d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org}
206d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
207d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org// kPlus_Mode
208d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.orgSkPMColor plus_modeproc_neon(SkPMColor src, SkPMColor dst) {
209d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint8x8_t vsrc, vdst;
210d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vreinterpret_u8_u32(vdup_n_u32(src));
211d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst = vreinterpret_u8_u32(vdup_n_u32(dst));
212d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vqadd_u8(vsrc, vdst);
213d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
214d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    return vget_lane_u32(vreinterpret_u32_u8(vsrc), 0);
215d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org}
216d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
217d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org// kModulate_Mode
218d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.orgSkPMColor modulate_modeproc_neon(SkPMColor src, SkPMColor dst) {
219d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint8x8_t vsrc, vdst, vres;
220d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    uint16x8_t vres_wide;
221d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
222d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vsrc = vreinterpret_u8_u32(vdup_n_u32(src));
223d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vdst = vreinterpret_u8_u32(vdup_n_u32(dst));
224d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
225d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vres_wide = vmull_u8(vsrc, vdst);
226d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
227d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vres_wide += vdupq_n_u16(128);
228d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vres_wide += vshrq_n_u16(vres_wide, 8);
229d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
230d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    vres = vshrn_n_u16(vres_wide, 8);
231d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
232d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    return vget_lane_u32(vreinterpret_u32_u8(vres), 0);
233d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org}
234d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
235d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
236cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org// 8 pixels modeprocs
237cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
238cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
239cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t dstover_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
240cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
241cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t src_scale;
242cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
243cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    src_scale = vsubw_u8(vdupq_n_u16(256), dst.val[NEON_A]);
244cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
245cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = dst.val[NEON_A] + SkAlphaMul_neon8(src.val[NEON_A], src_scale);
246cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = dst.val[NEON_R] + SkAlphaMul_neon8(src.val[NEON_R], src_scale);
247cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = dst.val[NEON_G] + SkAlphaMul_neon8(src.val[NEON_G], src_scale);
248cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = dst.val[NEON_B] + SkAlphaMul_neon8(src.val[NEON_B], src_scale);
249cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
250cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
251cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
252cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
253cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t srcin_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
254cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
255cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t scale;
256cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
257cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    scale = SkAlpha255To256_neon8(dst.val[NEON_A]);
258cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
259cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = SkAlphaMul_neon8(src.val[NEON_A], scale);
260cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = SkAlphaMul_neon8(src.val[NEON_R], scale);
261cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = SkAlphaMul_neon8(src.val[NEON_G], scale);
262cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = SkAlphaMul_neon8(src.val[NEON_B], scale);
263cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
264cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
265cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
266cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
267cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t dstin_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
268cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
269cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t scale;
270cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
271cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    scale = SkAlpha255To256_neon8(src.val[NEON_A]);
272cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
273cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = SkAlphaMulQ_neon8(dst, scale);
274cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
275cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
276cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
277cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
278cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t srcout_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
279cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
280cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t scale = vsubw_u8(vdupq_n_u16(256), dst.val[NEON_A]);
281cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
282cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = SkAlphaMulQ_neon8(src, scale);
283cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
284cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
285cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
286cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
287cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t dstout_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
288cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
289cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t scale = vsubw_u8(vdupq_n_u16(256), src.val[NEON_A]);
290cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
291cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret = SkAlphaMulQ_neon8(dst, scale);
292cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
293cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
294cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
295cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
296cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t srcatop_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
297cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
298cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8_t isa;
299cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
300cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    isa = vsub_u8(vdup_n_u8(255), src.val[NEON_A]);
301cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
302cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = dst.val[NEON_A];
303cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = SkAlphaMulAlpha_neon8(src.val[NEON_R], dst.val[NEON_A])
304cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_R], isa);
305cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = SkAlphaMulAlpha_neon8(src.val[NEON_G], dst.val[NEON_A])
306cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_G], isa);
307cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = SkAlphaMulAlpha_neon8(src.val[NEON_B], dst.val[NEON_A])
308cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_B], isa);
309cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
310cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
311cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
312cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
313cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t dstatop_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
314cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
315cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8_t ida;
316cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
317cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ida = vsub_u8(vdup_n_u8(255), dst.val[NEON_A]);
318cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
319cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = src.val[NEON_A];
320cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = SkAlphaMulAlpha_neon8(src.val[NEON_R], ida)
321cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_R], src.val[NEON_A]);
322cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = SkAlphaMulAlpha_neon8(src.val[NEON_G], ida)
323cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_G], src.val[NEON_A]);
324cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = SkAlphaMulAlpha_neon8(src.val[NEON_B], ida)
325cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_B], src.val[NEON_A]);
326cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
327cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
328cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
329cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
330cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t xor_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
331cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
332cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8_t isa, ida;
333cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t tmp_wide, tmp_wide2;
334cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
335cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    isa = vsub_u8(vdup_n_u8(255), src.val[NEON_A]);
336cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ida = vsub_u8(vdup_n_u8(255), dst.val[NEON_A]);
337cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
338cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // First calc alpha
339cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp_wide = vmovl_u8(src.val[NEON_A]);
340cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp_wide = vaddw_u8(tmp_wide, dst.val[NEON_A]);
341cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp_wide2 = vshll_n_u8(SkAlphaMulAlpha_neon8(src.val[NEON_A], dst.val[NEON_A]), 1);
342cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp_wide = vsubq_u16(tmp_wide, tmp_wide2);
343cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = vmovn_u16(tmp_wide);
344cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
345cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Then colors
346cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = SkAlphaMulAlpha_neon8(src.val[NEON_R], ida)
347cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_R], isa);
348cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = SkAlphaMulAlpha_neon8(src.val[NEON_G], ida)
349cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_G], isa);
350cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = SkAlphaMulAlpha_neon8(src.val[NEON_B], ida)
351cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                      + SkAlphaMulAlpha_neon8(dst.val[NEON_B], isa);
352cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
353cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
354cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
355cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
356cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t plus_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
357cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
358cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
359cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = vqadd_u8(src.val[NEON_A], dst.val[NEON_A]);
360cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = vqadd_u8(src.val[NEON_R], dst.val[NEON_R]);
361cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = vqadd_u8(src.val[NEON_G], dst.val[NEON_G]);
362cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = vqadd_u8(src.val[NEON_B], dst.val[NEON_B]);
363cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
364cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
365cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
366cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
367cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t modulate_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
368cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
369cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
370cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = SkAlphaMulAlpha_neon8(src.val[NEON_A], dst.val[NEON_A]);
371cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = SkAlphaMulAlpha_neon8(src.val[NEON_R], dst.val[NEON_R]);
372cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = SkAlphaMulAlpha_neon8(src.val[NEON_G], dst.val[NEON_G]);
373cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = SkAlphaMulAlpha_neon8(src.val[NEON_B], dst.val[NEON_B]);
374cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
375cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
376cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
377cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
378cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t srcover_color(uint8x8_t a, uint8x8_t b) {
379cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t tmp;
380cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
381cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vaddl_u8(a, b);
382cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp -= SkAlphaMulAlpha_neon8_16(a, b);
383cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
384cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return vmovn_u16(tmp);
385cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
386cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
387cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t screen_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
388cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
389cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
390cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = srcover_color(src.val[NEON_A], dst.val[NEON_A]);
391cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = srcover_color(src.val[NEON_R], dst.val[NEON_R]);
392cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = srcover_color(src.val[NEON_G], dst.val[NEON_G]);
393cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = srcover_color(src.val[NEON_B], dst.val[NEON_B]);
394cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
395cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
396cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
397cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
398cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgtemplate <bool overlay>
399cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t overlay_hardlight_color(uint8x8_t sc, uint8x8_t dc,
400cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                               uint8x8_t sa, uint8x8_t da) {
401cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    /*
402cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     * In the end we're gonna use (rc + tmp) with a different rc
403cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     * coming from an alternative.
404cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     * The whole value (rc + tmp) can always be expressed as
405cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     * VAL = COM - SUB in the if case
406cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     * VAL = COM + SUB - sa*da in the else case
407cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     *
408cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     * with COM = 255 * (sc + dc)
409cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     * and  SUB = sc*da + dc*sa - 2*dc*sc
410cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org     */
411cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
412cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Prepare common subexpressions
413cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t const255 = vdupq_n_u16(255);
414cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t sc_plus_dc = vaddl_u8(sc, dc);
415cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t scda = vmull_u8(sc, da);
416cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t dcsa = vmull_u8(dc, sa);
417cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t sada = vmull_u8(sa, da);
418cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
419cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Prepare non common subexpressions
420cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t dc2, sc2;
421cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint32x4_t scdc2_1, scdc2_2;
422cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    if (overlay) {
423cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        dc2 = vshll_n_u8(dc, 1);
424cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        scdc2_1 = vmull_u16(vget_low_u16(dc2), vget_low_u16(vmovl_u8(sc)));
4256f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
4266f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org        scdc2_2 = vmull_high_u16(dc2, vmovl_u8(sc));
4276f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
428cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        scdc2_2 = vmull_u16(vget_high_u16(dc2), vget_high_u16(vmovl_u8(sc)));
4296f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
430cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    } else {
431cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        sc2 = vshll_n_u8(sc, 1);
432cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        scdc2_1 = vmull_u16(vget_low_u16(sc2), vget_low_u16(vmovl_u8(dc)));
4336f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
4346f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org        scdc2_2 = vmull_high_u16(sc2, vmovl_u8(dc));
4356f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
436cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        scdc2_2 = vmull_u16(vget_high_u16(sc2), vget_high_u16(vmovl_u8(dc)));
4376f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
438cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    }
439cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
440cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Calc COM
441cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    int32x4_t com1, com2;
442cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    com1 = vreinterpretq_s32_u32(
443cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                vmull_u16(vget_low_u16(const255), vget_low_u16(sc_plus_dc)));
444cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    com2 = vreinterpretq_s32_u32(
4456f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
4466f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org                vmull_high_u16(const255, sc_plus_dc));
4476f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
448cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                vmull_u16(vget_high_u16(const255), vget_high_u16(sc_plus_dc)));
4496f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
450cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
451cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Calc SUB
452cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    int32x4_t sub1, sub2;
453cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    sub1 = vreinterpretq_s32_u32(vaddl_u16(vget_low_u16(scda), vget_low_u16(dcsa)));
4546f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
4556f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    sub2 = vreinterpretq_s32_u32(vaddl_high_u16(scda, dcsa));
4566f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
457cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    sub2 = vreinterpretq_s32_u32(vaddl_u16(vget_high_u16(scda), vget_high_u16(dcsa)));
4586f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
459cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    sub1 = vsubq_s32(sub1, vreinterpretq_s32_u32(scdc2_1));
460cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    sub2 = vsubq_s32(sub2, vreinterpretq_s32_u32(scdc2_2));
461cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
462cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Compare 2*dc <= da
463cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t cmp;
464cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
465cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    if (overlay) {
466cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        cmp = vcleq_u16(dc2, vmovl_u8(da));
467cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    } else {
468cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        cmp = vcleq_u16(sc2, vmovl_u8(sa));
469cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    }
470cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
471cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Prepare variables
472cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    int32x4_t val1_1, val1_2;
473cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    int32x4_t val2_1, val2_2;
474cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint32x4_t cmp1, cmp2;
475cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
4766f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    // Doing a signed lengthening allows to save a few instructions
4776f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    // thanks to sign extension.
4786f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    cmp1 = vreinterpretq_u32_s32(vmovl_s16(vreinterpret_s16_u16(vget_low_u16(cmp))));
4796f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
4806f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    cmp2 = vreinterpretq_u32_s32(vmovl_high_s16(vreinterpretq_s16_u16(cmp)));
4816f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
4826f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    cmp2 = vreinterpretq_u32_s32(vmovl_s16(vreinterpret_s16_u16(vget_high_u16(cmp))));
4836f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
484cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
485cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Calc COM - SUB
486cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val1_1 = com1 - sub1;
487cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val1_2 = com2 - sub2;
488cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
489cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Calc COM + SUB - sa*da
490cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val2_1 = com1 + sub1;
491cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val2_2 = com2 + sub2;
492cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
493cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val2_1 = vsubq_s32(val2_1, vreinterpretq_s32_u32(vmovl_u16(vget_low_u16(sada))));
4946f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
4956f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    val2_2 = vsubq_s32(val2_2, vreinterpretq_s32_u32(vmovl_high_u16(sada)));
4966f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
497cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val2_2 = vsubq_s32(val2_2, vreinterpretq_s32_u32(vmovl_u16(vget_high_u16(sada))));
4986f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
499cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
500cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Insert where needed
501cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val1_1 = vbslq_s32(cmp1, val1_1, val2_1);
502cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val1_2 = vbslq_s32(cmp2, val1_2, val2_2);
503cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
504cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Call the clamp_div255round function
505cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return clamp_div255round_simd8_32(val1_1, val1_2);
506cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
507cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
508cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t overlay_color(uint8x8_t sc, uint8x8_t dc,
509cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                      uint8x8_t sa, uint8x8_t da) {
510cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return overlay_hardlight_color<true>(sc, dc, sa, da);
511cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
512cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
513cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t overlay_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
514cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
515cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
516cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = srcover_color(src.val[NEON_A], dst.val[NEON_A]);
517cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = overlay_color(src.val[NEON_R], dst.val[NEON_R],
518cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                    src.val[NEON_A], dst.val[NEON_A]);
519cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = overlay_color(src.val[NEON_G], dst.val[NEON_G],
520cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                    src.val[NEON_A], dst.val[NEON_A]);
521cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = overlay_color(src.val[NEON_B], dst.val[NEON_B],
522cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                    src.val[NEON_A], dst.val[NEON_A]);
523cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
524cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
525cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
526cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
527cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgtemplate <bool lighten>
528cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t lighten_darken_color(uint8x8_t sc, uint8x8_t dc,
529cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                             uint8x8_t sa, uint8x8_t da) {
530cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t sd, ds, cmp, tmp, tmp2;
531cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
532cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Prepare
533cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    sd = vmull_u8(sc, da);
534cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ds = vmull_u8(dc, sa);
535cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
536cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Do test
537cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    if (lighten) {
538cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        cmp = vcgtq_u16(sd, ds);
539cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    } else {
540cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        cmp = vcltq_u16(sd, ds);
541cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    }
542cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
543cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Assign if
544cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vaddl_u8(sc, dc);
545cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp2 = tmp;
546cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp -= SkDiv255Round_neon8_16_16(ds);
547cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
548cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Calc else
549cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp2 -= SkDiv255Round_neon8_16_16(sd);
550cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
551cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    // Insert where needed
552cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vbslq_u16(cmp, tmp, tmp2);
553cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
554cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return vmovn_u16(tmp);
555cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
556cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
557cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t darken_color(uint8x8_t sc, uint8x8_t dc,
558cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                     uint8x8_t sa, uint8x8_t da) {
559cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return lighten_darken_color<false>(sc, dc, sa, da);
560cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
561cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
562cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t darken_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
563cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
564cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
565cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = srcover_color(src.val[NEON_A], dst.val[NEON_A]);
566cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = darken_color(src.val[NEON_R], dst.val[NEON_R],
567cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                   src.val[NEON_A], dst.val[NEON_A]);
568cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = darken_color(src.val[NEON_G], dst.val[NEON_G],
569cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                   src.val[NEON_A], dst.val[NEON_A]);
570cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = darken_color(src.val[NEON_B], dst.val[NEON_B],
571cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                   src.val[NEON_A], dst.val[NEON_A]);
572cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
573cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
574cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
575cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
576cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t lighten_color(uint8x8_t sc, uint8x8_t dc,
577cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                      uint8x8_t sa, uint8x8_t da) {
578cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return lighten_darken_color<true>(sc, dc, sa, da);
579cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
580cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
581cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t lighten_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
582cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
583cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
584cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = srcover_color(src.val[NEON_A], dst.val[NEON_A]);
585cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = lighten_color(src.val[NEON_R], dst.val[NEON_R],
586cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                    src.val[NEON_A], dst.val[NEON_A]);
587cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = lighten_color(src.val[NEON_G], dst.val[NEON_G],
588cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                    src.val[NEON_A], dst.val[NEON_A]);
589cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = lighten_color(src.val[NEON_B], dst.val[NEON_B],
590cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                    src.val[NEON_A], dst.val[NEON_A]);
591cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
592cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
593cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
594cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
595cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t hardlight_color(uint8x8_t sc, uint8x8_t dc,
596cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                        uint8x8_t sa, uint8x8_t da) {
597cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return overlay_hardlight_color<false>(sc, dc, sa, da);
598cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
599cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
600cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t hardlight_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
601cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
602cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
603cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = srcover_color(src.val[NEON_A], dst.val[NEON_A]);
604cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = hardlight_color(src.val[NEON_R], dst.val[NEON_R],
605cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                      src.val[NEON_A], dst.val[NEON_A]);
606cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = hardlight_color(src.val[NEON_G], dst.val[NEON_G],
607cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                      src.val[NEON_A], dst.val[NEON_A]);
608cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = hardlight_color(src.val[NEON_B], dst.val[NEON_B],
609cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                      src.val[NEON_A], dst.val[NEON_A]);
610cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
611cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
612cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
613cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
614cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t difference_color(uint8x8_t sc, uint8x8_t dc,
615cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                         uint8x8_t sa, uint8x8_t da) {
616cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t sd, ds, tmp;
617cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    int16x8_t val;
618cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
619cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    sd = vmull_u8(sc, da);
620cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ds = vmull_u8(dc, sa);
621cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
622cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vminq_u16(sd, ds);
623cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = SkDiv255Round_neon8_16_16(tmp);
624cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    tmp = vshlq_n_u16(tmp, 1);
625cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
626cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val = vreinterpretq_s16_u16(vaddl_u8(sc, dc));
627cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
628cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val -= vreinterpretq_s16_u16(tmp);
629cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
630cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val = vmaxq_s16(val, vdupq_n_s16(0));
631cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val = vminq_s16(val, vdupq_n_s16(255));
632cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
633cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return vmovn_u16(vreinterpretq_u16_s16(val));
634cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
635cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
636cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t difference_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
637cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
638cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
639cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = srcover_color(src.val[NEON_A], dst.val[NEON_A]);
640cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = difference_color(src.val[NEON_R], dst.val[NEON_R],
641cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                       src.val[NEON_A], dst.val[NEON_A]);
642cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = difference_color(src.val[NEON_G], dst.val[NEON_G],
643cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                       src.val[NEON_A], dst.val[NEON_A]);
644cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = difference_color(src.val[NEON_B], dst.val[NEON_B],
645cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                       src.val[NEON_A], dst.val[NEON_A]);
646cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
647cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
648cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
649cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
650cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t exclusion_color(uint8x8_t sc, uint8x8_t dc,
651cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                        uint8x8_t sa, uint8x8_t da) {
652cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    /* The equation can be simplified to 255(sc + dc) - 2 * sc * dc */
653cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
654cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t sc_plus_dc, scdc, const255;
655cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    int32x4_t term1_1, term1_2, term2_1, term2_2;
656cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
657cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    /* Calc (sc + dc) and (sc * dc) */
658cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    sc_plus_dc = vaddl_u8(sc, dc);
659cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    scdc = vmull_u8(sc, dc);
660cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
661cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    /* Prepare constants */
662cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    const255 = vdupq_n_u16(255);
663cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
664cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    /* Calc the first term */
665cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    term1_1 = vreinterpretq_s32_u32(
666cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                vmull_u16(vget_low_u16(const255), vget_low_u16(sc_plus_dc)));
667cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    term1_2 = vreinterpretq_s32_u32(
6686f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
6696f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org                vmull_high_u16(const255, sc_plus_dc));
6706f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
671cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                vmull_u16(vget_high_u16(const255), vget_high_u16(sc_plus_dc)));
6726f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
673cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
674cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    /* Calc the second term */
675cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    term2_1 = vreinterpretq_s32_u32(vshll_n_u16(vget_low_u16(scdc), 1));
6766f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
6776f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    term2_2 = vreinterpretq_s32_u32(vshll_high_n_u16(scdc, 1));
6786f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
679cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    term2_2 = vreinterpretq_s32_u32(vshll_n_u16(vget_high_u16(scdc), 1));
6806f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
681cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
682cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return clamp_div255round_simd8_32(term1_1 - term2_1, term1_2 - term2_2);
683cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
684cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
685cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t exclusion_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
686cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
687cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
688cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = srcover_color(src.val[NEON_A], dst.val[NEON_A]);
689cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = exclusion_color(src.val[NEON_R], dst.val[NEON_R],
690cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                      src.val[NEON_A], dst.val[NEON_A]);
691cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = exclusion_color(src.val[NEON_G], dst.val[NEON_G],
692cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                      src.val[NEON_A], dst.val[NEON_A]);
693cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = exclusion_color(src.val[NEON_B], dst.val[NEON_B],
694cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                      src.val[NEON_A], dst.val[NEON_A]);
695cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
696cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
697cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
698cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
699cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgstatic inline uint8x8_t blendfunc_multiply_color(uint8x8_t sc, uint8x8_t dc,
700cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                                 uint8x8_t sa, uint8x8_t da) {
701cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint32x4_t val1, val2;
702cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint16x8_t scdc, t1, t2;
703cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
704cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    t1 = vmull_u8(sc, vdup_n_u8(255) - da);
705cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    t2 = vmull_u8(dc, vdup_n_u8(255) - sa);
706cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    scdc = vmull_u8(sc, dc);
707cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
708cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val1 = vaddl_u16(vget_low_u16(t1), vget_low_u16(t2));
7096f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
7106f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    val2 = vaddl_high_u16(t1, t2);
7116f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
712cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val2 = vaddl_u16(vget_high_u16(t1), vget_high_u16(t2));
7136f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
714cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
715cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val1 = vaddw_u16(val1, vget_low_u16(scdc));
7166f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
7176f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org    val2 = vaddw_high_u16(val2, scdc);
7186f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
719cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    val2 = vaddw_u16(val2, vget_high_u16(scdc));
7206f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
721cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
722cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return clamp_div255round_simd8_32(
723cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                vreinterpretq_s32_u32(val1), vreinterpretq_s32_u32(val2));
724cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
725cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
726cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orguint8x8x4_t multiply_modeproc_neon8(uint8x8x4_t src, uint8x8x4_t dst) {
727cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    uint8x8x4_t ret;
728cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
729cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_A] = srcover_color(src.val[NEON_A], dst.val[NEON_A]);
730cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_R] = blendfunc_multiply_color(src.val[NEON_R], dst.val[NEON_R],
731cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                               src.val[NEON_A], dst.val[NEON_A]);
732cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_G] = blendfunc_multiply_color(src.val[NEON_G], dst.val[NEON_G],
733cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                               src.val[NEON_A], dst.val[NEON_A]);
734cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    ret.val[NEON_B] = blendfunc_multiply_color(src.val[NEON_B], dst.val[NEON_B],
735cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                               src.val[NEON_A], dst.val[NEON_A]);
736cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
737cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return ret;
738cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
739cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
740cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
741cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
742cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgtypedef uint8x8x4_t (*SkXfermodeProcSIMD)(uint8x8x4_t src, uint8x8x4_t dst);
743cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
744cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgextern SkXfermodeProcSIMD gNEONXfermodeProcs[];
745cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
7469fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
7479fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reedSkNEONProcCoeffXfermode::SkNEONProcCoeffXfermode(SkReadBuffer& buffer) : INHERITED(buffer) {
748cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    fProcSIMD = reinterpret_cast<void*>(gNEONXfermodeProcs[this->getMode()]);
749cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
7509fa60daad4d5f54c0dbe3dbcc7608a8f6d721187reed#endif
751cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
7524dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petitvoid SkNEONProcCoeffXfermode::xfer32(SkPMColor* SK_RESTRICT dst,
7534dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                                     const SkPMColor* SK_RESTRICT src, int count,
7544dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                                     const SkAlpha* SK_RESTRICT aa) const {
755cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    SkASSERT(dst && src && count >= 0);
756cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
757cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    SkXfermodeProc proc = this->getProc();
758cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    SkXfermodeProcSIMD procSIMD = reinterpret_cast<SkXfermodeProcSIMD>(fProcSIMD);
759bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org    SkASSERT(procSIMD != NULL);
760cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
761cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    if (NULL == aa) {
762cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        // Unrolled NEON code
7634dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit        // We'd like to just do this (modulo a few casts):
7644dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit        // vst4_u8(dst, procSIMD(vld4_u8(src), vld4_u8(dst)));
7654dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit        // src += 8;
7664dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit        // dst += 8;
7674dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit        // but that tends to generate miserable code. Here are a bunch of faster
7684dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit        // workarounds for different architectures and compilers.
769cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        while (count >= 8) {
770cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
7714dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit#ifdef SK_CPU_ARM32
7724dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit            uint8x8x4_t vsrc, vdst, vres;
773bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 6))
774cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            asm volatile (
775cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                "vld4.u8    %h[vsrc], [%[src]]!  \t\n"
776cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                "vld4.u8    %h[vdst], [%[dst]]   \t\n"
777cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                : [vsrc] "=w" (vsrc), [vdst] "=w" (vdst), [src] "+&r" (src)
778cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                : [dst] "r" (dst)
779cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                :
780cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            );
781cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#else
782cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            register uint8x8_t d0 asm("d0");
783cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            register uint8x8_t d1 asm("d1");
784cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            register uint8x8_t d2 asm("d2");
785cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            register uint8x8_t d3 asm("d3");
786cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            register uint8x8_t d4 asm("d4");
787cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            register uint8x8_t d5 asm("d5");
788cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            register uint8x8_t d6 asm("d6");
789cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            register uint8x8_t d7 asm("d7");
790cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
791cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            asm volatile (
792cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                "vld4.u8    {d0-d3},[%[src]]!;"
793cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                "vld4.u8    {d4-d7},[%[dst]];"
794cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                : "=w" (d0), "=w" (d1), "=w" (d2), "=w" (d3),
795cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                  "=w" (d4), "=w" (d5), "=w" (d6), "=w" (d7),
796cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                  [src] "+&r" (src)
797cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                : [dst] "r" (dst)
798cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                :
799cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            );
800cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            vsrc.val[0] = d0; vdst.val[0] = d4;
801cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            vsrc.val[1] = d1; vdst.val[1] = d5;
802cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            vsrc.val[2] = d2; vdst.val[2] = d6;
803cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            vsrc.val[3] = d3; vdst.val[3] = d7;
804cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#endif
805cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
806cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            vres = procSIMD(vsrc, vdst);
807cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
808cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            vst4_u8((uint8_t*)dst, vres);
809cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
810cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            dst += 8;
8114dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit
8124dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit#else // #ifdef SK_CPU_ARM32
8134dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit
8144dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit            asm volatile (
8154dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                "ld4    {v0.8b - v3.8b}, [%[src]], #32 \t\n"
8164dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                "ld4    {v4.8b - v7.8b}, [%[dst]]      \t\n"
8174dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                "blr    %[proc]                        \t\n"
8184dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                "st4    {v0.8b - v3.8b}, [%[dst]], #32 \t\n"
8194dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                : [src] "+&r" (src), [dst] "+&r" (dst)
8204dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                : [proc] "r" (procSIMD)
8214dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                : "cc", "memory",
8224dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                  /* We don't know what proc is going to clobber so we must
8234dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                   * add everything that is not callee-saved.
8244dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                   */
8254dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                  "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9",
8264dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                  "x10", "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18",
82799ac155aef9c2349d399360973c0e049cb92b906Ben Murdoch                  "x30", /* x30 implicitly clobbered by blr */
8284dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                  "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v16", "v17",
8294dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                  "v18", "v19", "v20", "v21", "v22", "v23", "v24", "v25", "v26",
8304dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit                  "v27", "v28", "v29", "v30", "v31"
8314dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit            );
8324dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit
8334dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit#endif // #ifdef SK_CPU_ARM32
8344dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit
8354dc94d9dfc62ea22649952fbaa1fdb95bab61d7akevin.petit            count -= 8;
836cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        }
837cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        // Leftovers
838cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        for (int i = 0; i < count; i++) {
839cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            dst[i] = proc(src[i], dst[i]);
840cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        }
841cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    } else {
842cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        for (int i = count - 1; i >= 0; --i) {
843cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            unsigned a = aa[i];
844cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            if (0 != a) {
845cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                SkPMColor dstC = dst[i];
846cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                SkPMColor C = proc(src[i], dstC);
847cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                if (a != 0xFF) {
84846e266cdbe6da0a4553ec0004bcc7f9524829c9ecommit-bot@chromium.org                    C = SkFourByteInterp_neon(C, dstC, a);
849cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                }
850cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                dst[i] = C;
851cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org            }
852cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        }
853cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    }
854cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
855cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
856bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.orgvoid SkNEONProcCoeffXfermode::xfer16(uint16_t* SK_RESTRICT dst,
857bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                                     const SkPMColor* SK_RESTRICT src, int count,
858bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                                     const SkAlpha* SK_RESTRICT aa) const {
859bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org    SkASSERT(dst && src && count >= 0);
860bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
861bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org    SkXfermodeProc proc = this->getProc();
862bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org    SkXfermodeProcSIMD procSIMD = reinterpret_cast<SkXfermodeProcSIMD>(fProcSIMD);
863bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org    SkASSERT(procSIMD != NULL);
864bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
865bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org    if (NULL == aa) {
866bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org        while(count >= 8) {
867bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            uint16x8_t vdst, vres16;
868bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            uint8x8x4_t vdst32, vsrc, vres;
869bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
870bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vdst = vld1q_u16(dst);
871bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
8726f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
8736f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org            vsrc = vld4_u8((uint8_t*)src);
8746f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#else
875bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org#if (__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ > 6))
876bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            asm volatile (
877bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                "vld4.u8    %h[vsrc], [%[src]]!  \t\n"
878bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                : [vsrc] "=w" (vsrc), [src] "+&r" (src)
879bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                : :
880bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            );
881bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org#else
882bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            register uint8x8_t d0 asm("d0");
883bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            register uint8x8_t d1 asm("d1");
884bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            register uint8x8_t d2 asm("d2");
885bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            register uint8x8_t d3 asm("d3");
886bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
887bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            asm volatile (
888bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                "vld4.u8    {d0-d3},[%[src]]!;"
889bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                : "=w" (d0), "=w" (d1), "=w" (d2), "=w" (d3),
890bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                  [src] "+&r" (src)
891bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                : :
892bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            );
893bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vsrc.val[0] = d0;
894bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vsrc.val[1] = d1;
895bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vsrc.val[2] = d2;
896bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vsrc.val[3] = d3;
897bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org#endif
8986f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif // #ifdef SK_CPU_ARM64
899bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
900bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vdst32 = SkPixel16ToPixel32_neon8(vdst);
901bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vres = procSIMD(vsrc, vdst32);
902bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vres16 = SkPixel32ToPixel16_neon8(vres);
903bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
904bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            vst1q_u16(dst, vres16);
905bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
906bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            count -= 8;
907bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            dst += 8;
9086f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#ifdef SK_CPU_ARM64
9096f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org            src += 8;
9106f2d4d4679f5f0e1a1b5c2e940f1b65e34d94649commit-bot@chromium.org#endif
911bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org        }
912bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org        for (int i = 0; i < count; i++) {
913bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            SkPMColor dstC = SkPixel16ToPixel32(dst[i]);
914bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            dst[i] = SkPixel32ToPixel16_ToU16(proc(src[i], dstC));
915bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org        }
916bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org    } else {
917bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org        for (int i = count - 1; i >= 0; --i) {
918bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            unsigned a = aa[i];
919bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            if (0 != a) {
920bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                SkPMColor dstC = SkPixel16ToPixel32(dst[i]);
921bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                SkPMColor C = proc(src[i], dstC);
922bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                if (0xFF != a) {
92346e266cdbe6da0a4553ec0004bcc7f9524829c9ecommit-bot@chromium.org                    C = SkFourByteInterp_neon(C, dstC, a);
924bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                }
925bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org                dst[i] = SkPixel32ToPixel16_ToU16(C);
926bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org            }
927bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org        }
928bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org    }
929bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org}
930bc25dfc798fff225ce65355ecda19d2b85bd0e74commit-bot@chromium.org
9310f10f7bf1fb43ca6346dc220a076773b1f19a367commit-bot@chromium.org#ifndef SK_IGNORE_TO_STRING
932cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgvoid SkNEONProcCoeffXfermode::toString(SkString* str) const {
933cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    this->INHERITED::toString(str);
934cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
935cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org#endif
936cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
937cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org////////////////////////////////////////////////////////////////////////////////
938cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
939cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgSkXfermodeProcSIMD gNEONXfermodeProcs[] = {
940cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kClear_Mode
941cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kSrc_Mode
942cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kDst_Mode
943cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kSrcOver_Mode
944cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    dstover_modeproc_neon8,
945cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    srcin_modeproc_neon8,
946cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    dstin_modeproc_neon8,
947cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    srcout_modeproc_neon8,
948cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    dstout_modeproc_neon8,
949cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    srcatop_modeproc_neon8,
950cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    dstatop_modeproc_neon8,
951cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    xor_modeproc_neon8,
952cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    plus_modeproc_neon8,
953cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    modulate_modeproc_neon8,
954cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    screen_modeproc_neon8,
955cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
956cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    overlay_modeproc_neon8,
957cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    darken_modeproc_neon8,
958cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    lighten_modeproc_neon8,
959cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kColorDodge_Mode
960cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kColorBurn_Mode
961cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    hardlight_modeproc_neon8,
962cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kSoftLight_Mode
963cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    difference_modeproc_neon8,
964cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    exclusion_modeproc_neon8,
965cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    multiply_modeproc_neon8,
966cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
967cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kHue_Mode
968cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kSaturation_Mode
969cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kColor_Mode
970cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    NULL, // kLuminosity_Mode
971cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org};
972cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
973cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgSK_COMPILE_ASSERT(
974cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    SK_ARRAY_COUNT(gNEONXfermodeProcs) == SkXfermode::kLastMode + 1,
975cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    mode_count_arm
976cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org);
977cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
978d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.orgSkXfermodeProc gNEONXfermodeProcs1[] = {
979d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kClear_Mode
980d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kSrc_Mode
981d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kDst_Mode
982d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kSrcOver_Mode
983d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kDstOver_Mode
984d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kSrcIn_Mode
985d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kDstIn_Mode
986d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kSrcOut_Mode
987d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kDstOut_Mode
988d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    srcatop_modeproc_neon,
989d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    dstatop_modeproc_neon,
990d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    xor_modeproc_neon,
991d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    plus_modeproc_neon,
992d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    modulate_modeproc_neon,
993d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kScreen_Mode
994d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
995d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kOverlay_Mode
996d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kDarken_Mode
997d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kLighten_Mode
998d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kColorDodge_Mode
999d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kColorBurn_Mode
1000d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kHardLight_Mode
1001d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kSoftLight_Mode
1002d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kDifference_Mode
1003d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kExclusion_Mode
1004d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kMultiply_Mode
1005d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
1006d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kHue_Mode
1007d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kSaturation_Mode
1008d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kColor_Mode
1009d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    NULL, // kLuminosity_Mode
1010d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org};
1011d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
1012d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.orgSK_COMPILE_ASSERT(
1013d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    SK_ARRAY_COUNT(gNEONXfermodeProcs1) == SkXfermode::kLastMode + 1,
1014d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    mode1_count_arm
1015d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org);
1016d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
1017cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.orgSkProcCoeffXfermode* SkPlatformXfermodeFactory_impl_neon(const ProcCoeff& rec,
1018cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org                                                         SkXfermode::Mode mode) {
1019cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
1020cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    void* procSIMD = reinterpret_cast<void*>(gNEONXfermodeProcs[mode]);
1021cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org
1022cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    if (procSIMD != NULL) {
1023cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org        return SkNEW_ARGS(SkNEONProcCoeffXfermode, (rec, mode, procSIMD));
1024cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    }
1025cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org    return NULL;
1026cd7992ba55e8b87580f54e7c19fc033bed01640dcommit-bot@chromium.org}
1027d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org
1028d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.orgSkXfermodeProc SkPlatformXfermodeProcFactory_impl_neon(SkXfermode::Mode mode) {
1029d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org    return gNEONXfermodeProcs1[mode];
1030d611864e679a58865b111e74fe7ac919cba42163commit-bot@chromium.org}
1031