1447ca1cbSRichard Henderson /* SPDX-License-Identifier: GPL-2.0-or-later */ 2447ca1cbSRichard Henderson /* 3447ca1cbSRichard Henderson * Target independent generic vector operation expansion 4447ca1cbSRichard Henderson * 5447ca1cbSRichard Henderson * Copyright (c) 2018 Linaro 6447ca1cbSRichard Henderson */ 7447ca1cbSRichard Henderson 8447ca1cbSRichard Henderson #ifndef TCG_TCG_OP_GVEC_COMMON_H 9447ca1cbSRichard Henderson #define TCG_TCG_OP_GVEC_COMMON_H 10447ca1cbSRichard Henderson 11447ca1cbSRichard Henderson /* 12447ca1cbSRichard Henderson * "Generic" vectors. All operands are given as offsets from ENV, 13447ca1cbSRichard Henderson * and therefore cannot also be allocated via tcg_global_mem_new_*. 14447ca1cbSRichard Henderson * OPRSZ is the byte size of the vector upon which the operation is performed. 15447ca1cbSRichard Henderson * MAXSZ is the byte size of the full vector; bytes beyond OPSZ are cleared. 16447ca1cbSRichard Henderson * 17447ca1cbSRichard Henderson * All sizes must be 8 or any multiple of 16. 18447ca1cbSRichard Henderson * When OPRSZ is 8, the alignment may be 8, otherwise must be 16. 19447ca1cbSRichard Henderson * Operands may completely, but not partially, overlap. 20447ca1cbSRichard Henderson */ 21447ca1cbSRichard Henderson 22447ca1cbSRichard Henderson /* Expand a call to a gvec-style helper, with pointers to two vector 23447ca1cbSRichard Henderson operands, and a descriptor (see tcg-gvec-desc.h). */ 24447ca1cbSRichard Henderson typedef void gen_helper_gvec_2(TCGv_ptr, TCGv_ptr, TCGv_i32); 25447ca1cbSRichard Henderson void tcg_gen_gvec_2_ool(uint32_t dofs, uint32_t aofs, 26447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, int32_t data, 27447ca1cbSRichard Henderson gen_helper_gvec_2 *fn); 28447ca1cbSRichard Henderson 29447ca1cbSRichard Henderson /* Similarly, passing an extra data value. */ 30447ca1cbSRichard Henderson typedef void gen_helper_gvec_2i(TCGv_ptr, TCGv_ptr, TCGv_i64, TCGv_i32); 31447ca1cbSRichard Henderson void tcg_gen_gvec_2i_ool(uint32_t dofs, uint32_t aofs, TCGv_i64 c, 32447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, int32_t data, 33447ca1cbSRichard Henderson gen_helper_gvec_2i *fn); 34447ca1cbSRichard Henderson 35447ca1cbSRichard Henderson /* Similarly, passing an extra pointer (e.g. env or float_status). */ 36447ca1cbSRichard Henderson typedef void gen_helper_gvec_2_ptr(TCGv_ptr, TCGv_ptr, TCGv_ptr, TCGv_i32); 37447ca1cbSRichard Henderson void tcg_gen_gvec_2_ptr(uint32_t dofs, uint32_t aofs, 38447ca1cbSRichard Henderson TCGv_ptr ptr, uint32_t oprsz, uint32_t maxsz, 39447ca1cbSRichard Henderson int32_t data, gen_helper_gvec_2_ptr *fn); 40447ca1cbSRichard Henderson 41447ca1cbSRichard Henderson /* Similarly, with three vector operands. */ 42447ca1cbSRichard Henderson typedef void gen_helper_gvec_3(TCGv_ptr, TCGv_ptr, TCGv_ptr, TCGv_i32); 43447ca1cbSRichard Henderson void tcg_gen_gvec_3_ool(uint32_t dofs, uint32_t aofs, uint32_t bofs, 44447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, int32_t data, 45447ca1cbSRichard Henderson gen_helper_gvec_3 *fn); 46447ca1cbSRichard Henderson 47447ca1cbSRichard Henderson /* Similarly, with four vector operands. */ 48447ca1cbSRichard Henderson typedef void gen_helper_gvec_4(TCGv_ptr, TCGv_ptr, TCGv_ptr, 49447ca1cbSRichard Henderson TCGv_ptr, TCGv_i32); 50447ca1cbSRichard Henderson void tcg_gen_gvec_4_ool(uint32_t dofs, uint32_t aofs, uint32_t bofs, 51447ca1cbSRichard Henderson uint32_t cofs, uint32_t oprsz, uint32_t maxsz, 52447ca1cbSRichard Henderson int32_t data, gen_helper_gvec_4 *fn); 53447ca1cbSRichard Henderson 54447ca1cbSRichard Henderson /* Similarly, with five vector operands. */ 55447ca1cbSRichard Henderson typedef void gen_helper_gvec_5(TCGv_ptr, TCGv_ptr, TCGv_ptr, TCGv_ptr, 56447ca1cbSRichard Henderson TCGv_ptr, TCGv_i32); 57447ca1cbSRichard Henderson void tcg_gen_gvec_5_ool(uint32_t dofs, uint32_t aofs, uint32_t bofs, 58447ca1cbSRichard Henderson uint32_t cofs, uint32_t xofs, uint32_t oprsz, 59447ca1cbSRichard Henderson uint32_t maxsz, int32_t data, gen_helper_gvec_5 *fn); 60447ca1cbSRichard Henderson 61447ca1cbSRichard Henderson typedef void gen_helper_gvec_3_ptr(TCGv_ptr, TCGv_ptr, TCGv_ptr, 62447ca1cbSRichard Henderson TCGv_ptr, TCGv_i32); 63447ca1cbSRichard Henderson void tcg_gen_gvec_3_ptr(uint32_t dofs, uint32_t aofs, uint32_t bofs, 64447ca1cbSRichard Henderson TCGv_ptr ptr, uint32_t oprsz, uint32_t maxsz, 65447ca1cbSRichard Henderson int32_t data, gen_helper_gvec_3_ptr *fn); 66447ca1cbSRichard Henderson 67447ca1cbSRichard Henderson typedef void gen_helper_gvec_4_ptr(TCGv_ptr, TCGv_ptr, TCGv_ptr, 68447ca1cbSRichard Henderson TCGv_ptr, TCGv_ptr, TCGv_i32); 69447ca1cbSRichard Henderson void tcg_gen_gvec_4_ptr(uint32_t dofs, uint32_t aofs, uint32_t bofs, 70447ca1cbSRichard Henderson uint32_t cofs, TCGv_ptr ptr, uint32_t oprsz, 71447ca1cbSRichard Henderson uint32_t maxsz, int32_t data, 72447ca1cbSRichard Henderson gen_helper_gvec_4_ptr *fn); 73447ca1cbSRichard Henderson 74447ca1cbSRichard Henderson typedef void gen_helper_gvec_5_ptr(TCGv_ptr, TCGv_ptr, TCGv_ptr, TCGv_ptr, 75447ca1cbSRichard Henderson TCGv_ptr, TCGv_ptr, TCGv_i32); 76447ca1cbSRichard Henderson void tcg_gen_gvec_5_ptr(uint32_t dofs, uint32_t aofs, uint32_t bofs, 77447ca1cbSRichard Henderson uint32_t cofs, uint32_t eofs, TCGv_ptr ptr, 78447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, int32_t data, 79447ca1cbSRichard Henderson gen_helper_gvec_5_ptr *fn); 80447ca1cbSRichard Henderson 81447ca1cbSRichard Henderson /* Expand a gvec operation. Either inline or out-of-line depending on 82447ca1cbSRichard Henderson the actual vector size and the operations supported by the host. */ 83447ca1cbSRichard Henderson typedef struct { 84447ca1cbSRichard Henderson /* Expand inline as a 64-bit or 32-bit integer. 85447ca1cbSRichard Henderson Only one of these will be non-NULL. */ 86447ca1cbSRichard Henderson void (*fni8)(TCGv_i64, TCGv_i64); 87447ca1cbSRichard Henderson void (*fni4)(TCGv_i32, TCGv_i32); 88447ca1cbSRichard Henderson /* Expand inline with a host vector type. */ 89447ca1cbSRichard Henderson void (*fniv)(unsigned, TCGv_vec, TCGv_vec); 90447ca1cbSRichard Henderson /* Expand out-of-line helper w/descriptor. */ 91447ca1cbSRichard Henderson gen_helper_gvec_2 *fno; 92447ca1cbSRichard Henderson /* The optional opcodes, if any, utilized by .fniv. */ 93447ca1cbSRichard Henderson const TCGOpcode *opt_opc; 94447ca1cbSRichard Henderson /* The data argument to the out-of-line helper. */ 95447ca1cbSRichard Henderson int32_t data; 96447ca1cbSRichard Henderson /* The vector element size, if applicable. */ 97447ca1cbSRichard Henderson uint8_t vece; 98447ca1cbSRichard Henderson /* Prefer i64 to v64. */ 99447ca1cbSRichard Henderson bool prefer_i64; 100447ca1cbSRichard Henderson /* Load dest as a 2nd source operand. */ 101447ca1cbSRichard Henderson bool load_dest; 102447ca1cbSRichard Henderson } GVecGen2; 103447ca1cbSRichard Henderson 104447ca1cbSRichard Henderson typedef struct { 105447ca1cbSRichard Henderson /* Expand inline as a 64-bit or 32-bit integer. 106447ca1cbSRichard Henderson Only one of these will be non-NULL. */ 107447ca1cbSRichard Henderson void (*fni8)(TCGv_i64, TCGv_i64, int64_t); 108447ca1cbSRichard Henderson void (*fni4)(TCGv_i32, TCGv_i32, int32_t); 109447ca1cbSRichard Henderson /* Expand inline with a host vector type. */ 110447ca1cbSRichard Henderson void (*fniv)(unsigned, TCGv_vec, TCGv_vec, int64_t); 111447ca1cbSRichard Henderson /* Expand out-of-line helper w/descriptor, data in descriptor. */ 112447ca1cbSRichard Henderson gen_helper_gvec_2 *fno; 113447ca1cbSRichard Henderson /* Expand out-of-line helper w/descriptor, data as argument. */ 114447ca1cbSRichard Henderson gen_helper_gvec_2i *fnoi; 115447ca1cbSRichard Henderson /* The optional opcodes, if any, utilized by .fniv. */ 116447ca1cbSRichard Henderson const TCGOpcode *opt_opc; 117447ca1cbSRichard Henderson /* The vector element size, if applicable. */ 118447ca1cbSRichard Henderson uint8_t vece; 119447ca1cbSRichard Henderson /* Prefer i64 to v64. */ 120447ca1cbSRichard Henderson bool prefer_i64; 121447ca1cbSRichard Henderson /* Load dest as a 3rd source operand. */ 122447ca1cbSRichard Henderson bool load_dest; 123447ca1cbSRichard Henderson } GVecGen2i; 124447ca1cbSRichard Henderson 125447ca1cbSRichard Henderson typedef struct { 126447ca1cbSRichard Henderson /* Expand inline as a 64-bit or 32-bit integer. 127447ca1cbSRichard Henderson Only one of these will be non-NULL. */ 128447ca1cbSRichard Henderson void (*fni8)(TCGv_i64, TCGv_i64, TCGv_i64); 129447ca1cbSRichard Henderson void (*fni4)(TCGv_i32, TCGv_i32, TCGv_i32); 130447ca1cbSRichard Henderson /* Expand inline with a host vector type. */ 131447ca1cbSRichard Henderson void (*fniv)(unsigned, TCGv_vec, TCGv_vec, TCGv_vec); 132447ca1cbSRichard Henderson /* Expand out-of-line helper w/descriptor. */ 133447ca1cbSRichard Henderson gen_helper_gvec_2i *fno; 134447ca1cbSRichard Henderson /* The optional opcodes, if any, utilized by .fniv. */ 135447ca1cbSRichard Henderson const TCGOpcode *opt_opc; 136447ca1cbSRichard Henderson /* The data argument to the out-of-line helper. */ 137447ca1cbSRichard Henderson uint32_t data; 138447ca1cbSRichard Henderson /* The vector element size, if applicable. */ 139447ca1cbSRichard Henderson uint8_t vece; 140447ca1cbSRichard Henderson /* Prefer i64 to v64. */ 141447ca1cbSRichard Henderson bool prefer_i64; 142447ca1cbSRichard Henderson /* Load scalar as 1st source operand. */ 143447ca1cbSRichard Henderson bool scalar_first; 144447ca1cbSRichard Henderson } GVecGen2s; 145447ca1cbSRichard Henderson 146447ca1cbSRichard Henderson typedef struct { 147447ca1cbSRichard Henderson /* Expand inline as a 64-bit or 32-bit integer. 148447ca1cbSRichard Henderson Only one of these will be non-NULL. */ 149447ca1cbSRichard Henderson void (*fni8)(TCGv_i64, TCGv_i64, TCGv_i64); 150447ca1cbSRichard Henderson void (*fni4)(TCGv_i32, TCGv_i32, TCGv_i32); 151447ca1cbSRichard Henderson /* Expand inline with a host vector type. */ 152447ca1cbSRichard Henderson void (*fniv)(unsigned, TCGv_vec, TCGv_vec, TCGv_vec); 153447ca1cbSRichard Henderson /* Expand out-of-line helper w/descriptor. */ 154447ca1cbSRichard Henderson gen_helper_gvec_3 *fno; 155447ca1cbSRichard Henderson /* The optional opcodes, if any, utilized by .fniv. */ 156447ca1cbSRichard Henderson const TCGOpcode *opt_opc; 157447ca1cbSRichard Henderson /* The data argument to the out-of-line helper. */ 158447ca1cbSRichard Henderson int32_t data; 159447ca1cbSRichard Henderson /* The vector element size, if applicable. */ 160447ca1cbSRichard Henderson uint8_t vece; 161447ca1cbSRichard Henderson /* Prefer i64 to v64. */ 162447ca1cbSRichard Henderson bool prefer_i64; 163447ca1cbSRichard Henderson /* Load dest as a 3rd source operand. */ 164447ca1cbSRichard Henderson bool load_dest; 165447ca1cbSRichard Henderson } GVecGen3; 166447ca1cbSRichard Henderson 167447ca1cbSRichard Henderson typedef struct { 168447ca1cbSRichard Henderson /* 169447ca1cbSRichard Henderson * Expand inline as a 64-bit or 32-bit integer. Only one of these will be 170447ca1cbSRichard Henderson * non-NULL. 171447ca1cbSRichard Henderson */ 172447ca1cbSRichard Henderson void (*fni8)(TCGv_i64, TCGv_i64, TCGv_i64, int64_t); 173447ca1cbSRichard Henderson void (*fni4)(TCGv_i32, TCGv_i32, TCGv_i32, int32_t); 174447ca1cbSRichard Henderson /* Expand inline with a host vector type. */ 175447ca1cbSRichard Henderson void (*fniv)(unsigned, TCGv_vec, TCGv_vec, TCGv_vec, int64_t); 176447ca1cbSRichard Henderson /* Expand out-of-line helper w/descriptor, data in descriptor. */ 177447ca1cbSRichard Henderson gen_helper_gvec_3 *fno; 178447ca1cbSRichard Henderson /* The optional opcodes, if any, utilized by .fniv. */ 179447ca1cbSRichard Henderson const TCGOpcode *opt_opc; 180447ca1cbSRichard Henderson /* The vector element size, if applicable. */ 181447ca1cbSRichard Henderson uint8_t vece; 182447ca1cbSRichard Henderson /* Prefer i64 to v64. */ 183447ca1cbSRichard Henderson bool prefer_i64; 184447ca1cbSRichard Henderson /* Load dest as a 3rd source operand. */ 185447ca1cbSRichard Henderson bool load_dest; 186b3ee719eSRichard Henderson /* Write aofs as a 2nd dest operand. */ 187b3ee719eSRichard Henderson bool write_aofs; 188447ca1cbSRichard Henderson } GVecGen3i; 189447ca1cbSRichard Henderson 190447ca1cbSRichard Henderson typedef struct { 191447ca1cbSRichard Henderson /* Expand inline as a 64-bit or 32-bit integer. 192447ca1cbSRichard Henderson Only one of these will be non-NULL. */ 193447ca1cbSRichard Henderson void (*fni8)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64); 194447ca1cbSRichard Henderson void (*fni4)(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_i32); 195447ca1cbSRichard Henderson /* Expand inline with a host vector type. */ 196447ca1cbSRichard Henderson void (*fniv)(unsigned, TCGv_vec, TCGv_vec, TCGv_vec, TCGv_vec); 197447ca1cbSRichard Henderson /* Expand out-of-line helper w/descriptor. */ 198447ca1cbSRichard Henderson gen_helper_gvec_4 *fno; 199447ca1cbSRichard Henderson /* The optional opcodes, if any, utilized by .fniv. */ 200447ca1cbSRichard Henderson const TCGOpcode *opt_opc; 201447ca1cbSRichard Henderson /* The data argument to the out-of-line helper. */ 202447ca1cbSRichard Henderson int32_t data; 203447ca1cbSRichard Henderson /* The vector element size, if applicable. */ 204447ca1cbSRichard Henderson uint8_t vece; 205447ca1cbSRichard Henderson /* Prefer i64 to v64. */ 206447ca1cbSRichard Henderson bool prefer_i64; 207447ca1cbSRichard Henderson /* Write aofs as a 2nd dest operand. */ 208447ca1cbSRichard Henderson bool write_aofs; 209447ca1cbSRichard Henderson } GVecGen4; 210447ca1cbSRichard Henderson 211447ca1cbSRichard Henderson typedef struct { 212447ca1cbSRichard Henderson /* 213447ca1cbSRichard Henderson * Expand inline as a 64-bit or 32-bit integer. Only one of these will be 214447ca1cbSRichard Henderson * non-NULL. 215447ca1cbSRichard Henderson */ 216447ca1cbSRichard Henderson void (*fni8)(TCGv_i64, TCGv_i64, TCGv_i64, TCGv_i64, int64_t); 217447ca1cbSRichard Henderson void (*fni4)(TCGv_i32, TCGv_i32, TCGv_i32, TCGv_i32, int32_t); 218447ca1cbSRichard Henderson /* Expand inline with a host vector type. */ 219447ca1cbSRichard Henderson void (*fniv)(unsigned, TCGv_vec, TCGv_vec, TCGv_vec, TCGv_vec, int64_t); 220447ca1cbSRichard Henderson /* Expand out-of-line helper w/descriptor, data in descriptor. */ 221447ca1cbSRichard Henderson gen_helper_gvec_4 *fno; 222447ca1cbSRichard Henderson /* The optional opcodes, if any, utilized by .fniv. */ 223447ca1cbSRichard Henderson const TCGOpcode *opt_opc; 224447ca1cbSRichard Henderson /* The vector element size, if applicable. */ 225447ca1cbSRichard Henderson uint8_t vece; 226447ca1cbSRichard Henderson /* Prefer i64 to v64. */ 227447ca1cbSRichard Henderson bool prefer_i64; 228447ca1cbSRichard Henderson } GVecGen4i; 229447ca1cbSRichard Henderson 230447ca1cbSRichard Henderson void tcg_gen_gvec_2(uint32_t dofs, uint32_t aofs, 231447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, const GVecGen2 *); 232447ca1cbSRichard Henderson void tcg_gen_gvec_2i(uint32_t dofs, uint32_t aofs, uint32_t oprsz, 233447ca1cbSRichard Henderson uint32_t maxsz, int64_t c, const GVecGen2i *); 234447ca1cbSRichard Henderson void tcg_gen_gvec_2s(uint32_t dofs, uint32_t aofs, uint32_t oprsz, 235447ca1cbSRichard Henderson uint32_t maxsz, TCGv_i64 c, const GVecGen2s *); 236447ca1cbSRichard Henderson void tcg_gen_gvec_3(uint32_t dofs, uint32_t aofs, uint32_t bofs, 237447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, const GVecGen3 *); 238447ca1cbSRichard Henderson void tcg_gen_gvec_3i(uint32_t dofs, uint32_t aofs, uint32_t bofs, 239447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, int64_t c, 240447ca1cbSRichard Henderson const GVecGen3i *); 241447ca1cbSRichard Henderson void tcg_gen_gvec_4(uint32_t dofs, uint32_t aofs, uint32_t bofs, uint32_t cofs, 242447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, const GVecGen4 *); 243447ca1cbSRichard Henderson void tcg_gen_gvec_4i(uint32_t dofs, uint32_t aofs, uint32_t bofs, uint32_t cofs, 244447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz, int64_t c, 245447ca1cbSRichard Henderson const GVecGen4i *); 246447ca1cbSRichard Henderson 247447ca1cbSRichard Henderson /* Expand a specific vector operation. */ 248447ca1cbSRichard Henderson 249447ca1cbSRichard Henderson void tcg_gen_gvec_mov(unsigned vece, uint32_t dofs, uint32_t aofs, 250447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz); 251447ca1cbSRichard Henderson void tcg_gen_gvec_not(unsigned vece, uint32_t dofs, uint32_t aofs, 252447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz); 253447ca1cbSRichard Henderson void tcg_gen_gvec_neg(unsigned vece, uint32_t dofs, uint32_t aofs, 254447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz); 255447ca1cbSRichard Henderson void tcg_gen_gvec_abs(unsigned vece, uint32_t dofs, uint32_t aofs, 256447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz); 257447ca1cbSRichard Henderson 258447ca1cbSRichard Henderson void tcg_gen_gvec_add(unsigned vece, uint32_t dofs, uint32_t aofs, 259447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 260447ca1cbSRichard Henderson void tcg_gen_gvec_sub(unsigned vece, uint32_t dofs, uint32_t aofs, 261447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 262447ca1cbSRichard Henderson void tcg_gen_gvec_mul(unsigned vece, uint32_t dofs, uint32_t aofs, 263447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 264447ca1cbSRichard Henderson 265447ca1cbSRichard Henderson void tcg_gen_gvec_addi(unsigned vece, uint32_t dofs, uint32_t aofs, 266447ca1cbSRichard Henderson int64_t c, uint32_t oprsz, uint32_t maxsz); 267447ca1cbSRichard Henderson void tcg_gen_gvec_muli(unsigned vece, uint32_t dofs, uint32_t aofs, 268447ca1cbSRichard Henderson int64_t c, uint32_t oprsz, uint32_t maxsz); 269447ca1cbSRichard Henderson 270447ca1cbSRichard Henderson void tcg_gen_gvec_adds(unsigned vece, uint32_t dofs, uint32_t aofs, 271447ca1cbSRichard Henderson TCGv_i64 c, uint32_t oprsz, uint32_t maxsz); 272447ca1cbSRichard Henderson void tcg_gen_gvec_subs(unsigned vece, uint32_t dofs, uint32_t aofs, 273447ca1cbSRichard Henderson TCGv_i64 c, uint32_t oprsz, uint32_t maxsz); 274447ca1cbSRichard Henderson void tcg_gen_gvec_muls(unsigned vece, uint32_t dofs, uint32_t aofs, 275447ca1cbSRichard Henderson TCGv_i64 c, uint32_t oprsz, uint32_t maxsz); 276447ca1cbSRichard Henderson 277447ca1cbSRichard Henderson /* Saturated arithmetic. */ 278447ca1cbSRichard Henderson void tcg_gen_gvec_ssadd(unsigned vece, uint32_t dofs, uint32_t aofs, 279447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 280447ca1cbSRichard Henderson void tcg_gen_gvec_sssub(unsigned vece, uint32_t dofs, uint32_t aofs, 281447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 282447ca1cbSRichard Henderson void tcg_gen_gvec_usadd(unsigned vece, uint32_t dofs, uint32_t aofs, 283447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 284447ca1cbSRichard Henderson void tcg_gen_gvec_ussub(unsigned vece, uint32_t dofs, uint32_t aofs, 285447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 286447ca1cbSRichard Henderson 287447ca1cbSRichard Henderson /* Min/max. */ 288447ca1cbSRichard Henderson void tcg_gen_gvec_smin(unsigned vece, uint32_t dofs, uint32_t aofs, 289447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 290447ca1cbSRichard Henderson void tcg_gen_gvec_umin(unsigned vece, uint32_t dofs, uint32_t aofs, 291447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 292447ca1cbSRichard Henderson void tcg_gen_gvec_smax(unsigned vece, uint32_t dofs, uint32_t aofs, 293447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 294447ca1cbSRichard Henderson void tcg_gen_gvec_umax(unsigned vece, uint32_t dofs, uint32_t aofs, 295447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 296447ca1cbSRichard Henderson 297447ca1cbSRichard Henderson void tcg_gen_gvec_and(unsigned vece, uint32_t dofs, uint32_t aofs, 298447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 299447ca1cbSRichard Henderson void tcg_gen_gvec_or(unsigned vece, uint32_t dofs, uint32_t aofs, 300447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 301447ca1cbSRichard Henderson void tcg_gen_gvec_xor(unsigned vece, uint32_t dofs, uint32_t aofs, 302447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 303447ca1cbSRichard Henderson void tcg_gen_gvec_andc(unsigned vece, uint32_t dofs, uint32_t aofs, 304447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 305447ca1cbSRichard Henderson void tcg_gen_gvec_orc(unsigned vece, uint32_t dofs, uint32_t aofs, 306447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 307447ca1cbSRichard Henderson void tcg_gen_gvec_nand(unsigned vece, uint32_t dofs, uint32_t aofs, 308447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 309447ca1cbSRichard Henderson void tcg_gen_gvec_nor(unsigned vece, uint32_t dofs, uint32_t aofs, 310447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 311447ca1cbSRichard Henderson void tcg_gen_gvec_eqv(unsigned vece, uint32_t dofs, uint32_t aofs, 312447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 313447ca1cbSRichard Henderson 314447ca1cbSRichard Henderson void tcg_gen_gvec_andi(unsigned vece, uint32_t dofs, uint32_t aofs, 315447ca1cbSRichard Henderson int64_t c, uint32_t oprsz, uint32_t maxsz); 316447ca1cbSRichard Henderson void tcg_gen_gvec_xori(unsigned vece, uint32_t dofs, uint32_t aofs, 317447ca1cbSRichard Henderson int64_t c, uint32_t oprsz, uint32_t maxsz); 318447ca1cbSRichard Henderson void tcg_gen_gvec_ori(unsigned vece, uint32_t dofs, uint32_t aofs, 319447ca1cbSRichard Henderson int64_t c, uint32_t oprsz, uint32_t maxsz); 320447ca1cbSRichard Henderson 321447ca1cbSRichard Henderson void tcg_gen_gvec_ands(unsigned vece, uint32_t dofs, uint32_t aofs, 322447ca1cbSRichard Henderson TCGv_i64 c, uint32_t oprsz, uint32_t maxsz); 323447ca1cbSRichard Henderson void tcg_gen_gvec_andcs(unsigned vece, uint32_t dofs, uint32_t aofs, 324447ca1cbSRichard Henderson TCGv_i64 c, uint32_t oprsz, uint32_t maxsz); 325447ca1cbSRichard Henderson void tcg_gen_gvec_xors(unsigned vece, uint32_t dofs, uint32_t aofs, 326447ca1cbSRichard Henderson TCGv_i64 c, uint32_t oprsz, uint32_t maxsz); 327447ca1cbSRichard Henderson void tcg_gen_gvec_ors(unsigned vece, uint32_t dofs, uint32_t aofs, 328447ca1cbSRichard Henderson TCGv_i64 c, uint32_t oprsz, uint32_t maxsz); 329447ca1cbSRichard Henderson 330447ca1cbSRichard Henderson void tcg_gen_gvec_dup_mem(unsigned vece, uint32_t dofs, uint32_t aofs, 331447ca1cbSRichard Henderson uint32_t s, uint32_t m); 332447ca1cbSRichard Henderson void tcg_gen_gvec_dup_imm(unsigned vece, uint32_t dofs, uint32_t s, 333447ca1cbSRichard Henderson uint32_t m, uint64_t imm); 334447ca1cbSRichard Henderson void tcg_gen_gvec_dup_i32(unsigned vece, uint32_t dofs, uint32_t s, 335447ca1cbSRichard Henderson uint32_t m, TCGv_i32); 336447ca1cbSRichard Henderson void tcg_gen_gvec_dup_i64(unsigned vece, uint32_t dofs, uint32_t s, 337447ca1cbSRichard Henderson uint32_t m, TCGv_i64); 338447ca1cbSRichard Henderson 339447ca1cbSRichard Henderson void tcg_gen_gvec_shli(unsigned vece, uint32_t dofs, uint32_t aofs, 340447ca1cbSRichard Henderson int64_t shift, uint32_t oprsz, uint32_t maxsz); 341447ca1cbSRichard Henderson void tcg_gen_gvec_shri(unsigned vece, uint32_t dofs, uint32_t aofs, 342447ca1cbSRichard Henderson int64_t shift, uint32_t oprsz, uint32_t maxsz); 343447ca1cbSRichard Henderson void tcg_gen_gvec_sari(unsigned vece, uint32_t dofs, uint32_t aofs, 344447ca1cbSRichard Henderson int64_t shift, uint32_t oprsz, uint32_t maxsz); 345447ca1cbSRichard Henderson void tcg_gen_gvec_rotli(unsigned vece, uint32_t dofs, uint32_t aofs, 346447ca1cbSRichard Henderson int64_t shift, uint32_t oprsz, uint32_t maxsz); 347447ca1cbSRichard Henderson void tcg_gen_gvec_rotri(unsigned vece, uint32_t dofs, uint32_t aofs, 348447ca1cbSRichard Henderson int64_t shift, uint32_t oprsz, uint32_t maxsz); 349447ca1cbSRichard Henderson 350447ca1cbSRichard Henderson void tcg_gen_gvec_shls(unsigned vece, uint32_t dofs, uint32_t aofs, 351447ca1cbSRichard Henderson TCGv_i32 shift, uint32_t oprsz, uint32_t maxsz); 352447ca1cbSRichard Henderson void tcg_gen_gvec_shrs(unsigned vece, uint32_t dofs, uint32_t aofs, 353447ca1cbSRichard Henderson TCGv_i32 shift, uint32_t oprsz, uint32_t maxsz); 354447ca1cbSRichard Henderson void tcg_gen_gvec_sars(unsigned vece, uint32_t dofs, uint32_t aofs, 355447ca1cbSRichard Henderson TCGv_i32 shift, uint32_t oprsz, uint32_t maxsz); 356447ca1cbSRichard Henderson void tcg_gen_gvec_rotls(unsigned vece, uint32_t dofs, uint32_t aofs, 357447ca1cbSRichard Henderson TCGv_i32 shift, uint32_t oprsz, uint32_t maxsz); 358447ca1cbSRichard Henderson void tcg_gen_gvec_rotrs(unsigned vece, uint32_t dofs, uint32_t aofs, 359447ca1cbSRichard Henderson TCGv_i32 shift, uint32_t oprsz, uint32_t maxsz); 360447ca1cbSRichard Henderson 361447ca1cbSRichard Henderson /* 362447ca1cbSRichard Henderson * Perform vector shift by vector element, modulo the element size. 363447ca1cbSRichard Henderson * E.g. D[i] = A[i] << (B[i] % (8 << vece)). 364447ca1cbSRichard Henderson */ 365447ca1cbSRichard Henderson void tcg_gen_gvec_shlv(unsigned vece, uint32_t dofs, uint32_t aofs, 366447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 367447ca1cbSRichard Henderson void tcg_gen_gvec_shrv(unsigned vece, uint32_t dofs, uint32_t aofs, 368447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 369447ca1cbSRichard Henderson void tcg_gen_gvec_sarv(unsigned vece, uint32_t dofs, uint32_t aofs, 370447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 371447ca1cbSRichard Henderson void tcg_gen_gvec_rotlv(unsigned vece, uint32_t dofs, uint32_t aofs, 372447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 373447ca1cbSRichard Henderson void tcg_gen_gvec_rotrv(unsigned vece, uint32_t dofs, uint32_t aofs, 374447ca1cbSRichard Henderson uint32_t bofs, uint32_t oprsz, uint32_t maxsz); 375447ca1cbSRichard Henderson 376447ca1cbSRichard Henderson void tcg_gen_gvec_cmp(TCGCond cond, unsigned vece, uint32_t dofs, 377447ca1cbSRichard Henderson uint32_t aofs, uint32_t bofs, 378447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz); 3799622c697SRichard Henderson void tcg_gen_gvec_cmpi(TCGCond cond, unsigned vece, uint32_t dofs, 3809622c697SRichard Henderson uint32_t aofs, int64_t c, 3819622c697SRichard Henderson uint32_t oprsz, uint32_t maxsz); 3829622c697SRichard Henderson void tcg_gen_gvec_cmps(TCGCond cond, unsigned vece, uint32_t dofs, 3839622c697SRichard Henderson uint32_t aofs, TCGv_i64 c, 3849622c697SRichard Henderson uint32_t oprsz, uint32_t maxsz); 385447ca1cbSRichard Henderson 386447ca1cbSRichard Henderson /* 387447ca1cbSRichard Henderson * Perform vector bit select: d = (b & a) | (c & ~a). 388447ca1cbSRichard Henderson */ 389447ca1cbSRichard Henderson void tcg_gen_gvec_bitsel(unsigned vece, uint32_t dofs, uint32_t aofs, 390447ca1cbSRichard Henderson uint32_t bofs, uint32_t cofs, 391447ca1cbSRichard Henderson uint32_t oprsz, uint32_t maxsz); 392447ca1cbSRichard Henderson 393447ca1cbSRichard Henderson /* 394447ca1cbSRichard Henderson * 64-bit vector operations. Use these when the register has been allocated 395447ca1cbSRichard Henderson * with tcg_global_mem_new_i64, and so we cannot also address it via pointer. 396447ca1cbSRichard Henderson * OPRSZ = MAXSZ = 8. 397447ca1cbSRichard Henderson */ 398447ca1cbSRichard Henderson 399447ca1cbSRichard Henderson void tcg_gen_vec_neg8_i64(TCGv_i64 d, TCGv_i64 a); 400447ca1cbSRichard Henderson void tcg_gen_vec_neg16_i64(TCGv_i64 d, TCGv_i64 a); 401447ca1cbSRichard Henderson void tcg_gen_vec_neg32_i64(TCGv_i64 d, TCGv_i64 a); 402447ca1cbSRichard Henderson 403447ca1cbSRichard Henderson void tcg_gen_vec_add8_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b); 404447ca1cbSRichard Henderson void tcg_gen_vec_add16_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b); 405447ca1cbSRichard Henderson void tcg_gen_vec_add32_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b); 406447ca1cbSRichard Henderson 407447ca1cbSRichard Henderson void tcg_gen_vec_sub8_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b); 408447ca1cbSRichard Henderson void tcg_gen_vec_sub16_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b); 409447ca1cbSRichard Henderson void tcg_gen_vec_sub32_i64(TCGv_i64 d, TCGv_i64 a, TCGv_i64 b); 410447ca1cbSRichard Henderson 411447ca1cbSRichard Henderson void tcg_gen_vec_shl8i_i64(TCGv_i64 d, TCGv_i64 a, int64_t); 412447ca1cbSRichard Henderson void tcg_gen_vec_shl16i_i64(TCGv_i64 d, TCGv_i64 a, int64_t); 413447ca1cbSRichard Henderson void tcg_gen_vec_shr8i_i64(TCGv_i64 d, TCGv_i64 a, int64_t); 414447ca1cbSRichard Henderson void tcg_gen_vec_shr16i_i64(TCGv_i64 d, TCGv_i64 a, int64_t); 415447ca1cbSRichard Henderson void tcg_gen_vec_sar8i_i64(TCGv_i64 d, TCGv_i64 a, int64_t); 416447ca1cbSRichard Henderson void tcg_gen_vec_sar16i_i64(TCGv_i64 d, TCGv_i64 a, int64_t); 417447ca1cbSRichard Henderson void tcg_gen_vec_rotl8i_i64(TCGv_i64 d, TCGv_i64 a, int64_t c); 418447ca1cbSRichard Henderson void tcg_gen_vec_rotl16i_i64(TCGv_i64 d, TCGv_i64 a, int64_t c); 419447ca1cbSRichard Henderson 420447ca1cbSRichard Henderson /* 32-bit vector operations. */ 421447ca1cbSRichard Henderson void tcg_gen_vec_add8_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b); 422447ca1cbSRichard Henderson void tcg_gen_vec_add16_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b); 423447ca1cbSRichard Henderson 424447ca1cbSRichard Henderson void tcg_gen_vec_sub8_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b); 425447ca1cbSRichard Henderson void tcg_gen_vec_sub16_i32(TCGv_i32 d, TCGv_i32 a, TCGv_i32 b); 426447ca1cbSRichard Henderson 427447ca1cbSRichard Henderson void tcg_gen_vec_shl8i_i32(TCGv_i32 d, TCGv_i32 a, int32_t); 428447ca1cbSRichard Henderson void tcg_gen_vec_shl16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t); 429447ca1cbSRichard Henderson void tcg_gen_vec_shr8i_i32(TCGv_i32 d, TCGv_i32 a, int32_t); 430447ca1cbSRichard Henderson void tcg_gen_vec_shr16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t); 431447ca1cbSRichard Henderson void tcg_gen_vec_sar8i_i32(TCGv_i32 d, TCGv_i32 a, int32_t); 432447ca1cbSRichard Henderson void tcg_gen_vec_sar16i_i32(TCGv_i32 d, TCGv_i32 a, int32_t); 433447ca1cbSRichard Henderson 434447ca1cbSRichard Henderson #endif 435