1
2
3
4 #include <linux/linkage.h>
5 #include "sysdep.h"
6
7 ENTRY(memcmp)
8
9 mov r3, r0
10 movi r0, 0
11 mov r12, r4
12 cmplti r2, 4
13 bt .L_compare_by_byte
14
15 andi r13, r0, 3
16 movi r19, 4
17
18
19 bnez r13, .L_s1_not_aligned
20
21 LABLE_ALIGN
22 .L_s1_aligned:
23
24 zext r18, r2, 31, 4
25
26 bez r18, .L_compare_by_word
27
28 .L_compare_by_4word:
29
30 ldw r20, (r3, 0)
31 ldw r21, (r1, 0)
32
33 cmpne r20, r21
34 bt .L_byte_check
35
36 ldw r20, (r3, 4)
37 ldw r21, (r1, 4)
38 cmpne r20, r21
39 bt .L_byte_check
40
41 ldw r20, (r3, 8)
42 ldw r21, (r1, 8)
43 cmpne r20, r21
44 bt .L_byte_check
45
46 ldw r20, (r3, 12)
47 ldw r21, (r1, 12)
48 cmpne r20, r21
49 bt .L_byte_check
50
51 PRE_BNEZAD (r18)
52 addi a3, 16
53 addi a1, 16
54
55 BNEZAD (r18, .L_compare_by_4word)
56
57 .L_compare_by_word:
58 zext r18, r2, 3, 2
59 bez r18, .L_compare_by_byte
60 .L_compare_by_word_loop:
61 ldw r20, (r3, 0)
62 ldw r21, (r1, 0)
63 addi r3, 4
64 PRE_BNEZAD (r18)
65 cmpne r20, r21
66 addi r1, 4
67 bt .L_byte_check
68 BNEZAD (r18, .L_compare_by_word_loop)
69
70 .L_compare_by_byte:
71 zext r18, r2, 1, 0
72 bez r18, .L_return
73 .L_compare_by_byte_loop:
74 ldb r0, (r3, 0)
75 ldb r4, (r1, 0)
76 addi r3, 1
77 subu r0, r4
78 PRE_BNEZAD (r18)
79 addi r1, 1
80 bnez r0, .L_return
81 BNEZAD (r18, .L_compare_by_byte_loop)
82
83 .L_return:
84 mov r4, r12
85 rts
86
87 # ifdef __CSKYBE__
88
89 .L_byte_check:
90 xtrb0 r0, r20
91 xtrb0 r2, r21
92 subu r0, r2
93 bnez r0, .L_return
94
95
96 xtrb1 r0, r20
97 xtrb1 r2, r21
98 subu r0, r2
99 bnez r0, .L_return
100
101
102 xtrb2 r0, r20
103 xtrb2 r2, r21
104 subu r0, r2
105 bnez r0, .L_return
106
107
108 xtrb3 r0, r20
109 xtrb3 r2, r21
110 subu r0, r2
111 # else
112
113 .L_byte_check:
114 xtrb3 r0, r20
115 xtrb3 r2, r21
116 subu r0, r2
117 bnez r0, .L_return
118
119
120 xtrb2 r0, r20
121 xtrb2 r2, r21
122 subu r0, r2
123 bnez r0, .L_return
124
125
126 xtrb1 r0, r20
127 xtrb1 r2, r21
128 subu r0, r2
129 bnez r0, .L_return
130
131
132 xtrb0 r0, r20
133 xtrb0 r2, r21
134 subu r0, r2
135 br .L_return
136 # endif
137
138
139 .L_s1_not_aligned:
140 sub r13, r19, r13
141 sub r2, r13
142 .L_s1_not_aligned_loop:
143 ldb r0, (r3, 0)
144 ldb r4, (r1, 0)
145 addi r3, 1
146 subu r0, r4
147 PRE_BNEZAD (r13)
148 addi r1, 1
149 bnez r0, .L_return
150 BNEZAD (r13, .L_s1_not_aligned_loop)
151 br .L_s1_aligned
152 ENDPROC(memcmp)