OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [branches/] [newlib/] [newlib/] [newlib/] [libc/] [machine/] [sh/] [memset.S] - Rev 39

Go to most recent revision | Compare with Previous | Blame | View Log

!
! Fast SH memset
!
! by Toshiyasu Morita (tm@netcom.com)
!
! Entry: r4: destination pointer
!        r5: fill value
!        r6: byte count
!
! Exit:  r0-r3: trashed
!

#include "asm.h"

ENTRY(memset)
        mov     r4,r3   ! Save return value
        
        mov     r6,r0   ! Check explicitly for zero
        cmp/eq  #0,r0
        bt      L_exit

        mov     #12,r0  ! Check for small number of bytes
        cmp/gt  r6,r0
        bt      L_store_byte_loop

        neg     r4,r0   ! Align destination
        add     #4,r0
        and     #3,r0
        tst     r0,r0
        bt      L_dup_bytes
        .balignw 4,0x0009
L_align_loop:
        mov.b   r5,@r4
        add     #-1,r6
        add     #1,r4
        dt      r0
        bf      L_align_loop

L_dup_bytes:    
        extu.b  r5,r5   ! Duplicate bytes across longword
        swap.b  r5,r0
        or      r0,r5
        swap.w  r5,r0
        or      r0,r5

        mov     r6,r2   ! Calculate number of double longwords
        shlr2   r2
        shlr    r2

        .balignw 4,0x0009
L_store_long_loop:
        mov.l   r5,@r4  ! Store double longs to memory
        dt      r2
        mov.l   r5,@(4,r4)
        add     #8,r4
        bf      L_store_long_loop

        mov     #7,r0
        and     r0,r6
        tst     r6,r6
        bt      L_exit
        .balignw 4,0x0009
L_store_byte_loop:
        mov.b   r5,@r4  ! Store bytes to memory
        add     #1,r4
        dt      r6
        bf      L_store_byte_loop

L_exit:
        rts
        mov     r3,r0

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.