From 11d2e488919be1ea90339ca0b33eea5d9d1cf5fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrea=20Palmat=C3=A8?= Date: Fri, 14 Jul 2023 09:03:48 +0200 Subject: [PATCH] More SPE changes --- GNUmakefile.os4 | 8 +- libc.gmk | 13 +++- libm.gmk | 9 ++- library/include/fenv.h | 15 ++-- library/math/fabs.c | 16 +--- library/math/fabs_spe.S | 13 ++++ library/setjmp/longjmp.S | 2 +- library/setjmp/siglongjmp.c | 4 +- library/setjmp/sigsetjmp.S | 4 +- library/setjmp/sigsetjmp_spe.S | 130 +++++++++++++++++++++++++++++++++ shared.gmk | 4 + 11 files changed, 191 insertions(+), 27 deletions(-) create mode 100644 library/math/fabs_spe.S create mode 100644 library/setjmp/sigsetjmp_spe.S diff --git a/GNUmakefile.os4 b/GNUmakefile.os4 index 6d1abdba..ddee3f88 100644 --- a/GNUmakefile.os4 +++ b/GNUmakefile.os4 @@ -255,14 +255,14 @@ endef define COMPILE_INLINE $(VERBOSE)@$(MAKEDIR) $(@D) -$(VERBOSE)echo -e "\rCompiling Static \033[0;33m[$(@D)]\033[0m \r\t\t\t\t\t\t\t\t\t\t\t \033[0;31m$(@F)\033[0m" +$(VERBOSE)echo -e "\rCompiling Inline Static \033[0;33m[$(@D)]\033[0m \r\t\t\t\t\t\t\t\t\t\t\t \033[0;31m$(@F)\033[0m" $(VERBOSE)$(CC) $(CFLAGS_N) -Wno-missing-prototypes -Wno-missing-declarations -D__timespec_defined -o $@ -c $< $(LOG_COMMAND) endef define COMPILE_ASM $(VERBOSE)@$(MAKEDIR) $(@D) $(VERBOSE)echo -e "\rCompiling Static ASM \033[0;33m[$(@D)]\033[0m \r\t\t\t\t\t\t\t\t\t\t\t \033[0;31m$(@F)\033[0m" -$(VERBOSE)$(CC) -o $@ -c $< $(LOG_COMMAND) +$(VERBOSE)$(CC) -o $@ -c $< $(LOG_COMMAND) endef define COMPILE_SHARED @@ -297,8 +297,8 @@ endef define COMPILE_SPE_REG $(VERBOSE)@$(MAKEDIR) $(@D) -$(VERBOSE)echo -e "\rAssembling with regnames \033[0;33m[$(@D)]\033[0m \r\t\t\t\t\t\t\t\t\t\t\t \033[0;31m$(@F)\033[0m" -$(VERBOSE)$(CC) -mvrsave -mregnames -DVRSAVE -mspe -mcpu=8540 -mfloat-gprs=double -o $@ -c $< $(LOG_COMMAND) +$(VERBOSE)echo -e "\rAssembling SPE with regnames \033[0;33m[$(@D)]\033[0m \r\t\t\t\t\t\t\t\t\t\t\t \033[0;31m$(@F)\033[0m" +$(VERBOSE)$(CC) $(AFLAGS) -mvrsave -mregnames -DVRSAVE -mspe -mcpu=8540 -mfloat-gprs=double -o $@ -c $< $(LOG_COMMAND) endef define COMPILE_SPE diff --git a/libc.gmk b/libc.gmk index 2b87095c..1e7511bb 100755 --- a/libc.gmk +++ b/libc.gmk @@ -215,8 +215,17 @@ C_SETJMP := \ setjmp/longjmp.o \ setjmp/setjmp.o \ setjmp/sigjmp.o \ - setjmp/siglongjmp.o \ - setjmp/sigsetjmp.o + setjmp/siglongjmp.o + +ifdef SPE + $(info Using SPE sigssetjmp) + C_SETJMP := $(C_SETJMP) \ + setjmp/sigsetjmp_spe.o +else + $(info Using NON-SPE sigsetjmp) + C_SETJMP := $(C_SETJMP) \ + setjmp/sigsetjmp.o +endif C_SOCKET := \ resolv/dns_parse.o \ diff --git a/libm.gmk b/libm.gmk index f0129ebc..166391b5 100755 --- a/libm.gmk +++ b/libm.gmk @@ -136,7 +136,6 @@ C_MATH := \ math/expm1.o \ math/expm1f.o \ math/expm1l.o \ - math/fabs.o \ math/fabsf.o \ math/fabsl.o \ math/fdim.o \ @@ -293,6 +292,14 @@ C_MATH := \ math/truncf.o \ math/truncl.o +ifdef SPE + C_MATH := $(C_MATH)\ + math/fabs_spe.o +else + C_MATH := $(C_MATH)\ + math/fabs.o +endif + MATH_LIB := \ math/m.lib_rev.o diff --git a/library/include/fenv.h b/library/include/fenv.h index 8b40b657..435d1fcf 100755 --- a/library/include/fenv.h +++ b/library/include/fenv.h @@ -66,11 +66,16 @@ __fe_dfl_env; FE_OVERFLOW | FE_UNDERFLOW) >> _FPUSW_SHIFT) #ifndef _SOFT_FLOAT -#define __mffs(__env) __asm __volatile("mffs %0" : "=f" (*(__env))) -#define __mtfsf(__env) __asm __volatile("mtfsf 255,%0" : : "f" (__env)) + #ifdef __SPE__ + #define __mffs(__env) __asm __volatile("mfspr %0, 512" : "=r" ((__env)->__bits.__reg)) + #define __mtfsf(__env) __asm __volatile("mtspr 512,%0;isync" :: "r" ((__env).__bits.__reg)) + #else + #define __mffs(__env) __asm __volatile("mffs %0" : "=f" ((__env)->__d)) + #define __mtfsf(__env) __asm __volatile("mtfsf 255,%0" :: "f" ((__env).__d)) + #endif #else -#define __mffs(__env) -#define __mtfsf(__env) + #define __mffs(__env) + #define __mtfsf(__env) #endif union __fpscr { @@ -142,7 +147,7 @@ fetestexcept(int __excepts) { __fenv_static inline int fegetround(void) { - union __fpscr __r = {0}; + union __fpscr __r; __mffs(&__r.__d); return (__r.__bits.__reg & _ROUND_MASK); diff --git a/library/math/fabs.c b/library/math/fabs.c index 3a9c8507..7c9ac5fa 100644 --- a/library/math/fabs.c +++ b/library/math/fabs.c @@ -6,23 +6,14 @@ #include "math_headers.h" #endif /* _MATH_HEADERS_H */ +#ifndef __SPE__ inline static double __fabs(double x) { -#ifndef _SOFT_FLOAT double res; __asm volatile("fabs %0, %1" - : "=f"(res) - : "f"(x)); - - return res; -#else - uint32_t high; - GET_HIGH_WORD(high, x); - SET_HIGH_WORD(x, high & 0x7fffffff); - - return x; -#endif + : "=f"(res) + : "f"(x)); } double @@ -33,3 +24,4 @@ fabs(double x) { return (result); } +#endif diff --git a/library/math/fabs_spe.S b/library/math/fabs_spe.S new file mode 100644 index 00000000..63e9dac1 --- /dev/null +++ b/library/math/fabs_spe.S @@ -0,0 +1,13 @@ +/* + * $Id: math_fabs_spe.S,v 1.00 2023-07-13 12:04:23 clib2devs Exp $ +*/ + + +#include "ppc-asm.h" + +#ifdef __SPE__ +FUNC_START(fabs) + efdabs f1, f1 + blr +FUNC_END(fabs) +#endif \ No newline at end of file diff --git a/library/setjmp/longjmp.S b/library/setjmp/longjmp.S index 5349b359..2e76a46c 100644 --- a/library/setjmp/longjmp.S +++ b/library/setjmp/longjmp.S @@ -96,7 +96,7 @@ FUNC_START(longjmp_altivec) bclr+ 4,2 li 3,1 blr - FUNC_END(longjmp_altivec) +FUNC_END(longjmp_altivec) #endif /* __SPE__ */ FUNC_START(longjmp) diff --git a/library/setjmp/siglongjmp.c b/library/setjmp/siglongjmp.c index 534e5378..1ace8688 100644 --- a/library/setjmp/siglongjmp.c +++ b/library/setjmp/siglongjmp.c @@ -6,6 +6,7 @@ #include "signal_headers.h" #endif /* _SIGNAL_HEADERS_H */ +#ifndef __SPE__ void siglongjmp(sigjmp_buf env, int val) { SHOWVALUE(val); @@ -15,4 +16,5 @@ void siglongjmp(sigjmp_buf env, int val) { /* Call the machine-dependent function to restore machine state. */ _longjmp(env, val ?: 1); -} \ No newline at end of file +} +#endif \ No newline at end of file diff --git a/library/setjmp/sigsetjmp.S b/library/setjmp/sigsetjmp.S index 39484527..6bf1a8cf 100644 --- a/library/setjmp/sigsetjmp.S +++ b/library/setjmp/sigsetjmp.S @@ -16,10 +16,12 @@ License along with the GNU C Library; if not, see . */ +#ifndef __SPE__ #define __NO_VMX__ #undef __sigsetjmp_symbol #undef __sigjmp_save_symbol #undef JB_SIZE #define __sigsetjmp_symbol __sigsetjmp #define __sigjmp_save_symbol __sigjmp_save -#include "sigsetjmp-common.S" \ No newline at end of file +#include "sigsetjmp-common.S" +#endif \ No newline at end of file diff --git a/library/setjmp/sigsetjmp_spe.S b/library/setjmp/sigsetjmp_spe.S new file mode 100644 index 00000000..6022caea --- /dev/null +++ b/library/setjmp/sigsetjmp_spe.S @@ -0,0 +1,130 @@ +/* + * $Id: stdlib_sigsetjmp_spe.S,v 1.0 2023-07-13 13:50:17 clib2devs Exp $ + */ + +/* + * C library -- sigsetjmp, siglongjmp + * + * siglongjmp(a,v) + * will generate a "return(v?v:1)" from the last call to + * sigsetjmp(a, savemask) + * by restoring registers from the stack. + * The previous signal state is restored if savemask is non-zero + * + * jmpbuf layout: + * +------------+ + * | savemask | + * +------------+ + * | sig state | + * | | + * | (4 words) | + * | | + * +------------+ + * | saved regs | + * | ... | + */ + +#include "ppc-asm.h" + +#ifdef __SPE__ +FUNC_START(_setjmp) + li r4,0 /* Set second argument to 0. */ + b __sigsetjmp@local +FUNC_END(_setjmp) + +FUNC_START(__sigsetjmp) + mr r6,r3 + stw r4,0(r3) + or. r7,r4,r4 + beq 1f + li r3,1 /* SIG_BLOCK, but doesn't matter */ + /* since set == NULL */ + li r4,0 /* set = NULL */ + mr r5,r6 /* &oset */ + addi r5,r5,4 + bl sigprocmask /* sigprocmask(SIG_BLOCK, NULL, &oset)*/ + sc /* assume no error XXX */ +1: + mflr r11 + mfcr r12 + mr r10,r1 + mr r9,r2 + + /* FPRs */ + evstdd r9,24+0*8(r6) + evstdd r10,24+1*8(r6) + evstdd r11,24+2*8(r6) + evstdd r12,24+3*8(r6) + evstdd r13,24+4*8(r6) + evstdd r14,24+5*8(r6) + evstdd r15,24+6*8(r6) + evstdd r16,24+7*8(r6) + evstdd r17,24+8*8(r6) + evstdd r18,24+9*8(r6) + evstdd r19,24+10*8(r6) + evstdd r20,24+11*8(r6) + evstdd r21,24+12*8(r6) + evstdd r22,24+13*8(r6) + evstdd r23,24+14*8(r6) + evstdd r24,24+15*8(r6) + evstdd r25,24+16*8(r6) + evstdd r26,24+17*8(r6) + evstdd r27,24+18*8(r6) + evstdd r28,24+19*8(r6) + evstdd r29,24+20*8(r6) + evstdd r30,24+21*8(r6) + evstdd r31,24+22*8(r6) + + li r3,0 + blr +FUNC_END(__sigsetjmp) + +FUNC_START(siglongjmp) + + /* FPRs */ + evldd r9,24+0*8(r6) + evldd r10,24+1*8(r6) + evldd r11,24+2*8(r6) + evldd r12,24+3*8(r6) + evldd r13,24+4*8(r6) + evldd r14,24+5*8(r6) + evldd r15,24+6*8(r6) + evldd r16,24+7*8(r6) + evldd r17,24+8*8(r6) + evldd r18,24+9*8(r6) + evldd r19,24+10*8(r6) + evldd r20,24+11*8(r6) + evldd r21,24+12*8(r6) + evldd r22,24+13*8(r6) + evldd r23,24+14*8(r6) + evldd r24,24+15*8(r6) + evldd r25,24+16*8(r6) + evldd r26,24+17*8(r6) + evldd r27,24+18*8(r6) + evldd r28,24+19*8(r6) + evldd r29,24+20*8(r6) + evldd r30,24+21*8(r6) + evldd r31,24+22*8(r6) + + lwz r7,0(r3) + mr r6,r4 + mtlr r11 + mtcr r12 + mr r1,r10 + or. r7,r7,r7 + beq 1f + mr r4,r3 + li r3,3 /* SIG_SETMASK */ + addi r4,r4,4 /* &set */ + li r5,0 /* oset = NULL */ + bl sigprocmask /* sigprocmask(SIG_SET, &set, NULL) */ + sc /* assume no error XXX */ +1: + or. r3,r6,r6 + bnelr + li r3,1 + blr +FUNC_END(siglongjmp) + + .section .note.GNU-stack,"",%progbits +#endif \ No newline at end of file diff --git a/shared.gmk b/shared.gmk index 489bc154..07a779b1 100644 --- a/shared.gmk +++ b/shared.gmk @@ -35,6 +35,10 @@ $(OUT_SHARED_LIB)/cpu/generic/%.o : $(LIB_DIR)/cpu/generic/%.S $(OUT_SHARED_LIB)/cpu/spe/%.o : $(LIB_DIR)/cpu/spe/%.S $(VERBOSE)$(COMPILE_SPE_REG) +$(OUT_SHARED_LIB)/setjmp/sigsetjmp_spe.o : $(LIB_DIR)/setjmp/sigsetjmp_spe.S + $(VERBOSE)$(COMPILE_SPE_REG) +$(OUT_SHARED_LIB)/math/fabs_spe.o : $(LIB_DIR)/math/fabs_spe.S + $(VERBOSE)$(COMPILE_SPE_REG) $(OUT_SHARED_LIB)/%.o : $(LIB_DIR)/%.S $(VERBOSE)$(COMPILE_ASM)