aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/libc
diff options
context:
space:
mode:
authorspicyjpeg <thatspicyjpeg@gmail.com>2023-05-21 17:22:00 +0200
committerspicyjpeg <thatspicyjpeg@gmail.com>2023-05-21 17:22:00 +0200
commit1e058d15e29adc482074d7225b4c1ed34e63568d (patch)
tree7167f01bdb3eb0542895ee14e389225dc0eca37b /libpsn00b/libc
parent513a6e99dd1f9cf5531d55f544478bec72efb910 (diff)
downloadpsn00bsdk-1e058d15e29adc482074d7225b4c1ed34e63568d.tar.gz
More library cleanups and libc fixes
Diffstat (limited to 'libpsn00b/libc')
-rw-r--r--libpsn00b/libc/_start.s3
-rw-r--r--libpsn00b/libc/abort.c36
-rw-r--r--libpsn00b/libc/abs.c7
-rw-r--r--libpsn00b/libc/clz.s70
-rw-r--r--libpsn00b/libc/memset.s3
-rw-r--r--libpsn00b/libc/misc.c53
-rw-r--r--libpsn00b/libc/rand.s38
-rw-r--r--libpsn00b/libc/setjmp.s6
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)