89 lines
1.5 KiB
ArmAsm
89 lines
1.5 KiB
ArmAsm
/* Copyright (C) 2007 ARC International (UK) LTD */
|
|
|
|
/* Code was copied from ARC GCC toolchain, ucLibc packet (GPL) */
|
|
|
|
#include "newlib_asm.h"
|
|
|
|
#ifndef __A4__
|
|
|
|
#define SMALL 7 /* Must be at least 6 to deal with alignment/loop issues. */
|
|
|
|
ENTRY(memset)
|
|
#ifndef __ARC700__
|
|
#undef SMALL
|
|
#define SMALL 8 /* Even faster if aligned. */
|
|
brls.d r2,SMALL,.Ltiny
|
|
#endif
|
|
mov_s r4,r0
|
|
or r12,r0,r2
|
|
bmsk.f r12,r12,1
|
|
extb_s r1,r1
|
|
asl r3,r1,8
|
|
beq.d .Laligned
|
|
or_s r1,r1,r3
|
|
#ifdef __ARC700__
|
|
brls r2,SMALL,.Ltiny
|
|
#endif
|
|
add r3,r2,r0
|
|
stb r1,[r3,-1]
|
|
bclr_s r3,r3,0
|
|
stw r1,[r3,-2]
|
|
bmsk.f r12,r0,1
|
|
add_s r2,r2,r12
|
|
sub.ne r2,r2,4
|
|
stb.ab r1,[r4,1]
|
|
and r4,r4,-2
|
|
stw.ab r1,[r4,2]
|
|
and r4,r4,-4
|
|
.Laligned: ; This code address should be aligned for speed.
|
|
#ifdef __ARC700__
|
|
asl r3,r1,16
|
|
lsr.f lp_count,r2,2
|
|
or_s r1,r1,r3
|
|
lpne .Loop_end
|
|
st.ab r1,[r4,4]
|
|
.Loop_end:
|
|
j_s [blink]
|
|
#else /* !__ARC700 */
|
|
lsr.f lp_count,r2,3
|
|
asl r3,r1,16
|
|
or_s r1,r1,r3
|
|
lpne .Loop_end
|
|
st.ab r1,[r4,4]
|
|
st.ab r1,[r4,4]
|
|
.Loop_end:
|
|
sub.cc r4,r4,4
|
|
j_s.d [blink]
|
|
st r1,[r4]
|
|
#endif /* !__ARC700 */
|
|
|
|
#ifdef __ARC700__
|
|
.balign 4
|
|
.Ltiny:
|
|
mov.f lp_count,r2
|
|
lpne .Ltiny_end
|
|
stb.ab r1,[r4,1]
|
|
.Ltiny_end:
|
|
j_s [blink]
|
|
#else /* !__ARC700__ */
|
|
#if SMALL > 8
|
|
FIXME
|
|
#endif
|
|
.balign 4
|
|
stb_s r1,[r0,7]
|
|
stb_s r1,[r0,6]
|
|
stb_s r1,[r0,5]
|
|
stb_s r1,[r0,4]
|
|
stb_s r1,[r0,3]
|
|
stb_s r1,[r0,2]
|
|
stb_s r1,[r0,1]
|
|
stb_s r1,[r0]
|
|
.endr
|
|
j_s [blink]
|
|
.Ltiny: ; must be misaligned - so that we hit the j_s [blink] for zero bytes!
|
|
sub1 r3,pcl,r2
|
|
j_s [r3]
|
|
#endif /* !__ARC700 */
|
|
ENDFUNC(memset)
|
|
#endif /* !__A4__ */
|