#include "SYS.h"
LEAF_ENTRY(bcopy)
copy arg0, ret0
copy arg1, arg0
copy ret0, arg1
ALTENTRY(memmove)
comb,>,n arg0, arg1, $bcopy.reverse
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