2007-01-15 Joseph Myers <joseph@codesourcery.com>
Kazu Hirata <kazu@codesourcery.com> * libc/machine/powerpc/setjmp.S (setjmp, longjmp): Add support for E500V1 and E500V2.
This commit is contained in:
parent
153995f846
commit
94b91791ea
@ -1,3 +1,9 @@
|
|||||||
|
2007-01-15 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
Kazu Hirata <kazu@codesourcery.com>
|
||||||
|
|
||||||
|
* libc/machine/powerpc/setjmp.S (setjmp, longjmp): Add support
|
||||||
|
for E500V1 and E500V2.
|
||||||
|
|
||||||
2007-01-11 Jeff Johnston <jjohnstn@redhat.com>
|
2007-01-11 Jeff Johnston <jjohnstn@redhat.com>
|
||||||
|
|
||||||
* libm/configure.in: Always configure machine directory.
|
* libm/configure.in: Always configure machine directory.
|
||||||
|
@ -12,6 +12,35 @@ FUNC_START(setjmp)
|
|||||||
addi 3,3,7 # align to 8 byte boundary
|
addi 3,3,7 # align to 8 byte boundary
|
||||||
rlwinm 3,3,0,0,28
|
rlwinm 3,3,0,0,28
|
||||||
#endif
|
#endif
|
||||||
|
#if __SPE__
|
||||||
|
/* If we are E500, then save 64-bit registers. */
|
||||||
|
evstdd 1,0(3) # offset 0
|
||||||
|
evstdd 2,8(3) # offset 8
|
||||||
|
evstdd 13,16(3) # offset 16
|
||||||
|
evstdd 14,24(3) # offset 24
|
||||||
|
evstdd 15,32(3) # offset 32
|
||||||
|
evstdd 16,40(3) # offset 40
|
||||||
|
evstdd 17,48(3) # offset 48
|
||||||
|
evstdd 18,56(3) # offset 56
|
||||||
|
evstdd 19,64(3) # offset 64
|
||||||
|
evstdd 20,72(3) # offset 72
|
||||||
|
evstdd 21,80(3) # offset 80
|
||||||
|
evstdd 22,88(3) # offset 88
|
||||||
|
evstdd 23,96(3) # offset 96
|
||||||
|
evstdd 24,104(3) # offset 104
|
||||||
|
evstdd 25,112(3) # offset 112
|
||||||
|
evstdd 26,120(3) # offset 120
|
||||||
|
evstdd 27,128(3) # offset 128
|
||||||
|
evstdd 28,136(3) # offset 136
|
||||||
|
evstdd 29,144(3) # offset 144
|
||||||
|
evstdd 30,152(3) # offset 152
|
||||||
|
evstdd 31,160(3) # offset 160
|
||||||
|
|
||||||
|
/* Add 164 to r3 to account for the amount of data we just
|
||||||
|
stored. Note that we are not adding 168 because the next
|
||||||
|
store instruction uses an offset of 4. */
|
||||||
|
addi 3,3,164
|
||||||
|
#else
|
||||||
stw 1,0(3) # offset 0
|
stw 1,0(3) # offset 0
|
||||||
stwu 2,4(3) # offset 4
|
stwu 2,4(3) # offset 4
|
||||||
stwu 13,4(3) # offset 8
|
stwu 13,4(3) # offset 8
|
||||||
@ -33,12 +62,22 @@ FUNC_START(setjmp)
|
|||||||
stwu 29,4(3) # offset 72
|
stwu 29,4(3) # offset 72
|
||||||
stwu 30,4(3) # offset 76
|
stwu 30,4(3) # offset 76
|
||||||
stwu 31,4(3) # offset 80
|
stwu 31,4(3) # offset 80
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* From this point on until the end of this function, add 84
|
||||||
|
to the offset shown if __SPE__. This difference comes from
|
||||||
|
the fact that we save 21 64-bit registers instead of 21
|
||||||
|
32-bit registers above. */
|
||||||
mflr 4
|
mflr 4
|
||||||
stwu 4,4(3) # offset 84
|
stwu 4,4(3) # offset 84
|
||||||
mfcr 4
|
mfcr 4
|
||||||
stwu 4,4(3) # offset 88
|
stwu 4,4(3) # offset 88
|
||||||
# one word pad to get floating point aligned on 8 byte boundary
|
# one word pad to get floating point aligned on 8 byte boundary
|
||||||
#ifndef _SOFT_FLOAT
|
|
||||||
|
/* Check whether we need to save FPRs. Checking __NO_FPRS__
|
||||||
|
on its own would be enough for GCC 4.1 and above, but older
|
||||||
|
compilers only define _SOFT_FLOAT, so check both. */
|
||||||
|
#if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT)
|
||||||
stfdu 14,8(3) # offset 96
|
stfdu 14,8(3) # offset 96
|
||||||
stfdu 15,8(3) # offset 104
|
stfdu 15,8(3) # offset 104
|
||||||
stfdu 16,8(3) # offset 112
|
stfdu 16,8(3) # offset 112
|
||||||
@ -106,6 +145,35 @@ FUNC_START(longjmp)
|
|||||||
addi 3,3,7 # align to 8 byte boundary
|
addi 3,3,7 # align to 8 byte boundary
|
||||||
rlwinm 3,3,0,0,28
|
rlwinm 3,3,0,0,28
|
||||||
#endif
|
#endif
|
||||||
|
#if __SPE__
|
||||||
|
/* If we are E500, then restore 64-bit registers. */
|
||||||
|
evldd 1,0(3) # offset 0
|
||||||
|
evldd 2,8(3) # offset 8
|
||||||
|
evldd 13,16(3) # offset 16
|
||||||
|
evldd 14,24(3) # offset 24
|
||||||
|
evldd 15,32(3) # offset 32
|
||||||
|
evldd 16,40(3) # offset 40
|
||||||
|
evldd 17,48(3) # offset 48
|
||||||
|
evldd 18,56(3) # offset 56
|
||||||
|
evldd 19,64(3) # offset 64
|
||||||
|
evldd 20,72(3) # offset 72
|
||||||
|
evldd 21,80(3) # offset 80
|
||||||
|
evldd 22,88(3) # offset 88
|
||||||
|
evldd 23,96(3) # offset 96
|
||||||
|
evldd 24,104(3) # offset 104
|
||||||
|
evldd 25,112(3) # offset 112
|
||||||
|
evldd 26,120(3) # offset 120
|
||||||
|
evldd 27,128(3) # offset 128
|
||||||
|
evldd 28,136(3) # offset 136
|
||||||
|
evldd 29,144(3) # offset 144
|
||||||
|
evldd 30,152(3) # offset 152
|
||||||
|
evldd 31,160(3) # offset 160
|
||||||
|
|
||||||
|
/* Add 164 to r3 to account for the amount of data we just
|
||||||
|
loaded. Note that we are not adding 168 because the next
|
||||||
|
load instruction uses an offset of 4. */
|
||||||
|
addi 3,3,164
|
||||||
|
#else
|
||||||
lwz 1,0(3) # offset 0
|
lwz 1,0(3) # offset 0
|
||||||
lwzu 2,4(3) # offset 4
|
lwzu 2,4(3) # offset 4
|
||||||
lwzu 13,4(3) # offset 8
|
lwzu 13,4(3) # offset 8
|
||||||
@ -127,12 +195,22 @@ FUNC_START(longjmp)
|
|||||||
lwzu 29,4(3) # offset 72
|
lwzu 29,4(3) # offset 72
|
||||||
lwzu 30,4(3) # offset 76
|
lwzu 30,4(3) # offset 76
|
||||||
lwzu 31,4(3) # offset 80
|
lwzu 31,4(3) # offset 80
|
||||||
|
#endif
|
||||||
|
/* From this point on until the end of this function, add 84
|
||||||
|
to the offset shown if __SPE__. This difference comes from
|
||||||
|
the fact that we restore 21 64-bit registers instead of 21
|
||||||
|
32-bit registers above. */
|
||||||
lwzu 5,4(3) # offset 84
|
lwzu 5,4(3) # offset 84
|
||||||
mtlr 5
|
mtlr 5
|
||||||
lwzu 5,4(3) # offset 88
|
lwzu 5,4(3) # offset 88
|
||||||
mtcrf 255,5
|
mtcrf 255,5
|
||||||
# one word pad to get floating point aligned on 8 byte boundary
|
# one word pad to get floating point aligned on 8 byte boundary
|
||||||
#ifndef _SOFT_FLOAT
|
|
||||||
|
/* Check whether we need to restore FPRs. Checking
|
||||||
|
__NO_FPRS__ on its own would be enough for GCC 4.1 and
|
||||||
|
above, but older compilers only define _SOFT_FLOAT, so
|
||||||
|
check both. */
|
||||||
|
#if !defined (__NO_FPRS__) && !defined (_SOFT_FLOAT)
|
||||||
lfdu 14,8(3) # offset 96
|
lfdu 14,8(3) # offset 96
|
||||||
lfdu 15,8(3) # offset 104
|
lfdu 15,8(3) # offset 104
|
||||||
lfdu 16,8(3) # offset 112
|
lfdu 16,8(3) # offset 112
|
||||||
|
Loading…
x
Reference in New Issue
Block a user