xref: /linux/lib/crc/arm/crc64-neon.h (revision 0eaed89c18aeedf0898baf2dbf5ff027c6795152)
1*e3babebfSArd Biesheuvel // SPDX-License-Identifier: GPL-2.0-only
2*e3babebfSArd Biesheuvel 
3*e3babebfSArd Biesheuvel static inline uint64x2_t pmull64(uint64x2_t a, uint64x2_t b)
4*e3babebfSArd Biesheuvel {
5*e3babebfSArd Biesheuvel 	uint64_t l = vgetq_lane_u64(a, 0);
6*e3babebfSArd Biesheuvel 	uint64_t m = vgetq_lane_u64(b, 0);
7*e3babebfSArd Biesheuvel 	uint64x2_t result;
8*e3babebfSArd Biesheuvel 
9*e3babebfSArd Biesheuvel 	asm("vmull.p64	%q0, %P1, %P2" : "=w"(result) : "w"(l), "w"(m));
10*e3babebfSArd Biesheuvel 
11*e3babebfSArd Biesheuvel 	return result;
12*e3babebfSArd Biesheuvel }
13*e3babebfSArd Biesheuvel 
14*e3babebfSArd Biesheuvel static inline uint64x2_t pmull64_high(uint64x2_t a, uint64x2_t b)
15*e3babebfSArd Biesheuvel {
16*e3babebfSArd Biesheuvel 	uint64_t l = vgetq_lane_u64(a, 1);
17*e3babebfSArd Biesheuvel 	uint64_t m = vgetq_lane_u64(b, 1);
18*e3babebfSArd Biesheuvel 	uint64x2_t result;
19*e3babebfSArd Biesheuvel 
20*e3babebfSArd Biesheuvel 	asm("vmull.p64	%q0, %P1, %P2" : "=w"(result) : "w"(l), "w"(m));
21*e3babebfSArd Biesheuvel 
22*e3babebfSArd Biesheuvel 	return result;
23*e3babebfSArd Biesheuvel }
24*e3babebfSArd Biesheuvel 
25*e3babebfSArd Biesheuvel static inline uint64x2_t pmull64_hi_lo(uint64x2_t a, uint64x2_t b)
26*e3babebfSArd Biesheuvel {
27*e3babebfSArd Biesheuvel 	uint64_t l = vgetq_lane_u64(a, 1);
28*e3babebfSArd Biesheuvel 	uint64_t m = vgetq_lane_u64(b, 0);
29*e3babebfSArd Biesheuvel 	uint64x2_t result;
30*e3babebfSArd Biesheuvel 
31*e3babebfSArd Biesheuvel 	asm("vmull.p64	%q0, %P1, %P2" : "=w"(result) : "w"(l), "w"(m));
32*e3babebfSArd Biesheuvel 
33*e3babebfSArd Biesheuvel 	return result;
34*e3babebfSArd Biesheuvel }
35