1/******************************************************************************
2*
3* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*
5* Licensed under the Apache License, Version 2.0 (the "License");
6* you may not use this file except in compliance with the License.
7* You may obtain a copy of the License at:
8*
9* http://www.apache.org/licenses/LICENSE-2.0
10*
11* Unless required by applicable law or agreed to in writing, software
12* distributed under the License is distributed on an "AS IS" BASIS,
13* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14* See the License for the specific language governing permissions and
15* limitations under the License.
16*
17******************************************************************************/
18/**
19 *******************************************************************************
20 * @file
21 *  ihevc_mem_fns_atom_intr.c
22 *
23 * @brief
24 *  Functions used for memory operations
25 *
26 * @author
27 *  Ittiam
28 *
29 * @par List of Functions:
30 *
31 * @remarks
32 *  None
33 *
34 *******************************************************************************
35 */
36
37/*****************************************************************************/
38/* File Includes                                                             */
39/*****************************************************************************/
40#include <stdio.h>
41#include <stddef.h>
42#include <stdlib.h>
43#include <string.h>
44#include <assert.h>
45
46#include "ihevc_typedefs.h"
47#include "ihevc_func_selector.h"
48#include "ihevc_mem_fns.h"
49
50#include <immintrin.h>
51
52/**
53 *******************************************************************************
54 *
55 * @brief
56 *   memcpy of a 8,16 or 32 bytes
57 *
58 * @par Description:
59 *   Does memcpy of 8bit data from source to destination for 8,16 or 32 number of bytes
60 *
61 * @param[in] pu1_dst
62 *  UWORD8 pointer to the destination
63 *
64 * @param[in] pu1_src
65 *  UWORD8 pointer to the source
66 *
67 * @param[in] num_bytes
68 *  number of bytes to copy
69 * @returns
70 *
71 * @remarks
72 *  None
73 *
74 *******************************************************************************
75 */
76
77
78
79
80void ihevc_memcpy_mul_8_ssse3(UWORD8 *pu1_dst, UWORD8 *pu1_src, UWORD32 num_bytes)
81{
82    int col;
83    for(col = num_bytes; col >= 8; col -= 8)
84    {
85        __m128i src_temp16x8b;
86        src_temp16x8b = _mm_loadl_epi64((__m128i *)(pu1_src));
87        pu1_src += 8;
88        _mm_storel_epi64((__m128i *)(pu1_dst), src_temp16x8b);
89        pu1_dst += 8;
90    }
91}
92
93/**
94 *******************************************************************************
95 *
96 * @brief
97 *   memset of a 8,16 or 32 bytes
98 *
99 * @par Description:
100 *   Does memset of 8bit data for 8,16 or 32 number of bytes
101 *
102 * @param[in] pu1_dst
103 *  UWORD8 pointer to the destination
104 *
105 * @param[in] value
106 *  UWORD8 value used for memset
107 *
108 * @param[in] num_bytes
109 *  number of bytes to set
110 * @returns
111 *
112 * @remarks
113 *  None
114 *
115 *******************************************************************************
116 */
117
118
119void ihevc_memset_mul_8_ssse3(UWORD8 *pu1_dst, UWORD8 value, UWORD32 num_bytes)
120{
121    int col;
122    __m128i src_temp16x8b;
123    src_temp16x8b = _mm_set1_epi8(value);
124    for(col = num_bytes; col >= 8; col -= 8)
125    {
126        _mm_storel_epi64((__m128i *)(pu1_dst), src_temp16x8b);
127        pu1_dst += 8;
128    }
129}
130
131/**
132 *******************************************************************************
133 *
134 * @brief
135 *   memset of 16bit data of a 8,16 or 32 bytes
136 *
137 * @par Description:
138 *   Does memset of 16bit data for 8,16 or 32 number of bytes
139 *
140 * @param[in] pu2_dst
141 *  UWORD8 pointer to the destination
142 *
143 * @param[in] value
144 *  UWORD16 value used for memset
145 *
146 * @param[in] num_words
147 *  number of words to set
148 * @returns
149 *
150 * @remarks
151 *  None
152 *
153 *******************************************************************************
154 */
155
156
157void ihevc_memset_16bit_mul_8_ssse3(UWORD16 *pu2_dst, UWORD16 value, UWORD32 num_words)
158{
159    int col;
160    __m128i src_temp16x8b;
161    src_temp16x8b = _mm_set1_epi16(value);
162    for(col = num_words; col >= 8; col -= 8)
163    {
164        _mm_storeu_si128((__m128i *)(pu2_dst), src_temp16x8b);
165        pu2_dst += 8;
166    }
167}
168
169