2005-04-16 15:20:36 -07: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 .
*
2013-03-25 13:41:47 -05:00
* Copyright ( C ) 1 9 9 6 , 1 9 9 8 , 1 9 9 9 , 2 0 0 4 b y R a l f B a e c h l e
* Copyright ( C ) 1 9 9 9 S i l i c o n G r a p h i c s , I n c .
* Copyright ( C ) 2 0 1 1 M I P S T e c h n o l o g i e s , I n c .
2005-04-16 15:20:36 -07:00
* /
# include < a s m / a s m . h >
2005-09-09 22:32:31 +02:00
# include < a s m / a s m - o f f s e t s . h >
2005-04-16 15:20:36 -07:00
# include < a s m / r e g d e f . h >
# define E X ( i n s n ,r e g ,a d d r ,h a n d l e r ) \
9 : insn r e g , a d d r ; \
.section _ _ ex_ t a b l e ," a " ; \
PTR 9 b , h a n d l e r ; \
.previous
/ *
* Return t h e s i z e o f a s t r i n g ( i n c l u d i n g t h e e n d i n g 0 )
*
* Return 0 f o r e r r o r
* /
2014-01-02 15:55:58 +00:00
.macro __BUILD_STRLEN_ASM func
LEAF( _ _ s t r l e n _ \ f u n c \ ( ) _ a s m )
2005-04-16 15:20:36 -07:00
LONG_ L v0 , T I _ A D D R _ L I M I T ( $ 2 8 ) # p o i n t e r o k ?
and v0 , a0
2014-01-02 15:55:58 +00:00
bnez v0 , . L f a u l t \ @
2005-04-16 15:20:36 -07:00
move v0 , a0
2014-01-02 16:04:38 +00:00
.ifeqs " \ func" , " k e r n e l "
2014-01-02 15:55:58 +00:00
1 : EX( l b u , v1 , ( v0 ) , . L f a u l t \ @)
2014-01-02 16:04:38 +00:00
.else
1 : EX( l b u e , v1 , ( v0 ) , . L f a u l t \ @)
.endif
2005-04-16 15:20:36 -07:00
PTR_ A D D I U v0 , 1
2013-03-25 13:41:47 -05:00
bnez v1 , 1 b
2005-04-16 15:20:36 -07:00
PTR_ S U B U v0 , a0
jr r a
2014-01-02 15:55:58 +00:00
END( _ _ s t r l e n _ \ f u n c \ ( ) _ a s m )
2005-04-16 15:20:36 -07:00
2014-01-02 15:55:58 +00:00
.Lfault \ @: move v0, zero
2005-04-16 15:20:36 -07:00
jr r a
2014-01-02 15:55:58 +00:00
.endm
2014-01-02 16:04:38 +00:00
# ifndef C O N F I G _ E V A
/* Set aliases */
.global __strlen_user_asm
.set _ _ strlen_ u s e r _ a s m , _ _ s t r l e n _ k e r n e l _ a s m
# endif
_ _ BUILD_ S T R L E N _ A S M k e r n e l
# ifdef C O N F I G _ E V A
.set push
.set eva
2014-01-02 15:55:58 +00:00
_ _ BUILD_ S T R L E N _ A S M u s e r
2014-01-02 16:04:38 +00:00
.set pop
# endif