[NFC][Py Reformat] Added more commits to .git-blame-ignore-revs
[llvm-project.git] / libc / AOR_v20.02 / string / aarch64 / memcmp-sve.S
blob0a3962f587bfbb1583cc7606e4b7bbda98fe775b
1 /*
2  * memcmp - compare memory
3  *
4  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5  * See https://llvm.org/LICENSE.txt for license information.
6  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7  */
9 #if __ARM_FEATURE_SVE
10 /* Assumptions:
11  *
12  * ARMv8-a, AArch64
13  * SVE Available.
14  */
16         .arch   armv8-a+sve
17         .text
19         .globl  __memcmp_aarch64_sve
20         .type   __memcmp_aarch64_sve, %function
21         .p2align 4
22 __memcmp_aarch64_sve:
23         mov     x3, 0                   /* initialize off */
25 0:      whilelo p0.b, x3, x2            /* while off < max */
26         b.none  9f
28         ld1b    z0.b, p0/z, [x0, x3]    /* read vectors bounded by max.  */
29         ld1b    z1.b, p0/z, [x1, x3]
31         /* Increment for a whole vector, even if we've only read a partial.
32            This is significantly cheaper than INCP, and since OFF is not
33            used after the loop it is ok to increment OFF past MAX.  */
34         incb    x3
36         cmpne   p1.b, p0/z, z0.b, z1.b  /* while no inequalities */
37         b.none  0b
39         /* Found inequality.  */
40 1:      brkb    p1.b, p0/z, p1.b        /* find first such */
41         lasta   w0, p1, z0.b            /* extract each byte */
42         lasta   w1, p1, z1.b
43         sub     x0, x0, x1              /* return comparison */
44         ret
46         /* Found end-of-count.  */
47 9:      mov     x0, 0                   /* return equality */
48         ret
50         .size   __memcmp_aarch64_sve, . - __memcmp_aarch64_sve
51 #endif