2014-11-21 13:39:25 +05:30
/ *
* Copyright ( C ) 2 0 1 4 - 1 5 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 )
*
* 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
* it 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 s e v e r s i o n 2 a s
* published 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 .
* /
# include < l i n u x / l i n k a g e . h >
# undef P R E A L L O C _ N O T _ A V A I L
2016-09-19 16:42:25 -07:00
ENTRY_ C F I ( m e m s e t )
2014-11-21 13:39:25 +05:30
prefetchw [ r0 ] ; Prefetch the write location
mov. f 0 , r2
;;; if size is zero
jz. d [ b l i n k ]
mov r3 , r0 ; don't clobber ret val
;;; if length < 8
brls. d . n t r2 , 8 , . L s m a l l c h u n k
mov. f l p _ c o u n t ,r2
and. f r4 , r0 , 0 x03
rsub l p _ c o u n t , r4 , 4
lpnz @.Laligndestination
;; LOOP BEGIN
stb. a b r1 , [ r3 ,1 ]
sub r2 , r2 , 1
.Laligndestination :
;;; Destination is aligned
and r1 , r1 , 0 x F F
asl r4 , r1 , 8
or r4 , r4 , r1
asl r5 , r4 , 1 6
or r5 , r5 , r4
mov r4 , r5
sub3 l p _ c o u n t , r2 , 8
cmp r2 , 6 4
bmsk. h i r2 , r2 , 5
mov. l s l p _ c o u n t , 0
add3 . h i r2 , r2 , 8
;;; Convert len to Dwords, unfold x8
lsr. f l p _ c o u n t , l p _ c o u n t , 6
2015-07-20 12:05:03 +03:00
2014-11-21 13:39:25 +05:30
lpnz @.Lset64bytes
;; LOOP START
2015-07-20 12:05:03 +03:00
# ifdef P R E A L L O C _ N O T _ A V A I L
prefetchw [ r3 , 6 4 ] ;Prefetch the next write location
# else
prealloc [ r3 , 6 4 ]
# endif
# ifdef C O N F I G _ A R C _ H A S _ L L 6 4
2014-11-21 13:39:25 +05:30
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
2015-07-20 12:05:03 +03:00
# else
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
# endif
2014-11-21 13:39:25 +05:30
.Lset64bytes :
lsr. f l p _ c o u n t , r2 , 5 ;Last remaining max 124 bytes
lpnz . L s e t 3 2 b y t e s
;; LOOP START
prefetchw [ r3 , 3 2 ] ;Prefetch the next write location
2015-07-20 12:05:03 +03:00
# ifdef C O N F I G _ A R C _ H A S _ L L 6 4
2014-11-21 13:39:25 +05:30
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
std. a b r4 , [ r3 , 8 ]
2015-07-20 12:05:03 +03:00
# else
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
st. a b r4 , [ r3 , 4 ]
# endif
2014-11-21 13:39:25 +05:30
.Lset32bytes :
and. f l p _ c o u n t , r2 , 0 x1 F ;Last remaining 31 bytes
.Lsmallchunk :
lpnz . L c o p y 3 b y t e s
;; LOOP START
stb. a b r1 , [ r3 , 1 ]
.Lcopy3bytes :
j [ b l i n k ]
2016-09-19 16:42:25 -07:00
END_ C F I ( m e m s e t )
2014-11-21 13:39:25 +05:30
2016-09-19 16:42:25 -07:00
ENTRY_ C F I ( m e m z e r o )
2014-11-21 13:39:25 +05:30
; adjust bzero args to memset args
mov r2 , r1
b. d m e m s e t ;tail call so need to tinker with blink
mov r1 , 0
2016-09-19 16:42:25 -07:00
END_ C F I ( m e m z e r o )