Blame view

kernel/linux-imx6_3.14.28/arch/arc/lib/strlen.S 1.43 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  /*
   * Copyright (C) 2004, 2007-2010, 2011-2012 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 <asm/linkage.h>
  
  ARC_ENTRY strlen
  	or	r3,r0,7
  	ld	r2,[r3,-7]
  	ld.a	r6,[r3,-3]
  	mov	r4,0x01010101
  	; uses long immediate
  #ifdef __LITTLE_ENDIAN__
  	asl_s	r1,r0,3
  	btst_s	r0,2
  	asl	r7,r4,r1
  	ror	r5,r4
  	sub	r1,r2,r7
  	bic_s	r1,r1,r2
  	mov.eq	r7,r4
  	sub	r12,r6,r7
  	bic	r12,r12,r6
  	or.eq	r12,r12,r1
  	and	r12,r12,r5
  	brne	r12,0,.Learly_end
  #else /* BIG ENDIAN */
  	ror	r5,r4
  	btst_s	r0,2
  	mov_s	r1,31
  	sub3	r7,r1,r0
  	sub	r1,r2,r4
  	bic_s	r1,r1,r2
  	bmsk	r1,r1,r7
  	sub	r12,r6,r4
  	bic	r12,r12,r6
  	bmsk.ne	r12,r12,r7
  	or.eq	r12,r12,r1
  	and	r12,r12,r5
  	brne	r12,0,.Learly_end
  #endif /* ENDIAN */
  
  .Loop:
  	ld_s	r2,[r3,4]
  	ld.a	r6,[r3,8]
  	; stall for load result
  	sub	r1,r2,r4
  	bic_s	r1,r1,r2
  	sub	r12,r6,r4
  	bic	r12,r12,r6
  	or	r12,r12,r1
  	and	r12,r12,r5
  	breq r12,0,.Loop
  .Lend:
  	and.f	r1,r1,r5
  	sub.ne	r3,r3,4
  	mov.eq	r1,r12
  #ifdef __LITTLE_ENDIAN__
  	sub_s	r2,r1,1
  	bic_s	r2,r2,r1
  	norm	r1,r2
  	sub_s	r0,r0,3
  	lsr_s	r1,r1,3
  	sub	    r0,r3,r0
  	j_s.d	[blink]
  	sub	    r0,r0,r1
  #else /* BIG ENDIAN */
  	lsr_s	r1,r1,7
  	mov.eq	r2,r6
  	bic_s	r1,r1,r2
  	norm	r1,r1
  	sub	    r0,r3,r0
  	lsr_s	r1,r1,3
  	j_s.d	[blink]
  	add	    r0,r0,r1
  #endif /* ENDIAN */
  .Learly_end:
  	b.d	.Lend
  	sub_s.ne r1,r1,r1
  ARC_EXIT strlen