2008-02-08 04:19:31 -08:00
/ * Optimised s i m p l e m e m o r y c h e c k s u m
*
* Copyright ( C ) 2 0 0 7 R e d H a t , I n c . A l l R i g h t s R e s e r v e d .
* Written b y D a v i d H o w e l l s ( d h o w e l l s @redhat.com)
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or
* modify i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n c e
* as p u b l i s h e d b y t h e F r e e S o f t w a r e F o u n d a t i o n ; either version
* 2 of t h e L i c e n c e , o r ( a t y o u r o p t i o n ) a n y l a t e r v e r s i o n .
* /
# include < a s m / c a c h e . h >
2010-10-27 17:28:53 +01:00
.section .text
.balign L1_CACHE_BYTES
2008-02-08 04:19:31 -08:00
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
#
2010-10-27 17:28:53 +01:00
# unsigned i n t d o _ c s u m ( c o n s t u n s i g n e d c h a r * b u f f , i n t l e n )
2008-02-08 04:19:31 -08:00
#
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
.globl do_csum
2010-10-27 17:28:53 +01:00
.type do_ c s u m ,@function
2008-02-08 04:19:31 -08:00
do_csum :
movm [ d2 ,d3 ] ,( s p )
mov d1 ,d2 # c o u n t
mov d0 ,a0 # b u f f
2010-10-27 17:28:53 +01:00
mov a0 ,a1
2008-02-08 04:19:31 -08:00
clr d1 # a c c u m u l a t o r
cmp + 0 ,d2
2010-10-27 17:28:53 +01:00
ble d o _ c s u m _ d o n e # c h e c k f o r z e r o l e n g t h o r n e g a t i v e
2008-02-08 04:19:31 -08:00
# 4 - byte a l i g n t h e b u f f e r p o i n t e r
btst + 3 ,a0
beq d o _ c s u m _ n o w _ 4 b _ a l i g n e d
btst + 1 ,a0
beq d o _ c s u m _ a d d r _ n o t _ o d d
movbu ( a0 ) ,d0
inc a0
asl + 8 ,d0
add d0 ,d1
add - 1 ,d2
2010-10-27 17:28:53 +01:00
do_csum_addr_not_odd :
2008-02-08 04:19:31 -08:00
cmp + 2 ,d2
bcs d o _ c s u m _ f e w e r _ t h a n _ 4
btst + 2 ,a0
beq d o _ c s u m _ n o w _ 4 b _ a l i g n e d
movhu ( a0 + ) ,d0
add d0 ,d1
add - 2 ,d2
cmp + 4 ,d2
bcs d o _ c s u m _ f e w e r _ t h a n _ 4
do_csum_now_4b_aligned :
# we w a n t t o c h e c k s u m a s m u c h a s w e c a n i n c h u n k s o f 3 2 b y t e s
cmp + 3 1 ,d2
bls d o _ c s u m _ r e m a i n d e r # 4 - b y t e a l i g n e d r e m a i n d e r
add - 3 2 ,d2
mov + 3 2 ,d3
do_csum_loop :
mov ( a0 + ) ,d0
mov ( a0 + ) ,e 0
mov ( a0 + ) ,e 1
mov ( a0 + ) ,e 3
2010-10-27 17:28:53 +01:00
add d0 ,d1
addc e 0 ,d1
addc e 1 ,d1
2008-02-08 04:19:31 -08:00
addc e 3 ,d1
mov ( a0 + ) ,d0
mov ( a0 + ) ,e 0
mov ( a0 + ) ,e 1
mov ( a0 + ) ,e 3
2010-10-27 17:28:53 +01:00
addc d0 ,d1
addc e 0 ,d1
addc e 1 ,d1
2008-02-08 04:19:31 -08:00
addc e 3 ,d1
addc + 0 ,d1
sub d3 ,d2
bcc d o _ c s u m _ l o o p
add d3 ,d2
beq d o _ c s u m _ d o n e
do_csum_remainder :
# cut 1 6 - 3 1 b y t e s d o w n t o 0 - 1 5
cmp + 1 6 ,d2
bcs d o _ c s u m _ f e w e r _ t h a n _ 1 6
mov ( a0 + ) ,d0
mov ( a0 + ) ,e 0
mov ( a0 + ) ,e 1
mov ( a0 + ) ,e 3
2010-10-27 17:28:53 +01:00
add d0 ,d1
addc e 0 ,d1
addc e 1 ,d1
2008-02-08 04:19:31 -08:00
addc e 3 ,d1
addc + 0 ,d1
add - 1 6 ,d2
beq d o _ c s u m _ d o n e
do_csum_fewer_than_16 :
# copy t h e r e m a i n i n g w h o l e w o r d s
cmp + 4 ,d2
bcs d o _ c s u m _ f e w e r _ t h a n _ 4
cmp + 8 ,d2
bcs d o _ c s u m _ o n e _ w o r d
cmp + 1 2 ,d2
bcs d o _ c s u m _ t w o _ w o r d s
mov ( a0 + ) ,d0
add d0 ,d1
addc + 0 ,d1
do_csum_two_words :
mov ( a0 + ) ,d0
add d0 ,d1
addc + 0 ,d1
do_csum_one_word :
mov ( a0 + ) ,d0
add d0 ,d1
addc + 0 ,d1
do_csum_fewer_than_4 :
and + 3 ,d2
beq d o _ c s u m _ d o n e
xor_ c m p d0 ,d0 ,+ 2 ,d2
bcs d o _ c s u m _ f e w e r _ t h a n _ 2
movhu ( a0 + ) ,d0
and + 1 ,d2
beq d o _ c s u m _ a d d _ l a s t _ b i t
2010-10-27 17:28:53 +01:00
do_csum_fewer_than_2 :
2008-02-08 04:19:31 -08:00
movbu ( a0 ) ,d3
add d3 ,d0
do_csum_add_last_bit :
add d0 ,d1
addc + 0 ,d1
do_csum_done :
# compress t h e c h e c k s u m d o w n t o 1 6 b i t s
2010-10-27 17:28:53 +01:00
mov + 0 x f f f f00 0 0 ,d0
and d1 ,d0
2008-02-08 04:19:31 -08:00
asl + 1 6 ,d1
2010-10-27 17:28:53 +01:00
add d1 ,d0
2008-02-08 04:19:31 -08:00
addc + 0 x f f f f ,d0
lsr + 1 6 ,d0
# flip t h e h a l v e s o f t h e w o r d r e s u l t i f t h e b u f f e r w a s o d d l y a l i g n e d
2010-10-27 17:28:53 +01:00
and + 1 ,a1
2008-02-08 04:19:31 -08:00
beq d o _ c s u m _ n o t _ o d d l y _ a l i g n e d
swaph d0 ,d0 # e x c h a n g e b i t s 15 : 8 w i t h 7 : 0
do_csum_not_oddly_aligned :
ret [ d2 ,d3 ] ,8
2010-10-27 17:28:53 +01:00
.size do_ c s u m , . - d o _ c s u m