aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/opts/SkRasterPipeline_opts.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/opts/SkRasterPipeline_opts.h')
-rw-r--r--src/opts/SkRasterPipeline_opts.h5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/opts/SkRasterPipeline_opts.h b/src/opts/SkRasterPipeline_opts.h
index 212a5d16aa..73624d1b02 100644
--- a/src/opts/SkRasterPipeline_opts.h
+++ b/src/opts/SkRasterPipeline_opts.h
@@ -2487,6 +2487,11 @@ static void start_pipeline(const size_t x0, const size_t y0,
SI U16 div255(U16 v) {
#if 0
return (v+127)/255; // The ideal rounding divide by 255.
+#elif 1 && defined(__ARM_NEON)
+ // With NEON we can compute (v+127)/255 as (v + ((v+128)>>8) + 128)>>8
+ // just as fast as we can do the approximation below, so might as well be correct!
+ // First we compute v + ((v+128)>>8), then one more round of (...+128)>>8 to finish up.
+ return vrshrq_n_u16(vrsraq_n_u16(v, v, 8), 8);
#else
return (v+255)/256; // A good approximation of (v+127)/255.
#endif