source: trunk/libs/newlib/src/newlib/libc/machine/rx/strncat.S @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.8 KB
Line 
1        .file   "strncat.S"
2
3        .section .text
4        .global  _strncat
5        .type    _strncat,@function
6_strncat:
7        ;; On entry: r1 => Destination
8        ;;           r2 => Source
9        ;;           r3 => Max number of bytes to copy
10#ifdef __RX_DISALLOW_STRING_INSNS__
11        cmp     #0, r3          ; If max is zero we have nothing to do.
12        beq     2f
13       
14        mov     r1, r4          ; Leave the desintation pointer intact for the return value.
15       
161:      mov.b   [r4+], r5       ; Find the NUL byte at the end of the destination.
17        cmp     #0, r5
18        bne     1b
19
20        sub     #1, r4
21
223:      mov.b   [r2+], r5       ; Copy bytes from the source into the destination ...
23        mov.b   r5, [r4+]
24        cmp     #0, r5          ; ... until we reach a NUL byte ...
25        beq     2f
26        sub     #1, r3
27        bne     3b              ; ... or we have copied N bytes.
28       
292:      rts
30#else
31        mov     r1, r4          ; Save a copy of the dest pointer.
32        mov     r2, r5          ; Save a copy of the source pointer.
33        mov     r3, r14         ; Save a copy of the byte count.
34       
35        mov     #0,  r2         ; Search for the NUL byte.
36        mov     #-1, r3         ; Search until we run out of memory.
37        suntil.b                ; Find the end of the destination string.
38        sub     #1, r1          ; suntil.b leaves r1 pointing to the byte beyond the NUL.
39
40        mov     r14, r3         ; Restore the limit on the number of bytes copied.
41        mov     r5, r2          ; Restore the source pointer.
42        mov     r1, r5          ; Save a copy of the dest pointer.
43        smovu                   ; Copy source to destination.
44
45        add     #0, r14, r3     ; Restore the number of bytes to copy (again), but this time set the Z flag as well.
46        beq     1f              ; If we copied 0 bytes then we already know that the dest string is NUL terminated, so we do not have to do anything.
47        mov     #0, r2          ; Otherwise we must check to see if a NUL byte
48        mov     r5, r1          ;  was included in the bytes that were copied.
49        suntil.b
50        beq     1f              ; Z flag is set if a match was found.
51        add     r14, r5         ; Point at byte after end of copied bytes.
52        mov.b   #0, [r5]        ; Store a NUL there.
531:     
54        mov     r4, r1          ; Return the original dest pointer.
55        rts
56#endif
57        .size _strncat, . - _strncat
58       
Note: See TracBrowser for help on using the repository browser.