2005-04-17 02:20:36 +04:00
/ *
* This f i l e i s s u b j e c t t o t h e t e r m s a n d c o n d i t i o n s o f t h e G N U G e n e r a l P u b l i c
* License. S e e t h e f i l e " C O P Y I N G " i n t h e m a i n d i r e c t o r y o f t h i s a r c h i v e
* for m o r e d e t a i l s .
*
* Copyright ( C ) 1 9 9 6 , 9 8 , 9 9 , 2 0 0 0 , 0 1 R a l f B a e c h l e
*
* Multi- a r c h a b s t r a c t i o n a n d a s m m a c r o s f o r e a s i e r r e a d i n g :
2011-04-05 01:15:29 +04:00
* Copyright ( C ) 1 9 9 6 D a v i d S . M i l l e r ( d a v e m @davemloft.net)
2005-04-17 02:20:36 +04:00
*
* Carsten L a n g g a a r d , c a r s t e n l @mips.com
* Copyright ( C ) 2 0 0 0 M I P S T e c h n o l o g i e s , I n c .
* Copyright ( C ) 1 9 9 9 , 2 0 0 1 S i l i c o n G r a p h i c s , I n c .
* /
# include < a s m / a s m . h >
# include < a s m / e r r n o . h >
# include < a s m / f p r e g d e f . h >
# include < a s m / m i p s r e g s . h >
2005-09-10 00:32:31 +04:00
# include < a s m / a s m - o f f s e t s . h >
2005-04-17 02:20:36 +04:00
# include < a s m / r e g d e f . h >
.macro EX insn, r e g , s r c
.set push
.set nomacro
.ex \ @: \insn \reg, \src
.set pop
.section _ _ ex_ t a b l e ," a "
PTR . e x \ @, fault
.previous
.endm
.set noreorder
.set mips3
2005-05-31 15:49:19 +04:00
2005-04-17 02:20:36 +04:00
LEAF( _ s a v e _ f p _ c o n t e x t )
cfc1 t 1 , f c r31
2005-09-04 02:56:16 +04:00
# ifdef C O N F I G _ 6 4 B I T
2005-04-17 02:20:36 +04:00
/* Store the 16 odd double precision registers */
EX s d c1 $ f1 , S C _ F P R E G S + 8 ( a0 )
EX s d c1 $ f3 , S C _ F P R E G S + 2 4 ( a0 )
EX s d c1 $ f5 , S C _ F P R E G S + 4 0 ( a0 )
EX s d c1 $ f7 , S C _ F P R E G S + 5 6 ( a0 )
EX s d c1 $ f9 , S C _ F P R E G S + 7 2 ( a0 )
EX s d c1 $ f11 , S C _ F P R E G S + 8 8 ( a0 )
EX s d c1 $ f13 , S C _ F P R E G S + 1 0 4 ( a0 )
EX s d c1 $ f15 , S C _ F P R E G S + 1 2 0 ( a0 )
EX s d c1 $ f17 , S C _ F P R E G S + 1 3 6 ( a0 )
EX s d c1 $ f19 , S C _ F P R E G S + 1 5 2 ( a0 )
EX s d c1 $ f21 , S C _ F P R E G S + 1 6 8 ( a0 )
EX s d c1 $ f23 , S C _ F P R E G S + 1 8 4 ( a0 )
EX s d c1 $ f25 , S C _ F P R E G S + 2 0 0 ( a0 )
EX s d c1 $ f27 , S C _ F P R E G S + 2 1 6 ( a0 )
EX s d c1 $ f29 , S C _ F P R E G S + 2 3 2 ( a0 )
EX s d c1 $ f31 , S C _ F P R E G S + 2 4 8 ( a0 )
# endif
/* Store the 16 even double precision registers */
EX s d c1 $ f0 , S C _ F P R E G S + 0 ( a0 )
EX s d c1 $ f2 , S C _ F P R E G S + 1 6 ( a0 )
EX s d c1 $ f4 , S C _ F P R E G S + 3 2 ( a0 )
EX s d c1 $ f6 , S C _ F P R E G S + 4 8 ( a0 )
EX s d c1 $ f8 , S C _ F P R E G S + 6 4 ( a0 )
EX s d c1 $ f10 , S C _ F P R E G S + 8 0 ( a0 )
EX s d c1 $ f12 , S C _ F P R E G S + 9 6 ( a0 )
EX s d c1 $ f14 , S C _ F P R E G S + 1 1 2 ( a0 )
EX s d c1 $ f16 , S C _ F P R E G S + 1 2 8 ( a0 )
EX s d c1 $ f18 , S C _ F P R E G S + 1 4 4 ( a0 )
EX s d c1 $ f20 , S C _ F P R E G S + 1 6 0 ( a0 )
EX s d c1 $ f22 , S C _ F P R E G S + 1 7 6 ( a0 )
EX s d c1 $ f24 , S C _ F P R E G S + 1 9 2 ( a0 )
EX s d c1 $ f26 , S C _ F P R E G S + 2 0 8 ( a0 )
EX s d c1 $ f28 , S C _ F P R E G S + 2 2 4 ( a0 )
EX s d c1 $ f30 , S C _ F P R E G S + 2 4 0 ( a0 )
EX s w t 1 , S C _ F P C _ C S R ( a0 )
jr r a
li v0 , 0 # s u c c e s s
END( _ s a v e _ f p _ c o n t e x t )
# ifdef C O N F I G _ M I P S 3 2 _ C O M P A T
/* Save 32-bit process floating point context */
LEAF( _ s a v e _ f p _ c o n t e x t 3 2 )
cfc1 t 1 , f c r31
EX s d c1 $ f0 , S C 3 2 _ F P R E G S + 0 ( a0 )
EX s d c1 $ f2 , S C 3 2 _ F P R E G S + 1 6 ( a0 )
EX s d c1 $ f4 , S C 3 2 _ F P R E G S + 3 2 ( a0 )
EX s d c1 $ f6 , S C 3 2 _ F P R E G S + 4 8 ( a0 )
EX s d c1 $ f8 , S C 3 2 _ F P R E G S + 6 4 ( a0 )
EX s d c1 $ f10 , S C 3 2 _ F P R E G S + 8 0 ( a0 )
EX s d c1 $ f12 , S C 3 2 _ F P R E G S + 9 6 ( a0 )
EX s d c1 $ f14 , S C 3 2 _ F P R E G S + 1 1 2 ( a0 )
EX s d c1 $ f16 , S C 3 2 _ F P R E G S + 1 2 8 ( a0 )
EX s d c1 $ f18 , S C 3 2 _ F P R E G S + 1 4 4 ( a0 )
EX s d c1 $ f20 , S C 3 2 _ F P R E G S + 1 6 0 ( a0 )
EX s d c1 $ f22 , S C 3 2 _ F P R E G S + 1 7 6 ( a0 )
EX s d c1 $ f24 , S C 3 2 _ F P R E G S + 1 9 2 ( a0 )
EX s d c1 $ f26 , S C 3 2 _ F P R E G S + 2 0 8 ( a0 )
EX s d c1 $ f28 , S C 3 2 _ F P R E G S + 2 2 4 ( a0 )
EX s d c1 $ f30 , S C 3 2 _ F P R E G S + 2 4 0 ( a0 )
EX s w t 1 , S C 3 2 _ F P C _ C S R ( a0 )
cfc1 t 0 , $ 0 # i m p l e m e n t a t i o n / v e r s i o n
EX s w t 0 , S C 3 2 _ F P C _ E I R ( a0 )
jr r a
li v0 , 0 # s u c c e s s
END( _ s a v e _ f p _ c o n t e x t 3 2 )
# endif
/ *
* Restore F P U s t a t e :
* - fp g p r e g i s t e r s
* - cp1 s t a t u s / c o n t r o l r e g i s t e r
* /
LEAF( _ r e s t o r e _ f p _ c o n t e x t )
EX l w t 0 , S C _ F P C _ C S R ( a0 )
2005-09-04 02:56:16 +04:00
# ifdef C O N F I G _ 6 4 B I T
2005-04-17 02:20:36 +04:00
EX l d c1 $ f1 , S C _ F P R E G S + 8 ( a0 )
EX l d c1 $ f3 , S C _ F P R E G S + 2 4 ( a0 )
EX l d c1 $ f5 , S C _ F P R E G S + 4 0 ( a0 )
EX l d c1 $ f7 , S C _ F P R E G S + 5 6 ( a0 )
EX l d c1 $ f9 , S C _ F P R E G S + 7 2 ( a0 )
EX l d c1 $ f11 , S C _ F P R E G S + 8 8 ( a0 )
EX l d c1 $ f13 , S C _ F P R E G S + 1 0 4 ( a0 )
EX l d c1 $ f15 , S C _ F P R E G S + 1 2 0 ( a0 )
EX l d c1 $ f17 , S C _ F P R E G S + 1 3 6 ( a0 )
EX l d c1 $ f19 , S C _ F P R E G S + 1 5 2 ( a0 )
EX l d c1 $ f21 , S C _ F P R E G S + 1 6 8 ( a0 )
EX l d c1 $ f23 , S C _ F P R E G S + 1 8 4 ( a0 )
EX l d c1 $ f25 , S C _ F P R E G S + 2 0 0 ( a0 )
EX l d c1 $ f27 , S C _ F P R E G S + 2 1 6 ( a0 )
EX l d c1 $ f29 , S C _ F P R E G S + 2 3 2 ( a0 )
EX l d c1 $ f31 , S C _ F P R E G S + 2 4 8 ( a0 )
# endif
EX l d c1 $ f0 , S C _ F P R E G S + 0 ( a0 )
EX l d c1 $ f2 , S C _ F P R E G S + 1 6 ( a0 )
EX l d c1 $ f4 , S C _ F P R E G S + 3 2 ( a0 )
EX l d c1 $ f6 , S C _ F P R E G S + 4 8 ( a0 )
EX l d c1 $ f8 , S C _ F P R E G S + 6 4 ( a0 )
EX l d c1 $ f10 , S C _ F P R E G S + 8 0 ( a0 )
EX l d c1 $ f12 , S C _ F P R E G S + 9 6 ( a0 )
EX l d c1 $ f14 , S C _ F P R E G S + 1 1 2 ( a0 )
EX l d c1 $ f16 , S C _ F P R E G S + 1 2 8 ( a0 )
EX l d c1 $ f18 , S C _ F P R E G S + 1 4 4 ( a0 )
EX l d c1 $ f20 , S C _ F P R E G S + 1 6 0 ( a0 )
EX l d c1 $ f22 , S C _ F P R E G S + 1 7 6 ( a0 )
EX l d c1 $ f24 , S C _ F P R E G S + 1 9 2 ( a0 )
EX l d c1 $ f26 , S C _ F P R E G S + 2 0 8 ( a0 )
EX l d c1 $ f28 , S C _ F P R E G S + 2 2 4 ( a0 )
EX l d c1 $ f30 , S C _ F P R E G S + 2 4 0 ( a0 )
ctc1 t 0 , f c r31
jr r a
li v0 , 0 # s u c c e s s
END( _ r e s t o r e _ f p _ c o n t e x t )
# ifdef C O N F I G _ M I P S 3 2 _ C O M P A T
LEAF( _ r e s t o r e _ f p _ c o n t e x t 3 2 )
/* Restore an o32 sigcontext. */
EX l w t 0 , S C 3 2 _ F P C _ C S R ( a0 )
EX l d c1 $ f0 , S C 3 2 _ F P R E G S + 0 ( a0 )
EX l d c1 $ f2 , S C 3 2 _ F P R E G S + 1 6 ( a0 )
EX l d c1 $ f4 , S C 3 2 _ F P R E G S + 3 2 ( a0 )
EX l d c1 $ f6 , S C 3 2 _ F P R E G S + 4 8 ( a0 )
EX l d c1 $ f8 , S C 3 2 _ F P R E G S + 6 4 ( a0 )
EX l d c1 $ f10 , S C 3 2 _ F P R E G S + 8 0 ( a0 )
EX l d c1 $ f12 , S C 3 2 _ F P R E G S + 9 6 ( a0 )
EX l d c1 $ f14 , S C 3 2 _ F P R E G S + 1 1 2 ( a0 )
EX l d c1 $ f16 , S C 3 2 _ F P R E G S + 1 2 8 ( a0 )
EX l d c1 $ f18 , S C 3 2 _ F P R E G S + 1 4 4 ( a0 )
EX l d c1 $ f20 , S C 3 2 _ F P R E G S + 1 6 0 ( a0 )
EX l d c1 $ f22 , S C 3 2 _ F P R E G S + 1 7 6 ( a0 )
EX l d c1 $ f24 , S C 3 2 _ F P R E G S + 1 9 2 ( a0 )
EX l d c1 $ f26 , S C 3 2 _ F P R E G S + 2 0 8 ( a0 )
EX l d c1 $ f28 , S C 3 2 _ F P R E G S + 2 2 4 ( a0 )
EX l d c1 $ f30 , S C 3 2 _ F P R E G S + 2 4 0 ( a0 )
ctc1 t 0 , f c r31
jr r a
li v0 , 0 # s u c c e s s
END( _ r e s t o r e _ f p _ c o n t e x t 3 2 )
# endif
2007-02-01 22:54:13 +03:00
.set reorder
2005-04-17 02:20:36 +04:00
.type fault@function
.ent fault
fault : li v0 , - E F A U L T # f a i l u r e
jr r a
.end fault