| /* 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__ */ |