2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2013-01-18 15:12:18 +05:30
/ *
* Copyright ( C ) 2 0 0 4 , 2 0 0 7 - 2 0 1 0 , 2 0 1 1 - 2 0 1 2 S y n o p s y s , I n c . ( w w w . s y n o p s y s . c o m )
* /
/ * ARC7 0 0 h a s a r e l a t i v e l y l o n g p i p e l i n e a n d b r a n c h p r e d i c t i o n , s o w e w a n t
to a v o i d b r a n c h e s t h a t a r e h a r d t o p r e d i c t . O n t h e o t h e r h a n d , t h e
presence o f t h e n o r m i n s t r u c t i o n m a k e s i t e a s i e r t o o p e r a t e o n w h o l e
words b r a n c h - f r e e . * /
2014-02-07 13:47:43 +05:30
# include < l i n u x / l i n k a g e . h >
2013-01-18 15:12:18 +05:30
2016-09-19 16:42:25 -07:00
ENTRY_ C F I ( s t r c h r )
2013-01-18 15:12:18 +05:30
extb_ s r1 ,r1
asl r5 ,r1 ,8
bmsk r2 ,r0 ,1
or r5 ,r5 ,r1
mov_ s r3 ,0 x01 0 1 0 1 0 1
breq. d r2 ,r0 ,. L a l i g n e d
asl r4 ,r5 ,1 6
sub_ s r0 ,r0 ,r2
asl r7 ,r2 ,3
ld_ s r2 ,[ r0 ]
# ifdef _ _ L I T T L E _ E N D I A N _ _
asl r7 ,r3 ,r7
# else
lsr r7 ,r3 ,r7
# endif
or r5 ,r5 ,r4
ror r4 ,r3
sub r12 ,r2 ,r7
bic_ s r12 ,r12 ,r2
and r12 ,r12 ,r4
brne. d r12 ,0 ,. L f o u n d0 _ u a
xor r6 ,r2 ,r5
ld. a r2 ,[ r0 ,4 ]
sub r12 ,r6 ,r7
bic r12 ,r12 ,r6
2013-08-24 12:03:06 +05:30
# ifdef _ _ L I T T L E _ E N D I A N _ _
2013-01-18 15:12:18 +05:30
and r7 ,r12 ,r4
breq r7 ,0 ,. L o o p ; For speed, we want this branch to be unaligned.
b . L f o u n d _ c h a r ; Likewise this one.
2013-08-24 12:03:06 +05:30
# else
and r12 ,r12 ,r4
breq r12 ,0 ,. L o o p ; For speed, we want this branch to be unaligned.
lsr_ s r12 ,r12 ,7
bic r2 ,r7 ,r6
b. d . L f o u n d _ c h a r _ b
and_ s r2 ,r2 ,r12
# endif
2013-01-18 15:12:18 +05:30
; /* We require this code address to be unaligned for speed... */
.Laligned :
ld_ s r2 ,[ r0 ]
or r5 ,r5 ,r4
ror r4 ,r3
; /* ... so that this code address is aligned, for itself and ... */
.Loop :
sub r12 ,r2 ,r3
bic_ s r12 ,r12 ,r2
and r12 ,r12 ,r4
brne. d r12 ,0 ,. L f o u n d0
xor r6 ,r2 ,r5
ld. a r2 ,[ r0 ,4 ]
sub r12 ,r6 ,r3
bic r12 ,r12 ,r6
and r7 ,r12 ,r4
breq r7 ,0 ,. L o o p / * . . . s o t h a t t h i s b r a n c h i s u n a l i g n e d . * /
; Found searched-for character. r0 has already advanced to next word.
# ifdef _ _ L I T T L E _ E N D I A N _ _
/ * We o n l y n e e d t h e i n f o r m a t i o n a b o u t t h e f i r s t m a t c h i n g b y t e
( i. e . t h e l e a s t s i g n i f i c a n t m a t c h i n g b y t e ) t o b e e x a c t ,
hence t h e r e i s n o p r o b l e m w i t h c a r r y e f f e c t s . * /
.Lfound_char :
sub r3 ,r7 ,1
bic r3 ,r3 ,r7
norm r2 ,r3
sub_ s r0 ,r0 ,1
asr_ s r2 ,r2 ,3
j. d [ b l i n k ]
sub_ s r0 ,r0 ,r2
.balign 4
.Lfound0_ua :
mov r3 ,r7
.Lfound0 :
sub r3 ,r6 ,r3
bic r3 ,r3 ,r6
and r2 ,r3 ,r4
or_ s r12 ,r12 ,r2
sub_ s r3 ,r12 ,1
bic_ s r3 ,r3 ,r12
norm r3 ,r3
add_ s r0 ,r0 ,3
asr_ s r12 ,r3 ,3
asl. f 0 ,r2 ,r3
sub_ s r0 ,r0 ,r12
j_ s . d [ b l i n k ]
mov. p l r0 ,0
# else / * B I G E N D I A N * /
.Lfound_char :
lsr r7 ,r7 ,7
bic r2 ,r7 ,r6
2013-08-24 12:03:06 +05:30
.Lfound_char_b :
2013-01-18 15:12:18 +05:30
norm r2 ,r2
sub_ s r0 ,r0 ,4
asr_ s r2 ,r2 ,3
j. d [ b l i n k ]
add_ s r0 ,r0 ,r2
.Lfound0_ua :
mov_ s r3 ,r7
.Lfound0 :
asl_ s r2 ,r2 ,7
or r7 ,r6 ,r4
bic_ s r12 ,r12 ,r2
sub r2 ,r7 ,r3
or r2 ,r2 ,r6
bic r12 ,r2 ,r12
bic. f r3 ,r4 ,r12
norm r3 ,r3
add. p l r3 ,r3 ,1
asr_ s r12 ,r3 ,3
asl. f 0 ,r2 ,r3
add_ s r0 ,r0 ,r12
j_ s . d [ b l i n k ]
mov. m i r0 ,0
# endif / * E N D I A N * /
2016-09-19 16:42:25 -07:00
END_ C F I ( s t r c h r )