memcpy.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:6k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/lib/memcpy.S
  3.  *
  4.  *  Copyright (C) 1995-1999 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  *
  10.  *  ASM optimised string functions
  11.  */
  12. #include <linux/linkage.h>
  13. #include <asm/assembler.h>
  14. .text
  15. #define ENTER
  16. mov ip,sp ;
  17. stmfd sp!,{r4-r9,fp,ip,lr,pc} ;
  18. sub fp,ip,#4
  19. #define EXIT
  20. LOADREGS(ea, fp, {r4 - r9, fp, sp, pc})
  21. #define EXITEQ
  22. LOADREGS(eqea, fp, {r4 - r9, fp, sp, pc})
  23. /*
  24.  * Prototype: void memcpy(void *to,const void *from,unsigned long n);
  25.  * ARM3: cant use memcopy here!!!
  26.  */
  27. ENTRY(memcpy)
  28. ENTRY(memmove)
  29. ENTER
  30. cmp r1, r0
  31. bcc 19f
  32. subs r2, r2, #4
  33. blt 6f
  34. ands ip, r0, #3
  35. bne 7f
  36. ands ip, r1, #3
  37. bne 8f
  38. 1: subs r2, r2, #8
  39. blt 5f
  40. subs r2, r2, #0x14
  41. blt 3f
  42. 2: ldmia r1!,{r3 - r9, ip}
  43. stmia r0!,{r3 - r9, ip}
  44. subs r2, r2, #32
  45. bge 2b
  46. cmn r2, #16
  47. ldmgeia r1!, {r3 - r6}
  48. stmgeia r0!, {r3 - r6}
  49. subge r2, r2, #0x10
  50. 3: adds r2, r2, #0x14
  51. 4: ldmgeia r1!, {r3 - r5}
  52. stmgeia r0!, {r3 - r5}
  53. subges r2, r2, #12
  54. bge 4b
  55. 5: adds r2, r2, #8
  56. blt 6f
  57. subs r2, r2, #4
  58. ldrlt r3, [r1], #4
  59. ldmgeia r1!, {r4, r5}
  60. strlt r3, [r0], #4
  61. stmgeia r0!, {r4, r5}
  62. subge r2, r2, #4
  63. 6: adds r2, r2, #4
  64. EXITEQ
  65. cmp r2, #2
  66. ldrb r3, [r1], #1
  67. ldrgeb r4, [r1], #1
  68. ldrgtb r5, [r1], #1
  69. strb r3, [r0], #1
  70. strgeb r4, [r0], #1
  71. strgtb r5, [r0], #1
  72. EXIT
  73. 7: rsb ip, ip, #4
  74. cmp ip, #2
  75. ldrb r3, [r1], #1
  76. ldrgeb r4, [r1], #1
  77. ldrgtb r5, [r1], #1
  78. strb r3, [r0], #1
  79. strgeb r4, [r0], #1
  80. strgtb r5, [r0], #1
  81. subs r2, r2, ip
  82. blt 6b
  83. ands ip, r1, #3
  84. beq 1b
  85. 8: bic r1, r1, #3
  86. ldr r7, [r1], #4
  87. cmp ip, #2
  88. bgt 15f
  89. beq 11f
  90. cmp r2, #12
  91. blt 10f
  92. sub r2, r2, #12
  93. 9: mov r3, r7, lsr #8
  94. ldmia r1!, {r4 - r7}
  95. orr r3, r3, r4, lsl #24
  96. mov r4, r4, lsr #8
  97. orr r4, r4, r5, lsl #24
  98. mov r5, r5, lsr #8
  99. orr r5, r5, r6, lsl #24
  100. mov r6, r6, lsr #8
  101. orr r6, r6, r7, lsl #24
  102. stmia r0!, {r3 - r6}
  103. subs r2, r2, #16
  104. bge 9b
  105. adds r2, r2, #12
  106. blt 100f
  107. 10: mov r3, r7, lsr #8
  108. ldr r7, [r1], #4
  109. subs r2, r2, #4
  110. orr r3, r3, r7, lsl #24
  111. str r3, [r0], #4
  112. bge 10b
  113. 100: sub r1, r1, #3
  114. b 6b
  115. 11: cmp r2, #12
  116. blt 13f /* */
  117. sub r2, r2, #12
  118. 12: mov r3, r7, lsr #16
  119. ldmia r1!, {r4 - r7}
  120. orr r3, r3, r4, lsl #16
  121. mov r4, r4, lsr #16
  122. orr r4, r4, r5, lsl #16
  123. mov r5, r5, lsr #16
  124. orr r5, r5, r6, lsl #16
  125. mov r6, r6, lsr #16
  126. orr r6, r6, r7,LSL#16
  127. stmia r0!, {r3 - r6}
  128. subs r2, r2, #16
  129. bge 12b
  130. adds r2, r2, #12
  131. blt 14f
  132. 13: mov r3, r7, lsr #16
  133. ldr r7, [r1], #4
  134. subs r2, r2, #4
  135. orr r3, r3, r7, lsl #16
  136. str r3, [r0], #4
  137. bge 13b
  138. 14: sub r1, r1, #2
  139. b 6b
  140. 15: cmp r2, #12
  141. blt 17f
  142. sub r2, r2, #12
  143. 16: mov r3, r7, lsr #24
  144. ldmia r1!,{r4 - r7}
  145. orr r3, r3, r4, lsl #8
  146. mov r4, r4, lsr #24
  147. orr r4, r4, r5, lsl #8
  148. mov r5, r5, lsr #24
  149. orr r5, r5, r6, lsl #8
  150. mov r6, r6, lsr #24
  151. orr r6, r6, r7, lsl #8
  152. stmia r0!, {r3 - r6}
  153. subs r2, r2, #16
  154. bge 16b
  155. adds r2, r2, #12
  156. blt 18f
  157. 17: mov r3, r7, lsr #24
  158. ldr r7, [r1], #4
  159. subs r2, r2, #4
  160. orr r3, r3, r7, lsl#8
  161. str r3, [r0], #4
  162. bge 17b
  163. 18: sub r1, r1, #1
  164. b 6b
  165. 19: add r1, r1, r2
  166. add r0, r0, r2
  167. subs r2, r2, #4
  168. blt 24f
  169. ands ip, r0, #3
  170. bne 25f
  171. ands ip, r1, #3
  172. bne 26f
  173. 20: subs r2, r2, #8
  174. blt 23f
  175. subs r2, r2, #0x14
  176. blt 22f
  177. 21: ldmdb r1!, {r3 - r9, ip}
  178. stmdb r0!, {r3 - r9, ip}
  179. subs r2, r2, #32
  180. bge 21b
  181. 22: cmn r2, #16
  182. ldmgedb r1!, {r3 - r6}
  183. stmgedb r0!, {r3 - r6}
  184. subge r2, r2, #16
  185. adds r2, r2, #20
  186. ldmgedb r1!, {r3 - r5}
  187. stmgedb r0!, {r3 - r5}
  188. subge r2, r2, #12
  189. 23: adds r2, r2, #8
  190. blt 24f
  191. subs r2, r2, #4
  192. ldrlt r3, [r1, #-4]!
  193. ldmgedb r1!, {r4, r5}
  194. strlt r3, [r0, #-4]!
  195. stmgedb r0!, {r4, r5}
  196. subge r2, r2, #4
  197. 24: adds r2, r2, #4
  198. EXITEQ
  199. cmp r2, #2
  200. ldrb r3, [r1, #-1]!
  201. ldrgeb r4, [r1, #-1]!
  202. ldrgtb r5, [r1, #-1]!
  203. strb r3, [r0, #-1]!
  204. strgeb r4, [r0, #-1]!
  205. strgtb r5, [r0, #-1]!
  206. EXIT
  207. 25: cmp ip, #2
  208. ldrb r3, [r1, #-1]!
  209. ldrgeb r4, [r1, #-1]!
  210. ldrgtb r5, [r1, #-1]!
  211. strb r3, [r0, #-1]!
  212. strgeb r4, [r0, #-1]!
  213. strgtb r5, [r0, #-1]!
  214. subs r2, r2, ip
  215. blt 24b
  216. ands ip, r1, #3
  217. beq 20b
  218. 26: bic r1, r1, #3
  219. ldr r3, [r1], #0
  220. cmp ip, #2
  221. blt 34f
  222. beq 30f
  223. cmp r2, #12
  224. blt 28f
  225. sub r2, r2, #12
  226. 27: mov r7, r3, lsl #8
  227. ldmdb r1!, {r3, r4, r5, r6}
  228. orr r7, r7, r6, lsr #24
  229. mov r6, r6, lsl #8
  230. orr r6, r6, r5, lsr #24
  231. mov r5, r5, lsl #8
  232. orr r5, r5, r4, lsr #24
  233. mov r4, r4, lsl #8
  234. orr r4, r4, r3, lsr #24
  235. stmdb r0!, {r4, r5, r6, r7}
  236. subs r2, r2, #16
  237. bge 27b
  238. adds r2, r2, #12
  239. blt 29f
  240. 28: mov ip, r3, lsl #8
  241. ldr r3, [r1, #-4]!
  242. subs r2, r2, #4
  243. orr ip, ip, r3, lsr #24
  244. str ip, [r0, #-4]!
  245. bge 28b
  246. 29: add r1, r1, #3
  247. b 24b
  248. 30: cmp r2, #12
  249. blt 32f
  250. sub r2, r2, #12
  251. 31: mov r7, r3, lsl #16
  252. ldmdb r1!, {r3, r4, r5, r6}
  253. orr r7, r7, r6, lsr #16
  254. mov r6, r6, lsl #16
  255. orr r6, r6, r5, lsr #16
  256. mov r5, r5, lsl #16
  257. orr r5, r5, r4, lsr #16
  258. mov r4, r4, lsl #16
  259. orr r4, r4, r3, lsr #16
  260. stmdb r0!, {r4, r5, r6, r7}
  261. subs r2, r2, #16
  262. bge 31b
  263. adds r2, r2, #12
  264. blt 33f
  265. 32: mov ip, r3, lsl #16
  266. ldr r3, [r1, #-4]!
  267. subs r2, r2, #4
  268. orr ip, ip, r3, lsr #16
  269. str ip, [r0, #-4]!
  270. bge 32b
  271. 33: add r1, r1, #2
  272. b 24b
  273. 34: cmp r2, #12
  274. blt 36f
  275. sub r2, r2, #12
  276. 35: mov r7, r3, lsl #24
  277. ldmdb r1!, {r3, r4, r5, r6}
  278. orr r7, r7, r6, lsr #8
  279. mov r6, r6, lsl #24
  280. orr r6, r6, r5, lsr #8
  281. mov r5, r5, lsl #24
  282. orr r5, r5, r4, lsr #8
  283. mov r4, r4, lsl #24
  284. orr r4, r4, r3, lsr #8
  285. stmdb r0!, {r4, r5, r6, r7}
  286. subs r2, r2, #16
  287. bge 35b
  288. adds r2, r2, #12
  289. blt 37f
  290. 36: mov ip, r3, lsl #24
  291. ldr r3, [r1, #-4]!
  292. subs r2, r2, #4
  293. orr ip, ip, r3, lsr #8
  294. str ip, [r0, #-4]!
  295. bge 36b
  296. 37: add r1, r1, #1
  297. b 24b
  298. .align