gst: update disted orc files
[platform/upstream/gstreamer.git] / gst / videomixer / blendorc-dist.c
1
2 /* autogenerated from blendorc.orc */
3
4 #ifdef HAVE_CONFIG_H
5 #include "config.h"
6 #endif
7 #include <glib.h>
8
9 #ifndef _ORC_INTEGER_TYPEDEFS_
10 #define _ORC_INTEGER_TYPEDEFS_
11 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
12 #include <stdint.h>
13 typedef int8_t orc_int8;
14 typedef int16_t orc_int16;
15 typedef int32_t orc_int32;
16 typedef int64_t orc_int64;
17 typedef uint8_t orc_uint8;
18 typedef uint16_t orc_uint16;
19 typedef uint32_t orc_uint32;
20 typedef uint64_t orc_uint64;
21 #define ORC_UINT64_C(x) UINT64_C(x)
22 #elif defined(_MSC_VER)
23 typedef signed __int8 orc_int8;
24 typedef signed __int16 orc_int16;
25 typedef signed __int32 orc_int32;
26 typedef signed __int64 orc_int64;
27 typedef unsigned __int8 orc_uint8;
28 typedef unsigned __int16 orc_uint16;
29 typedef unsigned __int32 orc_uint32;
30 typedef unsigned __int64 orc_uint64;
31 #define ORC_UINT64_C(x) (x##Ui64)
32 #define inline __inline
33 #else
34 #include <limits.h>
35 typedef signed char orc_int8;
36 typedef short orc_int16;
37 typedef int orc_int32;
38 typedef unsigned char orc_uint8;
39 typedef unsigned short orc_uint16;
40 typedef unsigned int orc_uint32;
41 #if INT_MAX == LONG_MAX
42 typedef long long orc_int64;
43 typedef unsigned long long orc_uint64;
44 #define ORC_UINT64_C(x) (x##ULL)
45 #else
46 typedef long orc_int64;
47 typedef unsigned long orc_uint64;
48 #define ORC_UINT64_C(x) (x##UL)
49 #endif
50 #endif
51 typedef union
52 {
53   orc_int16 i;
54   orc_int8 x2[2];
55 } orc_union16;
56 typedef union
57 {
58   orc_int32 i;
59   float f;
60   orc_int16 x2[2];
61   orc_int8 x4[4];
62 } orc_union32;
63 typedef union
64 {
65   orc_int64 i;
66   double f;
67   orc_int32 x2[2];
68   float x2f[2];
69   orc_int16 x4[4];
70 } orc_union64;
71 #endif
72 #ifndef ORC_RESTRICT
73 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
74 #define ORC_RESTRICT restrict
75 #elif defined(__GNUC__) && __GNUC__ >= 4
76 #define ORC_RESTRICT __restrict__
77 #else
78 #define ORC_RESTRICT
79 #endif
80 #endif
81
82 #ifndef DISABLE_ORC
83 #include <orc/orc.h>
84 #endif
85 void video_mixer_orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n);
86 void video_mixer_orc_memcpy_u32 (guint32 * ORC_RESTRICT d1,
87     const guint32 * ORC_RESTRICT s1, int n);
88 void video_mixer_orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride,
89     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
90 void video_mixer_orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
91     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
92 void video_mixer_orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
93     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
94 void video_mixer_orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
95     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
96 void video_mixer_orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
97     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m);
98
99
100 /* begin Orc C target preamble */
101 #define ORC_CLAMP(x,a,b) ((x)<(a) ? (a) : ((x)>(b) ? (b) : (x)))
102 #define ORC_ABS(a) ((a)<0 ? -(a) : (a))
103 #define ORC_MIN(a,b) ((a)<(b) ? (a) : (b))
104 #define ORC_MAX(a,b) ((a)>(b) ? (a) : (b))
105 #define ORC_SB_MAX 127
106 #define ORC_SB_MIN (-1-ORC_SB_MAX)
107 #define ORC_UB_MAX 255
108 #define ORC_UB_MIN 0
109 #define ORC_SW_MAX 32767
110 #define ORC_SW_MIN (-1-ORC_SW_MAX)
111 #define ORC_UW_MAX 65535
112 #define ORC_UW_MIN 0
113 #define ORC_SL_MAX 2147483647
114 #define ORC_SL_MIN (-1-ORC_SL_MAX)
115 #define ORC_UL_MAX 4294967295U
116 #define ORC_UL_MIN 0
117 #define ORC_CLAMP_SB(x) ORC_CLAMP(x,ORC_SB_MIN,ORC_SB_MAX)
118 #define ORC_CLAMP_UB(x) ORC_CLAMP(x,ORC_UB_MIN,ORC_UB_MAX)
119 #define ORC_CLAMP_SW(x) ORC_CLAMP(x,ORC_SW_MIN,ORC_SW_MAX)
120 #define ORC_CLAMP_UW(x) ORC_CLAMP(x,ORC_UW_MIN,ORC_UW_MAX)
121 #define ORC_CLAMP_SL(x) ORC_CLAMP(x,ORC_SL_MIN,ORC_SL_MAX)
122 #define ORC_CLAMP_UL(x) ORC_CLAMP(x,ORC_UL_MIN,ORC_UL_MAX)
123 #define ORC_SWAP_W(x) ((((x)&0xff)<<8) | (((x)&0xff00)>>8))
124 #define ORC_SWAP_L(x) ((((x)&0xff)<<24) | (((x)&0xff00)<<8) | (((x)&0xff0000)>>8) | (((x)&0xff000000)>>24))
125 #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))
126 #define ORC_PTR_OFFSET(ptr,offset) ((void *)(((unsigned char *)(ptr)) + (offset)))
127 #define ORC_DENORMAL(x) ((x) & ((((x)&0x7f800000) == 0) ? 0xff800000 : 0xffffffff))
128 #define ORC_ISNAN(x) ((((x)&0x7f800000) == 0x7f800000) && (((x)&0x007fffff) != 0))
129 #define ORC_DENORMAL_DOUBLE(x) ((x) & ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == 0) ? ORC_UINT64_C(0xfff0000000000000) : ORC_UINT64_C(0xffffffffffffffff)))
130 #define ORC_ISNAN_DOUBLE(x) ((((x)&ORC_UINT64_C(0x7ff0000000000000)) == ORC_UINT64_C(0x7ff0000000000000)) && (((x)&ORC_UINT64_C(0x000fffffffffffff)) != 0))
131 #ifndef ORC_RESTRICT
132 #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
133 #define ORC_RESTRICT restrict
134 #elif defined(__GNUC__) && __GNUC__ >= 4
135 #define ORC_RESTRICT __restrict__
136 #else
137 #define ORC_RESTRICT
138 #endif
139 #endif
140 /* end Orc C target preamble */
141
142
143
144 /* video_mixer_orc_splat_u32 */
145 #ifdef DISABLE_ORC
146 void
147 video_mixer_orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n)
148 {
149   int i;
150   orc_union32 *ORC_RESTRICT ptr0;
151   orc_union32 var32;
152   orc_union32 var33;
153
154   ptr0 = (orc_union32 *) d1;
155
156   /* 0: loadpl */
157   var32.i = p1;
158
159   for (i = 0; i < n; i++) {
160     /* 1: copyl */
161     var33.i = var32.i;
162     /* 2: storel */
163     ptr0[i] = var33;
164   }
165
166 }
167
168 #else
169 static void
170 _backup_video_mixer_orc_splat_u32 (OrcExecutor * ORC_RESTRICT ex)
171 {
172   int i;
173   int n = ex->n;
174   orc_union32 *ORC_RESTRICT ptr0;
175   orc_union32 var32;
176   orc_union32 var33;
177
178   ptr0 = (orc_union32 *) ex->arrays[0];
179
180   /* 0: loadpl */
181   var32.i = ex->params[24];
182
183   for (i = 0; i < n; i++) {
184     /* 1: copyl */
185     var33.i = var32.i;
186     /* 2: storel */
187     ptr0[i] = var33;
188   }
189
190 }
191
192 void
193 video_mixer_orc_splat_u32 (guint32 * ORC_RESTRICT d1, int p1, int n)
194 {
195   OrcExecutor _ex, *ex = &_ex;
196   static volatile int p_inited = 0;
197   static OrcCode *c = 0;
198   void (*func) (OrcExecutor *);
199
200   if (!p_inited) {
201     orc_once_mutex_lock ();
202     if (!p_inited) {
203       OrcProgram *p;
204
205       p = orc_program_new ();
206       orc_program_set_name (p, "video_mixer_orc_splat_u32");
207       orc_program_set_backup_function (p, _backup_video_mixer_orc_splat_u32);
208       orc_program_add_destination (p, 4, "d1");
209       orc_program_add_parameter (p, 4, "p1");
210
211       orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_P1, ORC_VAR_D1,
212           ORC_VAR_D1);
213
214       orc_program_compile (p);
215       c = orc_program_take_code (p);
216       orc_program_free (p);
217     }
218     p_inited = TRUE;
219     orc_once_mutex_unlock ();
220   }
221   ex->arrays[ORC_VAR_A2] = c;
222   ex->program = 0;
223
224   ex->n = n;
225   ex->arrays[ORC_VAR_D1] = d1;
226   ex->params[ORC_VAR_P1] = p1;
227
228   func = c->exec;
229   func (ex);
230 }
231 #endif
232
233
234 /* video_mixer_orc_memcpy_u32 */
235 #ifdef DISABLE_ORC
236 void
237 video_mixer_orc_memcpy_u32 (guint32 * ORC_RESTRICT d1,
238     const guint32 * ORC_RESTRICT s1, int n)
239 {
240   int i;
241   orc_union32 *ORC_RESTRICT ptr0;
242   const orc_union32 *ORC_RESTRICT ptr4;
243   orc_union32 var32;
244   orc_union32 var33;
245
246   ptr0 = (orc_union32 *) d1;
247   ptr4 = (orc_union32 *) s1;
248
249
250   for (i = 0; i < n; i++) {
251     /* 0: loadl */
252     var32 = ptr4[i];
253     /* 1: copyl */
254     var33.i = var32.i;
255     /* 2: storel */
256     ptr0[i] = var33;
257   }
258
259 }
260
261 #else
262 static void
263 _backup_video_mixer_orc_memcpy_u32 (OrcExecutor * ORC_RESTRICT ex)
264 {
265   int i;
266   int n = ex->n;
267   orc_union32 *ORC_RESTRICT ptr0;
268   const orc_union32 *ORC_RESTRICT ptr4;
269   orc_union32 var32;
270   orc_union32 var33;
271
272   ptr0 = (orc_union32 *) ex->arrays[0];
273   ptr4 = (orc_union32 *) ex->arrays[4];
274
275
276   for (i = 0; i < n; i++) {
277     /* 0: loadl */
278     var32 = ptr4[i];
279     /* 1: copyl */
280     var33.i = var32.i;
281     /* 2: storel */
282     ptr0[i] = var33;
283   }
284
285 }
286
287 void
288 video_mixer_orc_memcpy_u32 (guint32 * ORC_RESTRICT d1,
289     const guint32 * ORC_RESTRICT s1, int n)
290 {
291   OrcExecutor _ex, *ex = &_ex;
292   static volatile int p_inited = 0;
293   static OrcCode *c = 0;
294   void (*func) (OrcExecutor *);
295
296   if (!p_inited) {
297     orc_once_mutex_lock ();
298     if (!p_inited) {
299       OrcProgram *p;
300
301       p = orc_program_new ();
302       orc_program_set_name (p, "video_mixer_orc_memcpy_u32");
303       orc_program_set_backup_function (p, _backup_video_mixer_orc_memcpy_u32);
304       orc_program_add_destination (p, 4, "d1");
305       orc_program_add_source (p, 4, "s1");
306
307       orc_program_append_2 (p, "copyl", 0, ORC_VAR_D1, ORC_VAR_S1, ORC_VAR_D1,
308           ORC_VAR_D1);
309
310       orc_program_compile (p);
311       c = orc_program_take_code (p);
312       orc_program_free (p);
313     }
314     p_inited = TRUE;
315     orc_once_mutex_unlock ();
316   }
317   ex->arrays[ORC_VAR_A2] = c;
318   ex->program = 0;
319
320   ex->n = n;
321   ex->arrays[ORC_VAR_D1] = d1;
322   ex->arrays[ORC_VAR_S1] = (void *) s1;
323
324   func = c->exec;
325   func (ex);
326 }
327 #endif
328
329
330 /* video_mixer_orc_blend_u8 */
331 #ifdef DISABLE_ORC
332 void
333 video_mixer_orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride,
334     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
335 {
336   int i;
337   int j;
338   orc_int8 *ORC_RESTRICT ptr0;
339   const orc_int8 *ORC_RESTRICT ptr4;
340   orc_int8 var34;
341   orc_int8 var35;
342   orc_union16 var36;
343   orc_int8 var37;
344   orc_union16 var38;
345   orc_union16 var39;
346   orc_union16 var40;
347   orc_union16 var41;
348   orc_union16 var42;
349   orc_union16 var43;
350   orc_union16 var44;
351
352   for (j = 0; j < m; j++) {
353     ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
354     ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
355
356     /* 5: loadpw */
357     var36.i = p1;
358
359     for (i = 0; i < n; i++) {
360       /* 0: loadb */
361       var34 = ptr0[i];
362       /* 1: convubw */
363       var38.i = (orc_uint8) var34;
364       /* 2: loadb */
365       var35 = ptr4[i];
366       /* 3: convubw */
367       var39.i = (orc_uint8) var35;
368       /* 4: subw */
369       var40.i = var39.i - var38.i;
370       /* 6: mullw */
371       var41.i = (var40.i * var36.i) & 0xffff;
372       /* 7: shlw */
373       var42.i = var38.i << 8;
374       /* 8: addw */
375       var43.i = var42.i + var41.i;
376       /* 9: shruw */
377       var44.i = ((orc_uint16) var43.i) >> 8;
378       /* 10: convsuswb */
379       var37 = ORC_CLAMP_UB (var44.i);
380       /* 11: storeb */
381       ptr0[i] = var37;
382     }
383   }
384
385 }
386
387 #else
388 static void
389 _backup_video_mixer_orc_blend_u8 (OrcExecutor * ORC_RESTRICT ex)
390 {
391   int i;
392   int j;
393   int n = ex->n;
394   int m = ex->params[ORC_VAR_A1];
395   orc_int8 *ORC_RESTRICT ptr0;
396   const orc_int8 *ORC_RESTRICT ptr4;
397   orc_int8 var34;
398   orc_int8 var35;
399   orc_union16 var36;
400   orc_int8 var37;
401   orc_union16 var38;
402   orc_union16 var39;
403   orc_union16 var40;
404   orc_union16 var41;
405   orc_union16 var42;
406   orc_union16 var43;
407   orc_union16 var44;
408
409   for (j = 0; j < m; j++) {
410     ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
411     ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
412
413     /* 5: loadpw */
414     var36.i = ex->params[24];
415
416     for (i = 0; i < n; i++) {
417       /* 0: loadb */
418       var34 = ptr0[i];
419       /* 1: convubw */
420       var38.i = (orc_uint8) var34;
421       /* 2: loadb */
422       var35 = ptr4[i];
423       /* 3: convubw */
424       var39.i = (orc_uint8) var35;
425       /* 4: subw */
426       var40.i = var39.i - var38.i;
427       /* 6: mullw */
428       var41.i = (var40.i * var36.i) & 0xffff;
429       /* 7: shlw */
430       var42.i = var38.i << 8;
431       /* 8: addw */
432       var43.i = var42.i + var41.i;
433       /* 9: shruw */
434       var44.i = ((orc_uint16) var43.i) >> 8;
435       /* 10: convsuswb */
436       var37 = ORC_CLAMP_UB (var44.i);
437       /* 11: storeb */
438       ptr0[i] = var37;
439     }
440   }
441
442 }
443
444 void
445 video_mixer_orc_blend_u8 (guint8 * ORC_RESTRICT d1, int d1_stride,
446     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
447 {
448   OrcExecutor _ex, *ex = &_ex;
449   static volatile int p_inited = 0;
450   static OrcCode *c = 0;
451   void (*func) (OrcExecutor *);
452
453   if (!p_inited) {
454     orc_once_mutex_lock ();
455     if (!p_inited) {
456       OrcProgram *p;
457
458       p = orc_program_new ();
459       orc_program_set_2d (p);
460       orc_program_set_name (p, "video_mixer_orc_blend_u8");
461       orc_program_set_backup_function (p, _backup_video_mixer_orc_blend_u8);
462       orc_program_add_destination (p, 1, "d1");
463       orc_program_add_source (p, 1, "s1");
464       orc_program_add_constant (p, 1, 0x00000008, "c1");
465       orc_program_add_parameter (p, 2, "p1");
466       orc_program_add_temporary (p, 2, "t1");
467       orc_program_add_temporary (p, 2, "t2");
468
469       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
470           ORC_VAR_D1);
471       orc_program_append_2 (p, "convubw", 0, ORC_VAR_T2, ORC_VAR_S1, ORC_VAR_D1,
472           ORC_VAR_D1);
473       orc_program_append_2 (p, "subw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_T1,
474           ORC_VAR_D1);
475       orc_program_append_2 (p, "mullw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_P1,
476           ORC_VAR_D1);
477       orc_program_append_2 (p, "shlw", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
478           ORC_VAR_D1);
479       orc_program_append_2 (p, "addw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_T2,
480           ORC_VAR_D1);
481       orc_program_append_2 (p, "shruw", 0, ORC_VAR_T2, ORC_VAR_T2, ORC_VAR_C1,
482           ORC_VAR_D1);
483       orc_program_append_2 (p, "convsuswb", 0, ORC_VAR_D1, ORC_VAR_T2,
484           ORC_VAR_D1, ORC_VAR_D1);
485
486       orc_program_compile (p);
487       c = orc_program_take_code (p);
488       orc_program_free (p);
489     }
490     p_inited = TRUE;
491     orc_once_mutex_unlock ();
492   }
493   ex->arrays[ORC_VAR_A2] = c;
494   ex->program = 0;
495
496   ex->n = n;
497   ORC_EXECUTOR_M (ex) = m;
498   ex->arrays[ORC_VAR_D1] = d1;
499   ex->params[ORC_VAR_D1] = d1_stride;
500   ex->arrays[ORC_VAR_S1] = (void *) s1;
501   ex->params[ORC_VAR_S1] = s1_stride;
502   ex->params[ORC_VAR_P1] = p1;
503
504   func = c->exec;
505   func (ex);
506 }
507 #endif
508
509
510 /* video_mixer_orc_blend_argb */
511 #ifdef DISABLE_ORC
512 void
513 video_mixer_orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
514     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
515 {
516   int i;
517   int j;
518   orc_union32 *ORC_RESTRICT ptr0;
519   const orc_union32 *ORC_RESTRICT ptr4;
520   orc_union64 var39;
521   orc_union32 var40;
522   orc_union32 var41;
523   orc_union16 var42;
524   orc_int8 var43;
525   orc_union32 var44;
526   orc_union64 var45;
527   orc_union64 var46;
528   orc_union64 var47;
529   orc_union64 var48;
530   orc_union32 var49;
531   orc_union64 var50;
532   orc_union64 var51;
533   orc_union64 var52;
534   orc_union64 var53;
535   orc_union64 var54;
536   orc_union32 var55;
537   orc_union32 var56;
538
539   for (j = 0; j < m; j++) {
540     ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
541     ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
542
543     /* 5: loadpw */
544     var39.x4[0] = p1;
545     var39.x4[1] = p1;
546     var39.x4[2] = p1;
547     var39.x4[3] = p1;
548     /* 16: loadpl */
549     var40.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */
550
551     for (i = 0; i < n; i++) {
552       /* 0: loadl */
553       var41 = ptr4[i];
554       /* 1: convlw */
555       var42.i = var41.i;
556       /* 2: convwb */
557       var43 = var42.i;
558       /* 3: splatbl */
559       var44.i =
560           ((var43 & 0xff) << 24) | ((var43 & 0xff) << 16) | ((var43 & 0xff) <<
561           8) | (var43 & 0xff);
562       /* 4: convubw */
563       var45.x4[0] = (orc_uint8) var44.x4[0];
564       var45.x4[1] = (orc_uint8) var44.x4[1];
565       var45.x4[2] = (orc_uint8) var44.x4[2];
566       var45.x4[3] = (orc_uint8) var44.x4[3];
567       /* 6: mullw */
568       var46.x4[0] = (var45.x4[0] * var39.x4[0]) & 0xffff;
569       var46.x4[1] = (var45.x4[1] * var39.x4[1]) & 0xffff;
570       var46.x4[2] = (var45.x4[2] * var39.x4[2]) & 0xffff;
571       var46.x4[3] = (var45.x4[3] * var39.x4[3]) & 0xffff;
572       /* 7: shruw */
573       var47.x4[0] = ((orc_uint16) var46.x4[0]) >> 8;
574       var47.x4[1] = ((orc_uint16) var46.x4[1]) >> 8;
575       var47.x4[2] = ((orc_uint16) var46.x4[2]) >> 8;
576       var47.x4[3] = ((orc_uint16) var46.x4[3]) >> 8;
577       /* 8: convubw */
578       var48.x4[0] = (orc_uint8) var41.x4[0];
579       var48.x4[1] = (orc_uint8) var41.x4[1];
580       var48.x4[2] = (orc_uint8) var41.x4[2];
581       var48.x4[3] = (orc_uint8) var41.x4[3];
582       /* 9: loadl */
583       var49 = ptr0[i];
584       /* 10: convubw */
585       var50.x4[0] = (orc_uint8) var49.x4[0];
586       var50.x4[1] = (orc_uint8) var49.x4[1];
587       var50.x4[2] = (orc_uint8) var49.x4[2];
588       var50.x4[3] = (orc_uint8) var49.x4[3];
589       /* 11: subw */
590       var51.x4[0] = var48.x4[0] - var50.x4[0];
591       var51.x4[1] = var48.x4[1] - var50.x4[1];
592       var51.x4[2] = var48.x4[2] - var50.x4[2];
593       var51.x4[3] = var48.x4[3] - var50.x4[3];
594       /* 12: mullw */
595       var52.x4[0] = (var51.x4[0] * var47.x4[0]) & 0xffff;
596       var52.x4[1] = (var51.x4[1] * var47.x4[1]) & 0xffff;
597       var52.x4[2] = (var51.x4[2] * var47.x4[2]) & 0xffff;
598       var52.x4[3] = (var51.x4[3] * var47.x4[3]) & 0xffff;
599       /* 13: div255w */
600       var53.x4[0] =
601           ((orc_uint16) (((orc_uint16) (var52.x4[0] + 128)) +
602               (((orc_uint16) (var52.x4[0] + 128)) >> 8))) >> 8;
603       var53.x4[1] =
604           ((orc_uint16) (((orc_uint16) (var52.x4[1] + 128)) +
605               (((orc_uint16) (var52.x4[1] + 128)) >> 8))) >> 8;
606       var53.x4[2] =
607           ((orc_uint16) (((orc_uint16) (var52.x4[2] + 128)) +
608               (((orc_uint16) (var52.x4[2] + 128)) >> 8))) >> 8;
609       var53.x4[3] =
610           ((orc_uint16) (((orc_uint16) (var52.x4[3] + 128)) +
611               (((orc_uint16) (var52.x4[3] + 128)) >> 8))) >> 8;
612       /* 14: addw */
613       var54.x4[0] = var50.x4[0] + var53.x4[0];
614       var54.x4[1] = var50.x4[1] + var53.x4[1];
615       var54.x4[2] = var50.x4[2] + var53.x4[2];
616       var54.x4[3] = var50.x4[3] + var53.x4[3];
617       /* 15: convwb */
618       var55.x4[0] = var54.x4[0];
619       var55.x4[1] = var54.x4[1];
620       var55.x4[2] = var54.x4[2];
621       var55.x4[3] = var54.x4[3];
622       /* 17: orl */
623       var56.i = var55.i | var40.i;
624       /* 18: storel */
625       ptr0[i] = var56;
626     }
627   }
628
629 }
630
631 #else
632 static void
633 _backup_video_mixer_orc_blend_argb (OrcExecutor * ORC_RESTRICT ex)
634 {
635   int i;
636   int j;
637   int n = ex->n;
638   int m = ex->params[ORC_VAR_A1];
639   orc_union32 *ORC_RESTRICT ptr0;
640   const orc_union32 *ORC_RESTRICT ptr4;
641   orc_union64 var39;
642   orc_union32 var40;
643   orc_union32 var41;
644   orc_union16 var42;
645   orc_int8 var43;
646   orc_union32 var44;
647   orc_union64 var45;
648   orc_union64 var46;
649   orc_union64 var47;
650   orc_union64 var48;
651   orc_union32 var49;
652   orc_union64 var50;
653   orc_union64 var51;
654   orc_union64 var52;
655   orc_union64 var53;
656   orc_union64 var54;
657   orc_union32 var55;
658   orc_union32 var56;
659
660   for (j = 0; j < m; j++) {
661     ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
662     ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
663
664     /* 5: loadpw */
665     var39.x4[0] = ex->params[24];
666     var39.x4[1] = ex->params[24];
667     var39.x4[2] = ex->params[24];
668     var39.x4[3] = ex->params[24];
669     /* 16: loadpl */
670     var40.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */
671
672     for (i = 0; i < n; i++) {
673       /* 0: loadl */
674       var41 = ptr4[i];
675       /* 1: convlw */
676       var42.i = var41.i;
677       /* 2: convwb */
678       var43 = var42.i;
679       /* 3: splatbl */
680       var44.i =
681           ((var43 & 0xff) << 24) | ((var43 & 0xff) << 16) | ((var43 & 0xff) <<
682           8) | (var43 & 0xff);
683       /* 4: convubw */
684       var45.x4[0] = (orc_uint8) var44.x4[0];
685       var45.x4[1] = (orc_uint8) var44.x4[1];
686       var45.x4[2] = (orc_uint8) var44.x4[2];
687       var45.x4[3] = (orc_uint8) var44.x4[3];
688       /* 6: mullw */
689       var46.x4[0] = (var45.x4[0] * var39.x4[0]) & 0xffff;
690       var46.x4[1] = (var45.x4[1] * var39.x4[1]) & 0xffff;
691       var46.x4[2] = (var45.x4[2] * var39.x4[2]) & 0xffff;
692       var46.x4[3] = (var45.x4[3] * var39.x4[3]) & 0xffff;
693       /* 7: shruw */
694       var47.x4[0] = ((orc_uint16) var46.x4[0]) >> 8;
695       var47.x4[1] = ((orc_uint16) var46.x4[1]) >> 8;
696       var47.x4[2] = ((orc_uint16) var46.x4[2]) >> 8;
697       var47.x4[3] = ((orc_uint16) var46.x4[3]) >> 8;
698       /* 8: convubw */
699       var48.x4[0] = (orc_uint8) var41.x4[0];
700       var48.x4[1] = (orc_uint8) var41.x4[1];
701       var48.x4[2] = (orc_uint8) var41.x4[2];
702       var48.x4[3] = (orc_uint8) var41.x4[3];
703       /* 9: loadl */
704       var49 = ptr0[i];
705       /* 10: convubw */
706       var50.x4[0] = (orc_uint8) var49.x4[0];
707       var50.x4[1] = (orc_uint8) var49.x4[1];
708       var50.x4[2] = (orc_uint8) var49.x4[2];
709       var50.x4[3] = (orc_uint8) var49.x4[3];
710       /* 11: subw */
711       var51.x4[0] = var48.x4[0] - var50.x4[0];
712       var51.x4[1] = var48.x4[1] - var50.x4[1];
713       var51.x4[2] = var48.x4[2] - var50.x4[2];
714       var51.x4[3] = var48.x4[3] - var50.x4[3];
715       /* 12: mullw */
716       var52.x4[0] = (var51.x4[0] * var47.x4[0]) & 0xffff;
717       var52.x4[1] = (var51.x4[1] * var47.x4[1]) & 0xffff;
718       var52.x4[2] = (var51.x4[2] * var47.x4[2]) & 0xffff;
719       var52.x4[3] = (var51.x4[3] * var47.x4[3]) & 0xffff;
720       /* 13: div255w */
721       var53.x4[0] =
722           ((orc_uint16) (((orc_uint16) (var52.x4[0] + 128)) +
723               (((orc_uint16) (var52.x4[0] + 128)) >> 8))) >> 8;
724       var53.x4[1] =
725           ((orc_uint16) (((orc_uint16) (var52.x4[1] + 128)) +
726               (((orc_uint16) (var52.x4[1] + 128)) >> 8))) >> 8;
727       var53.x4[2] =
728           ((orc_uint16) (((orc_uint16) (var52.x4[2] + 128)) +
729               (((orc_uint16) (var52.x4[2] + 128)) >> 8))) >> 8;
730       var53.x4[3] =
731           ((orc_uint16) (((orc_uint16) (var52.x4[3] + 128)) +
732               (((orc_uint16) (var52.x4[3] + 128)) >> 8))) >> 8;
733       /* 14: addw */
734       var54.x4[0] = var50.x4[0] + var53.x4[0];
735       var54.x4[1] = var50.x4[1] + var53.x4[1];
736       var54.x4[2] = var50.x4[2] + var53.x4[2];
737       var54.x4[3] = var50.x4[3] + var53.x4[3];
738       /* 15: convwb */
739       var55.x4[0] = var54.x4[0];
740       var55.x4[1] = var54.x4[1];
741       var55.x4[2] = var54.x4[2];
742       var55.x4[3] = var54.x4[3];
743       /* 17: orl */
744       var56.i = var55.i | var40.i;
745       /* 18: storel */
746       ptr0[i] = var56;
747     }
748   }
749
750 }
751
752 void
753 video_mixer_orc_blend_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
754     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
755 {
756   OrcExecutor _ex, *ex = &_ex;
757   static volatile int p_inited = 0;
758   static OrcCode *c = 0;
759   void (*func) (OrcExecutor *);
760
761   if (!p_inited) {
762     orc_once_mutex_lock ();
763     if (!p_inited) {
764       OrcProgram *p;
765
766       p = orc_program_new ();
767       orc_program_set_2d (p);
768       orc_program_set_name (p, "video_mixer_orc_blend_argb");
769       orc_program_set_backup_function (p, _backup_video_mixer_orc_blend_argb);
770       orc_program_add_destination (p, 4, "d1");
771       orc_program_add_source (p, 4, "s1");
772       orc_program_add_constant (p, 4, 0x000000ff, "c1");
773       orc_program_add_constant (p, 4, 0x00000008, "c2");
774       orc_program_add_parameter (p, 2, "p1");
775       orc_program_add_temporary (p, 4, "t1");
776       orc_program_add_temporary (p, 2, "t2");
777       orc_program_add_temporary (p, 1, "t3");
778       orc_program_add_temporary (p, 4, "t4");
779       orc_program_add_temporary (p, 8, "t5");
780       orc_program_add_temporary (p, 8, "t6");
781       orc_program_add_temporary (p, 8, "t7");
782
783       orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
784           ORC_VAR_D1);
785       orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
786           ORC_VAR_D1);
787       orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
788           ORC_VAR_D1);
789       orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
790           ORC_VAR_D1);
791       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T4, ORC_VAR_D1,
792           ORC_VAR_D1);
793       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_P1,
794           ORC_VAR_D1);
795       orc_program_append_2 (p, "shruw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C2,
796           ORC_VAR_D1);
797       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1,
798           ORC_VAR_D1);
799       orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
800           ORC_VAR_D1);
801       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T1, ORC_VAR_D1,
802           ORC_VAR_D1);
803       orc_program_append_2 (p, "subw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5,
804           ORC_VAR_D1);
805       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T7,
806           ORC_VAR_D1);
807       orc_program_append_2 (p, "div255w", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_D1,
808           ORC_VAR_D1);
809       orc_program_append_2 (p, "addw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T6,
810           ORC_VAR_D1);
811       orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T5, ORC_VAR_D1,
812           ORC_VAR_D1);
813       orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
814           ORC_VAR_D1);
815       orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
816           ORC_VAR_D1);
817
818       orc_program_compile (p);
819       c = orc_program_take_code (p);
820       orc_program_free (p);
821     }
822     p_inited = TRUE;
823     orc_once_mutex_unlock ();
824   }
825   ex->arrays[ORC_VAR_A2] = c;
826   ex->program = 0;
827
828   ex->n = n;
829   ORC_EXECUTOR_M (ex) = m;
830   ex->arrays[ORC_VAR_D1] = d1;
831   ex->params[ORC_VAR_D1] = d1_stride;
832   ex->arrays[ORC_VAR_S1] = (void *) s1;
833   ex->params[ORC_VAR_S1] = s1_stride;
834   ex->params[ORC_VAR_P1] = p1;
835
836   func = c->exec;
837   func (ex);
838 }
839 #endif
840
841
842 /* video_mixer_orc_blend_bgra */
843 #ifdef DISABLE_ORC
844 void
845 video_mixer_orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
846     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
847 {
848   int i;
849   int j;
850   orc_union32 *ORC_RESTRICT ptr0;
851   const orc_union32 *ORC_RESTRICT ptr4;
852   orc_union64 var40;
853   orc_union32 var41;
854   orc_union32 var42;
855   orc_union32 var43;
856   orc_union16 var44;
857   orc_int8 var45;
858   orc_union32 var46;
859   orc_union64 var47;
860   orc_union64 var48;
861   orc_union64 var49;
862   orc_union64 var50;
863   orc_union32 var51;
864   orc_union64 var52;
865   orc_union64 var53;
866   orc_union64 var54;
867   orc_union64 var55;
868   orc_union64 var56;
869   orc_union32 var57;
870   orc_union32 var58;
871
872   for (j = 0; j < m; j++) {
873     ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
874     ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
875
876     /* 6: loadpw */
877     var40.x4[0] = p1;
878     var40.x4[1] = p1;
879     var40.x4[2] = p1;
880     var40.x4[3] = p1;
881     /* 17: loadpl */
882     var41.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */
883
884     for (i = 0; i < n; i++) {
885       /* 0: loadl */
886       var42 = ptr4[i];
887       /* 1: shrul */
888       var43.i = ((orc_uint32) var42.i) >> 24;
889       /* 2: convlw */
890       var44.i = var43.i;
891       /* 3: convwb */
892       var45 = var44.i;
893       /* 4: splatbl */
894       var46.i =
895           ((var45 & 0xff) << 24) | ((var45 & 0xff) << 16) | ((var45 & 0xff) <<
896           8) | (var45 & 0xff);
897       /* 5: convubw */
898       var47.x4[0] = (orc_uint8) var46.x4[0];
899       var47.x4[1] = (orc_uint8) var46.x4[1];
900       var47.x4[2] = (orc_uint8) var46.x4[2];
901       var47.x4[3] = (orc_uint8) var46.x4[3];
902       /* 7: mullw */
903       var48.x4[0] = (var47.x4[0] * var40.x4[0]) & 0xffff;
904       var48.x4[1] = (var47.x4[1] * var40.x4[1]) & 0xffff;
905       var48.x4[2] = (var47.x4[2] * var40.x4[2]) & 0xffff;
906       var48.x4[3] = (var47.x4[3] * var40.x4[3]) & 0xffff;
907       /* 8: shruw */
908       var49.x4[0] = ((orc_uint16) var48.x4[0]) >> 8;
909       var49.x4[1] = ((orc_uint16) var48.x4[1]) >> 8;
910       var49.x4[2] = ((orc_uint16) var48.x4[2]) >> 8;
911       var49.x4[3] = ((orc_uint16) var48.x4[3]) >> 8;
912       /* 9: convubw */
913       var50.x4[0] = (orc_uint8) var42.x4[0];
914       var50.x4[1] = (orc_uint8) var42.x4[1];
915       var50.x4[2] = (orc_uint8) var42.x4[2];
916       var50.x4[3] = (orc_uint8) var42.x4[3];
917       /* 10: loadl */
918       var51 = ptr0[i];
919       /* 11: convubw */
920       var52.x4[0] = (orc_uint8) var51.x4[0];
921       var52.x4[1] = (orc_uint8) var51.x4[1];
922       var52.x4[2] = (orc_uint8) var51.x4[2];
923       var52.x4[3] = (orc_uint8) var51.x4[3];
924       /* 12: subw */
925       var53.x4[0] = var50.x4[0] - var52.x4[0];
926       var53.x4[1] = var50.x4[1] - var52.x4[1];
927       var53.x4[2] = var50.x4[2] - var52.x4[2];
928       var53.x4[3] = var50.x4[3] - var52.x4[3];
929       /* 13: mullw */
930       var54.x4[0] = (var53.x4[0] * var49.x4[0]) & 0xffff;
931       var54.x4[1] = (var53.x4[1] * var49.x4[1]) & 0xffff;
932       var54.x4[2] = (var53.x4[2] * var49.x4[2]) & 0xffff;
933       var54.x4[3] = (var53.x4[3] * var49.x4[3]) & 0xffff;
934       /* 14: div255w */
935       var55.x4[0] =
936           ((orc_uint16) (((orc_uint16) (var54.x4[0] + 128)) +
937               (((orc_uint16) (var54.x4[0] + 128)) >> 8))) >> 8;
938       var55.x4[1] =
939           ((orc_uint16) (((orc_uint16) (var54.x4[1] + 128)) +
940               (((orc_uint16) (var54.x4[1] + 128)) >> 8))) >> 8;
941       var55.x4[2] =
942           ((orc_uint16) (((orc_uint16) (var54.x4[2] + 128)) +
943               (((orc_uint16) (var54.x4[2] + 128)) >> 8))) >> 8;
944       var55.x4[3] =
945           ((orc_uint16) (((orc_uint16) (var54.x4[3] + 128)) +
946               (((orc_uint16) (var54.x4[3] + 128)) >> 8))) >> 8;
947       /* 15: addw */
948       var56.x4[0] = var52.x4[0] + var55.x4[0];
949       var56.x4[1] = var52.x4[1] + var55.x4[1];
950       var56.x4[2] = var52.x4[2] + var55.x4[2];
951       var56.x4[3] = var52.x4[3] + var55.x4[3];
952       /* 16: convwb */
953       var57.x4[0] = var56.x4[0];
954       var57.x4[1] = var56.x4[1];
955       var57.x4[2] = var56.x4[2];
956       var57.x4[3] = var56.x4[3];
957       /* 18: orl */
958       var58.i = var57.i | var41.i;
959       /* 19: storel */
960       ptr0[i] = var58;
961     }
962   }
963
964 }
965
966 #else
967 static void
968 _backup_video_mixer_orc_blend_bgra (OrcExecutor * ORC_RESTRICT ex)
969 {
970   int i;
971   int j;
972   int n = ex->n;
973   int m = ex->params[ORC_VAR_A1];
974   orc_union32 *ORC_RESTRICT ptr0;
975   const orc_union32 *ORC_RESTRICT ptr4;
976   orc_union64 var40;
977   orc_union32 var41;
978   orc_union32 var42;
979   orc_union32 var43;
980   orc_union16 var44;
981   orc_int8 var45;
982   orc_union32 var46;
983   orc_union64 var47;
984   orc_union64 var48;
985   orc_union64 var49;
986   orc_union64 var50;
987   orc_union32 var51;
988   orc_union64 var52;
989   orc_union64 var53;
990   orc_union64 var54;
991   orc_union64 var55;
992   orc_union64 var56;
993   orc_union32 var57;
994   orc_union32 var58;
995
996   for (j = 0; j < m; j++) {
997     ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
998     ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
999
1000     /* 6: loadpw */
1001     var40.x4[0] = ex->params[24];
1002     var40.x4[1] = ex->params[24];
1003     var40.x4[2] = ex->params[24];
1004     var40.x4[3] = ex->params[24];
1005     /* 17: loadpl */
1006     var41.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */
1007
1008     for (i = 0; i < n; i++) {
1009       /* 0: loadl */
1010       var42 = ptr4[i];
1011       /* 1: shrul */
1012       var43.i = ((orc_uint32) var42.i) >> 24;
1013       /* 2: convlw */
1014       var44.i = var43.i;
1015       /* 3: convwb */
1016       var45 = var44.i;
1017       /* 4: splatbl */
1018       var46.i =
1019           ((var45 & 0xff) << 24) | ((var45 & 0xff) << 16) | ((var45 & 0xff) <<
1020           8) | (var45 & 0xff);
1021       /* 5: convubw */
1022       var47.x4[0] = (orc_uint8) var46.x4[0];
1023       var47.x4[1] = (orc_uint8) var46.x4[1];
1024       var47.x4[2] = (orc_uint8) var46.x4[2];
1025       var47.x4[3] = (orc_uint8) var46.x4[3];
1026       /* 7: mullw */
1027       var48.x4[0] = (var47.x4[0] * var40.x4[0]) & 0xffff;
1028       var48.x4[1] = (var47.x4[1] * var40.x4[1]) & 0xffff;
1029       var48.x4[2] = (var47.x4[2] * var40.x4[2]) & 0xffff;
1030       var48.x4[3] = (var47.x4[3] * var40.x4[3]) & 0xffff;
1031       /* 8: shruw */
1032       var49.x4[0] = ((orc_uint16) var48.x4[0]) >> 8;
1033       var49.x4[1] = ((orc_uint16) var48.x4[1]) >> 8;
1034       var49.x4[2] = ((orc_uint16) var48.x4[2]) >> 8;
1035       var49.x4[3] = ((orc_uint16) var48.x4[3]) >> 8;
1036       /* 9: convubw */
1037       var50.x4[0] = (orc_uint8) var42.x4[0];
1038       var50.x4[1] = (orc_uint8) var42.x4[1];
1039       var50.x4[2] = (orc_uint8) var42.x4[2];
1040       var50.x4[3] = (orc_uint8) var42.x4[3];
1041       /* 10: loadl */
1042       var51 = ptr0[i];
1043       /* 11: convubw */
1044       var52.x4[0] = (orc_uint8) var51.x4[0];
1045       var52.x4[1] = (orc_uint8) var51.x4[1];
1046       var52.x4[2] = (orc_uint8) var51.x4[2];
1047       var52.x4[3] = (orc_uint8) var51.x4[3];
1048       /* 12: subw */
1049       var53.x4[0] = var50.x4[0] - var52.x4[0];
1050       var53.x4[1] = var50.x4[1] - var52.x4[1];
1051       var53.x4[2] = var50.x4[2] - var52.x4[2];
1052       var53.x4[3] = var50.x4[3] - var52.x4[3];
1053       /* 13: mullw */
1054       var54.x4[0] = (var53.x4[0] * var49.x4[0]) & 0xffff;
1055       var54.x4[1] = (var53.x4[1] * var49.x4[1]) & 0xffff;
1056       var54.x4[2] = (var53.x4[2] * var49.x4[2]) & 0xffff;
1057       var54.x4[3] = (var53.x4[3] * var49.x4[3]) & 0xffff;
1058       /* 14: div255w */
1059       var55.x4[0] =
1060           ((orc_uint16) (((orc_uint16) (var54.x4[0] + 128)) +
1061               (((orc_uint16) (var54.x4[0] + 128)) >> 8))) >> 8;
1062       var55.x4[1] =
1063           ((orc_uint16) (((orc_uint16) (var54.x4[1] + 128)) +
1064               (((orc_uint16) (var54.x4[1] + 128)) >> 8))) >> 8;
1065       var55.x4[2] =
1066           ((orc_uint16) (((orc_uint16) (var54.x4[2] + 128)) +
1067               (((orc_uint16) (var54.x4[2] + 128)) >> 8))) >> 8;
1068       var55.x4[3] =
1069           ((orc_uint16) (((orc_uint16) (var54.x4[3] + 128)) +
1070               (((orc_uint16) (var54.x4[3] + 128)) >> 8))) >> 8;
1071       /* 15: addw */
1072       var56.x4[0] = var52.x4[0] + var55.x4[0];
1073       var56.x4[1] = var52.x4[1] + var55.x4[1];
1074       var56.x4[2] = var52.x4[2] + var55.x4[2];
1075       var56.x4[3] = var52.x4[3] + var55.x4[3];
1076       /* 16: convwb */
1077       var57.x4[0] = var56.x4[0];
1078       var57.x4[1] = var56.x4[1];
1079       var57.x4[2] = var56.x4[2];
1080       var57.x4[3] = var56.x4[3];
1081       /* 18: orl */
1082       var58.i = var57.i | var41.i;
1083       /* 19: storel */
1084       ptr0[i] = var58;
1085     }
1086   }
1087
1088 }
1089
1090 void
1091 video_mixer_orc_blend_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
1092     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
1093 {
1094   OrcExecutor _ex, *ex = &_ex;
1095   static volatile int p_inited = 0;
1096   static OrcCode *c = 0;
1097   void (*func) (OrcExecutor *);
1098
1099   if (!p_inited) {
1100     orc_once_mutex_lock ();
1101     if (!p_inited) {
1102       OrcProgram *p;
1103
1104       p = orc_program_new ();
1105       orc_program_set_2d (p);
1106       orc_program_set_name (p, "video_mixer_orc_blend_bgra");
1107       orc_program_set_backup_function (p, _backup_video_mixer_orc_blend_bgra);
1108       orc_program_add_destination (p, 4, "d1");
1109       orc_program_add_source (p, 4, "s1");
1110       orc_program_add_constant (p, 4, 0xff000000, "c1");
1111       orc_program_add_constant (p, 4, 0x00000018, "c2");
1112       orc_program_add_constant (p, 4, 0x00000008, "c3");
1113       orc_program_add_parameter (p, 2, "p1");
1114       orc_program_add_temporary (p, 4, "t1");
1115       orc_program_add_temporary (p, 4, "t2");
1116       orc_program_add_temporary (p, 2, "t3");
1117       orc_program_add_temporary (p, 1, "t4");
1118       orc_program_add_temporary (p, 4, "t5");
1119       orc_program_add_temporary (p, 8, "t6");
1120       orc_program_add_temporary (p, 8, "t7");
1121       orc_program_add_temporary (p, 8, "t8");
1122
1123       orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
1124           ORC_VAR_D1);
1125       orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C2,
1126           ORC_VAR_D1);
1127       orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
1128           ORC_VAR_D1);
1129       orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
1130           ORC_VAR_D1);
1131       orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T5, ORC_VAR_T4, ORC_VAR_D1,
1132           ORC_VAR_D1);
1133       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T8, ORC_VAR_T5, ORC_VAR_D1,
1134           ORC_VAR_D1);
1135       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_P1,
1136           ORC_VAR_D1);
1137       orc_program_append_2 (p, "shruw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_C3,
1138           ORC_VAR_D1);
1139       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T1, ORC_VAR_D1,
1140           ORC_VAR_D1);
1141       orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
1142           ORC_VAR_D1);
1143       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T1, ORC_VAR_D1,
1144           ORC_VAR_D1);
1145       orc_program_append_2 (p, "subw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6,
1146           ORC_VAR_D1);
1147       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T8,
1148           ORC_VAR_D1);
1149       orc_program_append_2 (p, "div255w", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_D1,
1150           ORC_VAR_D1);
1151       orc_program_append_2 (p, "addw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T7,
1152           ORC_VAR_D1);
1153       orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T6, ORC_VAR_D1,
1154           ORC_VAR_D1);
1155       orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C1,
1156           ORC_VAR_D1);
1157       orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
1158           ORC_VAR_D1);
1159
1160       orc_program_compile (p);
1161       c = orc_program_take_code (p);
1162       orc_program_free (p);
1163     }
1164     p_inited = TRUE;
1165     orc_once_mutex_unlock ();
1166   }
1167   ex->arrays[ORC_VAR_A2] = c;
1168   ex->program = 0;
1169
1170   ex->n = n;
1171   ORC_EXECUTOR_M (ex) = m;
1172   ex->arrays[ORC_VAR_D1] = d1;
1173   ex->params[ORC_VAR_D1] = d1_stride;
1174   ex->arrays[ORC_VAR_S1] = (void *) s1;
1175   ex->params[ORC_VAR_S1] = s1_stride;
1176   ex->params[ORC_VAR_P1] = p1;
1177
1178   func = c->exec;
1179   func (ex);
1180 }
1181 #endif
1182
1183
1184 /* video_mixer_orc_overlay_argb */
1185 #ifdef DISABLE_ORC
1186 void
1187 video_mixer_orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
1188     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
1189 {
1190   int i;
1191   int j;
1192   orc_union32 *ORC_RESTRICT ptr0;
1193   const orc_union32 *ORC_RESTRICT ptr4;
1194   orc_union64 var41;
1195   orc_union32 var42;
1196   orc_union32 var43;
1197   orc_union32 var44;
1198   orc_union16 var45;
1199   orc_int8 var46;
1200   orc_union32 var47;
1201   orc_union64 var48;
1202   orc_union64 var49;
1203   orc_union64 var50;
1204   orc_union64 var51;
1205   orc_union64 var52;
1206   orc_union32 var53;
1207   orc_union64 var54;
1208   orc_union64 var55;
1209   orc_union32 var56;
1210   orc_union16 var57;
1211   orc_int8 var58;
1212   orc_union32 var59;
1213   orc_union64 var60;
1214   orc_union64 var61;
1215   orc_union64 var62;
1216   orc_union64 var63;
1217   orc_union64 var64;
1218   orc_union64 var65;
1219   orc_union64 var66;
1220   orc_union64 var67;
1221   orc_union32 var68;
1222   orc_union32 var69;
1223   orc_union32 var70;
1224   orc_union32 var71;
1225   orc_union32 var72;
1226
1227   for (j = 0; j < m; j++) {
1228     ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
1229     ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
1230
1231     /* 5: loadpw */
1232     var41.x4[0] = p1;
1233     var41.x4[1] = p1;
1234     var41.x4[2] = p1;
1235     var41.x4[3] = p1;
1236     /* 10: loadpl */
1237     var53.i = (int) 0xffffffff; /* -1 or 2.122e-314f */
1238     /* 26: loadpl */
1239     var42.i = (int) 0xffffff00; /* -256 or 2.122e-314f */
1240     /* 29: loadpl */
1241     var43.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */
1242
1243     for (i = 0; i < n; i++) {
1244       /* 0: loadl */
1245       var44 = ptr4[i];
1246       /* 1: convlw */
1247       var45.i = var44.i;
1248       /* 2: convwb */
1249       var46 = var45.i;
1250       /* 3: splatbl */
1251       var47.i =
1252           ((var46 & 0xff) << 24) | ((var46 & 0xff) << 16) | ((var46 & 0xff) <<
1253           8) | (var46 & 0xff);
1254       /* 4: convubw */
1255       var48.x4[0] = (orc_uint8) var47.x4[0];
1256       var48.x4[1] = (orc_uint8) var47.x4[1];
1257       var48.x4[2] = (orc_uint8) var47.x4[2];
1258       var48.x4[3] = (orc_uint8) var47.x4[3];
1259       /* 6: mullw */
1260       var49.x4[0] = (var48.x4[0] * var41.x4[0]) & 0xffff;
1261       var49.x4[1] = (var48.x4[1] * var41.x4[1]) & 0xffff;
1262       var49.x4[2] = (var48.x4[2] * var41.x4[2]) & 0xffff;
1263       var49.x4[3] = (var48.x4[3] * var41.x4[3]) & 0xffff;
1264       /* 7: shruw */
1265       var50.x4[0] = ((orc_uint16) var49.x4[0]) >> 8;
1266       var50.x4[1] = ((orc_uint16) var49.x4[1]) >> 8;
1267       var50.x4[2] = ((orc_uint16) var49.x4[2]) >> 8;
1268       var50.x4[3] = ((orc_uint16) var49.x4[3]) >> 8;
1269       /* 8: convubw */
1270       var51.x4[0] = (orc_uint8) var44.x4[0];
1271       var51.x4[1] = (orc_uint8) var44.x4[1];
1272       var51.x4[2] = (orc_uint8) var44.x4[2];
1273       var51.x4[3] = (orc_uint8) var44.x4[3];
1274       /* 9: mullw */
1275       var52.x4[0] = (var51.x4[0] * var50.x4[0]) & 0xffff;
1276       var52.x4[1] = (var51.x4[1] * var50.x4[1]) & 0xffff;
1277       var52.x4[2] = (var51.x4[2] * var50.x4[2]) & 0xffff;
1278       var52.x4[3] = (var51.x4[3] * var50.x4[3]) & 0xffff;
1279       /* 11: convubw */
1280       var54.x4[0] = (orc_uint8) var53.x4[0];
1281       var54.x4[1] = (orc_uint8) var53.x4[1];
1282       var54.x4[2] = (orc_uint8) var53.x4[2];
1283       var54.x4[3] = (orc_uint8) var53.x4[3];
1284       /* 12: subw */
1285       var55.x4[0] = var54.x4[0] - var50.x4[0];
1286       var55.x4[1] = var54.x4[1] - var50.x4[1];
1287       var55.x4[2] = var54.x4[2] - var50.x4[2];
1288       var55.x4[3] = var54.x4[3] - var50.x4[3];
1289       /* 13: loadl */
1290       var56 = ptr0[i];
1291       /* 14: convlw */
1292       var57.i = var56.i;
1293       /* 15: convwb */
1294       var58 = var57.i;
1295       /* 16: splatbl */
1296       var59.i =
1297           ((var58 & 0xff) << 24) | ((var58 & 0xff) << 16) | ((var58 & 0xff) <<
1298           8) | (var58 & 0xff);
1299       /* 17: convubw */
1300       var60.x4[0] = (orc_uint8) var59.x4[0];
1301       var60.x4[1] = (orc_uint8) var59.x4[1];
1302       var60.x4[2] = (orc_uint8) var59.x4[2];
1303       var60.x4[3] = (orc_uint8) var59.x4[3];
1304       /* 18: mullw */
1305       var61.x4[0] = (var60.x4[0] * var55.x4[0]) & 0xffff;
1306       var61.x4[1] = (var60.x4[1] * var55.x4[1]) & 0xffff;
1307       var61.x4[2] = (var60.x4[2] * var55.x4[2]) & 0xffff;
1308       var61.x4[3] = (var60.x4[3] * var55.x4[3]) & 0xffff;
1309       /* 19: div255w */
1310       var62.x4[0] =
1311           ((orc_uint16) (((orc_uint16) (var61.x4[0] + 128)) +
1312               (((orc_uint16) (var61.x4[0] + 128)) >> 8))) >> 8;
1313       var62.x4[1] =
1314           ((orc_uint16) (((orc_uint16) (var61.x4[1] + 128)) +
1315               (((orc_uint16) (var61.x4[1] + 128)) >> 8))) >> 8;
1316       var62.x4[2] =
1317           ((orc_uint16) (((orc_uint16) (var61.x4[2] + 128)) +
1318               (((orc_uint16) (var61.x4[2] + 128)) >> 8))) >> 8;
1319       var62.x4[3] =
1320           ((orc_uint16) (((orc_uint16) (var61.x4[3] + 128)) +
1321               (((orc_uint16) (var61.x4[3] + 128)) >> 8))) >> 8;
1322       /* 20: convubw */
1323       var63.x4[0] = (orc_uint8) var56.x4[0];
1324       var63.x4[1] = (orc_uint8) var56.x4[1];
1325       var63.x4[2] = (orc_uint8) var56.x4[2];
1326       var63.x4[3] = (orc_uint8) var56.x4[3];
1327       /* 21: mullw */
1328       var64.x4[0] = (var63.x4[0] * var62.x4[0]) & 0xffff;
1329       var64.x4[1] = (var63.x4[1] * var62.x4[1]) & 0xffff;
1330       var64.x4[2] = (var63.x4[2] * var62.x4[2]) & 0xffff;
1331       var64.x4[3] = (var63.x4[3] * var62.x4[3]) & 0xffff;
1332       /* 22: addw */
1333       var65.x4[0] = var64.x4[0] + var52.x4[0];
1334       var65.x4[1] = var64.x4[1] + var52.x4[1];
1335       var65.x4[2] = var64.x4[2] + var52.x4[2];
1336       var65.x4[3] = var64.x4[3] + var52.x4[3];
1337       /* 23: addw */
1338       var66.x4[0] = var62.x4[0] + var50.x4[0];
1339       var66.x4[1] = var62.x4[1] + var50.x4[1];
1340       var66.x4[2] = var62.x4[2] + var50.x4[2];
1341       var66.x4[3] = var62.x4[3] + var50.x4[3];
1342       /* 24: divluw */
1343       var67.x4[0] =
1344           ((var66.x4[0] & 0xff) ==
1345           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[0]) /
1346           ((orc_uint16) var66.x4[0] & 0xff));
1347       var67.x4[1] =
1348           ((var66.x4[1] & 0xff) ==
1349           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[1]) /
1350           ((orc_uint16) var66.x4[1] & 0xff));
1351       var67.x4[2] =
1352           ((var66.x4[2] & 0xff) ==
1353           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[2]) /
1354           ((orc_uint16) var66.x4[2] & 0xff));
1355       var67.x4[3] =
1356           ((var66.x4[3] & 0xff) ==
1357           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[3]) /
1358           ((orc_uint16) var66.x4[3] & 0xff));
1359       /* 25: convwb */
1360       var68.x4[0] = var67.x4[0];
1361       var68.x4[1] = var67.x4[1];
1362       var68.x4[2] = var67.x4[2];
1363       var68.x4[3] = var67.x4[3];
1364       /* 27: andl */
1365       var69.i = var68.i & var42.i;
1366       /* 28: convwb */
1367       var70.x4[0] = var66.x4[0];
1368       var70.x4[1] = var66.x4[1];
1369       var70.x4[2] = var66.x4[2];
1370       var70.x4[3] = var66.x4[3];
1371       /* 30: andl */
1372       var71.i = var70.i & var43.i;
1373       /* 31: orl */
1374       var72.i = var69.i | var71.i;
1375       /* 32: storel */
1376       ptr0[i] = var72;
1377     }
1378   }
1379
1380 }
1381
1382 #else
1383 static void
1384 _backup_video_mixer_orc_overlay_argb (OrcExecutor * ORC_RESTRICT ex)
1385 {
1386   int i;
1387   int j;
1388   int n = ex->n;
1389   int m = ex->params[ORC_VAR_A1];
1390   orc_union32 *ORC_RESTRICT ptr0;
1391   const orc_union32 *ORC_RESTRICT ptr4;
1392   orc_union64 var41;
1393   orc_union32 var42;
1394   orc_union32 var43;
1395   orc_union32 var44;
1396   orc_union16 var45;
1397   orc_int8 var46;
1398   orc_union32 var47;
1399   orc_union64 var48;
1400   orc_union64 var49;
1401   orc_union64 var50;
1402   orc_union64 var51;
1403   orc_union64 var52;
1404   orc_union32 var53;
1405   orc_union64 var54;
1406   orc_union64 var55;
1407   orc_union32 var56;
1408   orc_union16 var57;
1409   orc_int8 var58;
1410   orc_union32 var59;
1411   orc_union64 var60;
1412   orc_union64 var61;
1413   orc_union64 var62;
1414   orc_union64 var63;
1415   orc_union64 var64;
1416   orc_union64 var65;
1417   orc_union64 var66;
1418   orc_union64 var67;
1419   orc_union32 var68;
1420   orc_union32 var69;
1421   orc_union32 var70;
1422   orc_union32 var71;
1423   orc_union32 var72;
1424
1425   for (j = 0; j < m; j++) {
1426     ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
1427     ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
1428
1429     /* 5: loadpw */
1430     var41.x4[0] = ex->params[24];
1431     var41.x4[1] = ex->params[24];
1432     var41.x4[2] = ex->params[24];
1433     var41.x4[3] = ex->params[24];
1434     /* 10: loadpl */
1435     var53.i = (int) 0xffffffff; /* -1 or 2.122e-314f */
1436     /* 26: loadpl */
1437     var42.i = (int) 0xffffff00; /* -256 or 2.122e-314f */
1438     /* 29: loadpl */
1439     var43.i = (int) 0x000000ff; /* 255 or 1.25987e-321f */
1440
1441     for (i = 0; i < n; i++) {
1442       /* 0: loadl */
1443       var44 = ptr4[i];
1444       /* 1: convlw */
1445       var45.i = var44.i;
1446       /* 2: convwb */
1447       var46 = var45.i;
1448       /* 3: splatbl */
1449       var47.i =
1450           ((var46 & 0xff) << 24) | ((var46 & 0xff) << 16) | ((var46 & 0xff) <<
1451           8) | (var46 & 0xff);
1452       /* 4: convubw */
1453       var48.x4[0] = (orc_uint8) var47.x4[0];
1454       var48.x4[1] = (orc_uint8) var47.x4[1];
1455       var48.x4[2] = (orc_uint8) var47.x4[2];
1456       var48.x4[3] = (orc_uint8) var47.x4[3];
1457       /* 6: mullw */
1458       var49.x4[0] = (var48.x4[0] * var41.x4[0]) & 0xffff;
1459       var49.x4[1] = (var48.x4[1] * var41.x4[1]) & 0xffff;
1460       var49.x4[2] = (var48.x4[2] * var41.x4[2]) & 0xffff;
1461       var49.x4[3] = (var48.x4[3] * var41.x4[3]) & 0xffff;
1462       /* 7: shruw */
1463       var50.x4[0] = ((orc_uint16) var49.x4[0]) >> 8;
1464       var50.x4[1] = ((orc_uint16) var49.x4[1]) >> 8;
1465       var50.x4[2] = ((orc_uint16) var49.x4[2]) >> 8;
1466       var50.x4[3] = ((orc_uint16) var49.x4[3]) >> 8;
1467       /* 8: convubw */
1468       var51.x4[0] = (orc_uint8) var44.x4[0];
1469       var51.x4[1] = (orc_uint8) var44.x4[1];
1470       var51.x4[2] = (orc_uint8) var44.x4[2];
1471       var51.x4[3] = (orc_uint8) var44.x4[3];
1472       /* 9: mullw */
1473       var52.x4[0] = (var51.x4[0] * var50.x4[0]) & 0xffff;
1474       var52.x4[1] = (var51.x4[1] * var50.x4[1]) & 0xffff;
1475       var52.x4[2] = (var51.x4[2] * var50.x4[2]) & 0xffff;
1476       var52.x4[3] = (var51.x4[3] * var50.x4[3]) & 0xffff;
1477       /* 11: convubw */
1478       var54.x4[0] = (orc_uint8) var53.x4[0];
1479       var54.x4[1] = (orc_uint8) var53.x4[1];
1480       var54.x4[2] = (orc_uint8) var53.x4[2];
1481       var54.x4[3] = (orc_uint8) var53.x4[3];
1482       /* 12: subw */
1483       var55.x4[0] = var54.x4[0] - var50.x4[0];
1484       var55.x4[1] = var54.x4[1] - var50.x4[1];
1485       var55.x4[2] = var54.x4[2] - var50.x4[2];
1486       var55.x4[3] = var54.x4[3] - var50.x4[3];
1487       /* 13: loadl */
1488       var56 = ptr0[i];
1489       /* 14: convlw */
1490       var57.i = var56.i;
1491       /* 15: convwb */
1492       var58 = var57.i;
1493       /* 16: splatbl */
1494       var59.i =
1495           ((var58 & 0xff) << 24) | ((var58 & 0xff) << 16) | ((var58 & 0xff) <<
1496           8) | (var58 & 0xff);
1497       /* 17: convubw */
1498       var60.x4[0] = (orc_uint8) var59.x4[0];
1499       var60.x4[1] = (orc_uint8) var59.x4[1];
1500       var60.x4[2] = (orc_uint8) var59.x4[2];
1501       var60.x4[3] = (orc_uint8) var59.x4[3];
1502       /* 18: mullw */
1503       var61.x4[0] = (var60.x4[0] * var55.x4[0]) & 0xffff;
1504       var61.x4[1] = (var60.x4[1] * var55.x4[1]) & 0xffff;
1505       var61.x4[2] = (var60.x4[2] * var55.x4[2]) & 0xffff;
1506       var61.x4[3] = (var60.x4[3] * var55.x4[3]) & 0xffff;
1507       /* 19: div255w */
1508       var62.x4[0] =
1509           ((orc_uint16) (((orc_uint16) (var61.x4[0] + 128)) +
1510               (((orc_uint16) (var61.x4[0] + 128)) >> 8))) >> 8;
1511       var62.x4[1] =
1512           ((orc_uint16) (((orc_uint16) (var61.x4[1] + 128)) +
1513               (((orc_uint16) (var61.x4[1] + 128)) >> 8))) >> 8;
1514       var62.x4[2] =
1515           ((orc_uint16) (((orc_uint16) (var61.x4[2] + 128)) +
1516               (((orc_uint16) (var61.x4[2] + 128)) >> 8))) >> 8;
1517       var62.x4[3] =
1518           ((orc_uint16) (((orc_uint16) (var61.x4[3] + 128)) +
1519               (((orc_uint16) (var61.x4[3] + 128)) >> 8))) >> 8;
1520       /* 20: convubw */
1521       var63.x4[0] = (orc_uint8) var56.x4[0];
1522       var63.x4[1] = (orc_uint8) var56.x4[1];
1523       var63.x4[2] = (orc_uint8) var56.x4[2];
1524       var63.x4[3] = (orc_uint8) var56.x4[3];
1525       /* 21: mullw */
1526       var64.x4[0] = (var63.x4[0] * var62.x4[0]) & 0xffff;
1527       var64.x4[1] = (var63.x4[1] * var62.x4[1]) & 0xffff;
1528       var64.x4[2] = (var63.x4[2] * var62.x4[2]) & 0xffff;
1529       var64.x4[3] = (var63.x4[3] * var62.x4[3]) & 0xffff;
1530       /* 22: addw */
1531       var65.x4[0] = var64.x4[0] + var52.x4[0];
1532       var65.x4[1] = var64.x4[1] + var52.x4[1];
1533       var65.x4[2] = var64.x4[2] + var52.x4[2];
1534       var65.x4[3] = var64.x4[3] + var52.x4[3];
1535       /* 23: addw */
1536       var66.x4[0] = var62.x4[0] + var50.x4[0];
1537       var66.x4[1] = var62.x4[1] + var50.x4[1];
1538       var66.x4[2] = var62.x4[2] + var50.x4[2];
1539       var66.x4[3] = var62.x4[3] + var50.x4[3];
1540       /* 24: divluw */
1541       var67.x4[0] =
1542           ((var66.x4[0] & 0xff) ==
1543           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[0]) /
1544           ((orc_uint16) var66.x4[0] & 0xff));
1545       var67.x4[1] =
1546           ((var66.x4[1] & 0xff) ==
1547           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[1]) /
1548           ((orc_uint16) var66.x4[1] & 0xff));
1549       var67.x4[2] =
1550           ((var66.x4[2] & 0xff) ==
1551           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[2]) /
1552           ((orc_uint16) var66.x4[2] & 0xff));
1553       var67.x4[3] =
1554           ((var66.x4[3] & 0xff) ==
1555           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var65.x4[3]) /
1556           ((orc_uint16) var66.x4[3] & 0xff));
1557       /* 25: convwb */
1558       var68.x4[0] = var67.x4[0];
1559       var68.x4[1] = var67.x4[1];
1560       var68.x4[2] = var67.x4[2];
1561       var68.x4[3] = var67.x4[3];
1562       /* 27: andl */
1563       var69.i = var68.i & var42.i;
1564       /* 28: convwb */
1565       var70.x4[0] = var66.x4[0];
1566       var70.x4[1] = var66.x4[1];
1567       var70.x4[2] = var66.x4[2];
1568       var70.x4[3] = var66.x4[3];
1569       /* 30: andl */
1570       var71.i = var70.i & var43.i;
1571       /* 31: orl */
1572       var72.i = var69.i | var71.i;
1573       /* 32: storel */
1574       ptr0[i] = var72;
1575     }
1576   }
1577
1578 }
1579
1580 void
1581 video_mixer_orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
1582     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
1583 {
1584   OrcExecutor _ex, *ex = &_ex;
1585   static volatile int p_inited = 0;
1586   static OrcCode *c = 0;
1587   void (*func) (OrcExecutor *);
1588
1589   if (!p_inited) {
1590     orc_once_mutex_lock ();
1591     if (!p_inited) {
1592       OrcProgram *p;
1593
1594       p = orc_program_new ();
1595       orc_program_set_2d (p);
1596       orc_program_set_name (p, "video_mixer_orc_overlay_argb");
1597       orc_program_set_backup_function (p, _backup_video_mixer_orc_overlay_argb);
1598       orc_program_add_destination (p, 4, "d1");
1599       orc_program_add_source (p, 4, "s1");
1600       orc_program_add_constant (p, 4, 0xffffffff, "c1");
1601       orc_program_add_constant (p, 4, 0x000000ff, "c2");
1602       orc_program_add_constant (p, 4, 0xffffff00, "c3");
1603       orc_program_add_constant (p, 4, 0x00000008, "c4");
1604       orc_program_add_parameter (p, 2, "p1");
1605       orc_program_add_temporary (p, 4, "t1");
1606       orc_program_add_temporary (p, 2, "t2");
1607       orc_program_add_temporary (p, 1, "t3");
1608       orc_program_add_temporary (p, 8, "t4");
1609       orc_program_add_temporary (p, 8, "t5");
1610       orc_program_add_temporary (p, 8, "t6");
1611       orc_program_add_temporary (p, 4, "t7");
1612       orc_program_add_temporary (p, 8, "t8");
1613       orc_program_add_temporary (p, 8, "t9");
1614
1615       orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
1616           ORC_VAR_D1);
1617       orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
1618           ORC_VAR_D1);
1619       orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
1620           ORC_VAR_D1);
1621       orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1,
1622           ORC_VAR_D1);
1623       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T4, ORC_VAR_T7, ORC_VAR_D1,
1624           ORC_VAR_D1);
1625       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_P1,
1626           ORC_VAR_D1);
1627       orc_program_append_2 (p, "shruw", 2, ORC_VAR_T4, ORC_VAR_T4, ORC_VAR_C4,
1628           ORC_VAR_D1);
1629       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1,
1630           ORC_VAR_D1);
1631       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T4,
1632           ORC_VAR_D1);
1633       orc_program_append_2 (p, "loadpl", 0, ORC_VAR_T7, ORC_VAR_C1, ORC_VAR_D1,
1634           ORC_VAR_D1);
1635       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T7, ORC_VAR_D1,
1636           ORC_VAR_D1);
1637       orc_program_append_2 (p, "subw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_T4,
1638           ORC_VAR_D1);
1639       orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
1640           ORC_VAR_D1);
1641       orc_program_append_2 (p, "convlw", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_D1,
1642           ORC_VAR_D1);
1643       orc_program_append_2 (p, "convwb", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
1644           ORC_VAR_D1);
1645       orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T7, ORC_VAR_T3, ORC_VAR_D1,
1646           ORC_VAR_D1);
1647       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T7, ORC_VAR_D1,
1648           ORC_VAR_D1);
1649       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5,
1650           ORC_VAR_D1);
1651       orc_program_append_2 (p, "div255w", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_D1,
1652           ORC_VAR_D1);
1653       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T8, ORC_VAR_T1, ORC_VAR_D1,
1654           ORC_VAR_D1);
1655       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T6,
1656           ORC_VAR_D1);
1657       orc_program_append_2 (p, "addw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T9,
1658           ORC_VAR_D1);
1659       orc_program_append_2 (p, "addw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T4,
1660           ORC_VAR_D1);
1661       orc_program_append_2 (p, "divluw", 2, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_T6,
1662           ORC_VAR_D1);
1663       orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T8, ORC_VAR_D1,
1664           ORC_VAR_D1);
1665       orc_program_append_2 (p, "andl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C3,
1666           ORC_VAR_D1);
1667       orc_program_append_2 (p, "convwb", 2, ORC_VAR_T7, ORC_VAR_T6, ORC_VAR_D1,
1668           ORC_VAR_D1);
1669       orc_program_append_2 (p, "andl", 0, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_C2,
1670           ORC_VAR_D1);
1671       orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T7,
1672           ORC_VAR_D1);
1673       orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
1674           ORC_VAR_D1);
1675
1676       orc_program_compile (p);
1677       c = orc_program_take_code (p);
1678       orc_program_free (p);
1679     }
1680     p_inited = TRUE;
1681     orc_once_mutex_unlock ();
1682   }
1683   ex->arrays[ORC_VAR_A2] = c;
1684   ex->program = 0;
1685
1686   ex->n = n;
1687   ORC_EXECUTOR_M (ex) = m;
1688   ex->arrays[ORC_VAR_D1] = d1;
1689   ex->params[ORC_VAR_D1] = d1_stride;
1690   ex->arrays[ORC_VAR_S1] = (void *) s1;
1691   ex->params[ORC_VAR_S1] = s1_stride;
1692   ex->params[ORC_VAR_P1] = p1;
1693
1694   func = c->exec;
1695   func (ex);
1696 }
1697 #endif
1698
1699
1700 /* video_mixer_orc_overlay_bgra */
1701 #ifdef DISABLE_ORC
1702 void
1703 video_mixer_orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
1704     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
1705 {
1706   int i;
1707   int j;
1708   orc_union32 *ORC_RESTRICT ptr0;
1709   const orc_union32 *ORC_RESTRICT ptr4;
1710   orc_union64 var42;
1711   orc_union32 var43;
1712   orc_union32 var44;
1713   orc_union32 var45;
1714   orc_union32 var46;
1715   orc_union16 var47;
1716   orc_int8 var48;
1717   orc_union32 var49;
1718   orc_union64 var50;
1719   orc_union64 var51;
1720   orc_union64 var52;
1721   orc_union64 var53;
1722   orc_union64 var54;
1723   orc_union32 var55;
1724   orc_union64 var56;
1725   orc_union64 var57;
1726   orc_union32 var58;
1727   orc_union32 var59;
1728   orc_union16 var60;
1729   orc_int8 var61;
1730   orc_union32 var62;
1731   orc_union64 var63;
1732   orc_union64 var64;
1733   orc_union64 var65;
1734   orc_union64 var66;
1735   orc_union64 var67;
1736   orc_union64 var68;
1737   orc_union64 var69;
1738   orc_union64 var70;
1739   orc_union32 var71;
1740   orc_union32 var72;
1741   orc_union32 var73;
1742   orc_union32 var74;
1743   orc_union32 var75;
1744
1745   for (j = 0; j < m; j++) {
1746     ptr0 = ORC_PTR_OFFSET (d1, d1_stride * j);
1747     ptr4 = ORC_PTR_OFFSET (s1, s1_stride * j);
1748
1749     /* 6: loadpw */
1750     var42.x4[0] = p1;
1751     var42.x4[1] = p1;
1752     var42.x4[2] = p1;
1753     var42.x4[3] = p1;
1754     /* 11: loadpl */
1755     var55.i = (int) 0xffffffff; /* -1 or 2.122e-314f */
1756     /* 28: loadpl */
1757     var43.i = (int) 0x00ffffff; /* 16777215 or 8.28905e-317f */
1758     /* 31: loadpl */
1759     var44.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */
1760
1761     for (i = 0; i < n; i++) {
1762       /* 0: loadl */
1763       var45 = ptr4[i];
1764       /* 1: shrul */
1765       var46.i = ((orc_uint32) var45.i) >> 24;
1766       /* 2: convlw */
1767       var47.i = var46.i;
1768       /* 3: convwb */
1769       var48 = var47.i;
1770       /* 4: splatbl */
1771       var49.i =
1772           ((var48 & 0xff) << 24) | ((var48 & 0xff) << 16) | ((var48 & 0xff) <<
1773           8) | (var48 & 0xff);
1774       /* 5: convubw */
1775       var50.x4[0] = (orc_uint8) var49.x4[0];
1776       var50.x4[1] = (orc_uint8) var49.x4[1];
1777       var50.x4[2] = (orc_uint8) var49.x4[2];
1778       var50.x4[3] = (orc_uint8) var49.x4[3];
1779       /* 7: mullw */
1780       var51.x4[0] = (var50.x4[0] * var42.x4[0]) & 0xffff;
1781       var51.x4[1] = (var50.x4[1] * var42.x4[1]) & 0xffff;
1782       var51.x4[2] = (var50.x4[2] * var42.x4[2]) & 0xffff;
1783       var51.x4[3] = (var50.x4[3] * var42.x4[3]) & 0xffff;
1784       /* 8: shruw */
1785       var52.x4[0] = ((orc_uint16) var51.x4[0]) >> 8;
1786       var52.x4[1] = ((orc_uint16) var51.x4[1]) >> 8;
1787       var52.x4[2] = ((orc_uint16) var51.x4[2]) >> 8;
1788       var52.x4[3] = ((orc_uint16) var51.x4[3]) >> 8;
1789       /* 9: convubw */
1790       var53.x4[0] = (orc_uint8) var45.x4[0];
1791       var53.x4[1] = (orc_uint8) var45.x4[1];
1792       var53.x4[2] = (orc_uint8) var45.x4[2];
1793       var53.x4[3] = (orc_uint8) var45.x4[3];
1794       /* 10: mullw */
1795       var54.x4[0] = (var53.x4[0] * var52.x4[0]) & 0xffff;
1796       var54.x4[1] = (var53.x4[1] * var52.x4[1]) & 0xffff;
1797       var54.x4[2] = (var53.x4[2] * var52.x4[2]) & 0xffff;
1798       var54.x4[3] = (var53.x4[3] * var52.x4[3]) & 0xffff;
1799       /* 12: convubw */
1800       var56.x4[0] = (orc_uint8) var55.x4[0];
1801       var56.x4[1] = (orc_uint8) var55.x4[1];
1802       var56.x4[2] = (orc_uint8) var55.x4[2];
1803       var56.x4[3] = (orc_uint8) var55.x4[3];
1804       /* 13: subw */
1805       var57.x4[0] = var56.x4[0] - var52.x4[0];
1806       var57.x4[1] = var56.x4[1] - var52.x4[1];
1807       var57.x4[2] = var56.x4[2] - var52.x4[2];
1808       var57.x4[3] = var56.x4[3] - var52.x4[3];
1809       /* 14: loadl */
1810       var58 = ptr0[i];
1811       /* 15: shrul */
1812       var59.i = ((orc_uint32) var58.i) >> 24;
1813       /* 16: convlw */
1814       var60.i = var59.i;
1815       /* 17: convwb */
1816       var61 = var60.i;
1817       /* 18: splatbl */
1818       var62.i =
1819           ((var61 & 0xff) << 24) | ((var61 & 0xff) << 16) | ((var61 & 0xff) <<
1820           8) | (var61 & 0xff);
1821       /* 19: convubw */
1822       var63.x4[0] = (orc_uint8) var62.x4[0];
1823       var63.x4[1] = (orc_uint8) var62.x4[1];
1824       var63.x4[2] = (orc_uint8) var62.x4[2];
1825       var63.x4[3] = (orc_uint8) var62.x4[3];
1826       /* 20: mullw */
1827       var64.x4[0] = (var63.x4[0] * var57.x4[0]) & 0xffff;
1828       var64.x4[1] = (var63.x4[1] * var57.x4[1]) & 0xffff;
1829       var64.x4[2] = (var63.x4[2] * var57.x4[2]) & 0xffff;
1830       var64.x4[3] = (var63.x4[3] * var57.x4[3]) & 0xffff;
1831       /* 21: div255w */
1832       var65.x4[0] =
1833           ((orc_uint16) (((orc_uint16) (var64.x4[0] + 128)) +
1834               (((orc_uint16) (var64.x4[0] + 128)) >> 8))) >> 8;
1835       var65.x4[1] =
1836           ((orc_uint16) (((orc_uint16) (var64.x4[1] + 128)) +
1837               (((orc_uint16) (var64.x4[1] + 128)) >> 8))) >> 8;
1838       var65.x4[2] =
1839           ((orc_uint16) (((orc_uint16) (var64.x4[2] + 128)) +
1840               (((orc_uint16) (var64.x4[2] + 128)) >> 8))) >> 8;
1841       var65.x4[3] =
1842           ((orc_uint16) (((orc_uint16) (var64.x4[3] + 128)) +
1843               (((orc_uint16) (var64.x4[3] + 128)) >> 8))) >> 8;
1844       /* 22: convubw */
1845       var66.x4[0] = (orc_uint8) var58.x4[0];
1846       var66.x4[1] = (orc_uint8) var58.x4[1];
1847       var66.x4[2] = (orc_uint8) var58.x4[2];
1848       var66.x4[3] = (orc_uint8) var58.x4[3];
1849       /* 23: mullw */
1850       var67.x4[0] = (var66.x4[0] * var65.x4[0]) & 0xffff;
1851       var67.x4[1] = (var66.x4[1] * var65.x4[1]) & 0xffff;
1852       var67.x4[2] = (var66.x4[2] * var65.x4[2]) & 0xffff;
1853       var67.x4[3] = (var66.x4[3] * var65.x4[3]) & 0xffff;
1854       /* 24: addw */
1855       var68.x4[0] = var67.x4[0] + var54.x4[0];
1856       var68.x4[1] = var67.x4[1] + var54.x4[1];
1857       var68.x4[2] = var67.x4[2] + var54.x4[2];
1858       var68.x4[3] = var67.x4[3] + var54.x4[3];
1859       /* 25: addw */
1860       var69.x4[0] = var65.x4[0] + var52.x4[0];
1861       var69.x4[1] = var65.x4[1] + var52.x4[1];
1862       var69.x4[2] = var65.x4[2] + var52.x4[2];
1863       var69.x4[3] = var65.x4[3] + var52.x4[3];
1864       /* 26: divluw */
1865       var70.x4[0] =
1866           ((var69.x4[0] & 0xff) ==
1867           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[0]) /
1868           ((orc_uint16) var69.x4[0] & 0xff));
1869       var70.x4[1] =
1870           ((var69.x4[1] & 0xff) ==
1871           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[1]) /
1872           ((orc_uint16) var69.x4[1] & 0xff));
1873       var70.x4[2] =
1874           ((var69.x4[2] & 0xff) ==
1875           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[2]) /
1876           ((orc_uint16) var69.x4[2] & 0xff));
1877       var70.x4[3] =
1878           ((var69.x4[3] & 0xff) ==
1879           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[3]) /
1880           ((orc_uint16) var69.x4[3] & 0xff));
1881       /* 27: convwb */
1882       var71.x4[0] = var70.x4[0];
1883       var71.x4[1] = var70.x4[1];
1884       var71.x4[2] = var70.x4[2];
1885       var71.x4[3] = var70.x4[3];
1886       /* 29: andl */
1887       var72.i = var71.i & var43.i;
1888       /* 30: convwb */
1889       var73.x4[0] = var69.x4[0];
1890       var73.x4[1] = var69.x4[1];
1891       var73.x4[2] = var69.x4[2];
1892       var73.x4[3] = var69.x4[3];
1893       /* 32: andl */
1894       var74.i = var73.i & var44.i;
1895       /* 33: orl */
1896       var75.i = var72.i | var74.i;
1897       /* 34: storel */
1898       ptr0[i] = var75;
1899     }
1900   }
1901
1902 }
1903
1904 #else
1905 static void
1906 _backup_video_mixer_orc_overlay_bgra (OrcExecutor * ORC_RESTRICT ex)
1907 {
1908   int i;
1909   int j;
1910   int n = ex->n;
1911   int m = ex->params[ORC_VAR_A1];
1912   orc_union32 *ORC_RESTRICT ptr0;
1913   const orc_union32 *ORC_RESTRICT ptr4;
1914   orc_union64 var42;
1915   orc_union32 var43;
1916   orc_union32 var44;
1917   orc_union32 var45;
1918   orc_union32 var46;
1919   orc_union16 var47;
1920   orc_int8 var48;
1921   orc_union32 var49;
1922   orc_union64 var50;
1923   orc_union64 var51;
1924   orc_union64 var52;
1925   orc_union64 var53;
1926   orc_union64 var54;
1927   orc_union32 var55;
1928   orc_union64 var56;
1929   orc_union64 var57;
1930   orc_union32 var58;
1931   orc_union32 var59;
1932   orc_union16 var60;
1933   orc_int8 var61;
1934   orc_union32 var62;
1935   orc_union64 var63;
1936   orc_union64 var64;
1937   orc_union64 var65;
1938   orc_union64 var66;
1939   orc_union64 var67;
1940   orc_union64 var68;
1941   orc_union64 var69;
1942   orc_union64 var70;
1943   orc_union32 var71;
1944   orc_union32 var72;
1945   orc_union32 var73;
1946   orc_union32 var74;
1947   orc_union32 var75;
1948
1949   for (j = 0; j < m; j++) {
1950     ptr0 = ORC_PTR_OFFSET (ex->arrays[0], ex->params[0] * j);
1951     ptr4 = ORC_PTR_OFFSET (ex->arrays[4], ex->params[4] * j);
1952
1953     /* 6: loadpw */
1954     var42.x4[0] = ex->params[24];
1955     var42.x4[1] = ex->params[24];
1956     var42.x4[2] = ex->params[24];
1957     var42.x4[3] = ex->params[24];
1958     /* 11: loadpl */
1959     var55.i = (int) 0xffffffff; /* -1 or 2.122e-314f */
1960     /* 28: loadpl */
1961     var43.i = (int) 0x00ffffff; /* 16777215 or 8.28905e-317f */
1962     /* 31: loadpl */
1963     var44.i = (int) 0xff000000; /* -16777216 or 2.11371e-314f */
1964
1965     for (i = 0; i < n; i++) {
1966       /* 0: loadl */
1967       var45 = ptr4[i];
1968       /* 1: shrul */
1969       var46.i = ((orc_uint32) var45.i) >> 24;
1970       /* 2: convlw */
1971       var47.i = var46.i;
1972       /* 3: convwb */
1973       var48 = var47.i;
1974       /* 4: splatbl */
1975       var49.i =
1976           ((var48 & 0xff) << 24) | ((var48 & 0xff) << 16) | ((var48 & 0xff) <<
1977           8) | (var48 & 0xff);
1978       /* 5: convubw */
1979       var50.x4[0] = (orc_uint8) var49.x4[0];
1980       var50.x4[1] = (orc_uint8) var49.x4[1];
1981       var50.x4[2] = (orc_uint8) var49.x4[2];
1982       var50.x4[3] = (orc_uint8) var49.x4[3];
1983       /* 7: mullw */
1984       var51.x4[0] = (var50.x4[0] * var42.x4[0]) & 0xffff;
1985       var51.x4[1] = (var50.x4[1] * var42.x4[1]) & 0xffff;
1986       var51.x4[2] = (var50.x4[2] * var42.x4[2]) & 0xffff;
1987       var51.x4[3] = (var50.x4[3] * var42.x4[3]) & 0xffff;
1988       /* 8: shruw */
1989       var52.x4[0] = ((orc_uint16) var51.x4[0]) >> 8;
1990       var52.x4[1] = ((orc_uint16) var51.x4[1]) >> 8;
1991       var52.x4[2] = ((orc_uint16) var51.x4[2]) >> 8;
1992       var52.x4[3] = ((orc_uint16) var51.x4[3]) >> 8;
1993       /* 9: convubw */
1994       var53.x4[0] = (orc_uint8) var45.x4[0];
1995       var53.x4[1] = (orc_uint8) var45.x4[1];
1996       var53.x4[2] = (orc_uint8) var45.x4[2];
1997       var53.x4[3] = (orc_uint8) var45.x4[3];
1998       /* 10: mullw */
1999       var54.x4[0] = (var53.x4[0] * var52.x4[0]) & 0xffff;
2000       var54.x4[1] = (var53.x4[1] * var52.x4[1]) & 0xffff;
2001       var54.x4[2] = (var53.x4[2] * var52.x4[2]) & 0xffff;
2002       var54.x4[3] = (var53.x4[3] * var52.x4[3]) & 0xffff;
2003       /* 12: convubw */
2004       var56.x4[0] = (orc_uint8) var55.x4[0];
2005       var56.x4[1] = (orc_uint8) var55.x4[1];
2006       var56.x4[2] = (orc_uint8) var55.x4[2];
2007       var56.x4[3] = (orc_uint8) var55.x4[3];
2008       /* 13: subw */
2009       var57.x4[0] = var56.x4[0] - var52.x4[0];
2010       var57.x4[1] = var56.x4[1] - var52.x4[1];
2011       var57.x4[2] = var56.x4[2] - var52.x4[2];
2012       var57.x4[3] = var56.x4[3] - var52.x4[3];
2013       /* 14: loadl */
2014       var58 = ptr0[i];
2015       /* 15: shrul */
2016       var59.i = ((orc_uint32) var58.i) >> 24;
2017       /* 16: convlw */
2018       var60.i = var59.i;
2019       /* 17: convwb */
2020       var61 = var60.i;
2021       /* 18: splatbl */
2022       var62.i =
2023           ((var61 & 0xff) << 24) | ((var61 & 0xff) << 16) | ((var61 & 0xff) <<
2024           8) | (var61 & 0xff);
2025       /* 19: convubw */
2026       var63.x4[0] = (orc_uint8) var62.x4[0];
2027       var63.x4[1] = (orc_uint8) var62.x4[1];
2028       var63.x4[2] = (orc_uint8) var62.x4[2];
2029       var63.x4[3] = (orc_uint8) var62.x4[3];
2030       /* 20: mullw */
2031       var64.x4[0] = (var63.x4[0] * var57.x4[0]) & 0xffff;
2032       var64.x4[1] = (var63.x4[1] * var57.x4[1]) & 0xffff;
2033       var64.x4[2] = (var63.x4[2] * var57.x4[2]) & 0xffff;
2034       var64.x4[3] = (var63.x4[3] * var57.x4[3]) & 0xffff;
2035       /* 21: div255w */
2036       var65.x4[0] =
2037           ((orc_uint16) (((orc_uint16) (var64.x4[0] + 128)) +
2038               (((orc_uint16) (var64.x4[0] + 128)) >> 8))) >> 8;
2039       var65.x4[1] =
2040           ((orc_uint16) (((orc_uint16) (var64.x4[1] + 128)) +
2041               (((orc_uint16) (var64.x4[1] + 128)) >> 8))) >> 8;
2042       var65.x4[2] =
2043           ((orc_uint16) (((orc_uint16) (var64.x4[2] + 128)) +
2044               (((orc_uint16) (var64.x4[2] + 128)) >> 8))) >> 8;
2045       var65.x4[3] =
2046           ((orc_uint16) (((orc_uint16) (var64.x4[3] + 128)) +
2047               (((orc_uint16) (var64.x4[3] + 128)) >> 8))) >> 8;
2048       /* 22: convubw */
2049       var66.x4[0] = (orc_uint8) var58.x4[0];
2050       var66.x4[1] = (orc_uint8) var58.x4[1];
2051       var66.x4[2] = (orc_uint8) var58.x4[2];
2052       var66.x4[3] = (orc_uint8) var58.x4[3];
2053       /* 23: mullw */
2054       var67.x4[0] = (var66.x4[0] * var65.x4[0]) & 0xffff;
2055       var67.x4[1] = (var66.x4[1] * var65.x4[1]) & 0xffff;
2056       var67.x4[2] = (var66.x4[2] * var65.x4[2]) & 0xffff;
2057       var67.x4[3] = (var66.x4[3] * var65.x4[3]) & 0xffff;
2058       /* 24: addw */
2059       var68.x4[0] = var67.x4[0] + var54.x4[0];
2060       var68.x4[1] = var67.x4[1] + var54.x4[1];
2061       var68.x4[2] = var67.x4[2] + var54.x4[2];
2062       var68.x4[3] = var67.x4[3] + var54.x4[3];
2063       /* 25: addw */
2064       var69.x4[0] = var65.x4[0] + var52.x4[0];
2065       var69.x4[1] = var65.x4[1] + var52.x4[1];
2066       var69.x4[2] = var65.x4[2] + var52.x4[2];
2067       var69.x4[3] = var65.x4[3] + var52.x4[3];
2068       /* 26: divluw */
2069       var70.x4[0] =
2070           ((var69.x4[0] & 0xff) ==
2071           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[0]) /
2072           ((orc_uint16) var69.x4[0] & 0xff));
2073       var70.x4[1] =
2074           ((var69.x4[1] & 0xff) ==
2075           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[1]) /
2076           ((orc_uint16) var69.x4[1] & 0xff));
2077       var70.x4[2] =
2078           ((var69.x4[2] & 0xff) ==
2079           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[2]) /
2080           ((orc_uint16) var69.x4[2] & 0xff));
2081       var70.x4[3] =
2082           ((var69.x4[3] & 0xff) ==
2083           0) ? 255 : ORC_CLAMP_UB (((orc_uint16) var68.x4[3]) /
2084           ((orc_uint16) var69.x4[3] & 0xff));
2085       /* 27: convwb */
2086       var71.x4[0] = var70.x4[0];
2087       var71.x4[1] = var70.x4[1];
2088       var71.x4[2] = var70.x4[2];
2089       var71.x4[3] = var70.x4[3];
2090       /* 29: andl */
2091       var72.i = var71.i & var43.i;
2092       /* 30: convwb */
2093       var73.x4[0] = var69.x4[0];
2094       var73.x4[1] = var69.x4[1];
2095       var73.x4[2] = var69.x4[2];
2096       var73.x4[3] = var69.x4[3];
2097       /* 32: andl */
2098       var74.i = var73.i & var44.i;
2099       /* 33: orl */
2100       var75.i = var72.i | var74.i;
2101       /* 34: storel */
2102       ptr0[i] = var75;
2103     }
2104   }
2105
2106 }
2107
2108 void
2109 video_mixer_orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
2110     const guint8 * ORC_RESTRICT s1, int s1_stride, int p1, int n, int m)
2111 {
2112   OrcExecutor _ex, *ex = &_ex;
2113   static volatile int p_inited = 0;
2114   static OrcCode *c = 0;
2115   void (*func) (OrcExecutor *);
2116
2117   if (!p_inited) {
2118     orc_once_mutex_lock ();
2119     if (!p_inited) {
2120       OrcProgram *p;
2121
2122       p = orc_program_new ();
2123       orc_program_set_2d (p);
2124       orc_program_set_name (p, "video_mixer_orc_overlay_bgra");
2125       orc_program_set_backup_function (p, _backup_video_mixer_orc_overlay_bgra);
2126       orc_program_add_destination (p, 4, "d1");
2127       orc_program_add_source (p, 4, "s1");
2128       orc_program_add_constant (p, 4, 0xffffffff, "c1");
2129       orc_program_add_constant (p, 4, 0xff000000, "c2");
2130       orc_program_add_constant (p, 4, 0x00ffffff, "c3");
2131       orc_program_add_constant (p, 4, 0x00000018, "c4");
2132       orc_program_add_constant (p, 4, 0x00000008, "c5");
2133       orc_program_add_parameter (p, 2, "p1");
2134       orc_program_add_temporary (p, 4, "t1");
2135       orc_program_add_temporary (p, 4, "t2");
2136       orc_program_add_temporary (p, 2, "t3");
2137       orc_program_add_temporary (p, 1, "t4");
2138       orc_program_add_temporary (p, 8, "t5");
2139       orc_program_add_temporary (p, 8, "t6");
2140       orc_program_add_temporary (p, 8, "t7");
2141       orc_program_add_temporary (p, 4, "t8");
2142       orc_program_add_temporary (p, 8, "t9");
2143       orc_program_add_temporary (p, 8, "t10");
2144
2145       orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_S1, ORC_VAR_D1,
2146           ORC_VAR_D1);
2147       orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C4,
2148           ORC_VAR_D1);
2149       orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
2150           ORC_VAR_D1);
2151       orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
2152           ORC_VAR_D1);
2153       orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_D1,
2154           ORC_VAR_D1);
2155       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T5, ORC_VAR_T8, ORC_VAR_D1,
2156           ORC_VAR_D1);
2157       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_P1,
2158           ORC_VAR_D1);
2159       orc_program_append_2 (p, "shruw", 2, ORC_VAR_T5, ORC_VAR_T5, ORC_VAR_C5,
2160           ORC_VAR_D1);
2161       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T10, ORC_VAR_T1,
2162           ORC_VAR_D1, ORC_VAR_D1);
2163       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T10, ORC_VAR_T10, ORC_VAR_T5,
2164           ORC_VAR_D1);
2165       orc_program_append_2 (p, "loadpl", 0, ORC_VAR_T8, ORC_VAR_C1, ORC_VAR_D1,
2166           ORC_VAR_D1);
2167       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T6, ORC_VAR_T8, ORC_VAR_D1,
2168           ORC_VAR_D1);
2169       orc_program_append_2 (p, "subw", 2, ORC_VAR_T6, ORC_VAR_T6, ORC_VAR_T5,
2170           ORC_VAR_D1);
2171       orc_program_append_2 (p, "loadl", 0, ORC_VAR_T1, ORC_VAR_D1, ORC_VAR_D1,
2172           ORC_VAR_D1);
2173       orc_program_append_2 (p, "shrul", 0, ORC_VAR_T2, ORC_VAR_T1, ORC_VAR_C4,
2174           ORC_VAR_D1);
2175       orc_program_append_2 (p, "convlw", 0, ORC_VAR_T3, ORC_VAR_T2, ORC_VAR_D1,
2176           ORC_VAR_D1);
2177       orc_program_append_2 (p, "convwb", 0, ORC_VAR_T4, ORC_VAR_T3, ORC_VAR_D1,
2178           ORC_VAR_D1);
2179       orc_program_append_2 (p, "splatbl", 0, ORC_VAR_T8, ORC_VAR_T4, ORC_VAR_D1,
2180           ORC_VAR_D1);
2181       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T7, ORC_VAR_T8, ORC_VAR_D1,
2182           ORC_VAR_D1);
2183       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T6,
2184           ORC_VAR_D1);
2185       orc_program_append_2 (p, "div255w", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_D1,
2186           ORC_VAR_D1);
2187       orc_program_append_2 (p, "convubw", 2, ORC_VAR_T9, ORC_VAR_T1, ORC_VAR_D1,
2188           ORC_VAR_D1);
2189       orc_program_append_2 (p, "mullw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T7,
2190           ORC_VAR_D1);
2191       orc_program_append_2 (p, "addw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T10,
2192           ORC_VAR_D1);
2193       orc_program_append_2 (p, "addw", 2, ORC_VAR_T7, ORC_VAR_T7, ORC_VAR_T5,
2194           ORC_VAR_D1);
2195       orc_program_append_2 (p, "divluw", 2, ORC_VAR_T9, ORC_VAR_T9, ORC_VAR_T7,
2196           ORC_VAR_D1);
2197       orc_program_append_2 (p, "convwb", 2, ORC_VAR_T1, ORC_VAR_T9, ORC_VAR_D1,
2198           ORC_VAR_D1);
2199       orc_program_append_2 (p, "andl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_C3,
2200           ORC_VAR_D1);
2201       orc_program_append_2 (p, "convwb", 2, ORC_VAR_T8, ORC_VAR_T7, ORC_VAR_D1,
2202           ORC_VAR_D1);
2203       orc_program_append_2 (p, "andl", 0, ORC_VAR_T8, ORC_VAR_T8, ORC_VAR_C2,
2204           ORC_VAR_D1);
2205       orc_program_append_2 (p, "orl", 0, ORC_VAR_T1, ORC_VAR_T1, ORC_VAR_T8,
2206           ORC_VAR_D1);
2207       orc_program_append_2 (p, "storel", 0, ORC_VAR_D1, ORC_VAR_T1, ORC_VAR_D1,
2208           ORC_VAR_D1);
2209
2210       orc_program_compile (p);
2211       c = orc_program_take_code (p);
2212       orc_program_free (p);
2213     }
2214     p_inited = TRUE;
2215     orc_once_mutex_unlock ();
2216   }
2217   ex->arrays[ORC_VAR_A2] = c;
2218   ex->program = 0;
2219
2220   ex->n = n;
2221   ORC_EXECUTOR_M (ex) = m;
2222   ex->arrays[ORC_VAR_D1] = d1;
2223   ex->params[ORC_VAR_D1] = d1_stride;
2224   ex->arrays[ORC_VAR_S1] = (void *) s1;
2225   ex->params[ORC_VAR_S1] = s1_stride;
2226   ex->params[ORC_VAR_P1] = p1;
2227
2228   func = c->exec;
2229   func (ex);
2230 }
2231 #endif