Index: src/opts/SkBlitRow_opts_arm_neon.cpp |
diff --git a/src/opts/SkBlitRow_opts_arm_neon.cpp b/src/opts/SkBlitRow_opts_arm_neon.cpp |
index 3cb5a92f86b1d9310a47a62af9582099c6bc770b..3ab00e3fc95ddcca091acff7dc7435466977c8f6 100644 |
--- a/src/opts/SkBlitRow_opts_arm_neon.cpp |
+++ b/src/opts/SkBlitRow_opts_arm_neon.cpp |
@@ -909,7 +909,8 @@ void S32_Blend_BlitRow32_neon(SkPMColor* SK_RESTRICT dst, |
vdst_wide = vmull_u8(vdst, vdup_n_u8(dst_scale)); |
// Combine |
- vres = vshrn_n_u16(vdst_wide, 8) + vshrn_n_u16(vsrc_wide, 8); |
+ vdst_wide += vsrc_wide; |
+ vres = vshrn_n_u16(vdst_wide, 8); |
// Store |
vst1_u32(dst, vreinterpret_u32_u8(vres)); |
@@ -931,7 +932,8 @@ void S32_Blend_BlitRow32_neon(SkPMColor* SK_RESTRICT dst, |
vsrc_wide = vmovl_u8(vsrc); |
vsrc_wide = vmulq_u16(vsrc_wide, vdupq_n_u16(src_scale)); |
vdst_wide = vmull_u8(vdst, vdup_n_u8(dst_scale)); |
- vres = vshrn_n_u16(vdst_wide, 8) + vshrn_n_u16(vsrc_wide, 8); |
+ vdst_wide += vsrc_wide; |
+ vres = vshrn_n_u16(vdst_wide, 8); |
// Store |
vst1_lane_u32(dst, vreinterpret_u32_u8(vres), 0); |
@@ -964,8 +966,8 @@ void S32A_Blend_BlitRow32_neon(SkPMColor* SK_RESTRICT dst, |
// Calc dst_scale |
dst_scale = vget_lane_u8(vsrc, 3); |
dst_scale *= alpha256; |
+ dst_scale = (256<<8) - dst_scale; |
dst_scale >>= 8; |
- dst_scale = 256 - dst_scale; |
// Process src |
vsrc_wide = vmovl_u8(vsrc); |
@@ -976,7 +978,8 @@ void S32A_Blend_BlitRow32_neon(SkPMColor* SK_RESTRICT dst, |
vdst_wide = vmulq_n_u16(vdst_wide, dst_scale); |
// Combine |
- vres = vshrn_n_u16(vdst_wide, 8) + vshrn_n_u16(vsrc_wide, 8); |
+ vdst_wide += vsrc_wide; |
+ vres = vshrn_n_u16(vdst_wide, 8); |
vst1_lane_u32(dst, vreinterpret_u32_u8(vres), 0); |
dst++; |
@@ -1007,9 +1010,8 @@ void S32A_Blend_BlitRow32_neon(SkPMColor* SK_RESTRICT dst, |
// Calc dst_scale |
vsrc_alphas = vtbl1_u8(vsrc, alpha_mask); |
vdst_scale = vmovl_u8(vsrc_alphas); |
- vdst_scale *= vsrc_scale; |
- vdst_scale = vshrq_n_u16(vdst_scale, 8); |
- vdst_scale = vsubq_u16(vdupq_n_u16(256), vdst_scale); |
+ vdst_scale = vmlsq_u16(vdupq_n_u16(255<<8), vdst_scale, vsrc_scale); |
+ vdst_scale = vsraq_n_u16(vdupq_n_u16(1), vdst_scale, 8); |
// Process src |
vsrc_wide = vmovl_u8(vsrc); |
@@ -1020,7 +1022,8 @@ void S32A_Blend_BlitRow32_neon(SkPMColor* SK_RESTRICT dst, |
vdst_wide *= vdst_scale; |
// Combine |
- vres = vshrn_n_u16(vdst_wide, 8) + vshrn_n_u16(vsrc_wide, 8); |
+ vdst_wide += vsrc_wide; |
+ vres = vshrn_n_u16(vdst_wide, 8); |
vst1_u32(dst, vreinterpret_u32_u8(vres)); |