
/* autogenerated from gstaudioconvertorc.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 audio_convert_orc_unpack_u8 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s8 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_u16 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s16 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_u16_swap (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s16_swap (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_u32 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s32 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_u32_swap (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s32_swap (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_float_s32 (guint32 * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, int n);
void audio_convert_orc_unpack_float_s32_swap (guint32 * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, int n);
void audio_convert_orc_unpack_double_s32 (guint32 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void audio_convert_orc_unpack_double_s32_swap (guint32 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void audio_convert_orc_unpack_float_double (gdouble * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, int n);
void audio_convert_orc_unpack_float_double_swap (gdouble * ORC_RESTRICT d1,
    const gfloat * ORC_RESTRICT s1, int n);
void audio_convert_orc_unpack_double_double (gdouble * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void audio_convert_orc_unpack_double_double_swap (gdouble * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void audio_convert_orc_unpack_u8_double (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s8_double (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_u16_double (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s16_double (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_u16_double_swap (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s16_double_swap (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_u32_double (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s32_double (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_u32_double_swap (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_unpack_s32_double_swap (gdouble * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_u8 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_s8 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_u16 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_s16 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_u16_swap (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_s16_swap (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_u32 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_s32 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_u32_swap (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_s32_swap (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_s32_float (gfloat * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int n);
void audio_convert_orc_pack_s32_float_swap (gfloat * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int n);
void audio_convert_orc_pack_s32_double (gdouble * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int n);
void audio_convert_orc_pack_s32_double_swap (gdouble * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int n);
void audio_convert_orc_pack_double_float (gfloat * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void audio_convert_orc_pack_double_float_swap (gfloat * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int n);
void audio_convert_orc_pack_double_u8 (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_s8 (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_u16 (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_s16 (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_u16_swap (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_s16_swap (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_u32 (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_s32 (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_u32_swap (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int p1, int n);
void audio_convert_orc_pack_double_s32_swap (guint8 * ORC_RESTRICT d1,
    const gdouble * ORC_RESTRICT s1, int 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 255
#define ORC_UB_MIN 0
#define ORC_SW_MAX 32767
#define ORC_SW_MIN (-1-ORC_SW_MAX)
#define ORC_UW_MAX 65535
#define ORC_UW_MIN 0
#define ORC_SL_MAX 2147483647
#define ORC_SL_MIN (-1-ORC_SL_MAX)
#define ORC_UL_MAX 4294967295U
#define ORC_UL_MIN 0
#define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX)
#define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX)
#define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX)
#define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX)
#define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX)
#define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX)
#define ORC_SWAP_W(x) ((((x)&0xffU)<<8) | (((x)&0xff00U)>>8))
#define ORC_SWAP_L(x) ((((x)&0xffU)<<24) | (((x)&0xff00U)<<8) | (((x)&0xff0000U)>>8) | (((x)&0xff000000U)>>24))
#define ORC_SWAP_Q(x) ((((x)&ORC_UINT64_C(0xff))<<56) | (((x)&ORC_UINT64_C(0xff00))<<40) | (((x)&ORC_UINT64_C(0xff0000))<<24) | (((x)&ORC_UINT64_C(0xff000000))<<8) | (((x)&ORC_UINT64_C(0xff00000000))>>8) | (((x)&ORC_UINT64_C(0xff0000000000))>>24) | (((x)&ORC_UINT64_C(0xff000000000000))>>40) | (((x)&ORC_UINT64_C(0xff00000000000000))>>56))
#define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset)))
#define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff))
#define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0))
#define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff)))
#define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0))
#ifndef ORC_RESTRICT
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
#define ORC_RESTRICT restrict
#elif defined(__GNUC__) && __GNUC__ >= 4
#define ORC_RESTRICT __restrict__
#else
#define ORC_RESTRICT
#endif
#endif
/* end Orc C target preamble */



/* audio_convert_orc_unpack_u8 */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_u8 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_int8 *ORC_RESTRICT ptr4;
  orc_int8 var34;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var35;
#else
  orc_union32 var35;
#endif
  orc_union32 var36;
  orc_union16 var37;
  orc_union32 var38;
  orc_union32 var39;

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

  /* 4: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 1: convubw */
    var37.i = (orc_uint8) var34;
    /* 2: convuwl */
    var38.i = (orc_uint16) var37.i;
    /* 3: shll */
    var39.i = ((orc_uint32) var38.i) << p1;
    /* 5: xorl */
    var36.i = var39.i ^ var35.i;
    /* 6: storel */
    ptr0[i] = var36;
  }

}

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

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

  /* 4: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 1: convubw */
    var37.i = (orc_uint8) var34;
    /* 2: convuwl */
    var38.i = (orc_uint16) var37.i;
    /* 3: shll */
    var39.i = ((orc_uint32) var38.i) << ex->params[24];
    /* 5: xorl */
    var36.i = var39.i ^ var35.i;
    /* 6: storel */
    ptr0[i] = var36;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 27, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 56, 11, 4,
        4, 12, 1, 1, 14, 4, 0, 0, 0, 128, 16, 4, 20, 2, 20, 4,
        150, 32, 4, 154, 33, 32, 124, 33, 33, 24, 132, 0, 33, 16, 2, 0,

      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_u8);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u8");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_u8);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 1, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_C1,
          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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_unpack_s8 */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_s8 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_int8 *ORC_RESTRICT ptr4;
  orc_int8 var34;
  orc_union32 var35;
  orc_union16 var36;
  orc_union32 var37;

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


  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 1: convubw */
    var36.i = (orc_uint8) var34;
    /* 2: convuwl */
    var37.i = (orc_uint16) var36.i;
    /* 3: shll */
    var35.i = ((orc_uint32) var37.i) << p1;
    /* 4: storel */
    ptr0[i] = var35;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 1: convubw */
    var36.i = (orc_uint8) var34;
    /* 2: convuwl */
    var37.i = (orc_uint16) var36.i;
    /* 3: shll */
    var35.i = ((orc_uint32) var37.i) << ex->params[24];
    /* 4: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 27, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 56, 11, 4,
        4, 12, 1, 1, 16, 4, 20, 2, 20, 4, 150, 32, 4, 154, 33, 32,
        124, 0, 33, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_s8);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s8");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_s8);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 1, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

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

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

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


/* audio_convert_orc_unpack_u16 */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_u16 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union16 *ORC_RESTRICT ptr4;
  orc_union16 var33;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var34;
#else
  orc_union32 var34;
#endif
  orc_union32 var35;
  orc_union32 var36;
  orc_union32 var37;

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

  /* 3: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr4[i];
    /* 1: convuwl */
    var36.i = (orc_uint16) var33.i;
    /* 2: shll */
    var37.i = ((orc_uint32) var36.i) << p1;
    /* 4: xorl */
    var35.i = var37.i ^ var34.i;
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 3: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr4[i];
    /* 1: convuwl */
    var36.i = (orc_uint16) var33.i;
    /* 2: shll */
    var37.i = ((orc_uint32) var36.i) << ex->params[24];
    /* 4: xorl */
    var35.i = var37.i ^ var34.i;
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 28, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 49, 54, 11,
        4, 4, 12, 2, 2, 14, 4, 0, 0, 0, 128, 16, 4, 20, 4, 154,
        32, 4, 124, 32, 32, 24, 132, 0, 32, 16, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_u16);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u16");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_u16);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C1,
          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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_unpack_s16 */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_s16 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union16 *ORC_RESTRICT ptr4;
  orc_union16 var33;
  orc_union32 var34;
  orc_union32 var35;

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr4[i];
    /* 1: convuwl */
    var35.i = (orc_uint16) var33.i;
    /* 2: shll */
    var34.i = ((orc_uint32) var35.i) << p1;
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr4[i];
    /* 1: convuwl */
    var35.i = (orc_uint16) var33.i;
    /* 2: shll */
    var34.i = ((orc_uint32) var35.i) << ex->params[24];
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 28, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 49, 54, 11,
        4, 4, 12, 2, 2, 16, 4, 20, 4, 154, 32, 4, 124, 0, 32, 24,
        2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_s16);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s16");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_s16);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

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

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

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


/* audio_convert_orc_unpack_u16_swap */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_u16_swap (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union16 *ORC_RESTRICT ptr4;
  orc_union16 var34;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var35;
#else
  orc_union32 var35;
#endif
  orc_union32 var36;
  orc_union16 var37;
  orc_union32 var38;
  orc_union32 var39;

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

  /* 4: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 1: swapw */
    var37.i = ORC_SWAP_W (var34.i);
    /* 2: convuwl */
    var38.i = (orc_uint16) var37.i;
    /* 3: shll */
    var39.i = ((orc_uint32) var38.i) << p1;
    /* 5: xorl */
    var36.i = var39.i ^ var35.i;
    /* 6: storel */
    ptr0[i] = var36;
  }

}

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

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

  /* 4: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 1: swapw */
    var37.i = ORC_SWAP_W (var34.i);
    /* 2: convuwl */
    var38.i = (orc_uint16) var37.i;
    /* 3: shll */
    var39.i = ((orc_uint32) var38.i) << ex->params[24];
    /* 5: xorl */
    var36.i = var39.i ^ var35.i;
    /* 6: storel */
    ptr0[i] = var36;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 49, 54, 95,
        115, 119, 97, 112, 11, 4, 4, 12, 2, 2, 14, 4, 0, 0, 0, 128,
        16, 4, 20, 2, 20, 4, 183, 32, 4, 154, 33, 32, 124, 33, 33, 24,
        132, 0, 33, 16, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u16_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u16_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u16_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_C1,
          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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_unpack_s16_swap */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_s16_swap (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union16 *ORC_RESTRICT ptr4;
  orc_union16 var34;
  orc_union32 var35;
  orc_union16 var36;
  orc_union32 var37;

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 1: swapw */
    var36.i = ORC_SWAP_W (var34.i);
    /* 2: convuwl */
    var37.i = (orc_uint16) var36.i;
    /* 3: shll */
    var35.i = ((orc_uint32) var37.i) << p1;
    /* 4: storel */
    ptr0[i] = var35;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 1: swapw */
    var36.i = ORC_SWAP_W (var34.i);
    /* 2: convuwl */
    var37.i = (orc_uint16) var36.i;
    /* 3: shll */
    var35.i = ((orc_uint32) var37.i) << ex->params[24];
    /* 4: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 49, 54, 95,
        115, 119, 97, 112, 11, 4, 4, 12, 2, 2, 16, 4, 20, 2, 20, 4,
        183, 32, 4, 154, 33, 32, 124, 0, 33, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s16_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s16_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s16_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

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

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

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


/* audio_convert_orc_unpack_u32 */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_u32 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var33;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var34;
#else
  orc_union32 var34;
#endif
  orc_union32 var35;
  orc_union32 var36;

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shll */
    var36.i = ((orc_uint32) var33.i) << p1;
    /* 3: xorl */
    var35.i = var36.i ^ var34.i;
    /* 4: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shll */
    var36.i = ((orc_uint32) var33.i) << ex->params[24];
    /* 3: xorl */
    var35.i = var36.i ^ var34.i;
    /* 4: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 28, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 51, 50, 11,
        4, 4, 12, 4, 4, 14, 4, 0, 0, 0, 128, 16, 4, 20, 4, 124,
        32, 4, 24, 132, 0, 32, 16, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_u32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u32");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_u32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C1,
          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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_unpack_s32 */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_s32 (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, 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: shll */
    var33.i = ((orc_uint32) var32.i) << p1;
    /* 2: storel */
    ptr0[i] = var33;
  }

}

#else
static void
_backup_audio_convert_orc_unpack_s32 (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: shll */
    var33.i = ((orc_uint32) var32.i) << ex->params[24];
    /* 2: storel */
    ptr0[i] = var33;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 28, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 51, 50, 11,
        4, 4, 12, 4, 4, 16, 4, 124, 0, 4, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_s32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s32");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_unpack_s32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");

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

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

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

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


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

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

  /* 3: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var36.i = ORC_SWAP_L (var33.i);
    /* 2: shll */
    var37.i = ((orc_uint32) var36.i) << p1;
    /* 4: xorl */
    var35.i = var37.i ^ var34.i;
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 3: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var36.i = ORC_SWAP_L (var33.i);
    /* 2: shll */
    var37.i = ((orc_uint32) var36.i) << ex->params[24];
    /* 4: xorl */
    var35.i = var37.i ^ var34.i;
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 51, 50, 95,
        115, 119, 97, 112, 11, 4, 4, 12, 4, 4, 14, 4, 0, 0, 0, 128,
        16, 4, 20, 4, 184, 32, 4, 124, 32, 32, 24, 132, 0, 32, 16, 2,
        0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u32_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u32_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u32_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_C1,
          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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_unpack_s32_swap */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_s32_swap (gint32 * ORC_RESTRICT d1,
    const guint8 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var33;
  orc_union32 var34;
  orc_union32 var35;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var35.i = ORC_SWAP_L (var33.i);
    /* 2: shll */
    var34.i = ((orc_uint32) var35.i) << p1;
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var35.i = ORC_SWAP_L (var33.i);
    /* 2: shll */
    var34.i = ((orc_uint32) var35.i) << ex->params[24];
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 51, 50, 95,
        115, 119, 97, 112, 11, 4, 4, 12, 4, 4, 16, 4, 20, 4, 184, 32,
        4, 124, 0, 32, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s32_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s32_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s32_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 1: loadpl */
  var33.i = (int) 0x4f000000;   /* 1325400064 or 6.54835e-315f */
  /* 3: loadpl */
  var34.i = (int) 0x3f000000;   /* 1056964608 or 5.2221e-315f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var36 = ptr4[i];
    /* 2: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var36.i);
      _src2.i = ORC_DENORMAL (var33.i);
      _dest1.f = _src1.f * _src2.f;
      var37.i = ORC_DENORMAL (_dest1.i);
    }
    /* 4: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var37.i);
      _src2.i = ORC_DENORMAL (var34.i);
      _dest1.f = _src1.f + _src2.f;
      var38.i = ORC_DENORMAL (_dest1.i);
    }
    /* 5: convfl */
    {
      int tmp;
      tmp = (int) var38.f;
      if (tmp == 0x80000000 && !(var38.i & 0x80000000))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 6: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 1: loadpl */
  var33.i = (int) 0x4f000000;   /* 1325400064 or 6.54835e-315f */
  /* 3: loadpl */
  var34.i = (int) 0x3f000000;   /* 1056964608 or 5.2221e-315f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var36 = ptr4[i];
    /* 2: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var36.i);
      _src2.i = ORC_DENORMAL (var33.i);
      _dest1.f = _src1.f * _src2.f;
      var37.i = ORC_DENORMAL (_dest1.i);
    }
    /* 4: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var37.i);
      _src2.i = ORC_DENORMAL (var34.i);
      _dest1.f = _src1.f + _src2.f;
      var38.i = ORC_DENORMAL (_dest1.i);
    }
    /* 5: convfl */
    {
      int tmp;
      tmp = (int) var38.f;
      if (tmp == 0x80000000 && !(var38.i & 0x80000000))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 6: storel */
    ptr0[i] = var35;
  }

}

void
audio_convert_orc_unpack_float_s32 (guint32 * 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, 34, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 102, 108, 111, 97,
        116, 95, 115, 51, 50, 11, 4, 4, 12, 4, 4, 14, 4, 0, 0, 0,
        79, 14, 4, 0, 0, 0, 63, 20, 4, 113, 32, 4, 202, 32, 32, 16,
        200, 32, 32, 17, 210, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_float_s32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_float_s32");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_float_s32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x4f000000, "c1");
      orc_program_add_constant (p, 4, 0x3f000000, "c2");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 2: loadpl */
  var34.i = (int) 0x4f000000;   /* 1325400064 or 6.54835e-315f */
  /* 4: loadpl */
  var35.i = (int) 0x3f000000;   /* 1056964608 or 5.2221e-315f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var37.i = ORC_SWAP_L (var33.i);
    /* 3: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var37.i);
      _src2.i = ORC_DENORMAL (var34.i);
      _dest1.f = _src1.f * _src2.f;
      var38.i = ORC_DENORMAL (_dest1.i);
    }
    /* 5: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var38.i);
      _src2.i = ORC_DENORMAL (var35.i);
      _dest1.f = _src1.f + _src2.f;
      var39.i = ORC_DENORMAL (_dest1.i);
    }
    /* 6: convfl */
    {
      int tmp;
      tmp = (int) var39.f;
      if (tmp == 0x80000000 && !(var39.i & 0x80000000))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 7: storel */
    ptr0[i] = var36;
  }

}

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

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

  /* 2: loadpl */
  var34.i = (int) 0x4f000000;   /* 1325400064 or 6.54835e-315f */
  /* 4: loadpl */
  var35.i = (int) 0x3f000000;   /* 1056964608 or 5.2221e-315f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var37.i = ORC_SWAP_L (var33.i);
    /* 3: mulf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var37.i);
      _src2.i = ORC_DENORMAL (var34.i);
      _dest1.f = _src1.f * _src2.f;
      var38.i = ORC_DENORMAL (_dest1.i);
    }
    /* 5: addf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var38.i);
      _src2.i = ORC_DENORMAL (var35.i);
      _dest1.f = _src1.f + _src2.f;
      var39.i = ORC_DENORMAL (_dest1.i);
    }
    /* 6: convfl */
    {
      int tmp;
      tmp = (int) var39.f;
      if (tmp == 0x80000000 && !(var39.i & 0x80000000))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 7: storel */
    ptr0[i] = var36;
  }

}

void
audio_convert_orc_unpack_float_s32_swap (guint32 * 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, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 102, 108, 111, 97,
        116, 95, 115, 51, 50, 95, 115, 119, 97, 112, 11, 4, 4, 12, 4, 4,
        14, 4, 0, 0, 0, 79, 14, 4, 0, 0, 0, 63, 20, 4, 184, 32,
        4, 202, 32, 32, 16, 200, 32, 32, 17, 210, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_float_s32_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_float_s32_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_float_s32_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x4f000000, "c1");
      orc_program_add_constant (p, 4, 0x3f000000, "c2");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 1: loadpq */
  var33.i = ORC_UINT64_C (0x41dfffffffc00000);  /* 2.14748e+09f */
  /* 3: loadpq */
  var34.i = ORC_UINT64_C (0x3fe0000000000000);  /* 0.5f */

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

}

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

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

  /* 1: loadpq */
  var33.i = ORC_UINT64_C (0x41dfffffffc00000);  /* 2.14748e+09f */
  /* 3: loadpq */
  var34.i = ORC_UINT64_C (0x3fe0000000000000);  /* 0.5f */

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

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 35, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 100, 111, 117, 98,
        108, 101, 95, 115, 51, 50, 11, 4, 4, 12, 8, 8, 15, 8, 0, 0,
        192, 255, 255, 255, 223, 65, 15, 8, 0, 0, 0, 0, 0, 0, 224, 63,
        20, 8, 133, 32, 4, 214, 32, 32, 16, 212, 32, 32, 17, 222, 0, 32,
        2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_double_s32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_double_s32");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_double_s32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_constant_int64 (p, 8, 0x41dfffffffc00000ULL, "c1");
      orc_program_add_constant_int64 (p, 8, 0x3fe0000000000000ULL, "c2");
      orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "loadq", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "muld", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addd", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convdl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 2: loadpq */
  var34.i = ORC_UINT64_C (0x41dfffffffc00000);  /* 2.14748e+09f */
  /* 4: loadpq */
  var35.i = ORC_UINT64_C (0x3fe0000000000000);  /* 0.5f */

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

}

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

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

  /* 2: loadpq */
  var34.i = ORC_UINT64_C (0x41dfffffffc00000);  /* 2.14748e+09f */
  /* 4: loadpq */
  var35.i = ORC_UINT64_C (0x3fe0000000000000);  /* 0.5f */

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

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 40, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 100, 111, 117, 98,
        108, 101, 95, 115, 51, 50, 95, 115, 119, 97, 112, 11, 4, 4, 12, 8,
        8, 15, 8, 0, 0, 192, 255, 255, 255, 223, 65, 15, 8, 0, 0, 0,
        0, 0, 0, 224, 63, 20, 8, 186, 32, 4, 214, 32, 32, 16, 212, 32,
        32, 17, 222, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_double_s32_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_double_s32_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_double_s32_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_constant_int64 (p, 8, 0x41dfffffffc00000ULL, "c1");
      orc_program_add_constant_int64 (p, 8, 0x3fe0000000000000ULL, "c2");
      orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "swapq", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "muld", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addd", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convdl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


/* audio_convert_orc_unpack_float_double */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_float_double (gdouble * 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_union64 var33;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr4[i];
    /* 1: convfd */
    {
      orc_union32 _src1;
      _src1.i = ORC_DENORMAL (var32.i);
      var33.f = _src1.f;
    }
    /* 2: storeq */
    ptr0[i] = var33;
  }

}

#else
static void
_backup_audio_convert_orc_unpack_float_double (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_union64 var33;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr4[i];
    /* 1: convfd */
    {
      orc_union32 _src1;
      _src1.i = ORC_DENORMAL (var32.i);
      var33.f = _src1.f;
    }
    /* 2: storeq */
    ptr0[i] = var33;
  }

}

void
audio_convert_orc_unpack_float_double (gdouble * 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, 37, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 102, 108, 111, 97,
        116, 95, 100, 111, 117, 98, 108, 101, 11, 8, 8, 12, 4, 4, 224, 0,
        4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_float_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_float_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_float_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");

      orc_program_append_2 (p, "convfd", 0, 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


/* audio_convert_orc_unpack_float_double_swap */
#ifdef DISABLE_ORC
void
audio_convert_orc_unpack_float_double_swap (gdouble * 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 var33;
  orc_union64 var34;
  orc_union32 var35;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var35.i = ORC_SWAP_L (var33.i);
    /* 2: convfd */
    {
      orc_union32 _src1;
      _src1.i = ORC_DENORMAL (var35.i);
      var34.f = _src1.f;
    }
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var35.i = ORC_SWAP_L (var33.i);
    /* 2: convfd */
    {
      orc_union32 _src1;
      _src1.i = ORC_DENORMAL (var35.i);
      var34.f = _src1.f;
    }
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

void
audio_convert_orc_unpack_float_double_swap (gdouble * 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, 42, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 102, 108, 111, 97,
        116, 95, 100, 111, 117, 98, 108, 101, 95, 115, 119, 97, 112, 11, 8, 8,
        12, 4, 4, 20, 4, 184, 32, 4, 224, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_float_double_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_float_double_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_float_double_swap);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convfd", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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


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

}

#else
static void
_backup_audio_convert_orc_unpack_double_double (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: copyq */
    var33.i = var32.i;
    /* 2: storeq */
    ptr0[i] = var33;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 38, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 100, 111, 117, 98,
        108, 101, 95, 100, 111, 117, 98, 108, 101, 11, 8, 8, 12, 8, 8, 137,
        0, 4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_double_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_double_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_double_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");

      orc_program_append_2 (p, "copyq", 0, 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


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

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


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

}

#else
static void
_backup_audio_convert_orc_unpack_double_double_swap (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: swapq */
    var33.i = ORC_SWAP_Q (var32.i);
    /* 2: storeq */
    ptr0[i] = var33;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 43, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 100, 111, 117, 98,
        108, 101, 95, 100, 111, 117, 98, 108, 101, 95, 115, 119, 97, 112, 11, 8,
        8, 12, 8, 8, 186, 0, 4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_double_double_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_double_double_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_double_double_swap);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 8, "s1");

      orc_program_append_2 (p, "swapq", 0, 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


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

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

  /* 4: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 1: convubw */
    var37.i = (orc_uint8) var34;
    /* 2: convuwl */
    var38.i = (orc_uint16) var37.i;
    /* 3: shll */
    var39.i = ((orc_uint32) var38.i) << p1;
    /* 5: xorl */
    var40.i = var39.i ^ var35.i;
    /* 6: convld */
    var36.f = var40.i;
    /* 7: storeq */
    ptr0[i] = var36;
  }

}

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

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

  /* 4: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 1: convubw */
    var37.i = (orc_uint8) var34;
    /* 2: convuwl */
    var38.i = (orc_uint16) var37.i;
    /* 3: shll */
    var39.i = ((orc_uint32) var38.i) << ex->params[24];
    /* 5: xorl */
    var40.i = var39.i ^ var35.i;
    /* 6: convld */
    var36.f = var40.i;
    /* 7: storeq */
    ptr0[i] = var36;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 34, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 56, 95, 100,
        111, 117, 98, 108, 101, 11, 8, 8, 12, 1, 1, 14, 4, 0, 0, 0,
        128, 16, 4, 20, 2, 20, 4, 150, 32, 4, 154, 33, 32, 124, 33, 33,
        24, 132, 33, 33, 16, 223, 0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u8_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u8_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u8_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 1, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 1: convubw */
    var36.i = (orc_uint8) var34;
    /* 2: convuwl */
    var37.i = (orc_uint16) var36.i;
    /* 3: shll */
    var38.i = ((orc_uint32) var37.i) << p1;
    /* 4: convld */
    var35.f = var38.i;
    /* 5: storeq */
    ptr0[i] = var35;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 1: convubw */
    var36.i = (orc_uint8) var34;
    /* 2: convuwl */
    var37.i = (orc_uint16) var36.i;
    /* 3: shll */
    var38.i = ((orc_uint32) var37.i) << ex->params[24];
    /* 4: convld */
    var35.f = var38.i;
    /* 5: storeq */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 34, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 56, 95, 100,
        111, 117, 98, 108, 101, 11, 8, 8, 12, 1, 1, 16, 4, 20, 2, 20,
        4, 150, 32, 4, 154, 33, 32, 124, 33, 33, 24, 223, 0, 33, 2, 0,

      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s8_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s8_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s8_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 1, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


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

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

  /* 3: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr4[i];
    /* 1: convuwl */
    var36.i = (orc_uint16) var33.i;
    /* 2: shll */
    var37.i = ((orc_uint32) var36.i) << p1;
    /* 4: xorl */
    var38.i = var37.i ^ var34.i;
    /* 5: convld */
    var35.f = var38.i;
    /* 6: storeq */
    ptr0[i] = var35;
  }

}

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

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

  /* 3: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr4[i];
    /* 1: convuwl */
    var36.i = (orc_uint16) var33.i;
    /* 2: shll */
    var37.i = ((orc_uint32) var36.i) << ex->params[24];
    /* 4: xorl */
    var38.i = var37.i ^ var34.i;
    /* 5: convld */
    var35.f = var38.i;
    /* 6: storeq */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 35, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 49, 54, 95,
        100, 111, 117, 98, 108, 101, 11, 8, 8, 12, 2, 2, 14, 4, 0, 0,
        0, 128, 16, 4, 20, 4, 154, 32, 4, 124, 32, 32, 24, 132, 32, 32,
        16, 223, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u16_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u16_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u16_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr4[i];
    /* 1: convuwl */
    var35.i = (orc_uint16) var33.i;
    /* 2: shll */
    var36.i = ((orc_uint32) var35.i) << p1;
    /* 3: convld */
    var34.f = var36.i;
    /* 4: storeq */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var33 = ptr4[i];
    /* 1: convuwl */
    var35.i = (orc_uint16) var33.i;
    /* 2: shll */
    var36.i = ((orc_uint32) var35.i) << ex->params[24];
    /* 3: convld */
    var34.f = var36.i;
    /* 4: storeq */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 35, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 49, 54, 95,
        100, 111, 117, 98, 108, 101, 11, 8, 8, 12, 2, 2, 16, 4, 20, 4,
        154, 32, 4, 124, 32, 32, 24, 223, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s16_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s16_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s16_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 4: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 1: swapw */
    var37.i = ORC_SWAP_W (var34.i);
    /* 2: convuwl */
    var38.i = (orc_uint16) var37.i;
    /* 3: shll */
    var39.i = ((orc_uint32) var38.i) << p1;
    /* 5: xorl */
    var40.i = var39.i ^ var35.i;
    /* 6: convld */
    var36.f = var40.i;
    /* 7: storeq */
    ptr0[i] = var36;
  }

}

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

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

  /* 4: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 1: swapw */
    var37.i = ORC_SWAP_W (var34.i);
    /* 2: convuwl */
    var38.i = (orc_uint16) var37.i;
    /* 3: shll */
    var39.i = ((orc_uint32) var38.i) << ex->params[24];
    /* 5: xorl */
    var40.i = var39.i ^ var35.i;
    /* 6: convld */
    var36.f = var40.i;
    /* 7: storeq */
    ptr0[i] = var36;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 40, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 49, 54, 95,
        100, 111, 117, 98, 108, 101, 95, 115, 119, 97, 112, 11, 8, 8, 12, 2,
        2, 14, 4, 0, 0, 0, 128, 16, 4, 20, 2, 20, 4, 183, 32, 4,
        154, 33, 32, 124, 33, 33, 24, 132, 33, 33, 16, 223, 0, 33, 2, 0,

      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u16_double_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u16_double_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u16_double_swap);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 1: swapw */
    var36.i = ORC_SWAP_W (var34.i);
    /* 2: convuwl */
    var37.i = (orc_uint16) var36.i;
    /* 3: shll */
    var38.i = ((orc_uint32) var37.i) << p1;
    /* 4: convld */
    var35.f = var38.i;
    /* 5: storeq */
    ptr0[i] = var35;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 1: swapw */
    var36.i = ORC_SWAP_W (var34.i);
    /* 2: convuwl */
    var37.i = (orc_uint16) var36.i;
    /* 3: shll */
    var38.i = ((orc_uint32) var37.i) << ex->params[24];
    /* 4: convld */
    var35.f = var38.i;
    /* 5: storeq */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 40, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 49, 54, 95,
        100, 111, 117, 98, 108, 101, 95, 115, 119, 97, 112, 11, 8, 8, 12, 2,
        2, 16, 4, 20, 2, 20, 4, 183, 32, 4, 154, 33, 32, 124, 33, 33,
        24, 223, 0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s16_double_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s16_double_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s16_double_swap);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 2, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "swapw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convuwl", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shll */
    var36.i = ((orc_uint32) var33.i) << p1;
    /* 3: xorl */
    var37.i = var36.i ^ var34.i;
    /* 4: convld */
    var35.f = var37.i;
    /* 5: storeq */
    ptr0[i] = var35;
  }

}

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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shll */
    var36.i = ((orc_uint32) var33.i) << ex->params[24];
    /* 3: xorl */
    var37.i = var36.i ^ var34.i;
    /* 4: convld */
    var35.f = var37.i;
    /* 5: storeq */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 35, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 51, 50, 95,
        100, 111, 117, 98, 108, 101, 11, 8, 8, 12, 4, 4, 14, 4, 0, 0,
        0, 128, 16, 4, 20, 4, 124, 32, 4, 24, 132, 32, 32, 16, 223, 0,
        32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u32_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u32_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u32_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shll */
    var35.i = ((orc_uint32) var33.i) << p1;
    /* 2: convld */
    var34.f = var35.i;
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shll */
    var35.i = ((orc_uint32) var33.i) << ex->params[24];
    /* 2: convld */
    var34.f = var35.i;
    /* 3: storeq */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 35, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 51, 50, 95,
        100, 111, 117, 98, 108, 101, 11, 8, 8, 12, 4, 4, 16, 4, 20, 4,
        124, 32, 4, 24, 223, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s32_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s32_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s32_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 3: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var36.i = ORC_SWAP_L (var33.i);
    /* 2: shll */
    var37.i = ((orc_uint32) var36.i) << p1;
    /* 4: xorl */
    var38.i = var37.i ^ var34.i;
    /* 5: convld */
    var35.f = var38.i;
    /* 6: storeq */
    ptr0[i] = var35;
  }

}

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

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

  /* 3: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var36.i = ORC_SWAP_L (var33.i);
    /* 2: shll */
    var37.i = ((orc_uint32) var36.i) << ex->params[24];
    /* 4: xorl */
    var38.i = var37.i ^ var34.i;
    /* 5: convld */
    var35.f = var38.i;
    /* 6: storeq */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 40, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 117, 51, 50, 95,
        100, 111, 117, 98, 108, 101, 95, 115, 119, 97, 112, 11, 8, 8, 12, 4,
        4, 14, 4, 0, 0, 0, 128, 16, 4, 20, 4, 184, 32, 4, 124, 32,
        32, 24, 132, 32, 32, 16, 223, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u32_double_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_u32_double_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_u32_double_swap);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var35.i = ORC_SWAP_L (var33.i);
    /* 2: shll */
    var36.i = ((orc_uint32) var35.i) << p1;
    /* 3: convld */
    var34.f = var36.i;
    /* 4: storeq */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: swapl */
    var35.i = ORC_SWAP_L (var33.i);
    /* 2: shll */
    var36.i = ((orc_uint32) var35.i) << ex->params[24];
    /* 3: convld */
    var34.f = var36.i;
    /* 4: storeq */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 40, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 117, 110, 112, 97, 99, 107, 95, 115, 51, 50, 95,
        100, 111, 117, 98, 108, 101, 95, 115, 119, 97, 112, 11, 8, 8, 12, 4,
        4, 16, 4, 20, 4, 184, 32, 4, 124, 32, 32, 24, 223, 0, 32, 2,
        0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s32_double_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_unpack_s32_double_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_unpack_s32_double_swap);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "swapl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shll", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convld", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


/* audio_convert_orc_pack_u8 */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_u8 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_int8 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var34;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var35;
#else
  orc_union32 var35;
#endif
  orc_int8 var36;
  orc_union32 var37;
  orc_union32 var38;
  orc_union16 var39;

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

  /* 1: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 2: xorl */
    var37.i = var34.i ^ var35.i;
    /* 3: shrul */
    var38.i = ((orc_uint32) var37.i) >> p1;
    /* 4: convlw */
    var39.i = var38.i;
    /* 5: convwb */
    var36 = var39.i;
    /* 6: storeb */
    ptr0[i] = var36;
  }

}

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

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

  /* 1: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 2: xorl */
    var37.i = var34.i ^ var35.i;
    /* 3: shrul */
    var38.i = ((orc_uint32) var37.i) >> ex->params[24];
    /* 4: convlw */
    var39.i = var38.i;
    /* 5: convwb */
    var36 = var39.i;
    /* 6: storeb */
    ptr0[i] = var36;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 25, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 117, 56, 11, 1, 1, 12,
        4, 4, 14, 4, 0, 0, 0, 128, 16, 4, 20, 4, 20, 2, 132, 32,
        4, 16, 126, 32, 32, 24, 163, 33, 32, 157, 0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_u8);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_u8");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_u8);
      orc_program_add_destination (p, 1, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_pack_s8 */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_s8 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_int8 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var34;
  orc_int8 var35;
  orc_union32 var36;
  orc_union16 var37;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 1: shrsl */
    var36.i = var34.i >> p1;
    /* 2: convlw */
    var37.i = var36.i;
    /* 3: convwb */
    var35 = var37.i;
    /* 4: storeb */
    ptr0[i] = var35;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 1: shrsl */
    var36.i = var34.i >> ex->params[24];
    /* 2: convlw */
    var37.i = var36.i;
    /* 3: convwb */
    var35 = var37.i;
    /* 4: storeb */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 25, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 56, 11, 1, 1, 12,
        4, 4, 16, 4, 20, 4, 20, 2, 125, 32, 4, 24, 163, 33, 32, 157,
        0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_s8);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s8");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_s8);
      orc_program_add_destination (p, 1, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_pack_u16 */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_u16 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union16 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var33;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var34;
#else
  orc_union32 var34;
#endif
  orc_union16 var35;
  orc_union32 var36;
  orc_union32 var37;

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

  /* 1: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 2: xorl */
    var36.i = var33.i ^ var34.i;
    /* 3: shrul */
    var37.i = ((orc_uint32) var36.i) >> p1;
    /* 4: convlw */
    var35.i = var37.i;
    /* 5: storew */
    ptr0[i] = var35;
  }

}

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

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

  /* 1: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 2: xorl */
    var36.i = var33.i ^ var34.i;
    /* 3: shrul */
    var37.i = ((orc_uint32) var36.i) >> ex->params[24];
    /* 4: convlw */
    var35.i = var37.i;
    /* 5: storew */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 26, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 117, 49, 54, 11, 2, 2,
        12, 4, 4, 14, 4, 0, 0, 0, 128, 16, 4, 20, 4, 132, 32, 4,
        16, 126, 32, 32, 24, 163, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_u16);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_u16");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_u16);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


/* audio_convert_orc_pack_s16 */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_s16 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union16 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var33;
  orc_union16 var34;
  orc_union32 var35;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shrsl */
    var35.i = var33.i >> p1;
    /* 2: convlw */
    var34.i = var35.i;
    /* 3: storew */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shrsl */
    var35.i = var33.i >> ex->params[24];
    /* 2: convlw */
    var34.i = var35.i;
    /* 3: storew */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 26, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 49, 54, 11, 2, 2,
        12, 4, 4, 16, 4, 20, 4, 125, 32, 4, 24, 163, 0, 32, 2, 0,

      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_s16);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s16");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_s16);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

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

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

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

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


/* audio_convert_orc_pack_u16_swap */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_u16_swap (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union16 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var34;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var35;
#else
  orc_union32 var35;
#endif
  orc_union16 var36;
  orc_union32 var37;
  orc_union32 var38;
  orc_union16 var39;

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

  /* 1: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 2: xorl */
    var37.i = var34.i ^ var35.i;
    /* 3: shrul */
    var38.i = ((orc_uint32) var37.i) >> p1;
    /* 4: convlw */
    var39.i = var38.i;
    /* 5: swapw */
    var36.i = ORC_SWAP_W (var39.i);
    /* 6: storew */
    ptr0[i] = var36;
  }

}

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

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

  /* 1: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 2: xorl */
    var37.i = var34.i ^ var35.i;
    /* 3: shrul */
    var38.i = ((orc_uint32) var37.i) >> ex->params[24];
    /* 4: convlw */
    var39.i = var38.i;
    /* 5: swapw */
    var36.i = ORC_SWAP_W (var39.i);
    /* 6: storew */
    ptr0[i] = var36;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 31, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 117, 49, 54, 95, 115, 119,
        97, 112, 11, 2, 2, 12, 4, 4, 14, 4, 0, 0, 0, 128, 16, 4,
        20, 4, 20, 2, 132, 32, 4, 16, 126, 32, 32, 24, 163, 33, 32, 183,
        0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_u16_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_u16_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_u16_swap);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapw", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_pack_s16_swap */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_s16_swap (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union16 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var34;
  orc_union16 var35;
  orc_union32 var36;
  orc_union16 var37;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 1: shrsl */
    var36.i = var34.i >> p1;
    /* 2: convlw */
    var37.i = var36.i;
    /* 3: swapw */
    var35.i = ORC_SWAP_W (var37.i);
    /* 4: storew */
    ptr0[i] = var35;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 1: shrsl */
    var36.i = var34.i >> ex->params[24];
    /* 2: convlw */
    var37.i = var36.i;
    /* 3: swapw */
    var35.i = ORC_SWAP_W (var37.i);
    /* 4: storew */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 31, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 49, 54, 95, 115, 119,
        97, 112, 11, 2, 2, 12, 4, 4, 16, 4, 20, 4, 20, 2, 125, 32,
        4, 24, 163, 33, 32, 183, 0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s16_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s16_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s16_swap);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapw", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


/* audio_convert_orc_pack_u32 */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_u32 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var33;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var34;
#else
  orc_union32 var34;
#endif
  orc_union32 var35;
  orc_union32 var36;

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

  /* 1: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 2: xorl */
    var36.i = var33.i ^ var34.i;
    /* 3: shrul */
    var35.i = ((orc_uint32) var36.i) >> p1;
    /* 4: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 1: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 2: xorl */
    var36.i = var33.i ^ var34.i;
    /* 3: shrul */
    var35.i = ((orc_uint32) var36.i) >> ex->params[24];
    /* 4: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 26, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 117, 51, 50, 11, 4, 4,
        12, 4, 4, 14, 4, 0, 0, 0, 128, 16, 4, 20, 4, 132, 32, 4,
        16, 126, 0, 32, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_u32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_u32");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_u32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

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

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

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


/* audio_convert_orc_pack_s32 */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_s32 (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, 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: shrsl */
    var33.i = var32.i >> p1;
    /* 2: storel */
    ptr0[i] = var33;
  }

}

#else
static void
_backup_audio_convert_orc_pack_s32 (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: shrsl */
    var33.i = var32.i >> ex->params[24];
    /* 2: storel */
    ptr0[i] = var33;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 26, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 51, 50, 11, 4, 4,
        12, 4, 4, 16, 4, 125, 0, 4, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_s32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s32");
      orc_program_set_backup_function (p, _backup_audio_convert_orc_pack_s32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");

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

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

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

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


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

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

  /* 1: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 2: xorl */
    var36.i = var33.i ^ var34.i;
    /* 3: shrul */
    var37.i = ((orc_uint32) var36.i) >> p1;
    /* 4: swapl */
    var35.i = ORC_SWAP_L (var37.i);
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 1: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 2: xorl */
    var36.i = var33.i ^ var34.i;
    /* 3: shrul */
    var37.i = ((orc_uint32) var36.i) >> ex->params[24];
    /* 4: swapl */
    var35.i = ORC_SWAP_L (var37.i);
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 31, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 117, 51, 50, 95, 115, 119,
        97, 112, 11, 4, 4, 12, 4, 4, 14, 4, 0, 0, 0, 128, 16, 4,
        20, 4, 132, 32, 4, 16, 126, 32, 32, 24, 184, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_u32_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_u32_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_u32_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


/* audio_convert_orc_pack_s32_swap */
#ifdef DISABLE_ORC
void
audio_convert_orc_pack_s32_swap (guint8 * ORC_RESTRICT d1,
    const gint32 * ORC_RESTRICT s1, int p1, int n)
{
  int i;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union32 var33;
  orc_union32 var34;
  orc_union32 var35;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shrsl */
    var35.i = var33.i >> p1;
    /* 2: swapl */
    var34.i = ORC_SWAP_L (var35.i);
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: shrsl */
    var35.i = var33.i >> ex->params[24];
    /* 2: swapl */
    var34.i = ORC_SWAP_L (var35.i);
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 31, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 51, 50, 95, 115, 119,
        97, 112, 11, 4, 4, 12, 4, 4, 16, 4, 20, 4, 125, 32, 4, 24,
        184, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s32_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 2: loadpl */
  var34.i = (int) 0x4f000000;   /* 1325400064 or 6.54835e-315f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: convlf */
    var35.f = var33.i;
    /* 3: divf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var35.i);
      _src2.i = ORC_DENORMAL (var34.i);
      _dest1.f = _src1.f / _src2.f;
      var36.i = ORC_DENORMAL (_dest1.i);
    }
    /* 4: storel */
    ptr0[i] = var36;
  }

}

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

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

  /* 2: loadpl */
  var34.i = (int) 0x4f000000;   /* 1325400064 or 6.54835e-315f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: convlf */
    var35.f = var33.i;
    /* 3: divf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var35.i);
      _src2.i = ORC_DENORMAL (var34.i);
      _dest1.f = _src1.f / _src2.f;
      var36.i = ORC_DENORMAL (_dest1.i);
    }
    /* 4: storel */
    ptr0[i] = var36;
  }

}

void
audio_convert_orc_pack_s32_float (gfloat * ORC_RESTRICT d1,
    const gint32 * 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, 32, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 51, 50, 95, 102, 108,
        111, 97, 116, 11, 4, 4, 12, 4, 4, 14, 4, 0, 0, 0, 79, 20,
        4, 211, 32, 4, 203, 32, 32, 16, 128, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_float);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s32_float");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_float);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x4f000000, "c1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convlf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "divf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 2: loadpl */
  var34.i = (int) 0x4f000000;   /* 1325400064 or 6.54835e-315f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: convlf */
    var36.f = var33.i;
    /* 3: divf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var36.i);
      _src2.i = ORC_DENORMAL (var34.i);
      _dest1.f = _src1.f / _src2.f;
      var37.i = ORC_DENORMAL (_dest1.i);
    }
    /* 4: swapl */
    var35.i = ORC_SWAP_L (var37.i);
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 2: loadpl */
  var34.i = (int) 0x4f000000;   /* 1325400064 or 6.54835e-315f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var33 = ptr4[i];
    /* 1: convlf */
    var36.f = var33.i;
    /* 3: divf */
    {
      orc_union32 _src1;
      orc_union32 _src2;
      orc_union32 _dest1;
      _src1.i = ORC_DENORMAL (var36.i);
      _src2.i = ORC_DENORMAL (var34.i);
      _dest1.f = _src1.f / _src2.f;
      var37.i = ORC_DENORMAL (_dest1.i);
    }
    /* 4: swapl */
    var35.i = ORC_SWAP_L (var37.i);
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 37, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 51, 50, 95, 102, 108,
        111, 97, 116, 95, 115, 119, 97, 112, 11, 4, 4, 12, 4, 4, 14, 4,
        0, 0, 0, 79, 20, 4, 211, 32, 4, 203, 32, 32, 16, 184, 0, 32,
        2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_float_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s32_float_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_float_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x4f000000, "c1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convlf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "divf", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 2: loadpq */
  var34.i = ORC_UINT64_C (0x41dfffffffc00000);  /* 2.14748e+09f */

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

}

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

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

  /* 2: loadpq */
  var34.i = ORC_UINT64_C (0x41dfffffffc00000);  /* 2.14748e+09f */

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

}

void
audio_convert_orc_pack_s32_double (gdouble * ORC_RESTRICT d1,
    const gint32 * 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, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 51, 50, 95, 100, 111,
        117, 98, 108, 101, 11, 8, 8, 12, 4, 4, 15, 8, 0, 0, 192, 255,
        255, 255, 223, 65, 20, 8, 223, 32, 4, 215, 32, 32, 16, 135, 0, 32,
        2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_double);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s32_double");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_double);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant_int64 (p, 8, 0x41dfffffffc00000ULL, "c1");
      orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "convld", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "divd", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "storeq", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 2: loadpq */
  var34.i = ORC_UINT64_C (0x41dfffffffc00000);  /* 2.14748e+09f */

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

}

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

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

  /* 2: loadpq */
  var34.i = ORC_UINT64_C (0x41dfffffffc00000);  /* 2.14748e+09f */

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

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 38, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 115, 51, 50, 95, 100, 111,
        117, 98, 108, 101, 95, 115, 119, 97, 112, 11, 8, 8, 12, 4, 4, 15,
        8, 0, 0, 192, 255, 255, 255, 223, 65, 20, 8, 223, 32, 4, 215, 32,
        32, 16, 186, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_double_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_s32_double_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_s32_double_swap);
      orc_program_add_destination (p, 8, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant_int64 (p, 8, 0x41dfffffffc00000ULL, "c1");
      orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "convld", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "divd", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapq", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var32 = ptr4[i];
    /* 1: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
      _dest.f = _src1.f;
      var33.i = ORC_DENORMAL (_dest.i);
    }
    /* 2: storel */
    ptr0[i] = var33;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var32 = ptr4[i];
    /* 1: convdf */
    {
      orc_union64 _src1;
      orc_union32 _dest;
      _src1.i = ORC_DENORMAL_DOUBLE (var32.i);
      _dest.f = _src1.f;
      var33.i = ORC_DENORMAL (_dest.i);
    }
    /* 2: storel */
    ptr0[i] = var33;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 35, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 102, 108, 111, 97, 116, 11, 4, 4, 12, 8, 8, 225, 0, 4, 2,
        0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_float);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_float");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_float);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");

      orc_program_append_2 (p, "convdf", 0, 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


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

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


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

}

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

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


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

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 40, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 102, 108, 111, 97, 116, 95, 115, 119, 97, 112, 11, 4, 4, 12, 8,
        8, 20, 4, 225, 32, 4, 184, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_float_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_float_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_float_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_temporary (p, 4, "t1");

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

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

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

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


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

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

  /* 2: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var34.f;
      if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var37.i = tmp;
    }
    /* 3: xorl */
    var38.i = var37.i ^ var35.i;
    /* 4: shrul */
    var39.i = ((orc_uint32) var38.i) >> p1;
    /* 5: convlw */
    var40.i = var39.i;
    /* 6: convwb */
    var36 = var40.i;
    /* 7: storeb */
    ptr0[i] = var36;
  }

}

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

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

  /* 2: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var34.f;
      if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var37.i = tmp;
    }
    /* 3: xorl */
    var38.i = var37.i ^ var35.i;
    /* 4: shrul */
    var39.i = ((orc_uint32) var38.i) >> ex->params[24];
    /* 5: convlw */
    var40.i = var39.i;
    /* 6: convwb */
    var36 = var40.i;
    /* 7: storeb */
    ptr0[i] = var36;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 32, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 117, 56, 11, 1, 1, 12, 8, 8, 14, 4, 0, 0, 0, 128, 16,
        4, 20, 4, 20, 2, 222, 32, 4, 132, 32, 32, 16, 126, 32, 32, 24,
        163, 33, 32, 157, 0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u8);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_u8");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u8);
      orc_program_add_destination (p, 1, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var34.f;
      if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 2: shrsl */
    var37.i = var36.i >> p1;
    /* 3: convlw */
    var38.i = var37.i;
    /* 4: convwb */
    var35 = var38.i;
    /* 5: storeb */
    ptr0[i] = var35;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var34.f;
      if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 2: shrsl */
    var37.i = var36.i >> ex->params[24];
    /* 3: convlw */
    var38.i = var37.i;
    /* 4: convwb */
    var35 = var38.i;
    /* 5: storeb */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 32, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 115, 56, 11, 1, 1, 12, 8, 8, 16, 4, 20, 4, 20, 2, 222,
        32, 4, 125, 32, 32, 24, 163, 33, 32, 157, 0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s8);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_s8");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s8);
      orc_program_add_destination (p, 1, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 3: xorl */
    var37.i = var36.i ^ var34.i;
    /* 4: shrul */
    var38.i = ((orc_uint32) var37.i) >> p1;
    /* 5: convlw */
    var35.i = var38.i;
    /* 6: storew */
    ptr0[i] = var35;
  }

}

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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 3: xorl */
    var37.i = var36.i ^ var34.i;
    /* 4: shrul */
    var38.i = ((orc_uint32) var37.i) >> ex->params[24];
    /* 5: convlw */
    var35.i = var38.i;
    /* 6: storew */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 117, 49, 54, 11, 2, 2, 12, 8, 8, 14, 4, 0, 0, 0, 128,
        16, 4, 20, 4, 222, 32, 4, 132, 32, 32, 16, 126, 32, 32, 24, 163,
        0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u16);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_u16");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u16);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 2: shrsl */
    var36.i = var35.i >> p1;
    /* 3: convlw */
    var34.i = var36.i;
    /* 4: storew */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 2: shrsl */
    var36.i = var35.i >> ex->params[24];
    /* 3: convlw */
    var34.i = var36.i;
    /* 4: storew */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 115, 49, 54, 11, 2, 2, 12, 8, 8, 16, 4, 20, 4, 222, 32,
        4, 125, 32, 32, 24, 163, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s16);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_s16");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s16);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 2: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var34.f;
      if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var37.i = tmp;
    }
    /* 3: xorl */
    var38.i = var37.i ^ var35.i;
    /* 4: shrul */
    var39.i = ((orc_uint32) var38.i) >> p1;
    /* 5: convlw */
    var40.i = var39.i;
    /* 6: swapw */
    var36.i = ORC_SWAP_W (var40.i);
    /* 7: storew */
    ptr0[i] = var36;
  }

}

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

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

  /* 2: loadpl */
  var35.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var34.f;
      if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var37.i = tmp;
    }
    /* 3: xorl */
    var38.i = var37.i ^ var35.i;
    /* 4: shrul */
    var39.i = ((orc_uint32) var38.i) >> ex->params[24];
    /* 5: convlw */
    var40.i = var39.i;
    /* 6: swapw */
    var36.i = ORC_SWAP_W (var40.i);
    /* 7: storew */
    ptr0[i] = var36;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 38, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 117, 49, 54, 95, 115, 119, 97, 112, 11, 2, 2, 12, 8, 8, 14,
        4, 0, 0, 0, 128, 16, 4, 20, 4, 20, 2, 222, 32, 4, 132, 32,
        32, 16, 126, 32, 32, 24, 163, 33, 32, 183, 0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u16_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_u16_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u16_swap);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapw", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var34.f;
      if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 2: shrsl */
    var37.i = var36.i >> p1;
    /* 3: convlw */
    var38.i = var37.i;
    /* 4: swapw */
    var35.i = ORC_SWAP_W (var38.i);
    /* 5: storew */
    ptr0[i] = var35;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var34 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var34.f;
      if (tmp == 0x80000000 && !(var34.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 2: shrsl */
    var37.i = var36.i >> ex->params[24];
    /* 3: convlw */
    var38.i = var37.i;
    /* 4: swapw */
    var35.i = ORC_SWAP_W (var38.i);
    /* 5: storew */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 38, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 115, 49, 54, 95, 115, 119, 97, 112, 11, 2, 2, 12, 8, 8, 16,
        4, 20, 4, 20, 2, 222, 32, 4, 125, 32, 32, 24, 163, 33, 32, 183,
        0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s16_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_s16_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s16_swap);
      orc_program_add_destination (p, 2, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapw", 0, ORC_VAR_D1, ORC_VAR_T2, 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;
  ex->params[ORC_VAR_P1] = p1;

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


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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 3: xorl */
    var37.i = var36.i ^ var34.i;
    /* 4: shrul */
    var35.i = ((orc_uint32) var37.i) >> p1;
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 3: xorl */
    var37.i = var36.i ^ var34.i;
    /* 4: shrul */
    var35.i = ((orc_uint32) var37.i) >> ex->params[24];
    /* 5: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 117, 51, 50, 11, 4, 4, 12, 8, 8, 14, 4, 0, 0, 0, 128,
        16, 4, 20, 4, 222, 32, 4, 132, 32, 32, 16, 126, 0, 32, 24, 2,
        0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_u32");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

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

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

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 2: shrsl */
    var34.i = var35.i >> p1;
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 2: shrsl */
    var34.i = var35.i >> ex->params[24];
    /* 3: storel */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 33, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 115, 51, 50, 11, 4, 4, 12, 8, 8, 16, 4, 20, 4, 222, 32,
        4, 125, 0, 32, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_s32");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
#endif

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

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

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


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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 3: xorl */
    var37.i = var36.i ^ var34.i;
    /* 4: shrul */
    var38.i = ((orc_uint32) var37.i) >> p1;
    /* 5: swapl */
    var35.i = ORC_SWAP_L (var38.i);
    /* 6: storel */
    ptr0[i] = var35;
  }

}

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

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

  /* 2: loadpl */
  var34.i = (int) 0x80000000;   /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var36.i = tmp;
    }
    /* 3: xorl */
    var37.i = var36.i ^ var34.i;
    /* 4: shrul */
    var38.i = ((orc_uint32) var37.i) >> ex->params[24];
    /* 5: swapl */
    var35.i = ORC_SWAP_L (var38.i);
    /* 6: storel */
    ptr0[i] = var35;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 38, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 117, 51, 50, 95, 115, 119, 97, 112, 11, 4, 4, 12, 8, 8, 14,
        4, 0, 0, 0, 128, 16, 4, 20, 4, 222, 32, 4, 132, 32, 32, 16,
        126, 32, 32, 24, 184, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u32_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_u32_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_u32_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_constant (p, 4, 0x80000000, "c1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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


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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 2: shrsl */
    var36.i = var35.i >> p1;
    /* 3: swapl */
    var34.i = ORC_SWAP_L (var36.i);
    /* 4: storel */
    ptr0[i] = var34;
  }

}

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

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


  for (i = 0; i < n; i++) {
    /* 0: loadq */
    var33 = ptr4[i];
    /* 1: convdl */
    {
      int tmp;
      tmp = var33.f;
      if (tmp == 0x80000000 && !(var33.i & ORC_UINT64_C (0x8000000000000000)))
        tmp = 0x7fffffff;
      var35.i = tmp;
    }
    /* 2: shrsl */
    var36.i = var35.i >> ex->params[24];
    /* 3: swapl */
    var34.i = ORC_SWAP_L (var36.i);
    /* 4: storel */
    ptr0[i] = var34;
  }

}

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

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

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 38, 97, 117, 100, 105, 111, 95, 99, 111, 110, 118, 101, 114, 116,
        95, 111, 114, 99, 95, 112, 97, 99, 107, 95, 100, 111, 117, 98, 108, 101,
        95, 115, 51, 50, 95, 115, 119, 97, 112, 11, 4, 4, 12, 8, 8, 16,
        4, 20, 4, 222, 32, 4, 125, 32, 32, 24, 184, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s32_swap);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "audio_convert_orc_pack_double_s32_swap");
      orc_program_set_backup_function (p,
          _backup_audio_convert_orc_pack_double_s32_swap);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 8, "s1");
      orc_program_add_parameter (p, 4, "p1");
      orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "convdl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "swapl", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
#endif

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

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

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