1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-22 12:30:41 +00:00

Merge pull request #2503 from colinleroy/master

Optimize stpcpy's size and speed
This commit is contained in:
Bob Andrews 2024-09-08 16:17:14 +02:00 committed by GitHub
commit 31a0d5cc40
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 38 additions and 11 deletions

View File

@ -1,7 +0,0 @@
#include <string.h>
char * __fastcall__ stpcpy (char * dst, const char * src)
{
strcpy (dst, src);
return dst + strlen (src);
}

22
libsrc/common/stpcpy.s Normal file
View File

@ -0,0 +1,22 @@
;
; Colin Leroy-Mira, 4 Sept. 2024
;
; char* stpcpy (char* dest, const char* src);
;
.export _stpcpy
.import _strcpy
.importzp tmp1, ptr2
_stpcpy:
jsr _strcpy
ldx ptr2+1 ; Load dest pointer's last high byte
tya ; Get the last offset strcpy wrote to
clc
adc ptr2 ; Add to low byte value
bcc :+
inx
: rts ; Return pointer to dest's terminator

View File

@ -25,6 +25,9 @@ L1: lda (ptr1),y
inc ptr2+1 inc ptr2+1
bne L1 bne L1
L9: lda ptr2 ; X still contains high byte L9: lda ptr2 ; X still contains dest's original high byte
rts
; On exit, we want AX to be dest (as this is what strcpy returns).
; We also want (ptr2),y to still point to dest's terminator, as this
; is used by stpcpy().
rts

View File

@ -8,10 +8,12 @@
#define STR_SHORT "Hello, World!" #define STR_SHORT "Hello, World!"
#define STR_LONG "This is a longer test string for stpcpy." #define STR_LONG "This is a longer test string for stpcpy."
char dest[512];
char multi_page[300];
int int
main () main ()
{ {
char dest[50];
const char *src_empty; const char *src_empty;
const char *src_short; const char *src_short;
const char *src_long; const char *src_long;
@ -38,7 +40,14 @@ main ()
assert(end == &dest[sizeof (STR_LONG) - 1]); assert(end == &dest[sizeof (STR_LONG) - 1]);
printf ("Test 3 passed.\n"); printf ("Test 3 passed.\n");
memset(multi_page, 'a', sizeof(multi_page)-1);
multi_page[sizeof(multi_page)-1] = '\0';
end = stpcpy (dest, multi_page);
assert(!strcmp (dest, multi_page));
assert(!*end);
assert(end == &dest[sizeof (multi_page) - 1]);
printf ("Test 4 passed.\n");
printf ("All tests passed.\n"); printf ("All tests passed.\n");
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }