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 33*c7aa3309SSong Gao #define DO_ADD(a, b) (a + b) 34*c7aa3309SSong Gao #define DO_SUB(a, b) (a - b) 35*c7aa3309SSong Gao #define DO_VAVG(a, b) ((a >> 1) + (b >> 1) + (a & b & 1)) 36*c7aa3309SSong Gao #define DO_VAVGR(a, b) ((a >> 1) + (b >> 1) + ((a | b) & 1)) 37*c7aa3309SSong Gao #define DO_VABSD(a, b) ((a > b) ? (a -b) : (b-a)) 38*c7aa3309SSong Gao #define DO_VABS(a) ((a < 0) ? (-a) : (a)) 39*c7aa3309SSong Gao #define DO_MIN(a, b) (a < b ? a : b) 40*c7aa3309SSong Gao #define DO_MAX(a, b) (a > b ? a : b) 41*c7aa3309SSong Gao #define DO_MUL(a, b) (a * b) 42*c7aa3309SSong Gao #define DO_MADD(a, b, c) (a + b * c) 43*c7aa3309SSong Gao #define DO_MSUB(a, b, c) (a - b * c) 44*c7aa3309SSong Gao 45*c7aa3309SSong Gao #define DO_DIVU(N, M) (unlikely(M == 0) ? 0 : N / M) 46*c7aa3309SSong Gao #define DO_REMU(N, M) (unlikely(M == 0) ? 0 : N % M) 47*c7aa3309SSong Gao #define DO_DIV(N, M) (unlikely(M == 0) ? 0 :\ 48*c7aa3309SSong Gao unlikely((N == -N) && (M == (__typeof(N))(-1))) ? N : N / M) 49*c7aa3309SSong Gao #define DO_REM(N, M) (unlikely(M == 0) ? 0 :\ 50*c7aa3309SSong Gao unlikely((N == -N) && (M == (__typeof(N))(-1))) ? 0 : N % M) 51*c7aa3309SSong Gao 52*c7aa3309SSong Gao #define DO_SIGNCOV(a, b) (a == 0 ? 0 : a < 0 ? -b : b) 53*c7aa3309SSong Gao 54*c7aa3309SSong Gao #define R_SHIFT(a, b) (a >> b) 55*c7aa3309SSong Gao 56*c7aa3309SSong Gao #define DO_CLO_B(N) (clz32(~N & 0xff) - 24) 57*c7aa3309SSong Gao #define DO_CLO_H(N) (clz32(~N & 0xffff) - 16) 58*c7aa3309SSong Gao #define DO_CLO_W(N) (clz32(~N)) 59*c7aa3309SSong Gao #define DO_CLO_D(N) (clz64(~N)) 60*c7aa3309SSong Gao #define DO_CLZ_B(N) (clz32(N) - 24) 61*c7aa3309SSong Gao #define DO_CLZ_H(N) (clz32(N) - 16) 62*c7aa3309SSong Gao #define DO_CLZ_W(N) (clz32(N)) 63*c7aa3309SSong Gao #define DO_CLZ_D(N) (clz64(N)) 64*c7aa3309SSong Gao 65*c7aa3309SSong Gao #define DO_BITCLR(a, bit) (a & ~(1ull << bit)) 66*c7aa3309SSong Gao #define DO_BITSET(a, bit) (a | 1ull << bit) 67*c7aa3309SSong Gao #define DO_BITREV(a, bit) (a ^ (1ull << bit)) 68*c7aa3309SSong Gao 69*c7aa3309SSong Gao #define VSEQ(a, b) (a == b ? -1 : 0) 70*c7aa3309SSong Gao #define VSLE(a, b) (a <= b ? -1 : 0) 71*c7aa3309SSong Gao #define VSLT(a, b) (a < b ? -1 : 0) 72*c7aa3309SSong Gao 73*c7aa3309SSong Gao #define SHF_POS(i, imm) (((i) & 0xfc) + (((imm) >> (2 * ((i) & 0x03))) & 0x03)) 74*c7aa3309SSong Gao 75008a3b16SSong Gao #endif /* LOONGARCH_VEC_H */ 76