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