/* * Copyright (c) 2010-2011, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and * only version 2 as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ /* Numerology: * WXYZ * W: width in bytes * X: Load=0, Store=1 * Y: Location 0=preamble,8=loop,9=epilog * Z: Location=0,handler=9 */ .text .global FUNCNAME .type FUNCNAME, @function .p2align 5 FUNCNAME: { p0 = cmp.gtu(bytes,#0) if (!p0.new) jump:nt .Ldone r3 = or(dst,src) r4 = xor(dst,src) } { p1 = cmp.gtu(bytes,#15) p0 = bitsclr(r3,#7) if (!p0.new) jump:nt .Loop_not_aligned_8 src_dst_sav = combine(src,dst) } { loopcount = lsr(bytes,#3) if (!p1) jump .Lsmall } p3=sp1loop0(.Loop8,loopcount) .Loop8: 8080: 8180: { if (p3) memd(dst++#8) = d_dbuf d_dbuf = memd(src++#8) }:endloop0 8190: { memd(dst++#8) = d_dbuf bytes -= asl(loopcount,#3) jump .Lsmall } .Loop_not_aligned_8: { p0 = bitsclr(r4,#7) if (p0.new) jump:nt .Lalign } { p0 = bitsclr(r3,#3) if (!p0.new) jump:nt .Loop_not_aligned_4 p1 = cmp.gtu(bytes,#7) } { if (!p1) jump .Lsmall loopcount = lsr(bytes,#2) } p3=sp1loop0(.Loop4,loopcount) .Loop4: 4080: 4180: { if (p3) memw(dst++#4) = w_dbuf w_dbuf = memw(src++#4) }:endloop0 4190: { memw(dst++#4) = w_dbuf bytes -= asl(loopcount,#2) jump .Lsmall } .Loop_not_aligned_4: { p0 = bitsclr(r3,#1) if (!p0.new) jump:nt .Loop_not_aligned p1 = cmp.gtu(bytes,#3) } { if (!p1) jump .Lsmall loopcount = lsr(bytes,#1) } p3=sp1loop0(.Loop2,loopcount) .Loop2: 2080: 2180: { if (p3) memh(dst++#2) = w_dbuf w_dbuf = memuh(src++#2) }:endloop0 2190: { memh(dst++#2) = w_dbuf bytes -= asl(loopcount,#1) jump .Lsmall } .Loop_not_aligned: /* Works for as small as one byte */ p3=sp1loop0(.Loop1,bytes) .Loop1: 1080: 1180: { if (p3) memb(dst++#1) = w_dbuf w_dbuf = memub(src++#1) }:endloop0 /* Done */ 1190: { memb(dst) = w_dbuf jumpr r31 r0 = #0 } .Lsmall: { p0 = cmp.gtu(bytes,#0) if (p0.new) jump:nt .Loop_not_aligned } .Ldone: { r0 = #0 jumpr r31 } .falign .Lalign: 1000: { if (p0.new) w_dbuf = memub(src) p0 = tstbit(src,#0) if (!p1) jump .Lsmall } 1100: { if (p0) memb(dst++#1) = w_dbuf if (p0) bytes = add(bytes,#-1) if (p0) src = add(src,#1) } 2000: { if (p0.new) w_dbuf = memuh(src) p0 = tstbit(src,#1) if (!p1) jump .Lsmall } 2100: { if (p0) memh(dst++#2) = w_dbuf if (p0) bytes = add(bytes,#-2) if (p0) src = add(src,#2) } 4000: { if (p0.new) w_dbuf = memw(src) p0 = tstbit(src,#2) if (!p1) jump .Lsmall } 4100: { if (p0) memw(dst++#4) = w_dbuf if (p0) bytes = add(bytes,#-4) if (p0) src = add(src,#4) jump FUNCNAME } .size FUNCNAME,.-FUNCNAME