| @@ -19,27 +19,27 @@ | | | @@ -19,27 +19,27 @@ |
19 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | | 19 | * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
20 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS | | 20 | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
21 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | | 21 | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
22 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | | 22 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
23 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | | 23 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
24 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | | 24 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
25 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | | 25 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
26 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE | | 26 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
27 | * POSSIBILITY OF SUCH DAMAGE. | | 27 | * POSSIBILITY OF SUCH DAMAGE. |
28 | */ | | 28 | */ |
29 | | | 29 | |
30 | #include <machine/asm.h> | | 30 | #include <machine/asm.h> |
31 | | | 31 | |
32 | RCSID("$NetBSD: strrchr_arm.S,v 1.5 2013/08/20 08:05:49 matt Exp $") | | 32 | RCSID("$NetBSD: strrchr_arm.S,v 1.6 2013/08/25 06:15:06 matt Exp $") |
33 | | | 33 | |
34 | #ifdef __ARMEL__ | | 34 | #ifdef __ARMEL__ |
35 | #define BYTE0 0x000000ff | | 35 | #define BYTE0 0x000000ff |
36 | #define BYTE1 0x0000ff00 | | 36 | #define BYTE1 0x0000ff00 |
37 | #define BYTE2 0x00ff0000 | | 37 | #define BYTE2 0x00ff0000 |
38 | #define BYTE3 0xff000000 | | 38 | #define BYTE3 0xff000000 |
39 | #define lshi lsl | | 39 | #define lshi lsl |
40 | #define lshis lsls | | 40 | #define lshis lsls |
41 | #else | | 41 | #else |
42 | #define BYTE0 0xff000000 | | 42 | #define BYTE0 0xff000000 |
43 | #define BYTE1 0x00ff0000 | | 43 | #define BYTE1 0x00ff0000 |
44 | #define BYTE2 0x0000ff00 | | 44 | #define BYTE2 0x0000ff00 |
45 | #define BYTE3 0x000000ff | | 45 | #define BYTE3 0x000000ff |
| @@ -54,28 +54,28 @@ ENTRY(strrchr) | | | @@ -54,28 +54,28 @@ ENTRY(strrchr) |
54 | bl PLT_SYM(strlen) /* get length */ | | 54 | bl PLT_SYM(strlen) /* get length */ |
55 | pop {r1, r2} /* restore pointer / return addr */ | | 55 | pop {r1, r2} /* restore pointer / return addr */ |
56 | adds r0, r0, r1 /* add pointer to length */ | | 56 | adds r0, r0, r1 /* add pointer to length */ |
57 | RETr(r2) /* return */ | | 57 | RETr(r2) /* return */ |
58 | | | 58 | |
59 | 1: mov r1, r0 /* we use r0 at the return value */ | | 59 | 1: mov r1, r0 /* we use r0 at the return value */ |
60 | movs r0, #0 /* return NULL by default */ | | 60 | movs r0, #0 /* return NULL by default */ |
61 | 2: tst r1, #3 /* test for word alignment */ | | 61 | 2: tst r1, #3 /* test for word alignment */ |
62 | beq .Lpre_main_loop /* finally word aligned */ | | 62 | beq .Lpre_main_loop /* finally word aligned */ |
63 | ldrb r3, [r1], #1 /* load a byte */ | | 63 | ldrb r3, [r1], #1 /* load a byte */ |
64 | cmp r3, r2 /* did it match? */ | | 64 | cmp r3, r2 /* did it match? */ |
65 | #ifdef __thumb__ | | 65 | #ifdef __thumb__ |
66 | it eq | | 66 | it eq |
67 | subeq r0, r1, #1 /* yes, remember that it did */ | | | |
68 | #endif | | 67 | #endif |
| | | 68 | subeq r0, r1, #1 /* yes, remember that it did */ |
69 | cmp r3, #0 /* was it NUL? */ | | 69 | cmp r3, #0 /* was it NUL? */ |
70 | bne 2b /* no, try next byte */ | | 70 | bne 2b /* no, try next byte */ |
71 | RET /* return */ | | 71 | RET /* return */ |
72 | .Lpre_main_loop: | | 72 | .Lpre_main_loop: |
73 | push {r4, r5} /* save some registers */ | | 73 | push {r4, r5} /* save some registers */ |
74 | #if defined(_ARM_ARCH_7) | | 74 | #if defined(_ARM_ARCH_7) |
75 | movw ip, #0xfefe /* magic constant; 254 in each byte */ | | 75 | movw ip, #0xfefe /* magic constant; 254 in each byte */ |
76 | movt ip, #0xfefe /* magic constant; 254 in each byte */ | | 76 | movt ip, #0xfefe /* magic constant; 254 in each byte */ |
77 | #elif defined(_ARM_ARCH_6) | | 77 | #elif defined(_ARM_ARCH_6) |
78 | mov ip, #0xfe /* put 254 in low byte */ | | 78 | mov ip, #0xfe /* put 254 in low byte */ |
79 | orr ip, ip, ip, lsl #8 /* move to next byte */ | | 79 | orr ip, ip, ip, lsl #8 /* move to next byte */ |
80 | orr ip, ip, ip, lsl #16 /* move to next halfword */ | | 80 | orr ip, ip, ip, lsl #16 /* move to next halfword */ |
81 | #endif /* _ARM_ARCH_6 */ | | 81 | #endif /* _ARM_ARCH_6 */ |