1*0b57cec5SDimitry Andric//===------------------------- memcopy routines ---------------------------===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric 10*0b57cec5SDimitry Andric .macro FUNCTION_BEGIN name 11*0b57cec5SDimitry Andric .text 12*0b57cec5SDimitry Andric .p2align 5 13*0b57cec5SDimitry Andric .globl \name 14*0b57cec5SDimitry Andric .type \name, @function 15*0b57cec5SDimitry Andric\name: 16*0b57cec5SDimitry Andric .endm 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric .macro FUNCTION_END name 19*0b57cec5SDimitry Andric .size \name, . - \name 20*0b57cec5SDimitry Andric .endm 21*0b57cec5SDimitry Andric 22*0b57cec5SDimitry AndricFUNCTION_BEGIN __hexagon_memcpy_likely_aligned_min32bytes_mult8bytes 23*0b57cec5SDimitry Andric { 24*0b57cec5SDimitry Andric p0 = bitsclr(r1,#7) 25*0b57cec5SDimitry Andric p0 = bitsclr(r0,#7) 26*0b57cec5SDimitry Andric if (p0.new) r5:4 = memd(r1) 27*0b57cec5SDimitry Andric r3 = #-3 28*0b57cec5SDimitry Andric } 29*0b57cec5SDimitry Andric { 30*0b57cec5SDimitry Andric if (!p0) jump .Lmemcpy_call 31*0b57cec5SDimitry Andric if (p0) memd(r0++#8) = r5:4 32*0b57cec5SDimitry Andric if (p0) r5:4 = memd(r1+#8) 33*0b57cec5SDimitry Andric r3 += lsr(r2,#3) 34*0b57cec5SDimitry Andric } 35*0b57cec5SDimitry Andric { 36*0b57cec5SDimitry Andric memd(r0++#8) = r5:4 37*0b57cec5SDimitry Andric r5:4 = memd(r1+#16) 38*0b57cec5SDimitry Andric r1 = add(r1,#24) 39*0b57cec5SDimitry Andric loop0(1f,r3) 40*0b57cec5SDimitry Andric } 41*0b57cec5SDimitry Andric .falign 42*0b57cec5SDimitry Andric1: 43*0b57cec5SDimitry Andric { 44*0b57cec5SDimitry Andric memd(r0++#8) = r5:4 45*0b57cec5SDimitry Andric r5:4 = memd(r1++#8) 46*0b57cec5SDimitry Andric }:endloop0 47*0b57cec5SDimitry Andric { 48*0b57cec5SDimitry Andric memd(r0) = r5:4 49*0b57cec5SDimitry Andric r0 -= add(r2,#-8) 50*0b57cec5SDimitry Andric jumpr r31 51*0b57cec5SDimitry Andric } 52*0b57cec5SDimitry AndricFUNCTION_END __hexagon_memcpy_likely_aligned_min32bytes_mult8bytes 53*0b57cec5SDimitry Andric 54*0b57cec5SDimitry Andric.Lmemcpy_call: 55*0b57cec5SDimitry Andric#ifdef __PIC__ 56*0b57cec5SDimitry Andric jump memcpy@PLT 57*0b57cec5SDimitry Andric#else 58*0b57cec5SDimitry Andric jump memcpy 59*0b57cec5SDimitry Andric#endif 60*0b57cec5SDimitry Andric 61*0b57cec5SDimitry Andric .globl __qdsp_memcpy_likely_aligned_min32bytes_mult8bytes 62*0b57cec5SDimitry Andric .set __qdsp_memcpy_likely_aligned_min32bytes_mult8bytes, \ 63*0b57cec5SDimitry Andric __hexagon_memcpy_likely_aligned_min32bytes_mult8bytes 64