78 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			1.3 KiB
			
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /*
 | |
|  * Copyright (C) 2014-15 Synopsys, Inc. (www.synopsys.com)
 | |
|  *
 | |
|  * This program is free software; you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License version 2 as
 | |
|  * published by the Free Software Foundation.
 | |
|  */
 | |
| 
 | |
| #include <linux/linkage.h>
 | |
| 
 | |
| ENTRY(strcmp)
 | |
| 	or	r2, r0, r1
 | |
| 	bmsk_s	r2, r2, 1
 | |
| 	brne	r2, 0, @.Lcharloop
 | |
| 
 | |
| ;;; s1 and s2 are word aligned
 | |
| 	ld.ab	r2, [r0, 4]
 | |
| 
 | |
| 	mov_s	r12, 0x01010101
 | |
| 	ror	r11, r12
 | |
| 	.align  4
 | |
| .LwordLoop:
 | |
| 	ld.ab	r3, [r1, 4]
 | |
| 	;; Detect NULL char in str1
 | |
| 	sub	r4, r2, r12
 | |
| 	ld.ab	r5, [r0, 4]
 | |
| 	bic	r4, r4, r2
 | |
| 	and	r4, r4, r11
 | |
| 	brne.d.nt	r4, 0, .LfoundNULL
 | |
| 	;; Check if the read locations are the same
 | |
| 	cmp	r2, r3
 | |
| 	beq.d	.LwordLoop
 | |
| 	mov.eq	r2, r5
 | |
| 
 | |
| 	;; A match is found, spot it out
 | |
| #ifdef __LITTLE_ENDIAN__
 | |
| 	swape	r3, r3
 | |
| 	mov_s	r0, 1
 | |
| 	swape	r2, r2
 | |
| #else
 | |
| 	mov_s	r0, 1
 | |
| #endif
 | |
| 	cmp_s	r2, r3
 | |
| 	j_s.d	[blink]
 | |
| 	bset.lo	r0, r0, 31
 | |
| 
 | |
| 	.align 4
 | |
| .LfoundNULL:
 | |
| #ifdef __BIG_ENDIAN__
 | |
| 	swape	r4, r4
 | |
| 	swape	r2, r2
 | |
| 	swape	r3, r3
 | |
| #endif
 | |
| 	;; Find null byte
 | |
| 	ffs	r0, r4
 | |
| 	bmsk	r2, r2, r0
 | |
| 	bmsk	r3, r3, r0
 | |
| 	swape	r2, r2
 | |
| 	swape	r3, r3
 | |
| 	;; make the return value
 | |
| 	sub.f	r0, r2, r3
 | |
| 	mov.hi	r0, 1
 | |
| 	j_s.d	[blink]
 | |
| 	bset.lo	r0, r0, 31
 | |
| 
 | |
| 	.align 4
 | |
| .Lcharloop:
 | |
| 	ldb.ab	r2, [r0, 1]
 | |
| 	ldb.ab	r3, [r1, 1]
 | |
| 	nop
 | |
| 	breq	r2, 0, .Lcmpend
 | |
| 	breq	r2, r3, .Lcharloop
 | |
| 
 | |
| 	.align 4
 | |
| .Lcmpend:
 | |
| 	j_s.d	[blink]
 | |
| 	sub	r0, r2, r3
 | |
| END(strcmp)
 | 
