diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-05-09 02:32:09 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-05-09 02:32:09 +0200 |
commit | 4e7fbabfc9f33f6ea5e5a46d5d6d7532d5f68301 (patch) | |
tree | e2e6ff5b8d705646657908e34075350c00da9023 /sys/src/ape/lib/ap/arm64/memmove.s | |
parent | 1046d3e30be09d7f1f07bf0a49f0e32584e86874 (diff) |
libc: provide arm64 assembly versions for memmove() and memset()
just a first approximation, uses unaligned 8 byte loads and stores.
MOVP not yet implemented by the linker. no ZVA cache magic yet.
Diffstat (limited to 'sys/src/ape/lib/ap/arm64/memmove.s')
-rw-r--r-- | sys/src/ape/lib/ap/arm64/memmove.s | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/sys/src/ape/lib/ap/arm64/memmove.s b/sys/src/ape/lib/ap/arm64/memmove.s new file mode 100644 index 000000000..712ddfd1f --- /dev/null +++ b/sys/src/ape/lib/ap/arm64/memmove.s @@ -0,0 +1,50 @@ +TEXT memcpy(SB), $-4 +TEXT memmove(SB), $-4 + MOV from+8(FP), R1 + MOVWU n+16(FP), R2 + + CMP R0, R1 + BEQ _done + BLT _backward + +_forward: + ADD R0, R2, R3 + BIC $7, R2, R4 + CBZ R4, _floop1 + ADD R0, R4, R4 + +_floop8: + MOV (R1)8!, R5 + MOV R5, (R0)8! + CMP R4, R0 + BNE _floop8 + +_floop1: + CMP R3, R0 + BEQ _done + MOVBU (R1)1!, R5 + MOVBU R5, (R0)1! + B _floop1 + +_done: + RETURN + +_backward: + ADD R2, R1, R1 + ADD R2, R0, R3 + BIC $7, R2, R4 + CBZ R4, _bloop1 + SUB R4, R3, R4 + +_bloop8: + MOV -8(R1)!, R5 + MOV R5, -8(R3)! + CMP R4, R3 + BNE _bloop8 + +_bloop1: + CMP R0, R3 + BEQ _done + MOVBU -1(R1)!, R5 + MOVBU R5, -1(R3)! + B _bloop1 |