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