
/* autogenerated from gstaudiomixerorc.orc */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.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

#include <orc/orc.h>
#include <orc-test/orctest.h>

/* 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 */


/* audiomixer_orc_add_s32 */
static void
_backup_audiomixer_orc_add_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;
  orc_union32 var34;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr0[i];
    /* 1: loadl */
    var33 = ptr4[i];
    /* 2: addssl */
    var34.i = ORC_CLAMP_SL((orc_int64)var32.i + (orc_int64)var33.i);
    /* 3: storel */
    ptr0[i] = var34;
  }

}

/* audiomixer_orc_add_s16 */
static void
_backup_audiomixer_orc_add_s16 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union16 * ORC_RESTRICT ptr0;
  const orc_union16 * ORC_RESTRICT ptr4;
  orc_union16 var32;
  orc_union16 var33;
  orc_union16 var34;

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var32 = ptr0[i];
    /* 1: loadw */
    var33 = ptr4[i];
    /* 2: addssw */
    var34.i = ORC_CLAMP_SW(var32.i + var33.i);
    /* 3: storew */
    ptr0[i] = var34;
  }

}

/* audiomixer_orc_add_s8 */
static void
_backup_audiomixer_orc_add_s8 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_int8 * ORC_RESTRICT ptr0;
  const orc_int8 * ORC_RESTRICT ptr4;
  orc_int8 var32;
  orc_int8 var33;
  orc_int8 var34;

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


  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var32 = ptr0[i];
    /* 1: loadb */
    var33 = ptr4[i];
    /* 2: addssb */
    var34 = ORC_CLAMP_SB(var32 + var33);
    /* 3: storeb */
    ptr0[i] = var34;
  }

}

/* audiomixer_orc_add_u32 */
static void
_backup_audiomixer_orc_add_u32 (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;
  orc_union32 var34;

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


  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var32 = ptr0[i];
    /* 1: loadl */
    var33 = ptr4[i];
    /* 2: addusl */
    var34.i = ORC_CLAMP_UL((orc_int64)(orc_uint32)var32.i + (orc_int64)(orc_uint32)var33.i);
    /* 3: storel */
    ptr0[i] = var34;
  }

}

/* audiomixer_orc_add_u16 */
static void
_backup_audiomixer_orc_add_u16 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union16 * ORC_RESTRICT ptr0;
  const orc_union16 * ORC_RESTRICT ptr4;
  orc_union16 var32;
  orc_union16 var33;
  orc_union16 var34;

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


  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var32 = ptr0[i];
    /* 1: loadw */
    var33 = ptr4[i];
    /* 2: addusw */
    var34.i = ORC_CLAMP_UW((orc_uint16)var32.i + (orc_uint16)var33.i);
    /* 3: storew */
    ptr0[i] = var34;
  }

}

/* audiomixer_orc_add_u8 */
static void
_backup_audiomixer_orc_add_u8 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_int8 * ORC_RESTRICT ptr0;
  const orc_int8 * ORC_RESTRICT ptr4;
  orc_int8 var32;
  orc_int8 var33;
  orc_int8 var34;

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


  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var32 = ptr0[i];
    /* 1: loadb */
    var33 = ptr4[i];
    /* 2: addusb */
    var34 = ORC_CLAMP_UB((orc_uint8)var32 + (orc_uint8)var33);
    /* 3: storeb */
    ptr0[i] = var34;
  }

}

/* audiomixer_orc_add_f32 */
static void
_backup_audiomixer_orc_add_f32 (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;
  orc_union32 var34;

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


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

}

/* audiomixer_orc_add_f64 */
static void
_backup_audiomixer_orc_add_f64 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union64 * ORC_RESTRICT ptr0;
  const orc_union64 * ORC_RESTRICT ptr4;
  orc_union64 var32;
  orc_union64 var33;
  orc_union64 var34;

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


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

}

/* audiomixer_orc_volume_u8 */
static void
_backup_audiomixer_orc_volume_u8 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_int8 * ORC_RESTRICT ptr0;
  orc_int8 var34;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__) 
  volatile orc_int8 var35;
#else
  orc_int8 var35;
#endif
  orc_int8 var36;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__) 
  volatile orc_int8 var37;
#else
  orc_int8 var37;
#endif
  orc_int8 var38;
  orc_int8 var39;
  orc_union16 var40;
  orc_union16 var41;
  orc_int8 var42;

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

    /* 1: loadpb */
    var35 = (int)0x00000080; /* 128 or 6.32404e-322f */
    /* 3: loadpb */
    var36 = ex->params[24];
    /* 7: loadpb */
    var37 = (int)0x00000080; /* 128 or 6.32404e-322f */

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr0[i];
    /* 2: xorb */
    var39 = var34 ^ var35;
    /* 4: mulsbw */
    var40.i = var39 * var36;
    /* 5: shrsw */
    var41.i = var40.i >> 3;
    /* 6: convssswb */
    var42 = ORC_CLAMP_SB(var41.i);
    /* 8: xorb */
    var38 = var42 ^ var37;
    /* 9: storeb */
    ptr0[i] = var38;
  }

}

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

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

    /* 1: loadpb */
    var35 = (int)0x00000080; /* 128 or 6.32404e-322f */
    /* 3: loadpb */
    var36 = ex->params[24];
    /* 7: loadpb */
    var37 = (int)0x00000080; /* 128 or 6.32404e-322f */

  for (i = 0; i < n; i++) {
    /* 0: loadb */
    var34 = ptr4[i];
    /* 2: xorb */
    var40 = var34 ^ var35;
    /* 4: mulsbw */
    var41.i = var40 * var36;
    /* 5: shrsw */
    var42.i = var41.i >> 3;
    /* 6: convssswb */
    var43 = ORC_CLAMP_SB(var42.i);
    /* 8: xorb */
    var44 = var43 ^ var37;
    /* 9: loadb */
    var38 = ptr0[i];
    /* 10: addusb */
    var39 = ORC_CLAMP_UB((orc_uint8)var38 + (orc_uint8)var44);
    /* 11: storeb */
    ptr0[i] = var39;
  }

}

/* audiomixer_orc_add_volume_s8 */
static void
_backup_audiomixer_orc_add_volume_s8 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_int8 * ORC_RESTRICT ptr0;
  const orc_int8 * ORC_RESTRICT ptr4;
  orc_int8 var34;
  orc_int8 var35;
  orc_int8 var36;
  orc_int8 var37;
  orc_union16 var38;
  orc_union16 var39;
  orc_int8 var40;

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

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

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

}

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

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

    /* 1: loadpw */
    var35.i = (int)0x00008000; /* 32768 or 1.61895e-319f */
    /* 3: loadpw */
    var36.i = ex->params[24];
    /* 7: loadpw */
    var37.i = (int)0x00008000; /* 32768 or 1.61895e-319f */

  for (i = 0; i < n; i++) {
    /* 0: loadw */
    var34 = ptr4[i];
    /* 2: xorw */
    var40.i = var34.i ^ var35.i;
    /* 4: mulswl */
    var41.i = var40.i * var36.i;
    /* 5: shrsl */
    var42.i = var41.i >> 11;
    /* 6: convssslw */
    var43.i = ORC_CLAMP_SW(var42.i);
    /* 8: xorw */
    var44.i = var43.i ^ var37.i;
    /* 9: loadw */
    var38 = ptr0[i];
    /* 10: addusw */
    var39.i = ORC_CLAMP_UW((orc_uint16)var38.i + (orc_uint16)var44.i);
    /* 11: storew */
    ptr0[i] = var39;
  }

}

/* audiomixer_orc_add_volume_s16 */
static void
_backup_audiomixer_orc_add_volume_s16 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union16 * ORC_RESTRICT ptr0;
  const orc_union16 * ORC_RESTRICT ptr4;
  orc_union16 var34;
  orc_union16 var35;
  orc_union16 var36;
  orc_union16 var37;
  orc_union32 var38;
  orc_union32 var39;
  orc_union16 var40;

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

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

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

}

/* audiomixer_orc_add_volume_u32 */
static void
_backup_audiomixer_orc_add_volume_u32 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union32 * 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_union32 var36;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__) 
  volatile orc_union32 var37;
#else
  orc_union32 var37;
#endif
  orc_union32 var38;
  orc_union32 var39;
  orc_union32 var40;
  orc_union64 var41;
  orc_union64 var42;
  orc_union32 var43;
  orc_union32 var44;

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

    /* 1: loadpl */
    var35.i = (int)0x80000000; /* -2147483648 or 1.061e-314f */
    /* 3: loadpl */
    var36.i = ex->params[24];
    /* 7: loadpl */
    var37.i = (int)0x80000000; /* -2147483648 or 1.061e-314f */

  for (i = 0; i < n; i++) {
    /* 0: loadl */
    var34 = ptr4[i];
    /* 2: xorl */
    var40.i = var34.i ^ var35.i;
    /* 4: mulslq */
    var41.i = ((orc_int64)var40.i) * ((orc_int64)var36.i);
    /* 5: shrsq */
    var42.i = var41.i >> 27;
    /* 6: convsssql */
    var43.i = ORC_CLAMP_SL(var42.i);
    /* 8: xorl */
    var44.i = var43.i ^ var37.i;
    /* 9: loadl */
    var38 = ptr0[i];
    /* 10: addusl */
    var39.i = ORC_CLAMP_UL((orc_int64)(orc_uint32)var38.i + (orc_int64)(orc_uint32)var44.i);
    /* 11: storel */
    ptr0[i] = var39;
  }

}

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

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

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

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

}

/* audiomixer_orc_add_volume_f32 */
static void
_backup_audiomixer_orc_add_volume_f32 (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;
  orc_union32 var36;
  orc_union32 var37;

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

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

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

}

/* audiomixer_orc_add_volume_f64 */
static void
_backup_audiomixer_orc_add_volume_f64 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int n = ex->n;
  orc_union64 * ORC_RESTRICT ptr0;
  const orc_union64 * ORC_RESTRICT ptr4;
  orc_union64 var33;
  orc_union64 var34;
  orc_union64 var35;
  orc_union64 var36;
  orc_union64 var37;

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

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

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

}


static int quiet = 0;
static int benchmark = 0;

static void help (const char *argv0)
{
  printf("Usage:\n");
  printf("  %s [OPTION]\n", argv0);
  printf("Help Options:\n");
  printf("  -h, --help          Show help options\n");
  printf("Application Options:\n");
  printf("  -b, --benchmark     Run benchmark and show results\n");
  printf("  -q, --quiet         Don't output anything except on failures\n");

  exit(0);
}

int
main (int argc, char *argv[])
{
  int error = FALSE;
  int i;

  orc_test_init ();

  for(i=1;i<argc;i++) {
    if (strcmp(argv[i], "--help") == 0 ||
      strcmp(argv[i], "-h") == 0) {
      help(argv[0]);
    } else if (strcmp(argv[i], "--quiet") == 0 ||
      strcmp(argv[i], "-q") == 0) {
      quiet = 1;
      benchmark = 0;
    } else if (strcmp(argv[i], "--benchmark") == 0 ||
      strcmp(argv[i], "-b") == 0) {
      benchmark = 1;
      quiet = 0;
    }
  }

  /* audiomixer_orc_add_s32 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_s32:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_s32");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_s32);
    orc_program_add_destination (p, 4, "d1");
    orc_program_add_source (p, 4, "s1");

      orc_program_append_2 (p, "addssl", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_s16 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_s16:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_s16");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_s16);
    orc_program_add_destination (p, 2, "d1");
    orc_program_add_source (p, 2, "s1");

      orc_program_append_2 (p, "addssw", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_s8 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_s8:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_s8");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_s8);
    orc_program_add_destination (p, 1, "d1");
    orc_program_add_source (p, 1, "s1");

      orc_program_append_2 (p, "addssb", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_u32 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_u32:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_u32");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_u32);
    orc_program_add_destination (p, 4, "d1");
    orc_program_add_source (p, 4, "s1");

      orc_program_append_2 (p, "addusl", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_u16 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_u16:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_u16");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_u16);
    orc_program_add_destination (p, 2, "d1");
    orc_program_add_source (p, 2, "s1");

      orc_program_append_2 (p, "addusw", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_u8 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_u8:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_u8");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_u8);
    orc_program_add_destination (p, 1, "d1");
    orc_program_add_source (p, 1, "s1");

      orc_program_append_2 (p, "addusb", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_f32 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_f32:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_f32");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_f32);
    orc_program_add_destination (p, 4, "d1");
    orc_program_add_source (p, 4, "s1");

      orc_program_append_2 (p, "addf", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_f64 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_f64:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_f64");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_f64);
    orc_program_add_destination (p, 8, "d1");
    orc_program_add_source (p, 8, "s1");

      orc_program_append_2 (p, "addd", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_volume_u8 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_volume_u8:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_volume_u8");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_volume_u8);
    orc_program_add_destination (p, 1, "d1");
      orc_program_add_constant (p, 1, 0x00000080, "c1");
      orc_program_add_constant (p, 4, 0x00000003, "c2");
    orc_program_add_parameter (p, 1, "p1");
    orc_program_add_temporary (p, 2, "t1");
    orc_program_add_temporary (p, 1, "t2");

      orc_program_append_2 (p, "xorb", 0, ORC_VAR_T2, ORC_VAR_D1, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulsbw", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2, ORC_VAR_D1);
      orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "xorb", 0, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_volume_u8 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_volume_u8:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_volume_u8");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_volume_u8);
    orc_program_add_destination (p, 1, "d1");
    orc_program_add_source (p, 1, "s1");
      orc_program_add_constant (p, 1, 0x00000080, "c1");
      orc_program_add_constant (p, 4, 0x00000003, "c2");
    orc_program_add_parameter (p, 1, "p1");
    orc_program_add_temporary (p, 2, "t1");
    orc_program_add_temporary (p, 1, "t2");

      orc_program_append_2 (p, "xorb", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulsbw", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2, ORC_VAR_D1);
      orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "xorb", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "addusb", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_volume_s8 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_volume_s8:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_volume_s8");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_volume_s8);
    orc_program_add_destination (p, 1, "d1");
    orc_program_add_source (p, 1, "s1");
      orc_program_add_constant (p, 4, 0x00000003, "c1");
    orc_program_add_parameter (p, 1, "p1");
    orc_program_add_temporary (p, 2, "t1");
    orc_program_add_temporary (p, 1, "t2");

      orc_program_append_2 (p, "mulsbw", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "shrsw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "convssswb", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "addssb", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_volume_u16 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_volume_u16:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_volume_u16");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_volume_u16);
    orc_program_add_destination (p, 2, "d1");
    orc_program_add_source (p, 2, "s1");
      orc_program_add_constant (p, 2, 0x00008000, "c1");
      orc_program_add_constant (p, 4, 0x0000000b, "c2");
    orc_program_add_parameter (p, 2, "p1");
    orc_program_add_temporary (p, 4, "t1");
    orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "xorw", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulswl", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2, ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "xorw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "addusw", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_volume_s16 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_volume_s16:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_volume_s16");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_volume_s16);
    orc_program_add_destination (p, 2, "d1");
    orc_program_add_source (p, 2, "s1");
      orc_program_add_constant (p, 4, 0x0000000b, "c1");
    orc_program_add_parameter (p, 2, "p1");
    orc_program_add_temporary (p, 4, "t1");
    orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "mulswl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "shrsl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "convssslw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "addssw", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_volume_u32 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_volume_u32:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_volume_u32");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_volume_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_constant (p, 4, 0x0000001b, "c2");
    orc_program_add_parameter (p, 4, "p1");
    orc_program_add_temporary (p, 8, "t1");
    orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "xorl", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "mulslq", 0, ORC_VAR_T1, ORC_VAR_T2, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "shrsq", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C2, ORC_VAR_D1);
      orc_program_append_2 (p, "convsssql", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, 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, "addusl", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_volume_s32 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_volume_s32:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_volume_s32");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_volume_s32);
    orc_program_add_destination (p, 4, "d1");
    orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x0000001b, "c1");
    orc_program_add_parameter (p, 4, "p1");
    orc_program_add_temporary (p, 8, "t1");
    orc_program_add_temporary (p, 4, "t2");

      orc_program_append_2 (p, "mulslq", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "shrsq", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1, ORC_VAR_D1);
      orc_program_append_2 (p, "convsssql", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "addssl", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T2, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_volume_f32 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_volume_f32:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_volume_f32");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_volume_f32);
    orc_program_add_destination (p, 4, "d1");
    orc_program_add_source (p, 4, "s1");
    orc_program_add_parameter_float (p, 4, "p1");
    orc_program_add_temporary (p, 4, "t1");

      orc_program_append_2 (p, "mulf", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "addf", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }

  /* audiomixer_orc_add_volume_f64 */
  {
    OrcProgram *p = NULL;
    int ret;

    if (!quiet)      printf ("audiomixer_orc_add_volume_f64:\n");
    p = orc_program_new ();
    orc_program_set_name (p, "audiomixer_orc_add_volume_f64");
    orc_program_set_backup_function (p, _backup_audiomixer_orc_add_volume_f64);
    orc_program_add_destination (p, 8, "d1");
    orc_program_add_source (p, 8, "s1");
    orc_program_add_parameter_double (p, 8, "p1");
    orc_program_add_temporary (p, 8, "t1");

      orc_program_append_2 (p, "muld", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_P1, ORC_VAR_D1);
      orc_program_append_2 (p, "addd", 0, ORC_VAR_D1, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1);

    if (benchmark) {
      printf ("    cycles (emulate) :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_EMULATE, NULL));
    }

    ret = orc_test_compare_output_backup (p);
    if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    backup function  :   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (backup)  :   %g\n",
          orc_test_performance_full (p, ORC_TEST_FLAGS_BACKUP, NULL));
    }

    ret = orc_test_compare_output (p);
    if (ret == ORC_TEST_INDETERMINATE && !quiet) {
      printf ("    compiled function:   COMPILE FAILED\n");
    } else if (!ret) {
      error = TRUE;
    } else if (!quiet) {
      printf ("    compiled function:   PASSED\n");
    }

    if (benchmark) {
      printf ("    cycles (compiled):   %g\n",
          orc_test_performance_full (p, 0, NULL));
    }

    orc_program_free (p);
  }


  if (error) {
    return 1;
  };
  return 0;
}
