root/lib/libc/arch/hppa/string/memmove.S
/* This is a generated file. DO NOT EDIT. */
/*
 * Generated from:
 *
 *      OpenBSD: bcopy.m4
 */
/*
 * Copyright (c) 1999 Michael Shalayeff
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 */


#include "SYS.h"


LEAF_ENTRY(bcopy)
        copy    arg0, ret0
        copy    arg1, arg0
        copy    ret0, arg1
ALTENTRY(memmove)
        comb,>,n arg0, arg1, $bcopy.reverse
// ALTENTRY(memcpy)
        copy    arg0, ret0
        
        comib,>=,n 15, arg2, $bcopy_f.byte

        extru   arg1, 31, 2, t3
        extru   arg0, 31, 2, t4
        add     arg2, t4, arg2
        comb,<> t3, t4, $bcopy_f.unaligned
        dep     r0, 31, 2, arg1
        
        addi    -16, arg2, arg2
$bcopy_f.loop16a
        ldws,ma 4(sr0, arg1), t1
        ldws,ma 4(sr0, arg1), t2
        ldws,ma 4(sr0, arg1), t3
        ldws,ma 4(sr0, arg1), t4
        stbys,b,m t1, 4(sr0, arg0)
        stws,ma t2, 4(sr0, arg0)
        stws,ma t3, 4(sr0, arg0)
        addib,>= -16, arg2, $bcopy_f.loop16a
        stws,ma t4, 4(sr0, arg0)

        addib,<,n 12, arg2, $bcopy_f.cleanup
$bcopy_f.word
        ldws,ma 4(sr0, arg1), t1
        addib,>= -4, arg2, $bcopy_f.word
        stws,ma t1, 4(sr0, arg0)

$bcopy_f.cleanup
        addib,=,n 4, arg2, $bcopy_f.done
        ldws    0(sr0, arg1), t1
        add     arg0, arg2, arg0
        b       $bcopy_f.done
        stbys,e t1, 0(sr0, arg0)

$bcopy_f.unaligned
        sub,>=  t4, t3, t2
        ldwm    4(sr0, arg1), ret1
        zdep    t2, 28, 29, t1
        mtsar   t1
        
        addi    -16, arg2, arg2
$bcopy_f.loop16u
        ldws,ma 4(sr0, arg1), t1
        ldws,ma 4(sr0, arg1), t2
        ldws,ma 4(sr0, arg1), t3
        ldws,ma 4(sr0, arg1), t4
        vshd    ret1, t1, r31
        stbys,b,m r31, 4(sr0, arg0)
        vshd    t1, t2, r31
        stws,ma r31, 4(sr0, arg0)
        vshd    t2, t3, r31
        stws,ma r31, 4(sr0, arg0)
        vshd    t3, t4, r31
        stws,ma r31, 4(sr0, arg0)
        addib,>= -16, arg2, $bcopy_f.loop16u
        copy    t4, ret1

        addib,<,n 12, arg2, $bcopy_f.cleanup_un
$bcopy_f.word_un
        ldws,ma 4(sr0, arg1), t1
        vshd    ret1, t1, t2
        addib,< -4, arg2, $bcopy_f.cleanup1_un
        stws,ma t2, 4(sr0, arg0)
        ldws,ma 4(sr0, arg1), ret1
        vshd    t1, ret1, t2
        addib,>= -4, arg2, $bcopy_f.word_un
        stws,ma t2, 4(sr0, arg0)

$bcopy_f.cleanup_un
        addib,<=,n 4, arg2, $bcopy_f.done
        mfctl   sar, t4
        add     arg0, arg2, arg0
        extru   t4, 28, 2, t4
        sub,<=  arg2, t4, r0
        ldws,ma 4(sr0, arg1), t1
        vshd    ret1, t1, t2
        b       $bcopy_f.done
        stbys,e t2, 0(sr0, arg0)

$bcopy_f.cleanup1_un
        b       $bcopy_f.cleanup_un
        copy    t1, ret1

$bcopy_f.byte
        comb,>=,n r0, arg2, $bcopy_f.done
$bcopy_f.byte_loop
        ldbs,ma 1(sr0, arg1), t1
        addib,<> -1, arg2, $bcopy_f.byte_loop
        stbs,ma t1, 1(sr0, arg0)
$bcopy_f.done

        bv      0(rp)
        nop
$bcopy.reverse
        copy    arg0, ret0
        add     arg1, arg2, arg1
        add     arg0, arg2, arg0


$bcopy_r.byte
        comb,>=,n r0, arg2, $bcopy_r.done
$bcopy_r.byte_loop
        ldbs,mb -1(sr0, arg1), t1
        addib,<> -1, arg2, $bcopy_r.byte_loop
        stbs,mb t1, -1(sr0, arg0)
$bcopy_r.done

        bv      0(rp)
        nop
END_WEAK(bcopy)
ALTEND_STRONG(memmove)

        .end