MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / altivec_packIntArrayToCharArray

Function altivec_packIntArrayToCharArray

libswscale/ppc/swscale_altivec_template.c:26–86  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

24#define vzero vec_splat_s32(0)
25
26static inline void
27altivec_packIntArrayToCharArray(int *val, uint8_t* dest, int dstW)
28{
29 register int i;
30 vector unsigned int altivec_vectorShiftInt19 =
31 vec_add(vec_splat_u32(10), vec_splat_u32(9));
32 if ((unsigned long)dest % 16) {
33 /* badly aligned store, we force store alignment */
34 /* and will handle load misalignment on val w/ vec_perm */
35 vector unsigned char perm1;
36 vector signed int v1;
37 for (i = 0 ; (i < dstW) &&
38 (((unsigned long)dest + i) % 16) ; i++) {
39 int t = val[i] >> 19;
40 dest[i] = (t < 0) ? 0 : ((t > 255) ? 255 : t);
41 }
42 perm1 = vec_lvsl(i << 2, val);
43 v1 = vec_ld(i << 2, val);
44 for ( ; i < (dstW - 15); i+=16) {
45 int offset = i << 2;
46 vector signed int v2 = vec_ld(offset + 16, val);
47 vector signed int v3 = vec_ld(offset + 32, val);
48 vector signed int v4 = vec_ld(offset + 48, val);
49 vector signed int v5 = vec_ld(offset + 64, val);
50 vector signed int v12 = vec_perm(v1, v2, perm1);
51 vector signed int v23 = vec_perm(v2, v3, perm1);
52 vector signed int v34 = vec_perm(v3, v4, perm1);
53 vector signed int v45 = vec_perm(v4, v5, perm1);
54
55 vector signed int vA = vec_sra(v12, altivec_vectorShiftInt19);
56 vector signed int vB = vec_sra(v23, altivec_vectorShiftInt19);
57 vector signed int vC = vec_sra(v34, altivec_vectorShiftInt19);
58 vector signed int vD = vec_sra(v45, altivec_vectorShiftInt19);
59 vector unsigned short vs1 = vec_packsu(vA, vB);
60 vector unsigned short vs2 = vec_packsu(vC, vD);
61 vector unsigned char vf = vec_packsu(vs1, vs2);
62 vec_st(vf, i, dest);
63 v1 = v5;
64 }
65 } else { // dest is properly aligned, great
66 for (i = 0; i < (dstW - 15); i+=16) {
67 int offset = i << 2;
68 vector signed int v1 = vec_ld(offset, val);
69 vector signed int v2 = vec_ld(offset + 16, val);
70 vector signed int v3 = vec_ld(offset + 32, val);
71 vector signed int v4 = vec_ld(offset + 48, val);
72 vector signed int v5 = vec_sra(v1, altivec_vectorShiftInt19);
73 vector signed int v6 = vec_sra(v2, altivec_vectorShiftInt19);
74 vector signed int v7 = vec_sra(v3, altivec_vectorShiftInt19);
75 vector signed int v8 = vec_sra(v4, altivec_vectorShiftInt19);
76 vector unsigned short vs1 = vec_packsu(v5, v6);
77 vector unsigned short vs2 = vec_packsu(v7, v8);
78 vector unsigned char vf = vec_packsu(vs1, vs2);
79 vec_st(vf, i, dest);
80 }
81 }
82 for ( ; i < dstW ; i++) {
83 int t = val[i] >> 19;

Callers 1

yuv2yuvX_altivec_realFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected