xref: /aosp_15_r20/external/boringssl/src/gen/bcm/bn-armv8-linux.S (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker// This file is generated from a similarly-named Perl script in the BoringSSL
2*8fb009dcSAndroid Build Coastguard Worker// source tree. Do not edit by hand.
3*8fb009dcSAndroid Build Coastguard Worker
4*8fb009dcSAndroid Build Coastguard Worker#include <openssl/asm_base.h>
5*8fb009dcSAndroid Build Coastguard Worker
6*8fb009dcSAndroid Build Coastguard Worker#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_AARCH64) && defined(__ELF__)
7*8fb009dcSAndroid Build Coastguard Worker#include <openssl/arm_arch.h>
8*8fb009dcSAndroid Build Coastguard Worker
9*8fb009dcSAndroid Build Coastguard Worker.text
10*8fb009dcSAndroid Build Coastguard Worker
11*8fb009dcSAndroid Build Coastguard Worker// BN_ULONG bn_add_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,
12*8fb009dcSAndroid Build Coastguard Worker//                       size_t num);
13*8fb009dcSAndroid Build Coastguard Worker.type	bn_add_words, %function
14*8fb009dcSAndroid Build Coastguard Worker.globl	bn_add_words
15*8fb009dcSAndroid Build Coastguard Worker.hidden	bn_add_words
16*8fb009dcSAndroid Build Coastguard Worker.align	4
17*8fb009dcSAndroid Build Coastguard Workerbn_add_words:
18*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
19*8fb009dcSAndroid Build Coastguard Worker	# Clear the carry flag.
20*8fb009dcSAndroid Build Coastguard Worker	cmn	xzr, xzr
21*8fb009dcSAndroid Build Coastguard Worker
22*8fb009dcSAndroid Build Coastguard Worker	# aarch64 can load two registers at a time, so we do two loop iterations at
23*8fb009dcSAndroid Build Coastguard Worker	# at a time. Split x3 = 2 * x8 + x3. This allows loop
24*8fb009dcSAndroid Build Coastguard Worker	# operations to use CBNZ without clobbering the carry flag.
25*8fb009dcSAndroid Build Coastguard Worker	lsr	x8, x3, #1
26*8fb009dcSAndroid Build Coastguard Worker	and	x3, x3, #1
27*8fb009dcSAndroid Build Coastguard Worker
28*8fb009dcSAndroid Build Coastguard Worker	cbz	x8, .Ladd_tail
29*8fb009dcSAndroid Build Coastguard Worker.Ladd_loop:
30*8fb009dcSAndroid Build Coastguard Worker	ldp	x4, x5, [x1], #16
31*8fb009dcSAndroid Build Coastguard Worker	ldp	x6, x7, [x2], #16
32*8fb009dcSAndroid Build Coastguard Worker	sub	x8, x8, #1
33*8fb009dcSAndroid Build Coastguard Worker	adcs	x4, x4, x6
34*8fb009dcSAndroid Build Coastguard Worker	adcs	x5, x5, x7
35*8fb009dcSAndroid Build Coastguard Worker	stp	x4, x5, [x0], #16
36*8fb009dcSAndroid Build Coastguard Worker	cbnz	x8, .Ladd_loop
37*8fb009dcSAndroid Build Coastguard Worker
38*8fb009dcSAndroid Build Coastguard Worker.Ladd_tail:
39*8fb009dcSAndroid Build Coastguard Worker	cbz	x3, .Ladd_exit
40*8fb009dcSAndroid Build Coastguard Worker	ldr	x4, [x1], #8
41*8fb009dcSAndroid Build Coastguard Worker	ldr	x6, [x2], #8
42*8fb009dcSAndroid Build Coastguard Worker	adcs	x4, x4, x6
43*8fb009dcSAndroid Build Coastguard Worker	str	x4, [x0], #8
44*8fb009dcSAndroid Build Coastguard Worker
45*8fb009dcSAndroid Build Coastguard Worker.Ladd_exit:
46*8fb009dcSAndroid Build Coastguard Worker	cset	x0, cs
47*8fb009dcSAndroid Build Coastguard Worker	ret
48*8fb009dcSAndroid Build Coastguard Worker.size	bn_add_words,.-bn_add_words
49*8fb009dcSAndroid Build Coastguard Worker
50*8fb009dcSAndroid Build Coastguard Worker// BN_ULONG bn_sub_words(BN_ULONG *rp, const BN_ULONG *ap, const BN_ULONG *bp,
51*8fb009dcSAndroid Build Coastguard Worker//                       size_t num);
52*8fb009dcSAndroid Build Coastguard Worker.type	bn_sub_words, %function
53*8fb009dcSAndroid Build Coastguard Worker.globl	bn_sub_words
54*8fb009dcSAndroid Build Coastguard Worker.hidden	bn_sub_words
55*8fb009dcSAndroid Build Coastguard Worker.align	4
56*8fb009dcSAndroid Build Coastguard Workerbn_sub_words:
57*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
58*8fb009dcSAndroid Build Coastguard Worker	# Set the carry flag. Arm's borrow bit is flipped from the carry flag,
59*8fb009dcSAndroid Build Coastguard Worker	# so we want C = 1 here.
60*8fb009dcSAndroid Build Coastguard Worker	cmp	xzr, xzr
61*8fb009dcSAndroid Build Coastguard Worker
62*8fb009dcSAndroid Build Coastguard Worker	# aarch64 can load two registers at a time, so we do two loop iterations at
63*8fb009dcSAndroid Build Coastguard Worker	# at a time. Split x3 = 2 * x8 + x3. This allows loop
64*8fb009dcSAndroid Build Coastguard Worker	# operations to use CBNZ without clobbering the carry flag.
65*8fb009dcSAndroid Build Coastguard Worker	lsr	x8, x3, #1
66*8fb009dcSAndroid Build Coastguard Worker	and	x3, x3, #1
67*8fb009dcSAndroid Build Coastguard Worker
68*8fb009dcSAndroid Build Coastguard Worker	cbz	x8, .Lsub_tail
69*8fb009dcSAndroid Build Coastguard Worker.Lsub_loop:
70*8fb009dcSAndroid Build Coastguard Worker	ldp	x4, x5, [x1], #16
71*8fb009dcSAndroid Build Coastguard Worker	ldp	x6, x7, [x2], #16
72*8fb009dcSAndroid Build Coastguard Worker	sub	x8, x8, #1
73*8fb009dcSAndroid Build Coastguard Worker	sbcs	x4, x4, x6
74*8fb009dcSAndroid Build Coastguard Worker	sbcs	x5, x5, x7
75*8fb009dcSAndroid Build Coastguard Worker	stp	x4, x5, [x0], #16
76*8fb009dcSAndroid Build Coastguard Worker	cbnz	x8, .Lsub_loop
77*8fb009dcSAndroid Build Coastguard Worker
78*8fb009dcSAndroid Build Coastguard Worker.Lsub_tail:
79*8fb009dcSAndroid Build Coastguard Worker	cbz	x3, .Lsub_exit
80*8fb009dcSAndroid Build Coastguard Worker	ldr	x4, [x1], #8
81*8fb009dcSAndroid Build Coastguard Worker	ldr	x6, [x2], #8
82*8fb009dcSAndroid Build Coastguard Worker	sbcs	x4, x4, x6
83*8fb009dcSAndroid Build Coastguard Worker	str	x4, [x0], #8
84*8fb009dcSAndroid Build Coastguard Worker
85*8fb009dcSAndroid Build Coastguard Worker.Lsub_exit:
86*8fb009dcSAndroid Build Coastguard Worker	cset	x0, cc
87*8fb009dcSAndroid Build Coastguard Worker	ret
88*8fb009dcSAndroid Build Coastguard Worker.size	bn_sub_words,.-bn_sub_words
89*8fb009dcSAndroid Build Coastguard Worker#endif  // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(__ELF__)
90