NEON has a ternary instruction.
authormtklein <mtklein@chromium.org>
Mon, 27 Jul 2015 13:12:05 +0000 (06:12 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 27 Jul 2015 13:12:05 +0000 (06:12 -0700)
Nothing seems to run any faster or slower, but it is terser.

BUG=skia:

Review URL: https://codereview.chromium.org/1255913004

src/opts/SkNx_neon.h

index 1cae223b6c1413eba6e6fa5910f95b046f8ceff9..660b92c6b0c48511e53d1da57450d917eeaf2371 100644 (file)
@@ -298,10 +298,7 @@ public:
     }
 
     SkNf thenElse(const SkNf& t, const SkNf& e) const {
-        uint32x4_t ci = vreinterpretq_u32_f32(fVec),
-                   ti = vreinterpretq_u32_f32(t.fVec),
-                   ei = vreinterpretq_u32_f32(e.fVec);
-        return vreinterpretq_f32_u32(vorrq_u32(vandq_u32(ti, ci), vbicq_u32(ei, ci)));
+        return vbslq_f32(vreinterpretq_u32_f32(fVec), t.fVec, e.fVec);
     }
 
     float32x4_t fVec;
@@ -338,8 +335,7 @@ public:
     }
 
     SkNi thenElse(const SkNi& t, const SkNi& e) const {
-        return vorrq_u16(vandq_u16(t.fVec, fVec),
-                         vbicq_u16(e.fVec, fVec));
+        return vbslq_u16(fVec, t.fVec, e.fVec);
     }
 
     uint16x8_t fVec;
@@ -377,8 +373,7 @@ public:
     }
 
     SkNi thenElse(const SkNi& t, const SkNi& e) const {
-        return vorrq_u8(vandq_u8(t.fVec, fVec),
-                        vbicq_u8(e.fVec, fVec));
+        return vbslq_u8(fVec, t.fVec, e.fVec);
     }
 
     uint8x16_t fVec;