blob: e1f2ec4badd4632748588b3cc478ddc60f065d2d [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1998-2003 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26
27
28#include "vis_proto.h"
29#include "mlib_image.h"
30#include "mlib_v_ImageLookUpFunc.h"
31
32/***************************************************************/
33static void mlib_v_ImageLookUpSI_S32_S16_2_DstA8D1(const mlib_s32 *src,
34 mlib_s16 *dst,
35 mlib_s32 xsize,
36 const mlib_s16 **table);
37
38static void mlib_v_ImageLookUpSI_S32_S16_2_D1(const mlib_s32 *src,
39 mlib_s16 *dst,
40 mlib_s32 xsize,
41 const mlib_s16 **table);
42
43static void mlib_v_ImageLookUpSI_S32_S16_3_D1(const mlib_s32 *src,
44 mlib_s16 *dst,
45 mlib_s32 xsize,
46 const mlib_s16 **table);
47
48static void mlib_v_ImageLookUpSI_S32_S16_4_DstOff0_D1(const mlib_s32 *src,
49 mlib_s16 *dst,
50 mlib_s32 xsize,
51 const mlib_s16 **table);
52
53static void mlib_v_ImageLookUpSI_S32_S16_4_DstOff1_D1(const mlib_s32 *src,
54 mlib_s16 *dst,
55 mlib_s32 xsize,
56 const mlib_s16 **table);
57
58static void mlib_v_ImageLookUpSI_S32_S16_4_DstOff2_D1(const mlib_s32 *src,
59 mlib_s16 *dst,
60 mlib_s32 xsize,
61 const mlib_s16 **table);
62
63static void mlib_v_ImageLookUpSI_S32_S16_4_DstOff3_D1(const mlib_s32 *src,
64 mlib_s16 *dst,
65 mlib_s32 xsize,
66 const mlib_s16 **table);
67
68/***************************************************************/
69#define VIS_LD_U16_I(X, Y) vis_ld_u16_i((void *)(X), (Y))
70
71/***************************************************************/
72void mlib_v_ImageLookUpSI_S32_S16_2_DstA8D1(const mlib_s32 *src,
73 mlib_s16 *dst,
74 mlib_s32 xsize,
75 const mlib_s16 **table)
76{
77 mlib_s32 *sp; /* pointer to source data */
78 mlib_s32 s0, s1; /* source data */
79 mlib_s16 *dl; /* pointer to start of destination */
80 mlib_d64 *dp; /* aligned pointer to destination */
81 mlib_d64 t0, t1, t2; /* destination data */
82 mlib_d64 t3, acc; /* destination data */
83 mlib_s32 i; /* loop variable */
84 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
85 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
86
87 sp = (void *)src;
88 dl = dst;
89 dp = (mlib_d64 *) dl;
90
91 vis_alignaddr((void *)0, 6);
92
93 if (xsize >= 2) {
94
95 s0 = sp[0];
96 s1 = sp[1];
97 sp += 2;
98
99#pragma pipeloop(0)
100 for (i = 0; i <= xsize - 4; i += 2, sp += 2) {
101 t3 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s1));
102 t2 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
103 t1 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
104 t0 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s0));
105 acc = vis_faligndata(t3, acc);
106 acc = vis_faligndata(t2, acc);
107 acc = vis_faligndata(t1, acc);
108 acc = vis_faligndata(t0, acc);
109 s0 = sp[0];
110 s1 = sp[1];
111 *dp++ = acc;
112 }
113
114 t3 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s1));
115 t2 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
116 t1 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
117 t0 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s0));
118 acc = vis_faligndata(t3, acc);
119 acc = vis_faligndata(t2, acc);
120 acc = vis_faligndata(t1, acc);
121 acc = vis_faligndata(t0, acc);
122 *dp++ = acc;
123 }
124
125 if ((xsize & 1) != 0) {
126 s0 = sp[0];
127 t1 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
128 t0 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s0));
129 acc = vis_faligndata(t1, acc);
130 acc = vis_faligndata(t0, acc);
131 *(mlib_f32 *) dp = vis_read_hi(acc);
132 }
133}
134
135/***************************************************************/
136void mlib_v_ImageLookUpSI_S32_S16_2_D1(const mlib_s32 *src,
137 mlib_s16 *dst,
138 mlib_s32 xsize,
139 const mlib_s16 **table)
140{
141 mlib_s32 *sp; /* pointer to source data */
142 mlib_s32 s0, s1, s2; /* source data */
143 mlib_s16 *dl; /* pointer to start of destination */
144 mlib_d64 *dp; /* aligned pointer to destination */
145 mlib_d64 t0, t1, t2; /* destination data */
146 mlib_d64 t3, acc; /* destination data */
147 mlib_s32 i; /* loop variable */
148 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
149 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
150
151 sp = (void *)src;
152 dl = dst;
153
154 vis_alignaddr((void *)0, 6);
155
156 s0 = *sp++;
157 *dl++ = tab0[s0];
158 dp = (mlib_d64 *) dl;
159 xsize--;
160
161 if (xsize >= 2) {
162
163 s1 = sp[0];
164 s2 = sp[1];
165 sp += 2;
166
167#pragma pipeloop(0)
168 for (i = 0; i <= xsize - 4; i += 2, sp += 2) {
169 t3 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s2));
170 t2 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s1));
171 t1 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
172 t0 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
173 acc = vis_faligndata(t3, acc);
174 acc = vis_faligndata(t2, acc);
175 acc = vis_faligndata(t1, acc);
176 acc = vis_faligndata(t0, acc);
177 s0 = s2;
178 s1 = sp[0];
179 s2 = sp[1];
180 *dp++ = acc;
181 }
182
183 t3 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s2));
184 t2 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s1));
185 t1 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
186 t0 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
187 acc = vis_faligndata(t3, acc);
188 acc = vis_faligndata(t2, acc);
189 acc = vis_faligndata(t1, acc);
190 acc = vis_faligndata(t0, acc);
191 s0 = s2;
192 *dp++ = acc;
193 }
194
195 dl = (mlib_s16 *) dp;
196
197 if ((xsize & 1) != 0) {
198 s1 = sp[0];
199 t1 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
200 t0 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
201 acc = vis_faligndata(t1, acc);
202 acc = vis_faligndata(t0, acc);
203 *(mlib_f32 *) dp = vis_read_hi(acc);
204 s0 = s1;
205 dl += 2;
206 }
207
208 *dl = tab1[s0];
209}
210
211/***************************************************************/
212void mlib_v_ImageLookUpSI_S32_S16_2(const mlib_s32 *src,
213 mlib_s32 slb,
214 mlib_s16 *dst,
215 mlib_s32 dlb,
216 mlib_s32 xsize,
217 mlib_s32 ysize,
218 const mlib_s16 **table)
219{
220 mlib_s32 *sl;
221 mlib_s16 *dl;
222 mlib_s32 j;
223 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
224 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
225
226 sl = (void *)src;
227 dl = dst;
228
229 /* row loop */
230 for (j = 0; j < ysize; j++) {
231 mlib_s32 *sp = sl;
232 mlib_s16 *dp = dl;
233 mlib_s32 off, s0, size = xsize;
234
235 off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7));
236
237 if ((off >= 4) && (size > 0)) {
238 s0 = *sp++;
239 *dp++ = tab0[s0];
240 *dp++ = tab1[s0];
241 size--;
242 }
243
244 if (size > 0) {
245
246 if (((mlib_addr) dp & 7) == 0) {
247 mlib_v_ImageLookUpSI_S32_S16_2_DstA8D1(sp, dp, size, table);
248 }
249 else {
250 mlib_v_ImageLookUpSI_S32_S16_2_D1(sp, dp, size, table);
251 }
252 }
253
254 sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
255 dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
256 }
257}
258
259/***************************************************************/
260void mlib_v_ImageLookUpSI_S32_S16_3_D1(const mlib_s32 *src,
261 mlib_s16 *dst,
262 mlib_s32 xsize,
263 const mlib_s16 **table)
264{
265 mlib_s32 *sp; /* pointer to source data */
266 mlib_s16 *dl; /* pointer to start of destination */
267 mlib_d64 *dp; /* aligned pointer to destination */
268 mlib_d64 t0, t1, t2, t3; /* destination data */
269 mlib_d64 acc0, acc1, acc2; /* destination data */
270 mlib_s32 i; /* loop variable */
271 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
272 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
273 const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
274 mlib_s32 s00, s01, s02, s03;
275
276 sp = (void *)src;
277 dl = dst;
278 dp = (mlib_d64 *) dl;
279
280 vis_alignaddr((void *)0, 6);
281
282 i = 0;
283
284 if (xsize >= 4) {
285
286 s00 = sp[0];
287 s01 = sp[1];
288 s02 = sp[2];
289 s03 = sp[3];
290 sp += 4;
291
292#pragma pipeloop(0)
293 for (i = 0; i <= xsize - 8; i += 4, sp += 4) {
294 t3 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s01));
295 t2 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s00));
296 t1 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s00));
297 t0 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s00));
298 acc0 = vis_faligndata(t3, acc0);
299 acc0 = vis_faligndata(t2, acc0);
300 acc0 = vis_faligndata(t1, acc0);
301 acc0 = vis_faligndata(t0, acc0);
302 t3 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s02));
303 t2 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s02));
304 t1 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s01));
305 t0 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s01));
306 acc1 = vis_faligndata(t3, acc1);
307 acc1 = vis_faligndata(t2, acc1);
308 acc1 = vis_faligndata(t1, acc1);
309 acc1 = vis_faligndata(t0, acc1);
310 t3 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s03));
311 t2 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s03));
312 t1 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s03));
313 t0 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s02));
314 acc2 = vis_faligndata(t3, acc2);
315 acc2 = vis_faligndata(t2, acc2);
316 acc2 = vis_faligndata(t1, acc2);
317 acc2 = vis_faligndata(t0, acc2);
318 s00 = sp[0];
319 s01 = sp[1];
320 s02 = sp[2];
321 s03 = sp[3];
322 *dp++ = acc0;
323 *dp++ = acc1;
324 *dp++ = acc2;
325 }
326
327 t3 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s01));
328 t2 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s00));
329 t1 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s00));
330 t0 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s00));
331 acc0 = vis_faligndata(t3, acc0);
332 acc0 = vis_faligndata(t2, acc0);
333 acc0 = vis_faligndata(t1, acc0);
334 acc0 = vis_faligndata(t0, acc0);
335 t3 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s02));
336 t2 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s02));
337 t1 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s01));
338 t0 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s01));
339 acc1 = vis_faligndata(t3, acc1);
340 acc1 = vis_faligndata(t2, acc1);
341 acc1 = vis_faligndata(t1, acc1);
342 acc1 = vis_faligndata(t0, acc1);
343 t3 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s03));
344 t2 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s03));
345 t1 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s03));
346 t0 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s02));
347 acc2 = vis_faligndata(t3, acc2);
348 acc2 = vis_faligndata(t2, acc2);
349 acc2 = vis_faligndata(t1, acc2);
350 acc2 = vis_faligndata(t0, acc2);
351 *dp++ = acc0;
352 *dp++ = acc1;
353 *dp++ = acc2;
354 i += 4;
355 }
356
357 dl = (mlib_s16 *) dp;
358
359#pragma pipeloop(0)
360 for (; i < xsize; i++) {
361 s00 = sp[0];
362 dl[0] = tab0[s00];
363 dl[1] = tab1[s00];
364 dl[2] = tab2[s00];
365 dl += 3;
366 sp++;
367 }
368}
369
370/***************************************************************/
371void mlib_v_ImageLookUpSI_S32_S16_3(const mlib_s32 *src,
372 mlib_s32 slb,
373 mlib_s16 *dst,
374 mlib_s32 dlb,
375 mlib_s32 xsize,
376 mlib_s32 ysize,
377 const mlib_s16 **table)
378{
379 mlib_s32 *sl;
380 mlib_s16 *dl;
381 mlib_s32 i, j;
382 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
383 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
384 const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
385
386 sl = (void *)src;
387 dl = dst;
388
389 /* row loop */
390 for (j = 0; j < ysize; j++) {
391 mlib_s32 *sp = sl;
392 mlib_s16 *dp = dl;
393 mlib_s32 off, s0, size = xsize;
394
395 off = (mlib_s32) (((mlib_addr) dp & 7) >> 1);
396 off = (off < size) ? off : size;
397
398 for (i = 0; i < off; i++) {
399 s0 = *sp++;
400 *dp++ = tab0[s0];
401 *dp++ = tab1[s0];
402 *dp++ = tab2[s0];
403 size--;
404 }
405
406 if (size > 0) {
407 mlib_v_ImageLookUpSI_S32_S16_3_D1(sp, dp, size, table);
408 }
409
410 sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
411 dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
412 }
413}
414
415/***************************************************************/
416void mlib_v_ImageLookUpSI_S32_S16_4_DstOff0_D1(const mlib_s32 *src,
417 mlib_s16 *dst,
418 mlib_s32 xsize,
419 const mlib_s16 **table)
420{
421 mlib_s32 *sp; /* pointer to source data */
422 mlib_s32 s0; /* source data */
423 mlib_s16 *dl; /* pointer to start of destination */
424 mlib_d64 *dp; /* aligned pointer to destination */
425 mlib_d64 t0, t1, t2, t3; /* destination data */
426 mlib_d64 acc; /* destination data */
427 mlib_s32 i; /* loop variable */
428 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
429 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
430 const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
431 const mlib_s16 *tab3 = &table[3][(mlib_u32) 2147483648u];
432
433 sp = (void *)src;
434 dl = dst;
435 dp = (mlib_d64 *) dl;
436
437 vis_alignaddr((void *)0, 6);
438
439 if (xsize >= 1) {
440
441 s0 = *sp++;
442
443#pragma pipeloop(0)
444 for (i = 0; i <= xsize - 2; i++) {
445 t3 = VIS_LD_U16_I(tab3, ((mlib_addr) 2 * s0));
446 t2 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s0));
447 t1 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
448 t0 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s0));
449 acc = vis_faligndata(t3, acc);
450 acc = vis_faligndata(t2, acc);
451 acc = vis_faligndata(t1, acc);
452 acc = vis_faligndata(t0, acc);
453 s0 = *sp++;
454 *dp++ = acc;
455 }
456
457 t3 = VIS_LD_U16_I(tab3, ((mlib_addr) 2 * s0));
458 t2 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s0));
459 t1 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
460 t0 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s0));
461 acc = vis_faligndata(t3, acc);
462 acc = vis_faligndata(t2, acc);
463 acc = vis_faligndata(t1, acc);
464 acc = vis_faligndata(t0, acc);
465 *dp++ = acc;
466 }
467}
468
469/***************************************************************/
470void mlib_v_ImageLookUpSI_S32_S16_4_DstOff1_D1(const mlib_s32 *src,
471 mlib_s16 *dst,
472 mlib_s32 xsize,
473 const mlib_s16 **table)
474{
475 mlib_s32 *sp; /* pointer to source data */
476 mlib_s32 s0, s1; /* source data */
477 mlib_s16 *dl; /* pointer to start of destination */
478 mlib_d64 *dp; /* aligned pointer to destination */
479 mlib_d64 t0, t1, t2, t3; /* destination data */
480 mlib_d64 acc; /* destination data */
481 mlib_s32 i; /* loop variable */
482 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
483 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
484 const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
485 const mlib_s16 *tab3 = &table[3][(mlib_u32) 2147483648u];
486
487 sp = (void *)src;
488 dl = dst;
489 dp = (mlib_d64 *) dl;
490
491 vis_alignaddr((void *)0, 6);
492
493 s0 = *sp++;
494
495 if (xsize >= 1) {
496
497 s1 = *sp++;
498
499#pragma pipeloop(0)
500 for (i = 0; i <= xsize - 2; i++) {
501 t3 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
502 t2 = VIS_LD_U16_I(tab3, ((mlib_addr) 2 * s0));
503 t1 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s0));
504 t0 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
505 acc = vis_faligndata(t3, acc);
506 acc = vis_faligndata(t2, acc);
507 acc = vis_faligndata(t1, acc);
508 acc = vis_faligndata(t0, acc);
509 s0 = s1;
510 s1 = *sp++;
511 *dp++ = acc;
512 }
513
514 t3 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
515 t2 = VIS_LD_U16_I(tab3, ((mlib_addr) 2 * s0));
516 t1 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s0));
517 t0 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s0));
518 acc = vis_faligndata(t3, acc);
519 acc = vis_faligndata(t2, acc);
520 acc = vis_faligndata(t1, acc);
521 acc = vis_faligndata(t0, acc);
522 s0 = s1;
523 *dp++ = acc;
524 }
525
526 dl = (mlib_s16 *) dp;
527
528 dl[0] = tab1[s0];
529 dl[1] = tab2[s0];
530 dl[2] = tab3[s0];
531}
532
533/***************************************************************/
534void mlib_v_ImageLookUpSI_S32_S16_4_DstOff2_D1(const mlib_s32 *src,
535 mlib_s16 *dst,
536 mlib_s32 xsize,
537 const mlib_s16 **table)
538{
539 mlib_s32 *sp; /* pointer to source data */
540 mlib_s32 s0, s1; /* source data */
541 mlib_s16 *dl; /* pointer to start of destination */
542 mlib_d64 *dp; /* aligned pointer to destination */
543 mlib_d64 t0, t1, t2, t3; /* destination data */
544 mlib_d64 acc; /* destination data */
545 mlib_s32 i; /* loop variable */
546 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
547 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
548 const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
549 const mlib_s16 *tab3 = &table[3][(mlib_u32) 2147483648u];
550
551 sp = (void *)src;
552 dl = dst;
553 dp = (mlib_d64 *) dl;
554
555 vis_alignaddr((void *)0, 6);
556
557 s0 = *sp++;
558
559 if (xsize >= 1) {
560
561 s1 = *sp++;
562
563#pragma pipeloop(0)
564 for (i = 0; i <= xsize - 2; i++) {
565 t3 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s1));
566 t2 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
567 t1 = VIS_LD_U16_I(tab3, ((mlib_addr) 2 * s0));
568 t0 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s0));
569 acc = vis_faligndata(t3, acc);
570 acc = vis_faligndata(t2, acc);
571 acc = vis_faligndata(t1, acc);
572 acc = vis_faligndata(t0, acc);
573 s0 = s1;
574 s1 = *sp++;
575 *dp++ = acc;
576 }
577
578 t3 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s1));
579 t2 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
580 t1 = VIS_LD_U16_I(tab3, ((mlib_addr) 2 * s0));
581 t0 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s0));
582 acc = vis_faligndata(t3, acc);
583 acc = vis_faligndata(t2, acc);
584 acc = vis_faligndata(t1, acc);
585 acc = vis_faligndata(t0, acc);
586 s0 = s1;
587 *dp++ = acc;
588 }
589
590 dl = (mlib_s16 *) dp;
591
592 dl[0] = tab2[s0];
593 dl[1] = tab3[s0];
594}
595
596/***************************************************************/
597void mlib_v_ImageLookUpSI_S32_S16_4_DstOff3_D1(const mlib_s32 *src,
598 mlib_s16 *dst,
599 mlib_s32 xsize,
600 const mlib_s16 **table)
601{
602 mlib_s32 *sp; /* pointer to source data */
603 mlib_s32 s0, s1; /* source data */
604 mlib_s16 *dl; /* pointer to start of destination */
605 mlib_d64 *dp; /* aligned pointer to destination */
606 mlib_d64 t0, t1, t2, t3; /* destination data */
607 mlib_d64 acc; /* destination data */
608 mlib_s32 i; /* loop variable */
609 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
610 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
611 const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
612 const mlib_s16 *tab3 = &table[3][(mlib_u32) 2147483648u];
613
614 sp = (void *)src;
615 dl = dst;
616 dp = (mlib_d64 *) dl;
617
618 vis_alignaddr((void *)0, 6);
619
620 s0 = *sp++;
621
622 if (xsize >= 1) {
623
624 s1 = *sp++;
625
626#pragma pipeloop(0)
627 for (i = 0; i <= xsize - 2; i++) {
628 t3 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s1));
629 t2 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s1));
630 t1 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
631 t0 = VIS_LD_U16_I(tab3, ((mlib_addr) 2 * s0));
632 acc = vis_faligndata(t3, acc);
633 acc = vis_faligndata(t2, acc);
634 acc = vis_faligndata(t1, acc);
635 acc = vis_faligndata(t0, acc);
636 s0 = s1;
637 s1 = *sp++;
638 *dp++ = acc;
639 }
640
641 t3 = VIS_LD_U16_I(tab2, ((mlib_addr) 2 * s1));
642 t2 = VIS_LD_U16_I(tab1, ((mlib_addr) 2 * s1));
643 t1 = VIS_LD_U16_I(tab0, ((mlib_addr) 2 * s1));
644 t0 = VIS_LD_U16_I(tab3, ((mlib_addr) 2 * s0));
645 acc = vis_faligndata(t3, acc);
646 acc = vis_faligndata(t2, acc);
647 acc = vis_faligndata(t1, acc);
648 acc = vis_faligndata(t0, acc);
649 s0 = s1;
650 *dp++ = acc;
651 }
652
653 dl = (mlib_s16 *) dp;
654
655 dl[0] = tab3[s0];
656}
657
658/***************************************************************/
659void mlib_v_ImageLookUpSI_S32_S16_4(const mlib_s32 *src,
660 mlib_s32 slb,
661 mlib_s16 *dst,
662 mlib_s32 dlb,
663 mlib_s32 xsize,
664 mlib_s32 ysize,
665 const mlib_s16 **table)
666{
667 mlib_s32 *sl;
668 mlib_s16 *dl;
669 mlib_s32 j;
670 const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
671 const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
672 const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
673
674 sl = (void *)src;
675 dl = dst;
676
677 /* row loop */
678 for (j = 0; j < ysize; j++) {
679 mlib_s32 *sp = sl;
680 mlib_s16 *dp = dl;
681 mlib_s32 off, s0, size = xsize;
682
683 if (size > 0) {
684 off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);
685
686 if (off == 0) {
687 mlib_v_ImageLookUpSI_S32_S16_4_DstOff0_D1(sp, dp, size, table);
688 }
689 else if (off == 1) {
690 s0 = *sp;
691 *dp++ = tab0[s0];
692 size--;
693 mlib_v_ImageLookUpSI_S32_S16_4_DstOff1_D1(sp, dp, size, table);
694 }
695 else if (off == 2) {
696 s0 = *sp;
697 *dp++ = tab0[s0];
698 *dp++ = tab1[s0];
699 size--;
700 mlib_v_ImageLookUpSI_S32_S16_4_DstOff2_D1(sp, dp, size, table);
701 }
702 else if (off == 3) {
703 s0 = *sp;
704 *dp++ = tab0[s0];
705 *dp++ = tab1[s0];
706 *dp++ = tab2[s0];
707 size--;
708 mlib_v_ImageLookUpSI_S32_S16_4_DstOff3_D1(sp, dp, size, table);
709 }
710 }
711
712 sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
713 dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
714 }
715}
716
717/***************************************************************/