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