diff options
| author | spicyjpeg <thatspicyjpeg@gmail.com> | 2023-05-21 17:22:00 +0200 |
|---|---|---|
| committer | spicyjpeg <thatspicyjpeg@gmail.com> | 2023-05-21 17:22:00 +0200 |
| commit | 1e058d15e29adc482074d7225b4c1ed34e63568d (patch) | |
| tree | 7167f01bdb3eb0542895ee14e389225dc0eca37b /libpsn00b/libc | |
| parent | 513a6e99dd1f9cf5531d55f544478bec72efb910 (diff) | |
| download | psn00bsdk-1e058d15e29adc482074d7225b4c1ed34e63568d.tar.gz | |
More library cleanups and libc fixes
Diffstat (limited to 'libpsn00b/libc')
| -rw-r--r-- | libpsn00b/libc/_start.s | 3 | ||||
| -rw-r--r-- | libpsn00b/libc/abort.c | 36 | ||||
| -rw-r--r-- | libpsn00b/libc/abs.c | 7 | ||||
| -rw-r--r-- | libpsn00b/libc/clz.s | 70 | ||||
| -rw-r--r-- | libpsn00b/libc/memset.s | 3 | ||||
| -rw-r--r-- | libpsn00b/libc/misc.c | 53 | ||||
| -rw-r--r-- | libpsn00b/libc/rand.s | 38 | ||||
| -rw-r--r-- | libpsn00b/libc/setjmp.s | 6 |
8 files changed, 101 insertions, 115 deletions
diff --git a/libpsn00b/libc/_start.s b/libpsn00b/libc/_start.s index fcd4c4c..35a4eaa 100644 --- a/libpsn00b/libc/_start.s +++ b/libpsn00b/libc/_start.s @@ -7,10 +7,11 @@ .set noreorder -.section .text._start +.section .text._start, "ax", @progbits .global _start .type _start, @function .weak _start + _start: la $gp, _gp j _start_inner diff --git a/libpsn00b/libc/abort.c b/libpsn00b/libc/abort.c deleted file mode 100644 index 0a3c325..0000000 --- a/libpsn00b/libc/abort.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * PSn00bSDK assert macro and internal logging - * (C) 2022 spicyjpeg - MPL licensed - */ - -#undef SDK_LIBRARY_NAME - -#include <assert.h> -#include <psxapi.h> - -/* Internal function used by assert() macro */ - -void _assert_abort(const char *file, int line, const char *expr) { - _sdk_log("%s:%d: assert(%s)\n", file, line, expr); - - for (;;) - __asm__ volatile(""); -} - -/* Standard abort */ - -void abort(void) { - _sdk_log("abort()\n"); - - for (;;) - __asm__ volatile(""); -} - -/* Pure virtual function call (C++) */ - -void __cxa_pure_virtual(void) { - _sdk_log("__cxa_pure_virtual()\n"); - - for (;;) - __asm__ volatile(""); -} diff --git a/libpsn00b/libc/abs.c b/libpsn00b/libc/abs.c deleted file mode 100644 index a972cad..0000000 --- a/libpsn00b/libc/abs.c +++ /dev/null @@ -1,7 +0,0 @@ -int abs(int i) { - return (i < 0) ? (-i) : i; -} - -long labs(long i) { - return (i < 0) ? (-i) : i; -} diff --git a/libpsn00b/libc/clz.s b/libpsn00b/libc/clz.s index 28a28eb..1ccff2e 100644 --- a/libpsn00b/libc/clz.s +++ b/libpsn00b/libc/clz.s @@ -1,43 +1,53 @@ # PSn00bSDK leading zero count intrinsics -# (C) 2022 spicyjpeg - MPL licensed +# (C) 2022-2023 spicyjpeg - MPL licensed # -# libgcc provides two functions used internally by GCC to count the number of -# leading zeroes or ones in a value, _clzsi2() (32-bit) and _clzdi2() (64-bit). -# This file overrides them with faster implementations that make use of the -# GTE's LZCS/LZCR registers. +# libgcc provides two functions used internally by GCC to count the number of +# leading zeroes in a value, __clzsi2() (32-bit) and __clzdi2() (64-bit). This +# file overrides them with smaller implementations that make use of the GTE's +# LZCS/LZCR registers. .set noreorder -.section .text._clzsi2 -.global _clzsi2 -.type _clzsi2, @function -_clzsi2: - mtc2 $a0, $30 - nop - nop - mfc2 $v0, $31 +.set LZCS, $30 +.set LZCR, $31 - jr $ra - nop +.section .text.__clzsi2, "ax", @progbits +.global __clzsi2 +.type __clzsi2, @function -.section .text._clzdi2 -.global _clzdi2 -.type _clzdi2, @function -_clzdi2: - bnez $a1, .Lhas_msb +__clzsi2: + mtc2 $a0, LZCS + bltz $a0, .Lreturn # if (value & (1 << 31)) return 0 + li $v0, 0 + mfc2 $v0, LZCR # else return GTE_CLZ(value) + +.Lreturn: + jr $ra nop - mtc2 $a0, $30 # if (!msb) return 32 + clz(lsb) - b .Lreturn - li $v1, 32 +.section .text.__clzdi2, "ax", @progbits +.global __clzdi2 +.type __clzdi2, @function -.Lhas_msb: - mtc2 $a1, $30 # if (msb) return 0 + clz(msb) +__clzdi2: + mtc2 $a1, LZCS + bltz $a1, .Lreturn2 # if (msb & (1 << 31)) return 0 + li $v0, 0 + bnez $a1, .LreturnMSB # else if (msb) return GTE_CLZ(msb) nop - li $v1, 0 -.Lreturn: - mfc2 $v0, $31 +.LnoMSB: + mtc2 $a0, LZCS + bltz $a0, .Lreturn2 # else if (lsb & (1 << 31)) return 32 + li $v0, 32 + mfc2 $v0, LZCR # else return 32 + GTE_CLZ(lsb) + + jr $ra + addiu $v0, 32 - jr $ra - addu $v0, $v1 +.LreturnMSB: + mfc2 $v0, LZCR + +.Lreturn2: + jr $ra + nop diff --git a/libpsn00b/libc/memset.s b/libpsn00b/libc/memset.s index 6ef84ec..59cb10b 100644 --- a/libpsn00b/libc/memset.s +++ b/libpsn00b/libc/memset.s @@ -3,9 +3,10 @@ .set noreorder -.section .text.memset +.section .text.memset, "ax", @progbits .global memset .type memset, @function + memset: # If more than 16 bytes have to be written then take the "large" path, # otherwise use the code below. diff --git a/libpsn00b/libc/misc.c b/libpsn00b/libc/misc.c new file mode 100644 index 0000000..d1fd9d3 --- /dev/null +++ b/libpsn00b/libc/misc.c @@ -0,0 +1,53 @@ +/* + * PSn00bSDK standard library (misc. functions) + * (C) 2022-2023 spicyjpeg - MPL licensed + */ + +#undef SDK_LIBRARY_NAME + +#include <assert.h> +#include <stdlib.h> + +/* Abort functions */ + +void _assert_abort(const char *file, int line, const char *expr) { + _sdk_log("%s:%d: assert(%s)\n", file, line, expr); + + for (;;) + __asm__ volatile(""); +} + +void abort(void) { + _sdk_log("abort()\n"); + + for (;;) + __asm__ volatile(""); +} + +void __cxa_pure_virtual(void) { + _sdk_log("__cxa_pure_virtual()\n"); + + for (;;) + __asm__ volatile(""); +} + +/* abs() */ + +int abs(int value) { + return (value < 0) ? (-value) : value; +} + +/* Pseudorandom number generator */ + +static int _random_seed = 0; + +int rand(void) { + _random_seed *= 0x41c64e6d; + _random_seed += 12345; + + return (_random_seed >> 16) & RAND_MAX; +} + +void srand(int seed) { + _random_seed = seed; +} diff --git a/libpsn00b/libc/rand.s b/libpsn00b/libc/rand.s deleted file mode 100644 index a502e87..0000000 --- a/libpsn00b/libc/rand.s +++ /dev/null @@ -1,38 +0,0 @@ -.set noreorder -.set noat - -.section .text - - -.global rand -.type rand, @function -rand: - - la $at, _randseed - lw $v0, 0($at) - li $v1, 0x41c64e6d - - multu $v0, $v1 - mflo $v0 - nop - addiu $v0, 12345 - sw $v0, 0($at) - - jr $ra - andi $v0, 0x7fff - - -.global srand -.type srand, @function -srand: - la $at, _randseed - jr $ra - sw $a0, 0($at) - - -.section .data - -.type _randseed, @object -_randseed: - .word 1 -
\ No newline at end of file diff --git a/libpsn00b/libc/setjmp.s b/libpsn00b/libc/setjmp.s index 465a712..fb0dc6b 100644 --- a/libpsn00b/libc/setjmp.s +++ b/libpsn00b/libc/setjmp.s @@ -7,9 +7,10 @@ .set noreorder -.section .text.setjmp +.section .text.setjmp, "ax", @progbits .global setjmp .type setjmp, @function + setjmp: sw $ra, 0x00($a0) sw $sp, 0x04($a0) @@ -27,9 +28,10 @@ setjmp: jr $ra li $v0, 0 -.section .text.longjmp +.section .text.longjmp, "ax", @progbits .global longjmp .type longjmp, @function + longjmp: lw $ra, 0x00($a0) lw $sp, 0x04($a0) |
