
/* autogenerated from compositororc.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 compositor_orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n);
void compositor_orc_memcpy_u32 (guint32 * ORC_RESTRICT d1,
    const guint32 * ORC_RESTRICT s1, int n);
void compositor_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 compositor_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 compositor_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 compositor_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 compositor_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)&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 */



/* compositor_orc_splat_u32 */
#ifdef DISABLE_ORC
void
compositor_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_compositor_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
compositor_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;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 24, 99, 111, 109, 112, 111, 115, 105, 116, 111, 114, 95, 111, 114,
        99, 95, 115, 112, 108, 97, 116, 95, 117, 51, 50, 11, 4, 4, 16, 4,
        112, 0, 24, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_compositor_orc_splat_u32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "compositor_orc_splat_u32");
      orc_program_set_backup_function (p, _backup_compositor_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);
#endif

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

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

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


/* compositor_orc_memcpy_u32 */
#ifdef DISABLE_ORC
void
compositor_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_compositor_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
compositor_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;

#if 1
      static const orc_uint8 bc[] = {
        1, 9, 25, 99, 111, 109, 112, 111, 115, 105, 116, 111, 114, 95, 111, 114,
        99, 95, 109, 101, 109, 99, 112, 121, 95, 117, 51, 50, 11, 4, 4, 12,
        4, 4, 112, 0, 4, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_compositor_orc_memcpy_u32);
#else
      p = orc_program_new ();
      orc_program_set_name (p, "compositor_orc_memcpy_u32");
      orc_program_set_backup_function (p, _backup_compositor_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);
#endif

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

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

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


/* compositor_orc_blend_u8 */
#ifdef DISABLE_ORC
void
compositor_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 = ((orc_uint16) 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_compositor_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 = ((orc_uint16) 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
compositor_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;

#if 1
      static const orc_uint8 bc[] = {
        1, 7, 9, 23, 99, 111, 109, 112, 111, 115, 105, 116, 111, 114, 95, 111,
        114, 99, 95, 98, 108, 101, 110, 100, 95, 117, 56, 11, 1, 1, 12, 1,
        1, 14, 1, 8, 0, 0, 0, 16, 2, 20, 2, 20, 2, 150, 32, 0,
        150, 33, 4, 98, 33, 33, 32, 89, 33, 33, 24, 93, 32, 32, 16, 70,
        33, 32, 33, 95, 33, 33, 16, 160, 0, 33, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_compositor_orc_blend_u8);
#else
      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "compositor_orc_blend_u8");
      orc_program_set_backup_function (p, _backup_compositor_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);
#endif

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

  ex->n = n;
  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


/* compositor_orc_blend_argb */
#ifdef DISABLE_ORC
void
compositor_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;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var40;
#else
  orc_union32 var40;
#endif
  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 =
          ((((orc_uint32) var43) & 0xff) << 24) | ((((orc_uint32) var43) & 0xff)
          << 16) | ((((orc_uint32) var43) & 0xff) << 8) | (((orc_uint32) 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_compositor_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;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var40;
#else
  orc_union32 var40;
#endif
  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 =
          ((((orc_uint32) var43) & 0xff) << 24) | ((((orc_uint32) var43) & 0xff)
          << 16) | ((((orc_uint32) var43) & 0xff) << 8) | (((orc_uint32) 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
compositor_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;

#if 1
      static const orc_uint8 bc[] = {
        1, 7, 9, 25, 99, 111, 109, 112, 111, 115, 105, 116, 111, 114, 95, 111,
        114, 99, 95, 98, 108, 101, 110, 100, 95, 97, 114, 103, 98, 11, 4, 4,
        12, 4, 4, 14, 4, 255, 0, 0, 0, 14, 2, 8, 0, 0, 0, 16,
        2, 20, 4, 20, 2, 20, 1, 20, 4, 20, 8, 20, 8, 20, 8, 113,
        32, 4, 163, 33, 32, 157, 34, 33, 152, 35, 34, 21, 2, 150, 38, 35,
        21, 2, 89, 38, 38, 24, 21, 2, 95, 38, 38, 17, 21, 2, 150, 37,
        32, 113, 32, 0, 21, 2, 150, 36, 32, 21, 2, 98, 37, 37, 36, 21,
        2, 89, 37, 37, 38, 21, 2, 80, 37, 37, 21, 2, 70, 36, 36, 37,
        21, 2, 157, 32, 36, 123, 32, 32, 16, 128, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_compositor_orc_blend_argb);
#else
      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "compositor_orc_blend_argb");
      orc_program_set_backup_function (p, _backup_compositor_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, 2, 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);
#endif

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

  ex->n = n;
  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


/* compositor_orc_blend_bgra */
#ifdef DISABLE_ORC
void
compositor_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;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var41;
#else
  orc_union32 var41;
#endif
  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 =
          ((((orc_uint32) var45) & 0xff) << 24) | ((((orc_uint32) var45) & 0xff)
          << 16) | ((((orc_uint32) var45) & 0xff) << 8) | (((orc_uint32) 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_compositor_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;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var41;
#else
  orc_union32 var41;
#endif
  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 =
          ((((orc_uint32) var45) & 0xff) << 24) | ((((orc_uint32) var45) & 0xff)
          << 16) | ((((orc_uint32) var45) & 0xff) << 8) | (((orc_uint32) 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
compositor_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;

#if 1
      static const orc_uint8 bc[] = {
        1, 7, 9, 25, 99, 111, 109, 112, 111, 115, 105, 116, 111, 114, 95, 111,
        114, 99, 95, 98, 108, 101, 110, 100, 95, 98, 103, 114, 97, 11, 4, 4,
        12, 4, 4, 14, 4, 0, 0, 0, 255, 14, 4, 24, 0, 0, 0, 14,
        2, 8, 0, 0, 0, 16, 2, 20, 4, 20, 4, 20, 2, 20, 1, 20,
        4, 20, 8, 20, 8, 20, 8, 113, 32, 4, 126, 33, 32, 17, 163, 34,
        33, 157, 35, 34, 152, 36, 35, 21, 2, 150, 39, 36, 21, 2, 89, 39,
        39, 24, 21, 2, 95, 39, 39, 18, 21, 2, 150, 38, 32, 113, 32, 0,
        21, 2, 150, 37, 32, 21, 2, 98, 38, 38, 37, 21, 2, 89, 38, 38,
        39, 21, 2, 80, 38, 38, 21, 2, 70, 37, 37, 38, 21, 2, 157, 32,
        37, 123, 32, 32, 16, 128, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_compositor_orc_blend_bgra);
#else
      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "compositor_orc_blend_bgra");
      orc_program_set_backup_function (p, _backup_compositor_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, 2, 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);
#endif

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

  ex->n = n;
  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


/* compositor_orc_overlay_argb */
#ifdef DISABLE_ORC
void
compositor_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;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var42;
#else
  orc_union32 var42;
#endif
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var43;
#else
  orc_union32 var43;
#endif
  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 =
          ((((orc_uint32) var46) & 0xff) << 24) | ((((orc_uint32) var46) & 0xff)
          << 16) | ((((orc_uint32) var46) & 0xff) << 8) | (((orc_uint32) 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 =
          ((((orc_uint32) var58) & 0xff) << 24) | ((((orc_uint32) var58) & 0xff)
          << 16) | ((((orc_uint32) var58) & 0xff) << 8) | (((orc_uint32) 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_compositor_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;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var42;
#else
  orc_union32 var42;
#endif
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var43;
#else
  orc_union32 var43;
#endif
  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 =
          ((((orc_uint32) var46) & 0xff) << 24) | ((((orc_uint32) var46) & 0xff)
          << 16) | ((((orc_uint32) var46) & 0xff) << 8) | (((orc_uint32) 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 =
          ((((orc_uint32) var58) & 0xff) << 24) | ((((orc_uint32) var58) & 0xff)
          << 16) | ((((orc_uint32) var58) & 0xff) << 8) | (((orc_uint32) 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
compositor_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;

#if 1
      static const orc_uint8 bc[] = {
        1, 7, 9, 27, 99, 111, 109, 112, 111, 115, 105, 116, 111, 114, 95, 111,
        114, 99, 95, 111, 118, 101, 114, 108, 97, 121, 95, 97, 114, 103, 98, 11,
        4, 4, 12, 4, 4, 14, 4, 255, 255, 255, 255, 14, 4, 255, 0, 0,
        0, 14, 4, 0, 255, 255, 255, 14, 2, 8, 0, 0, 0, 16, 2, 20,
        4, 20, 2, 20, 1, 20, 8, 20, 8, 20, 8, 20, 4, 20, 8, 20,
        8, 113, 32, 4, 163, 33, 32, 157, 34, 33, 152, 38, 34, 21, 2, 150,
        35, 38, 21, 2, 89, 35, 35, 24, 21, 2, 95, 35, 35, 19, 21, 2,
        150, 40, 32, 21, 2, 89, 40, 40, 35, 115, 38, 16, 21, 2, 150, 36,
        38, 21, 2, 98, 36, 36, 35, 113, 32, 0, 163, 33, 32, 157, 34, 33,
        152, 38, 34, 21, 2, 150, 37, 38, 21, 2, 89, 37, 37, 36, 21, 2,
        80, 37, 37, 21, 2, 150, 39, 32, 21, 2, 89, 39, 39, 37, 21, 2,
        70, 39, 39, 40, 21, 2, 70, 37, 37, 35, 21, 2, 81, 39, 39, 37,
        21, 2, 157, 32, 39, 106, 32, 32, 18, 21, 2, 157, 38, 37, 106, 38,
        38, 17, 123, 32, 32, 38, 128, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_compositor_orc_overlay_argb);
#else
      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "compositor_orc_overlay_argb");
      orc_program_set_backup_function (p, _backup_compositor_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, 2, 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);
#endif

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

  ex->n = n;
  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


/* compositor_orc_overlay_bgra */
#ifdef DISABLE_ORC
void
compositor_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;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var43;
#else
  orc_union32 var43;
#endif
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var44;
#else
  orc_union32 var44;
#endif
  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 =
          ((((orc_uint32) var48) & 0xff) << 24) | ((((orc_uint32) var48) & 0xff)
          << 16) | ((((orc_uint32) var48) & 0xff) << 8) | (((orc_uint32) 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 =
          ((((orc_uint32) var61) & 0xff) << 24) | ((((orc_uint32) var61) & 0xff)
          << 16) | ((((orc_uint32) var61) & 0xff) << 8) | (((orc_uint32) 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_compositor_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;
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var43;
#else
  orc_union32 var43;
#endif
#if defined(__APPLE__) && __GNUC__ == 4 && __GNUC_MINOR__ == 2 && defined (__i386__)
  volatile orc_union32 var44;
#else
  orc_union32 var44;
#endif
  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 =
          ((((orc_uint32) var48) & 0xff) << 24) | ((((orc_uint32) var48) & 0xff)
          << 16) | ((((orc_uint32) var48) & 0xff) << 8) | (((orc_uint32) 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 =
          ((((orc_uint32) var61) & 0xff) << 24) | ((((orc_uint32) var61) & 0xff)
          << 16) | ((((orc_uint32) var61) & 0xff) << 8) | (((orc_uint32) 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
compositor_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;

#if 1
      static const orc_uint8 bc[] = {
        1, 7, 9, 27, 99, 111, 109, 112, 111, 115, 105, 116, 111, 114, 95, 111,
        114, 99, 95, 111, 118, 101, 114, 108, 97, 121, 95, 98, 103, 114, 97, 11,
        4, 4, 12, 4, 4, 14, 4, 255, 255, 255, 255, 14, 4, 0, 0, 0,
        255, 14, 4, 255, 255, 255, 0, 14, 4, 24, 0, 0, 0, 14, 2, 8,
        0, 0, 0, 16, 2, 20, 4, 20, 4, 20, 2, 20, 1, 20, 8, 20,
        8, 20, 8, 20, 4, 20, 8, 20, 8, 113, 32, 4, 126, 33, 32, 19,
        163, 34, 33, 157, 35, 34, 152, 39, 35, 21, 2, 150, 36, 39, 21, 2,
        89, 36, 36, 24, 21, 2, 95, 36, 36, 20, 21, 2, 150, 41, 32, 21,
        2, 89, 41, 41, 36, 115, 39, 16, 21, 2, 150, 37, 39, 21, 2, 98,
        37, 37, 36, 113, 32, 0, 126, 33, 32, 19, 163, 34, 33, 157, 35, 34,
        152, 39, 35, 21, 2, 150, 38, 39, 21, 2, 89, 38, 38, 37, 21, 2,
        80, 38, 38, 21, 2, 150, 40, 32, 21, 2, 89, 40, 40, 38, 21, 2,
        70, 40, 40, 41, 21, 2, 70, 38, 38, 36, 21, 2, 81, 40, 40, 38,
        21, 2, 157, 32, 40, 106, 32, 32, 18, 21, 2, 157, 39, 38, 106, 39,
        39, 17, 123, 32, 32, 39, 128, 0, 32, 2, 0,
      };
      p = orc_program_new_from_static_bytecode (bc);
      orc_program_set_backup_function (p, _backup_compositor_orc_overlay_bgra);
#else
      p = orc_program_new ();
      orc_program_set_2d (p);
      orc_program_set_name (p, "compositor_orc_overlay_bgra");
      orc_program_set_backup_function (p, _backup_compositor_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, 2, 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);
#endif

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

  ex->n = n;
  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
