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 11d2e48 commit ad97729
Show file tree
Hide file tree
Showing 73 changed files with 1,744 additions and 1,301 deletions.
4 changes: 2 additions & 2 deletions GNUmakefile.os4
Original file line number Diff line number Diff line change
Expand Up @@ -117,9 +117,9 @@ AFLAGS := -Wa,-mregnames

ifdef SPE
CC := ppc-amigaos-gcc-6.4.0
CFLAGS := $(CFLAGS) -DSPE -D_SOFT_FLOAT -D__SPE__ -mspe -mcpu=8540 -mfloat-gprs=double -mabi=spe -fno-inline-functions -fno-partial-inlining \
CFLAGS := $(CFLAGS) -D__SPE__ -mspe -mcpu=8540 -mfloat-gprs=double -mabi=spe -fno-inline-functions -fno-partial-inlining \
-fno-align-functions -fno-align-jumps -fno-align-loops -fno-align-labels -fno-inline-small-functions -fno-indirect-inlining -Wno-unused-but-set-variable -Wno-uninitialized
AFLAGS := $(AFLAGS) -mspe -mcpu=8540 -mfloat-gprs=double
AFLAGS := $(AFLAGS) -D__SPE__ -mspe -mcpu=8540 -mfloat-gprs=double
endif

VERBOSE ?= @
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# A C runtime library for AmigaOS4
# A C runtime library for AmigaOS4

[![Build Status](https://travis-ci.com/afxgroup/clib2.svg?branch=master)](https://travis-ci.org/afxgroup/clib2)
[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
Expand Down
40 changes: 20 additions & 20 deletions libc.gmk
Original file line number Diff line number Diff line change
Expand Up @@ -211,21 +211,14 @@ C_SEARCH := \
search/twalk.o

C_SETJMP := \
cpu/altivec/longjmp_altivec.o \
cpu/altivec/setjmp_altivec.o \
setjmp/_longjmp.o \
setjmp/longjmp.o \
setjmp/setjmp.o \
setjmp/sigjmp.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
setjmp/siglongjmp.o \
setjmp/sigsetjmp.o

C_SOCKET := \
resolv/dns_parse.o \
Expand Down Expand Up @@ -614,15 +607,6 @@ C_STRING := \
string/strverscmp.o \
string/strxfrm.o

ifdef SPE
$(info Adding SPE objects)
C_STRING := $(C_STRING) \
cpu/spe/memcmpE500.o \
cpu/spe/strcmpE500.o \
cpu/spe/strcpyE500.o \
cpu/spe/strlenE500.o
endif

C_TERMCAP := \
termcap/termcap.o \
termcap/tparam.o
Expand Down Expand Up @@ -915,6 +899,22 @@ C_WCHAR := \
wchar/wctrans.o \
wchar/wctype.o

ifdef SPE
$(info Adding SPE objects)
C_STRING := $(C_STRING) \
cpu/spe/memcmpE500.o \
cpu/spe/strcmpE500.o \
cpu/spe/strcpyE500.o \
cpu/spe/strlenE500.o

C_SETJMP := $(C_SETJMP) \
cpu/spe/_longjmpE500.o \
cpu/spe/_setjmpE500.o \
cpu/spe/longjmpE500.o \
cpu/spe/setjmpE500.o \
cpu/spe/sigsetjmpE500.o
endif

C_LIBRARY := \
$(C_BASE) \
$(C_ARGZ) \
Expand Down
12 changes: 8 additions & 4 deletions libm.gmk
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,6 @@ C_MATH := \
math/logf.o \
math/logl.o \
math/lrint.o \
math/lrintf.o \
math/lrintl.o \
math/lround.o \
math/lroundf.o \
Expand Down Expand Up @@ -293,11 +292,16 @@ C_MATH := \
math/truncl.o

ifdef SPE
C_MATH := $(C_MATH)\
math/fabs_spe.o
$(info Using SPE math objects)
C_MATH := $(C_MATH) \
math/fabs_spe.o \
math/fabsf_spe.o \
math/lrintf_spe.o
else
C_MATH := $(C_MATH)\
math/fabs.o
math/fabs.o \
math/fabsf.o \
math/lrintf.o
endif

MATH_LIB := \
Expand Down
94 changes: 94 additions & 0 deletions library/cpu/altivec/longjmp_altivec.sx
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* $Id: stdlib_longjmp.c,v 1.6 2010-10-20 13:50:17 clib2devs Exp $
*/

/* This is a simple version of setjmp and longjmp for the PowerPC.
Ian Lance Taylor, Cygnus Support, 9 Feb 1994.
Modified by Jeff Johnston, Red Hat Inc. 2 Oct 2001. */

#include "ppc-asm.h"

FUNC_START(longjmp_altivec)
addi 3,3,15 # align Altivec to 16 byte boundary
rlwinm 3,3,0,0,27

lwz 1,0(3) # offset 0
lwzu 2,4(3) # offset 4
lwzu 13,4(3) # offset 8
lwzu 14,4(3) # offset 12
lwzu 15,4(3) # offset 16
lwzu 16,4(3) # offset 20
lwzu 17,4(3) # offset 24
lwzu 18,4(3) # offset 28
lwzu 19,4(3) # offset 32
lwzu 20,4(3) # offset 36
lwzu 21,4(3) # offset 40
lwzu 22,4(3) # offset 44
lwzu 23,4(3) # offset 48
lwzu 24,4(3) # offset 52
lwzu 25,4(3) # offset 56
lwzu 26,4(3) # offset 60
lwzu 27,4(3) # offset 64
lwzu 28,4(3) # offset 68
lwzu 29,4(3) # offset 72
lwzu 30,4(3) # offset 76
lwzu 31,4(3) # offset 80
lwzu 5,4(3) # offset 84
mtlr 5
lwzu 5,4(3) # offset 88
mtcrf 255,5
// # one word pad to get floating point aligned on 8 byte boundary
#ifndef _SOFT_FLOAT
lfdu 14,8(3) # offset 96
lfdu 15,8(3) # offset 104
lfdu 16,8(3) # offset 112
lfdu 17,8(3) # offset 120
lfdu 18,8(3) # offset 128
lfdu 19,8(3) # offset 136
lfdu 20,8(3) # offset 144
lfdu 21,8(3) # offset 152
lfdu 22,8(3) # offset 160
lfdu 23,8(3) # offset 168
lfdu 24,8(3) # offset 176
lfdu 25,8(3) # offset 184
lfdu 26,8(3) # offset 192
lfdu 27,8(3) # offset 200
lfdu 28,8(3) # offset 208
lfdu 29,8(3) # offset 216
lfdu 30,8(3) # offset 224
lfdu 31,8(3) # offset 232
#endif

/* restore Altivec vrsave and v20-v31 registers */
lwzu 5,16(3) # offset 248
mtspr 256,5 # vrsave
addi 3,3,8
lvx 20,0,3 # offset 256
addi 3,3,16
lvx 21,0,3 # offset 272
addi 3,3,16
lvx 22,0,3 # offset 288
addi 3,3,16
lvx 23,0,3 # offset 304
addi 3,3,16
lvx 24,0,3 # offset 320
addi 3,3,16
lvx 25,0,3 # offset 336
addi 3,3,16
lvx 26,0,3 # offset 352
addi 3,3,16
lvx 27,0,3 # offset 368
addi 3,3,16
lvx 28,0,3 # offset 384
addi 3,3,16
lvx 29,0,3 # offset 400
addi 3,3,16
lvx 30,0,3 # offset 416
addi 3,3,16
lvx 31,0,3 # offset 432

mr. 3,4
bclr+ 4,2
li 3,1
blr
FUNC_END(longjmp_altivec)
98 changes: 98 additions & 0 deletions library/cpu/altivec/setjmp_altivec.sx
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*
* $Id: stdlib_setjmp.c,v 2.0 2010-10-20 13:50:17 clib2devs Exp $
*/
/* This is a simple version of setjmp and longjmp for the PowerPC.
Ian Lance Taylor, Cygnus Support, 9 Feb 1994.
Modified by Jeff Johnston, Red Hat Inc. 2 Oct 2001. */

#include "ppc-asm.h"

FUNC_START(setjmp_altivec)
addi 3,3,15 # align Altivec to 16 byte boundary
rlwinm 3,3,0,0,27

stw 1,0(3) # offset 0
stwu 2,4(3) # offset 4
stwu 13,4(3) # offset 8
stwu 14,4(3) # offset 12
stwu 15,4(3) # offset 16
stwu 16,4(3) # offset 20
stwu 17,4(3) # offset 24
stwu 18,4(3) # offset 28
stwu 19,4(3) # offset 32
stwu 20,4(3) # offset 36
stwu 21,4(3) # offset 40
stwu 22,4(3) # offset 44
stwu 23,4(3) # offset 48
stwu 24,4(3) # offset 52
stwu 25,4(3) # offset 56
stwu 26,4(3) # offset 60
stwu 27,4(3) # offset 64
stwu 28,4(3) # offset 68
stwu 29,4(3) # offset 72
stwu 30,4(3) # offset 76
stwu 31,4(3) # offset 80
mflr 4
stwu 4,4(3) # offset 84
mfcr 4
stwu 4,4(3) # offset 88
// # one word pad to get floating point aligned on 8 byte boundary
#ifndef _SOFT_FLOAT
stfdu 14,8(3) # offset 96
stfdu 15,8(3) # offset 104
stfdu 16,8(3) # offset 112
stfdu 17,8(3) # offset 120
stfdu 18,8(3) # offset 128
stfdu 19,8(3) # offset 136
stfdu 20,8(3) # offset 144
stfdu 21,8(3) # offset 152
stfdu 22,8(3) # offset 160
stfdu 23,8(3) # offset 168
stfdu 24,8(3) # offset 176
stfdu 25,8(3) # offset 184
stfdu 26,8(3) # offset 192
stfdu 27,8(3) # offset 200
stfdu 28,8(3) # offset 208
stfdu 29,8(3) # offset 216
stfdu 30,8(3) # offset 224
stfdu 31,8(3) # offset 232
#endif

/* This requires a total of 21 * 4 + 18 * 8 + 4 + 4 + 4
bytes == 60 * 4 bytes == 240 bytes. */

/* save Altivec vrsave and vr20-vr31 registers */
mfspr 4,256 # vrsave register
stwu 4,16(3) # offset 248
addi 3,3,8
stvx 20,0,3 # offset 256
addi 3,3,16
stvx 21,0,3 # offset 272
addi 3,3,16
stvx 22,0,3 # offset 288
addi 3,3,16
stvx 23,0,3 # offset 304
addi 3,3,16
stvx 24,0,3 # offset 320
addi 3,3,16
stvx 25,0,3 # offset 336
addi 3,3,16
stvx 26,0,3 # offset 352
addi 3,3,16
stvx 27,0,3 # offset 368
addi 3,3,16
stvx 28,0,3 # offset 384
addi 3,3,16
stvx 29,0,3 # offset 400
addi 3,3,16
stvx 30,0,3 # offset 416
addi 3,3,16
stvx 31,0,3 # offset 432

/* This requires a total of 240 + 8 + 8 + 12 * 16 == 448 bytes. */

li 3,0
blr
FUNC_END(setjmp_altivec)


40 changes: 40 additions & 0 deletions library/cpu/spe/_longjmpE500.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/*
* $Id: _longjmpE500.c,v 1.0 2023-07-14 13:50:17 clib2devs Exp $
*/

#include "ppc-asm.h"

FUNC_START(_longjmp_spe)
evldd r1,24+0*8(r3)
evldd r2,24+1*8(r3)
evldd r11,24+2*8(r3)
evldd r12,24+3*8(r3)
evldd r13,24+4*8(r3)
evldd r14,24+5*8(r3)
evldd r15,24+6*8(r3)
evldd r16,24+7*8(r3)
evldd r17,24+8*8(r3)
evldd r18,24+9*8(r3)
evldd r19,24+10*8(r3)
evldd r20,24+11*8(r3)
evldd r21,24+12*8(r3)
evldd r22,24+13*8(r3)
evldd r23,24+14*8(r3)
evldd r24,24+15*8(r3)
evldd r25,24+16*8(r3)
evldd r26,24+17*8(r3)
evldd r27,24+18*8(r3)
evldd r28,24+19*8(r3)
evldd r29,24+20*8(r3)
evldd r30,24+21*8(r3)
evldd r31,24+22*8(r3)

mtlr r11
mtcr r12
or. r3,r4,r4
bnelr
li r3,1
blr
FUNC_END(_longjmp_spe)

.section .note.GNU-stack,"",%progbits
38 changes: 38 additions & 0 deletions library/cpu/spe/_setjmpE500.S
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/*
* $Id: _setjmpE500.c,v 1.0 2023-07-14 13:50:17 clib2devs Exp $
*/

#include "ppc-asm.h"

FUNC_START(_setjmp_spe)
mflr r11
mfcr r12
evstdd r1,24+0*8(r3)
evstdd r2,24+1*8(r3)
evstdd r11,24+2*8(r3)
evstdd r12,24+3*8(r3)
evstdd r13,24+4*8(r3)
evstdd r14,24+5*8(r3)
evstdd r15,24+6*8(r3)
evstdd r16,24+7*8(r3)
evstdd r17,24+8*8(r3)
evstdd r18,24+9*8(r3)
evstdd r19,24+10*8(r3)
evstdd r20,24+11*8(r3)
evstdd r21,24+12*8(r3)
evstdd r22,24+13*8(r3)
evstdd r23,24+14*8(r3)
evstdd r24,24+15*8(r3)
evstdd r25,24+16*8(r3)
evstdd r26,24+17*8(r3)
evstdd r27,24+18*8(r3)
evstdd r28,24+19*8(r3)
evstdd r29,24+20*8(r3)
evstdd r30,24+21*8(r3)
evstdd r31,24+22*8(r3)

li r3,0
blr
FUNC_END(_setjmp_spe)

.section .note.GNU-stack,"",%progbits
Loading

0 comments on commit ad97729

Please sign in to comment.