@/****************************************************************************** @ * @ * Copyright (C) 2015 The Android Open Source Project @ * @ * Licensed under the Apache License, Version 2.0 (the "License"); @ * you may not use this file except in compliance with the License. @ * You may obtain a copy of the License at: @ * @ * http://www.apache.org/licenses/LICENSE-2.0 @ * @ * Unless required by applicable law or agreed to in writing, software @ * distributed under the License is distributed on an "AS IS" BASIS, @ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @ * See the License for the specific language governing permissions and @ * limitations under the License. @ * @ ***************************************************************************** @ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore @*/ @** @ ******************************************************************************* @ * @file @ * ih264_mem_fns_neon.s @ * @ * @brief @ * Contains function definitions for memory manipulation @ * @ * @author @ * Naveen SR @ * @ * @par List of Functions: @ * - ih264_memcpy_mul_8_a9q() @ * - ih264_memcpy_a9q() @ * - ih264_memset_mul_8_a9q() @ * - ih264_memset_a9q() @ * - ih264_memset_16bit_mul_8_a9q() @ * - ih264_memset_a9q() @ * @ * @remarks @ * None @ * @ ******************************************************************************* @* @** @******************************************************************************* @* @* @brief @* memcpy of a 1d array @* @* @par Description: @* Does memcpy of 8bit data from source to destination for 8,16 or 32 number of bytes @* @* @param[in] pu1_dst @* UWORD8 pointer to the destination @* @* @param[in] pu1_src @* UWORD8 pointer to the source @* @* @param[in] num_bytes @* number of bytes to copy @* @returns @* @* @remarks @* None @* @******************************************************************************* @* @void ih264_memcpy_mul_8(UWORD8 *pu1_dst, @ UWORD8 *pu1_src, @ UWORD8 num_bytes) @**************Variables Vs Registers************************* @ r0 => *pu1_dst @ r1 => *pu1_src @ r2 => num_bytes .text .p2align 2 .global ih264_memcpy_mul_8_a9q ih264_memcpy_mul_8_a9q: loop_neon_memcpy_mul_8: @ Memcpy 8 bytes vld1.8 d0, [r1]! vst1.8 d0, [r0]! subs r2, r2, #8 bne loop_neon_memcpy_mul_8 bx lr @******************************************************************************* @* @void ih264_memcpy(UWORD8 *pu1_dst, @ UWORD8 *pu1_src, @ UWORD8 num_bytes) @**************Variables Vs Registers************************* @ r0 => *pu1_dst @ r1 => *pu1_src @ r2 => num_bytes .global ih264_memcpy_a9q ih264_memcpy_a9q: subs r2, #8 blt memcpy loop_neon_memcpy: @ Memcpy 8 bytes vld1.8 d0, [r1]! vst1.8 d0, [r0]! subs r2, #8 bge loop_neon_memcpy cmp r2, #-8 bxeq lr memcpy: add r2, #8 loop_memcpy: ldrb r3, [r1], #1 strb r3, [r0], #1 subs r2, #1 bne loop_memcpy bx lr @void ih264_memset_mul_8(UWORD8 *pu1_dst, @ UWORD8 value, @ UWORD8 num_bytes) @**************Variables Vs Registers************************* @ r0 => *pu1_dst @ r1 => value @ r2 => num_bytes .global ih264_memset_mul_8_a9q ih264_memset_mul_8_a9q: @ Assumptions: numbytes is either 8, 16 or 32 vdup.8 d0, r1 loop_memset_mul_8: @ Memset 8 bytes vst1.8 d0, [r0]! subs r2, r2, #8 bne loop_memset_mul_8 bx lr @void ih264_memset(UWORD8 *pu1_dst, @ UWORD8 value, @ UWORD8 num_bytes) @**************Variables Vs Registers************************* @ r0 => *pu1_dst @ r1 => value @ r2 => num_bytes .global ih264_memset_a9q ih264_memset_a9q: subs r2, #8 blt memset vdup.8 d0, r1 loop_neon_memset: @ Memcpy 8 bytes vst1.8 d0, [r0]! subs r2, #8 bge loop_neon_memset cmp r2, #-8 bxeq lr memset: add r2, #8 loop_memset: strb r1, [r0], #1 subs r2, #1 bne loop_memset bx lr @void ih264_memset_16bit_mul_8(UWORD16 *pu2_dst, @ UWORD16 value, @ UWORD8 num_words) @**************Variables Vs Registers************************* @ r0 => *pu2_dst @ r1 => value @ r2 => num_words .global ih264_memset_16bit_mul_8_a9q ih264_memset_16bit_mul_8_a9q: @ Assumptions: num_words is either 8, 16 or 32 @ Memset 8 words vdup.16 d0, r1 loop_memset_16bit_mul_8: vst1.16 d0, [r0]! vst1.16 d0, [r0]! subs r2, r2, #8 bne loop_memset_16bit_mul_8 bx lr @void ih264_memset_16bit(UWORD16 *pu2_dst, @ UWORD16 value, @ UWORD8 num_words) @**************Variables Vs Registers************************* @ r0 => *pu2_dst @ r1 => value @ r2 => num_words .global ih264_memset_16bit_a9q ih264_memset_16bit_a9q: subs r2, #8 blt memset_16bit vdup.16 d0, r1 loop_neon_memset_16bit: @ Memset 8 words vst1.16 d0, [r0]! vst1.16 d0, [r0]! subs r2, #8 bge loop_neon_memset_16bit cmp r2, #-8 bxeq lr memset_16bit: add r2, #8 loop_memset_16bit: strh r1, [r0], #2 subs r2, #1 bne loop_memset_16bit bx lr