
/* autogenerated from audiopanoramaorc.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 audiopanoramam_orc_process_s16_ch1_none (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, int n);
void audiopanoramam_orc_process_f32_ch1_none (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, int n);
void audiopanoramam_orc_process_s16_ch2_none (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, int n);
void audiopanoramam_orc_process_f32_ch2_none (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, int n);
void audiopanoramam_orc_process_s16_ch1_psy (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, float p2, int n);
void audiopanoramam_orc_process_f32_ch1_psy (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, int n);
void audiopanoramam_orc_process_s16_ch2_psy_right (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, float p2, int n);
void audiopanoramam_orc_process_s16_ch2_psy_left (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, float p2, int n);
void audiopanoramam_orc_process_f32_ch2_psy_right (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, int n);
void audiopanoramam_orc_process_f32_ch2_psy_left (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, int n);
void audiopanoramam_orc_process_s16_ch1_sim_right (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, int n);
void audiopanoramam_orc_process_s16_ch1_sim_left (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, int n);
void audiopanoramam_orc_process_s16_ch2_sim_right (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, int n);
void audiopanoramam_orc_process_s16_ch2_sim_left (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, int n);
void audiopanoramam_orc_process_f32_ch1_sim_right (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, int n);
void audiopanoramam_orc_process_f32_ch1_sim_left (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, int n);
void audiopanoramam_orc_process_f32_ch2_sim_right (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, int n);
void audiopanoramam_orc_process_f32_ch2_sim_left (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, 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 (orc_uint8) 255
#define ORC_UB_MIN 0
#define ORC_SW_MAX 32767
#define ORC_SW_MIN (-1-ORC_SW_MAX)
#define ORC_UW_MAX (orc_uint16)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 */



/* audiopanoramam_orc_process_s16_ch1_none */
#ifdef DISABLE_ORC
void
audiopanoramam_orc_process_s16_ch1_none (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union16 *ORC_RESTRICT ptr4;
  orc_union16 var32;
  orc_union16 var33;
  orc_union32 var34;

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var32 = ptr4[i];
    /* 1: loadw */
    var33 = ptr4[i];
    /* 2: mergewl */
    {
      orc_union32 _dest;
      _dest.x2[0] = var32.i;
      _dest.x2[1] = var33.i;
      var34.i = _dest.i;
    }
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var32 = ptr4[i];
    /* 1: loadw */
    var33 = ptr4[i];
    /* 2: mergewl */
    {
      orc_union32 _dest;
      _dest.x2[0] = var32.i;
      _dest.x2[1] = var33.i;
      var34.i = _dest.i;
    }
    /* 3: storel */
    ptr0[i] = var34;
  }

}

void
audiopanoramam_orc_process_s16_ch1_none (gint16 * ORC_RESTRICT d1,
    const gint16 * 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, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 49, 95, 110, 111, 110, 101, 11, 4, 4, 12, 2, 2,
        195, 0, 4, 4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch1_none);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch1_none");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch1_none);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 2, "s1");

      orc_program_append_2 (p, "mergewl", 0, ORC_VAR_D1, ORC_VAR_S1, 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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr4[i];
    /* 1: loadl */
    var33 = ptr4[i];
    /* 2: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var32.i;
      _dest.x2[1] = var33.i;
      var34.i = _dest.i;
    }
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr4[i];
    /* 1: loadl */
    var33 = ptr4[i];
    /* 2: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var32.i;
      _dest.x2[1] = var33.i;
      var34.i = _dest.i;
    }
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

void
audiopanoramam_orc_process_f32_ch1_none (gfloat * ORC_RESTRICT d1,
    const gfloat * 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, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 49, 95, 110, 111, 110, 101, 11, 8, 8, 12, 4, 4,
        194, 0, 4, 4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch1_none);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch1_none");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch1_none);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");

      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_D1, ORC_VAR_S1, 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


/* audiopanoramam_orc_process_s16_ch2_none */
#ifdef DISABLE_ORC
void
audiopanoramam_orc_process_s16_ch2_none (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var32;
  orc_union32 var33;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr4[i];
    /* 1: copyw */
    var33.x2[0] = var32.x2[0];
    var33.x2[1] = var32.x2[1];
    /* 2: storel */
    ptr0[i] = var33;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr4[i];
    /* 1: copyw */
    var33.x2[0] = var32.x2[0];
    var33.x2[1] = var32.x2[1];
    /* 2: storel */
    ptr0[i] = var33;
  }

}

void
audiopanoramam_orc_process_s16_ch2_none (gint16 * ORC_RESTRICT d1,
    const gint16 * 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, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 50, 95, 110, 111, 110, 101, 11, 4, 4, 12, 4, 4,
        21, 1, 79, 0, 4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_none);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch2_none");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_none);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");

      orc_program_append_2 (p, "copyw", 1, ORC_VAR_D1, ORC_VAR_S1, 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


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

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


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

}

#else
static void
_backup_audiopanoramam_orc_process_f32_ch2_none (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;

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


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

}

void
audiopanoramam_orc_process_f32_ch2_none (gfloat * ORC_RESTRICT d1,
    const gfloat * 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, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 50, 95, 110, 111, 110, 101, 11, 8, 8, 12, 8, 8,
        21, 1, 112, 0, 4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_none);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch2_none");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_none);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");

      orc_program_append_2 (p, "copyl", 1, ORC_VAR_D1, ORC_VAR_S1, 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


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

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

  /* 3: loadpl */
  var36.f = p2;
  /* 5: loadpl */
  var37.f = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var35 = ptr4[i];
    /* 1: convswl */
    var39.i = var35.i;
    /* 2: convlf */
    var40.f = var39.i;
    /* 4: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var36.i);
      _dest1.f = _src1.f * _src2.f;
      var41.i = ORC_DENORMAL (_dest1.i);
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var42.i;
      _dest.x2[1] = var41.i;
      var43.i = _dest.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: convssslw */
    var38.x2[0] = ORC_CLAMP_SW (var44.x2[0]);
    var38.x2[1] = ORC_CLAMP_SW (var44.x2[1]);
    /* 10: storel */
    ptr0[i] = var38;
  }

}

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

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

  /* 3: loadpl */
  var36.i = ex->params[25];
  /* 5: loadpl */
  var37.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var35 = ptr4[i];
    /* 1: convswl */
    var39.i = var35.i;
    /* 2: convlf */
    var40.f = var39.i;
    /* 4: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var36.i);
      _dest1.f = _src1.f * _src2.f;
      var41.i = ORC_DENORMAL (_dest1.i);
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var42.i;
      _dest.x2[1] = var41.i;
      var43.i = _dest.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: convssslw */
    var38.x2[0] = ORC_CLAMP_SW (var44.x2[0]);
    var38.x2[1] = ORC_CLAMP_SW (var44.x2[1]);
    /* 10: storel */
    ptr0[i] = var38;
  }

}

void
audiopanoramam_orc_process_s16_ch1_psy (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, float p2, 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, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 49, 95, 112, 115, 121, 11, 4, 4, 12, 2, 2, 17,
        4, 17, 4, 20, 8, 20, 4, 20, 4, 153, 33, 4, 211, 33, 33, 202,
        34, 33, 25, 202, 33, 33, 24, 194, 32, 33, 34, 21, 1, 210, 32, 32,
        21, 1, 165, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch1_psy);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch1_psy");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch1_psy);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_parameter_float (p, 4, "p2");
      orc_program_add_temporary (p, 8, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");

      orc_program_append_2 (p, "convswl", 0, ORC_VAR_T2, ORC_VAR_S1, 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, "mulf", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_P2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }
  {
    orc_union32 tmp;
    tmp.f = p2;
    ex->params[ORC_VAR_P2] = tmp.i;
  }

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


/* audiopanoramam_orc_process_f32_ch1_psy */
#ifdef DISABLE_ORC
void
audiopanoramam_orc_process_f32_ch1_psy (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, int n)
{
  int i;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var34;
  orc_union32 var35;
  orc_union32 var36;
  orc_union32 var37;
  orc_union64 var38;
  orc_union32 var39;
  orc_union32 var40;

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

  /* 1: loadpl */
  var35.f = p2;
  /* 4: loadpl */
  var37.f = p1;

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

}

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

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

  /* 1: loadpl */
  var35.i = ex->params[25];
  /* 4: loadpl */
  var37.i = ex->params[24];

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

}

void
audiopanoramam_orc_process_f32_ch1_psy (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, 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, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 49, 95, 112, 115, 121, 11, 8, 8, 12, 4, 4, 17,
        4, 17, 4, 20, 4, 20, 4, 202, 33, 4, 25, 202, 32, 4, 24, 194,
        0, 32, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch1_psy);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch1_psy");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch1_psy);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_parameter_float (p, 4, "p2");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_P2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_D1, ORC_VAR_T1, 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }
  {
    orc_union32 tmp;
    tmp.f = p2;
    ex->params[ORC_VAR_P2] = tmp.i;
  }

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


/* audiopanoramam_orc_process_s16_ch2_psy_right */
#ifdef DISABLE_ORC
void
audiopanoramam_orc_process_s16_ch2_psy_right (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, float p2, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var36;
  orc_union32 var37;
  orc_union32 var38;
  orc_union32 var39;
  orc_union64 var40;
  orc_union64 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union32 var44;
  orc_union32 var45;
  orc_union32 var46;
  orc_union64 var47;
  orc_union64 var48;

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

  /* 5: loadpl */
  var37.f = p2;
  /* 7: loadpl */
  var38.f = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var36 = ptr4[i];
    /* 1: convswl */
    var40.x2[0] = var36.x2[0];
    var40.x2[1] = var36.x2[1];
    /* 2: convlf */
    var41.x2f[0] = var40.x2[0];
    var41.x2f[1] = var40.x2[1];
    /* 3: select0ql */
    {
      orc_union64 _src;
      _src.i = var41.i;
      var42.i = _src.x2[0];
    }
    /* 4: select1ql */
    {
      orc_union64 _src;
      _src.i = var41.i;
      var43.i = _src.x2[1];
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var42.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var44.i = ORC_DENORMAL (_dest1.i);
    }
    /* 8: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var42.i);
      _src2.i = ORC_DENORMAL (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var45.i = ORC_DENORMAL (_dest1.i);
    }
    /* 9: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var44.i);
      _src2.i = ORC_DENORMAL (var43.i);
      _dest1.f = _src1.f + _src2.f;
      var46.i = ORC_DENORMAL (_dest1.i);
    }
    /* 10: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var45.i;
      _dest.x2[1] = var46.i;
      var47.i = _dest.i;
    }
    /* 11: convfl */
    {
      int tmp;
      tmp = (int) var47.x2f[0];
      if (tmp == 0x80000000 && !(var47.x2[0] & 0x80000000))
        tmp = 0x7fffffff;
      var48.x2[0] = tmp;
    }
    {
      int tmp;
      tmp = (int) var47.x2f[1];
      if (tmp == 0x80000000 && !(var47.x2[1] & 0x80000000))
        tmp = 0x7fffffff;
      var48.x2[1] = tmp;
    }
    /* 12: convssslw */
    var39.x2[0] = ORC_CLAMP_SW (var48.x2[0]);
    var39.x2[1] = ORC_CLAMP_SW (var48.x2[1]);
    /* 13: storel */
    ptr0[i] = var39;
  }

}

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

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

  /* 5: loadpl */
  var37.i = ex->params[25];
  /* 7: loadpl */
  var38.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var36 = ptr4[i];
    /* 1: convswl */
    var40.x2[0] = var36.x2[0];
    var40.x2[1] = var36.x2[1];
    /* 2: convlf */
    var41.x2f[0] = var40.x2[0];
    var41.x2f[1] = var40.x2[1];
    /* 3: select0ql */
    {
      orc_union64 _src;
      _src.i = var41.i;
      var42.i = _src.x2[0];
    }
    /* 4: select1ql */
    {
      orc_union64 _src;
      _src.i = var41.i;
      var43.i = _src.x2[1];
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var42.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var44.i = ORC_DENORMAL (_dest1.i);
    }
    /* 8: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var42.i);
      _src2.i = ORC_DENORMAL (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var45.i = ORC_DENORMAL (_dest1.i);
    }
    /* 9: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var44.i);
      _src2.i = ORC_DENORMAL (var43.i);
      _dest1.f = _src1.f + _src2.f;
      var46.i = ORC_DENORMAL (_dest1.i);
    }
    /* 10: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var45.i;
      _dest.x2[1] = var46.i;
      var47.i = _dest.i;
    }
    /* 11: convfl */
    {
      int tmp;
      tmp = (int) var47.x2f[0];
      if (tmp == 0x80000000 && !(var47.x2[0] & 0x80000000))
        tmp = 0x7fffffff;
      var48.x2[0] = tmp;
    }
    {
      int tmp;
      tmp = (int) var47.x2f[1];
      if (tmp == 0x80000000 && !(var47.x2[1] & 0x80000000))
        tmp = 0x7fffffff;
      var48.x2[1] = tmp;
    }
    /* 12: convssslw */
    var39.x2[0] = ORC_CLAMP_SW (var48.x2[0]);
    var39.x2[1] = ORC_CLAMP_SW (var48.x2[1]);
    /* 13: storel */
    ptr0[i] = var39;
  }

}

void
audiopanoramam_orc_process_s16_ch2_psy_right (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, float p2, 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, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 50, 95, 112, 115, 121, 95, 114, 105, 103, 104, 116, 11,
        4, 4, 12, 4, 4, 17, 4, 17, 4, 20, 8, 20, 4, 20, 4, 20,
        4, 21, 1, 153, 32, 4, 21, 1, 211, 32, 32, 192, 33, 32, 193, 34,
        32, 202, 35, 33, 25, 202, 33, 33, 24, 200, 34, 35, 34, 194, 32, 33,
        34, 21, 1, 210, 32, 32, 21, 1, 165, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_psy_right);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch2_psy_right");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_psy_right);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_parameter_float (p, 4, "p2");
      orc_program_add_temporary (p, 8, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");
      orc_program_add_temporary (p, 4, "t4");

      orc_program_append_2 (p, "convswl", 1, ORC_VAR_T1, ORC_VAR_S1, 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, "select0ql", 0, ORC_VAR_T2, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "select1ql", 0, ORC_VAR_T3, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T4, ORC_VAR_T2, ORC_VAR_P2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addf", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }
  {
    orc_union32 tmp;
    tmp.f = p2;
    ex->params[ORC_VAR_P2] = tmp.i;
  }

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


/* audiopanoramam_orc_process_s16_ch2_psy_left */
#ifdef DISABLE_ORC
void
audiopanoramam_orc_process_s16_ch2_psy_left (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, float p2, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var36;
  orc_union32 var37;
  orc_union32 var38;
  orc_union32 var39;
  orc_union64 var40;
  orc_union64 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union32 var44;
  orc_union32 var45;
  orc_union32 var46;
  orc_union64 var47;
  orc_union64 var48;

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

  /* 5: loadpl */
  var37.f = p1;
  /* 7: loadpl */
  var38.f = p2;

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var36 = ptr4[i];
    /* 1: convswl */
    var40.x2[0] = var36.x2[0];
    var40.x2[1] = var36.x2[1];
    /* 2: convlf */
    var41.x2f[0] = var40.x2[0];
    var41.x2f[1] = var40.x2[1];
    /* 3: select0ql */
    {
      orc_union64 _src;
      _src.i = var41.i;
      var42.i = _src.x2[0];
    }
    /* 4: select1ql */
    {
      orc_union64 _src;
      _src.i = var41.i;
      var43.i = _src.x2[1];
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var43.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var44.i = ORC_DENORMAL (_dest1.i);
    }
    /* 8: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var43.i);
      _src2.i = ORC_DENORMAL (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var45.i = ORC_DENORMAL (_dest1.i);
    }
    /* 9: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var44.i);
      _src2.i = ORC_DENORMAL (var42.i);
      _dest1.f = _src1.f + _src2.f;
      var46.i = ORC_DENORMAL (_dest1.i);
    }
    /* 10: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var46.i;
      _dest.x2[1] = var45.i;
      var47.i = _dest.i;
    }
    /* 11: convfl */
    {
      int tmp;
      tmp = (int) var47.x2f[0];
      if (tmp == 0x80000000 && !(var47.x2[0] & 0x80000000))
        tmp = 0x7fffffff;
      var48.x2[0] = tmp;
    }
    {
      int tmp;
      tmp = (int) var47.x2f[1];
      if (tmp == 0x80000000 && !(var47.x2[1] & 0x80000000))
        tmp = 0x7fffffff;
      var48.x2[1] = tmp;
    }
    /* 12: convssslw */
    var39.x2[0] = ORC_CLAMP_SW (var48.x2[0]);
    var39.x2[1] = ORC_CLAMP_SW (var48.x2[1]);
    /* 13: storel */
    ptr0[i] = var39;
  }

}

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

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

  /* 5: loadpl */
  var37.i = ex->params[24];
  /* 7: loadpl */
  var38.i = ex->params[25];

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var36 = ptr4[i];
    /* 1: convswl */
    var40.x2[0] = var36.x2[0];
    var40.x2[1] = var36.x2[1];
    /* 2: convlf */
    var41.x2f[0] = var40.x2[0];
    var41.x2f[1] = var40.x2[1];
    /* 3: select0ql */
    {
      orc_union64 _src;
      _src.i = var41.i;
      var42.i = _src.x2[0];
    }
    /* 4: select1ql */
    {
      orc_union64 _src;
      _src.i = var41.i;
      var43.i = _src.x2[1];
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var43.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var44.i = ORC_DENORMAL (_dest1.i);
    }
    /* 8: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var43.i);
      _src2.i = ORC_DENORMAL (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var45.i = ORC_DENORMAL (_dest1.i);
    }
    /* 9: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var44.i);
      _src2.i = ORC_DENORMAL (var42.i);
      _dest1.f = _src1.f + _src2.f;
      var46.i = ORC_DENORMAL (_dest1.i);
    }
    /* 10: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var46.i;
      _dest.x2[1] = var45.i;
      var47.i = _dest.i;
    }
    /* 11: convfl */
    {
      int tmp;
      tmp = (int) var47.x2f[0];
      if (tmp == 0x80000000 && !(var47.x2[0] & 0x80000000))
        tmp = 0x7fffffff;
      var48.x2[0] = tmp;
    }
    {
      int tmp;
      tmp = (int) var47.x2f[1];
      if (tmp == 0x80000000 && !(var47.x2[1] & 0x80000000))
        tmp = 0x7fffffff;
      var48.x2[1] = tmp;
    }
    /* 12: convssslw */
    var39.x2[0] = ORC_CLAMP_SW (var48.x2[0]);
    var39.x2[1] = ORC_CLAMP_SW (var48.x2[1]);
    /* 13: storel */
    ptr0[i] = var39;
  }

}

void
audiopanoramam_orc_process_s16_ch2_psy_left (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, float p1, float p2, 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, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 50, 95, 112, 115, 121, 95, 108, 101, 102, 116, 11, 4,
        4, 12, 4, 4, 17, 4, 17, 4, 20, 8, 20, 4, 20, 4, 20, 4,
        21, 1, 153, 32, 4, 21, 1, 211, 32, 32, 192, 33, 32, 193, 35, 32,
        202, 34, 35, 24, 202, 35, 35, 25, 200, 33, 34, 33, 194, 32, 33, 35,
        21, 1, 210, 32, 32, 21, 1, 165, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_psy_left);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch2_psy_left");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_psy_left);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_parameter_float (p, 4, "p2");
      orc_program_add_temporary (p, 8, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");
      orc_program_add_temporary (p, 4, "t4");

      orc_program_append_2 (p, "convswl", 1, ORC_VAR_T1, ORC_VAR_S1, 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, "select0ql", 0, ORC_VAR_T2, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "select1ql", 0, ORC_VAR_T4, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T3, ORC_VAR_T4, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_P2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addf", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_T4,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }
  {
    orc_union32 tmp;
    tmp.f = p2;
    ex->params[ORC_VAR_P2] = tmp.i;
  }

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


/* audiopanoramam_orc_process_f32_ch2_psy_right */
#ifdef DISABLE_ORC
void
audiopanoramam_orc_process_f32_ch2_psy_right (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, int n)
{
  int i;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union64 var35;
  orc_union64 var36;
  orc_union32 var37;
  orc_union32 var38;
  orc_union64 var39;
  orc_union32 var40;
  orc_union32 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union32 var44;

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

  /* 4: loadpl */
  var37.f = p2;
  /* 6: loadpl */
  var38.f = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var35 = ptr4[i];
    /* 1: select0ql */
    {
      orc_union64 _src;
      _src.i = var35.i;
      var40.i = _src.x2[0];
    }
    /* 2: loadq */
    var36 = ptr4[i];
    /* 3: select1ql */
    {
      orc_union64 _src;
      _src.i = var36.i;
      var41.i = _src.x2[1];
    }
    /* 5: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var43.i = ORC_DENORMAL (_dest1.i);
    }
    /* 8: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var42.i);
      _src2.i = ORC_DENORMAL (var41.i);
      _dest1.f = _src1.f + _src2.f;
      var44.i = ORC_DENORMAL (_dest1.i);
    }
    /* 9: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var43.i;
      _dest.x2[1] = var44.i;
      var39.i = _dest.i;
    }
    /* 10: storeq */
    ptr0[i] = var39;
  }

}

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

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

  /* 4: loadpl */
  var37.i = ex->params[25];
  /* 6: loadpl */
  var38.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var35 = ptr4[i];
    /* 1: select0ql */
    {
      orc_union64 _src;
      _src.i = var35.i;
      var40.i = _src.x2[0];
    }
    /* 2: loadq */
    var36 = ptr4[i];
    /* 3: select1ql */
    {
      orc_union64 _src;
      _src.i = var36.i;
      var41.i = _src.x2[1];
    }
    /* 5: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var43.i = ORC_DENORMAL (_dest1.i);
    }
    /* 8: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var42.i);
      _src2.i = ORC_DENORMAL (var41.i);
      _dest1.f = _src1.f + _src2.f;
      var44.i = ORC_DENORMAL (_dest1.i);
    }
    /* 9: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var43.i;
      _dest.x2[1] = var44.i;
      var39.i = _dest.i;
    }
    /* 10: storeq */
    ptr0[i] = var39;
  }

}

void
audiopanoramam_orc_process_f32_ch2_psy_right (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, 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, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 50, 95, 112, 115, 121, 95, 114, 105, 103, 104, 116, 11,
        8, 8, 12, 8, 8, 17, 4, 17, 4, 20, 4, 20, 4, 20, 4, 192,
        32, 4, 193, 33, 4, 202, 34, 32, 25, 202, 32, 32, 24, 200, 33, 34,
        33, 194, 0, 32, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_psy_right);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch2_psy_right");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_psy_right);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_parameter_float (p, 4, "p2");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");

      orc_program_append_2 (p, "select0ql", 0, ORC_VAR_T1, ORC_VAR_S1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "select1ql", 0, ORC_VAR_T2, ORC_VAR_S1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T3, ORC_VAR_T1, ORC_VAR_P2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addf", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_T2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_D1, ORC_VAR_T1, 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }
  {
    orc_union32 tmp;
    tmp.f = p2;
    ex->params[ORC_VAR_P2] = tmp.i;
  }

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


/* audiopanoramam_orc_process_f32_ch2_psy_left */
#ifdef DISABLE_ORC
void
audiopanoramam_orc_process_f32_ch2_psy_left (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, int n)
{
  int i;
  orc_union64 *ORC_RESTRICT ptr0;
  const orc_union64 *ORC_RESTRICT ptr4;
  orc_union64 var35;
  orc_union64 var36;
  orc_union32 var37;
  orc_union32 var38;
  orc_union64 var39;
  orc_union32 var40;
  orc_union32 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union32 var44;

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

  /* 4: loadpl */
  var37.f = p1;
  /* 6: loadpl */
  var38.f = p2;

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var35 = ptr4[i];
    /* 1: select0ql */
    {
      orc_union64 _src;
      _src.i = var35.i;
      var40.i = _src.x2[0];
    }
    /* 2: loadq */
    var36 = ptr4[i];
    /* 3: select1ql */
    {
      orc_union64 _src;
      _src.i = var36.i;
      var41.i = _src.x2[1];
    }
    /* 5: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.i);
      _src2.i = ORC_DENORMAL (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var43.i = ORC_DENORMAL (_dest1.i);
    }
    /* 8: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var42.i);
      _src2.i = ORC_DENORMAL (var40.i);
      _dest1.f = _src1.f + _src2.f;
      var44.i = ORC_DENORMAL (_dest1.i);
    }
    /* 9: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var44.i;
      _dest.x2[1] = var43.i;
      var39.i = _dest.i;
    }
    /* 10: storeq */
    ptr0[i] = var39;
  }

}

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

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

  /* 4: loadpl */
  var37.i = ex->params[24];
  /* 6: loadpl */
  var38.i = ex->params[25];

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var35 = ptr4[i];
    /* 1: select0ql */
    {
      orc_union64 _src;
      _src.i = var35.i;
      var40.i = _src.x2[0];
    }
    /* 2: loadq */
    var36 = ptr4[i];
    /* 3: select1ql */
    {
      orc_union64 _src;
      _src.i = var36.i;
      var41.i = _src.x2[1];
    }
    /* 5: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.i);
      _src2.i = ORC_DENORMAL (var37.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.i);
      _src2.i = ORC_DENORMAL (var38.i);
      _dest1.f = _src1.f * _src2.f;
      var43.i = ORC_DENORMAL (_dest1.i);
    }
    /* 8: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var42.i);
      _src2.i = ORC_DENORMAL (var40.i);
      _dest1.f = _src1.f + _src2.f;
      var44.i = ORC_DENORMAL (_dest1.i);
    }
    /* 9: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var44.i;
      _dest.x2[1] = var43.i;
      var39.i = _dest.i;
    }
    /* 10: storeq */
    ptr0[i] = var39;
  }

}

void
audiopanoramam_orc_process_f32_ch2_psy_left (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, float p1, float p2, 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, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 50, 95, 112, 115, 121, 95, 108, 101, 102, 116, 11, 8,
        8, 12, 8, 8, 17, 4, 17, 4, 20, 4, 20, 4, 20, 4, 192, 32,
        4, 193, 34, 4, 202, 33, 34, 24, 202, 34, 34, 25, 200, 32, 33, 32,
        194, 0, 32, 34, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_psy_left);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch2_psy_left");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_psy_left);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_parameter_float (p, 4, "p2");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");

      orc_program_append_2 (p, "select0ql", 0, ORC_VAR_T1, ORC_VAR_S1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "select1ql", 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_T3, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_P2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_T1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_T3,
          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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }
  {
    orc_union32 tmp;
    tmp.f = p2;
    ex->params[ORC_VAR_P2] = tmp.i;
  }

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


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

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

  /* 3: loadpl */
  var36.f = p1;

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

}

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

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

  /* 3: loadpl */
  var36.i = ex->params[24];

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

}

void
audiopanoramam_orc_process_s16_ch1_sim_right (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, 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, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 49, 95, 115, 105, 109, 95, 114, 105, 103, 104, 116, 11,
        4, 4, 12, 2, 2, 17, 4, 20, 8, 20, 4, 20, 4, 153, 33, 4,
        211, 33, 33, 202, 34, 33, 24, 194, 32, 33, 34, 21, 1, 210, 32, 32,
        21, 1, 165, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch1_sim_right);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch1_sim_right");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch1_sim_right);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_temporary (p, 8, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");

      orc_program_append_2 (p, "convswl", 0, ORC_VAR_T2, ORC_VAR_S1, 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, "mulf", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

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


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

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

  /* 3: loadpl */
  var36.f = p1;

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

}

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

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

  /* 3: loadpl */
  var36.i = ex->params[24];

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

}

void
audiopanoramam_orc_process_s16_ch1_sim_left (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, 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, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 49, 95, 115, 105, 109, 95, 108, 101, 102, 116, 11, 4,
        4, 12, 2, 2, 17, 4, 20, 8, 20, 4, 20, 4, 153, 34, 4, 211,
        34, 34, 202, 33, 34, 24, 194, 32, 33, 34, 21, 1, 210, 32, 32, 21,
        1, 165, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch1_sim_left);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch1_sim_left");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch1_sim_left);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_temporary (p, 8, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");

      orc_program_append_2 (p, "convswl", 0, ORC_VAR_T3, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlf", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_T3, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

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


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

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

  /* 5: loadpl */
  var36.f = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var35 = ptr4[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: select0ql */
    {
      orc_union64 _src;
      _src.i = var39.i;
      var40.i = _src.x2[0];
    }
    /* 4: select1ql */
    {
      orc_union64 _src;
      _src.i = var39.i;
      var41.i = _src.x2[1];
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.i);
      _src2.i = ORC_DENORMAL (var36.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var40.i;
      _dest.x2[1] = var42.i;
      var43.i = _dest.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: convssslw */
    var37.x2[0] = ORC_CLAMP_SW (var44.x2[0]);
    var37.x2[1] = ORC_CLAMP_SW (var44.x2[1]);
    /* 10: storel */
    ptr0[i] = var37;
  }

}

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

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

  /* 5: loadpl */
  var36.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var35 = ptr4[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: select0ql */
    {
      orc_union64 _src;
      _src.i = var39.i;
      var40.i = _src.x2[0];
    }
    /* 4: select1ql */
    {
      orc_union64 _src;
      _src.i = var39.i;
      var41.i = _src.x2[1];
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var41.i);
      _src2.i = ORC_DENORMAL (var36.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var40.i;
      _dest.x2[1] = var42.i;
      var43.i = _dest.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: convssslw */
    var37.x2[0] = ORC_CLAMP_SW (var44.x2[0]);
    var37.x2[1] = ORC_CLAMP_SW (var44.x2[1]);
    /* 10: storel */
    ptr0[i] = var37;
  }

}

void
audiopanoramam_orc_process_s16_ch2_sim_right (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, 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, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 50, 95, 115, 105, 109, 95, 114, 105, 103, 104, 116, 11,
        4, 4, 12, 4, 4, 17, 4, 20, 8, 20, 4, 20, 4, 21, 1, 153,
        32, 4, 21, 1, 211, 32, 32, 192, 33, 32, 193, 34, 32, 202, 34, 34,
        24, 194, 32, 33, 34, 21, 1, 210, 32, 32, 21, 1, 165, 0, 32, 2,
        0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_sim_right);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch2_sim_right");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_sim_right);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_temporary (p, 8, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");

      orc_program_append_2 (p, "convswl", 1, ORC_VAR_T1, ORC_VAR_S1, 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, "select0ql", 0, ORC_VAR_T2, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "select1ql", 0, ORC_VAR_T3, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T3, ORC_VAR_T3, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

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


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

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

  /* 5: loadpl */
  var36.f = p1;

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var35 = ptr4[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: select0ql */
    {
      orc_union64 _src;
      _src.i = var39.i;
      var40.i = _src.x2[0];
    }
    /* 4: select1ql */
    {
      orc_union64 _src;
      _src.i = var39.i;
      var41.i = _src.x2[1];
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var36.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var42.i;
      _dest.x2[1] = var41.i;
      var43.i = _dest.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: convssslw */
    var37.x2[0] = ORC_CLAMP_SW (var44.x2[0]);
    var37.x2[1] = ORC_CLAMP_SW (var44.x2[1]);
    /* 10: storel */
    ptr0[i] = var37;
  }

}

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

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

  /* 5: loadpl */
  var36.i = ex->params[24];

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var35 = ptr4[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: select0ql */
    {
      orc_union64 _src;
      _src.i = var39.i;
      var40.i = _src.x2[0];
    }
    /* 4: select1ql */
    {
      orc_union64 _src;
      _src.i = var39.i;
      var41.i = _src.x2[1];
    }
    /* 6: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var40.i);
      _src2.i = ORC_DENORMAL (var36.i);
      _dest1.f = _src1.f * _src2.f;
      var42.i = ORC_DENORMAL (_dest1.i);
    }
    /* 7: mergelq */
    {
      orc_union64 _dest;
      _dest.x2[0] = var42.i;
      _dest.x2[1] = var41.i;
      var43.i = _dest.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: convssslw */
    var37.x2[0] = ORC_CLAMP_SW (var44.x2[0]);
    var37.x2[1] = ORC_CLAMP_SW (var44.x2[1]);
    /* 10: storel */
    ptr0[i] = var37;
  }

}

void
audiopanoramam_orc_process_s16_ch2_sim_left (gint16 * ORC_RESTRICT d1,
    const gint16 * ORC_RESTRICT s1, 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, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
        49,
        54, 95, 99, 104, 50, 95, 115, 105, 109, 95, 108, 101, 102, 116, 11, 4,
        4, 12, 4, 4, 17, 4, 20, 8, 20, 4, 20, 4, 21, 1, 153, 32,
        4, 21, 1, 211, 32, 32, 192, 33, 32, 193, 34, 32, 202, 33, 33, 24,
        194, 32, 33, 34, 21, 1, 210, 32, 32, 21, 1, 165, 0, 32, 2, 0,

      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_sim_left);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_s16_ch2_sim_left");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_s16_ch2_sim_left);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_temporary (p, 8, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 4, "t3");

      orc_program_append_2 (p, "convswl", 1, ORC_VAR_T1, ORC_VAR_S1, 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, "select0ql", 0, ORC_VAR_T2, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "select1ql", 0, ORC_VAR_T3, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_T3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 1, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

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


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

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

  /* 3: loadpl */
  var36.f = p1;

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

}

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

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

  /* 3: loadpl */
  var36.i = ex->params[24];

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

}

void
audiopanoramam_orc_process_f32_ch1_sim_right (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, 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, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 49, 95, 115, 105, 109, 95, 114, 105, 103, 104, 116, 11,
        8, 8, 12, 4, 4, 17, 4, 20, 4, 20, 4, 112, 32, 4, 202, 33,
        4, 24, 194, 0, 32, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch1_sim_right);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch1_sim_right");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch1_sim_right);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "copyl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_D1, ORC_VAR_T1, 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

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


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

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

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

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

}

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

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

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

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

}

void
audiopanoramam_orc_process_f32_ch1_sim_left (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, 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, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 49, 95, 115, 105, 109, 95, 108, 101, 102, 116, 11, 8,
        8, 12, 4, 4, 17, 4, 20, 4, 20, 4, 202, 32, 4, 24, 112, 33,
        4, 194, 0, 32, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch1_sim_left);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch1_sim_left");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch1_sim_left);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "copyl", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_D1, ORC_VAR_T1, 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

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


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

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

  /* 4: loadpl */
  var36.f = p1;

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

}

#else
static void
_backup_audiopanoramam_orc_process_f32_ch2_sim_right (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_union32 var36;
  orc_union64 var37;
  orc_union32 var38;
  orc_union32 var39;
  orc_union32 var40;

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

  /* 4: loadpl */
  var36.i = ex->params[24];

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

}

void
audiopanoramam_orc_process_f32_ch2_sim_right (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, 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, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 50, 95, 115, 105, 109, 95, 114, 105, 103, 104, 116, 11,
        8, 8, 12, 8, 8, 17, 4, 20, 4, 20, 4, 192, 32, 4, 193, 33,
        4, 202, 33, 33, 24, 194, 0, 32, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_sim_right);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch2_sim_right");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_sim_right);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "select0ql", 0, ORC_VAR_T1, ORC_VAR_S1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "select1ql", 0, ORC_VAR_T2, ORC_VAR_S1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_D1, ORC_VAR_T1, 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

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


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

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

  /* 4: loadpl */
  var36.f = p1;

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

}

#else
static void
_backup_audiopanoramam_orc_process_f32_ch2_sim_left (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_union32 var36;
  orc_union64 var37;
  orc_union32 var38;
  orc_union32 var39;
  orc_union32 var40;

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

  /* 4: loadpl */
  var36.i = ex->params[24];

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

}

void
audiopanoramam_orc_process_f32_ch2_sim_left (gfloat * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, 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, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
        109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
        51,
        50, 95, 99, 104, 50, 95, 115, 105, 109, 95, 108, 101, 102, 116, 11, 8,
        8, 12, 8, 8, 17, 4, 20, 4, 20, 4, 192, 32, 4, 193, 33, 4,
        202, 32, 32, 24, 194, 0, 32, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_sim_left);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audiopanoramam_orc_process_f32_ch2_sim_left");
      orc_program_set_backup_function (p,
          _backup_audiopanoramam_orc_process_f32_ch2_sim_left);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter_float (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "select0ql", 0, ORC_VAR_T1, ORC_VAR_S1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "select1ql", 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_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mergelq", 0, ORC_VAR_D1, ORC_VAR_T1, 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;
  {
    orc_union32 tmp;
    tmp.f = p1;
    ex->params[ORC_VAR_P1] = tmp.i;
  }

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