
/* autogenerated from blendorc.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 video_mixer_orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n);
void video_mixer_orc_memcpy_u32 (guint32 * ORC_RESTRICT d1,
    const guint32 * ORC_RESTRICT s1, int n);
void video_mixer_orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
void video_mixer_orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
void video_mixer_orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
void video_mixer_orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
void video_mixer_orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);


/* 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)&0xff)<<8) | (((x)&0xff00)>>8))
#define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>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 */



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

  ptr0 = (orc_union32 *) d1;

  /* 0: loadpl */
  var32.i = p1;

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

}

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

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

  /* 0: loadpl */
  var32.i = ex->params[24];

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

}

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

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

      p = orc_program_new ();
      orc_program_set_name (p, "video_mixer_orc_splat_u32");
      orc_program_set_backup_function (p, _backup_video_mixer_orc_splat_u32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_parameter (p, 4, "p1");

      orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
          ORC_VAR_D1);

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

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

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


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

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


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

}

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

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


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

}

void
video_mixer_orc_memcpy_u32 (guint32 * ORC_RESTRICT d1,
    const guint32 * 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;

      p = orc_program_new ();
      orc_program_set_name (p, "video_mixer_orc_memcpy_u32");
      orc_program_set_backup_function (p, _backup_video_mixer_orc_memcpy_u32);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");

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

      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


/* video_mixer_orc_blend_u8 */
#ifdef DISABLE_ORC
void
video_mixer_orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  int i;
  int j;
  orc_int8 *ORC_RESTRICT ptr0;
  const orc_int8 *ORC_RESTRICT ptr4;
  orc_int8 var34;
  orc_int8 var35;
  orc_union16 var36;
  orc_int8 var37;
  orc_union16 var38;
  orc_union16 var39;
  orc_union16 var40;
  orc_union16 var41;
  orc_union16 var42;
  orc_union16 var43;
  orc_union16 var44;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
    ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);

    /* 5: loadpw */
    var36.i = p1;

    for (i = 0; i < n; i++) {
      /* 0: loadb */
      var34 = ptr0[i];
      /* 1: convubw */
      var38.i = (orc_uint8) var34;
      /* 2: loadb */
      var35 = ptr4[i];
      /* 3: convubw */
      var39.i = (orc_uint8) var35;
      /* 4: subw */
      var40.i = var39.i - var38.i;
      /* 6: mullw */
      var41.i = (var40.i * var36.i) & 0xffff;
      /* 7: shlw */
      var42.i = var38.i << 8;
      /* 8: addw */
      var43.i = var42.i + var41.i;
      /* 9: shruw */
      var44.i = ((orc_uint16) var43.i) >> 8;
      /* 10: convsuswb */
      var37 = ORC_CLAMP_UB (var44.i);
      /* 11: storeb */
      ptr0[i] = var37;
    }
  }

}

#else
static void
_backup_video_mixer_orc_blend_u8 (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int j;
  int n = ex->n;
  int m = ex->params[ORC_VAR_A1];
  orc_int8 *ORC_RESTRICT ptr0;
  const orc_int8 *ORC_RESTRICT ptr4;
  orc_int8 var34;
  orc_int8 var35;
  orc_union16 var36;
  orc_int8 var37;
  orc_union16 var38;
  orc_union16 var39;
  orc_union16 var40;
  orc_union16 var41;
  orc_union16 var42;
  orc_union16 var43;
  orc_union16 var44;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
    ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);

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

    for (i = 0; i < n; i++) {
      /* 0: loadb */
      var34 = ptr0[i];
      /* 1: convubw */
      var38.i = (orc_uint8) var34;
      /* 2: loadb */
      var35 = ptr4[i];
      /* 3: convubw */
      var39.i = (orc_uint8) var35;
      /* 4: subw */
      var40.i = var39.i - var38.i;
      /* 6: mullw */
      var41.i = (var40.i * var36.i) & 0xffff;
      /* 7: shlw */
      var42.i = var38.i << 8;
      /* 8: addw */
      var43.i = var42.i + var41.i;
      /* 9: shruw */
      var44.i = ((orc_uint16) var43.i) >> 8;
      /* 10: convsuswb */
      var37 = ORC_CLAMP_UB (var44.i);
      /* 11: storeb */
      ptr0[i] = var37;
    }
  }

}

void
video_mixer_orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  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;

      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "video_mixer_orc_blend_u8");
      orc_program_set_backup_function (p, _backup_video_mixer_orc_blend_u8);
      orc_program_add_destination (p, 1, "d1");
      orc_program_add_source (p, 1, "s1");
      orc_program_add_constant (p, 1, 0x00000008, "c1");
      orc_program_add_parameter (p, 2, "p1");
      orc_program_add_temporary (p, 2, "t1");
      orc_program_add_temporary (p, 2, "t2");

      orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shlw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shruw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T2,
          ORC_VAR_D1, ORC_VAR_D1);

      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;
  ORC_EXECUTOR_M (ex) = m;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_D1] = d1_stride;
  ex->arrays[ORC_VAR_S1] = (void *) s1;
  ex->params[ORC_VAR_S1] = s1_stride;
  ex->params[ORC_VAR_P1] = p1;

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


/* video_mixer_orc_blend_argb */
#ifdef DISABLE_ORC
void
video_mixer_orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  int i;
  int j;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union64 var39;
  orc_union32 var40;
  orc_union32 var41;
  orc_union16 var42;
  orc_int8 var43;
  orc_union32 var44;
  orc_union64 var45;
  orc_union64 var46;
  orc_union64 var47;
  orc_union64 var48;
  orc_union32 var49;
  orc_union64 var50;
  orc_union64 var51;
  orc_union64 var52;
  orc_union64 var53;
  orc_union64 var54;
  orc_union32 var55;
  orc_union32 var56;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
    ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);

    /* 5: loadpw */
    var39.x4[0] = p1;
    var39.x4[1] = p1;
    var39.x4[2] = p1;
    var39.x4[3] = p1;
    /* 16: loadpl */
    var40.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */

    for (i = 0; i < n; i++) {
      /* 0: loadl */
      var41 = ptr4[i];
      /* 1: convlw */
      var42.i = var41.i;
      /* 2: convwb */
      var43 = var42.i;
      /* 3: splatbl */
      var44.i =
          ((var43 & 0xff) << 24) | ((var43 & 0xff) << 16) | ((var43 & 0xff) <<
          8) | (var43 & 0xff);
      /* 4: convubw */
      var45.x4[0] = (orc_uint8) var44.x4[0];
      var45.x4[1] = (orc_uint8) var44.x4[1];
      var45.x4[2] = (orc_uint8) var44.x4[2];
      var45.x4[3] = (orc_uint8) var44.x4[3];
      /* 6: mullw */
      var46.x4[0] = (var45.x4[0] * var39.x4[0]) & 0xffff;
      var46.x4[1] = (var45.x4[1] * var39.x4[1]) & 0xffff;
      var46.x4[2] = (var45.x4[2] * var39.x4[2]) & 0xffff;
      var46.x4[3] = (var45.x4[3] * var39.x4[3]) & 0xffff;
      /* 7: shruw */
      var47.x4[0] = ((orc_uint16) var46.x4[0]) >> 8;
      var47.x4[1] = ((orc_uint16) var46.x4[1]) >> 8;
      var47.x4[2] = ((orc_uint16) var46.x4[2]) >> 8;
      var47.x4[3] = ((orc_uint16) var46.x4[3]) >> 8;
      /* 8: convubw */
      var48.x4[0] = (orc_uint8) var41.x4[0];
      var48.x4[1] = (orc_uint8) var41.x4[1];
      var48.x4[2] = (orc_uint8) var41.x4[2];
      var48.x4[3] = (orc_uint8) var41.x4[3];
      /* 9: loadl */
      var49 = ptr0[i];
      /* 10: convubw */
      var50.x4[0] = (orc_uint8) var49.x4[0];
      var50.x4[1] = (orc_uint8) var49.x4[1];
      var50.x4[2] = (orc_uint8) var49.x4[2];
      var50.x4[3] = (orc_uint8) var49.x4[3];
      /* 11: subw */
      var51.x4[0] = var48.x4[0] - var50.x4[0];
      var51.x4[1] = var48.x4[1] - var50.x4[1];
      var51.x4[2] = var48.x4[2] - var50.x4[2];
      var51.x4[3] = var48.x4[3] - var50.x4[3];
      /* 12: mullw */
      var52.x4[0] = (var51.x4[0] * var47.x4[0]) & 0xffff;
      var52.x4[1] = (var51.x4[1] * var47.x4[1]) & 0xffff;
      var52.x4[2] = (var51.x4[2] * var47.x4[2]) & 0xffff;
      var52.x4[3] = (var51.x4[3] * var47.x4[3]) & 0xffff;
      /* 13: div255w */
      var53.x4[0] =
          ((orc_uint16) (((orc_uint16) (var52.x4[0] + 128)) +
              (((orc_uint16) (var52.x4[0] + 128)) >> 8))) >> 8;
      var53.x4[1] =
          ((orc_uint16) (((orc_uint16) (var52.x4[1] + 128)) +
              (((orc_uint16) (var52.x4[1] + 128)) >> 8))) >> 8;
      var53.x4[2] =
          ((orc_uint16) (((orc_uint16) (var52.x4[2] + 128)) +
              (((orc_uint16) (var52.x4[2] + 128)) >> 8))) >> 8;
      var53.x4[3] =
          ((orc_uint16) (((orc_uint16) (var52.x4[3] + 128)) +
              (((orc_uint16) (var52.x4[3] + 128)) >> 8))) >> 8;
      /* 14: addw */
      var54.x4[0] = var50.x4[0] + var53.x4[0];
      var54.x4[1] = var50.x4[1] + var53.x4[1];
      var54.x4[2] = var50.x4[2] + var53.x4[2];
      var54.x4[3] = var50.x4[3] + var53.x4[3];
      /* 15: convwb */
      var55.x4[0] = var54.x4[0];
      var55.x4[1] = var54.x4[1];
      var55.x4[2] = var54.x4[2];
      var55.x4[3] = var54.x4[3];
      /* 17: orl */
      var56.i = var55.i | var40.i;
      /* 18: storel */
      ptr0[i] = var56;
    }
  }

}

#else
static void
_backup_video_mixer_orc_blend_argb (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int j;
  int n = ex->n;
  int m = ex->params[ORC_VAR_A1];
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union64 var39;
  orc_union32 var40;
  orc_union32 var41;
  orc_union16 var42;
  orc_int8 var43;
  orc_union32 var44;
  orc_union64 var45;
  orc_union64 var46;
  orc_union64 var47;
  orc_union64 var48;
  orc_union32 var49;
  orc_union64 var50;
  orc_union64 var51;
  orc_union64 var52;
  orc_union64 var53;
  orc_union64 var54;
  orc_union32 var55;
  orc_union32 var56;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
    ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);

    /* 5: loadpw */
    var39.x4[0] = ex->params[24];
    var39.x4[1] = ex->params[24];
    var39.x4[2] = ex->params[24];
    var39.x4[3] = ex->params[24];
    /* 16: loadpl */
    var40.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */

    for (i = 0; i < n; i++) {
      /* 0: loadl */
      var41 = ptr4[i];
      /* 1: convlw */
      var42.i = var41.i;
      /* 2: convwb */
      var43 = var42.i;
      /* 3: splatbl */
      var44.i =
          ((var43 & 0xff) << 24) | ((var43 & 0xff) << 16) | ((var43 & 0xff) <<
          8) | (var43 & 0xff);
      /* 4: convubw */
      var45.x4[0] = (orc_uint8) var44.x4[0];
      var45.x4[1] = (orc_uint8) var44.x4[1];
      var45.x4[2] = (orc_uint8) var44.x4[2];
      var45.x4[3] = (orc_uint8) var44.x4[3];
      /* 6: mullw */
      var46.x4[0] = (var45.x4[0] * var39.x4[0]) & 0xffff;
      var46.x4[1] = (var45.x4[1] * var39.x4[1]) & 0xffff;
      var46.x4[2] = (var45.x4[2] * var39.x4[2]) & 0xffff;
      var46.x4[3] = (var45.x4[3] * var39.x4[3]) & 0xffff;
      /* 7: shruw */
      var47.x4[0] = ((orc_uint16) var46.x4[0]) >> 8;
      var47.x4[1] = ((orc_uint16) var46.x4[1]) >> 8;
      var47.x4[2] = ((orc_uint16) var46.x4[2]) >> 8;
      var47.x4[3] = ((orc_uint16) var46.x4[3]) >> 8;
      /* 8: convubw */
      var48.x4[0] = (orc_uint8) var41.x4[0];
      var48.x4[1] = (orc_uint8) var41.x4[1];
      var48.x4[2] = (orc_uint8) var41.x4[2];
      var48.x4[3] = (orc_uint8) var41.x4[3];
      /* 9: loadl */
      var49 = ptr0[i];
      /* 10: convubw */
      var50.x4[0] = (orc_uint8) var49.x4[0];
      var50.x4[1] = (orc_uint8) var49.x4[1];
      var50.x4[2] = (orc_uint8) var49.x4[2];
      var50.x4[3] = (orc_uint8) var49.x4[3];
      /* 11: subw */
      var51.x4[0] = var48.x4[0] - var50.x4[0];
      var51.x4[1] = var48.x4[1] - var50.x4[1];
      var51.x4[2] = var48.x4[2] - var50.x4[2];
      var51.x4[3] = var48.x4[3] - var50.x4[3];
      /* 12: mullw */
      var52.x4[0] = (var51.x4[0] * var47.x4[0]) & 0xffff;
      var52.x4[1] = (var51.x4[1] * var47.x4[1]) & 0xffff;
      var52.x4[2] = (var51.x4[2] * var47.x4[2]) & 0xffff;
      var52.x4[3] = (var51.x4[3] * var47.x4[3]) & 0xffff;
      /* 13: div255w */
      var53.x4[0] =
          ((orc_uint16) (((orc_uint16) (var52.x4[0] + 128)) +
              (((orc_uint16) (var52.x4[0] + 128)) >> 8))) >> 8;
      var53.x4[1] =
          ((orc_uint16) (((orc_uint16) (var52.x4[1] + 128)) +
              (((orc_uint16) (var52.x4[1] + 128)) >> 8))) >> 8;
      var53.x4[2] =
          ((orc_uint16) (((orc_uint16) (var52.x4[2] + 128)) +
              (((orc_uint16) (var52.x4[2] + 128)) >> 8))) >> 8;
      var53.x4[3] =
          ((orc_uint16) (((orc_uint16) (var52.x4[3] + 128)) +
              (((orc_uint16) (var52.x4[3] + 128)) >> 8))) >> 8;
      /* 14: addw */
      var54.x4[0] = var50.x4[0] + var53.x4[0];
      var54.x4[1] = var50.x4[1] + var53.x4[1];
      var54.x4[2] = var50.x4[2] + var53.x4[2];
      var54.x4[3] = var50.x4[3] + var53.x4[3];
      /* 15: convwb */
      var55.x4[0] = var54.x4[0];
      var55.x4[1] = var54.x4[1];
      var55.x4[2] = var54.x4[2];
      var55.x4[3] = var54.x4[3];
      /* 17: orl */
      var56.i = var55.i | var40.i;
      /* 18: storel */
      ptr0[i] = var56;
    }
  }

}

void
video_mixer_orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  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;

      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "video_mixer_orc_blend_argb");
      orc_program_set_backup_function (p, _backup_video_mixer_orc_blend_argb);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0x000000ff, "c1");
      orc_program_add_constant (p, 4, 0x00000008, "c2");
      orc_program_add_parameter (p, 2, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");
      orc_program_add_temporary (p, 1, "t3");
      orc_program_add_temporary (p, 4, "t4");
      orc_program_add_temporary (p, 8, "t5");
      orc_program_add_temporary (p, 8, "t6");
      orc_program_add_temporary (p, 8, "t7");

      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          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_T3, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shruw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "subw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T7,
          ORC_VAR_D1);
      orc_program_append_2 (p, "div255w", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T6,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "orl", 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);

      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;
  ORC_EXECUTOR_M (ex) = m;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_D1] = d1_stride;
  ex->arrays[ORC_VAR_S1] = (void *) s1;
  ex->params[ORC_VAR_S1] = s1_stride;
  ex->params[ORC_VAR_P1] = p1;

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


/* video_mixer_orc_blend_bgra */
#ifdef DISABLE_ORC
void
video_mixer_orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  int i;
  int j;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union64 var40;
  orc_union32 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union16 var44;
  orc_int8 var45;
  orc_union32 var46;
  orc_union64 var47;
  orc_union64 var48;
  orc_union64 var49;
  orc_union64 var50;
  orc_union32 var51;
  orc_union64 var52;
  orc_union64 var53;
  orc_union64 var54;
  orc_union64 var55;
  orc_union64 var56;
  orc_union32 var57;
  orc_union32 var58;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
    ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);

    /* 6: loadpw */
    var40.x4[0] = p1;
    var40.x4[1] = p1;
    var40.x4[2] = p1;
    var40.x4[3] = p1;
    /* 17: loadpl */
    var41.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */

    for (i = 0; i < n; i++) {
      /* 0: loadl */
      var42 = ptr4[i];
      /* 1: shrul */
      var43.i = ((orc_uint32) var42.i) >> 24;
      /* 2: convlw */
      var44.i = var43.i;
      /* 3: convwb */
      var45 = var44.i;
      /* 4: splatbl */
      var46.i =
          ((var45 & 0xff) << 24) | ((var45 & 0xff) << 16) | ((var45 & 0xff) <<
          8) | (var45 & 0xff);
      /* 5: convubw */
      var47.x4[0] = (orc_uint8) var46.x4[0];
      var47.x4[1] = (orc_uint8) var46.x4[1];
      var47.x4[2] = (orc_uint8) var46.x4[2];
      var47.x4[3] = (orc_uint8) var46.x4[3];
      /* 7: mullw */
      var48.x4[0] = (var47.x4[0] * var40.x4[0]) & 0xffff;
      var48.x4[1] = (var47.x4[1] * var40.x4[1]) & 0xffff;
      var48.x4[2] = (var47.x4[2] * var40.x4[2]) & 0xffff;
      var48.x4[3] = (var47.x4[3] * var40.x4[3]) & 0xffff;
      /* 8: shruw */
      var49.x4[0] = ((orc_uint16) var48.x4[0]) >> 8;
      var49.x4[1] = ((orc_uint16) var48.x4[1]) >> 8;
      var49.x4[2] = ((orc_uint16) var48.x4[2]) >> 8;
      var49.x4[3] = ((orc_uint16) var48.x4[3]) >> 8;
      /* 9: convubw */
      var50.x4[0] = (orc_uint8) var42.x4[0];
      var50.x4[1] = (orc_uint8) var42.x4[1];
      var50.x4[2] = (orc_uint8) var42.x4[2];
      var50.x4[3] = (orc_uint8) var42.x4[3];
      /* 10: loadl */
      var51 = ptr0[i];
      /* 11: convubw */
      var52.x4[0] = (orc_uint8) var51.x4[0];
      var52.x4[1] = (orc_uint8) var51.x4[1];
      var52.x4[2] = (orc_uint8) var51.x4[2];
      var52.x4[3] = (orc_uint8) var51.x4[3];
      /* 12: subw */
      var53.x4[0] = var50.x4[0] - var52.x4[0];
      var53.x4[1] = var50.x4[1] - var52.x4[1];
      var53.x4[2] = var50.x4[2] - var52.x4[2];
      var53.x4[3] = var50.x4[3] - var52.x4[3];
      /* 13: mullw */
      var54.x4[0] = (var53.x4[0] * var49.x4[0]) & 0xffff;
      var54.x4[1] = (var53.x4[1] * var49.x4[1]) & 0xffff;
      var54.x4[2] = (var53.x4[2] * var49.x4[2]) & 0xffff;
      var54.x4[3] = (var53.x4[3] * var49.x4[3]) & 0xffff;
      /* 14: div255w */
      var55.x4[0] =
          ((orc_uint16) (((orc_uint16) (var54.x4[0] + 128)) +
              (((orc_uint16) (var54.x4[0] + 128)) >> 8))) >> 8;
      var55.x4[1] =
          ((orc_uint16) (((orc_uint16) (var54.x4[1] + 128)) +
              (((orc_uint16) (var54.x4[1] + 128)) >> 8))) >> 8;
      var55.x4[2] =
          ((orc_uint16) (((orc_uint16) (var54.x4[2] + 128)) +
              (((orc_uint16) (var54.x4[2] + 128)) >> 8))) >> 8;
      var55.x4[3] =
          ((orc_uint16) (((orc_uint16) (var54.x4[3] + 128)) +
              (((orc_uint16) (var54.x4[3] + 128)) >> 8))) >> 8;
      /* 15: addw */
      var56.x4[0] = var52.x4[0] + var55.x4[0];
      var56.x4[1] = var52.x4[1] + var55.x4[1];
      var56.x4[2] = var52.x4[2] + var55.x4[2];
      var56.x4[3] = var52.x4[3] + var55.x4[3];
      /* 16: convwb */
      var57.x4[0] = var56.x4[0];
      var57.x4[1] = var56.x4[1];
      var57.x4[2] = var56.x4[2];
      var57.x4[3] = var56.x4[3];
      /* 18: orl */
      var58.i = var57.i | var41.i;
      /* 19: storel */
      ptr0[i] = var58;
    }
  }

}

#else
static void
_backup_video_mixer_orc_blend_bgra (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int j;
  int n = ex->n;
  int m = ex->params[ORC_VAR_A1];
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union64 var40;
  orc_union32 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union16 var44;
  orc_int8 var45;
  orc_union32 var46;
  orc_union64 var47;
  orc_union64 var48;
  orc_union64 var49;
  orc_union64 var50;
  orc_union32 var51;
  orc_union64 var52;
  orc_union64 var53;
  orc_union64 var54;
  orc_union64 var55;
  orc_union64 var56;
  orc_union32 var57;
  orc_union32 var58;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
    ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);

    /* 6: loadpw */
    var40.x4[0] = ex->params[24];
    var40.x4[1] = ex->params[24];
    var40.x4[2] = ex->params[24];
    var40.x4[3] = ex->params[24];
    /* 17: loadpl */
    var41.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */

    for (i = 0; i < n; i++) {
      /* 0: loadl */
      var42 = ptr4[i];
      /* 1: shrul */
      var43.i = ((orc_uint32) var42.i) >> 24;
      /* 2: convlw */
      var44.i = var43.i;
      /* 3: convwb */
      var45 = var44.i;
      /* 4: splatbl */
      var46.i =
          ((var45 & 0xff) << 24) | ((var45 & 0xff) << 16) | ((var45 & 0xff) <<
          8) | (var45 & 0xff);
      /* 5: convubw */
      var47.x4[0] = (orc_uint8) var46.x4[0];
      var47.x4[1] = (orc_uint8) var46.x4[1];
      var47.x4[2] = (orc_uint8) var46.x4[2];
      var47.x4[3] = (orc_uint8) var46.x4[3];
      /* 7: mullw */
      var48.x4[0] = (var47.x4[0] * var40.x4[0]) & 0xffff;
      var48.x4[1] = (var47.x4[1] * var40.x4[1]) & 0xffff;
      var48.x4[2] = (var47.x4[2] * var40.x4[2]) & 0xffff;
      var48.x4[3] = (var47.x4[3] * var40.x4[3]) & 0xffff;
      /* 8: shruw */
      var49.x4[0] = ((orc_uint16) var48.x4[0]) >> 8;
      var49.x4[1] = ((orc_uint16) var48.x4[1]) >> 8;
      var49.x4[2] = ((orc_uint16) var48.x4[2]) >> 8;
      var49.x4[3] = ((orc_uint16) var48.x4[3]) >> 8;
      /* 9: convubw */
      var50.x4[0] = (orc_uint8) var42.x4[0];
      var50.x4[1] = (orc_uint8) var42.x4[1];
      var50.x4[2] = (orc_uint8) var42.x4[2];
      var50.x4[3] = (orc_uint8) var42.x4[3];
      /* 10: loadl */
      var51 = ptr0[i];
      /* 11: convubw */
      var52.x4[0] = (orc_uint8) var51.x4[0];
      var52.x4[1] = (orc_uint8) var51.x4[1];
      var52.x4[2] = (orc_uint8) var51.x4[2];
      var52.x4[3] = (orc_uint8) var51.x4[3];
      /* 12: subw */
      var53.x4[0] = var50.x4[0] - var52.x4[0];
      var53.x4[1] = var50.x4[1] - var52.x4[1];
      var53.x4[2] = var50.x4[2] - var52.x4[2];
      var53.x4[3] = var50.x4[3] - var52.x4[3];
      /* 13: mullw */
      var54.x4[0] = (var53.x4[0] * var49.x4[0]) & 0xffff;
      var54.x4[1] = (var53.x4[1] * var49.x4[1]) & 0xffff;
      var54.x4[2] = (var53.x4[2] * var49.x4[2]) & 0xffff;
      var54.x4[3] = (var53.x4[3] * var49.x4[3]) & 0xffff;
      /* 14: div255w */
      var55.x4[0] =
          ((orc_uint16) (((orc_uint16) (var54.x4[0] + 128)) +
              (((orc_uint16) (var54.x4[0] + 128)) >> 8))) >> 8;
      var55.x4[1] =
          ((orc_uint16) (((orc_uint16) (var54.x4[1] + 128)) +
              (((orc_uint16) (var54.x4[1] + 128)) >> 8))) >> 8;
      var55.x4[2] =
          ((orc_uint16) (((orc_uint16) (var54.x4[2] + 128)) +
              (((orc_uint16) (var54.x4[2] + 128)) >> 8))) >> 8;
      var55.x4[3] =
          ((orc_uint16) (((orc_uint16) (var54.x4[3] + 128)) +
              (((orc_uint16) (var54.x4[3] + 128)) >> 8))) >> 8;
      /* 15: addw */
      var56.x4[0] = var52.x4[0] + var55.x4[0];
      var56.x4[1] = var52.x4[1] + var55.x4[1];
      var56.x4[2] = var52.x4[2] + var55.x4[2];
      var56.x4[3] = var52.x4[3] + var55.x4[3];
      /* 16: convwb */
      var57.x4[0] = var56.x4[0];
      var57.x4[1] = var56.x4[1];
      var57.x4[2] = var56.x4[2];
      var57.x4[3] = var56.x4[3];
      /* 18: orl */
      var58.i = var57.i | var41.i;
      /* 19: storel */
      ptr0[i] = var58;
    }
  }

}

void
video_mixer_orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  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;

      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "video_mixer_orc_blend_bgra");
      orc_program_set_backup_function (p, _backup_video_mixer_orc_blend_bgra);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0xff000000, "c1");
      orc_program_add_constant (p, 4, 0x00000018, "c2");
      orc_program_add_constant (p, 4, 0x00000008, "c3");
      orc_program_add_parameter (p, 2, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 2, "t3");
      orc_program_add_temporary (p, 1, "t4");
      orc_program_add_temporary (p, 4, "t5");
      orc_program_add_temporary (p, 8, "t6");
      orc_program_add_temporary (p, 8, "t7");
      orc_program_add_temporary (p, 8, "t8");

      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shruw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_C3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "subw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T8,
          ORC_VAR_D1);
      orc_program_append_2 (p, "div255w", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T7,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "orl", 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);

      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;
  ORC_EXECUTOR_M (ex) = m;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_D1] = d1_stride;
  ex->arrays[ORC_VAR_S1] = (void *) s1;
  ex->params[ORC_VAR_S1] = s1_stride;
  ex->params[ORC_VAR_P1] = p1;

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


/* video_mixer_orc_overlay_argb */
#ifdef DISABLE_ORC
void
video_mixer_orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  int i;
  int j;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union64 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union32 var44;
  orc_union16 var45;
  orc_int8 var46;
  orc_union32 var47;
  orc_union64 var48;
  orc_union64 var49;
  orc_union64 var50;
  orc_union64 var51;
  orc_union64 var52;
  orc_union32 var53;
  orc_union64 var54;
  orc_union64 var55;
  orc_union32 var56;
  orc_union16 var57;
  orc_int8 var58;
  orc_union32 var59;
  orc_union64 var60;
  orc_union64 var61;
  orc_union64 var62;
  orc_union64 var63;
  orc_union64 var64;
  orc_union64 var65;
  orc_union64 var66;
  orc_union64 var67;
  orc_union32 var68;
  orc_union32 var69;
  orc_union32 var70;
  orc_union32 var71;
  orc_union32 var72;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
    ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);

    /* 5: loadpw */
    var41.x4[0] = p1;
    var41.x4[1] = p1;
    var41.x4[2] = p1;
    var41.x4[3] = p1;
    /* 10: loadpl */
    var53.i = (int) 0xffffffff; /* -1 or 2.122e-314f */
    /* 26: loadpl */
    var42.i = (int) 0xffffff00; /* -256 or 2.122e-314f */
    /* 29: loadpl */
    var43.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */

    for (i = 0; i < n; i++) {
      /* 0: loadl */
      var44 = ptr4[i];
      /* 1: convlw */
      var45.i = var44.i;
      /* 2: convwb */
      var46 = var45.i;
      /* 3: splatbl */
      var47.i =
          ((var46 & 0xff) << 24) | ((var46 & 0xff) << 16) | ((var46 & 0xff) <<
          8) | (var46 & 0xff);
      /* 4: convubw */
      var48.x4[0] = (orc_uint8) var47.x4[0];
      var48.x4[1] = (orc_uint8) var47.x4[1];
      var48.x4[2] = (orc_uint8) var47.x4[2];
      var48.x4[3] = (orc_uint8) var47.x4[3];
      /* 6: mullw */
      var49.x4[0] = (var48.x4[0] * var41.x4[0]) & 0xffff;
      var49.x4[1] = (var48.x4[1] * var41.x4[1]) & 0xffff;
      var49.x4[2] = (var48.x4[2] * var41.x4[2]) & 0xffff;
      var49.x4[3] = (var48.x4[3] * var41.x4[3]) & 0xffff;
      /* 7: shruw */
      var50.x4[0] = ((orc_uint16) var49.x4[0]) >> 8;
      var50.x4[1] = ((orc_uint16) var49.x4[1]) >> 8;
      var50.x4[2] = ((orc_uint16) var49.x4[2]) >> 8;
      var50.x4[3] = ((orc_uint16) var49.x4[3]) >> 8;
      /* 8: convubw */
      var51.x4[0] = (orc_uint8) var44.x4[0];
      var51.x4[1] = (orc_uint8) var44.x4[1];
      var51.x4[2] = (orc_uint8) var44.x4[2];
      var51.x4[3] = (orc_uint8) var44.x4[3];
      /* 9: mullw */
      var52.x4[0] = (var51.x4[0] * var50.x4[0]) & 0xffff;
      var52.x4[1] = (var51.x4[1] * var50.x4[1]) & 0xffff;
      var52.x4[2] = (var51.x4[2] * var50.x4[2]) & 0xffff;
      var52.x4[3] = (var51.x4[3] * var50.x4[3]) & 0xffff;
      /* 11: convubw */
      var54.x4[0] = (orc_uint8) var53.x4[0];
      var54.x4[1] = (orc_uint8) var53.x4[1];
      var54.x4[2] = (orc_uint8) var53.x4[2];
      var54.x4[3] = (orc_uint8) var53.x4[3];
      /* 12: subw */
      var55.x4[0] = var54.x4[0] - var50.x4[0];
      var55.x4[1] = var54.x4[1] - var50.x4[1];
      var55.x4[2] = var54.x4[2] - var50.x4[2];
      var55.x4[3] = var54.x4[3] - var50.x4[3];
      /* 13: loadl */
      var56 = ptr0[i];
      /* 14: convlw */
      var57.i = var56.i;
      /* 15: convwb */
      var58 = var57.i;
      /* 16: splatbl */
      var59.i =
          ((var58 & 0xff) << 24) | ((var58 & 0xff) << 16) | ((var58 & 0xff) <<
          8) | (var58 & 0xff);
      /* 17: convubw */
      var60.x4[0] = (orc_uint8) var59.x4[0];
      var60.x4[1] = (orc_uint8) var59.x4[1];
      var60.x4[2] = (orc_uint8) var59.x4[2];
      var60.x4[3] = (orc_uint8) var59.x4[3];
      /* 18: mullw */
      var61.x4[0] = (var60.x4[0] * var55.x4[0]) & 0xffff;
      var61.x4[1] = (var60.x4[1] * var55.x4[1]) & 0xffff;
      var61.x4[2] = (var60.x4[2] * var55.x4[2]) & 0xffff;
      var61.x4[3] = (var60.x4[3] * var55.x4[3]) & 0xffff;
      /* 19: div255w */
      var62.x4[0] =
          ((orc_uint16) (((orc_uint16) (var61.x4[0] + 128)) +
              (((orc_uint16) (var61.x4[0] + 128)) >> 8))) >> 8;
      var62.x4[1] =
          ((orc_uint16) (((orc_uint16) (var61.x4[1] + 128)) +
              (((orc_uint16) (var61.x4[1] + 128)) >> 8))) >> 8;
      var62.x4[2] =
          ((orc_uint16) (((orc_uint16) (var61.x4[2] + 128)) +
              (((orc_uint16) (var61.x4[2] + 128)) >> 8))) >> 8;
      var62.x4[3] =
          ((orc_uint16) (((orc_uint16) (var61.x4[3] + 128)) +
              (((orc_uint16) (var61.x4[3] + 128)) >> 8))) >> 8;
      /* 20: convubw */
      var63.x4[0] = (orc_uint8) var56.x4[0];
      var63.x4[1] = (orc_uint8) var56.x4[1];
      var63.x4[2] = (orc_uint8) var56.x4[2];
      var63.x4[3] = (orc_uint8) var56.x4[3];
      /* 21: mullw */
      var64.x4[0] = (var63.x4[0] * var62.x4[0]) & 0xffff;
      var64.x4[1] = (var63.x4[1] * var62.x4[1]) & 0xffff;
      var64.x4[2] = (var63.x4[2] * var62.x4[2]) & 0xffff;
      var64.x4[3] = (var63.x4[3] * var62.x4[3]) & 0xffff;
      /* 22: addw */
      var65.x4[0] = var64.x4[0] + var52.x4[0];
      var65.x4[1] = var64.x4[1] + var52.x4[1];
      var65.x4[2] = var64.x4[2] + var52.x4[2];
      var65.x4[3] = var64.x4[3] + var52.x4[3];
      /* 23: addw */
      var66.x4[0] = var62.x4[0] + var50.x4[0];
      var66.x4[1] = var62.x4[1] + var50.x4[1];
      var66.x4[2] = var62.x4[2] + var50.x4[2];
      var66.x4[3] = var62.x4[3] + var50.x4[3];
      /* 24: divluw */
      var67.x4[0] =
          ((var66.x4[0] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[0]) /
          ((orc_uint16) var66.x4[0] & 0xff));
      var67.x4[1] =
          ((var66.x4[1] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[1]) /
          ((orc_uint16) var66.x4[1] & 0xff));
      var67.x4[2] =
          ((var66.x4[2] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[2]) /
          ((orc_uint16) var66.x4[2] & 0xff));
      var67.x4[3] =
          ((var66.x4[3] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[3]) /
          ((orc_uint16) var66.x4[3] & 0xff));
      /* 25: convwb */
      var68.x4[0] = var67.x4[0];
      var68.x4[1] = var67.x4[1];
      var68.x4[2] = var67.x4[2];
      var68.x4[3] = var67.x4[3];
      /* 27: andl */
      var69.i = var68.i & var42.i;
      /* 28: convwb */
      var70.x4[0] = var66.x4[0];
      var70.x4[1] = var66.x4[1];
      var70.x4[2] = var66.x4[2];
      var70.x4[3] = var66.x4[3];
      /* 30: andl */
      var71.i = var70.i & var43.i;
      /* 31: orl */
      var72.i = var69.i | var71.i;
      /* 32: storel */
      ptr0[i] = var72;
    }
  }

}

#else
static void
_backup_video_mixer_orc_overlay_argb (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int j;
  int n = ex->n;
  int m = ex->params[ORC_VAR_A1];
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union64 var41;
  orc_union32 var42;
  orc_union32 var43;
  orc_union32 var44;
  orc_union16 var45;
  orc_int8 var46;
  orc_union32 var47;
  orc_union64 var48;
  orc_union64 var49;
  orc_union64 var50;
  orc_union64 var51;
  orc_union64 var52;
  orc_union32 var53;
  orc_union64 var54;
  orc_union64 var55;
  orc_union32 var56;
  orc_union16 var57;
  orc_int8 var58;
  orc_union32 var59;
  orc_union64 var60;
  orc_union64 var61;
  orc_union64 var62;
  orc_union64 var63;
  orc_union64 var64;
  orc_union64 var65;
  orc_union64 var66;
  orc_union64 var67;
  orc_union32 var68;
  orc_union32 var69;
  orc_union32 var70;
  orc_union32 var71;
  orc_union32 var72;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
    ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);

    /* 5: loadpw */
    var41.x4[0] = ex->params[24];
    var41.x4[1] = ex->params[24];
    var41.x4[2] = ex->params[24];
    var41.x4[3] = ex->params[24];
    /* 10: loadpl */
    var53.i = (int) 0xffffffff; /* -1 or 2.122e-314f */
    /* 26: loadpl */
    var42.i = (int) 0xffffff00; /* -256 or 2.122e-314f */
    /* 29: loadpl */
    var43.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */

    for (i = 0; i < n; i++) {
      /* 0: loadl */
      var44 = ptr4[i];
      /* 1: convlw */
      var45.i = var44.i;
      /* 2: convwb */
      var46 = var45.i;
      /* 3: splatbl */
      var47.i =
          ((var46 & 0xff) << 24) | ((var46 & 0xff) << 16) | ((var46 & 0xff) <<
          8) | (var46 & 0xff);
      /* 4: convubw */
      var48.x4[0] = (orc_uint8) var47.x4[0];
      var48.x4[1] = (orc_uint8) var47.x4[1];
      var48.x4[2] = (orc_uint8) var47.x4[2];
      var48.x4[3] = (orc_uint8) var47.x4[3];
      /* 6: mullw */
      var49.x4[0] = (var48.x4[0] * var41.x4[0]) & 0xffff;
      var49.x4[1] = (var48.x4[1] * var41.x4[1]) & 0xffff;
      var49.x4[2] = (var48.x4[2] * var41.x4[2]) & 0xffff;
      var49.x4[3] = (var48.x4[3] * var41.x4[3]) & 0xffff;
      /* 7: shruw */
      var50.x4[0] = ((orc_uint16) var49.x4[0]) >> 8;
      var50.x4[1] = ((orc_uint16) var49.x4[1]) >> 8;
      var50.x4[2] = ((orc_uint16) var49.x4[2]) >> 8;
      var50.x4[3] = ((orc_uint16) var49.x4[3]) >> 8;
      /* 8: convubw */
      var51.x4[0] = (orc_uint8) var44.x4[0];
      var51.x4[1] = (orc_uint8) var44.x4[1];
      var51.x4[2] = (orc_uint8) var44.x4[2];
      var51.x4[3] = (orc_uint8) var44.x4[3];
      /* 9: mullw */
      var52.x4[0] = (var51.x4[0] * var50.x4[0]) & 0xffff;
      var52.x4[1] = (var51.x4[1] * var50.x4[1]) & 0xffff;
      var52.x4[2] = (var51.x4[2] * var50.x4[2]) & 0xffff;
      var52.x4[3] = (var51.x4[3] * var50.x4[3]) & 0xffff;
      /* 11: convubw */
      var54.x4[0] = (orc_uint8) var53.x4[0];
      var54.x4[1] = (orc_uint8) var53.x4[1];
      var54.x4[2] = (orc_uint8) var53.x4[2];
      var54.x4[3] = (orc_uint8) var53.x4[3];
      /* 12: subw */
      var55.x4[0] = var54.x4[0] - var50.x4[0];
      var55.x4[1] = var54.x4[1] - var50.x4[1];
      var55.x4[2] = var54.x4[2] - var50.x4[2];
      var55.x4[3] = var54.x4[3] - var50.x4[3];
      /* 13: loadl */
      var56 = ptr0[i];
      /* 14: convlw */
      var57.i = var56.i;
      /* 15: convwb */
      var58 = var57.i;
      /* 16: splatbl */
      var59.i =
          ((var58 & 0xff) << 24) | ((var58 & 0xff) << 16) | ((var58 & 0xff) <<
          8) | (var58 & 0xff);
      /* 17: convubw */
      var60.x4[0] = (orc_uint8) var59.x4[0];
      var60.x4[1] = (orc_uint8) var59.x4[1];
      var60.x4[2] = (orc_uint8) var59.x4[2];
      var60.x4[3] = (orc_uint8) var59.x4[3];
      /* 18: mullw */
      var61.x4[0] = (var60.x4[0] * var55.x4[0]) & 0xffff;
      var61.x4[1] = (var60.x4[1] * var55.x4[1]) & 0xffff;
      var61.x4[2] = (var60.x4[2] * var55.x4[2]) & 0xffff;
      var61.x4[3] = (var60.x4[3] * var55.x4[3]) & 0xffff;
      /* 19: div255w */
      var62.x4[0] =
          ((orc_uint16) (((orc_uint16) (var61.x4[0] + 128)) +
              (((orc_uint16) (var61.x4[0] + 128)) >> 8))) >> 8;
      var62.x4[1] =
          ((orc_uint16) (((orc_uint16) (var61.x4[1] + 128)) +
              (((orc_uint16) (var61.x4[1] + 128)) >> 8))) >> 8;
      var62.x4[2] =
          ((orc_uint16) (((orc_uint16) (var61.x4[2] + 128)) +
              (((orc_uint16) (var61.x4[2] + 128)) >> 8))) >> 8;
      var62.x4[3] =
          ((orc_uint16) (((orc_uint16) (var61.x4[3] + 128)) +
              (((orc_uint16) (var61.x4[3] + 128)) >> 8))) >> 8;
      /* 20: convubw */
      var63.x4[0] = (orc_uint8) var56.x4[0];
      var63.x4[1] = (orc_uint8) var56.x4[1];
      var63.x4[2] = (orc_uint8) var56.x4[2];
      var63.x4[3] = (orc_uint8) var56.x4[3];
      /* 21: mullw */
      var64.x4[0] = (var63.x4[0] * var62.x4[0]) & 0xffff;
      var64.x4[1] = (var63.x4[1] * var62.x4[1]) & 0xffff;
      var64.x4[2] = (var63.x4[2] * var62.x4[2]) & 0xffff;
      var64.x4[3] = (var63.x4[3] * var62.x4[3]) & 0xffff;
      /* 22: addw */
      var65.x4[0] = var64.x4[0] + var52.x4[0];
      var65.x4[1] = var64.x4[1] + var52.x4[1];
      var65.x4[2] = var64.x4[2] + var52.x4[2];
      var65.x4[3] = var64.x4[3] + var52.x4[3];
      /* 23: addw */
      var66.x4[0] = var62.x4[0] + var50.x4[0];
      var66.x4[1] = var62.x4[1] + var50.x4[1];
      var66.x4[2] = var62.x4[2] + var50.x4[2];
      var66.x4[3] = var62.x4[3] + var50.x4[3];
      /* 24: divluw */
      var67.x4[0] =
          ((var66.x4[0] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[0]) /
          ((orc_uint16) var66.x4[0] & 0xff));
      var67.x4[1] =
          ((var66.x4[1] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[1]) /
          ((orc_uint16) var66.x4[1] & 0xff));
      var67.x4[2] =
          ((var66.x4[2] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[2]) /
          ((orc_uint16) var66.x4[2] & 0xff));
      var67.x4[3] =
          ((var66.x4[3] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[3]) /
          ((orc_uint16) var66.x4[3] & 0xff));
      /* 25: convwb */
      var68.x4[0] = var67.x4[0];
      var68.x4[1] = var67.x4[1];
      var68.x4[2] = var67.x4[2];
      var68.x4[3] = var67.x4[3];
      /* 27: andl */
      var69.i = var68.i & var42.i;
      /* 28: convwb */
      var70.x4[0] = var66.x4[0];
      var70.x4[1] = var66.x4[1];
      var70.x4[2] = var66.x4[2];
      var70.x4[3] = var66.x4[3];
      /* 30: andl */
      var71.i = var70.i & var43.i;
      /* 31: orl */
      var72.i = var69.i | var71.i;
      /* 32: storel */
      ptr0[i] = var72;
    }
  }

}

void
video_mixer_orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  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;

      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "video_mixer_orc_overlay_argb");
      orc_program_set_backup_function (p, _backup_video_mixer_orc_overlay_argb);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0xffffffff, "c1");
      orc_program_add_constant (p, 4, 0x000000ff, "c2");
      orc_program_add_constant (p, 4, 0xffffff00, "c3");
      orc_program_add_constant (p, 4, 0x00000008, "c4");
      orc_program_add_parameter (p, 2, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 2, "t2");
      orc_program_add_temporary (p, 1, "t3");
      orc_program_add_temporary (p, 8, "t4");
      orc_program_add_temporary (p, 8, "t5");
      orc_program_add_temporary (p, 8, "t6");
      orc_program_add_temporary (p, 4, "t7");
      orc_program_add_temporary (p, 8, "t8");
      orc_program_add_temporary (p, 8, "t9");

      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          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_T3, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T4, ORC_VAR_T7, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shruw", 2, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_C4,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T4,
          ORC_VAR_D1);
      orc_program_append_2 (p, "loadpl", 0, ORC_VAR_T7, ORC_VAR_C1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T7, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "subw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T4,
          ORC_VAR_D1);
      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          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_T3, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T7, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5,
          ORC_VAR_D1);
      orc_program_append_2 (p, "div255w", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T8, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T6,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T9,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T4,
          ORC_VAR_D1);
      orc_program_append_2 (p, "divluw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T6,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "andl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 2, ORC_VAR_T7, ORC_VAR_T6, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "andl", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T7,
          ORC_VAR_D1);
      orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);

      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;
  ORC_EXECUTOR_M (ex) = m;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_D1] = d1_stride;
  ex->arrays[ORC_VAR_S1] = (void *) s1;
  ex->params[ORC_VAR_S1] = s1_stride;
  ex->params[ORC_VAR_P1] = p1;

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


/* video_mixer_orc_overlay_bgra */
#ifdef DISABLE_ORC
void
video_mixer_orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  int i;
  int j;
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union64 var42;
  orc_union32 var43;
  orc_union32 var44;
  orc_union32 var45;
  orc_union32 var46;
  orc_union16 var47;
  orc_int8 var48;
  orc_union32 var49;
  orc_union64 var50;
  orc_union64 var51;
  orc_union64 var52;
  orc_union64 var53;
  orc_union64 var54;
  orc_union32 var55;
  orc_union64 var56;
  orc_union64 var57;
  orc_union32 var58;
  orc_union32 var59;
  orc_union16 var60;
  orc_int8 var61;
  orc_union32 var62;
  orc_union64 var63;
  orc_union64 var64;
  orc_union64 var65;
  orc_union64 var66;
  orc_union64 var67;
  orc_union64 var68;
  orc_union64 var69;
  orc_union64 var70;
  orc_union32 var71;
  orc_union32 var72;
  orc_union32 var73;
  orc_union32 var74;
  orc_union32 var75;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
    ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);

    /* 6: loadpw */
    var42.x4[0] = p1;
    var42.x4[1] = p1;
    var42.x4[2] = p1;
    var42.x4[3] = p1;
    /* 11: loadpl */
    var55.i = (int) 0xffffffff; /* -1 or 2.122e-314f */
    /* 28: loadpl */
    var43.i = (int) 0x00ffffff; /* 16777215 or 8.28905e-317f */
    /* 31: loadpl */
    var44.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */

    for (i = 0; i < n; i++) {
      /* 0: loadl */
      var45 = ptr4[i];
      /* 1: shrul */
      var46.i = ((orc_uint32) var45.i) >> 24;
      /* 2: convlw */
      var47.i = var46.i;
      /* 3: convwb */
      var48 = var47.i;
      /* 4: splatbl */
      var49.i =
          ((var48 & 0xff) << 24) | ((var48 & 0xff) << 16) | ((var48 & 0xff) <<
          8) | (var48 & 0xff);
      /* 5: convubw */
      var50.x4[0] = (orc_uint8) var49.x4[0];
      var50.x4[1] = (orc_uint8) var49.x4[1];
      var50.x4[2] = (orc_uint8) var49.x4[2];
      var50.x4[3] = (orc_uint8) var49.x4[3];
      /* 7: mullw */
      var51.x4[0] = (var50.x4[0] * var42.x4[0]) & 0xffff;
      var51.x4[1] = (var50.x4[1] * var42.x4[1]) & 0xffff;
      var51.x4[2] = (var50.x4[2] * var42.x4[2]) & 0xffff;
      var51.x4[3] = (var50.x4[3] * var42.x4[3]) & 0xffff;
      /* 8: shruw */
      var52.x4[0] = ((orc_uint16) var51.x4[0]) >> 8;
      var52.x4[1] = ((orc_uint16) var51.x4[1]) >> 8;
      var52.x4[2] = ((orc_uint16) var51.x4[2]) >> 8;
      var52.x4[3] = ((orc_uint16) var51.x4[3]) >> 8;
      /* 9: convubw */
      var53.x4[0] = (orc_uint8) var45.x4[0];
      var53.x4[1] = (orc_uint8) var45.x4[1];
      var53.x4[2] = (orc_uint8) var45.x4[2];
      var53.x4[3] = (orc_uint8) var45.x4[3];
      /* 10: mullw */
      var54.x4[0] = (var53.x4[0] * var52.x4[0]) & 0xffff;
      var54.x4[1] = (var53.x4[1] * var52.x4[1]) & 0xffff;
      var54.x4[2] = (var53.x4[2] * var52.x4[2]) & 0xffff;
      var54.x4[3] = (var53.x4[3] * var52.x4[3]) & 0xffff;
      /* 12: convubw */
      var56.x4[0] = (orc_uint8) var55.x4[0];
      var56.x4[1] = (orc_uint8) var55.x4[1];
      var56.x4[2] = (orc_uint8) var55.x4[2];
      var56.x4[3] = (orc_uint8) var55.x4[3];
      /* 13: subw */
      var57.x4[0] = var56.x4[0] - var52.x4[0];
      var57.x4[1] = var56.x4[1] - var52.x4[1];
      var57.x4[2] = var56.x4[2] - var52.x4[2];
      var57.x4[3] = var56.x4[3] - var52.x4[3];
      /* 14: loadl */
      var58 = ptr0[i];
      /* 15: shrul */
      var59.i = ((orc_uint32) var58.i) >> 24;
      /* 16: convlw */
      var60.i = var59.i;
      /* 17: convwb */
      var61 = var60.i;
      /* 18: splatbl */
      var62.i =
          ((var61 & 0xff) << 24) | ((var61 & 0xff) << 16) | ((var61 & 0xff) <<
          8) | (var61 & 0xff);
      /* 19: convubw */
      var63.x4[0] = (orc_uint8) var62.x4[0];
      var63.x4[1] = (orc_uint8) var62.x4[1];
      var63.x4[2] = (orc_uint8) var62.x4[2];
      var63.x4[3] = (orc_uint8) var62.x4[3];
      /* 20: mullw */
      var64.x4[0] = (var63.x4[0] * var57.x4[0]) & 0xffff;
      var64.x4[1] = (var63.x4[1] * var57.x4[1]) & 0xffff;
      var64.x4[2] = (var63.x4[2] * var57.x4[2]) & 0xffff;
      var64.x4[3] = (var63.x4[3] * var57.x4[3]) & 0xffff;
      /* 21: div255w */
      var65.x4[0] =
          ((orc_uint16) (((orc_uint16) (var64.x4[0] + 128)) +
              (((orc_uint16) (var64.x4[0] + 128)) >> 8))) >> 8;
      var65.x4[1] =
          ((orc_uint16) (((orc_uint16) (var64.x4[1] + 128)) +
              (((orc_uint16) (var64.x4[1] + 128)) >> 8))) >> 8;
      var65.x4[2] =
          ((orc_uint16) (((orc_uint16) (var64.x4[2] + 128)) +
              (((orc_uint16) (var64.x4[2] + 128)) >> 8))) >> 8;
      var65.x4[3] =
          ((orc_uint16) (((orc_uint16) (var64.x4[3] + 128)) +
              (((orc_uint16) (var64.x4[3] + 128)) >> 8))) >> 8;
      /* 22: convubw */
      var66.x4[0] = (orc_uint8) var58.x4[0];
      var66.x4[1] = (orc_uint8) var58.x4[1];
      var66.x4[2] = (orc_uint8) var58.x4[2];
      var66.x4[3] = (orc_uint8) var58.x4[3];
      /* 23: mullw */
      var67.x4[0] = (var66.x4[0] * var65.x4[0]) & 0xffff;
      var67.x4[1] = (var66.x4[1] * var65.x4[1]) & 0xffff;
      var67.x4[2] = (var66.x4[2] * var65.x4[2]) & 0xffff;
      var67.x4[3] = (var66.x4[3] * var65.x4[3]) & 0xffff;
      /* 24: addw */
      var68.x4[0] = var67.x4[0] + var54.x4[0];
      var68.x4[1] = var67.x4[1] + var54.x4[1];
      var68.x4[2] = var67.x4[2] + var54.x4[2];
      var68.x4[3] = var67.x4[3] + var54.x4[3];
      /* 25: addw */
      var69.x4[0] = var65.x4[0] + var52.x4[0];
      var69.x4[1] = var65.x4[1] + var52.x4[1];
      var69.x4[2] = var65.x4[2] + var52.x4[2];
      var69.x4[3] = var65.x4[3] + var52.x4[3];
      /* 26: divluw */
      var70.x4[0] =
          ((var69.x4[0] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[0]) /
          ((orc_uint16) var69.x4[0] & 0xff));
      var70.x4[1] =
          ((var69.x4[1] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[1]) /
          ((orc_uint16) var69.x4[1] & 0xff));
      var70.x4[2] =
          ((var69.x4[2] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[2]) /
          ((orc_uint16) var69.x4[2] & 0xff));
      var70.x4[3] =
          ((var69.x4[3] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[3]) /
          ((orc_uint16) var69.x4[3] & 0xff));
      /* 27: convwb */
      var71.x4[0] = var70.x4[0];
      var71.x4[1] = var70.x4[1];
      var71.x4[2] = var70.x4[2];
      var71.x4[3] = var70.x4[3];
      /* 29: andl */
      var72.i = var71.i & var43.i;
      /* 30: convwb */
      var73.x4[0] = var69.x4[0];
      var73.x4[1] = var69.x4[1];
      var73.x4[2] = var69.x4[2];
      var73.x4[3] = var69.x4[3];
      /* 32: andl */
      var74.i = var73.i & var44.i;
      /* 33: orl */
      var75.i = var72.i | var74.i;
      /* 34: storel */
      ptr0[i] = var75;
    }
  }

}

#else
static void
_backup_video_mixer_orc_overlay_bgra (OrcExecutor * ORC_RESTRICT ex)
{
  int i;
  int j;
  int n = ex->n;
  int m = ex->params[ORC_VAR_A1];
  orc_union32 *ORC_RESTRICT ptr0;
  const orc_union32 *ORC_RESTRICT ptr4;
  orc_union64 var42;
  orc_union32 var43;
  orc_union32 var44;
  orc_union32 var45;
  orc_union32 var46;
  orc_union16 var47;
  orc_int8 var48;
  orc_union32 var49;
  orc_union64 var50;
  orc_union64 var51;
  orc_union64 var52;
  orc_union64 var53;
  orc_union64 var54;
  orc_union32 var55;
  orc_union64 var56;
  orc_union64 var57;
  orc_union32 var58;
  orc_union32 var59;
  orc_union16 var60;
  orc_int8 var61;
  orc_union32 var62;
  orc_union64 var63;
  orc_union64 var64;
  orc_union64 var65;
  orc_union64 var66;
  orc_union64 var67;
  orc_union64 var68;
  orc_union64 var69;
  orc_union64 var70;
  orc_union32 var71;
  orc_union32 var72;
  orc_union32 var73;
  orc_union32 var74;
  orc_union32 var75;

  for (j = 0; j < m; j++) {
    ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
    ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);

    /* 6: loadpw */
    var42.x4[0] = ex->params[24];
    var42.x4[1] = ex->params[24];
    var42.x4[2] = ex->params[24];
    var42.x4[3] = ex->params[24];
    /* 11: loadpl */
    var55.i = (int) 0xffffffff; /* -1 or 2.122e-314f */
    /* 28: loadpl */
    var43.i = (int) 0x00ffffff; /* 16777215 or 8.28905e-317f */
    /* 31: loadpl */
    var44.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */

    for (i = 0; i < n; i++) {
      /* 0: loadl */
      var45 = ptr4[i];
      /* 1: shrul */
      var46.i = ((orc_uint32) var45.i) >> 24;
      /* 2: convlw */
      var47.i = var46.i;
      /* 3: convwb */
      var48 = var47.i;
      /* 4: splatbl */
      var49.i =
          ((var48 & 0xff) << 24) | ((var48 & 0xff) << 16) | ((var48 & 0xff) <<
          8) | (var48 & 0xff);
      /* 5: convubw */
      var50.x4[0] = (orc_uint8) var49.x4[0];
      var50.x4[1] = (orc_uint8) var49.x4[1];
      var50.x4[2] = (orc_uint8) var49.x4[2];
      var50.x4[3] = (orc_uint8) var49.x4[3];
      /* 7: mullw */
      var51.x4[0] = (var50.x4[0] * var42.x4[0]) & 0xffff;
      var51.x4[1] = (var50.x4[1] * var42.x4[1]) & 0xffff;
      var51.x4[2] = (var50.x4[2] * var42.x4[2]) & 0xffff;
      var51.x4[3] = (var50.x4[3] * var42.x4[3]) & 0xffff;
      /* 8: shruw */
      var52.x4[0] = ((orc_uint16) var51.x4[0]) >> 8;
      var52.x4[1] = ((orc_uint16) var51.x4[1]) >> 8;
      var52.x4[2] = ((orc_uint16) var51.x4[2]) >> 8;
      var52.x4[3] = ((orc_uint16) var51.x4[3]) >> 8;
      /* 9: convubw */
      var53.x4[0] = (orc_uint8) var45.x4[0];
      var53.x4[1] = (orc_uint8) var45.x4[1];
      var53.x4[2] = (orc_uint8) var45.x4[2];
      var53.x4[3] = (orc_uint8) var45.x4[3];
      /* 10: mullw */
      var54.x4[0] = (var53.x4[0] * var52.x4[0]) & 0xffff;
      var54.x4[1] = (var53.x4[1] * var52.x4[1]) & 0xffff;
      var54.x4[2] = (var53.x4[2] * var52.x4[2]) & 0xffff;
      var54.x4[3] = (var53.x4[3] * var52.x4[3]) & 0xffff;
      /* 12: convubw */
      var56.x4[0] = (orc_uint8) var55.x4[0];
      var56.x4[1] = (orc_uint8) var55.x4[1];
      var56.x4[2] = (orc_uint8) var55.x4[2];
      var56.x4[3] = (orc_uint8) var55.x4[3];
      /* 13: subw */
      var57.x4[0] = var56.x4[0] - var52.x4[0];
      var57.x4[1] = var56.x4[1] - var52.x4[1];
      var57.x4[2] = var56.x4[2] - var52.x4[2];
      var57.x4[3] = var56.x4[3] - var52.x4[3];
      /* 14: loadl */
      var58 = ptr0[i];
      /* 15: shrul */
      var59.i = ((orc_uint32) var58.i) >> 24;
      /* 16: convlw */
      var60.i = var59.i;
      /* 17: convwb */
      var61 = var60.i;
      /* 18: splatbl */
      var62.i =
          ((var61 & 0xff) << 24) | ((var61 & 0xff) << 16) | ((var61 & 0xff) <<
          8) | (var61 & 0xff);
      /* 19: convubw */
      var63.x4[0] = (orc_uint8) var62.x4[0];
      var63.x4[1] = (orc_uint8) var62.x4[1];
      var63.x4[2] = (orc_uint8) var62.x4[2];
      var63.x4[3] = (orc_uint8) var62.x4[3];
      /* 20: mullw */
      var64.x4[0] = (var63.x4[0] * var57.x4[0]) & 0xffff;
      var64.x4[1] = (var63.x4[1] * var57.x4[1]) & 0xffff;
      var64.x4[2] = (var63.x4[2] * var57.x4[2]) & 0xffff;
      var64.x4[3] = (var63.x4[3] * var57.x4[3]) & 0xffff;
      /* 21: div255w */
      var65.x4[0] =
          ((orc_uint16) (((orc_uint16) (var64.x4[0] + 128)) +
              (((orc_uint16) (var64.x4[0] + 128)) >> 8))) >> 8;
      var65.x4[1] =
          ((orc_uint16) (((orc_uint16) (var64.x4[1] + 128)) +
              (((orc_uint16) (var64.x4[1] + 128)) >> 8))) >> 8;
      var65.x4[2] =
          ((orc_uint16) (((orc_uint16) (var64.x4[2] + 128)) +
              (((orc_uint16) (var64.x4[2] + 128)) >> 8))) >> 8;
      var65.x4[3] =
          ((orc_uint16) (((orc_uint16) (var64.x4[3] + 128)) +
              (((orc_uint16) (var64.x4[3] + 128)) >> 8))) >> 8;
      /* 22: convubw */
      var66.x4[0] = (orc_uint8) var58.x4[0];
      var66.x4[1] = (orc_uint8) var58.x4[1];
      var66.x4[2] = (orc_uint8) var58.x4[2];
      var66.x4[3] = (orc_uint8) var58.x4[3];
      /* 23: mullw */
      var67.x4[0] = (var66.x4[0] * var65.x4[0]) & 0xffff;
      var67.x4[1] = (var66.x4[1] * var65.x4[1]) & 0xffff;
      var67.x4[2] = (var66.x4[2] * var65.x4[2]) & 0xffff;
      var67.x4[3] = (var66.x4[3] * var65.x4[3]) & 0xffff;
      /* 24: addw */
      var68.x4[0] = var67.x4[0] + var54.x4[0];
      var68.x4[1] = var67.x4[1] + var54.x4[1];
      var68.x4[2] = var67.x4[2] + var54.x4[2];
      var68.x4[3] = var67.x4[3] + var54.x4[3];
      /* 25: addw */
      var69.x4[0] = var65.x4[0] + var52.x4[0];
      var69.x4[1] = var65.x4[1] + var52.x4[1];
      var69.x4[2] = var65.x4[2] + var52.x4[2];
      var69.x4[3] = var65.x4[3] + var52.x4[3];
      /* 26: divluw */
      var70.x4[0] =
          ((var69.x4[0] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[0]) /
          ((orc_uint16) var69.x4[0] & 0xff));
      var70.x4[1] =
          ((var69.x4[1] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[1]) /
          ((orc_uint16) var69.x4[1] & 0xff));
      var70.x4[2] =
          ((var69.x4[2] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[2]) /
          ((orc_uint16) var69.x4[2] & 0xff));
      var70.x4[3] =
          ((var69.x4[3] & 0xff) ==
          0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[3]) /
          ((orc_uint16) var69.x4[3] & 0xff));
      /* 27: convwb */
      var71.x4[0] = var70.x4[0];
      var71.x4[1] = var70.x4[1];
      var71.x4[2] = var70.x4[2];
      var71.x4[3] = var70.x4[3];
      /* 29: andl */
      var72.i = var71.i & var43.i;
      /* 30: convwb */
      var73.x4[0] = var69.x4[0];
      var73.x4[1] = var69.x4[1];
      var73.x4[2] = var69.x4[2];
      var73.x4[3] = var69.x4[3];
      /* 32: andl */
      var74.i = var73.i & var44.i;
      /* 33: orl */
      var75.i = var72.i | var74.i;
      /* 34: storel */
      ptr0[i] = var75;
    }
  }

}

void
video_mixer_orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
    const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
{
  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;

      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "video_mixer_orc_overlay_bgra");
      orc_program_set_backup_function (p, _backup_video_mixer_orc_overlay_bgra);
      orc_program_add_destination (p, 4, "d1");
      orc_program_add_source (p, 4, "s1");
      orc_program_add_constant (p, 4, 0xffffffff, "c1");
      orc_program_add_constant (p, 4, 0xff000000, "c2");
      orc_program_add_constant (p, 4, 0x00ffffff, "c3");
      orc_program_add_constant (p, 4, 0x00000018, "c4");
      orc_program_add_constant (p, 4, 0x00000008, "c5");
      orc_program_add_parameter (p, 2, "p1");
      orc_program_add_temporary (p, 4, "t1");
      orc_program_add_temporary (p, 4, "t2");
      orc_program_add_temporary (p, 2, "t3");
      orc_program_add_temporary (p, 1, "t4");
      orc_program_add_temporary (p, 8, "t5");
      orc_program_add_temporary (p, 8, "t6");
      orc_program_add_temporary (p, 8, "t7");
      orc_program_add_temporary (p, 4, "t8");
      orc_program_add_temporary (p, 8, "t9");
      orc_program_add_temporary (p, 8, "t10");

      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C4,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T8, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_P1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shruw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_C5,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T10, ORC_VAR_T1,
          ORC_VAR_D1, ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T10, ORC_VAR_T10, ORC_VAR_T5,
          ORC_VAR_D1);
      orc_program_append_2 (p, "loadpl", 0, ORC_VAR_T8, ORC_VAR_C1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T8, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "subw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5,
          ORC_VAR_D1);
      orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C4,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6,
          ORC_VAR_D1);
      orc_program_append_2 (p, "div255w", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convubw", 2, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "mullw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T7,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T10,
          ORC_VAR_D1);
      orc_program_append_2 (p, "addw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T5,
          ORC_VAR_D1);
      orc_program_append_2 (p, "divluw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T7,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "andl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C3,
          ORC_VAR_D1);
      orc_program_append_2 (p, "convwb", 2, ORC_VAR_T8, ORC_VAR_T7, ORC_VAR_D1,
          ORC_VAR_D1);
      orc_program_append_2 (p, "andl", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_C2,
          ORC_VAR_D1);
      orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T8,
          ORC_VAR_D1);
      orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
          ORC_VAR_D1);

      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;
  ORC_EXECUTOR_M (ex) = m;
  ex->arrays[ORC_VAR_D1] = d1;
  ex->params[ORC_VAR_D1] = d1_stride;
  ex->arrays[ORC_VAR_S1] = (void *) s1;
  ex->params[ORC_VAR_S1] = s1_stride;
  ex->params[ORC_VAR_P1] = p1;

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