The aim of this project is for me to learn more about x64 Assembly and at the side since Libft is used in
the school projects maybe I can have an excuse to use this and get some sort of performance gain from it. So far most functions seem to have some performance gain when compared to C version. Most notably ft_bzero is 10 times faster which is little mind boggling and makes me question if I can improve the C version. If anything, using optimization flags is kinda sometimes forbidden maybe (it's so hazy if it is or not and I'd rather not twist hands about it) so if I just write the assembly like -OX then it's fine right?
As more recent thing, I've been reading through AMD64 Architecture
Programmer’s Manuals and picked up some fancy instructions and now I have a small subset of Libft_ASM original functions that use those instructions.
You will need Make and NASM to compile which you can grab from https://www.nasm.us/ or install through Linux packages. Just run make in terminal and you can link the libft_asm.a to your program. libft_asm.h is the related C header.
Do note that Windows passes arguments to functions in different registers than on Lunix/Mac so none of these actually work on Windows for now. Also interrupts in general are apparently a different world but that an issue for time when I have the first version done in its entirety.
- Create first versions of all basic Libft functions. Proper comments and descriptions included.
- Windows uses different registers to pass arguments to functions so port them over. It's a bit of work but most of the time it only involves swapping registers around.
- New functions! This is assembly and there's an entire world of things I can do here that are not implemented in C/C++ so I'm going to take full use of that.
- Own malloc. First I need to get the C version done but once that exists the ASM version should be easier to do since I have a proper ground to work on. I did some testing on just MMAP and it has massive overhead which I'm definitely not a fan of so I need the entire malloc around it.
| Function Name | Done? |
|---|---|
| abs | YES |
| atoi | Kinda |
| atof | YES |
| bzero | YES |
| intsize | YES |
| isalnum | YES |
| isalpha | YES |
| isascii | YES |
| isblank | YES |
| isdigit | YES |
| isextascii | X |
| isnegative | YES |
| isprint | YES |
| itoa | X |
| lcm | X |
| listlen | YES |
| memalloc | YES |
| memccpy | YES |
| memchr | YES |
| memcmp | YES |
| memcpy | YES |
| memdel | YES |
| memmove | YES |
| memset | YES |
| printmem | X |
| putchar | YES |
| putchar_fd | YES |
| putendl | YES |
| putendl_fd | YES |
| puthex | YES |
| puthexln | YES |
| putnbr | X |
| putnbrln | X |
| putnbr_fd | X |
| putstr | YES |
| putstr_fd | YES |
| quadjoin | YES |
| realloc | Kinda |
| splitfree | YES |
| strcat | YES |
| strchr | YES |
| strclr | YES |
| strcmp | YES |
| strcpy | YES |
| strdel | YES |
| strdup | YES |
| strequ | YES |
| strfjoin | YES |
| striter | YES |
| striteri | YES |
| strjoin | YES |
| strlcat | YES |
| strlen | YES |
| strmap | X |
| strmapi | X |
| strncat | YES |
| strncmp | YES |
| strncpy | YES |
| strnequ | YES |
| strnew | X |
| strnstr | YES |
| strrchr | YES |
| strsjoin | YES |
| strsplit | X |
| strstr | YES |
| strsub | X |
| strtrim | X |
| tolower | YES |
| toupper | YES |
| wordlen | YES |
| get_next_line | X |
| Function Name | Description |
|---|---|
| bswap | Swaps byte order betweeen little and big endian |
| rotate_left | Rotates num left by n bits. Overflow rolls back to right end |
| rotate_right | Rotates num right by n bits. Overflow rolls back to left end |
- Atoi doesn't follow the standard and skip over blank characters at the start.
- Realloc makes any further malloc uses sometimes crash with "malloc(): corrupted top size". The exact reason is unknown.