Skip to content

Commit

Permalink
More SPE changes
Browse files Browse the repository at this point in the history
  • Loading branch information
afxgroup committed Jul 14, 2023
1 parent cf8c530 commit 11d2e48
Show file tree
Hide file tree
Showing 11 changed files with 191 additions and 27 deletions.
8 changes: 4 additions & 4 deletions GNUmakefile.os4
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
13 changes: 11 additions & 2 deletions libc.gmk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
9 changes: 8 additions & 1 deletion libm.gmk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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

Expand Down
15 changes: 10 additions & 5 deletions library/include/fenv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
Expand Down
16 changes: 4 additions & 12 deletions library/math/fabs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -33,3 +24,4 @@ fabs(double x) {

return (result);
}
#endif
13 changes: 13 additions & 0 deletions library/math/fabs_spe.S
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion library/setjmp/longjmp.S
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
4 changes: 3 additions & 1 deletion library/setjmp/siglongjmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "signal_headers.h"
#endif /* _SIGNAL_HEADERS_H */

#ifndef __SPE__
void siglongjmp(sigjmp_buf env, int val) {
SHOWVALUE(val);

Expand All @@ -15,4 +16,5 @@ void siglongjmp(sigjmp_buf env, int val) {

/* Call the machine-dependent function to restore machine state. */
_longjmp(env, val ?: 1);
}
}
#endif
4 changes: 3 additions & 1 deletion library/setjmp/sigsetjmp.S
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */

#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"
#include "sigsetjmp-common.S"
#endif
130 changes: 130 additions & 0 deletions library/setjmp/sigsetjmp_spe.S
Original file line number Diff line number Diff line change
@@ -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
4 changes: 4 additions & 0 deletions shared.gmk
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 11d2e48

Please sign in to comment.