/* { dg-do compile } */
/* { dg-additional-options "-O2 -std=gnu++11 -w" } */

namespace c {
typedef int d;
template <typename e> struct f { typedef e g; };
template <bool, typename> struct h;
template <typename e> e aa(typename f<e>::g i) { return i; }
template <typename, typename> struct j {};
template <d, typename> struct k;
template <class l, class m> struct k<1, j<l, m>> { typedef m g; };
template <d n, class l, class m> typename k<n, j<l, m>>::g ab(j<l, m>);
} // namespace c
typedef long d;
typedef char o;
typedef int p;
typedef char q;
typedef int r;
namespace {
struct s;
constexpr d t = 6;
template <typename> class ad {
public:
  static constexpr d u = t;
  d v();
  d x();
  d y();
};
class z : public ad<int> {};
struct ae {
  p af;
};
class ag {
public:
  ae ah();
};
} // namespace
typedef __Int32x4_t ai;
typedef struct {
  ai aj[2];
} ak;
typedef int al;
void am(p *a, ai b) { __builtin_aarch64_st1v4si(a, b); }
namespace an {
class ao {
public:
  bool operator==(ao);
  d v();
  d x();
};
class ap : public ad<r> {};
class aq {
public:
  c::j<int, int> ar();
  int as();
  int at();
};
class au {
public:
  virtual d av(d);
  virtual ap aw();
  virtual ag ax();
};
class ay {};
class az {
  virtual void ba(const ay &, const s &);
};
using bb = az;
class bc;
class bd : bb {
  void ba(const ay &, const s &);
  bc *be;
  bc *bf;
  bc *bg;
  aq bh;
  int bi;
  int bj;
  ao bk;
};
namespace bl {
namespace bm {
namespace bn {
class bo;
}
} // namespace bm
} // namespace bl
namespace bn {
template <typename ac = c::h<0, bl::bm ::bn::bo>>
ai bp(ac *, ac *, ac *, al, al, al, d, p);
template <typename ac = c::h<0, bl::bm ::bn::bo>>
ak bq(ac *br, ac *bs, ac *bt, al bu, al bv, al bw, d bx, int, int by) {
  ak{bp(br, bs, bt, bu, bv, bw, bx, by), bp(br, bs, bt, bu, bv, bw, bx, by)};
}
template <typename ac = c::h<0, bl::bm ::bn::bo>>
ak bz(ac *, ac *, ac *, al, al, al &, int, p);
template <int> void ca(p *, const ak &);
template <> void ca<1>(p *buffer, const ak &cb) {
  am(buffer, cb.aj[0]);
  am(buffer + 4, cb.aj[1]);
}
int cc(int, int);
} // namespace bn
class bc {
public:
  virtual au *cd();
};
class ce {
public:
  q *cf();
};
template <d> struct cg {
  template <typename ch> static void ci(ay, z cj, ch ck) { ck(cj); }
};
template <typename ch> void cl(ay w, ch ck) {
  z cj;
  cg<z::u>::ci(w, cj, c::aa<ch>(ck));
}
namespace {
template <typename T1, typename cm, int cn> class co {
public:
  static void convolve(ay, int cs, bc *cp, bc *cq, bc *cr, aq cw, int, ao ct) {
    int by = cp->cd()->ax().ah().af;
    int cu = cq->cd()->ax().ah().af;
    cp->cd()->aw().v();
    int cv = cp->cd()->aw().x();
    cp->cd()->aw().y();
    cp->cd()->aw();
    int da = cr->cd()->aw().x();
    int cx = cq->cd()->aw().x();
    cq->cd()->aw().y();
    int cy = cr->cd()->av(0);
    int cz = cr->cd()->av(1);
    bn::cc(cs, cn);
    int de = c::ab<1>(cw.ar());
    cw.as();
    cw.at();
    ay db;
    ce dc;
    ce dd;
    ce w;
    q *di = w.cf();
    cl(db, [&](z) {
      int df;
      dc;
      di;
      cx;
      auto dg(cu);
      auto dh(cu);
      auto dl(cu);
      for (; cz; df += de) {
        auto br = reinterpret_cast<T1 *>(cv);
        auto bs = reinterpret_cast<T1 *>(cv);
        auto bt = reinterpret_cast<T1 *>(df * ct.x());
        auto dj = reinterpret_cast<cm *>(dd.cf() + da);
        for (int dk; dk < cy; dk += cs, dj += cs)
          if (ct == ao()) {
            auto vres = bn::bz(br, bs, bt, dg, dh, dl, cn, by);
            bn::ca<cn>(dj, vres);
          } else
            bn::bq(br, bs, bt, dg, dh, dl, ct.v(), cn, by);
      }
    });
  }
};
template <typename T1, typename cm>
void bz(ay dm, int cs, bc *cp, bc *cq, bc *cr, aq cw, int dn, ao ct) {
  co<T1, cm, 1>::convolve(dm, cs, cp, cq, cr, cw, dn, ct);
  co<T1, cm, 2>::convolve(dm, cs, cp, cq, cr, cw, dn, ct);
}
} // namespace
void bd::ba(const ay &dm, const s &) {
  bz<o, p>(dm, bi, be, bg, bf, bh, bj, bk);
}
} // namespace an
