0N/A/*
2362N/A * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/A
0N/A
0N/A/*
0N/A * The functions step along the lines from xLeft to xRight and apply
0N/A * the bicubic filtering.
0N/A *
0N/A */
0N/A
0N/A#include "vis_proto.h"
0N/A#include "mlib_ImageAffine.h"
0N/A#include "mlib_v_ImageFilters.h"
0N/A
0N/A/***************************************************************/
0N/A#define DTYPE mlib_s16
0N/A
0N/A#define FILTER_BITS 9
0N/A
0N/A/***************************************************************/
0N/A#define sPtr srcPixelPtr
0N/A
0N/A/***************************************************************/
0N/A#define NEXT_PIXEL_1BC_S16() \
0N/A xSrc = (X >> MLIB_SHIFT)-1; \
0N/A ySrc = (Y >> MLIB_SHIFT)-1; \
0N/A sPtr = (mlib_s16 *)lineAddr[ySrc] + xSrc
0N/A
0N/A/***************************************************************/
0N/A#define LOAD_BC_S16_1CH_1PIXEL(mlib_filters_s16, mlib_filters_s16_4) \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A row0 = vis_faligndata(data0, data1); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A row1 = vis_faligndata(data0, data1); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A row2 = vis_faligndata(data0, data1); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A row3 = vis_faligndata(data0, data1); \
0N/A filterposy = (Y >> FILTER_SHIFT) & FILTER_MASK; \
0N/A yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \
0N/A yFilter0 = yPtr[0]; \
0N/A yFilter1 = yPtr[1]; \
0N/A yFilter2 = yPtr[2]; \
0N/A yFilter3 = yPtr[3]; \
0N/A filterposx = (X >> FILTER_SHIFT) & FILTER_MASK; \
0N/A xFilter = *((mlib_d64 *)((mlib_u8 *)mlib_filters_s16 + filterposx)); \
0N/A X += dX; \
0N/A Y += dY
0N/A
0N/A/***************************************************************/
0N/A#define RESULT_1BC_S16_1PIXEL() \
0N/A u0 = vis_fmul8sux16(vis_fxor(row0, mask8000), yFilter0); \
0N/A u1 = vis_fmul8ulx16(vis_fxor(row0, mask8000), yFilter0); \
0N/A u2 = vis_fmul8sux16(vis_fxor(row1, mask8000), yFilter1); \
0N/A v0 = vis_fpadd16(u0, u1); \
0N/A u3 = vis_fmul8ulx16(vis_fxor(row1, mask8000), yFilter1); \
0N/A u0 = vis_fmul8sux16(vis_fxor(row2, mask8000), yFilter2); \
0N/A v1 = vis_fpadd16(u2, u3); \
0N/A u1 = vis_fmul8ulx16(vis_fxor(row2, mask8000), yFilter2); \
0N/A sum = vis_fpadd16(v0, v1); \
0N/A u2 = vis_fmul8sux16(vis_fxor(row3, mask8000), yFilter3); \
0N/A v2 = vis_fpadd16(u0, u1); \
0N/A u3 = vis_fmul8ulx16(vis_fxor(row3, mask8000), yFilter3); \
0N/A sum = vis_fpadd16(sum, v2); \
0N/A v3 = vis_fpadd16(u2, u3); \
0N/A sum = vis_fpadd16(sum, v3); \
0N/A d00 = vis_fmul8sux16(sum, xFilter); \
0N/A d10 = vis_fmul8ulx16(sum, xFilter); \
0N/A d0 = vis_fpadd16(d00, d10); \
0N/A p0 = vis_fpadd16s(vis_read_hi(d0), vis_read_lo(d0)); \
0N/A d0 = vis_fmuld8sux16(f_x01000100, p0); \
0N/A d1 = vis_write_lo(d1, vis_fpadd32s(vis_read_hi(d0), vis_read_lo(d0))); \
0N/A res = vis_fxor(vis_fpackfix_pair(d1, d1), mask8000)
0N/A
0N/A/***************************************************************/
0N/A#define BC_S16_1CH(ind, mlib_filters_s16, mlib_filters_s16_4) \
0N/A u0 = vis_fmul8sux16(vis_fxor(row0, mask8000), yFilter0); \
0N/A u1 = vis_fmul8ulx16(vis_fxor(row0, mask8000), yFilter0); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u2 = vis_fmul8sux16(vis_fxor(row1, mask8000), yFilter1); \
0N/A v0 = vis_fpadd16(u0, u1); \
0N/A data0 = dpSrc[0]; \
0N/A filterposy = (Y >> FILTER_SHIFT); \
0N/A u3 = vis_fmul8ulx16(vis_fxor(row1, mask8000), yFilter1); \
0N/A data1 = dpSrc[1]; \
0N/A row0 = vis_faligndata(data0, data1); \
0N/A filterposx = (X >> FILTER_SHIFT); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u0 = vis_fmul8sux16(vis_fxor(row2, mask8000), yFilter2); \
0N/A v1 = vis_fpadd16(u2, u3); \
0N/A data0 = dpSrc[0]; \
0N/A u1 = vis_fmul8ulx16(vis_fxor(row2, mask8000), yFilter2); \
0N/A sum = vis_fpadd16(v0, v1); \
0N/A X += dX; \
0N/A data1 = dpSrc[1]; \
0N/A row1 = vis_faligndata(data0, data1); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u2 = vis_fmul8sux16(vis_fxor(row3, mask8000), yFilter3); \
0N/A v2 = vis_fpadd16(u0, u1); \
0N/A Y += dY; \
0N/A xSrc = (X >> MLIB_SHIFT)-1; \
0N/A data0 = dpSrc[0]; \
0N/A u3 = vis_fmul8ulx16(vis_fxor(row3, mask8000), yFilter3); \
0N/A sum = vis_fpadd16(sum, v2); \
0N/A ySrc = (Y >> MLIB_SHIFT)-1; \
0N/A data1 = dpSrc[1]; \
0N/A filterposy &= FILTER_MASK; \
0N/A row2 = vis_faligndata(data0, data1); \
0N/A sPtr += srcYStride; \
0N/A filterposx &= FILTER_MASK; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A v3 = vis_fpadd16(u2, u3); \
0N/A data1 = dpSrc[1]; \
0N/A row3 = vis_faligndata(data0, data1); \
0N/A yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \
0N/A yFilter0 = yPtr[0]; \
0N/A sum = vis_fpadd16(sum, v3); \
0N/A yFilter1 = yPtr[1]; \
0N/A d0 = vis_fmul8sux16(sum, xFilter); \
0N/A yFilter2 = yPtr[2]; \
0N/A d1 = vis_fmul8ulx16(sum, xFilter); \
0N/A yFilter3 = yPtr[3]; \
0N/A xFilter = *((mlib_d64 *)((mlib_u8 *)mlib_filters_s16 + filterposx)); \
0N/A d0##ind = vis_fpadd16(d0, d1); \
0N/A sPtr = (mlib_s16 *)lineAddr[ySrc] + xSrc
0N/A
0N/A/***************************************************************/
0N/A#define FADD_1BC_S16() \
0N/A p0 = vis_fpadd16s(vis_read_hi(d00), vis_read_lo(d00)); \
0N/A p1 = vis_fpadd16s(vis_read_hi(d01), vis_read_lo(d01)); \
0N/A p2 = vis_fpadd16s(vis_read_hi(d02), vis_read_lo(d02)); \
0N/A p3 = vis_fpadd16s(vis_read_hi(d03), vis_read_lo(d03)); \
0N/A d0 = vis_fmuld8sux16(f_x01000100, p0); \
0N/A d1 = vis_fmuld8sux16(f_x01000100, p1); \
0N/A d2 = vis_fmuld8sux16(f_x01000100, p2); \
0N/A d3 = vis_fmuld8sux16(f_x01000100, p3); \
0N/A d0 = vis_freg_pair(vis_fpadd32s(vis_read_hi(d0), vis_read_lo(d0)), \
0N/A vis_fpadd32s(vis_read_hi(d1), vis_read_lo(d1))); \
0N/A d1 = vis_freg_pair(vis_fpadd32s(vis_read_hi(d2), vis_read_lo(d2)), \
0N/A vis_fpadd32s(vis_read_hi(d3), vis_read_lo(d3))); \
0N/A res = vis_fxor(vis_fpackfix_pair(d0, d1), mask8000)
0N/A
0N/A/***************************************************************/
0N/Amlib_status mlib_ImageAffine_u16_1ch_bc (mlib_affine_param *param)
0N/A{
0N/A DECLAREVAR_BC();
0N/A mlib_s32 filterposx, filterposy;
0N/A mlib_d64 data0, data1;
0N/A mlib_d64 sum;
0N/A mlib_d64 row0, row1, row2, row3;
0N/A mlib_f32 p0, p1, p2, p3;
0N/A mlib_d64 xFilter, yFilter0, yFilter1, yFilter2, yFilter3;
0N/A mlib_d64 v0, v1, v2, v3;
0N/A mlib_d64 u0, u1, u2, u3;
0N/A mlib_d64 d0, d1, d2, d3;
0N/A mlib_d64 d00, d10, d01, d02, d03;
0N/A mlib_d64 *yPtr;
0N/A mlib_d64 *dpSrc;
0N/A mlib_s32 align, cols, i;
0N/A mlib_d64 res;
0N/A mlib_f32 f_x01000100 = vis_to_float(0x01000100);
0N/A mlib_d64 mask8000 = vis_to_double_dup(0x80008000);
0N/A const mlib_s16 *mlib_filters_table ;
0N/A const mlib_s16 *mlib_filters_table_4;
0N/A
0N/A if (filter == MLIB_BICUBIC) {
0N/A mlib_filters_table = mlib_filters_s16_bc;
0N/A mlib_filters_table_4 = mlib_filters_s16_bc_4;
0N/A } else {
0N/A mlib_filters_table = mlib_filters_s16_bc2;
0N/A mlib_filters_table_4 = mlib_filters_s16_bc2_4;
0N/A }
0N/A
0N/A srcYStride >>= 1;
0N/A
0N/A for (j = yStart; j <= yFinish; j++) {
0N/A
0N/A vis_write_gsr(10 << 3);
0N/A
0N/A CLIP(1);
0N/A
0N/A cols = xRight - xLeft + 1;
0N/A align = (8 - ((mlib_addr)dstPixelPtr) & 7) & 7;
0N/A align >>= 1;
0N/A align = (cols < align)? cols : align;
0N/A
0N/A for (i = 0; i < align; i++) {
0N/A NEXT_PIXEL_1BC_S16();
0N/A LOAD_BC_S16_1CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A RESULT_1BC_S16_1PIXEL();
0N/A vis_st_u16(res, dstPixelPtr++);
0N/A }
0N/A
0N/A if (i <= cols - 10) {
0N/A
0N/A NEXT_PIXEL_1BC_S16();
0N/A LOAD_BC_S16_1CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A
0N/A NEXT_PIXEL_1BC_S16();
0N/A
0N/A BC_S16_1CH(0, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(1, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(2, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(3, mlib_filters_table, mlib_filters_table_4);
0N/A
0N/A FADD_1BC_S16();
0N/A
0N/A BC_S16_1CH(0, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(1, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(2, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(3, mlib_filters_table, mlib_filters_table_4);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; i <= cols - 14; i += 4) {
0N/A *(mlib_d64*)dstPixelPtr = res;
0N/A FADD_1BC_S16();
0N/A BC_S16_1CH(0, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(1, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(2, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_1CH(3, mlib_filters_table, mlib_filters_table_4);
0N/A dstPixelPtr += 4;
0N/A }
0N/A
0N/A *(mlib_d64*)dstPixelPtr = res;
0N/A dstPixelPtr += 4;
0N/A FADD_1BC_S16();
0N/A *(mlib_d64*)dstPixelPtr = res;
0N/A dstPixelPtr += 4;
0N/A
0N/A RESULT_1BC_S16_1PIXEL();
0N/A vis_st_u16(res, dstPixelPtr++);
0N/A
0N/A LOAD_BC_S16_1CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A RESULT_1BC_S16_1PIXEL();
0N/A vis_st_u16(res, dstPixelPtr++);
0N/A i += 10;
0N/A }
0N/A
0N/A for (; i < cols; i++) {
0N/A NEXT_PIXEL_1BC_S16();
0N/A LOAD_BC_S16_1CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A RESULT_1BC_S16_1PIXEL();
0N/A vis_st_u16(res, dstPixelPtr++);
0N/A }
0N/A }
0N/A
0N/A return MLIB_SUCCESS;
0N/A}
0N/A
0N/A/***************************************************************/
0N/A#define NEXT_PIXEL_2BC_S16() \
0N/A xSrc = (X >> MLIB_SHIFT)-1; \
0N/A ySrc = (Y >> MLIB_SHIFT)-1; \
0N/A sPtr = (mlib_s16 *)lineAddr[ySrc] + (xSrc << 1)
0N/A
0N/A/***************************************************************/
0N/A#define LOAD_BC_S16_2CH_1PIXEL(mlib_filters_s16, mlib_filters_s16_4) \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A row00 = vis_faligndata(data0, data1); \
0N/A row01 = vis_faligndata(data1, data2); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A row10 = vis_faligndata(data0, data1); \
0N/A row11 = vis_faligndata(data1, data2); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A row20 = vis_faligndata(data0, data1); \
0N/A row21 = vis_faligndata(data1, data2); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A row30 = vis_faligndata(data0, data1); \
0N/A row31 = vis_faligndata(data1, data2); \
0N/A filterposy = (Y >> FILTER_SHIFT) & FILTER_MASK; \
0N/A yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \
0N/A yFilter0 = yPtr[0]; \
0N/A yFilter1 = yPtr[1]; \
0N/A yFilter2 = yPtr[2]; \
0N/A yFilter3 = yPtr[3]; \
0N/A filterposx = (X >> FILTER_SHIFT) & FILTER_MASK; \
0N/A xFilter = *((mlib_d64 *)((mlib_u8 *)mlib_filters_s16 + filterposx)); \
0N/A X += dX; \
0N/A Y += dY
0N/A
0N/A/***************************************************************/
0N/A#define RESULT_2BC_S16_1PIXEL() \
0N/A u00 = vis_fmul8sux16(vis_fxor(row00, mask8000), yFilter0); \
0N/A dr = vis_fpmerge(vis_read_hi(xFilter), vis_read_lo(xFilter)); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row00, mask8000), yFilter0); \
0N/A dr = vis_fpmerge(vis_read_hi(dr), vis_read_lo(dr)); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row01, mask8000), yFilter0); \
0N/A dr1 = vis_fpmerge(vis_read_lo(dr), vis_read_lo(dr)); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row01, mask8000), yFilter0); \
0N/A dr = vis_fpmerge(vis_read_hi(dr), vis_read_hi(dr)); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row10, mask8000), yFilter1); \
0N/A v00 = vis_fpadd16(u00, u01); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row10, mask8000), yFilter1); \
0N/A v01 = vis_fpadd16(u10, u11); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row11, mask8000), yFilter1); \
0N/A xFilter0 = vis_fpmerge(vis_read_hi(dr), vis_read_hi(dr1)); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row11, mask8000), yFilter1); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row20, mask8000), yFilter2); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row20, mask8000), yFilter2); \
0N/A v10 = vis_fpadd16(u20, u21); \
0N/A sum0 = vis_fpadd16(v00, v10); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row21, mask8000), yFilter2); \
0N/A v11 = vis_fpadd16(u00, u01); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row21, mask8000), yFilter2); \
0N/A xFilter1 = vis_fpmerge(vis_read_lo(dr), vis_read_lo(dr1)); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row30, mask8000), yFilter3); \
0N/A v20 = vis_fpadd16(u10, u11); \
0N/A sum1 = vis_fpadd16(v01, v11); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row30, mask8000), yFilter3); \
0N/A sum0 = vis_fpadd16(sum0, v20); \
0N/A v21 = vis_fpadd16(u20, u21); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row31, mask8000), yFilter3); \
0N/A v30 = vis_fpadd16(u00, u01); \
0N/A sum1 = vis_fpadd16(sum1, v21); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row31, mask8000), yFilter3); \
0N/A sum0 = vis_fpadd16(sum0, v30); \
0N/A v31 = vis_fpadd16(u10, u11); \
0N/A sum1 = vis_fpadd16(sum1, v31); \
0N/A d00 = vis_fmul8sux16(sum0, xFilter0); \
0N/A d10 = vis_fmul8ulx16(sum0, xFilter0); \
0N/A d20 = vis_fmul8sux16(sum1, xFilter1); \
0N/A d30 = vis_fmul8ulx16(sum1, xFilter1); \
0N/A d0 = vis_fpadd16(d00, d10); \
0N/A d1 = vis_fpadd16(d20, d30); \
0N/A d0 = vis_fpadd16(d0, d1); \
0N/A p0 = vis_fpadd16s(vis_read_hi(d0), vis_read_lo(d0)); \
0N/A d0 = vis_fmuld8sux16(f_x01000100, p0); \
0N/A res = vis_fxor(vis_fpackfix_pair(d0, d0), mask8000)
0N/A
0N/A/***************************************************************/
0N/A#define BC_S16_2CH(ind, mlib_filters_s16, mlib_filters_s16_4) \
0N/A u00 = vis_fmul8sux16(vis_fxor(row00, mask8000), yFilter0); \
0N/A dr = vis_fpmerge(vis_read_hi(xFilter), vis_read_lo(xFilter)); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row00, mask8000), yFilter0); \
0N/A dr = vis_fpmerge(vis_read_hi(dr), vis_read_lo(dr)); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row01, mask8000), yFilter0); \
0N/A dr1 = vis_fpmerge(vis_read_lo(dr), vis_read_lo(dr)); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row01, mask8000), yFilter0); \
0N/A dr = vis_fpmerge(vis_read_hi(dr), vis_read_hi(dr)); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row10, mask8000), yFilter1); \
0N/A v00 = vis_fpadd16(u00, u01); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row10, mask8000), yFilter1); \
0N/A data0 = dpSrc[0]; \
0N/A filterposy = (Y >> FILTER_SHIFT); \
0N/A v01 = vis_fpadd16(u10, u11); \
0N/A data1 = dpSrc[1]; \
0N/A u00 = vis_fmul8sux16(vis_fxor(row11, mask8000), yFilter1); \
0N/A xFilter0 = vis_fpmerge(vis_read_hi(dr), vis_read_hi(dr1)); \
0N/A data2 = dpSrc[2]; \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row11, mask8000), yFilter1); \
0N/A row00 = vis_faligndata(data0, data1); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row20, mask8000), yFilter2); \
0N/A row01 = vis_faligndata(data1, data2); \
0N/A filterposx = (X >> FILTER_SHIFT); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row20, mask8000), yFilter2); \
0N/A v10 = vis_fpadd16(u20, u21); \
0N/A data0 = dpSrc[0]; \
0N/A sum0 = vis_fpadd16(v00, v10); \
0N/A X += dX; \
0N/A data1 = dpSrc[1]; \
0N/A u20 = vis_fmul8sux16(vis_fxor(row21, mask8000), yFilter2); \
0N/A v11 = vis_fpadd16(u00, u01); \
0N/A data2 = dpSrc[2]; \
0N/A row10 = vis_faligndata(data0, data1); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row21, mask8000), yFilter2); \
0N/A row11 = vis_faligndata(data1, data2); \
0N/A sPtr += srcYStride; \
0N/A xFilter1 = vis_fpmerge(vis_read_lo(dr), vis_read_lo(dr1)); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row30, mask8000), yFilter3); \
0N/A v20 = vis_fpadd16(u10, u11); \
0N/A Y += dY; \
0N/A xSrc = (X >> MLIB_SHIFT)-1; \
0N/A sum1 = vis_fpadd16(v01, v11); \
0N/A data0 = dpSrc[0]; \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row30, mask8000), yFilter3); \
0N/A sum0 = vis_fpadd16(sum0, v20); \
0N/A ySrc = (Y >> MLIB_SHIFT)-1; \
0N/A data1 = dpSrc[1]; \
0N/A v21 = vis_fpadd16(u20, u21); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row31, mask8000), yFilter3); \
0N/A data2 = dpSrc[2]; \
0N/A v30 = vis_fpadd16(u00, u01); \
0N/A filterposy &= FILTER_MASK; \
0N/A row20 = vis_faligndata(data0, data1); \
0N/A sum1 = vis_fpadd16(sum1, v21); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row31, mask8000), yFilter3); \
0N/A row21 = vis_faligndata(data1, data2); \
0N/A sPtr += srcYStride; \
0N/A filterposx &= FILTER_MASK; \
0N/A v31 = vis_fpadd16(u10, u11); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A sum0 = vis_fpadd16(sum0, v30); \
0N/A data1 = dpSrc[1]; \
0N/A sum1 = vis_fpadd16(sum1, v31); \
0N/A data2 = dpSrc[2]; \
0N/A row30 = vis_faligndata(data0, data1); \
0N/A d0 = vis_fmul8sux16(sum0, xFilter0); \
0N/A row31 = vis_faligndata(data1, data2); \
0N/A yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \
0N/A d1 = vis_fmul8ulx16(sum0, xFilter0); \
0N/A yFilter0 = yPtr[0]; \
0N/A d2 = vis_fmul8sux16(sum1, xFilter1); \
0N/A yFilter1 = yPtr[1]; \
0N/A d3 = vis_fmul8ulx16(sum1, xFilter1); \
0N/A d0##ind = vis_fpadd16(d0, d1); \
0N/A yFilter2 = yPtr[2]; \
0N/A yFilter3 = yPtr[3]; \
0N/A d1##ind = vis_fpadd16(d2, d3); \
0N/A xFilter = *((mlib_d64 *)((mlib_u8 *)mlib_filters_s16 + filterposx)); \
0N/A sPtr = (mlib_s16 *)lineAddr[ySrc] + (xSrc << 1)
0N/A
0N/A/***************************************************************/
0N/A#define FADD_2BC_S16() \
0N/A d0 = vis_fpadd16(d00, d10); \
0N/A d2 = vis_fpadd16(d01, d11); \
0N/A p0 = vis_fpadd16s(vis_read_hi(d0), vis_read_lo(d0)); \
0N/A p1 = vis_fpadd16s(vis_read_hi(d2), vis_read_lo(d2)); \
0N/A d0 = vis_fmuld8sux16(f_x01000100, p0); \
0N/A d1 = vis_fmuld8sux16(f_x01000100, p1); \
0N/A res = vis_fxor(vis_fpackfix_pair(d0, d1), mask8000)
0N/A
0N/A/***************************************************************/
0N/Amlib_status mlib_ImageAffine_u16_2ch_bc (mlib_affine_param *param)
0N/A{
0N/A DECLAREVAR_BC();
0N/A DTYPE *dstLineEnd;
0N/A mlib_s32 filterposx, filterposy;
0N/A mlib_d64 data0, data1, data2;
0N/A mlib_d64 sum0, sum1;
0N/A mlib_d64 row00, row10, row20, row30;
0N/A mlib_d64 row01, row11, row21, row31;
0N/A mlib_f32 p0, p1;
0N/A mlib_d64 xFilter, xFilter0, xFilter1;
0N/A mlib_d64 yFilter0, yFilter1, yFilter2, yFilter3;
0N/A mlib_d64 v00, v01, v10, v11, v20, v21, v30, v31;
0N/A mlib_d64 u00, u01, u10, u11, u20, u21;
0N/A mlib_d64 d0, d1, d2, d3;
0N/A mlib_d64 d00, d10, d20, d30, d01, d11;
0N/A mlib_d64 *yPtr;
0N/A mlib_d64 *dp, *dpSrc;
0N/A mlib_s32 cols, i, mask, emask;
0N/A mlib_d64 res, res1;
0N/A mlib_d64 dr, dr1;
0N/A mlib_f32 f_x01000100 = vis_to_float(0x01000100);
0N/A mlib_d64 mask8000 = vis_to_double_dup(0x80008000);
0N/A const mlib_s16 *mlib_filters_table ;
0N/A const mlib_s16 *mlib_filters_table_4;
0N/A
0N/A if (filter == MLIB_BICUBIC) {
0N/A mlib_filters_table = mlib_filters_s16_bc;
0N/A mlib_filters_table_4 = mlib_filters_s16_bc_4;
0N/A } else {
0N/A mlib_filters_table = mlib_filters_s16_bc2;
0N/A mlib_filters_table_4 = mlib_filters_s16_bc2_4;
0N/A }
0N/A
0N/A srcYStride >>= 1;
0N/A
0N/A for (j = yStart; j <= yFinish; j++) {
0N/A
0N/A vis_write_gsr(10 << 3);
0N/A
0N/A CLIP(2);
0N/A dstLineEnd = (DTYPE*)dstData + 2 * xRight;
0N/A
0N/A cols = xRight - xLeft + 1;
0N/A dp = vis_alignaddr(dstPixelPtr, 0);
0N/A dstLineEnd += 1;
0N/A mask = vis_edge16(dstPixelPtr, dstLineEnd);
0N/A i = 0;
0N/A
0N/A if (i <= cols - 6) {
0N/A
0N/A NEXT_PIXEL_2BC_S16();
0N/A LOAD_BC_S16_2CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A
0N/A NEXT_PIXEL_2BC_S16();
0N/A
0N/A BC_S16_2CH(0, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_2CH(1, mlib_filters_table, mlib_filters_table_4);
0N/A
0N/A FADD_2BC_S16();
0N/A
0N/A BC_S16_2CH(0, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_2CH(1, mlib_filters_table, mlib_filters_table_4);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; i <= cols-8; i += 2) {
0N/A vis_alignaddr((void *)(8 - (mlib_addr)dstPixelPtr), 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A FADD_2BC_S16();
0N/A BC_S16_2CH(0, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_2CH(1, mlib_filters_table, mlib_filters_table_4);
0N/A }
0N/A
0N/A vis_alignaddr((void *)(8 - (mlib_addr)dstPixelPtr), 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A FADD_2BC_S16();
0N/A vis_alignaddr((void *)(8 - (mlib_addr)dstPixelPtr), 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A RESULT_2BC_S16_1PIXEL();
0N/A res1 = res;
0N/A
0N/A LOAD_BC_S16_2CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A RESULT_2BC_S16_1PIXEL();
0N/A res = vis_write_hi(res, vis_read_hi(res1));
0N/A vis_alignaddr((void *)(8 - (mlib_addr)dstPixelPtr), 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A i += 6;
0N/A }
0N/A
0N/A if (i <= cols - 4) {
0N/A NEXT_PIXEL_2BC_S16();
0N/A LOAD_BC_S16_2CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A
0N/A NEXT_PIXEL_2BC_S16();
0N/A
0N/A BC_S16_2CH(0, mlib_filters_table, mlib_filters_table_4);
0N/A BC_S16_2CH(1, mlib_filters_table, mlib_filters_table_4);
0N/A
0N/A FADD_2BC_S16();
0N/A vis_alignaddr((void *)(8 - (mlib_addr)dstPixelPtr), 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A RESULT_2BC_S16_1PIXEL();
0N/A res1 = res;
0N/A
0N/A LOAD_BC_S16_2CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A RESULT_2BC_S16_1PIXEL();
0N/A res = vis_write_hi(res, vis_read_hi(res1));
0N/A vis_alignaddr((void *)(8 - (mlib_addr)dstPixelPtr), 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A i += 4;
0N/A }
0N/A
0N/A if (i <= cols - 2) {
0N/A NEXT_PIXEL_2BC_S16();
0N/A LOAD_BC_S16_2CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A RESULT_2BC_S16_1PIXEL();
0N/A res1 = res;
0N/A
0N/A NEXT_PIXEL_2BC_S16();
0N/A LOAD_BC_S16_2CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A RESULT_2BC_S16_1PIXEL();
0N/A res = vis_write_hi(res, vis_read_hi(res1));
0N/A vis_alignaddr((void *)(8 - (mlib_addr)dstPixelPtr), 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A i += 2;
0N/A }
0N/A
0N/A if (i < cols) {
0N/A NEXT_PIXEL_2BC_S16();
0N/A LOAD_BC_S16_2CH_1PIXEL(mlib_filters_table, mlib_filters_table_4);
0N/A RESULT_2BC_S16_1PIXEL();
0N/A vis_alignaddr((void *)(8 - (mlib_addr)dstPixelPtr), 0);
0N/A res = vis_faligndata(res, res);
0N/A emask = vis_edge16(dp, dstLineEnd);
0N/A vis_pst_16(res, dp++, mask & emask);
0N/A
0N/A if ((mlib_s16*)dp <= dstLineEnd) {
0N/A mask = vis_edge16(dp, dstLineEnd);
0N/A vis_pst_16(res, dp, mask);
0N/A }
0N/A }
0N/A }
0N/A
0N/A return MLIB_SUCCESS;
0N/A}
0N/A
0N/A/***************************************************************/
0N/A#define NEXT_PIXEL_3BC_S16() \
0N/A xSrc = (X >> MLIB_SHIFT)-1; \
0N/A ySrc = (Y >> MLIB_SHIFT)-1; \
0N/A sPtr = (mlib_s16 *)lineAddr[ySrc] + (xSrc*3)
0N/A
0N/A/***************************************************************/
0N/A#define LOAD_BC_S16_3CH_1PIXEL(mlib_filters_s16_3, mlib_filters_s16_4) \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A data3 = dpSrc[3]; \
0N/A row00 = vis_faligndata(data0, data1); \
0N/A row01 = vis_faligndata(data1, data2); \
0N/A row02 = vis_faligndata(data2, data3); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A data3 = dpSrc[3]; \
0N/A row10 = vis_faligndata(data0, data1); \
0N/A row11 = vis_faligndata(data1, data2); \
0N/A row12 = vis_faligndata(data2, data3); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A data3 = dpSrc[3]; \
0N/A row20 = vis_faligndata(data0, data1); \
0N/A row21 = vis_faligndata(data1, data2); \
0N/A row22 = vis_faligndata(data2, data3); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A data3 = dpSrc[3]; \
0N/A row30 = vis_faligndata(data0, data1); \
0N/A row31 = vis_faligndata(data1, data2); \
0N/A row32 = vis_faligndata(data2, data3); \
0N/A filterposy = (Y >> FILTER_SHIFT) & FILTER_MASK; \
0N/A yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \
0N/A yFilter0 = yPtr[0]; \
0N/A yFilter1 = yPtr[1]; \
0N/A yFilter2 = yPtr[2]; \
0N/A yFilter3 = yPtr[3]; \
0N/A filterposx = (X >> FILTER_SHIFT) & FILTER_MASK; \
0N/A xPtr = ((mlib_d64 *)((mlib_u8 *)mlib_filters_s16_3 + filterposx*3)); \
0N/A xFilter0 = xPtr[0]; \
0N/A xFilter1 = xPtr[1]; \
0N/A xFilter2 = xPtr[2]; \
0N/A X += dX; \
0N/A Y += dY
0N/A
0N/A/***************************************************************/
0N/A#define STORE_BC_S16_3CH_1PIXEL() \
0N/A dstPixelPtr[0] = f0.t[0]; \
0N/A dstPixelPtr[1] = f0.t[1]; \
0N/A dstPixelPtr[2] = f0.t[2]; \
0N/A dstPixelPtr += 3
0N/A
0N/A/***************************************************************/
0N/A#define RESULT_3BC_S16_1PIXEL() \
0N/A u00 = vis_fmul8sux16(vis_fxor(row00, mask8000), yFilter0); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row00, mask8000), yFilter0); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row01, mask8000), yFilter0); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row01, mask8000), yFilter0); \
0N/A v00 = vis_fpadd16(u00, u01); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row02, mask8000), yFilter0); \
0N/A v01 = vis_fpadd16(u10, u11); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row02, mask8000), yFilter0); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row10, mask8000), yFilter1); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row10, mask8000), yFilter1); \
0N/A v02 = vis_fpadd16(u20, u21); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row11, mask8000), yFilter1); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row11, mask8000), yFilter1); \
0N/A v10 = vis_fpadd16(u00, u01); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row12, mask8000), yFilter1); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row12, mask8000), yFilter1); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row20, mask8000), yFilter2); \
0N/A v11 = vis_fpadd16(u10, u11); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row20, mask8000), yFilter2); \
0N/A v12 = vis_fpadd16(u20, u21); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row21, mask8000), yFilter2); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row21, mask8000), yFilter2); \
0N/A v20 = vis_fpadd16(u00, u01); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row22, mask8000), yFilter2); \
0N/A sum0 = vis_fpadd16(v00, v10); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row22, mask8000), yFilter2); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row30, mask8000), yFilter3); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row30, mask8000), yFilter3); \
0N/A v21 = vis_fpadd16(u10, u11); \
0N/A sum1 = vis_fpadd16(v01, v11); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row31, mask8000), yFilter3); \
0N/A sum2 = vis_fpadd16(v02, v12); \
0N/A v22 = vis_fpadd16(u20, u21); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row31, mask8000), yFilter3); \
0N/A sum0 = vis_fpadd16(sum0, v20); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row32, mask8000), yFilter3); \
0N/A v30 = vis_fpadd16(u00, u01); \
0N/A sum1 = vis_fpadd16(sum1, v21); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row32, mask8000), yFilter3); \
0N/A v31 = vis_fpadd16(u10, u11); \
0N/A sum2 = vis_fpadd16(sum2, v22); \
0N/A v32 = vis_fpadd16(u20, u21); \
0N/A sum0 = vis_fpadd16(sum0, v30); \
0N/A row30 = vis_faligndata(data0, data1); \
0N/A v00 = vis_fmul8sux16(sum0, xFilter0); \
0N/A sum1 = vis_fpadd16(sum1, v31); \
0N/A sum2 = vis_fpadd16(sum2, v32); \
0N/A v01 = vis_fmul8ulx16(sum0, xFilter0); \
0N/A v10 = vis_fmul8sux16(sum1, xFilter1); \
0N/A v11 = vis_fmul8ulx16(sum1, xFilter1); \
0N/A d0 = vis_fpadd16(v00, v01); \
0N/A v20 = vis_fmul8sux16(sum2, xFilter2); \
0N/A v21 = vis_fmul8ulx16(sum2, xFilter2); \
0N/A d1 = vis_fpadd16(v10, v11); \
0N/A d2 = vis_fpadd16(v20, v21); \
0N/A vis_alignaddr((void*)6, 0); \
0N/A d3 = vis_faligndata(d0, d1); \
0N/A vis_alignaddr((void*)2, 0); \
0N/A d4 = vis_faligndata(d1, d2); \
0N/A d0 = vis_fpadd16(d0, d3); \
0N/A d2 = vis_fpadd16(d2, d4); \
0N/A d1 = vis_faligndata(d2, d2); \
0N/A d0 = vis_fpadd16(d0, d1); \
0N/A d2 = vis_fmuld8sux16(f_x01000100, vis_read_hi(d0)); \
0N/A d3 = vis_fmuld8sux16(f_x01000100, vis_read_lo(d0)); \
0N/A f0.d = vis_fxor(vis_fpackfix_pair(d2, d3), mask8000)
0N/A
0N/A/***************************************************************/
0N/A#define BC_S16_3CH(mlib_filters_s16_3, mlib_filters_s16_4) \
0N/A u00 = vis_fmul8sux16(vis_fxor(row00, mask8000), yFilter0); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row00, mask8000), yFilter0); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row01, mask8000), yFilter0); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row01, mask8000), yFilter0); \
0N/A v00 = vis_fpadd16(u00, u01); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row02, mask8000), yFilter0); \
0N/A v01 = vis_fpadd16(u10, u11); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row02, mask8000), yFilter0); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row10, mask8000), yFilter1); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row10, mask8000), yFilter1); \
0N/A data0 = dpSrc[0]; \
0N/A filterposy = (Y >> FILTER_SHIFT); \
0N/A v02 = vis_fpadd16(u20, u21); \
0N/A data1 = dpSrc[1]; \
0N/A u10 = vis_fmul8sux16(vis_fxor(row11, mask8000), yFilter1); \
0N/A data2 = dpSrc[2]; \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row11, mask8000), yFilter1); \
0N/A v10 = vis_fpadd16(u00, u01); \
0N/A data3 = dpSrc[3]; \
0N/A u20 = vis_fmul8sux16(vis_fxor(row12, mask8000), yFilter1); \
0N/A row00 = vis_faligndata(data0, data1); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row12, mask8000), yFilter1); \
0N/A row01 = vis_faligndata(data1, data2); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row20, mask8000), yFilter2); \
0N/A row02 = vis_faligndata(data2, data3); \
0N/A filterposx = (X >> FILTER_SHIFT); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A v11 = vis_fpadd16(u10, u11); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row20, mask8000), yFilter2); \
0N/A v12 = vis_fpadd16(u20, u21); \
0N/A data0 = dpSrc[0]; \
0N/A u10 = vis_fmul8sux16(vis_fxor(row21, mask8000), yFilter2); \
0N/A X += dX; \
0N/A data1 = dpSrc[1]; \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row21, mask8000), yFilter2); \
0N/A v20 = vis_fpadd16(u00, u01); \
0N/A data2 = dpSrc[2]; \
0N/A u20 = vis_fmul8sux16(vis_fxor(row22, mask8000), yFilter2); \
0N/A sum0 = vis_fpadd16(v00, v10); \
0N/A data3 = dpSrc[3]; \
0N/A row10 = vis_faligndata(data0, data1); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row22, mask8000), yFilter2); \
0N/A row11 = vis_faligndata(data1, data2); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row30, mask8000), yFilter3); \
0N/A row12 = vis_faligndata(data2, data3); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row30, mask8000), yFilter3); \
0N/A v21 = vis_fpadd16(u10, u11); \
0N/A Y += dY; \
0N/A xSrc = (X >> MLIB_SHIFT)-1; \
0N/A sum1 = vis_fpadd16(v01, v11); \
0N/A data0 = dpSrc[0]; \
0N/A u10 = vis_fmul8sux16(vis_fxor(row31, mask8000), yFilter3); \
0N/A sum2 = vis_fpadd16(v02, v12); \
0N/A ySrc = (Y >> MLIB_SHIFT)-1; \
0N/A data1 = dpSrc[1]; \
0N/A v22 = vis_fpadd16(u20, u21); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row31, mask8000), yFilter3); \
0N/A data2 = dpSrc[2]; \
0N/A sum0 = vis_fpadd16(sum0, v20); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row32, mask8000), yFilter3); \
0N/A data3 = dpSrc[3]; \
0N/A v30 = vis_fpadd16(u00, u01); \
0N/A filterposy &= FILTER_MASK; \
0N/A row20 = vis_faligndata(data0, data1); \
0N/A sum1 = vis_fpadd16(sum1, v21); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row32, mask8000), yFilter3); \
0N/A row21 = vis_faligndata(data1, data2); \
0N/A row22 = vis_faligndata(data2, data3); \
0N/A sPtr += srcYStride; \
0N/A filterposx &= FILTER_MASK; \
0N/A v31 = vis_fpadd16(u10, u11); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A sum2 = vis_fpadd16(sum2, v22); \
0N/A data1 = dpSrc[1]; \
0N/A v32 = vis_fpadd16(u20, u21); \
0N/A data2 = dpSrc[2]; \
0N/A sum0 = vis_fpadd16(sum0, v30); \
0N/A data3 = dpSrc[3]; \
0N/A row30 = vis_faligndata(data0, data1); \
0N/A v00 = vis_fmul8sux16(sum0, xFilter0); \
0N/A row31 = vis_faligndata(data1, data2); \
0N/A row32 = vis_faligndata(data2, data3); \
0N/A yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \
0N/A sum1 = vis_fpadd16(sum1, v31); \
0N/A yFilter0 = yPtr[0]; \
0N/A sum2 = vis_fpadd16(sum2, v32); \
0N/A v01 = vis_fmul8ulx16(sum0, xFilter0); \
0N/A yFilter1 = yPtr[1]; \
0N/A v10 = vis_fmul8sux16(sum1, xFilter1); \
0N/A yFilter2 = yPtr[2]; \
0N/A v11 = vis_fmul8ulx16(sum1, xFilter1); \
0N/A d0 = vis_fpadd16(v00, v01); \
0N/A yFilter3 = yPtr[3]; \
0N/A xPtr = ((mlib_d64 *)((mlib_u8 *)mlib_filters_s16_3 + filterposx*3)); \
0N/A v20 = vis_fmul8sux16(sum2, xFilter2); \
0N/A xFilter0 = xPtr[0]; \
0N/A v21 = vis_fmul8ulx16(sum2, xFilter2); \
0N/A d1 = vis_fpadd16(v10, v11); \
0N/A xFilter1 = xPtr[1]; \
0N/A d2 = vis_fpadd16(v20, v21); \
0N/A xFilter2 = xPtr[2]; \
0N/A sPtr = (mlib_s16 *)lineAddr[ySrc] + (xSrc*3)
0N/A
0N/A/***************************************************************/
0N/A#define FADD_3BC_S16() \
0N/A vis_alignaddr((void*)6, 0); \
0N/A d3 = vis_faligndata(d0, d1); \
0N/A vis_alignaddr((void*)2, 0); \
0N/A d4 = vis_faligndata(d1, d2); \
0N/A d0 = vis_fpadd16(d0, d3); \
0N/A d2 = vis_fpadd16(d2, d4); \
0N/A d1 = vis_faligndata(d2, d2); \
0N/A d0 = vis_fpadd16(d0, d1); \
0N/A d2 = vis_fmuld8sux16(f_x01000100, vis_read_hi(d0)); \
0N/A d3 = vis_fmuld8sux16(f_x01000100, vis_read_lo(d0)); \
0N/A f0.d = vis_fxor(vis_fpackfix_pair(d2, d3), mask8000)
0N/A
0N/A/***************************************************************/
0N/Amlib_status mlib_ImageAffine_u16_3ch_bc (mlib_affine_param *param)
0N/A{
0N/A DECLAREVAR_BC();
0N/A mlib_s32 filterposx, filterposy;
0N/A mlib_d64 data0, data1, data2, data3;
0N/A mlib_d64 sum0, sum1, sum2;
0N/A mlib_d64 row00, row10, row20, row30;
0N/A mlib_d64 row01, row11, row21, row31;
0N/A mlib_d64 row02, row12, row22, row32;
0N/A mlib_d64 xFilter0, xFilter1, xFilter2;
0N/A mlib_d64 yFilter0, yFilter1, yFilter2, yFilter3;
0N/A mlib_d64 v00, v01, v02, v10, v11, v12, v20, v21, v22, v30, v31, v32;
0N/A mlib_d64 u00, u01, u10, u11, u20, u21;
0N/A mlib_d64 d0, d1, d2, d3, d4;
0N/A mlib_d64 *yPtr, *xPtr;
0N/A mlib_d64 *dpSrc;
0N/A mlib_s32 cols, i;
0N/A mlib_f32 f_x01000100 = vis_to_float(0x01000100);
0N/A mlib_d64 mask8000 = vis_to_double_dup(0x80008000);
0N/A union {
0N/A mlib_s16 t[4];
0N/A mlib_d64 d;
0N/A } f0;
0N/A const mlib_s16 *mlib_filters_table_3;
0N/A const mlib_s16 *mlib_filters_table_4;
0N/A
0N/A if (filter == MLIB_BICUBIC) {
0N/A mlib_filters_table_3 = mlib_filters_s16_bc_3;
0N/A mlib_filters_table_4 = mlib_filters_s16_bc_4;
0N/A } else {
0N/A mlib_filters_table_3 = mlib_filters_s16_bc2_3;
0N/A mlib_filters_table_4 = mlib_filters_s16_bc2_4;
0N/A }
0N/A
0N/A srcYStride >>= 1;
0N/A
0N/A for (j = yStart; j <= yFinish; j++) {
0N/A
0N/A vis_write_gsr(10 << 3);
0N/A
0N/A CLIP(3);
0N/A
0N/A cols = xRight - xLeft + 1;
0N/A
0N/A i = 0;
0N/A
0N/A if (i <= cols - 4) {
0N/A
0N/A NEXT_PIXEL_3BC_S16();
0N/A LOAD_BC_S16_3CH_1PIXEL(mlib_filters_table_3, mlib_filters_table_4);
0N/A
0N/A NEXT_PIXEL_3BC_S16();
0N/A
0N/A BC_S16_3CH(mlib_filters_table_3, mlib_filters_table_4);
0N/A FADD_3BC_S16();
0N/A
0N/A BC_S16_3CH(mlib_filters_table_3, mlib_filters_table_4);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; i < cols-4; i++) {
0N/A STORE_BC_S16_3CH_1PIXEL();
0N/A
0N/A FADD_3BC_S16();
0N/A BC_S16_3CH(mlib_filters_table_3, mlib_filters_table_4);
0N/A }
0N/A
0N/A STORE_BC_S16_3CH_1PIXEL();
0N/A
0N/A FADD_3BC_S16();
0N/A STORE_BC_S16_3CH_1PIXEL();
0N/A
0N/A RESULT_3BC_S16_1PIXEL();
0N/A STORE_BC_S16_3CH_1PIXEL();
0N/A
0N/A LOAD_BC_S16_3CH_1PIXEL(mlib_filters_table_3, mlib_filters_table_4);
0N/A RESULT_3BC_S16_1PIXEL();
0N/A STORE_BC_S16_3CH_1PIXEL();
0N/A i += 4;
0N/A }
0N/A
0N/A for (; i < cols; i++) {
0N/A NEXT_PIXEL_3BC_S16();
0N/A LOAD_BC_S16_3CH_1PIXEL(mlib_filters_table_3, mlib_filters_table_4);
0N/A RESULT_3BC_S16_1PIXEL();
0N/A STORE_BC_S16_3CH_1PIXEL();
0N/A }
0N/A }
0N/A
0N/A return MLIB_SUCCESS;
0N/A}
0N/A
0N/A/***************************************************************/
0N/A#define NEXT_PIXEL_4BC_S16() \
0N/A xSrc = (X >> MLIB_SHIFT)-1; \
0N/A ySrc = (Y >> MLIB_SHIFT)-1; \
0N/A sPtr = (mlib_s16 *)lineAddr[ySrc] + (xSrc << 2)
0N/A
0N/A/***************************************************************/
0N/A#define LOAD_BC_S16_4CH_1PIXEL(mlib_filters_s16_4) \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A data3 = dpSrc[3]; \
0N/A data4 = dpSrc[4]; \
0N/A row00 = vis_faligndata(data0, data1); \
0N/A row01 = vis_faligndata(data1, data2); \
0N/A row02 = vis_faligndata(data2, data3); \
0N/A row03 = vis_faligndata(data3, data4); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A data3 = dpSrc[3]; \
0N/A data4 = dpSrc[4]; \
0N/A row10 = vis_faligndata(data0, data1); \
0N/A row11 = vis_faligndata(data1, data2); \
0N/A row12 = vis_faligndata(data2, data3); \
0N/A row13 = vis_faligndata(data3, data4); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A data3 = dpSrc[3]; \
0N/A data4 = dpSrc[4]; \
0N/A row20 = vis_faligndata(data0, data1); \
0N/A row21 = vis_faligndata(data1, data2); \
0N/A row22 = vis_faligndata(data2, data3); \
0N/A row23 = vis_faligndata(data3, data4); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A data1 = dpSrc[1]; \
0N/A data2 = dpSrc[2]; \
0N/A data3 = dpSrc[3]; \
0N/A data4 = dpSrc[4]; \
0N/A row30 = vis_faligndata(data0, data1); \
0N/A row31 = vis_faligndata(data1, data2); \
0N/A row32 = vis_faligndata(data2, data3); \
0N/A row33 = vis_faligndata(data3, data4); \
0N/A filterposy = (Y >> FILTER_SHIFT) & FILTER_MASK; \
0N/A yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \
0N/A yFilter0 = yPtr[0]; \
0N/A yFilter1 = yPtr[1]; \
0N/A yFilter2 = yPtr[2]; \
0N/A yFilter3 = yPtr[3]; \
0N/A filterposx = (X >> FILTER_SHIFT) & FILTER_MASK; \
0N/A xPtr = ((mlib_d64 *)((mlib_u8 *)mlib_filters_s16_4 + filterposx*4)); \
0N/A xFilter0 = xPtr[0]; \
0N/A xFilter1 = xPtr[1]; \
0N/A xFilter2 = xPtr[2]; \
0N/A xFilter3 = xPtr[3]; \
0N/A X += dX; \
0N/A Y += dY
0N/A
0N/A/***************************************************************/
0N/A#define RESULT_4BC_S16_1PIXEL() \
0N/A u00 = vis_fmul8sux16(vis_fxor(row00, mask8000), yFilter0); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row00, mask8000), yFilter0); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row01, mask8000), yFilter0); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row01, mask8000), yFilter0); \
0N/A v00 = vis_fpadd16(u00, u01); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row02, mask8000), yFilter0); \
0N/A v01 = vis_fpadd16(u10, u11); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row02, mask8000), yFilter0); \
0N/A u30 = vis_fmul8sux16(vis_fxor(row03, mask8000), yFilter0); \
0N/A u31 = vis_fmul8ulx16(vis_fxor(row03, mask8000), yFilter0); \
0N/A v02 = vis_fpadd16(u20, u21); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row10, mask8000), yFilter1); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row10, mask8000), yFilter1); \
0N/A v03 = vis_fpadd16(u30, u31); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row11, mask8000), yFilter1); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row11, mask8000), yFilter1); \
0N/A v10 = vis_fpadd16(u00, u01); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row12, mask8000), yFilter1); \
0N/A v11 = vis_fpadd16(u10, u11); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row12, mask8000), yFilter1); \
0N/A u30 = vis_fmul8sux16(vis_fxor(row13, mask8000), yFilter1); \
0N/A u31 = vis_fmul8ulx16(vis_fxor(row13, mask8000), yFilter1); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row20, mask8000), yFilter2); \
0N/A v12 = vis_fpadd16(u20, u21); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row20, mask8000), yFilter2); \
0N/A v13 = vis_fpadd16(u30, u31); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row21, mask8000), yFilter2); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row21, mask8000), yFilter2); \
0N/A v20 = vis_fpadd16(u00, u01); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row22, mask8000), yFilter2); \
0N/A sum0 = vis_fpadd16(v00, v10); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row22, mask8000), yFilter2); \
0N/A u30 = vis_fmul8sux16(vis_fxor(row23, mask8000), yFilter2); \
0N/A u31 = vis_fmul8ulx16(vis_fxor(row23, mask8000), yFilter2); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row30, mask8000), yFilter3); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row30, mask8000), yFilter3); \
0N/A v21 = vis_fpadd16(u10, u11); \
0N/A sum1 = vis_fpadd16(v01, v11); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row31, mask8000), yFilter3); \
0N/A sum2 = vis_fpadd16(v02, v12); \
0N/A sum3 = vis_fpadd16(v03, v13); \
0N/A v22 = vis_fpadd16(u20, u21); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row31, mask8000), yFilter3); \
0N/A sum0 = vis_fpadd16(sum0, v20); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row32, mask8000), yFilter3); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row32, mask8000), yFilter3); \
0N/A v23 = vis_fpadd16(u30, u31); \
0N/A v30 = vis_fpadd16(u00, u01); \
0N/A sum1 = vis_fpadd16(sum1, v21); \
0N/A u30 = vis_fmul8sux16(vis_fxor(row33, mask8000), yFilter3); \
0N/A u31 = vis_fmul8ulx16(vis_fxor(row33, mask8000), yFilter3); \
0N/A v31 = vis_fpadd16(u10, u11); \
0N/A sum2 = vis_fpadd16(sum2, v22); \
0N/A sum3 = vis_fpadd16(sum3, v23); \
0N/A v32 = vis_fpadd16(u20, u21); \
0N/A sum0 = vis_fpadd16(sum0, v30); \
0N/A v33 = vis_fpadd16(u30, u31); \
0N/A v00 = vis_fmul8sux16(sum0, xFilter0); \
0N/A sum1 = vis_fpadd16(sum1, v31); \
0N/A sum2 = vis_fpadd16(sum2, v32); \
0N/A v01 = vis_fmul8ulx16(sum0, xFilter0); \
0N/A v10 = vis_fmul8sux16(sum1, xFilter1); \
0N/A sum3 = vis_fpadd16(sum3, v33); \
0N/A v11 = vis_fmul8ulx16(sum1, xFilter1); \
0N/A d0 = vis_fpadd16(v00, v01); \
0N/A v20 = vis_fmul8sux16(sum2, xFilter2); \
0N/A v21 = vis_fmul8ulx16(sum2, xFilter2); \
0N/A d1 = vis_fpadd16(v10, v11); \
0N/A v30 = vis_fmul8sux16(sum3, xFilter3); \
0N/A v31 = vis_fmul8ulx16(sum3, xFilter3); \
0N/A d2 = vis_fpadd16(v20, v21); \
0N/A d3 = vis_fpadd16(v30, v31); \
0N/A d0 = vis_fpadd16(d0, d1); \
0N/A d2 = vis_fpadd16(d2, d3); \
0N/A d0 = vis_fpadd16(d0, d2); \
0N/A d2 = vis_fmuld8sux16(f_x01000100, vis_read_hi(d0)); \
0N/A d3 = vis_fmuld8sux16(f_x01000100, vis_read_lo(d0)); \
0N/A res = vis_fxor(vis_fpackfix_pair(d2, d3), mask8000)
0N/A
0N/A/***************************************************************/
0N/A#define BC_S16_4CH(mlib_filters_s16_4) \
0N/A u00 = vis_fmul8sux16(vis_fxor(row00, mask8000), yFilter0); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row00, mask8000), yFilter0); \
0N/A u10 = vis_fmul8sux16(vis_fxor(row01, mask8000), yFilter0); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row01, mask8000), yFilter0); \
0N/A v00 = vis_fpadd16(u00, u01); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row02, mask8000), yFilter0); \
0N/A v01 = vis_fpadd16(u10, u11); \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row02, mask8000), yFilter0); \
0N/A u30 = vis_fmul8sux16(vis_fxor(row03, mask8000), yFilter0); \
0N/A u31 = vis_fmul8ulx16(vis_fxor(row03, mask8000), yFilter0); \
0N/A v02 = vis_fpadd16(u20, u21); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row10, mask8000), yFilter1); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row10, mask8000), yFilter1); \
0N/A data0 = dpSrc[0]; \
0N/A filterposy = (Y >> FILTER_SHIFT); \
0N/A v03 = vis_fpadd16(u30, u31); \
0N/A data1 = dpSrc[1]; \
0N/A u10 = vis_fmul8sux16(vis_fxor(row11, mask8000), yFilter1); \
0N/A data2 = dpSrc[2]; \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row11, mask8000), yFilter1); \
0N/A v10 = vis_fpadd16(u00, u01); \
0N/A data3 = dpSrc[3]; \
0N/A u20 = vis_fmul8sux16(vis_fxor(row12, mask8000), yFilter1); \
0N/A v11 = vis_fpadd16(u10, u11); \
0N/A data4 = dpSrc[4]; \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row12, mask8000), yFilter1); \
0N/A row00 = vis_faligndata(data0, data1); \
0N/A u30 = vis_fmul8sux16(vis_fxor(row13, mask8000), yFilter1); \
0N/A row01 = vis_faligndata(data1, data2); \
0N/A u31 = vis_fmul8ulx16(vis_fxor(row13, mask8000), yFilter1); \
0N/A row02 = vis_faligndata(data2, data3); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row20, mask8000), yFilter2); \
0N/A row03 = vis_faligndata(data3, data4); \
0N/A filterposx = (X >> FILTER_SHIFT); \
0N/A sPtr += srcYStride; \
0N/A v12 = vis_fpadd16(u20, u21); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row20, mask8000), yFilter2); \
0N/A v13 = vis_fpadd16(u30, u31); \
0N/A data0 = dpSrc[0]; \
0N/A u10 = vis_fmul8sux16(vis_fxor(row21, mask8000), yFilter2); \
0N/A X += dX; \
0N/A data1 = dpSrc[1]; \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row21, mask8000), yFilter2); \
0N/A v20 = vis_fpadd16(u00, u01); \
0N/A data2 = dpSrc[2]; \
0N/A u20 = vis_fmul8sux16(vis_fxor(row22, mask8000), yFilter2); \
0N/A sum0 = vis_fpadd16(v00, v10); \
0N/A data3 = dpSrc[3]; \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row22, mask8000), yFilter2); \
0N/A data4 = dpSrc[4]; \
0N/A row10 = vis_faligndata(data0, data1); \
0N/A u30 = vis_fmul8sux16(vis_fxor(row23, mask8000), yFilter2); \
0N/A row11 = vis_faligndata(data1, data2); \
0N/A u31 = vis_fmul8ulx16(vis_fxor(row23, mask8000), yFilter2); \
0N/A row12 = vis_faligndata(data2, data3); \
0N/A u00 = vis_fmul8sux16(vis_fxor(row30, mask8000), yFilter3); \
0N/A row13 = vis_faligndata(data3, data4); \
0N/A sPtr += srcYStride; \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A u01 = vis_fmul8ulx16(vis_fxor(row30, mask8000), yFilter3); \
0N/A v21 = vis_fpadd16(u10, u11); \
0N/A Y += dY; \
0N/A xSrc = (X >> MLIB_SHIFT)-1; \
0N/A sum1 = vis_fpadd16(v01, v11); \
0N/A data0 = dpSrc[0]; \
0N/A u10 = vis_fmul8sux16(vis_fxor(row31, mask8000), yFilter3); \
0N/A sum2 = vis_fpadd16(v02, v12); \
0N/A sum3 = vis_fpadd16(v03, v13); \
0N/A ySrc = (Y >> MLIB_SHIFT)-1; \
0N/A data1 = dpSrc[1]; \
0N/A v22 = vis_fpadd16(u20, u21); \
0N/A u11 = vis_fmul8ulx16(vis_fxor(row31, mask8000), yFilter3); \
0N/A data2 = dpSrc[2]; \
0N/A sum0 = vis_fpadd16(sum0, v20); \
0N/A u20 = vis_fmul8sux16(vis_fxor(row32, mask8000), yFilter3); \
0N/A data3 = dpSrc[3]; \
0N/A u21 = vis_fmul8ulx16(vis_fxor(row32, mask8000), yFilter3); \
0N/A v23 = vis_fpadd16(u30, u31); \
0N/A data4 = dpSrc[4]; \
0N/A v30 = vis_fpadd16(u00, u01); \
0N/A filterposy &= FILTER_MASK; \
0N/A row20 = vis_faligndata(data0, data1); \
0N/A sum1 = vis_fpadd16(sum1, v21); \
0N/A u30 = vis_fmul8sux16(vis_fxor(row33, mask8000), yFilter3); \
0N/A row21 = vis_faligndata(data1, data2); \
0N/A u31 = vis_fmul8ulx16(vis_fxor(row33, mask8000), yFilter3); \
0N/A row22 = vis_faligndata(data2, data3); \
0N/A row23 = vis_faligndata(data3, data4); \
0N/A sPtr += srcYStride; \
0N/A filterposx &= FILTER_MASK; \
0N/A v31 = vis_fpadd16(u10, u11); \
0N/A dpSrc = vis_alignaddr(sPtr, 0); \
0N/A data0 = dpSrc[0]; \
0N/A sum2 = vis_fpadd16(sum2, v22); \
0N/A sum3 = vis_fpadd16(sum3, v23); \
0N/A data1 = dpSrc[1]; \
0N/A v32 = vis_fpadd16(u20, u21); \
0N/A data2 = dpSrc[2]; \
0N/A sum0 = vis_fpadd16(sum0, v30); \
0N/A data3 = dpSrc[3]; \
0N/A v33 = vis_fpadd16(u30, u31); \
0N/A data4 = dpSrc[4]; \
0N/A row30 = vis_faligndata(data0, data1); \
0N/A v00 = vis_fmul8sux16(sum0, xFilter0); \
0N/A row31 = vis_faligndata(data1, data2); \
0N/A row32 = vis_faligndata(data2, data3); \
0N/A row33 = vis_faligndata(data3, data4); \
0N/A yPtr = ((mlib_d64 *) ((mlib_u8 *)mlib_filters_s16_4 + filterposy*4)); \
0N/A sum1 = vis_fpadd16(sum1, v31); \
0N/A yFilter0 = yPtr[0]; \
0N/A sum2 = vis_fpadd16(sum2, v32); \
0N/A v01 = vis_fmul8ulx16(sum0, xFilter0); \
0N/A yFilter1 = yPtr[1]; \
0N/A v10 = vis_fmul8sux16(sum1, xFilter1); \
0N/A sum3 = vis_fpadd16(sum3, v33); \
0N/A yFilter2 = yPtr[2]; \
0N/A v11 = vis_fmul8ulx16(sum1, xFilter1); \
0N/A d0 = vis_fpadd16(v00, v01); \
0N/A yFilter3 = yPtr[3]; \
0N/A xPtr = ((mlib_d64 *)((mlib_u8 *)mlib_filters_s16_4 + filterposx*4)); \
0N/A v20 = vis_fmul8sux16(sum2, xFilter2); \
0N/A xFilter0 = xPtr[0]; \
0N/A v21 = vis_fmul8ulx16(sum2, xFilter2); \
0N/A d1 = vis_fpadd16(v10, v11); \
0N/A xFilter1 = xPtr[1]; \
0N/A v30 = vis_fmul8sux16(sum3, xFilter3); \
0N/A v31 = vis_fmul8ulx16(sum3, xFilter3); \
0N/A d2 = vis_fpadd16(v20, v21); \
0N/A xFilter2 = xPtr[2]; \
0N/A d3 = vis_fpadd16(v30, v31); \
0N/A xFilter3 = xPtr[3]; \
0N/A sPtr = (mlib_s16 *)lineAddr[ySrc] + (xSrc << 2)
0N/A
0N/A/***************************************************************/
0N/A#define FADD_4BC_S16() \
0N/A d0 = vis_fpadd16(d0, d1); \
0N/A d2 = vis_fpadd16(d2, d3); \
0N/A d0 = vis_fpadd16(d0, d2); \
0N/A d2 = vis_fmuld8sux16(f_x01000100, vis_read_hi(d0)); \
0N/A d3 = vis_fmuld8sux16(f_x01000100, vis_read_lo(d0)); \
0N/A res = vis_fxor(vis_fpackfix_pair(d2, d3), mask8000)
0N/A
0N/A/***************************************************************/
0N/Amlib_status mlib_ImageAffine_u16_4ch_bc (mlib_affine_param *param)
0N/A{
0N/A DECLAREVAR_BC();
0N/A DTYPE *dstLineEnd;
0N/A mlib_s32 filterposx, filterposy;
0N/A mlib_d64 data0, data1, data2, data3, data4;
0N/A mlib_d64 sum0, sum1, sum2, sum3;
0N/A mlib_d64 row00, row10, row20, row30;
0N/A mlib_d64 row01, row11, row21, row31;
0N/A mlib_d64 row02, row12, row22, row32;
0N/A mlib_d64 row03, row13, row23, row33;
0N/A mlib_d64 xFilter0, xFilter1, xFilter2, xFilter3;
0N/A mlib_d64 yFilter0, yFilter1, yFilter2, yFilter3;
0N/A mlib_d64 v00, v01, v02, v03, v10, v11, v12, v13;
0N/A mlib_d64 v20, v21, v22, v23, v30, v31, v32, v33;
0N/A mlib_d64 u00, u01, u10, u11, u20, u21, u30, u31;
0N/A mlib_d64 d0, d1, d2, d3;
0N/A mlib_d64 *yPtr, *xPtr;
0N/A mlib_d64 *dp, *dpSrc;
0N/A mlib_s32 cols, i, mask, gsrd;
0N/A mlib_d64 res;
0N/A mlib_f32 f_x01000100 = vis_to_float(0x01000100);
0N/A mlib_d64 mask8000 = vis_to_double_dup(0x80008000);
0N/A const mlib_s16 *mlib_filters_table_4;
0N/A
0N/A if (filter == MLIB_BICUBIC) {
0N/A mlib_filters_table_4 = mlib_filters_s16_bc_4;
0N/A } else {
0N/A mlib_filters_table_4 = mlib_filters_s16_bc2_4;
0N/A }
0N/A
0N/A srcYStride >>= 1;
0N/A
0N/A for (j = yStart; j <= yFinish; j++) {
0N/A
0N/A vis_write_gsr(10 << 3);
0N/A
0N/A CLIP(4);
0N/A dstLineEnd = (DTYPE*)dstData + 4 * xRight;
0N/A
0N/A cols = xRight - xLeft + 1;
0N/A dp = vis_alignaddr(dstPixelPtr, 0);
0N/A dstLineEnd += 3;
0N/A mask = vis_edge16(dstPixelPtr, dstLineEnd);
0N/A gsrd = ((8 - (mlib_addr)dstPixelPtr) & 7);
0N/A
0N/A i = 0;
0N/A
0N/A if (i <= cols - 4) {
0N/A
0N/A NEXT_PIXEL_4BC_S16();
0N/A LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_4);
0N/A
0N/A NEXT_PIXEL_4BC_S16();
0N/A
0N/A BC_S16_4CH(mlib_filters_table_4);
0N/A FADD_4BC_S16();
0N/A
0N/A BC_S16_4CH(mlib_filters_table_4);
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; i < cols-4; i++) {
0N/A vis_alignaddr((void *)gsrd, 0);
0N/A res = vis_faligndata(res, res);
0N/A
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A FADD_4BC_S16();
0N/A BC_S16_4CH(mlib_filters_table_4);
0N/A }
0N/A
0N/A vis_alignaddr((void *)gsrd, 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A FADD_4BC_S16();
0N/A vis_alignaddr((void *)gsrd, 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A RESULT_4BC_S16_1PIXEL();
0N/A vis_alignaddr((void *)gsrd, 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A
0N/A LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_4);
0N/A RESULT_4BC_S16_1PIXEL();
0N/A vis_alignaddr((void *)gsrd, 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A i += 4;
0N/A }
0N/A
0N/A#pragma pipeloop(0)
0N/A for (; i < cols; i++) {
0N/A NEXT_PIXEL_4BC_S16();
0N/A LOAD_BC_S16_4CH_1PIXEL(mlib_filters_table_4);
0N/A RESULT_4BC_S16_1PIXEL();
0N/A vis_alignaddr((void *)gsrd, 0);
0N/A res = vis_faligndata(res, res);
0N/A vis_pst_16(res, dp++, mask);
0N/A vis_pst_16(res, dp, ~mask);
0N/A }
0N/A }
0N/A
0N/A return MLIB_SUCCESS;
0N/A}
0N/A
0N/A/***************************************************************/