1 /* memcmp - compare memory
3 * Copyright (c) 2013-2020, Arm Limited.
4 * SPDX-License-Identifier: MIT
9 * ARMv8-a, AArch64, unaligned accesses.
12 #include <machine/asm.h>
16 /* Parameters and result. */
22 /* Internal variables. */
44 ldr data1, [src1, limit]
45 ldr data2, [src2, limit]
54 /* Jump directly to comparing the last 16 bytes for 32 byte (or less)
59 /* We overlap loads between 0-32 bytes at either side of SRC1 when we
60 try to align, so limit it only to strings larger than 128 bytes. */
64 /* Align src1 and adjust src2 with bytes not yet done. */
66 add limit, limit, tmp1
70 /* Loop performing 16 bytes per iteration using aligned src1.
71 Limit is pre-decremented by 16 and must be larger than zero.
72 Exit if <= 16 bytes left to do or if the data is not equal. */
75 ldp data1, data1h, [src1], 16
76 ldp data2, data2h, [src2], 16
78 ccmp data1, data2, 0, hi
79 ccmp data1h, data2h, 0, eq
89 /* Compare last 1-16 bytes using unaligned access. */
93 ldp data1, data1h, [src1]
94 ldp data2, data2h, [src2]
101 /* Compare data bytes and set return value to 0, -1 or 1. */
103 #ifndef __AARCH64EB__
110 cneg result, result, lo
114 /* Compare up to 8 bytes. Limit is [-8..-1]. */
118 ldr data1w, [src1], 4
119 ldr data2w, [src2], 4
127 ldrb data1w, [src1], 1
128 ldrb data2w, [src2], 1
130 ccmp data1w, data2w, 0, ne /* NZCV = 0b0000. */
132 sub result, data1w, data2w