void ADD_SUFF(IntArgbBmToIntArgbConvert)(BLIT_PARAMS) { mlib_s32 dstScan = pDstInfo->scanStride; mlib_s32 srcScan = pSrcInfo->scanStride; mlib_d64 dd, dmask, dFF; mlib_s32 i, i0, j, x, mask; if (dstScan == 4*width && srcScan == 4*width) { width *= height; height = 1; } dmask = vis_to_double_dup(0xFFFFFF); dFF = vis_to_double_dup(0xFFFFFFFF); for (j = 0; j < height; j++) { mlib_s32 *src = srcBase; mlib_s32 *dst = dstBase; i = i0 = 0; if ((mlib_s32)dst & 7) { x = src[i]; dst[i] = (x << 7) >> 7; i0 = 1; } #pragma pipeloop(0) for (i = i0; i <= (mlib_s32)width - 2; i += 2) { mlib_u8 *pp0 = (mlib_u8*)(src + i); mlib_u8 *pp1 = (mlib_u8*)(src + i + 1); dd = vis_freg_pair(*(mlib_f32*)pp0, *(mlib_f32*)pp1); dd = vis_fand(dd, dmask); #if 1 mask = ((*pp0 & 1) << 7) | ((*pp1 & 1) << 3); *(mlib_d64*)(dst + i) = dd; vis_pst_8(dFF, dst + i, mask); #else mask = ((*pp0 & 1) << 1) | (*pp1 & 1); dd = vis_for(dd, ((mlib_d64*)vis_amask_arr)[mask]); *(mlib_d64*)(dst + i) = dd; #endif } if (i < width) { x = src[i]; dst[i] = (x << 7) >> 7; }
mlib_status __mlib_SignalEmphasize_S16S_S16S_Sat( mlib_s16 *dst, const mlib_s16 *src, void *filter, mlib_s32 n) { mlib_emphasize_struct *fist = filter; mlib_d64 w_maskand0 = vis_to_double(0xFFFFFFFF, 0xFFFF); mlib_d64 w_maskor0 = vis_freg_pair(0.f, fist->v16_last0); mlib_d64 w_maskand1 = vis_to_double(0xFFFFFFFF, 0xFFFF0000); mlib_d64 w_maskor1 = vis_freg_pair(0.f, fist->v16_last1); mlib_f32 v_mask = vis_to_float(0x80008000); mlib_f32 v_alpha = fist->v_alpha; mlib_s16 *fdst = dst + n + n - 1; mlib_d64 *dpd, *dps, *dsrct1; mlib_d64 w_dst, w_src, w_src0, w_src1, w_src2, w_lsrc; mlib_d64 dr0, dr1, dr2, dr3, dr4, dr5, dr6, dr7; mlib_s32 i, times, t1, t2; /* check for obvious errors */ if ((fist == NULL) || (n <= 0) || (src == 0) || (dst == 0) || (fist->type != MLIB_EMPH)) { return (MLIB_FAILURE); } vis_write_gsr(1 << 3); w_maskor0 = vis_fand(w_maskor0, w_maskand1); w_maskor1 = vis_fand(w_maskor1, w_maskand0); vis_alignaddr((void *)(-(mlib_addr)src), 0); w_maskand0 = vis_faligndata(w_maskand0, w_maskand0); w_maskor0 = vis_faligndata(w_maskor0, w_maskor0); w_maskand1 = vis_faligndata(w_maskand1, w_maskand1); w_maskor1 = vis_faligndata(w_maskor1, w_maskor1); dpd = vis_alignaddr(dst, 0); times = (mlib_d64 *)vis_alignaddr(fdst, 0) - dpd; t1 = -((mlib_addr)(dst) & 7); t2 = t1 - 4; dps = vis_alignaddr((void *)src, t2); w_src0 = vis_ld_d64_nf(dps); dps++; w_src1 = vis_ld_d64_nf(dps); dps++; if ((((mlib_addr)dst ^ (mlib_addr)src) & 7)) { if (((mlib_addr)dps - (mlib_addr)src) >= 6) { w_src0 = vis_fand(w_maskand0, w_src0); w_src0 = vis_for(w_maskor0, w_src0); } else { w_src1 = vis_fand(w_maskand0, w_src1); w_src1 = vis_for(w_maskor0, w_src1); } if (((mlib_addr)dps - (mlib_addr)src) >= 8) { w_src0 = vis_fand(w_maskand1, w_src0); w_src0 = vis_for(w_maskor1, w_src0); } else { w_src1 = vis_fand(w_maskand1, w_src1); w_src1 = vis_for(w_maskor1, w_src1); } w_lsrc = vis_faligndata(w_src0, w_src1); dsrct1 = vis_alignaddr((void *)src, t1); if (dps - 2 != dsrct1) { w_src2 = *dps; dps++; w_src = vis_faligndata(w_src1, w_src2); MLIB_MUL8; if ((mlib_addr)dst & 7) { times--; w_src0 = w_src1; w_src1 = w_src2; w_src2 = *dps; vis_alignaddr((void *)src, t2); w_lsrc = vis_faligndata(w_src0, w_src1); vis_alignaddr((void *)src, t1); w_src = vis_faligndata(w_src1, w_src2); dps++; MLIB_MIX; w_dst = vis_fpackfix_pair(dr2, dr3); vis_pst_16(w_dst, dpd, vis_edge16(dst, fdst)); dpd++; } w_src0 = w_src1; w_src1 = w_src2; w_src2 = vis_ld_d64_nf(dps); vis_alignaddr((void *)src, t2); w_lsrc = vis_faligndata(w_src0, w_src1); vis_alignaddr((void *)src, t1); w_src = vis_faligndata(w_src1, w_src2); MLIB_MIX; w_dst = vis_fpackfix_pair(dr2, dr3); dps++; w_src0 = w_src1; w_src1 = w_src2; w_src2 = vis_ld_d64_nf(dps); vis_alignaddr((void *)src, t2); w_lsrc = vis_faligndata(w_src0, w_src1); vis_alignaddr((void *)src, t1); w_src = vis_faligndata(w_src1, w_src2); dps++; for (i = 0; i < times; i++) { *dpd = w_dst; MLIB_MIX; w_dst = vis_fpackfix_pair(dr2, dr3); w_src0 = w_src1; w_src1 = w_src2; w_src2 = vis_ld_d64_nf(dps); vis_alignaddr((void *)src, t2); w_lsrc = vis_faligndata(w_src0, w_src1); vis_alignaddr((void *)src, t1); w_src = vis_faligndata(w_src1, w_src2); dpd++; dps++; } } else { w_src = vis_faligndata(w_src0, w_src1); MLIB_MUL8; if ((mlib_addr)dst & 7) { times--; w_src0 = w_src1; w_src1 = vis_ld_d64_nf(dps); vis_alignaddr((void *)src, t2); w_lsrc = vis_faligndata(w_src0, w_src1); vis_alignaddr((void *)src, t1); w_src = vis_faligndata(w_src0, w_src1); dps++; MLIB_MIX; w_dst = vis_fpackfix_pair(dr2, dr3); vis_pst_16(w_dst, dpd, vis_edge16(dst, fdst)); dpd++; } w_src0 = w_src1; w_src1 = vis_ld_d64_nf(dps); vis_alignaddr((void *)src, t2); w_lsrc = vis_faligndata(w_src0, w_src1); vis_alignaddr((void *)src, t1); w_src = vis_faligndata(w_src0, w_src1); MLIB_MIX; w_dst = vis_fpackfix_pair(dr2, dr3); dps++; w_src0 = w_src1; w_src1 = vis_ld_d64_nf(dps); vis_alignaddr((void *)src, t2); w_lsrc = vis_faligndata(w_src0, w_src1); vis_alignaddr((void *)src, t1); w_src = vis_faligndata(w_src0, w_src1); dps++; for (i = 0; i < times; i++) { *dpd = w_dst; MLIB_MIX; w_dst = vis_fpackfix_pair(dr2, dr3); w_src0 = w_src1; w_src1 = vis_ld_d64_nf(dps); vis_alignaddr((void *)src, t2); w_lsrc = vis_faligndata(w_src0, w_src1); vis_alignaddr((void *)src, t1); w_src = vis_faligndata(w_src0, w_src1); dps++; dpd++; } } } else { w_src = w_src1; if ((mlib_addr)src & 7) { times--; if (((mlib_addr)src & 7) == 2) { w_src0 = vis_fand(w_maskand0, w_src0); w_src0 = vis_for(w_maskor0, w_src0); } else { w_src1 = vis_fand(w_maskand0, w_src1); w_src1 = vis_for(w_maskor0, w_src1); } w_src1 = vis_fand(w_maskand1, w_src1); w_src1 = vis_for(w_maskor1, w_src1); w_lsrc = vis_faligndata(w_src0, w_src1); MLIB_MUL8; w_src0 = w_src1; w_src1 = *dps; w_src = w_src1; w_lsrc = vis_faligndata(w_src0, w_src1); dps++; MLIB_MIX; w_dst = vis_fpackfix_pair(dr2, dr3); vis_pst_16(w_dst, dpd, vis_edge16(dst, fdst)); dpd++; } else { w_src0 = vis_fand(w_maskand0, w_src0); w_src0 = vis_for(w_maskor0, w_src0); w_src0 = vis_fand(w_maskand1, w_src0); w_src0 = vis_for(w_maskor1, w_src0); w_lsrc = vis_faligndata(w_src0, w_src1); MLIB_MUL8; } w_src = vis_ld_d64_nf(dps); w_lsrc = vis_faligndata(w_src1, w_src); MLIB_MIX; w_src1 = w_src; w_dst = vis_fpackfix_pair(dr2, dr3); dps++; w_src = vis_ld_d64_nf(dps); w_lsrc = vis_faligndata(w_src1, w_src); dps++; for (i = 0; i < times; i++) { *dpd = w_dst; MLIB_MIX; w_src1 = w_src; w_src = vis_ld_d64_nf(dps); w_lsrc = vis_faligndata(w_src1, w_src); w_dst = vis_fpackfix_pair(dr2, dr3); dps++; dpd++; } } if (times >= 0) { vis_pst_16(w_dst, dpd, vis_edge16(dpd, fdst)); } ((mlib_s16 *)&fist->v16_last0)[0] = src[2 * n - 2]; ((mlib_s16 *)&fist->v16_last1)[1] = src[2 * n - 1]; return (MLIB_SUCCESS); }