get rid of custom memcpy funcs
[picodrive.git] / pico / misc_arm.s
1 /*
2  * Generic memory routines.
3  * (C) notaz, 2007-2008
4  *
5  * This work is licensed under the terms of MAME license.
6  * See COPYING file in the top-level directory.
7  */
8
9 @ 0x12345678 -> 0x34127856
10 @ r4=temp, lr=0x00ff00ff
11 .macro bswap reg
12     and     r4,   \reg, lr
13     and     \reg, lr,   \reg, lsr #8
14     orr     \reg, \reg, r4,   lsl #8
15 .endm
16
17 @ dest must be halfword aligned, src can be unaligned
18 .global memcpy16bswap @ unsigned short *dest, void *src, int count
19
20 memcpy16bswap:
21     tst     r1, #1
22     bne     mcp16bs_cant_align2
23
24     eor     r3, r0, r1
25     tst     r3, #2
26     bne     mcp16bs_cant_align
27
28     tst     r0, #2
29     beq     mcp16bs_aligned
30     ldrh    r3, [r1], #2
31     sub     r2, r2, #1
32     orr     r3, r3, r3, lsl #16
33     mov     r3, r3, lsr #8
34     strh    r3, [r0], #2
35
36 mcp16bs_aligned:
37     stmfd   sp!, {r4,lr}
38     mov     lr, #0xff
39     orr     lr, lr, lr, lsl #16
40
41     subs    r2, r2, #4
42     bmi     mcp16bs_fin4
43
44 mcp16bs_loop:
45     ldmia   r1!, {r3,r12}
46     subs    r2, r2, #4
47     bswap   r3
48     bswap   r12
49     stmia   r0!, {r3,r12}
50     bpl     mcp16bs_loop
51
52 mcp16bs_fin4:
53     tst     r2, #2
54     beq     mcp16bs_fin2
55     ldr     r3, [r1], #4
56     bswap   r3
57     str     r3, [r0], #4
58
59 mcp16bs_fin2:
60     ldmfd   sp!, {r4,lr}
61     ands    r2, r2, #1
62     bxeq    lr
63
64 mcp16bs_cant_align:
65     ldrh    r3, [r1], #2
66     subs    r2, r2, #1
67     orr     r3, r3, r3, lsl #16
68     mov     r3, r3, lsr #8
69     strh    r3, [r0], #2
70     bne     mcp16bs_cant_align
71     bx      lr
72
73     @ worst case
74 mcp16bs_cant_align2:
75     ldrb    r3, [r1], #1
76     ldrb    r12,[r1], #1
77     subs    r2, r2, #1
78     mov     r3, r3, lsl #8
79     orr     r3, r3, r12
80     strh    r3, [r0], #2
81     bne     mcp16bs_cant_align2
82     bx      lr
83
84
85 .global memset32 @ int *dest, int c, int count
86
87 memset32:
88     stmfd   sp!, {lr}
89
90     mov     r3, r1
91     subs    r2, r2, #4
92     bmi     mst32_fin
93
94     mov     r12,r1
95     mov     lr, r1
96
97 mst32_loop:
98     subs    r2, r2, #4
99     stmia   r0!, {r1,r3,r12,lr}
100     bpl     mst32_loop
101
102 mst32_fin:
103     tst     r2, #1
104     strne   r1, [r0], #4
105
106     tst     r2, #2
107     stmneia r0!, {r1,r3}
108
109     ldmfd   sp!, {lr}
110     bx      lr
111
112 @ vim:filetype=armasm