centralize test/bench SkVM builders

Eliminate the duplicate functionality,
and better testing for the bench builders.

Change-Id: If20e52107738903f854aec431416e573d7a7d640
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/218041
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Mike Klein <mtklein@google.com>
diff --git a/bench/SkVMBench.cpp b/bench/SkVMBench.cpp
index eae0b70..32708ac 100644
--- a/bench/SkVMBench.cpp
+++ b/bench/SkVMBench.cpp
@@ -8,124 +8,13 @@
 #include "bench/Benchmark.h"
 #include "src/core/SkOpts.h"
 #include "src/core/SkVM.h"
+#include "tools/SkVMBuilders.h"
 
 namespace {
 
     enum Mode {Opts, RP, F32, I32, I32_SWAR};
     static const char* kMode_name[] = { "Opts", "RP","F32", "I32", "I32_SWAR" };
 
-    struct SrcoverBuilder_F32 : public skvm::Builder {
-        SrcoverBuilder_F32() {
-
-            skvm::Arg src = arg(0),
-                      dst = arg(1);
-
-            auto byte_to_f32 = [&](skvm::I32 byte) {
-                return mul(splat(1/255.0f), to_f32(byte));
-            };
-            auto f32_to_byte = [&](skvm::F32 f32) {
-                return to_i32(mad(f32, splat(255.0f), splat(0.5f)));
-            };
-
-            auto load = [&](skvm::Arg ptr,
-                            skvm::F32* r, skvm::F32* g, skvm::F32* b, skvm::F32* a) {
-                skvm::I32 rgba = load32(ptr);
-                *r = byte_to_f32(bit_and(    rgba     , splat(0xff)));
-                *g = byte_to_f32(bit_and(shr(rgba,  8), splat(0xff)));
-                *b = byte_to_f32(bit_and(shr(rgba, 16), splat(0xff)));
-                *a = byte_to_f32(        shr(rgba, 24)              );
-            };
-
-            skvm::F32 r,g,b,a;
-            load(src, &r,&g,&b,&a);
-
-            skvm::F32 dr,dg,db,da;
-            load(dst, &dr,&dg,&db,&da);
-
-            skvm::F32 invA = sub(splat(1.0f), a);
-            r = mad(dr, invA, r);
-            g = mad(dg, invA, g);
-            b = mad(db, invA, b);
-            a = mad(da, invA, a);
-
-            store32(dst, bit_or(    f32_to_byte(r)     ,
-                         bit_or(shl(f32_to_byte(g),  8),
-                         bit_or(shl(f32_to_byte(b), 16),
-                                shl(f32_to_byte(a), 24)))));
-        }
-    };
-
-    struct SrcoverBuilder_I32 : public skvm::Builder {
-        SrcoverBuilder_I32() {
-            skvm::Arg src = arg(0),
-                      dst = arg(1);
-
-            auto load = [&](skvm::Arg ptr,
-                            skvm::I32* r, skvm::I32* g, skvm::I32* b, skvm::I32* a) {
-                skvm::I32 rgba = load32(ptr);
-                *r = bit_and(    rgba     , splat(0xff));
-                *g = bit_and(shr(rgba,  8), splat(0xff));
-                *b = bit_and(shr(rgba, 16), splat(0xff));
-                *a =         shr(rgba, 24)              ;
-            };
-
-            auto mul_unorm8 = [&](skvm::I32 x, skvm::I32 y) {
-                // (x*y + 127)/255 ~= (x*y+255)/256
-                return shr(add(mul(x, y), splat(0xff)), 8);
-            };
-
-            skvm::I32 r,g,b,a;
-            load(src, &r,&g,&b,&a);
-
-            skvm::I32 dr,dg,db,da;
-            load(dst, &dr,&dg,&db,&da);
-
-            skvm::I32 invA = sub(splat(0xff), a);
-            r = add(r, mul_unorm8(dr, invA));
-            g = add(g, mul_unorm8(dg, invA));
-            b = add(b, mul_unorm8(db, invA));
-            a = add(a, mul_unorm8(da, invA));
-
-            store32(dst, bit_or(    r     ,
-                         bit_or(shl(g,  8),
-                         bit_or(shl(b, 16),
-                                shl(a, 24)))));
-        }
-    };
-
-    struct SrcoverBuilder_I32_SWAR : public skvm::Builder {
-        SrcoverBuilder_I32_SWAR() {
-            skvm::Arg src = arg(0),
-                      dst = arg(1);
-
-            auto load = [&](skvm::Arg ptr,
-                            skvm::I32* rb, skvm::I32* ga) {
-                skvm::I32 rgba = load32(ptr);
-                *rb = bit_and(    rgba,     splat(0x00ff00ff));
-                *ga = bit_and(shr(rgba, 8), splat(0x00ff00ff));
-            };
-
-            auto mul_unorm8 = [&](skvm::I32 x, skvm::I32 y) {
-                // As above, assuming x is two SWAR bytes in lanes 0 and 2, and y is a byte.
-                return bit_and(shr(add(mul(x, y),
-                                       splat(0x00ff00ff)),
-                                   8),
-                               splat(0x00ff00ff));
-            };
-
-            skvm::I32 rb, ga;
-            load(src, &rb, &ga);
-
-            skvm::I32 drb, dga;
-            load(dst, &drb, &dga);
-
-            skvm::I32 invA = sub(splat(0xff), shr(ga, 16));
-            rb = add(rb, mul_unorm8(drb, invA));
-            ga = add(ga, mul_unorm8(dga, invA));
-
-            store32(dst, bit_or(rb, shl(ga, 8)));
-        }
-    };
 }
 
 class SkVMBench : public Benchmark {