2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2005-04-16 15:20:36 -07:00
/ *
* linux/ a r c h / a r m / l i b / i o - r e a d s b . S
*
* Copyright ( C ) 1 9 9 5 - 2 0 0 0 R u s s e l l K i n g
* /
# include < l i n u x / l i n k a g e . h >
# include < a s m / a s s e m b l e r . h >
2005-11-11 21:51:48 +00:00
.Linsb_align : rsb i p , i p , #4
2005-04-16 15:20:36 -07:00
cmp i p , r2
movgt i p , r2
cmp i p , #2
ldrb r3 , [ r0 ]
strb r3 , [ r1 ] , #1
2019-02-18 00:57:38 +01:00
ldrbge r3 , [ r0 ]
strbge r3 , [ r1 ] , #1
ldrbgt r3 , [ r0 ]
strbgt r3 , [ r1 ] , #1
2005-04-16 15:20:36 -07:00
subs r2 , r2 , i p
2005-11-11 21:51:48 +00:00
bne . L i n s b _ a l i g n e d
2005-04-16 15:20:36 -07:00
ENTRY( _ _ r a w _ r e a d s b )
teq r2 , #0 @ do we have to check for the zero len?
2014-06-30 16:29:12 +01:00
reteq l r
2005-04-16 15:20:36 -07:00
ands i p , r1 , #3
2005-11-11 21:51:48 +00:00
bne . L i n s b _ a l i g n
2005-04-16 15:20:36 -07:00
2005-11-11 21:51:48 +00:00
.Linsb_aligned : stmfd s p ! , { r4 - r6 , l r }
2005-04-16 15:20:36 -07:00
subs r2 , r2 , #16
2005-11-11 21:51:48 +00:00
bmi . L i n s b _ n o _ 1 6
2005-04-16 15:20:36 -07:00
2005-11-11 21:51:48 +00:00
.Linsb_16_lp : ldrb r3 , [ r0 ]
2005-04-16 15:20:36 -07:00
ldrb r4 , [ r0 ]
ldrb r5 , [ r0 ]
mov r3 , r3 , p u t _ b y t e _ 0
ldrb r6 , [ r0 ]
orr r3 , r3 , r4 , p u t _ b y t e _ 1
ldrb r4 , [ r0 ]
orr r3 , r3 , r5 , p u t _ b y t e _ 2
ldrb r5 , [ r0 ]
orr r3 , r3 , r6 , p u t _ b y t e _ 3
ldrb r6 , [ r0 ]
mov r4 , r4 , p u t _ b y t e _ 0
ldrb i p , [ r0 ]
orr r4 , r4 , r5 , p u t _ b y t e _ 1
ldrb r5 , [ r0 ]
orr r4 , r4 , r6 , p u t _ b y t e _ 2
ldrb r6 , [ r0 ]
orr r4 , r4 , i p , p u t _ b y t e _ 3
ldrb i p , [ r0 ]
mov r5 , r5 , p u t _ b y t e _ 0
ldrb l r , [ r0 ]
orr r5 , r5 , r6 , p u t _ b y t e _ 1
ldrb r6 , [ r0 ]
orr r5 , r5 , i p , p u t _ b y t e _ 2
ldrb i p , [ r0 ]
orr r5 , r5 , l r , p u t _ b y t e _ 3
ldrb l r , [ r0 ]
mov r6 , r6 , p u t _ b y t e _ 0
orr r6 , r6 , i p , p u t _ b y t e _ 1
ldrb i p , [ r0 ]
orr r6 , r6 , l r , p u t _ b y t e _ 2
orr r6 , r6 , i p , p u t _ b y t e _ 3
stmia r1 ! , { r3 - r6 }
subs r2 , r2 , #16
2005-11-11 21:51:48 +00:00
bpl . L i n s b _ 1 6 _ l p
2005-04-16 15:20:36 -07:00
tst r2 , #15
2019-02-18 00:57:38 +01:00
ldmfdeq s p ! , { r4 - r6 , p c }
2005-04-16 15:20:36 -07:00
2005-11-11 21:51:48 +00:00
.Linsb_no_16 : tst r2 , #8
beq . L i n s b _ n o _ 8
2005-04-16 15:20:36 -07:00
ldrb r3 , [ r0 ]
ldrb r4 , [ r0 ]
ldrb r5 , [ r0 ]
mov r3 , r3 , p u t _ b y t e _ 0
ldrb r6 , [ r0 ]
orr r3 , r3 , r4 , p u t _ b y t e _ 1
ldrb r4 , [ r0 ]
orr r3 , r3 , r5 , p u t _ b y t e _ 2
ldrb r5 , [ r0 ]
orr r3 , r3 , r6 , p u t _ b y t e _ 3
ldrb r6 , [ r0 ]
mov r4 , r4 , p u t _ b y t e _ 0
ldrb i p , [ r0 ]
orr r4 , r4 , r5 , p u t _ b y t e _ 1
orr r4 , r4 , r6 , p u t _ b y t e _ 2
orr r4 , r4 , i p , p u t _ b y t e _ 3
stmia r1 ! , { r3 , r4 }
2005-11-11 21:51:48 +00:00
.Linsb_no_8 : tst r2 , #4
beq . L i n s b _ n o _ 4
2005-04-16 15:20:36 -07:00
ldrb r3 , [ r0 ]
ldrb r4 , [ r0 ]
ldrb r5 , [ r0 ]
ldrb r6 , [ r0 ]
mov r3 , r3 , p u t _ b y t e _ 0
orr r3 , r3 , r4 , p u t _ b y t e _ 1
orr r3 , r3 , r5 , p u t _ b y t e _ 2
orr r3 , r3 , r6 , p u t _ b y t e _ 3
str r3 , [ r1 ] , #4
2005-11-11 21:51:48 +00:00
.Linsb_no_4 : ands r2 , r2 , #3
2019-02-18 00:57:38 +01:00
ldmfdeq s p ! , { r4 - r6 , p c }
2005-04-16 15:20:36 -07:00
cmp r2 , #2
ldrb r3 , [ r0 ]
strb r3 , [ r1 ] , #1
2019-02-18 00:57:38 +01:00
ldrbge r3 , [ r0 ]
strbge r3 , [ r1 ] , #1
ldrbgt r3 , [ r0 ]
strbgt r3 , [ r1 ]
2005-04-16 15:20:36 -07:00
2006-06-25 11:23:45 +01:00
ldmfd s p ! , { r4 - r6 , p c }
2008-08-28 11:22:32 +01:00
ENDPROC( _ _ r a w _ r e a d s b )