xref: /qemu/target/loongarch/vec.h (revision c7aa3309)
1008a3b16SSong Gao /* SPDX-License-Identifier: GPL-2.0-or-later */
2008a3b16SSong Gao /*
3008a3b16SSong Gao  * QEMU LoongArch vector utilitites
4008a3b16SSong Gao  *
5008a3b16SSong Gao  * Copyright (c) 2023 Loongson Technology Corporation Limited
6008a3b16SSong Gao  */
7008a3b16SSong Gao 
8008a3b16SSong Gao #ifndef LOONGARCH_VEC_H
9008a3b16SSong Gao #define LOONGARCH_VEC_H
10008a3b16SSong Gao 
11008a3b16SSong Gao #if HOST_BIG_ENDIAN
12008a3b16SSong Gao #define B(x)  B[(x) ^ 15]
13008a3b16SSong Gao #define H(x)  H[(x) ^ 7]
14008a3b16SSong Gao #define W(x)  W[(x) ^ 3]
15008a3b16SSong Gao #define D(x)  D[(x) ^ 1]
16008a3b16SSong Gao #define UB(x) UB[(x) ^ 15]
17008a3b16SSong Gao #define UH(x) UH[(x) ^ 7]
18008a3b16SSong Gao #define UW(x) UW[(x) ^ 3]
19008a3b16SSong Gao #define UD(x) UD[(x) ^ 1]
20008a3b16SSong Gao #define Q(x)  Q[x]
21008a3b16SSong Gao #else
22008a3b16SSong Gao #define B(x)  B[x]
23008a3b16SSong Gao #define H(x)  H[x]
24008a3b16SSong Gao #define W(x)  W[x]
25008a3b16SSong Gao #define D(x)  D[x]
26008a3b16SSong Gao #define UB(x) UB[x]
27008a3b16SSong Gao #define UH(x) UH[x]
28008a3b16SSong Gao #define UW(x) UW[x]
29008a3b16SSong Gao #define UD(x) UD[x]
30008a3b16SSong Gao #define Q(x)  Q[x]
31008a3b16SSong Gao #endif /* HOST_BIG_ENDIAN */
32008a3b16SSong Gao 
33c7aa3309SSong Gao #define DO_ADD(a, b)  (a + b)
34c7aa3309SSong Gao #define DO_SUB(a, b)  (a - b)
35c7aa3309SSong Gao #define DO_VAVG(a, b)  ((a >> 1) + (b >> 1) + (a & b & 1))
36c7aa3309SSong Gao #define DO_VAVGR(a, b) ((a >> 1) + (b >> 1) + ((a | b) & 1))
37c7aa3309SSong Gao #define DO_VABSD(a, b)  ((a > b) ? (a -b) : (b-a))
38c7aa3309SSong Gao #define DO_VABS(a)  ((a < 0) ? (-a) : (a))
39c7aa3309SSong Gao #define DO_MIN(a, b) (a < b ? a : b)
40c7aa3309SSong Gao #define DO_MAX(a, b) (a > b ? a : b)
41c7aa3309SSong Gao #define DO_MUL(a, b) (a * b)
42c7aa3309SSong Gao #define DO_MADD(a, b, c)  (a + b * c)
43c7aa3309SSong Gao #define DO_MSUB(a, b, c)  (a - b * c)
44c7aa3309SSong Gao 
45c7aa3309SSong Gao #define DO_DIVU(N, M) (unlikely(M == 0) ? 0 : N / M)
46c7aa3309SSong Gao #define DO_REMU(N, M) (unlikely(M == 0) ? 0 : N % M)
47c7aa3309SSong Gao #define DO_DIV(N, M)  (unlikely(M == 0) ? 0 :\
48c7aa3309SSong Gao         unlikely((N == -N) && (M == (__typeof(N))(-1))) ? N : N / M)
49c7aa3309SSong Gao #define DO_REM(N, M)  (unlikely(M == 0) ? 0 :\
50c7aa3309SSong Gao         unlikely((N == -N) && (M == (__typeof(N))(-1))) ? 0 : N % M)
51c7aa3309SSong Gao 
52c7aa3309SSong Gao #define DO_SIGNCOV(a, b)  (a == 0 ? 0 : a < 0 ? -b : b)
53c7aa3309SSong Gao 
54c7aa3309SSong Gao #define R_SHIFT(a, b) (a >> b)
55c7aa3309SSong Gao 
56c7aa3309SSong Gao #define DO_CLO_B(N)  (clz32(~N & 0xff) - 24)
57c7aa3309SSong Gao #define DO_CLO_H(N)  (clz32(~N & 0xffff) - 16)
58c7aa3309SSong Gao #define DO_CLO_W(N)  (clz32(~N))
59c7aa3309SSong Gao #define DO_CLO_D(N)  (clz64(~N))
60c7aa3309SSong Gao #define DO_CLZ_B(N)  (clz32(N) - 24)
61c7aa3309SSong Gao #define DO_CLZ_H(N)  (clz32(N) - 16)
62c7aa3309SSong Gao #define DO_CLZ_W(N)  (clz32(N))
63c7aa3309SSong Gao #define DO_CLZ_D(N)  (clz64(N))
64c7aa3309SSong Gao 
65c7aa3309SSong Gao #define DO_BITCLR(a, bit) (a & ~(1ull << bit))
66c7aa3309SSong Gao #define DO_BITSET(a, bit) (a | 1ull << bit)
67c7aa3309SSong Gao #define DO_BITREV(a, bit) (a ^ (1ull << bit))
68c7aa3309SSong Gao 
69c7aa3309SSong Gao #define VSEQ(a, b) (a == b ? -1 : 0)
70c7aa3309SSong Gao #define VSLE(a, b) (a <= b ? -1 : 0)
71c7aa3309SSong Gao #define VSLT(a, b) (a < b ? -1 : 0)
72c7aa3309SSong Gao 
73c7aa3309SSong Gao #define SHF_POS(i, imm) (((i) & 0xfc) + (((imm) >> (2 * ((i) & 0x03))) & 0x03))
74c7aa3309SSong Gao 
75008a3b16SSong Gao #endif /* LOONGARCH_VEC_H */
76