| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gniibe Exp $ | 
|  | 2 | * | 
|  | 3 | * "strlen" implementation of SuperH | 
|  | 4 | * | 
|  | 5 | * Copyright (C) 1999  Kaz Kojima | 
|  | 6 | * | 
|  | 7 | */ | 
|  | 8 |  | 
|  | 9 | /* size_t strlen (const char *s)  */ | 
|  | 10 |  | 
|  | 11 | #include <linux/linkage.h> | 
|  | 12 | ENTRY(strlen) | 
|  | 13 | mov	r4,r0 | 
|  | 14 | and	#3,r0 | 
|  | 15 | tst	r0,r0 | 
|  | 16 | bt/s	1f | 
|  | 17 | mov	#0,r2 | 
|  | 18 |  | 
|  | 19 | add	#-1,r0 | 
|  | 20 | shll2	r0 | 
|  | 21 | shll	r0 | 
|  | 22 | braf	r0 | 
|  | 23 | nop | 
|  | 24 |  | 
|  | 25 | mov.b	@r4+,r1 | 
|  | 26 | tst	r1,r1 | 
|  | 27 | bt	8f | 
|  | 28 | add	#1,r2 | 
|  | 29 |  | 
|  | 30 | mov.b	@r4+,r1 | 
|  | 31 | tst	r1,r1 | 
|  | 32 | bt	8f | 
|  | 33 | add	#1,r2 | 
|  | 34 |  | 
|  | 35 | mov.b	@r4+,r1 | 
|  | 36 | tst	r1,r1 | 
|  | 37 | bt	8f | 
|  | 38 | add	#1,r2 | 
|  | 39 |  | 
|  | 40 | 1: | 
|  | 41 | mov	#0,r3 | 
|  | 42 | 2: | 
|  | 43 | mov.l	@r4+,r1 | 
|  | 44 | cmp/str	r3,r1 | 
|  | 45 | bf/s	2b | 
|  | 46 | add	#4,r2 | 
|  | 47 |  | 
|  | 48 | add	#-4,r2 | 
|  | 49 | #ifndef __LITTLE_ENDIAN__ | 
|  | 50 | swap.b	r1,r1 | 
|  | 51 | swap.w	r1,r1 | 
|  | 52 | swap.b	r1,r1 | 
|  | 53 | #endif | 
|  | 54 | extu.b	r1,r0 | 
|  | 55 | tst	r0,r0 | 
|  | 56 | bt/s	8f | 
|  | 57 | shlr8	r1 | 
|  | 58 | add	#1,r2 | 
|  | 59 | extu.b	r1,r0 | 
|  | 60 | tst	r0,r0 | 
|  | 61 | bt/s	8f | 
|  | 62 | shlr8	r1 | 
|  | 63 | add	#1,r2 | 
|  | 64 | extu.b	r1,r0 | 
|  | 65 | tst	r0,r0 | 
|  | 66 | bt	8f | 
|  | 67 | add	#1,r2 | 
|  | 68 | 8: | 
|  | 69 | rts | 
|  | 70 | mov	r2,r0 |