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