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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/arch/arm/lib/uaccess.S
  3.  *
  4.  *  Copyright (C) 1995, 1996,1997,1998 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.  *  Routines to block copy data to/from user memory
  11.  *   These are highly optimised both for the 4k page size
  12.  *   and for various alignments.
  13.  */
  14. #include <linux/linkage.h>
  15. #include <asm/assembler.h>
  16. #include <asm/errno.h>
  17. .text
  18. #define PAGE_SHIFT 12
  19. /* Prototype: int __arch_copy_to_user(void *to, const char *from, size_t n)
  20.  * Purpose  : copy a block to user memory from kernel memory
  21.  * Params   : to   - user memory
  22.  *          : from - kernel memory
  23.  *          : n    - number of bytes to copy
  24.  * Returns  : Number of bytes NOT copied.
  25.  */
  26. .c2u_dest_not_aligned:
  27. rsb ip, ip, #4
  28. cmp ip, #2
  29. ldrb r3, [r1], #1
  30. USER( strbt r3, [r0], #1) @ May fault
  31. ldrgeb r3, [r1], #1
  32. USER( strgebt r3, [r0], #1) @ May fault
  33. ldrgtb r3, [r1], #1
  34. USER( strgtbt r3, [r0], #1) @ May fault
  35. sub r2, r2, ip
  36. b .c2u_dest_aligned
  37. ENTRY(__arch_copy_to_user)
  38. stmfd sp!, {r2, r4 - r7, lr}
  39. cmp r2, #4
  40. blt .c2u_not_enough
  41. ands ip, r0, #3
  42. bne .c2u_dest_not_aligned
  43. .c2u_dest_aligned:
  44. ands ip, r1, #3
  45. bne .c2u_src_not_aligned
  46. /*
  47.  * Seeing as there has to be at least 8 bytes to copy, we can
  48.  * copy one word, and force a user-mode page fault...
  49.  */
  50. .c2u_0fupi: subs r2, r2, #4
  51. addmi ip, r2, #4
  52. bmi .c2u_0nowords
  53. ldr r3, [r1], #4
  54. USER( strt r3, [r0], #4) @ May fault
  55. mov ip, r0, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
  56. rsb ip, ip, #0
  57. movs ip, ip, lsr #32 - PAGE_SHIFT
  58. beq .c2u_0fupi
  59. /*
  60.  * ip = max no. of bytes to copy before needing another "strt" insn
  61.  */
  62. cmp r2, ip
  63. movlt ip, r2
  64. sub r2, r2, ip
  65. subs ip, ip, #32
  66. blt .c2u_0rem8lp
  67. .c2u_0cpy8lp: ldmia r1!, {r3 - r6}
  68. stmia r0!, {r3 - r6} @ Shouldnt fault
  69. ldmia r1!, {r3 - r6}
  70. stmia r0!, {r3 - r6} @ Shouldnt fault
  71. subs ip, ip, #32
  72. bpl .c2u_0cpy8lp
  73. .c2u_0rem8lp: cmn ip, #16
  74. ldmgeia r1!, {r3 - r6}
  75. stmgeia r0!, {r3 - r6} @ Shouldnt fault
  76. tst ip, #8
  77. ldmneia r1!, {r3 - r4}
  78. stmneia r0!, {r3 - r4} @ Shouldnt fault
  79. tst ip, #4
  80. ldrne r3, [r1], #4
  81. strnet r3, [r0], #4 @ Shouldnt fault
  82. ands ip, ip, #3
  83. beq .c2u_0fupi
  84. .c2u_0nowords: teq ip, #0
  85. beq .c2u_finished
  86. .c2u_nowords: cmp ip, #2
  87. ldrb r3, [r1], #1
  88. USER( strbt r3, [r0], #1) @ May fault
  89. ldrgeb r3, [r1], #1
  90. USER( strgebt r3, [r0], #1) @ May fault
  91. ldrgtb r3, [r1], #1
  92. USER( strgtbt r3, [r0], #1) @ May fault
  93. b .c2u_finished
  94. .c2u_not_enough:
  95. movs ip, r2
  96. bne .c2u_nowords
  97. .c2u_finished: mov r0, #0
  98. LOADREGS(fd,sp!,{r2, r4 - r7, pc})
  99. .c2u_src_not_aligned:
  100. bic r1, r1, #3
  101. ldr r7, [r1], #4
  102. cmp ip, #2
  103. bgt .c2u_3fupi
  104. beq .c2u_2fupi
  105. .c2u_1fupi: subs r2, r2, #4
  106. addmi ip, r2, #4
  107. bmi .c2u_1nowords
  108. mov r3, r7, lsr #8
  109. ldr r7, [r1], #4
  110. orr r3, r3, r7, lsl #24
  111. USER( strt r3, [r0], #4) @ May fault
  112. mov ip, r0, lsl #32 - PAGE_SHIFT
  113. rsb ip, ip, #0
  114. movs ip, ip, lsr #32 - PAGE_SHIFT
  115. beq .c2u_1fupi
  116. cmp r2, ip
  117. movlt ip, r2
  118. sub r2, r2, ip
  119. subs ip, ip, #16
  120. blt .c2u_1rem8lp
  121. .c2u_1cpy8lp: mov r3, r7, lsr #8
  122. ldmia r1!, {r4 - r7}
  123. orr r3, r3, r4, lsl #24
  124. mov r4, r4, lsr #8
  125. orr r4, r4, r5, lsl #24
  126. mov r5, r5, lsr #8
  127. orr r5, r5, r6, lsl #24
  128. mov r6, r6, lsr #8
  129. orr r6, r6, r7, lsl #24
  130. stmia r0!, {r3 - r6} @ Shouldnt fault
  131. subs ip, ip, #16
  132. bpl .c2u_1cpy8lp
  133. .c2u_1rem8lp: tst ip, #8
  134. movne r3, r7, lsr #8
  135. ldmneia r1!, {r4, r7}
  136. orrne r3, r3, r4, lsl #24
  137. movne r4, r4, lsr #8
  138. orrne r4, r4, r7, lsl #24
  139. stmneia r0!, {r3 - r4} @ Shouldnt fault
  140. tst ip, #4
  141. movne r3, r7, lsr #8
  142. ldrne r7, [r1], #4
  143. orrne r3, r3, r7, lsl #24
  144. strnet r3, [r0], #4 @ Shouldnt fault
  145. ands ip, ip, #3
  146. beq .c2u_1fupi
  147. .c2u_1nowords: mov r3, r7, lsr #8
  148. teq ip, #0
  149. beq .c2u_finished
  150. cmp ip, #2
  151. USER( strbt r3, [r0], #1) @ May fault
  152. movge r3, r3, lsr #8
  153. USER( strgebt r3, [r0], #1) @ May fault
  154. movgt r3, r3, lsr #8
  155. USER( strgtbt r3, [r0], #1) @ May fault
  156. b .c2u_finished
  157. .c2u_2fupi: subs r2, r2, #4
  158. addmi ip, r2, #4
  159. bmi .c2u_2nowords
  160. mov r3, r7, lsr #16
  161. ldr r7, [r1], #4
  162. orr r3, r3, r7, lsl #16
  163. USER( strt r3, [r0], #4) @ May fault
  164. mov ip, r0, lsl #32 - PAGE_SHIFT
  165. rsb ip, ip, #0
  166. movs ip, ip, lsr #32 - PAGE_SHIFT
  167. beq .c2u_2fupi
  168. cmp r2, ip
  169. movlt ip, r2
  170. sub r2, r2, ip
  171. subs ip, ip, #16
  172. blt .c2u_2rem8lp
  173. .c2u_2cpy8lp: mov r3, r7, lsr #16
  174. ldmia r1!, {r4 - r7}
  175. orr r3, r3, r4, lsl #16
  176. mov r4, r4, lsr #16
  177. orr r4, r4, r5, lsl #16
  178. mov r5, r5, lsr #16
  179. orr r5, r5, r6, lsl #16
  180. mov r6, r6, lsr #16
  181. orr r6, r6, r7, lsl #16
  182. stmia r0!, {r3 - r6} @ Shouldnt fault
  183. subs ip, ip, #16
  184. bpl .c2u_2cpy8lp
  185. .c2u_2rem8lp: tst ip, #8
  186. movne r3, r7, lsr #16
  187. ldmneia r1!, {r4, r7}
  188. orrne r3, r3, r4, lsl #16
  189. movne r4, r4, lsr #16
  190. orrne r4, r4, r7, lsl #16
  191. stmneia r0!, {r3 - r4} @ Shouldnt fault
  192. tst ip, #4
  193. movne r3, r7, lsr #16
  194. ldrne r7, [r1], #4
  195. orrne r3, r3, r7, lsl #16
  196. strnet r3, [r0], #4 @ Shouldnt fault
  197. ands ip, ip, #3
  198. beq .c2u_2fupi
  199. .c2u_2nowords: mov r3, r7, lsr #16
  200. teq ip, #0
  201. beq .c2u_finished
  202. cmp ip, #2
  203. USER( strbt r3, [r0], #1) @ May fault
  204. movge r3, r3, lsr #8
  205. USER( strgebt r3, [r0], #1) @ May fault
  206. ldrgtb r3, [r1], #0
  207. USER( strgtbt r3, [r0], #1) @ May fault
  208. b .c2u_finished
  209. .c2u_3fupi: subs r2, r2, #4
  210. addmi ip, r2, #4
  211. bmi .c2u_3nowords
  212. mov r3, r7, lsr #24
  213. ldr r7, [r1], #4
  214. orr r3, r3, r7, lsl #8
  215. USER( strt r3, [r0], #4) @ May fault
  216. mov ip, r0, lsl #32 - PAGE_SHIFT
  217. rsb ip, ip, #0
  218. movs ip, ip, lsr #32 - PAGE_SHIFT
  219. beq .c2u_3fupi
  220. cmp r2, ip
  221. movlt ip, r2
  222. sub r2, r2, ip
  223. subs ip, ip, #16
  224. blt .c2u_3rem8lp
  225. .c2u_3cpy8lp: mov r3, r7, lsr #24
  226. ldmia r1!, {r4 - r7}
  227. orr r3, r3, r4, lsl #8
  228. mov r4, r4, lsr #24
  229. orr r4, r4, r5, lsl #8
  230. mov r5, r5, lsr #24
  231. orr r5, r5, r6, lsl #8
  232. mov r6, r6, lsr #24
  233. orr r6, r6, r7, lsl #8
  234. stmia r0!, {r3 - r6} @ Shouldnt fault
  235. subs ip, ip, #16
  236. bpl .c2u_3cpy8lp
  237. .c2u_3rem8lp: tst ip, #8
  238. movne r3, r7, lsr #24
  239. ldmneia r1!, {r4, r7}
  240. orrne r3, r3, r4, lsl #8
  241. movne r4, r4, lsr #24
  242. orrne r4, r4, r7, lsl #8
  243. stmneia r0!, {r3 - r4} @ Shouldnt fault
  244. tst ip, #4
  245. movne r3, r7, lsr #24
  246. ldrne r7, [r1], #4
  247. orrne r3, r3, r7, lsl #8
  248. strnet r3, [r0], #4 @ Shouldnt fault
  249. ands ip, ip, #3
  250. beq .c2u_3fupi
  251. .c2u_3nowords: mov r3, r7, lsr #24
  252. teq ip, #0
  253. beq .c2u_finished
  254. cmp ip, #2
  255. USER( strbt r3, [r0], #1) @ May fault
  256. ldrge r3, [r1], #0
  257. USER( strgebt r3, [r0], #1) @ May fault
  258. movgt r3, r3, lsr #8
  259. USER( strgtbt r3, [r0], #1) @ May fault
  260. b .c2u_finished
  261. .section .fixup,"ax"
  262. .align 0
  263. 9001: LOADREGS(fd,sp!, {r0, r4 - r7, pc})
  264. .previous
  265. /* Prototype: unsigned long __arch_copy_from_user(void *to,const void *from,unsigned long n);
  266.  * Purpose  : copy a block from user memory to kernel memory
  267.  * Params   : to   - kernel memory
  268.  *          : from - user memory
  269.  *          : n    - number of bytes to copy
  270.  * Returns  : Number of bytes NOT copied.
  271.  */
  272. .cfu_dest_not_aligned:
  273. rsb ip, ip, #4
  274. cmp ip, #2
  275. USER( ldrbt r3, [r1], #1) @ May fault
  276. strb r3, [r0], #1
  277. USER( ldrgebt r3, [r1], #1) @ May fault
  278. strgeb r3, [r0], #1
  279. USER( ldrgtbt r3, [r1], #1) @ May fault
  280. strgtb r3, [r0], #1
  281. sub r2, r2, ip
  282. b .cfu_dest_aligned
  283. ENTRY(__arch_copy_from_user)
  284. stmfd sp!, {r0, r2, r4 - r7, lr}
  285. cmp r2, #4
  286. blt .cfu_not_enough
  287. ands ip, r0, #3
  288. bne .cfu_dest_not_aligned
  289. .cfu_dest_aligned:
  290. ands ip, r1, #3
  291. bne .cfu_src_not_aligned
  292. /*
  293.  * Seeing as there has to be at least 8 bytes to copy, we can
  294.  * copy one word, and force a user-mode page fault...
  295.  */
  296. .cfu_0fupi: subs r2, r2, #4
  297. addmi ip, r2, #4
  298. bmi .cfu_0nowords
  299. USER( ldrt r3, [r1], #4)
  300. str r3, [r0], #4
  301. mov ip, r1, lsl #32 - PAGE_SHIFT @ On each page, use a ld/st??t instruction
  302. rsb ip, ip, #0
  303. movs ip, ip, lsr #32 - PAGE_SHIFT
  304. beq .cfu_0fupi
  305. /*
  306.  * ip = max no. of bytes to copy before needing another "strt" insn
  307.  */
  308. cmp r2, ip
  309. movlt ip, r2
  310. sub r2, r2, ip
  311. subs ip, ip, #32
  312. blt .cfu_0rem8lp
  313. .cfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault
  314. stmia r0!, {r3 - r6}
  315. ldmia r1!, {r3 - r6} @ Shouldnt fault
  316. stmia r0!, {r3 - r6}
  317. subs ip, ip, #32
  318. bpl .cfu_0cpy8lp
  319. .cfu_0rem8lp: cmn ip, #16
  320. ldmgeia r1!, {r3 - r6} @ Shouldnt fault
  321. stmgeia r0!, {r3 - r6}
  322. tst ip, #8
  323. ldmneia r1!, {r3 - r4} @ Shouldnt fault
  324. stmneia r0!, {r3 - r4}
  325. tst ip, #4
  326. ldrnet r3, [r1], #4 @ Shouldnt fault
  327. strne r3, [r0], #4
  328. ands ip, ip, #3
  329. beq .cfu_0fupi
  330. .cfu_0nowords: teq ip, #0
  331. beq .cfu_finished
  332. .cfu_nowords: cmp ip, #2
  333. USER( ldrbt r3, [r1], #1) @ May fault
  334. strb r3, [r0], #1
  335. USER( ldrgebt r3, [r1], #1) @ May fault
  336. strgeb r3, [r0], #1
  337. USER( ldrgtbt r3, [r1], #1) @ May fault
  338. strgtb r3, [r0], #1
  339. b .cfu_finished
  340. .cfu_not_enough:
  341. movs ip, r2
  342. bne .cfu_nowords
  343. .cfu_finished: mov r0, #0
  344. add sp, sp, #8
  345. LOADREGS(fd,sp!,{r4 - r7, pc})
  346. .cfu_src_not_aligned:
  347. bic r1, r1, #3
  348. USER( ldrt r7, [r1], #4) @ May fault
  349. cmp ip, #2
  350. bgt .cfu_3fupi
  351. beq .cfu_2fupi
  352. .cfu_1fupi: subs r2, r2, #4
  353. addmi ip, r2, #4
  354. bmi .cfu_1nowords
  355. mov r3, r7, lsr #8
  356. USER( ldrt r7, [r1], #4) @ May fault
  357. orr r3, r3, r7, lsl #24
  358. str r3, [r0], #4
  359. mov ip, r1, lsl #32 - PAGE_SHIFT
  360. rsb ip, ip, #0
  361. movs ip, ip, lsr #32 - PAGE_SHIFT
  362. beq .cfu_1fupi
  363. cmp r2, ip
  364. movlt ip, r2
  365. sub r2, r2, ip
  366. subs ip, ip, #16
  367. blt .cfu_1rem8lp
  368. .cfu_1cpy8lp: mov r3, r7, lsr #8
  369. ldmia r1!, {r4 - r7} @ Shouldnt fault
  370. orr r3, r3, r4, lsl #24
  371. mov r4, r4, lsr #8
  372. orr r4, r4, r5, lsl #24
  373. mov r5, r5, lsr #8
  374. orr r5, r5, r6, lsl #24
  375. mov r6, r6, lsr #8
  376. orr r6, r6, r7, lsl #24
  377. stmia r0!, {r3 - r6}
  378. subs ip, ip, #16
  379. bpl .cfu_1cpy8lp
  380. .cfu_1rem8lp: tst ip, #8
  381. movne r3, r7, lsr #8
  382. ldmneia r1!, {r4, r7} @ Shouldnt fault
  383. orrne r3, r3, r4, lsl #24
  384. movne r4, r4, lsr #8
  385. orrne r4, r4, r7, lsl #24
  386. stmneia r0!, {r3 - r4}
  387. tst ip, #4
  388. movne r3, r7, lsr #8
  389. USER( ldrnet r7, [r1], #4) @ May fault
  390. orrne r3, r3, r7, lsl #24
  391. strne r3, [r0], #4
  392. ands ip, ip, #3
  393. beq .cfu_1fupi
  394. .cfu_1nowords: mov r3, r7, lsr #8
  395. teq ip, #0
  396. beq .cfu_finished
  397. cmp ip, #2
  398. strb r3, [r0], #1
  399. movge r3, r3, lsr #8
  400. strgeb r3, [r0], #1
  401. movgt r3, r3, lsr #8
  402. strgtb r3, [r0], #1
  403. b .cfu_finished
  404. .cfu_2fupi: subs r2, r2, #4
  405. addmi ip, r2, #4
  406. bmi .cfu_2nowords
  407. mov r3, r7, lsr #16
  408. USER( ldrt r7, [r1], #4) @ May fault
  409. orr r3, r3, r7, lsl #16
  410. str r3, [r0], #4
  411. mov ip, r1, lsl #32 - PAGE_SHIFT
  412. rsb ip, ip, #0
  413. movs ip, ip, lsr #32 - PAGE_SHIFT
  414. beq .cfu_2fupi
  415. cmp r2, ip
  416. movlt ip, r2
  417. sub r2, r2, ip
  418. subs ip, ip, #16
  419. blt .cfu_2rem8lp
  420. .cfu_2cpy8lp: mov r3, r7, lsr #16
  421. ldmia r1!, {r4 - r7} @ Shouldnt fault
  422. orr r3, r3, r4, lsl #16
  423. mov r4, r4, lsr #16
  424. orr r4, r4, r5, lsl #16
  425. mov r5, r5, lsr #16
  426. orr r5, r5, r6, lsl #16
  427. mov r6, r6, lsr #16
  428. orr r6, r6, r7, lsl #16
  429. stmia r0!, {r3 - r6}
  430. subs ip, ip, #16
  431. bpl .cfu_2cpy8lp
  432. .cfu_2rem8lp: tst ip, #8
  433. movne r3, r7, lsr #16
  434. ldmneia r1!, {r4, r7} @ Shouldnt fault
  435. orrne r3, r3, r4, lsl #16
  436. movne r4, r4, lsr #16
  437. orrne r4, r4, r7, lsl #16
  438. stmneia r0!, {r3 - r4}
  439. tst ip, #4
  440. movne r3, r7, lsr #16
  441. USER( ldrnet r7, [r1], #4) @ May fault
  442. orrne r3, r3, r7, lsl #16
  443. strne r3, [r0], #4
  444. ands ip, ip, #3
  445. beq .cfu_2fupi
  446. .cfu_2nowords: mov r3, r7, lsr #16
  447. teq ip, #0
  448. beq .cfu_finished
  449. cmp ip, #2
  450. strb r3, [r0], #1
  451. movge r3, r3, lsr #8
  452. strgeb r3, [r0], #1
  453. USER( ldrgtbt r3, [r1], #0) @ May fault
  454. strgtb r3, [r0], #1
  455. b .cfu_finished
  456. .cfu_3fupi: subs r2, r2, #4
  457. addmi ip, r2, #4
  458. bmi .cfu_3nowords
  459. mov r3, r7, lsr #24
  460. USER( ldrt r7, [r1], #4) @ May fault
  461. orr r3, r3, r7, lsl #8
  462. str r3, [r0], #4
  463. mov ip, r1, lsl #32 - PAGE_SHIFT
  464. rsb ip, ip, #0
  465. movs ip, ip, lsr #32 - PAGE_SHIFT
  466. beq .cfu_3fupi
  467. cmp r2, ip
  468. movlt ip, r2
  469. sub r2, r2, ip
  470. subs ip, ip, #16
  471. blt .cfu_3rem8lp
  472. .cfu_3cpy8lp: mov r3, r7, lsr #24
  473. ldmia r1!, {r4 - r7} @ Shouldnt fault
  474. orr r3, r3, r4, lsl #8
  475. mov r4, r4, lsr #24
  476. orr r4, r4, r5, lsl #8
  477. mov r5, r5, lsr #24
  478. orr r5, r5, r6, lsl #8
  479. mov r6, r6, lsr #24
  480. orr r6, r6, r7, lsl #8
  481. stmia r0!, {r3 - r6}
  482. subs ip, ip, #16
  483. bpl .cfu_3cpy8lp
  484. .cfu_3rem8lp: tst ip, #8
  485. movne r3, r7, lsr #24
  486. ldmneia r1!, {r4, r7} @ Shouldnt fault
  487. orrne r3, r3, r4, lsl #8
  488. movne r4, r4, lsr #24
  489. orrne r4, r4, r7, lsl #8
  490. stmneia r0!, {r3 - r4}
  491. tst ip, #4
  492. movne r3, r7, lsr #24
  493. USER( ldrnet r7, [r1], #4) @ May fault
  494. orrne r3, r3, r7, lsl #8
  495. strne r3, [r0], #4
  496. ands ip, ip, #3
  497. beq .cfu_3fupi
  498. .cfu_3nowords: mov r3, r7, lsr #24
  499. teq ip, #0
  500. beq .cfu_finished
  501. cmp ip, #2
  502. strb r3, [r0], #1
  503. USER( ldrget r3, [r1], #0) @ May fault
  504. strgeb r3, [r0], #1
  505. movgt r3, r3, lsr #8
  506. strgtb r3, [r0], #1
  507. b .cfu_finished
  508. .section .fixup,"ax"
  509. .align 0
  510. /*
  511.  * We took an exception.  r0 contains a pointer to
  512.  * the byte not copied.
  513.  */
  514. 9001: ldr r2, [sp], #4 @ void *to
  515. sub r2, r0, r2 @ bytes copied
  516. ldr r1, [sp], #4 @ unsigned long count
  517. subs r4, r1, r2 @ bytes left to copy
  518. movne r1, r4
  519. blne SYMBOL_NAME(__memzero)
  520. mov r0, r4
  521. LOADREGS(fd,sp!, {r4 - r7, pc})
  522. .previous
  523. /* Prototype: int __arch_clear_user(void *addr, size_t sz)
  524.  * Purpose  : clear some user memory
  525.  * Params   : addr - user memory address to clear
  526.  *          : sz   - number of bytes to clear
  527.  * Returns  : number of bytes NOT cleared
  528.  */
  529. ENTRY(__arch_clear_user)
  530. stmfd sp!, {r1, lr}
  531. mov r2, #0
  532. cmp r1, #4
  533. blt 2f
  534. ands ip, r0, #3
  535. beq 1f
  536. cmp ip, #2
  537. USER( strbt r2, [r0], #1)
  538. USER( strlebt r2, [r0], #1)
  539. USER( strltbt r2, [r0], #1)
  540. rsb ip, ip, #4
  541. sub r1, r1, ip @  7  6  5  4  3  2  1
  542. 1: subs r1, r1, #8 @ -1 -2 -3 -4 -5 -6 -7
  543. USER( strplt r2, [r0], #4)
  544. USER( strplt r2, [r0], #4)
  545. bpl 1b
  546. adds r1, r1, #4 @  3  2  1  0 -1 -2 -3
  547. USER( strplt r2, [r0], #4)
  548. 2: tst r1, #2 @ 1x 1x 0x 0x 1x 1x 0x
  549. USER( strnebt r2, [r0], #1)
  550. USER( strnebt r2, [r0], #1)
  551. tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
  552. USER( strnebt r2, [r0], #1)
  553. mov r0, #0
  554. LOADREGS(fd,sp!, {r1, pc})
  555. .section .fixup,"ax"
  556. .align 0
  557. 9001: LOADREGS(fd,sp!, {r0, pc})
  558. .previous