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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [machine/] [h8300/] [memset.S] - Rev 148

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

#include "setarch.h"

#include "defines.h"

#if defined (__H8300SX__)

        .global _memset
_memset:
        ; Use er3 is a temporary since er0 must remain unchanged on exit.
        mov.l   er0,er3

        ; Fill er1 with the byte to copy.
        mov.b   r1l,r1h
        mov.w   r1,e1

        ; Account for any excess bytes and words that will be copied after
        ; the main loop.  r2 >= 0 if there is a longword to copy.
        sub     #4,LEN(r2)
        blo     longs_done

        ; Copy one byte if doing so will make er3 word-aligned.
        ; This isn't needed for correctness but it makes the main loop
        ; slightly faster.
        bld     #0,r3l
        bcc     word_aligned
        mov.b   r1l,@er3+
        sub     #1,LEN(r2)
        blo     longs_done

word_aligned:
        ; Likewise one word for longword alignment.
        bld     #1,r3l
        bcc     long_copy
        mov.w   r1,@er3+
        sub     #2,LEN(r2)
        blo     longs_done

long_copy:
        ; Copy longwords.
        mov.l   er1,@er3+
        sub     #4,LEN(r2)
        bhs     long_copy

longs_done:
        ; At this point, we need to copy r2 & 3 bytes.  Copy a word
        ; if necessary.
        bld     #1,r2l
        bcc     words_done
        mov.w   r1,@er3+

words_done:
        ; Copy a byte.
        bld     #0,r2l
        bcc     bytes_done
        mov.b   r1l,@er3+

bytes_done:
        rts

#else

; A0P pointer to cursor
; A1P thing to copy
        .global _memset

_memset:

;       MOVP    @(2/4,r7),A2P   ; dst
;       MOVP    @(4/8,r7),A1    ; src thing
;       MOVP    @(6/12,r7),A3P  ; len

        MOVP    A2P,A2P
        beq     quit

        ; A3 points to the end of the area
        MOVP    A0P,A3P
        ADDP    A2P,A3P

        ; see if we can do it in words
        ; by oring in the start of the buffer to the end address

        or      A0L,A2L
        btst    #0,A2L
        bne     byteloop
        
        ; we can do it a word at a time

        mov.b   A1L,A1H 

wordloop:
        mov.w   A1,@-A3P
        CMPP    A3P,A0P
        bne     wordloop
quit:   rts     

byteloop:
        mov.b   A1L,@-A3P
        CMPP    A3P,A0P
        bne     byteloop
        rts

#endif

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

powered by: WebSVN 2.1.0

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