Home | History | Annotate | Download | only in x86
      1 /******************************************************************************
      2  *
      3  * Copyright (C) 2015 The Android Open Source Project
      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  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 /**
     21 *******************************************************************************
     22 * @file
     23 *  ih264_padding_atom_intr.c
     24 *
     25 * @brief
     26 *  Contains function definitions for Padding
     27 *
     28 * @author
     29 *  Srinivas T
     30 *
     31 * @par List of Functions:
     32 *   - ih264_pad_left_luma_ssse3()
     33 *   - ih264_pad_left_chroma_ssse3()
     34 *   - ih264_pad_right_luma_ssse3()
     35 *   - ih264_pad_right_chroma_ssse3()
     36 *
     37 * @remarks
     38 *  None
     39 *
     40 *******************************************************************************
     41 */
     42 
     43 #include <string.h>
     44 #include <assert.h>
     45 #include "ih264_typedefs.h"
     46 #include "ih264_platform_macros.h"
     47 #include "ih264_mem_fns.h"
     48 #include "ih264_debug.h"
     49 
     50 #include <immintrin.h>
     51 
     52 
     53 /**
     54 *******************************************************************************
     55 *
     56 * @brief
     57 *   Padding (luma block) at the left of a 2d array
     58 *
     59 * @par Description:
     60 *   The left column of a 2d array is replicated for pad_size times at the left
     61 *
     62 *
     63 * @param[in] pu1_src
     64 *  UWORD8 pointer to the source
     65 *
     66 * @param[in] src_strd
     67 *  integer source stride
     68 *
     69 * @param[in] ht
     70 *  integer height of the array
     71 *
     72 * @param[in] wd
     73 *  integer width of the array
     74 *
     75 * @param[in] pad_size
     76 *  integer -padding size of the array
     77 *
     78 * @param[in] ht
     79 *  integer height of the array
     80 *
     81 * @param[in] wd
     82 *  integer width of the array
     83 *
     84 * @returns
     85 *
     86 * @remarks
     87 *  None
     88 *
     89 *******************************************************************************
     90 */
     91 
     92 void ih264_pad_left_luma_ssse3(UWORD8 *pu1_src,
     93                                WORD32 src_strd,
     94                                WORD32 ht,
     95                                WORD32 pad_size)
     96 {
     97     WORD32 row;
     98     WORD32 i;
     99     UWORD8 *pu1_dst;
    100 
    101     ASSERT(pad_size % 8 == 0);
    102 
    103     for(row = 0; row < ht; row++)
    104     {
    105         __m128i src_temp0_16x8b;
    106 
    107         pu1_dst = pu1_src - pad_size;
    108         src_temp0_16x8b = _mm_set1_epi8(*pu1_src);
    109         for(i = 0; i < pad_size; i += 8)
    110         {
    111             _mm_storel_epi64((__m128i *)(pu1_dst + i), src_temp0_16x8b);
    112         }
    113         pu1_src += src_strd;
    114     }
    115 
    116 }
    117 
    118 
    119 
    120 /**
    121 *******************************************************************************
    122 *
    123 * @brief
    124 *   Padding (chroma block) at the left of a 2d array
    125 *
    126 * @par Description:
    127 *   The left column of a 2d array is replicated for pad_size times at the left
    128 *
    129 *
    130 * @param[in] pu1_src
    131 *  UWORD8 pointer to the source
    132 *
    133 * @param[in] src_strd
    134 *  integer source stride
    135 *
    136 * @param[in] ht
    137 *  integer height of the array
    138 *
    139 * @param[in] wd
    140 *  integer width of the array (each colour component)
    141 *
    142 * @param[in] pad_size
    143 *  integer -padding size of the array
    144 *
    145 * @param[in] ht
    146 *  integer height of the array
    147 *
    148 * @param[in] wd
    149 *  integer width of the array
    150 *
    151 * @returns
    152 *
    153 * @remarks
    154 *  None
    155 *
    156 *******************************************************************************
    157 */
    158 
    159 void ih264_pad_left_chroma_ssse3(UWORD8 *pu1_src,
    160                                  WORD32 src_strd,
    161                                  WORD32 ht,
    162                                  WORD32 pad_size)
    163 {
    164     WORD32 row;
    165     WORD32 col;
    166     UWORD8 *pu1_dst;
    167 
    168     ASSERT(pad_size % 8 == 0);
    169     for(row = 0; row < ht; row++)
    170     {
    171         __m128i src_temp0_16x8b;
    172 
    173         pu1_dst = pu1_src - pad_size;
    174         src_temp0_16x8b = _mm_set1_epi16(*((UWORD16 *)pu1_src));
    175         for(col = 0; col < pad_size; col += 8)
    176         {
    177             _mm_storel_epi64((__m128i *)(pu1_dst + col), src_temp0_16x8b);
    178         }
    179         pu1_src += src_strd;
    180     }
    181 
    182 }
    183 
    184 
    185 
    186 /**
    187 *******************************************************************************
    188 *
    189 * @brief
    190 * Padding (luma block) at the right of a 2d array
    191 *
    192 * @par Description:
    193 * The right column of a 2d array is replicated for pad_size times at the right
    194 *
    195 *
    196 * @param[in] pu1_src
    197 *  UWORD8 pointer to the source
    198 *
    199 * @param[in] src_strd
    200 *  integer source stride
    201 *
    202 * @param[in] ht
    203 *  integer height of the array
    204 *
    205 * @param[in] wd
    206 *  integer width of the array
    207 *
    208 * @param[in] pad_size
    209 *  integer -padding size of the array
    210 *
    211 * @param[in] ht
    212 *  integer height of the array
    213 *
    214 * @param[in] wd
    215 *  integer width of the array
    216 *
    217 * @returns
    218 *
    219 * @remarks
    220 *  None
    221 *
    222 *******************************************************************************
    223 */
    224 
    225 void ih264_pad_right_luma_ssse3(UWORD8 *pu1_src,
    226                                 WORD32 src_strd,
    227                                 WORD32 ht,
    228                                 WORD32 pad_size)
    229 {
    230     WORD32 row;
    231     WORD32 col;
    232     UWORD8 *pu1_dst;
    233 
    234     ASSERT(pad_size % 8 == 0);
    235 
    236     for(row = 0; row < ht; row++)
    237     {
    238         __m128i src_temp0_16x8b;
    239 
    240         pu1_dst = pu1_src;
    241         src_temp0_16x8b = _mm_set1_epi8(*(pu1_src - 1));
    242         for(col = 0; col < pad_size; col += 8)
    243         {
    244             _mm_storel_epi64((__m128i *)(pu1_dst + col), src_temp0_16x8b);
    245         }
    246         pu1_src += src_strd;
    247     }
    248 
    249 }
    250 
    251 
    252 
    253 /**
    254 *******************************************************************************
    255 *
    256 * @brief
    257 * Padding (chroma block) at the right of a 2d array
    258 *
    259 * @par Description:
    260 * The right column of a 2d array is replicated for pad_size times at the right
    261 *
    262 *
    263 * @param[in] pu1_src
    264 *  UWORD8 pointer to the source
    265 *
    266 * @param[in] src_strd
    267 *  integer source stride
    268 *
    269 * @param[in] ht
    270 *  integer height of the array
    271 *
    272 * @param[in] wd
    273 *  integer width of the array (each colour component)
    274 *
    275 * @param[in] pad_size
    276 *  integer -padding size of the array
    277 *
    278 * @param[in] ht
    279 *  integer height of the array
    280 *
    281 * @param[in] wd
    282 *  integer width of the array
    283 *
    284 * @returns
    285 *
    286 * @remarks
    287 *  None
    288 *
    289 *******************************************************************************
    290 */
    291 
    292 void ih264_pad_right_chroma_ssse3(UWORD8 *pu1_src,
    293                                   WORD32 src_strd,
    294                                   WORD32 ht,
    295                                   WORD32 pad_size)
    296 {
    297     WORD32 row;
    298     WORD32 col;
    299     UWORD8 *pu1_dst;
    300 
    301     ASSERT(pad_size % 8 == 0);
    302 
    303     for(row = 0; row < ht; row++)
    304     {
    305         __m128i src_temp0_16x8b;
    306 
    307         pu1_dst = pu1_src;
    308         src_temp0_16x8b = _mm_set1_epi16(*((UWORD16 *)(pu1_src - 2)));
    309         for(col = 0; col < pad_size; col += 8)
    310         {
    311             _mm_storel_epi64((__m128i *)(pu1_dst + col), src_temp0_16x8b);
    312         }
    313 
    314         pu1_src += src_strd;
    315     }
    316 }
    317 
    318