picodrive/pico/misc_arm.s
notaz fdcfd32374 get rid of custom memcpy funcs
not used for anything important, just a maintenance burden
2017-10-14 21:28:36 +03:00

112 lines
2.1 KiB
ArmAsm

/*
* Generic memory routines.
* (C) notaz, 2007-2008
*
* This work is licensed under the terms of MAME license.
* See COPYING file in the top-level directory.
*/
@ 0x12345678 -> 0x34127856
@ r4=temp, lr=0x00ff00ff
.macro bswap reg
and r4, \reg, lr
and \reg, lr, \reg, lsr #8
orr \reg, \reg, r4, lsl #8
.endm
@ dest must be halfword aligned, src can be unaligned
.global memcpy16bswap @ unsigned short *dest, void *src, int count
memcpy16bswap:
tst r1, #1
bne mcp16bs_cant_align2
eor r3, r0, r1
tst r3, #2
bne mcp16bs_cant_align
tst r0, #2
beq mcp16bs_aligned
ldrh r3, [r1], #2
sub r2, r2, #1
orr r3, r3, r3, lsl #16
mov r3, r3, lsr #8
strh r3, [r0], #2
mcp16bs_aligned:
stmfd sp!, {r4,lr}
mov lr, #0xff
orr lr, lr, lr, lsl #16
subs r2, r2, #4
bmi mcp16bs_fin4
mcp16bs_loop:
ldmia r1!, {r3,r12}
subs r2, r2, #4
bswap r3
bswap r12
stmia r0!, {r3,r12}
bpl mcp16bs_loop
mcp16bs_fin4:
tst r2, #2
beq mcp16bs_fin2
ldr r3, [r1], #4
bswap r3
str r3, [r0], #4
mcp16bs_fin2:
ldmfd sp!, {r4,lr}
ands r2, r2, #1
bxeq lr
mcp16bs_cant_align:
ldrh r3, [r1], #2
subs r2, r2, #1
orr r3, r3, r3, lsl #16
mov r3, r3, lsr #8
strh r3, [r0], #2
bne mcp16bs_cant_align
bx lr
@ worst case
mcp16bs_cant_align2:
ldrb r3, [r1], #1
ldrb r12,[r1], #1
subs r2, r2, #1
mov r3, r3, lsl #8
orr r3, r3, r12
strh r3, [r0], #2
bne mcp16bs_cant_align2
bx lr
.global memset32 @ int *dest, int c, int count
memset32:
stmfd sp!, {lr}
mov r3, r1
subs r2, r2, #4
bmi mst32_fin
mov r12,r1
mov lr, r1
mst32_loop:
subs r2, r2, #4
stmia r0!, {r1,r3,r12,lr}
bpl mst32_loop
mst32_fin:
tst r2, #1
strne r1, [r0], #4
tst r2, #2
stmneia r0!, {r1,r3}
ldmfd sp!, {lr}
bx lr
@ vim:filetype=armasm