
/* autogenerated from gstvolumeorc.orc */

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <glib.h>

#ifndef _ORC_INTEGER_TYPEDEFS_
#define _ORC_INTEGER_TYPEDEFS_
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#include <stdint.h>
typedef int8_t orc_int8;
typedef int16_t orc_int16;
typedef int32_t orc_int32;
typedef int64_t orc_int64;
typedef uint8_t orc_uint8;
typedef uint16_t orc_uint16;
typedef uint32_t orc_uint32;
typedef uint64_t orc_uint64;
#define ORC_UINT64_C(x) UINT64_C(x)
#elif defined(_MSC_VER)
typedef signed __int8 orc_int8;
typedef signed __int16 orc_int16;
typedef signed __int32 orc_int32;
typedef signed __int64 orc_int64;
typedef unsigned __int8 orc_uint8;
typedef unsigned __int16 orc_uint16;
typedef unsigned __int32 orc_uint32;
typedef unsigned __int64 orc_uint64;
#define ORC_UINT64_C(x) (x##Ui64)
#define inline __inline
#else
#include <limits.h>
typedef signed char orc_int8;
typedef short orc_int16;
typedef int orc_int32;
typedef unsigned char orc_uint8;
typedef unsigned short orc_uint16;
typedef unsigned int orc_uint32;
#if INT_MAX == LONG_MAX
typedef long long orc_int64;
typedef unsigned long long orc_uint64;
#define ORC_UINT64_C(x) (x##ULL)
#else
typedef long orc_int64;
typedef unsigned long orc_uint64;
#define ORC_UINT64_C(x) (x##UL)
#endif
#endif
typedef union
{
  orc_int16 i;
  orc_int8 x2[2];
} orc_union16;
typedef union
{
  orc_int32 i;
  float f;
  orc_int16 x2[2];
  orc_int8 x4[4];
} orc_union32;
typedef union
{
  orc_int64 i;
  double f;
  orc_int32 x2[2];
  float x2f[2];
  orc_int16 x4[4];
} orc_union64;
#endif
#ifndef ORC_RESTRICT
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#define ORC_RESTRICT restrict
#elif defined(__GNUC__) && __GNUC__ >= 4
#define ORC_RESTRICT __restrict__
#else
#define ORC_RESTRICT
#endif
#endif

#ifndef ORC_INTERNAL
#if defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)
#define ORC_INTERNAL __attribute__((visibility("hidden")))
#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
#define ORC_INTERNAL __hidden
#elif defined (__GNUC__)
#define ORC_INTERNAL __attribute__((visibility("hidden")))
#else
#define ORC_INTERNAL
#endif
#endif


#ifndef DISABLE_ORC
#include <orc/orc.h>
#endif
void volume_orc_scalarmultiply_f64_ns (double *ORC_RESTRICT d1, double p1,
    int n);
void volume_orc_scalarmultiply_f32_ns (float *ORC_RESTRICT d1, float p1, int n);
void volume_orc_process_int32 (gint32 * ORC_RESTRICT d1, int p1, int n);
void volume_orc_process_int32_clamp (gint32 * ORC_RESTRICT d1, int p1, int n);
void volume_orc_process_int16 (gint16 * ORC_RESTRICT d1, int p1, int n);
void volume_orc_process_int16_clamp (gint16 * ORC_RESTRICT d1, int p1, int n);
void volume_orc_process_int8 (gint8 * ORC_RESTRICT d1, int p1, int n);
void volume_orc_process_int8_clamp (gint8 * ORC_RESTRICT d1, int p1, int n);
void volume_orc_memset_f64 (gdouble * ORC_RESTRICT d1, double p1, int n);
void volume_orc_prepare_volumes (gdouble * ORC_RESTRICT d1,
    const gboolean * ORC_RESTRICT s1, int n);
void volume_orc_process_controlled_f64_1ch (gdouble * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void volume_orc_process_controlled_f32_1ch (gfloat * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void volume_orc_process_controlled_f32_2ch (gfloat * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void volume_orc_process_controlled_int32_1ch (gint32 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void volume_orc_process_controlled_int16_1ch (gint16 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void volume_orc_process_controlled_int16_2ch (gint16 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void volume_orc_process_controlled_int8_1ch (gint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void volume_orc_process_controlled_int8_2ch (gint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);


/* begin Orc C target preamble */
#define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x)))
#define ORC_ABS(a) ((a)<0 ? -(a) : (a))
#define ORC_MIN(a,b) ((a)<(b) ? (a) : (b))
#define ORC_MAX(a,b) ((a)>(b) ? (a) : (b))
#define ORC_SB_MAX 127
#define ORC_SB_MIN (-1-ORC_SB_MAX)
#define ORC_UB_MAX 255
#define ORC_UB_MIN 0
#define ORC_SW_MAX 32767
#define ORC_SW_MIN (-1-ORC_SW_MAX)
#define ORC_UW_MAX 65535
#define ORC_UW_MIN 0
#define ORC_SL_MAX 2147483647
#define ORC_SL_MIN (-1-ORC_SL_MAX)
#define ORC_UL_MAX 4294967295U
#define ORC_UL_MIN 0
#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX)
#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX)
#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX)
#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX)
#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX)
#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX)
#define ORC_SWAP_W(x) ((((x)&0xffU)<<8) | (((x)&0xff00U)>>8))
#define ORC_SWAP_L(x) ((((x)&0xffU)<<24) | (((x)&0xff00U)<<8) | (((x)&0xff0000U)>>8) | (((x)&0xff000000U)>>24))
#define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56))
#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset)))
#define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff))
#define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0))
#define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff)))
#define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0))
#ifndef ORC_RESTRICT
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#define ORC_RESTRICT restrict
#elif defined(__GNUC__) && __GNUC__ >= 4
#define ORC_RESTRICT __restrict__
#else
#define ORC_RESTRICT
#endif
#endif
/* end Orc C target preamble */



/* volume_orc_scalarmultiply_f64_ns */
#ifdef DISABLE_ORC
void
volume_orc_scalarmultiply_f64_ns (double *ORC_RESTRICT d1, double p1, int n)
{
  int i;
  orc_union64 *ORC_RESTRICT ptr0;
  orc_union64 var32;
  orc_union64 var33;
  orc_union64 var34;

  ptr0 = (orc_union64 *) d1;

  /* 1: loadpq */
  var33.f = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var32 = ptr0[i];
    /* 2: muld */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
      _dest1.f = _src1.f * _src2.f;
      var34.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

#else
static void
_backup_volume_orc_scalarmultiply_f64_ns (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union64 *ORC_RESTRICT ptr0;
  orc_union64 var32;
  orc_union64 var33;
  orc_union64 var34;

  ptr0 = (orc_union64 *) ex->arrays[0];

  /* 1: loadpq */
  var33.i =
      (ex->params[24] & 0xffffffff) | ((orc_uint64) (ex->params[24 +
              (ORC_VAR_T1 - ORC_VAR_P1)]) << 32);

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var32 = ptr0[i];
    /* 2: muld */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
      _dest1.f = _src1.f * _src2.f;
      var34.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

void
volume_orc_scalarmultiply_f64_ns (double *ORC_RESTRICT d1, double p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 32, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 115, 99,
        97, 108, 97, 114, 109, 117, 108, 116, 105, 112, 108, 121, 95, 102, 54,
            52,
        95, 110, 115, 11, 8, 8, 18, 8, 214, 0, 0, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_scalarmultiply_f64_ns);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_scalarmultiply_f64_ns");
      orc_program_set_backup_function (p,
          _backup_volume_orc_scalarmultiply_f64_ns);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_parameter_double (p, 8, "p1");

      orc_program_append_2 (p, "muld", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  {
    orc_union64 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = ((orc_uint64) tmp.i) & 0xffffffff;
    ex->params[ORC_VAR_T1] = ((orc_uint64) tmp.i) >> 32;
  }

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_scalarmultiply_f32_ns */
#ifdef DISABLE_ORC
void
volume_orc_scalarmultiply_f32_ns (float *ORC_RESTRICT d1, float p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  orc_union32 var32;
  orc_union32 var33;
  orc_union32 var34;

  ptr0 = (orc_union32 *) d1;

  /* 1: loadpl */
  var33.f = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr0[i];
    /* 2: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var32.i);
      _src2.i = ORC_DENORMAL (var33.i);
      _dest1.f = _src1.f * _src2.f;
      var34.i = ORC_DENORMAL (_dest1.i);
    }
    /* 3: storel */
    ptr0[i] = var34;
  }

}

#else
static void
_backup_volume_orc_scalarmultiply_f32_ns (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union32 *ORC_RESTRICT ptr0;
  orc_union32 var32;
  orc_union32 var33;
  orc_union32 var34;

  ptr0 = (orc_union32 *) ex->arrays[0];

  /* 1: loadpl */
  var33.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr0[i];
    /* 2: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var32.i);
      _src2.i = ORC_DENORMAL (var33.i);
      _dest1.f = _src1.f * _src2.f;
      var34.i = ORC_DENORMAL (_dest1.i);
    }
    /* 3: storel */
    ptr0[i] = var34;
  }

}

void
volume_orc_scalarmultiply_f32_ns (float *ORC_RESTRICT d1, float p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 32, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 115, 99,
        97, 108, 97, 114, 109, 117, 108, 116, 105, 112, 108, 121, 95, 102, 51,
            50,
        95, 110, 115, 11, 4, 4, 17, 4, 202, 0, 0, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_scalarmultiply_f32_ns);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_scalarmultiply_f32_ns");
      orc_program_set_backup_function (p,
          _backup_volume_orc_scalarmultiply_f32_ns);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_parameter_float (p, 4, "p1");

      orc_program_append_2 (p, "mulf", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_int32 */
#ifdef DISABLE_ORC
void
volume_orc_process_int32 (gint32 * ORC_RESTRICT d1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  orc_union32 var33;
  orc_union32 var34;
  orc_union32 var35;
  orc_union64 var36;
  orc_union64 var37;

  ptr0 = (orc_union32 *) d1;

  /* 1: loadpl */
  var34.i = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr0[i];
    /* 2: mulslq */
    var36.i = ((orc_int64) var33.i) * ((orc_int64) var34.i);
    /* 3: shrsq */
    var37.i = var36.i >> 27;
    /* 4: convql */
    var35.i = var37.i;
    /* 5: storel */
    ptr0[i] = var35;
  }

}

#else
static void
_backup_volume_orc_process_int32 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union32 *ORC_RESTRICT ptr0;
  orc_union32 var33;
  orc_union32 var34;
  orc_union32 var35;
  orc_union64 var36;
  orc_union64 var37;

  ptr0 = (orc_union32 *) ex->arrays[0];

  /* 1: loadpl */
  var34.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr0[i];
    /* 2: mulslq */
    var36.i = ((orc_int64) var33.i) * ((orc_int64) var34.i);
    /* 3: shrsq */
    var37.i = var36.i >> 27;
    /* 4: convql */
    var35.i = var37.i;
    /* 5: storel */
    ptr0[i] = var35;
  }

}

void
volume_orc_process_int32 (gint32 * ORC_RESTRICT d1, int p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 24, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 105, 110, 116, 51, 50, 11, 4, 4, 15, 8,
        27, 0, 0, 0, 0, 0, 0, 0, 16, 4, 20, 8, 178, 32, 0, 24,
        147, 32, 32, 16, 169, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_volume_orc_process_int32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_int32");
      orc_program_set_backup_function (p, _backup_volume_orc_process_int32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_constant_int64 (p, 8, 0x000000000000001bULL, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "mulslq", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsq", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convql", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_P1] = p1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_int32_clamp */
#ifdef DISABLE_ORC
void
volume_orc_process_int32_clamp (gint32 * ORC_RESTRICT d1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  orc_union32 var33;
  orc_union32 var34;
  orc_union32 var35;
  orc_union64 var36;
  orc_union64 var37;

  ptr0 = (orc_union32 *) d1;

  /* 1: loadpl */
  var34.i = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr0[i];
    /* 2: mulslq */
    var36.i = ((orc_int64) var33.i) * ((orc_int64) var34.i);
    /* 3: shrsq */
    var37.i = var36.i >> 27;
    /* 4: convsssql */
    var35.i = ORC_CLAMP_SL (var37.i);
    /* 5: storel */
    ptr0[i] = var35;
  }

}

#else
static void
_backup_volume_orc_process_int32_clamp (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union32 *ORC_RESTRICT ptr0;
  orc_union32 var33;
  orc_union32 var34;
  orc_union32 var35;
  orc_union64 var36;
  orc_union64 var37;

  ptr0 = (orc_union32 *) ex->arrays[0];

  /* 1: loadpl */
  var34.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr0[i];
    /* 2: mulslq */
    var36.i = ((orc_int64) var33.i) * ((orc_int64) var34.i);
    /* 3: shrsq */
    var37.i = var36.i >> 27;
    /* 4: convsssql */
    var35.i = ORC_CLAMP_SL (var37.i);
    /* 5: storel */
    ptr0[i] = var35;
  }

}

void
volume_orc_process_int32_clamp (gint32 * ORC_RESTRICT d1, int p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 30, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 105, 110, 116, 51, 50, 95, 99, 108, 97, 109,
        112, 11, 4, 4, 15, 8, 27, 0, 0, 0, 0, 0, 0, 0, 16, 4,
        20, 8, 178, 32, 0, 24, 147, 32, 32, 16, 170, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_int32_clamp);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_int32_clamp");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_int32_clamp);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_constant_int64 (p, 8, 0x000000000000001bULL, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "mulslq", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsq", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convsssql", 0, ORC_VAR_D1, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_P1] = p1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_int16 */
#ifdef DISABLE_ORC
void
volume_orc_process_int16 (gint16 * ORC_RESTRICT d1, int p1, int n)
{
  int i;
  orc_union16 *ORC_RESTRICT ptr0;
  orc_union16 var33;
  orc_union16 var34;
  orc_union16 var35;
  orc_union32 var36;
  orc_union32 var37;

  ptr0 = (orc_union16 *) d1;

  /* 1: loadpw */
  var34.i = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr0[i];
    /* 2: mulswl */
    var36.i = var33.i * var34.i;
    /* 3: shrsl */
    var37.i = var36.i >> 11;
    /* 4: convlw */
    var35.i = var37.i;
    /* 5: storew */
    ptr0[i] = var35;
  }

}

#else
static void
_backup_volume_orc_process_int16 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union16 *ORC_RESTRICT ptr0;
  orc_union16 var33;
  orc_union16 var34;
  orc_union16 var35;
  orc_union32 var36;
  orc_union32 var37;

  ptr0 = (orc_union16 *) ex->arrays[0];

  /* 1: loadpw */
  var34.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr0[i];
    /* 2: mulswl */
    var36.i = var33.i * var34.i;
    /* 3: shrsl */
    var37.i = var36.i >> 11;
    /* 4: convlw */
    var35.i = var37.i;
    /* 5: storew */
    ptr0[i] = var35;
  }

}

void
volume_orc_process_int16 (gint16 * ORC_RESTRICT d1, int p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 24, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 105, 110, 116, 49, 54, 11, 2, 2, 14, 4,
        11, 0, 0, 0, 16, 2, 20, 4, 176, 32, 0, 24, 125, 32, 32, 16,
        163, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_volume_orc_process_int16);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_int16");
      orc_program_set_backup_function (p, _backup_volume_orc_process_int16);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_constant (p, 4, 0x0000000b, "c1");
      orc_program_add_parameter (p, 2, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "mulswl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_P1] = p1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_int16_clamp */
#ifdef DISABLE_ORC
void
volume_orc_process_int16_clamp (gint16 * ORC_RESTRICT d1, int p1, int n)
{
  int i;
  orc_union16 *ORC_RESTRICT ptr0;
  orc_union16 var33;
  orc_union16 var34;
  orc_union16 var35;
  orc_union32 var36;
  orc_union32 var37;

  ptr0 = (orc_union16 *) d1;

  /* 1: loadpw */
  var34.i = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr0[i];
    /* 2: mulswl */
    var36.i = var33.i * var34.i;
    /* 3: shrsl */
    var37.i = var36.i >> 11;
    /* 4: convssslw */
    var35.i = ORC_CLAMP_SW (var37.i);
    /* 5: storew */
    ptr0[i] = var35;
  }

}

#else
static void
_backup_volume_orc_process_int16_clamp (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union16 *ORC_RESTRICT ptr0;
  orc_union16 var33;
  orc_union16 var34;
  orc_union16 var35;
  orc_union32 var36;
  orc_union32 var37;

  ptr0 = (orc_union16 *) ex->arrays[0];

  /* 1: loadpw */
  var34.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr0[i];
    /* 2: mulswl */
    var36.i = var33.i * var34.i;
    /* 3: shrsl */
    var37.i = var36.i >> 11;
    /* 4: convssslw */
    var35.i = ORC_CLAMP_SW (var37.i);
    /* 5: storew */
    ptr0[i] = var35;
  }

}

void
volume_orc_process_int16_clamp (gint16 * ORC_RESTRICT d1, int p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 30, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 105, 110, 116, 49, 54, 95, 99, 108, 97, 109,
        112, 11, 2, 2, 14, 4, 11, 0, 0, 0, 16, 2, 20, 4, 176, 32,
        0, 24, 125, 32, 32, 16, 165, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_int16_clamp);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_int16_clamp");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_int16_clamp);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_constant (p, 4, 0x0000000b, "c1");
      orc_program_add_parameter (p, 2, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "mulswl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 0, ORC_VAR_D1, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_P1] = p1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_int8 */
#ifdef DISABLE_ORC
void
volume_orc_process_int8 (gint8 * ORC_RESTRICT d1, int p1, int n)
{
  int i;
  orc_int8 *ORC_RESTRICT ptr0;
  orc_int8 var33;
  orc_int8 var34;
  orc_int8 var35;
  orc_union16 var36;
  orc_union16 var37;

  ptr0 = (orc_int8 *) d1;

  /* 1: loadpb */
  var34 = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var33 = ptr0[i];
    /* 2: mulsbw */
    var36.i = var33 * var34;
    /* 3: shrsw */
    var37.i = var36.i >> 3;
    /* 4: convwb */
    var35 = var37.i;
    /* 5: storeb */
    ptr0[i] = var35;
  }

}

#else
static void
_backup_volume_orc_process_int8 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_int8 *ORC_RESTRICT ptr0;
  orc_int8 var33;
  orc_int8 var34;
  orc_int8 var35;
  orc_union16 var36;
  orc_union16 var37;

  ptr0 = (orc_int8 *) ex->arrays[0];

  /* 1: loadpb */
  var34 = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var33 = ptr0[i];
    /* 2: mulsbw */
    var36.i = var33 * var34;
    /* 3: shrsw */
    var37.i = var36.i >> 3;
    /* 4: convwb */
    var35 = var37.i;
    /* 5: storeb */
    ptr0[i] = var35;
  }

}

void
volume_orc_process_int8 (gint8 * ORC_RESTRICT d1, int p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 23, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 105, 110, 116, 56, 11, 1, 1, 14, 2, 3,
        0, 0, 0, 16, 1, 20, 2, 174, 32, 0, 24, 94, 32, 32, 16, 157,
        0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_volume_orc_process_int8);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_int8");
      orc_program_set_backup_function (p, _backup_volume_orc_process_int8);
      orc_program_add_destination (p, 1, "d1");
      orc_program_add_constant (p, 2, 0x00000003, "c1");
      orc_program_add_parameter (p, 1, "p1");
      orc_program_add_temporary (p, 2, "t1");

      orc_program_append_2 (p, "mulsbw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_P1] = p1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_int8_clamp */
#ifdef DISABLE_ORC
void
volume_orc_process_int8_clamp (gint8 * ORC_RESTRICT d1, int p1, int n)
{
  int i;
  orc_int8 *ORC_RESTRICT ptr0;
  orc_int8 var33;
  orc_int8 var34;
  orc_int8 var35;
  orc_union16 var36;
  orc_union16 var37;

  ptr0 = (orc_int8 *) d1;

  /* 1: loadpb */
  var34 = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var33 = ptr0[i];
    /* 2: mulsbw */
    var36.i = var33 * var34;
    /* 3: shrsw */
    var37.i = var36.i >> 3;
    /* 4: convssswb */
    var35 = ORC_CLAMP_SB (var37.i);
    /* 5: storeb */
    ptr0[i] = var35;
  }

}

#else
static void
_backup_volume_orc_process_int8_clamp (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_int8 *ORC_RESTRICT ptr0;
  orc_int8 var33;
  orc_int8 var34;
  orc_int8 var35;
  orc_union16 var36;
  orc_union16 var37;

  ptr0 = (orc_int8 *) ex->arrays[0];

  /* 1: loadpb */
  var34 = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var33 = ptr0[i];
    /* 2: mulsbw */
    var36.i = var33 * var34;
    /* 3: shrsw */
    var37.i = var36.i >> 3;
    /* 4: convssswb */
    var35 = ORC_CLAMP_SB (var37.i);
    /* 5: storeb */
    ptr0[i] = var35;
  }

}

void
volume_orc_process_int8_clamp (gint8 * ORC_RESTRICT d1, int p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 29, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 105, 110, 116, 56, 95, 99, 108, 97, 109,
            112,
        11, 1, 1, 14, 2, 3, 0, 0, 0, 16, 1, 20, 2, 174, 32, 0,
        24, 94, 32, 32, 16, 159, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_int8_clamp);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_int8_clamp");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_int8_clamp);
      orc_program_add_destination (p, 1, "d1");
      orc_program_add_constant (p, 2, 0x00000003, "c1");
      orc_program_add_parameter (p, 1, "p1");
      orc_program_add_temporary (p, 2, "t1");

      orc_program_append_2 (p, "mulsbw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssswb", 0, ORC_VAR_D1, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_P1] = p1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_memset_f64 */
#ifdef DISABLE_ORC
void
volume_orc_memset_f64 (gdouble * ORC_RESTRICT d1, double p1, int n)
{
  int i;
  orc_union64 *ORC_RESTRICT ptr0;
  orc_union64 var32;
  orc_union64 var33;

  ptr0 = (orc_union64 *) d1;

  /* 0: loadpq */
  var32.f = p1;

  for (i = 0; i < n; i++) {
    /* 1: copyq */
    var33.i = var32.i;
    /* 2: storeq */
    ptr0[i] = var33;
  }

}

#else
static void
_backup_volume_orc_memset_f64 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union64 *ORC_RESTRICT ptr0;
  orc_union64 var32;
  orc_union64 var33;

  ptr0 = (orc_union64 *) ex->arrays[0];

  /* 0: loadpq */
  var32.i =
      (ex->params[24] & 0xffffffff) | ((orc_uint64) (ex->params[24 +
              (ORC_VAR_T1 - ORC_VAR_P1)]) << 32);

  for (i = 0; i < n; i++) {
    /* 1: copyq */
    var33.i = var32.i;
    /* 2: storeq */
    ptr0[i] = var33;
  }

}

void
volume_orc_memset_f64 (gdouble * ORC_RESTRICT d1, double p1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 21, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 109, 101,
        109, 115, 101, 116, 95, 102, 54, 52, 11, 8, 8, 18, 8, 137, 0, 24,
        2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_volume_orc_memset_f64);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_memset_f64");
      orc_program_set_backup_function (p, _backup_volume_orc_memset_f64);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_parameter_double (p, 8, "p1");

      orc_program_append_2 (p, "copyq", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  {
    orc_union64 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = ((orc_uint64) tmp.i) & 0xffffffff;
    ex->params[ORC_VAR_T1] = ((orc_uint64) tmp.i) >> 32;
  }

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_prepare_volumes */
#ifdef DISABLE_ORC
void
volume_orc_prepare_volumes (gdouble * ORC_RESTRICT d1,
    const gboolean * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var33;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union64 var34;
#else
  orc_union64 var34;
#endif
  orc_union64 var35;
  orc_union64 var36;
  orc_union64 var37;
  orc_union64 var38;

  ptr0 = (orc_union64 *) d1;
  ptr4 = (orc_union32 *) s1;

  /* 2: loadpq */
  var34.i = ORC_UINT64_C (0x3ff0000000000000);  /* 1f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: convld */
    var37.f = var33.i;
    /* 3: subd */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var34.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var37.i);
      _dest1.f = _src1.f - _src2.f;
      var38.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 4: loadq */
    var35 = ptr0[i];
    /* 5: muld */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var36.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 6: storeq */
    ptr0[i] = var36;
  }

}

#else
static void
_backup_volume_orc_prepare_volumes (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var33;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union64 var34;
#else
  orc_union64 var34;
#endif
  orc_union64 var35;
  orc_union64 var36;
  orc_union64 var37;
  orc_union64 var38;

  ptr0 = (orc_union64 *) ex->arrays[0];
  ptr4 = (orc_union32 *) ex->arrays[4];

  /* 2: loadpq */
  var34.i = ORC_UINT64_C (0x3ff0000000000000);  /* 1f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: convld */
    var37.f = var33.i;
    /* 3: subd */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var34.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var37.i);
      _dest1.f = _src1.f - _src2.f;
      var38.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 4: loadq */
    var35 = ptr0[i];
    /* 5: muld */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var36.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 6: storeq */
    ptr0[i] = var36;
  }

}

void
volume_orc_prepare_volumes (gdouble * ORC_RESTRICT d1,
    const gboolean * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 26, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        101, 112, 97, 114, 101, 95, 118, 111, 108, 117, 109, 101, 115, 11, 8, 8,
        12, 4, 4, 15, 8, 0, 0, 0, 0, 0, 0, 240, 63, 20, 8, 223,
        32, 4, 213, 32, 16, 32, 214, 0, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_volume_orc_prepare_volumes);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_prepare_volumes");
      orc_program_set_backup_function (p, _backup_volume_orc_prepare_volumes);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant_int64 (p, 8, 0x3ff0000000000000ULL, "c1");
      orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "convld", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "subd", 0, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_T1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "muld", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_controlled_f64_1ch */
#ifdef DISABLE_ORC
void
volume_orc_process_controlled_f64_1ch (gdouble * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union64 var32;
  orc_union64 var33;
  orc_union64 var34;

  ptr0 = (orc_union64 *) d1;
  ptr4 = (orc_union64 *) s1;


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var32 = ptr0[i];
    /* 1: loadq */
    var33 = ptr4[i];
    /* 2: muld */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
      _dest1.f = _src1.f * _src2.f;
      var34.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

#else
static void
_backup_volume_orc_process_controlled_f64_1ch (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union64 var32;
  orc_union64 var33;
  orc_union64 var34;

  ptr0 = (orc_union64 *) ex->arrays[0];
  ptr4 = (orc_union64 *) ex->arrays[4];


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var32 = ptr0[i];
    /* 1: loadq */
    var33 = ptr4[i];
    /* 2: muld */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var33.i);
      _dest1.f = _src1.f * _src2.f;
      var34.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

void
volume_orc_process_controlled_f64_1ch (gdouble * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 37, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 99, 111, 110, 116, 114, 111, 108, 108, 101,
            100,
        95, 102, 54, 52, 95, 49, 99, 104, 11, 8, 8, 12, 8, 8, 214, 0,
        0, 4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_f64_1ch);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_controlled_f64_1ch");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_f64_1ch);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");

      orc_program_append_2 (p, "muld", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_controlled_f32_1ch */
#ifdef DISABLE_ORC
void
volume_orc_process_controlled_f32_1ch (gfloat * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union64 var33;
  orc_union32 var34;
  orc_union32 var35;
  orc_union32 var36;

  ptr0 = (orc_union32 *) d1;
  ptr4 = (orc_union64 *) s1;


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var33.i);
      _dest.f = _src1.f;
      var36.i = ORC_DENORMAL (_dest.i);
    }
    /* 2: loadl */
    var34 = ptr0[i];
    /* 3: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var34.i);
      _src2.i = ORC_DENORMAL (var36.i);
      _dest1.f = _src1.f * _src2.f;
      var35.i = ORC_DENORMAL (_dest1.i);
    }
    /* 4: storel */
    ptr0[i] = var35;
  }

}

#else
static void
_backup_volume_orc_process_controlled_f32_1ch (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union64 var33;
  orc_union32 var34;
  orc_union32 var35;
  orc_union32 var36;

  ptr0 = (orc_union32 *) ex->arrays[0];
  ptr4 = (orc_union64 *) ex->arrays[4];


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var33.i);
      _dest.f = _src1.f;
      var36.i = ORC_DENORMAL (_dest.i);
    }
    /* 2: loadl */
    var34 = ptr0[i];
    /* 3: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var34.i);
      _src2.i = ORC_DENORMAL (var36.i);
      _dest1.f = _src1.f * _src2.f;
      var35.i = ORC_DENORMAL (_dest1.i);
    }
    /* 4: storel */
    ptr0[i] = var35;
  }

}

void
volume_orc_process_controlled_f32_1ch (gfloat * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 37, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 99, 111, 110, 116, 114, 111, 108, 108, 101,
            100,
        95, 102, 51, 50, 95, 49, 99, 104, 11, 4, 4, 12, 8, 8, 20, 4,
        225, 32, 4, 202, 0, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_f32_1ch);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_controlled_f32_1ch");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_f32_1ch);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convdf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_controlled_f32_2ch */
#ifdef DISABLE_ORC
void
volume_orc_process_controlled_f32_2ch (gfloat * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union64 var34;
  orc_union64 var35;
  orc_union64 var36;
  orc_union32 var37;
  orc_union64 var38;

  ptr0 = (orc_union64 *) d1;
  ptr4 = (orc_union64 *) s1;


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var34.i);
      _dest.f = _src1.f;
      var37.i = ORC_DENORMAL (_dest.i);
    }
    /* 2: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var37.i;
      _dest.x2[1] = var37.i;
      var38.i = _dest.i;
    }
    /* 3: loadq */
    var35 = ptr0[i];
    /* 4: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var35.x2[0]);
      _src2.i = ORC_DENORMAL (var38.x2[0]);
      _dest1.f = _src1.f * _src2.f;
      var36.x2[0] = ORC_DENORMAL (_dest1.i);
    }
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var35.x2[1]);
      _src2.i = ORC_DENORMAL (var38.x2[1]);
      _dest1.f = _src1.f * _src2.f;
      var36.x2[1] = ORC_DENORMAL (_dest1.i);
    }
    /* 5: storeq */
    ptr0[i] = var36;
  }

}

#else
static void
_backup_volume_orc_process_controlled_f32_2ch (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union64 var34;
  orc_union64 var35;
  orc_union64 var36;
  orc_union32 var37;
  orc_union64 var38;

  ptr0 = (orc_union64 *) ex->arrays[0];
  ptr4 = (orc_union64 *) ex->arrays[4];


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var34.i);
      _dest.f = _src1.f;
      var37.i = ORC_DENORMAL (_dest.i);
    }
    /* 2: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var37.i;
      _dest.x2[1] = var37.i;
      var38.i = _dest.i;
    }
    /* 3: loadq */
    var35 = ptr0[i];
    /* 4: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var35.x2[0]);
      _src2.i = ORC_DENORMAL (var38.x2[0]);
      _dest1.f = _src1.f * _src2.f;
      var36.x2[0] = ORC_DENORMAL (_dest1.i);
    }
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var35.x2[1]);
      _src2.i = ORC_DENORMAL (var38.x2[1]);
      _dest1.f = _src1.f * _src2.f;
      var36.x2[1] = ORC_DENORMAL (_dest1.i);
    }
    /* 5: storeq */
    ptr0[i] = var36;
  }

}

void
volume_orc_process_controlled_f32_2ch (gfloat * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 37, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 99, 111, 110, 116, 114, 111, 108, 108, 101,
            100,
        95, 102, 51, 50, 95, 50, 99, 104, 11, 8, 8, 12, 8, 8, 20, 4,
        20, 8, 225, 32, 4, 194, 33, 32, 32, 21, 1, 202, 0, 0, 33, 2,
        0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_f32_2ch);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_controlled_f32_2ch");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_f32_2ch);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 8, "t2");

      orc_program_append_2 (p, "convdf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 1, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T2,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_controlled_int32_1ch */
#ifdef DISABLE_ORC
void
volume_orc_process_controlled_int32_1ch (gint32 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union32 var33;
  orc_union64 var34;
  orc_union32 var35;
  orc_union64 var36;
  orc_union64 var37;

  ptr0 = (orc_union32 *) d1;
  ptr4 = (orc_union64 *) s1;


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr0[i];
    /* 1: convld */
    var36.f = var33.i;
    /* 2: loadq */
    var34 = ptr4[i];
    /* 3: muld */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
      _dest1.f = _src1.f * _src2.f;
      var37.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 4: convdl */
    {
      int tmp;
      tmp = var37.f;
      if (tmp == 0x80000000 && !(var37.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 5: storel */
    ptr0[i] = var35;
  }

}

#else
static void
_backup_volume_orc_process_controlled_int32_1ch (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union32 var33;
  orc_union64 var34;
  orc_union32 var35;
  orc_union64 var36;
  orc_union64 var37;

  ptr0 = (orc_union32 *) ex->arrays[0];
  ptr4 = (orc_union64 *) ex->arrays[4];


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr0[i];
    /* 1: convld */
    var36.f = var33.i;
    /* 2: loadq */
    var34 = ptr4[i];
    /* 3: muld */
    {
      orc_union64 _src1;
      orc_union64 _src2;
      orc_union64 _dest1;
      _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
      _src2.i = ORC_DENORMAL_DOUBLE (var34.i);
      _dest1.f = _src1.f * _src2.f;
      var37.i = ORC_DENORMAL_DOUBLE (_dest1.i);
    }
    /* 4: convdl */
    {
      int tmp;
      tmp = var37.f;
      if (tmp == 0x80000000 && !(var37.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 5: storel */
    ptr0[i] = var35;
  }

}

void
volume_orc_process_controlled_int32_1ch (gint32 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 39, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 99, 111, 110, 116, 114, 111, 108, 108, 101,
            100,
        95, 105, 110, 116, 51, 50, 95, 49, 99, 104, 11, 4, 4, 12, 8, 8,
        20, 8, 223, 32, 0, 214, 32, 32, 4, 222, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int32_1ch);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_controlled_int32_1ch");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int32_1ch);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "convld", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "muld", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_S1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convdl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_controlled_int16_1ch */
#ifdef DISABLE_ORC
void
volume_orc_process_controlled_int16_1ch (gint16 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union16 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union16 var34;
  orc_union64 var35;
  orc_union16 var36;
  orc_union32 var37;
  orc_union32 var38;
  orc_union32 var39;
  orc_union32 var40;
  orc_union32 var41;

  ptr0 = (orc_union16 *) d1;
  ptr4 = (orc_union64 *) s1;


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr0[i];
    /* 1: convswl */
    var37.i = var34.i;
    /* 2: convlf */
    var38.f = var37.i;
    /* 3: loadq */
    var35 = ptr4[i];
    /* 4: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
      _dest.f = _src1.f;
      var39.i = ORC_DENORMAL (_dest.i);
    }
    /* 5: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var38.i);
      _src2.i = ORC_DENORMAL (var39.i);
      _dest1.f = _src1.f * _src2.f;
      var40.i = ORC_DENORMAL (_dest1.i);
    }
    /* 6: convfl */
    {
      int tmp;
      tmp = (int) var40.f;
      if (tmp == 0x80000000 && !(var40.i & 0x80000000))
        tmp = 0x7fffffff;
      var41.i = tmp;
    }
    /* 7: convssslw */
    var36.i = ORC_CLAMP_SW (var41.i);
    /* 8: storew */
    ptr0[i] = var36;
  }

}

#else
static void
_backup_volume_orc_process_controlled_int16_1ch (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union16 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union16 var34;
  orc_union64 var35;
  orc_union16 var36;
  orc_union32 var37;
  orc_union32 var38;
  orc_union32 var39;
  orc_union32 var40;
  orc_union32 var41;

  ptr0 = (orc_union16 *) ex->arrays[0];
  ptr4 = (orc_union64 *) ex->arrays[4];


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr0[i];
    /* 1: convswl */
    var37.i = var34.i;
    /* 2: convlf */
    var38.f = var37.i;
    /* 3: loadq */
    var35 = ptr4[i];
    /* 4: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var35.i);
      _dest.f = _src1.f;
      var39.i = ORC_DENORMAL (_dest.i);
    }
    /* 5: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var38.i);
      _src2.i = ORC_DENORMAL (var39.i);
      _dest1.f = _src1.f * _src2.f;
      var40.i = ORC_DENORMAL (_dest1.i);
    }
    /* 6: convfl */
    {
      int tmp;
      tmp = (int) var40.f;
      if (tmp == 0x80000000 && !(var40.i & 0x80000000))
        tmp = 0x7fffffff;
      var41.i = tmp;
    }
    /* 7: convssslw */
    var36.i = ORC_CLAMP_SW (var41.i);
    /* 8: storew */
    ptr0[i] = var36;
  }

}

void
volume_orc_process_controlled_int16_1ch (gint16 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 39, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 99, 111, 110, 116, 114, 111, 108, 108, 101,
            100,
        95, 105, 110, 116, 49, 54, 95, 49, 99, 104, 11, 2, 2, 12, 8, 8,
        20, 4, 20, 4, 153, 32, 0, 211, 32, 32, 225, 33, 4, 202, 32, 32,
        33, 210, 32, 32, 165, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int16_1ch);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_controlled_int16_1ch");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int16_1ch);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "convswl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convdf", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 0, ORC_VAR_D1, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_controlled_int16_2ch */
#ifdef DISABLE_ORC
void
volume_orc_process_controlled_int16_2ch (gint16 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union32 var35;
  orc_union64 var36;
  orc_union32 var37;
  orc_union64 var38;
  orc_union64 var39;
  orc_union32 var40;
  orc_union64 var41;
  orc_union64 var42;
  orc_union64 var43;

  ptr0 = (orc_union32 *) d1;
  ptr4 = (orc_union64 *) s1;


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var35 = ptr0[i];
    /* 1: convswl */
    var38.x2[0] = var35.x2[0];
    var38.x2[1] = var35.x2[1];
    /* 2: convlf */
    var39.x2f[0] = var38.x2[0];
    var39.x2f[1] = var38.x2[1];
    /* 3: loadq */
    var36 = ptr4[i];
    /* 4: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
      _dest.f = _src1.f;
      var40.i = ORC_DENORMAL (_dest.i);
    }
    /* 5: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var40.i;
      _dest.x2[1] = var40.i;
      var41.i = _dest.i;
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.x2[0]);
      _src2.i = ORC_DENORMAL (var39.x2[0]);
      _dest1.f = _src1.f * _src2.f;
      var42.x2[0] = ORC_DENORMAL (_dest1.i);
    }
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.x2[1]);
      _src2.i = ORC_DENORMAL (var39.x2[1]);
      _dest1.f = _src1.f * _src2.f;
      var42.x2[1] = ORC_DENORMAL (_dest1.i);
    }
    /* 7: convfl */
    {
      int tmp;
      tmp = (int) var42.x2f[0];
      if (tmp == 0x80000000 && !(var42.x2[0] & 0x80000000))
        tmp = 0x7fffffff;
      var43.x2[0] = tmp;
    }
    {
      int tmp;
      tmp = (int) var42.x2f[1];
      if (tmp == 0x80000000 && !(var42.x2[1] & 0x80000000))
        tmp = 0x7fffffff;
      var43.x2[1] = tmp;
    }
    /* 8: convssslw */
    var37.x2[0] = ORC_CLAMP_SW (var43.x2[0]);
    var37.x2[1] = ORC_CLAMP_SW (var43.x2[1]);
    /* 9: storel */
    ptr0[i] = var37;
  }

}

#else
static void
_backup_volume_orc_process_controlled_int16_2ch (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union32 var35;
  orc_union64 var36;
  orc_union32 var37;
  orc_union64 var38;
  orc_union64 var39;
  orc_union32 var40;
  orc_union64 var41;
  orc_union64 var42;
  orc_union64 var43;

  ptr0 = (orc_union32 *) ex->arrays[0];
  ptr4 = (orc_union64 *) ex->arrays[4];


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var35 = ptr0[i];
    /* 1: convswl */
    var38.x2[0] = var35.x2[0];
    var38.x2[1] = var35.x2[1];
    /* 2: convlf */
    var39.x2f[0] = var38.x2[0];
    var39.x2f[1] = var38.x2[1];
    /* 3: loadq */
    var36 = ptr4[i];
    /* 4: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
      _dest.f = _src1.f;
      var40.i = ORC_DENORMAL (_dest.i);
    }
    /* 5: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var40.i;
      _dest.x2[1] = var40.i;
      var41.i = _dest.i;
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.x2[0]);
      _src2.i = ORC_DENORMAL (var39.x2[0]);
      _dest1.f = _src1.f * _src2.f;
      var42.x2[0] = ORC_DENORMAL (_dest1.i);
    }
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.x2[1]);
      _src2.i = ORC_DENORMAL (var39.x2[1]);
      _dest1.f = _src1.f * _src2.f;
      var42.x2[1] = ORC_DENORMAL (_dest1.i);
    }
    /* 7: convfl */
    {
      int tmp;
      tmp = (int) var42.x2f[0];
      if (tmp == 0x80000000 && !(var42.x2[0] & 0x80000000))
        tmp = 0x7fffffff;
      var43.x2[0] = tmp;
    }
    {
      int tmp;
      tmp = (int) var42.x2f[1];
      if (tmp == 0x80000000 && !(var42.x2[1] & 0x80000000))
        tmp = 0x7fffffff;
      var43.x2[1] = tmp;
    }
    /* 8: convssslw */
    var37.x2[0] = ORC_CLAMP_SW (var43.x2[0]);
    var37.x2[1] = ORC_CLAMP_SW (var43.x2[1]);
    /* 9: storel */
    ptr0[i] = var37;
  }

}

void
volume_orc_process_controlled_int16_2ch (gint16 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 39, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 99, 111, 110, 116, 114, 111, 108, 108, 101,
            100,
        95, 105, 110, 116, 49, 54, 95, 50, 99, 104, 11, 4, 4, 12, 8, 8,
        20, 8, 20, 4, 20, 8, 21, 1, 153, 32, 0, 21, 1, 211, 32, 32,
        225, 33, 4, 194, 34, 33, 33, 21, 1, 202, 34, 34, 32, 21, 1, 210,
        34, 34, 21, 1, 165, 0, 34, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int16_2ch);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_controlled_int16_2ch");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int16_2ch);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_temporary (p, 8, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 8, "t3");

      orc_program_append_2 (p, "convswl", 1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlf", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convdf", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_T2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 1, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_T1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 1, ORC_VAR_D1, ORC_VAR_T3,
          ORC_VAR_D1, ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_controlled_int8_1ch */
#ifdef DISABLE_ORC
void
volume_orc_process_controlled_int8_1ch (gint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  int i;
  orc_int8 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_int8 var35;
  orc_union64 var36;
  orc_int8 var37;
  orc_union16 var38;
  orc_union32 var39;
  orc_union32 var40;
  orc_union32 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union16 var44;

  ptr0 = (orc_int8 *) d1;
  ptr4 = (orc_union64 *) s1;


  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var35 = ptr0[i];
    /* 1: convsbw */
    var38.i = var35;
    /* 2: convswl */
    var39.i = var38.i;
    /* 3: convlf */
    var40.f = var39.i;
    /* 4: loadq */
    var36 = ptr4[i];
    /* 5: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
      _dest.f = _src1.f;
      var41.i = ORC_DENORMAL (_dest.i);
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var41.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: convfl */
    {
      int tmp;
      tmp = (int) var42.f;
      if (tmp == 0x80000000 && !(var42.i & 0x80000000))
        tmp = 0x7fffffff;
      var43.i = tmp;
    }
    /* 8: convlw */
    var44.i = var43.i;
    /* 9: convssswb */
    var37 = ORC_CLAMP_SB (var44.i);
    /* 10: storeb */
    ptr0[i] = var37;
  }

}

#else
static void
_backup_volume_orc_process_controlled_int8_1ch (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_int8 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_int8 var35;
  orc_union64 var36;
  orc_int8 var37;
  orc_union16 var38;
  orc_union32 var39;
  orc_union32 var40;
  orc_union32 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union16 var44;

  ptr0 = (orc_int8 *) ex->arrays[0];
  ptr4 = (orc_union64 *) ex->arrays[4];


  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var35 = ptr0[i];
    /* 1: convsbw */
    var38.i = var35;
    /* 2: convswl */
    var39.i = var38.i;
    /* 3: convlf */
    var40.f = var39.i;
    /* 4: loadq */
    var36 = ptr4[i];
    /* 5: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
      _dest.f = _src1.f;
      var41.i = ORC_DENORMAL (_dest.i);
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var41.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: convfl */
    {
      int tmp;
      tmp = (int) var42.f;
      if (tmp == 0x80000000 && !(var42.i & 0x80000000))
        tmp = 0x7fffffff;
      var43.i = tmp;
    }
    /* 8: convlw */
    var44.i = var43.i;
    /* 9: convssswb */
    var37 = ORC_CLAMP_SB (var44.i);
    /* 10: storeb */
    ptr0[i] = var37;
  }

}

void
volume_orc_process_controlled_int8_1ch (gint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 38, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 99, 111, 110, 116, 114, 111, 108, 108, 101,
            100,
        95, 105, 110, 116, 56, 95, 49, 99, 104, 11, 1, 1, 12, 8, 8, 20,
        2, 20, 4, 20, 4, 149, 32, 0, 153, 33, 32, 211, 33, 33, 225, 34,
        4, 202, 33, 33, 34, 210, 33, 33, 163, 32, 33, 159, 0, 32, 2, 0,

      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int8_1ch);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_controlled_int8_1ch");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int8_1ch);
      orc_program_add_destination (p, 1, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");

      orc_program_append_2 (p, "convsbw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convswl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlf", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convdf", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssswb", 0, ORC_VAR_D1, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif


/* volume_orc_process_controlled_int8_2ch */
#ifdef DISABLE_ORC
void
volume_orc_process_controlled_int8_2ch (gint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union16 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union16 var35;
  orc_union64 var36;
  orc_union16 var37;
  orc_union32 var38;
  orc_union64 var39;
  orc_union64 var40;
  orc_union32 var41;
  orc_union64 var42;
  orc_union64 var43;
  orc_union64 var44;
  orc_union32 var45;

  ptr0 = (orc_union16 *) d1;
  ptr4 = (orc_union64 *) s1;


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var35 = ptr0[i];
    /* 1: convsbw */
    var38.x2[0] = var35.x2[0];
    var38.x2[1] = var35.x2[1];
    /* 2: convswl */
    var39.x2[0] = var38.x2[0];
    var39.x2[1] = var38.x2[1];
    /* 3: convlf */
    var40.x2f[0] = var39.x2[0];
    var40.x2f[1] = var39.x2[1];
    /* 4: loadq */
    var36 = ptr4[i];
    /* 5: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
      _dest.f = _src1.f;
      var41.i = ORC_DENORMAL (_dest.i);
    }
    /* 6: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var41.i;
      _dest.x2[1] = var41.i;
      var42.i = _dest.i;
    }
    /* 7: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.x2[0]);
      _src2.i = ORC_DENORMAL (var42.x2[0]);
      _dest1.f = _src1.f * _src2.f;
      var43.x2[0] = ORC_DENORMAL (_dest1.i);
    }
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.x2[1]);
      _src2.i = ORC_DENORMAL (var42.x2[1]);
      _dest1.f = _src1.f * _src2.f;
      var43.x2[1] = ORC_DENORMAL (_dest1.i);
    }
    /* 8: convfl */
    {
      int tmp;
      tmp = (int) var43.x2f[0];
      if (tmp == 0x80000000 && !(var43.x2[0] & 0x80000000))
        tmp = 0x7fffffff;
      var44.x2[0] = tmp;
    }
    {
      int tmp;
      tmp = (int) var43.x2f[1];
      if (tmp == 0x80000000 && !(var43.x2[1] & 0x80000000))
        tmp = 0x7fffffff;
      var44.x2[1] = tmp;
    }
    /* 9: convlw */
    var45.x2[0] = var44.x2[0];
    var45.x2[1] = var44.x2[1];
    /* 10: convssswb */
    var37.x2[0] = ORC_CLAMP_SB (var45.x2[0]);
    var37.x2[1] = ORC_CLAMP_SB (var45.x2[1]);
    /* 11: storew */
    ptr0[i] = var37;
  }

}

#else
static void
_backup_volume_orc_process_controlled_int8_2ch (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union16 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union16 var35;
  orc_union64 var36;
  orc_union16 var37;
  orc_union32 var38;
  orc_union64 var39;
  orc_union64 var40;
  orc_union32 var41;
  orc_union64 var42;
  orc_union64 var43;
  orc_union64 var44;
  orc_union32 var45;

  ptr0 = (orc_union16 *) ex->arrays[0];
  ptr4 = (orc_union64 *) ex->arrays[4];


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var35 = ptr0[i];
    /* 1: convsbw */
    var38.x2[0] = var35.x2[0];
    var38.x2[1] = var35.x2[1];
    /* 2: convswl */
    var39.x2[0] = var38.x2[0];
    var39.x2[1] = var38.x2[1];
    /* 3: convlf */
    var40.x2f[0] = var39.x2[0];
    var40.x2f[1] = var39.x2[1];
    /* 4: loadq */
    var36 = ptr4[i];
    /* 5: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var36.i);
      _dest.f = _src1.f;
      var41.i = ORC_DENORMAL (_dest.i);
    }
    /* 6: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var41.i;
      _dest.x2[1] = var41.i;
      var42.i = _dest.i;
    }
    /* 7: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.x2[0]);
      _src2.i = ORC_DENORMAL (var42.x2[0]);
      _dest1.f = _src1.f * _src2.f;
      var43.x2[0] = ORC_DENORMAL (_dest1.i);
    }
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.x2[1]);
      _src2.i = ORC_DENORMAL (var42.x2[1]);
      _dest1.f = _src1.f * _src2.f;
      var43.x2[1] = ORC_DENORMAL (_dest1.i);
    }
    /* 8: convfl */
    {
      int tmp;
      tmp = (int) var43.x2f[0];
      if (tmp == 0x80000000 && !(var43.x2[0] & 0x80000000))
        tmp = 0x7fffffff;
      var44.x2[0] = tmp;
    }
    {
      int tmp;
      tmp = (int) var43.x2f[1];
      if (tmp == 0x80000000 && !(var43.x2[1] & 0x80000000))
        tmp = 0x7fffffff;
      var44.x2[1] = tmp;
    }
    /* 9: convlw */
    var45.x2[0] = var44.x2[0];
    var45.x2[1] = var44.x2[1];
    /* 10: convssswb */
    var37.x2[0] = ORC_CLAMP_SB (var45.x2[0]);
    var37.x2[1] = ORC_CLAMP_SB (var45.x2[1]);
    /* 11: storew */
    ptr0[i] = var37;
  }

}

void
volume_orc_process_controlled_int8_2ch (gint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n)
{
  OrcExecutor _ex, *ex = &_ex;
  static volatile int p_inited = 0;
  static OrcCode *c = 0;
  void (*func) (OrcExecutor *);

  if (!p_inited) {
    orc_once_mutex_lock ();
    if (!p_inited) {
      OrcProgram *p;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 38, 118, 111, 108, 117, 109, 101, 95, 111, 114, 99, 95, 112, 114,
        111, 99, 101, 115, 115, 95, 99, 111, 110, 116, 114, 111, 108, 108, 101,
            100,
        95, 105, 110, 116, 56, 95, 50, 99, 104, 11, 2, 2, 12, 8, 8, 20,
        4, 20, 8, 20, 8, 21, 1, 149, 32, 0, 21, 1, 153, 33, 32, 21,
        1, 211, 33, 33, 225, 32, 4, 194, 34, 32, 32, 21, 1, 202, 33, 33,
        34, 21, 1, 210, 33, 33, 21, 1, 163, 32, 33, 21, 1, 159, 0, 32,
        2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int8_2ch);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "volume_orc_process_controlled_int8_2ch");
      orc_program_set_backup_function (p,
          _backup_volume_orc_process_controlled_int8_2ch);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 8, "t2");
      orc_program_add_temporary (p, 8, "t3");

      orc_program_append_2 (p, "convsbw", 1, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convswl", 1, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlf", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convdf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_T1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 1, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssswb", 1, ORC_VAR_D1, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
#endif

      orc_program_compile (p);
      c = orc_program_take_code (p);
      orc_program_free (p);
    }
    p_inited = TRUE;
    orc_once_mutex_unlock ();
  }
  ex->arrays[ORC_VAR_A2] = c;
  ex->program = 0;

  ex->n = n;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->arrays[ORC_VAR_S1] = (void *) s1;

  func = c->exec;
  func (ex);
}
#endif
