2019-05-27 09:55:01 +03:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2015-02-06 15:41:51 +03:00
/ *
* OpenRISC m e m s e t . S
*
* Hand- o p t i m i z e d a s s e m b l e r v e r s i o n o f m e m s e t f o r O p e n R I S C .
* Algorithm i n s p i r e d b y s e v e r a l o t h e r a r c h - s p e c i f i c m e m s e t r o u t i n e s
* in t h e k e r n e l t r e e
*
* Copyright ( C ) 2 0 1 5 O l o f K i n d g r e n < o l o f . k i n d g r e n @gmail.com>
* /
.global memset
.type memset, @function
memset :
/ * arguments :
* r3 = * s
* r4 = c
* r5 = n
* r1 3 , r15 , r17 , r19 u s e d a s t e m p r e g s
* /
/* Exit if n == 0 */
l. s f e q i r5 , 0
l. b f 4 f
/* Truncate c to char */
l. a n d i r13 , r4 , 0 x f f
/* Skip word extension if c is 0 */
l. s f e q i r13 , 0
l. b f 1 f
/* Check for at least two whole words (8 bytes) */
l. s f l e u i r5 , 7
/* Extend char c to 32-bit word cccc in r13 */
l. s l l i r15 , r13 , 1 6 / / r13 = 0 0 0 c , r15 = 0 c00
l. o r r13 , r13 , r15 / / r13 = 0 c0 c , r15 = 0 c00
l. s l l i r15 , r13 , 8 / / r13 = 0 c0 c , r15 = c0 c0
l. o r r13 , r13 , r15 / / r13 = c c c c , r15 = c0 c0
1 : l. a d d i r19 , r3 , 0 / / S e t r19 = s r c
/* Jump to byte copy loop if less than two words */
l. b f 3 f
l. o r r17 , r5 , r0 / / S e t r17 = n
/* Mask out two LSBs to check alignment */
l. a n d i r15 , r3 , 0 x3
/* lsb == 00, jump to word copy loop */
l. s f e q i r15 , 0
l. b f 2 f
l. a d d i r19 , r3 , 0 / / S e t r19 = s r c
/* lsb == 01,10 or 11 */
l. s b 0 ( r3 ) , r13 / / * s r c = c
l. a d d i r17 , r17 , - 1 / / D e c r e a s e n
l. s f e q i r15 , 3
l. b f 2 f
l. a d d i r19 , r3 , 1 / / s r c + = 1
/* lsb == 01 or 10 */
l. s b 1 ( r3 ) , r13 / / * ( s r c + 1 ) = c
l. a d d i r17 , r17 , - 1 / / D e c r e a s e n
l. s f e q i r15 , 2
l. b f 2 f
l. a d d i r19 , r3 , 2 / / s r c + = 2
/* lsb == 01 */
l. s b 2 ( r3 ) , r13 / / * ( s r c + 2 ) = c
l. a d d i r17 , r17 , - 1 / / D e c r e a s e n
l. a d d i r19 , r3 , 3 / / s r c + = 3
/* Word copy loop */
2 : l. s w 0 ( r19 ) , r13 / / * s r c = c c c c
l. a d d i r17 , r17 , - 4 / / D e c r e a s e n
l. s f g e u i r17 , 4
l. b f 2 b
l. a d d i r19 , r19 , 4 / / I n c r e a s e s r c
/* When n > 0, copy the remaining bytes, otherwise jump to exit */
l. s f e q i r17 , 0
l. b f 4 f
/* Byte copy loop */
3 : l. a d d i r17 , r17 , - 1 / / D e c r e a s e n
l. s b 0 ( r19 ) , r13 / / * s r c = c c c c
l. s f n e i r17 , 0
l. b f 3 b
l. a d d i r19 , r19 , 1 / / I n c r e a s e s r c
4 : l. j r r9
l. o r i r11 , r3 , 0