]> git.sesse.net Git - ffmpeg/blob - libavcodec/mips/h264idct_msa.c
Merge commit '2689bb115ca64921789092148deaf213a0d94d2e'
[ffmpeg] / libavcodec / mips / h264idct_msa.c
1 /*
2  * Copyright (c) 2015 Manojkumar Bhosale (Manojkumar.Bhosale@imgtec.com)
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20
21 #include "libavutil/mips/generic_macros_msa.h"
22 #include "h264dsp_mips.h"
23 #include "libavcodec/bit_depth_template.c"
24
25 #define AVC_ITRANS_H(in0, in1, in2, in3, out0, out1, out2, out3)          \
26 {                                                                         \
27     v8i16 tmp0_m, tmp1_m, tmp2_m, tmp3_m;                                 \
28                                                                           \
29     tmp0_m = in0 + in2;                                                   \
30     tmp1_m = in0 - in2;                                                   \
31     tmp2_m = in1 >> 1;                                                    \
32     tmp2_m = tmp2_m - in3;                                                \
33     tmp3_m = in3 >> 1;                                                    \
34     tmp3_m = in1 + tmp3_m;                                                \
35                                                                           \
36     BUTTERFLY_4(tmp0_m, tmp1_m, tmp2_m, tmp3_m, out0, out1, out2, out3);  \
37 }
38
39 static void avc_idct4x4_addblk_msa(uint8_t *dst, int16_t *src,
40                                    int32_t dst_stride)
41 {
42     v8i16 src0, src1, src2, src3;
43     v8i16 hres0, hres1, hres2, hres3;
44     v8i16 vres0, vres1, vres2, vres3;
45     v8i16 zeros = { 0 };
46
47     LD4x4_SH(src, src0, src1, src2, src3);
48     AVC_ITRANS_H(src0, src1, src2, src3, hres0, hres1, hres2, hres3);
49     TRANSPOSE4x4_SH_SH(hres0, hres1, hres2, hres3, hres0, hres1, hres2, hres3);
50     AVC_ITRANS_H(hres0, hres1, hres2, hres3, vres0, vres1, vres2, vres3);
51     SRARI_H4_SH(vres0, vres1, vres2, vres3, 6);
52     ADDBLK_ST4x4_UB(vres0, vres1, vres2, vres3, dst, dst_stride);
53     ST_SH2(zeros, zeros, src, 8);
54 }
55
56 static void avc_idct4x4_addblk_dc_msa(uint8_t *dst, int16_t *src,
57                                       int32_t dst_stride)
58 {
59     int16_t dc;
60     uint32_t src0, src1, src2, src3;
61     v16u8 pred = { 0 };
62     v16i8 out;
63     v8i16 input_dc, pred_r, pred_l;
64
65     dc = (src[0] + 32) >> 6;
66     input_dc = __msa_fill_h(dc);
67     src[0] = 0;
68
69     LW4(dst, dst_stride, src0, src1, src2, src3);
70     INSERT_W4_UB(src0, src1, src2, src3, pred);
71     UNPCK_UB_SH(pred, pred_r, pred_l);
72
73     pred_r += input_dc;
74     pred_l += input_dc;
75
76     CLIP_SH2_0_255(pred_r, pred_l);
77     out = __msa_pckev_b((v16i8) pred_l, (v16i8) pred_r);
78     ST4x4_UB(out, out, 0, 1, 2, 3, dst, dst_stride);
79 }
80
81 static void avc_deq_idct_luma_dc_msa(int16_t *dst, int16_t *src,
82                                      int32_t de_q_val)
83 {
84 #define DC_DEST_STRIDE 16
85     int16_t out0, out1, out2, out3;
86     v8i16 src0, src1, src2, src3;
87     v8i16 vec0, vec1, vec2, vec3;
88     v8i16 hres0, hres1, hres2, hres3;
89     v8i16 vres0, vres1, vres2, vres3;
90     v4i32 vres0_r, vres1_r, vres2_r, vres3_r;
91     v4i32 de_q_vec = __msa_fill_w(de_q_val);
92
93     LD4x4_SH(src, src0, src1, src2, src3);
94     TRANSPOSE4x4_SH_SH(src0, src1, src2, src3, src0, src1, src2, src3);
95     BUTTERFLY_4(src0, src2, src3, src1, vec0, vec3, vec2, vec1);
96     BUTTERFLY_4(vec0, vec1, vec2, vec3, hres0, hres3, hres2, hres1);
97     TRANSPOSE4x4_SH_SH(hres0, hres1, hres2, hres3, hres0, hres1, hres2, hres3);
98     BUTTERFLY_4(hres0, hres1, hres3, hres2, vec0, vec3, vec2, vec1);
99     BUTTERFLY_4(vec0, vec1, vec2, vec3, vres0, vres1, vres2, vres3);
100     UNPCK_R_SH_SW(vres0, vres0_r);
101     UNPCK_R_SH_SW(vres1, vres1_r);
102     UNPCK_R_SH_SW(vres2, vres2_r);
103     UNPCK_R_SH_SW(vres3, vres3_r);
104
105     vres0_r *= de_q_vec;
106     vres1_r *= de_q_vec;
107     vres2_r *= de_q_vec;
108     vres3_r *= de_q_vec;
109
110     SRARI_W4_SW(vres0_r, vres1_r, vres2_r, vres3_r, 8);
111     PCKEV_H2_SH(vres1_r, vres0_r, vres3_r, vres2_r, vec0, vec1);
112
113     out0 = __msa_copy_s_h(vec0, 0);
114     out1 = __msa_copy_s_h(vec0, 1);
115     out2 = __msa_copy_s_h(vec0, 2);
116     out3 = __msa_copy_s_h(vec0, 3);
117     SH(out0, dst);
118     SH(out1, (dst + 2 * DC_DEST_STRIDE));
119     SH(out2, (dst + 8 * DC_DEST_STRIDE));
120     SH(out3, (dst + 10 * DC_DEST_STRIDE));
121     dst += DC_DEST_STRIDE;
122
123     out0 = __msa_copy_s_h(vec0, 4);
124     out1 = __msa_copy_s_h(vec0, 5);
125     out2 = __msa_copy_s_h(vec0, 6);
126     out3 = __msa_copy_s_h(vec0, 7);
127     SH(out0, dst);
128     SH(out1, (dst + 2 * DC_DEST_STRIDE));
129     SH(out2, (dst + 8 * DC_DEST_STRIDE));
130     SH(out3, (dst + 10 * DC_DEST_STRIDE));
131     dst += (3 * DC_DEST_STRIDE);
132
133     out0 = __msa_copy_s_h(vec1, 0);
134     out1 = __msa_copy_s_h(vec1, 1);
135     out2 = __msa_copy_s_h(vec1, 2);
136     out3 = __msa_copy_s_h(vec1, 3);
137     SH(out0, dst);
138     SH(out1, (dst + 2 * DC_DEST_STRIDE));
139     SH(out2, (dst + 8 * DC_DEST_STRIDE));
140     SH(out3, (dst + 10 * DC_DEST_STRIDE));
141     dst += DC_DEST_STRIDE;
142
143     out0 = __msa_copy_s_h(vec1, 4);
144     out1 = __msa_copy_s_h(vec1, 5);
145     out2 = __msa_copy_s_h(vec1, 6);
146     out3 = __msa_copy_s_h(vec1, 7);
147     SH(out0, dst);
148     SH(out1, (dst + 2 * DC_DEST_STRIDE));
149     SH(out2, (dst + 8 * DC_DEST_STRIDE));
150     SH(out3, (dst + 10 * DC_DEST_STRIDE));
151
152 #undef DC_DEST_STRIDE
153 }
154
155 static void avc_idct8_addblk_msa(uint8_t *dst, int16_t *src, int32_t dst_stride)
156 {
157     v8i16 src0, src1, src2, src3, src4, src5, src6, src7;
158     v8i16 vec0, vec1, vec2, vec3;
159     v8i16 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
160     v8i16 res0, res1, res2, res3, res4, res5, res6, res7;
161     v4i32 tmp0_r, tmp1_r, tmp2_r, tmp3_r, tmp4_r, tmp5_r, tmp6_r, tmp7_r;
162     v4i32 tmp0_l, tmp1_l, tmp2_l, tmp3_l, tmp4_l, tmp5_l, tmp6_l, tmp7_l;
163     v4i32 vec0_r, vec1_r, vec2_r, vec3_r, vec0_l, vec1_l, vec2_l, vec3_l;
164     v4i32 res0_r, res1_r, res2_r, res3_r, res4_r, res5_r, res6_r, res7_r;
165     v4i32 res0_l, res1_l, res2_l, res3_l, res4_l, res5_l, res6_l, res7_l;
166     v16i8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
167     v16i8 zeros = { 0 };
168
169     src[0] += 32;
170
171     LD_SH8(src, 8, src0, src1, src2, src3, src4, src5, src6, src7);
172
173     vec0 = src0 + src4;
174     vec1 = src0 - src4;
175     vec2 = src2 >> 1;
176     vec2 = vec2 - src6;
177     vec3 = src6 >> 1;
178     vec3 = src2 + vec3;
179
180     BUTTERFLY_4(vec0, vec1, vec2, vec3, tmp0, tmp1, tmp2, tmp3);
181
182     vec0 = src7 >> 1;
183     vec0 = src5 - vec0 - src3 - src7;
184     vec1 = src3 >> 1;
185     vec1 = src1 - vec1 + src7 - src3;
186     vec2 = src5 >> 1;
187     vec2 = vec2 - src1 + src7 + src5;
188     vec3 = src1 >> 1;
189     vec3 = vec3 + src3 + src5 + src1;
190     tmp4 = vec3 >> 2;
191     tmp4 += vec0;
192     tmp5 = vec2 >> 2;
193     tmp5 += vec1;
194     tmp6 = vec1 >> 2;
195     tmp6 -= vec2;
196     tmp7 = vec0 >> 2;
197     tmp7 = vec3 - tmp7;
198
199     BUTTERFLY_8(tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7,
200                 res0, res1, res2, res3, res4, res5, res6, res7);
201     TRANSPOSE8x8_SH_SH(res0, res1, res2, res3, res4, res5, res6, res7,
202                        res0, res1, res2, res3, res4, res5, res6, res7);
203     UNPCK_SH_SW(res0, tmp0_r, tmp0_l);
204     UNPCK_SH_SW(res1, tmp1_r, tmp1_l);
205     UNPCK_SH_SW(res2, tmp2_r, tmp2_l);
206     UNPCK_SH_SW(res3, tmp3_r, tmp3_l);
207     UNPCK_SH_SW(res4, tmp4_r, tmp4_l);
208     UNPCK_SH_SW(res5, tmp5_r, tmp5_l);
209     UNPCK_SH_SW(res6, tmp6_r, tmp6_l);
210     UNPCK_SH_SW(res7, tmp7_r, tmp7_l);
211     BUTTERFLY_4(tmp0_r, tmp0_l, tmp4_l, tmp4_r, vec0_r, vec0_l, vec1_l, vec1_r);
212
213     vec2_r = tmp2_r >> 1;
214     vec2_l = tmp2_l >> 1;
215     vec2_r -= tmp6_r;
216     vec2_l -= tmp6_l;
217     vec3_r = tmp6_r >> 1;
218     vec3_l = tmp6_l >> 1;
219     vec3_r += tmp2_r;
220     vec3_l += tmp2_l;
221
222     BUTTERFLY_4(vec0_r, vec1_r, vec2_r, vec3_r, tmp0_r, tmp2_r, tmp4_r, tmp6_r);
223     BUTTERFLY_4(vec0_l, vec1_l, vec2_l, vec3_l, tmp0_l, tmp2_l, tmp4_l, tmp6_l);
224
225     vec0_r = tmp7_r >> 1;
226     vec0_l = tmp7_l >> 1;
227     vec0_r = tmp5_r - vec0_r - tmp3_r - tmp7_r;
228     vec0_l = tmp5_l - vec0_l - tmp3_l - tmp7_l;
229     vec1_r = tmp3_r >> 1;
230     vec1_l = tmp3_l >> 1;
231     vec1_r = tmp1_r - vec1_r + tmp7_r - tmp3_r;
232     vec1_l = tmp1_l - vec1_l + tmp7_l - tmp3_l;
233     vec2_r = tmp5_r >> 1;
234     vec2_l = tmp5_l >> 1;
235     vec2_r = vec2_r - tmp1_r + tmp7_r + tmp5_r;
236     vec2_l = vec2_l - tmp1_l + tmp7_l + tmp5_l;
237     vec3_r = tmp1_r >> 1;
238     vec3_l = tmp1_l >> 1;
239     vec3_r = vec3_r + tmp3_r + tmp5_r + tmp1_r;
240     vec3_l = vec3_l + tmp3_l + tmp5_l + tmp1_l;
241     tmp1_r = vec3_r >> 2;
242     tmp1_l = vec3_l >> 2;
243     tmp1_r += vec0_r;
244     tmp1_l += vec0_l;
245     tmp3_r = vec2_r >> 2;
246     tmp3_l = vec2_l >> 2;
247     tmp3_r += vec1_r;
248     tmp3_l += vec1_l;
249     tmp5_r = vec1_r >> 2;
250     tmp5_l = vec1_l >> 2;
251     tmp5_r -= vec2_r;
252     tmp5_l -= vec2_l;
253     tmp7_r = vec0_r >> 2;
254     tmp7_l = vec0_l >> 2;
255     tmp7_r = vec3_r - tmp7_r;
256     tmp7_l = vec3_l - tmp7_l;
257
258     BUTTERFLY_4(tmp0_r, tmp0_l, tmp7_l, tmp7_r, res0_r, res0_l, res7_l, res7_r);
259     BUTTERFLY_4(tmp2_r, tmp2_l, tmp5_l, tmp5_r, res1_r, res1_l, res6_l, res6_r);
260     BUTTERFLY_4(tmp4_r, tmp4_l, tmp3_l, tmp3_r, res2_r, res2_l, res5_l, res5_r);
261     BUTTERFLY_4(tmp6_r, tmp6_l, tmp1_l, tmp1_r, res3_r, res3_l, res4_l, res4_r);
262     SRA_4V(res0_r, res0_l, res1_r, res1_l, 6);
263     SRA_4V(res2_r, res2_l, res3_r, res3_l, 6);
264     SRA_4V(res4_r, res4_l, res5_r, res5_l, 6);
265     SRA_4V(res6_r, res6_l, res7_r, res7_l, 6);
266     PCKEV_H4_SH(res0_l, res0_r, res1_l, res1_r, res2_l, res2_r, res3_l, res3_r,
267                 res0, res1, res2, res3);
268     PCKEV_H4_SH(res4_l, res4_r, res5_l, res5_r, res6_l, res6_r, res7_l, res7_r,
269                 res4, res5, res6, res7);
270     LD_SB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
271     ILVR_B4_SH(zeros, dst0, zeros, dst1, zeros, dst2, zeros, dst3,
272                tmp0, tmp1, tmp2, tmp3);
273     ILVR_B4_SH(zeros, dst4, zeros, dst5, zeros, dst6, zeros, dst7,
274                tmp4, tmp5, tmp6, tmp7);
275     ADD4(res0, tmp0, res1, tmp1, res2, tmp2, res3, tmp3,
276          res0, res1, res2, res3);
277     ADD4(res4, tmp4, res5, tmp5, res6, tmp6, res7, tmp7,
278          res4, res5, res6, res7);
279     CLIP_SH4_0_255(res0, res1, res2, res3);
280     CLIP_SH4_0_255(res4, res5, res6, res7);
281     PCKEV_B4_SB(res1, res0, res3, res2, res5, res4, res7, res6,
282                 dst0, dst1, dst2, dst3);
283     ST8x4_UB(dst0, dst1, dst, dst_stride);
284     dst += (4 * dst_stride);
285     ST8x4_UB(dst2, dst3, dst, dst_stride);
286 }
287
288 static void avc_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src,
289                                     int32_t dst_stride)
290 {
291     int32_t dc_val;
292     v16i8 dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7;
293     v8i16 dst0_r, dst1_r, dst2_r, dst3_r, dst4_r, dst5_r, dst6_r, dst7_r;
294     v8i16 dc;
295     v16i8 zeros = { 0 };
296
297     dc_val = (src[0] + 32) >> 6;
298     dc = __msa_fill_h(dc_val);
299
300     src[0] = 0;
301
302     LD_SB8(dst, dst_stride, dst0, dst1, dst2, dst3, dst4, dst5, dst6, dst7);
303     ILVR_B4_SH(zeros, dst0, zeros, dst1, zeros, dst2, zeros, dst3,
304                dst0_r, dst1_r, dst2_r, dst3_r);
305     ILVR_B4_SH(zeros, dst4, zeros, dst5, zeros, dst6, zeros, dst7,
306                dst4_r, dst5_r, dst6_r, dst7_r);
307     ADD4(dst0_r, dc, dst1_r, dc, dst2_r, dc, dst3_r, dc,
308          dst0_r, dst1_r, dst2_r, dst3_r);
309     ADD4(dst4_r, dc, dst5_r, dc, dst6_r, dc, dst7_r, dc,
310          dst4_r, dst5_r, dst6_r, dst7_r);
311     CLIP_SH4_0_255(dst0_r, dst1_r, dst2_r, dst3_r);
312     CLIP_SH4_0_255(dst4_r, dst5_r, dst6_r, dst7_r);
313     PCKEV_B4_SB(dst1_r, dst0_r, dst3_r, dst2_r, dst5_r, dst4_r, dst7_r, dst6_r,
314                 dst0, dst1, dst2, dst3);
315     ST8x4_UB(dst0, dst1, dst, dst_stride);
316     dst += (4 * dst_stride);
317     ST8x4_UB(dst2, dst3, dst, dst_stride);
318 }
319
320 void ff_h264_idct_add_msa(uint8_t *dst, int16_t *src,
321                           int32_t dst_stride)
322 {
323     avc_idct4x4_addblk_msa(dst, src, dst_stride);
324     memset(src, 0, 16 * sizeof(dctcoef));
325 }
326
327 void ff_h264_idct8_addblk_msa(uint8_t *dst, int16_t *src,
328                               int32_t dst_stride)
329 {
330     avc_idct8_addblk_msa(dst, src, dst_stride);
331     memset(src, 0, 64 * sizeof(dctcoef));
332 }
333
334 void ff_h264_idct4x4_addblk_dc_msa(uint8_t *dst, int16_t *src,
335                                    int32_t dst_stride)
336 {
337     avc_idct4x4_addblk_dc_msa(dst, src, dst_stride);
338 }
339
340 void ff_h264_idct8_dc_addblk_msa(uint8_t *dst, int16_t *src,
341                                  int32_t dst_stride)
342 {
343     avc_idct8_dc_addblk_msa(dst, src, dst_stride);
344 }
345
346 void ff_h264_idct_add16_msa(uint8_t *dst,
347                             const int32_t *blk_offset,
348                             int16_t *block, int32_t dst_stride,
349                             const uint8_t nzc[15 * 8])
350 {
351     int32_t i;
352
353     for (i = 0; i < 16; i++) {
354         int32_t nnz = nzc[scan8[i]];
355
356         if (nnz) {
357             if (nnz == 1 && ((dctcoef *) block)[i * 16])
358                 ff_h264_idct4x4_addblk_dc_msa(dst + blk_offset[i],
359                                               block + i * 16 * sizeof(pixel),
360                                               dst_stride);
361             else
362                 ff_h264_idct_add_msa(dst + blk_offset[i],
363                                      block + i * 16 * sizeof(pixel),
364                                      dst_stride);
365         }
366     }
367 }
368
369 void ff_h264_idct8_add4_msa(uint8_t *dst, const int32_t *blk_offset,
370                             int16_t *block, int32_t dst_stride,
371                             const uint8_t nzc[15 * 8])
372 {
373     int32_t cnt;
374
375     for (cnt = 0; cnt < 16; cnt += 4) {
376         int32_t nnz = nzc[scan8[cnt]];
377
378         if (nnz) {
379             if (nnz == 1 && ((dctcoef *) block)[cnt * 16])
380                 ff_h264_idct8_dc_addblk_msa(dst + blk_offset[cnt],
381                                             block + cnt * 16 * sizeof(pixel),
382                                             dst_stride);
383             else
384                 ff_h264_idct8_addblk_msa(dst + blk_offset[cnt],
385                                          block + cnt * 16 * sizeof(pixel),
386                                          dst_stride);
387         }
388     }
389 }
390
391 void ff_h264_idct_add8_msa(uint8_t **dst,
392                            const int32_t *blk_offset,
393                            int16_t *block, int32_t dst_stride,
394                            const uint8_t nzc[15 * 8])
395 {
396     int32_t i, j;
397
398     for (j = 1; j < 3; j++) {
399         for (i = (j * 16); i < (j * 16 + 4); i++) {
400             if (nzc[scan8[i]])
401                 ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i],
402                                      block + i * 16 * sizeof(pixel),
403                                      dst_stride);
404             else if (((dctcoef *) block)[i * 16])
405                 ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i],
406                                               block + i * 16 * sizeof(pixel),
407                                               dst_stride);
408         }
409     }
410 }
411
412 void ff_h264_idct_add8_422_msa(uint8_t **dst,
413                                const int32_t *blk_offset,
414                                int16_t *block, int32_t dst_stride,
415                                const uint8_t nzc[15 * 8])
416 {
417     int32_t i, j;
418
419     for (j = 1; j < 3; j++) {
420         for (i = (j * 16); i < (j * 16 + 4); i++) {
421             if (nzc[scan8[i]])
422                 ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i],
423                                      block + i * 16 * sizeof(pixel),
424                                      dst_stride);
425             else if (((dctcoef *) block)[i * 16])
426                 ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i],
427                                               block + i * 16 * sizeof(pixel),
428                                               dst_stride);
429         }
430     }
431
432     for (j = 1; j < 3; j++) {
433         for (i = (j * 16 + 4); i < (j * 16 + 8); i++) {
434             if (nzc[scan8[i + 4]])
435                 ff_h264_idct_add_msa(dst[j - 1] + blk_offset[i + 4],
436                                      block + i * 16 * sizeof(pixel),
437                                      dst_stride);
438             else if (((dctcoef *) block)[i * 16])
439                 ff_h264_idct4x4_addblk_dc_msa(dst[j - 1] + blk_offset[i + 4],
440                                               block + i * 16 * sizeof(pixel),
441                                               dst_stride);
442         }
443     }
444 }
445
446 void ff_h264_idct_add16_intra_msa(uint8_t *dst,
447                                   const int32_t *blk_offset,
448                                   int16_t *block,
449                                   int32_t dst_stride,
450                                   const uint8_t nzc[15 * 8])
451 {
452     int32_t i;
453
454     for (i = 0; i < 16; i++) {
455         if (nzc[scan8[i]])
456             ff_h264_idct_add_msa(dst + blk_offset[i],
457                                  block + i * 16 * sizeof(pixel), dst_stride);
458         else if (((dctcoef *) block)[i * 16])
459             ff_h264_idct4x4_addblk_dc_msa(dst + blk_offset[i],
460                                           block + i * 16 * sizeof(pixel),
461                                           dst_stride);
462     }
463 }
464
465 void ff_h264_deq_idct_luma_dc_msa(int16_t *dst, int16_t *src,
466                                   int32_t de_qval)
467 {
468     avc_deq_idct_luma_dc_msa(dst, src, de_qval);
469 }