class svaba_impl : public function_base
{
+public:
+ gimple *
+ fold (gimple_folder &f) const override
+ {
+ /* Fold to svabd if op1 is all zeros. */
+ tree op1 = gimple_call_arg (f.call, 0);
+ if (!integer_zerop (op1))
+ return NULL;
+ function_instance instance ("svabd", functions::svabd,
+ shapes::binary_opt_n, f.mode_suffix_id,
+ f.type_suffix_ids, GROUP_none, PRED_x);
+ gcall *call = f.redirect_call (instance);
+ /* Add a ptrue as predicate, because unlike svaba, svabd is
+ predicated. */
+ gimple_call_set_arg (call, 0, build_all_ones_cst (f.gp_type ()));
+ return call;
+ }
+
public:
rtx
expand (function_expander &e) const override
TEST_UNIFORM_Z (aba_11_s32_untied, svint32_t,
z0 = svaba_n_s32 (z1, z2, 11),
z0 = svaba (z1, z2, 11))
+
+/*
+** aba_11_s32_zeroop1n:
+** ptrue (p[0-7])\.b, all
+** mov z0\.s, #11
+** sabd z0\.s, \1/m, z0\.s, z1\.s
+** ret
+*/
+TEST_UNIFORM_Z (aba_11_s32_zeroop1n, svint32_t,
+ z0 = svaba_n_s32 (svdup_s32 (0), z1, 11),
+ z0 = svaba (svdup_s32 (0), z1, 11))
+
+
+/*
+** aba_11_s32_zeroop1:
+** ptrue (p[0-7])\.b, all
+** mov z0\.s, #11
+** sabd z0\.s, \1/m, z0\.s, z1\.s
+** ret
+*/
+TEST_UNIFORM_Z (aba_11_s32_zeroop1, svint32_t,
+ z0 = svaba_s32 (svdup_s32 (0), z1, svdup_s32 (11)),
+ z0 = svaba (svdup_s32 (0), z1, svdup_s32 (11)))
TEST_UNIFORM_Z (aba_11_s64_untied, svint64_t,
z0 = svaba_n_s64 (z1, z2, 11),
z0 = svaba (z1, z2, 11))
+
+/*
+** aba_11_s64_zeroop1n:
+** ptrue (p[0-7])\.b, all
+** mov z0\.d, #11
+** sabd z0\.d, \1/m, z0\.d, z1\.d
+** ret
+*/
+TEST_UNIFORM_Z (aba_11_s64_zeroop1n, svint64_t,
+ z0 = svaba_n_s64 (svdup_s64 (0), z1, 11),
+ z0 = svaba (svdup_s64 (0), z1, 11))
+
+/*
+** aba_11_s64_zeroop1:
+** ptrue (p[0-7])\.b, all
+** mov z0\.d, #11
+** sabd z0\.d, \1/m, z0\.d, z1\.d
+** ret
+*/
+TEST_UNIFORM_Z (aba_11_s64_zeroop1, svint64_t,
+ z0 = svaba_s64 (svdup_s64 (0), z1, svdup_s64 (11)),
+ z0 = svaba (svdup_s64 (0), z1, svdup_s64 (11)))
TEST_UNIFORM_Z (aba_11_u32_untied, svuint32_t,
z0 = svaba_n_u32 (z1, z2, 11),
z0 = svaba (z1, z2, 11))
+
+/*
+** aba_11_u32_zeroop1n:
+** ptrue (p[0-7])\.b, all
+** mov z0\.s, #11
+** uabd z0\.s, \1/m, z0\.s, z1\.s
+** ret
+*/
+TEST_UNIFORM_Z (aba_11_u32_zeroop1n, svuint32_t,
+ z0 = svaba_n_u32 (svdup_u32 (0), z1, 11),
+ z0 = svaba (svdup_u32 (0), z1, 11))
+
+/*
+** aba_11_u32_zeroop1:
+** ptrue (p[0-7])\.b, all
+** mov z0\.s, #11
+** uabd z0\.s, \1/m, z0\.s, z1\.s
+** ret
+*/
+TEST_UNIFORM_Z (aba_11_u32_zeroop1, svuint32_t,
+ z0 = svaba_u32 (svdup_u32 (0), z1, svdup_u32 (11)),
+ z0 = svaba (svdup_u32 (0), z1, svdup_u32 (11)))
TEST_UNIFORM_Z (aba_11_u64_untied, svuint64_t,
z0 = svaba_n_u64 (z1, z2, 11),
z0 = svaba (z1, z2, 11))
+
+/*
+** aba_11_u64_zeroop1n:
+** ptrue (p[0-7])\.b, all
+** mov z0\.d, #11
+** uabd z0\.d, \1/m, z0\.d, z1\.d
+** ret
+*/
+TEST_UNIFORM_Z (aba_11_u64_zeroop1n, svuint64_t,
+ z0 = svaba_n_u64 (svdup_u64 (0), z1, 11),
+ z0 = svaba (svdup_u64 (0), z1, 11))
+
+/*
+** aba_11_u64_zeroop1:
+** ptrue (p[0-7])\.b, all
+** mov z0\.d, #11
+** uabd z0\.d, \1/m, z0\.d, z1\.d
+** ret
+*/
+TEST_UNIFORM_Z (aba_11_u64_zeroop1, svuint64_t,
+ z0 = svaba_u64 (svdup_u64 (0), z1, svdup_u64 (11)),
+ z0 = svaba (svdup_u64 (0), z1, svdup_u64 (11)))