diff --git a/bench/SkBlend_optsBench.cpp b/bench/SkBlend_optsBench.cpp
deleted file mode 100644
index d7ba2be..0000000
--- a/bench/SkBlend_optsBench.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <tuple>
-
-#include "Benchmark.h"
-#include "Resources.h"
-#include "SkCpu.h"
-#include "SkImage.h"
-#include "SkImage_Base.h"
-#include "SkNx.h"
-#include "SkOpts.h"
-#include "SkPM4fPriv.h"
-#include "SkString.h"
-
-#define INNER_LOOPS 10
-
-static inline void brute_srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) {
-    auto d = Sk4f_fromS32(*dst),
-         s = Sk4f_fromS32( src);
-    *dst = Sk4f_toS32(s + d * (1.0f - s[3]));
-}
-
-static inline void srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) {
-    if (src >= 0xFF000000) {
-        *dst = src;
-        return;
-    }
-    brute_srcover_srgb_srgb_1(dst, src);
-}
-
-static void brute_force_srcover_srgb_srgb(
-    uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) {
-    while (ndst > 0) {
-        int n = SkTMin(ndst, nsrc);
-
-        for (int i = 0; i < n; i++) {
-            brute_srcover_srgb_srgb_1(dst++, src[i]);
-        }
-        ndst -= n;
-    }
-}
-
-static void trivial_srcover_srgb_srgb(
-    uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) {
-    while (ndst > 0) {
-        int n = SkTMin(ndst, nsrc);
-
-        for (int i = 0; i < n; i++) {
-            srcover_srgb_srgb_1(dst++, src[i]);
-        }
-        ndst -= n;
-    }
-}
-
-static void best_non_simd_srcover_srgb_srgb(
-    uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) {
-    uint64_t* ddst = reinterpret_cast<uint64_t*>(dst);
-
-    auto srcover_srgb_srgb_2 = [](uint32_t* dst, const uint32_t* src) {
-        srcover_srgb_srgb_1(dst++, *src++);
-        srcover_srgb_srgb_1(dst, *src);
-    };
-
-    while (ndst >0) {
-        int count = SkTMin(ndst, nsrc);
-        ndst -= count;
-        const uint64_t* dsrc = reinterpret_cast<const uint64_t*>(src);
-        const uint64_t* end = dsrc + (count >> 1);
-        do {
-            if ((~*dsrc & 0xFF000000FF000000) == 0) {
-                do {
-                    *ddst++ = *dsrc++;
-                } while (dsrc < end && (~*dsrc & 0xFF000000FF000000) == 0);
-            } else if ((*dsrc & 0xFF000000FF000000) == 0) {
-                do {
-                    dsrc++;
-                    ddst++;
-                } while (dsrc < end && (*dsrc & 0xFF000000FF000000) == 0);
-            } else {
-                srcover_srgb_srgb_2(reinterpret_cast<uint32_t*>(ddst++),
-                                    reinterpret_cast<const uint32_t*>(dsrc++));
-            }
-        } while (dsrc < end);
-
-        if ((count & 1) != 0) {
-            uint32_t s1;
-            memcpy(&s1, dsrc, 4);
-            srcover_srgb_srgb_1(reinterpret_cast<uint32_t*>(ddst), s1);
-        }
-    }
-}
-
-class SrcOverVSkOptsBruteForce {
-public:
-    static SkString Name() { return SkString{"VSkOptsBruteForce"}; }
-    static void BlendN(uint32_t* dst, const uint32_t* src, int count) {
-        brute_force_srcover_srgb_srgb(dst, src, count, count);
-    }
-};
-
-class SrcOverVSkOptsTrivial {
-public:
-    static SkString Name() { return SkString{"VSkOptsTrivial"}; }
-    static void BlendN(uint32_t* dst, const uint32_t* src, int count) {
-        trivial_srcover_srgb_srgb(dst, src, count, count);
-    }
-};
-
-class SrcOverVSkOptsNonSimdCore {
-public:
-    static SkString Name() { return SkString{"VSkOptsNonSimdCore"}; }
-    static void BlendN(uint32_t* dst, const uint32_t* src, int count) {
-        best_non_simd_srcover_srgb_srgb(dst, src, count, count);
-    }
-};
-
-class SrcOverVSkOptsDefault {
-public:
-    static SkString Name() { return SkString{"VSkOptsDefault"}; }
-    static void BlendN(uint32_t* dst, const uint32_t* src, int count) {
-        SkOpts::srcover_srgb_srgb(dst, src, count, count);
-    }
-};
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-template <typename Blender>
-class LinearSrcOverBench : public Benchmark {
-public:
-    LinearSrcOverBench(const char* fileName) : fFileName(fileName) {
-        fName = "LinearSrcOver_";
-        fName.append(fileName);
-        fName.append(Blender::Name());
-    }
-
-protected:
-    bool isSuitableFor(Backend backend) override { return backend == kNonRendering_Backend; }
-    const char* onGetName() override { return fName.c_str(); }
-
-    void onPreDraw(SkCanvas*) override {
-        if (!fPixmap.addr()) {
-            sk_sp<SkImage> image = GetResourceAsImage(fFileName.c_str());
-            SkBitmap bm;
-            SkColorSpace* legacyColorSpace = nullptr;
-            if (!as_IB(image)->getROPixels(&bm, legacyColorSpace)) {
-                SkFAIL("Could not read resource");
-            }
-            bm.peekPixels(&fPixmap);
-            fCount = fPixmap.rowBytesAsPixels();
-            fDst.reset(fCount);
-            sk_bzero(fDst.get(), fPixmap.rowBytes());
-        }
-    }
-
-    void onDraw(int loops, SkCanvas*) override {
-        SkASSERT(fPixmap.colorType() == kN32_SkColorType);
-
-        const int width = fPixmap.rowBytesAsPixels();
-
-        for (int i = 0; i < loops * INNER_LOOPS; ++i) {
-            const uint32_t* src = fPixmap.addr32();
-            for (int y = 0; y < fPixmap.height(); y++) {
-                Blender::BlendN(fDst.get(), src, width);
-                src += width;
-            }
-        }
-    }
-
-    void onPostDraw(SkCanvas*) override {
-        // Make sure the compiler does not optimize away the operation.
-        volatile uint32_t v = 0;
-        for (int i = 0; i < fCount; i++) {
-            v ^= fDst[i];
-        }
-    }
-
-private:
-    int fCount;
-    SkAutoTArray<uint32_t> fDst;
-    SkString fFileName;
-    SkString fName;
-    SkPixmap fPixmap;
-
-    typedef Benchmark INHERITED;
-};
-
-#define BENCHES(fileName)                                                            \
-    DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsBruteForce>(fileName); )  \
-    DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsTrivial>(fileName); )     \
-    DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsNonSimdCore>(fileName); ) \
-    DEF_BENCH( return new LinearSrcOverBench<SrcOverVSkOptsDefault>(fileName); )
-
-BENCHES("yellow_rose.png")
-BENCHES("baby_tux.png")
-BENCHES("plane.png")
-BENCHES("mandrill_512.png")
-BENCHES("iconstrip.png")
diff --git a/gn/bench.gni b/gn/bench.gni
index a61fdbf..47a1d82 100644
--- a/gn/bench.gni
+++ b/gn/bench.gni
@@ -106,7 +106,6 @@
   "$_bench/ShadowBench.cpp",
   "$_bench/ShapesBench.cpp",
   "$_bench/Sk4fBench.cpp",
-  "$_bench/SkBlend_optsBench.cpp",
   "$_bench/SkGlyphCacheBench.cpp",
   "$_bench/SKPAnimationBench.cpp",
   "$_bench/SKPBench.cpp",
diff --git a/gn/tests.gni b/gn/tests.gni
index 9b5613a..35c43c5 100644
--- a/gn/tests.gni
+++ b/gn/tests.gni
@@ -200,7 +200,6 @@
   "$_tests/SizeTest.cpp",
   "$_tests/Sk4x4fTest.cpp",
   "$_tests/SkBase64Test.cpp",
-  "$_tests/SkBlend_optsTest.cpp",
   "$_tests/skbug5221.cpp",
   "$_tests/skbug6389.cpp",
   "$_tests/skbug6653.cpp",
diff --git a/src/core/SkOpts.cpp b/src/core/SkOpts.cpp
index 33c3690..2b7f1f2 100644
--- a/src/core/SkOpts.cpp
+++ b/src/core/SkOpts.cpp
@@ -37,7 +37,6 @@
 #endif
 
 #include "SkBitmapFilter_opts.h"
-#include "SkBlend_opts.h"
 #include "SkBlitMask_opts.h"
 #include "SkBlitRow_opts.h"
 #include "SkBlurImageFilter_opts.h"
@@ -80,8 +79,6 @@
     DEFINE_DEFAULT(inverted_CMYK_to_RGB1);
     DEFINE_DEFAULT(inverted_CMYK_to_BGR1);
 
-    DEFINE_DEFAULT(srcover_srgb_srgb);
-
     DEFINE_DEFAULT(memset16);
     DEFINE_DEFAULT(memset32);
     DEFINE_DEFAULT(memset64);
diff --git a/src/core/SkOpts.h b/src/core/SkOpts.h
index a4f1ea2..92d6f28 100644
--- a/src/core/SkOpts.h
+++ b/src/core/SkOpts.h
@@ -49,10 +49,6 @@
                         inverted_CMYK_to_RGB1, // i.e. convert color space
                         inverted_CMYK_to_BGR1; // i.e. convert color space
 
-    // Blend ndst src pixels over dst, where both src and dst point to sRGB pixels (RGBA or BGRA).
-    // If nsrc < ndst, we loop over src to create a pattern.
-    extern void (*srcover_srgb_srgb)(uint32_t* dst, const uint32_t* src, int ndst, int nsrc);
-
     extern void (*memset16)(uint16_t[], uint16_t, int);
     extern void (*memset32)(uint32_t[], uint32_t, int);
     extern void (*memset64)(uint64_t[], uint64_t, int);
diff --git a/src/opts/SkBlend_opts.h b/src/opts/SkBlend_opts.h
deleted file mode 100644
index 86ae502..0000000
--- a/src/opts/SkBlend_opts.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-/*
-ninja -C out/Release dm nanobench ; and ./out/Release/dm --match Blend_opts ; and ./out/Release/nanobench  --samples 300 --nompd --match LinearSrcOver -q
- */
-
-#ifndef SkBlend_opts_DEFINED
-#define SkBlend_opts_DEFINED
-
-#include "SkNx.h"
-#include "SkPM4fPriv.h"
-
-#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE41
-    #include <immintrin.h>
-#endif
-
-namespace SK_OPTS_NS {
-
-static inline void srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) {
-    if (src >= 0xFF000000) {
-        *dst = src;
-        return;
-    }
-    auto d = Sk4f_fromS32(*dst),
-         s = Sk4f_fromS32( src);
-    *dst = Sk4f_toS32(s + d * (1.0f - s[3]));
-}
-
-static inline void srcover_srgb_srgb_4(uint32_t* dst, const uint32_t* src) {
-    srcover_srgb_srgb_1(dst++, *src++);
-    srcover_srgb_srgb_1(dst++, *src++);
-    srcover_srgb_srgb_1(dst++, *src++);
-    srcover_srgb_srgb_1(dst  , *src  );
-}
-
-#if SK_CPU_SSE_LEVEL >= SK_CPU_SSE_LEVEL_SSE41
-
-    static inline __m128i load(const uint32_t* p) {
-        return _mm_loadu_si128(reinterpret_cast<const __m128i*>(p));
-    }
-
-    static inline void store(uint32_t* p, __m128i v) {
-        _mm_storeu_si128(reinterpret_cast<__m128i*>(p), v);
-    }
-
-    static void srcover_srgb_srgb(
-            uint32_t* dst, const uint32_t* const srcStart, int ndst, const int nsrc) {
-        const __m128i alphaMask = _mm_set1_epi32(0xFF000000);
-        while (ndst > 0) {
-            int count = SkTMin(ndst, nsrc);
-            ndst -= count;
-            const uint32_t* src = srcStart;
-            const uint32_t* end = dst + (count & ~3);
-
-            while (dst < end) {
-                __m128i pixels = load(src);
-
-                if (_mm_testc_si128(pixels, alphaMask)) {
-                    store(dst, pixels);
-                } else if (!_mm_testz_si128(pixels, alphaMask)) {
-                    srcover_srgb_srgb_4(dst, src);
-                }
-
-                dst += 4;
-                src += 4;
-            }
-
-            count = count & 3;
-            while (count-- > 0) {
-                srcover_srgb_srgb_1(dst++, *src++);
-            }
-        }
-    }
-
-#else
-
-    static void srcover_srgb_srgb(
-        uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) {
-        while (ndst > 0) {
-            int n = SkTMin(ndst, nsrc);
-
-            for (int i = 0; i < n; i++) {
-                srcover_srgb_srgb_1(dst++, src[i]);
-            }
-            ndst -= n;
-        }
-    }
-
-#endif
-
-}  // namespace SK_OPTS_NS
-
-#endif//SkBlend_opts_DEFINED
diff --git a/src/opts/SkOpts_sse41.cpp b/src/opts/SkOpts_sse41.cpp
index 17ce066..6fd7c3c 100644
--- a/src/opts/SkOpts_sse41.cpp
+++ b/src/opts/SkOpts_sse41.cpp
@@ -10,14 +10,12 @@
 #define SK_OPTS_NS sse41
 #include "SkBlurImageFilter_opts.h"
 #include "SkBlitRow_opts.h"
-#include "SkBlend_opts.h"
 
 namespace SkOpts {
     void Init_sse41() {
         box_blur_xx          = sse41::box_blur_xx;
         box_blur_xy          = sse41::box_blur_xy;
         box_blur_yx          = sse41::box_blur_yx;
-        srcover_srgb_srgb    = sse41::srcover_srgb_srgb;
         blit_row_s32a_opaque = sse41::blit_row_s32a_opaque;
     }
 }
diff --git a/tests/SkBlend_optsTest.cpp b/tests/SkBlend_optsTest.cpp
deleted file mode 100644
index f8cf2d8..0000000
--- a/tests/SkBlend_optsTest.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2016 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-#include <string>
-#include <tuple>
-#include <vector>
-#include "Resources.h"
-#include "SkCpu.h"
-#include "SkImage.h"
-#include "SkImage_Base.h"
-#include "SkOpts.h"
-#include "SkPM4fPriv.h"
-#include "SkNx.h"
-#include "Test.h"
-
-typedef void (*Blender)(uint32_t* dst, const uint32_t* const srcStart, int ndst, const int nsrc);
-
-static inline void srcover_srgb_srgb_1(uint32_t* dst, uint32_t src) {
-    auto d = Sk4f_fromS32(*dst),
-         s = Sk4f_fromS32( src);
-    *dst = Sk4f_toS32(s + d * (1.0f - s[3]));
-}
-
-static void brute_force_srcover_srgb_srgb(
-    uint32_t* dst, const uint32_t* const src, int ndst, const int nsrc) {
-    while (ndst > 0) {
-        int n = SkTMin(ndst, nsrc);
-
-        for (int i = 0; i < n; i++) {
-            srcover_srgb_srgb_1(dst++, src[i]);
-        }
-        ndst -= n;
-    }
-}
-
-static SkString mismatch_message(std::string resourceName, int x, int y,
-                                  uint32_t src, uint32_t good, uint32_t bad) {
-    return SkStringPrintf(
-        "%s - missmatch at %d, %d src: %08x good: %08x bad: %08x",
-        resourceName.c_str(), x, y, src, good, bad);
-}
-
-static void test_blender(std::string resourceName, skiatest::Reporter* reporter) {
-    std::string fileName = resourceName + ".png";
-    sk_sp<SkImage> image = GetResourceAsImage(fileName.c_str());
-    if (image == nullptr) {
-        ERRORF(reporter, "image is NULL");
-        return;
-    }
-    SkBitmap bm;
-    sk_sp<SkColorSpace> srgbColorSpace = SkColorSpace::MakeSRGB();
-    if (!as_IB(image)->getROPixels(&bm, srgbColorSpace.get())) {
-        ERRORF(reporter, "Could not read resource");
-        return;
-    }
-
-    SkPixmap pixmap;
-    bm.peekPixels(&pixmap);
-    SkASSERTF(pixmap.colorType() == kN32_SkColorType, "colorType: %d", pixmap.colorType());
-    SkASSERT(pixmap.alphaType() != kUnpremul_SkAlphaType);
-    const uint32_t* src = pixmap.addr32();
-    const int width = pixmap.rowBytesAsPixels();
-    SkASSERT(width > 0);
-    SkASSERT(width < 4000);
-    SkAutoTArray<uint32_t> correctDst(width);
-    SkAutoTArray<uint32_t> testDst(width);
-
-    for (int y = 0; y < pixmap.height(); y++) {
-        // TODO: zero is not the most interesting dst to test srcover...
-        sk_bzero(correctDst.get(), width * sizeof(uint32_t));
-        sk_bzero(testDst.get(), width * sizeof(uint32_t));
-        brute_force_srcover_srgb_srgb(correctDst.get(), src, width, width);
-        SkOpts::    srcover_srgb_srgb(   testDst.get(), src, width, width);
-        for (int x = 0; x < width; x++) {
-            REPORTER_ASSERT_MESSAGE(
-                reporter, correctDst[x] == testDst[x],
-                mismatch_message(resourceName, x, y, src[x], correctDst[x], testDst[x]));
-            if (correctDst[x] != testDst[x]) break;
-        }
-        src += width;
-    }
-}
-
-DEF_TEST(SkBlend_optsCheck, reporter) {
-    std::vector<std::string> testResources = {
-        "yellow_rose", "baby_tux", "plane", "mandrill_512", "iconstrip"
-    };
-
-    for (auto& resourceName : testResources) {
-        test_blender(resourceName, reporter);
-    }
-}
-
-DEF_TEST(SkBlend_optsSqrtCheck, reporter) {
-    for (int c = 0; c < 256; c++) {
-        Sk4f i{(float)c};
-        Sk4f ii = i * i;
-        Sk4f s = ii.sqrt() + 0.5f;
-        Sk4f sf = s.floor();
-        REPORTER_ASSERT_MESSAGE(
-            reporter, i[0] == sf[0], SkStringPrintf("i: %f, s: %f", i[0], sf[0]));
-    }
-}
