1*98f40dd2SKiran Ostrolenk /* 2*98f40dd2SKiran Ostrolenk * RISC-V Vector Extension Internals 3*98f40dd2SKiran Ostrolenk * 4*98f40dd2SKiran Ostrolenk * Copyright (c) 2020 T-Head Semiconductor Co., Ltd. All rights reserved. 5*98f40dd2SKiran Ostrolenk * 6*98f40dd2SKiran Ostrolenk * This program is free software; you can redistribute it and/or modify it 7*98f40dd2SKiran Ostrolenk * under the terms and conditions of the GNU General Public License, 8*98f40dd2SKiran Ostrolenk * version 2 or later, as published by the Free Software Foundation. 9*98f40dd2SKiran Ostrolenk * 10*98f40dd2SKiran Ostrolenk * This program is distributed in the hope it will be useful, but WITHOUT 11*98f40dd2SKiran Ostrolenk * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12*98f40dd2SKiran Ostrolenk * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 13*98f40dd2SKiran Ostrolenk * more details. 14*98f40dd2SKiran Ostrolenk * 15*98f40dd2SKiran Ostrolenk * You should have received a copy of the GNU General Public License along with 16*98f40dd2SKiran Ostrolenk * this program. If not, see <http://www.gnu.org/licenses/>. 17*98f40dd2SKiran Ostrolenk */ 18*98f40dd2SKiran Ostrolenk 19*98f40dd2SKiran Ostrolenk #include "vector_internals.h" 20*98f40dd2SKiran Ostrolenk 21*98f40dd2SKiran Ostrolenk /* set agnostic elements to 1s */ 22*98f40dd2SKiran Ostrolenk void vext_set_elems_1s(void *base, uint32_t is_agnostic, uint32_t cnt, 23*98f40dd2SKiran Ostrolenk uint32_t tot) 24*98f40dd2SKiran Ostrolenk { 25*98f40dd2SKiran Ostrolenk if (is_agnostic == 0) { 26*98f40dd2SKiran Ostrolenk /* policy undisturbed */ 27*98f40dd2SKiran Ostrolenk return; 28*98f40dd2SKiran Ostrolenk } 29*98f40dd2SKiran Ostrolenk if (tot - cnt == 0) { 30*98f40dd2SKiran Ostrolenk return ; 31*98f40dd2SKiran Ostrolenk } 32*98f40dd2SKiran Ostrolenk memset(base + cnt, -1, tot - cnt); 33*98f40dd2SKiran Ostrolenk } 34*98f40dd2SKiran Ostrolenk 35*98f40dd2SKiran Ostrolenk void do_vext_vv(void *vd, void *v0, void *vs1, void *vs2, 36*98f40dd2SKiran Ostrolenk CPURISCVState *env, uint32_t desc, 37*98f40dd2SKiran Ostrolenk opivv2_fn *fn, uint32_t esz) 38*98f40dd2SKiran Ostrolenk { 39*98f40dd2SKiran Ostrolenk uint32_t vm = vext_vm(desc); 40*98f40dd2SKiran Ostrolenk uint32_t vl = env->vl; 41*98f40dd2SKiran Ostrolenk uint32_t total_elems = vext_get_total_elems(env, desc, esz); 42*98f40dd2SKiran Ostrolenk uint32_t vta = vext_vta(desc); 43*98f40dd2SKiran Ostrolenk uint32_t vma = vext_vma(desc); 44*98f40dd2SKiran Ostrolenk uint32_t i; 45*98f40dd2SKiran Ostrolenk 46*98f40dd2SKiran Ostrolenk for (i = env->vstart; i < vl; i++) { 47*98f40dd2SKiran Ostrolenk if (!vm && !vext_elem_mask(v0, i)) { 48*98f40dd2SKiran Ostrolenk /* set masked-off elements to 1s */ 49*98f40dd2SKiran Ostrolenk vext_set_elems_1s(vd, vma, i * esz, (i + 1) * esz); 50*98f40dd2SKiran Ostrolenk continue; 51*98f40dd2SKiran Ostrolenk } 52*98f40dd2SKiran Ostrolenk fn(vd, vs1, vs2, i); 53*98f40dd2SKiran Ostrolenk } 54*98f40dd2SKiran Ostrolenk env->vstart = 0; 55*98f40dd2SKiran Ostrolenk /* set tail elements to 1s */ 56*98f40dd2SKiran Ostrolenk vext_set_elems_1s(vd, vta, vl * esz, total_elems * esz); 57*98f40dd2SKiran Ostrolenk } 58*98f40dd2SKiran Ostrolenk 59*98f40dd2SKiran Ostrolenk void do_vext_vx(void *vd, void *v0, target_long s1, void *vs2, 60*98f40dd2SKiran Ostrolenk CPURISCVState *env, uint32_t desc, 61*98f40dd2SKiran Ostrolenk opivx2_fn fn, uint32_t esz) 62*98f40dd2SKiran Ostrolenk { 63*98f40dd2SKiran Ostrolenk uint32_t vm = vext_vm(desc); 64*98f40dd2SKiran Ostrolenk uint32_t vl = env->vl; 65*98f40dd2SKiran Ostrolenk uint32_t total_elems = vext_get_total_elems(env, desc, esz); 66*98f40dd2SKiran Ostrolenk uint32_t vta = vext_vta(desc); 67*98f40dd2SKiran Ostrolenk uint32_t vma = vext_vma(desc); 68*98f40dd2SKiran Ostrolenk uint32_t i; 69*98f40dd2SKiran Ostrolenk 70*98f40dd2SKiran Ostrolenk for (i = env->vstart; i < vl; i++) { 71*98f40dd2SKiran Ostrolenk if (!vm && !vext_elem_mask(v0, i)) { 72*98f40dd2SKiran Ostrolenk /* set masked-off elements to 1s */ 73*98f40dd2SKiran Ostrolenk vext_set_elems_1s(vd, vma, i * esz, (i + 1) * esz); 74*98f40dd2SKiran Ostrolenk continue; 75*98f40dd2SKiran Ostrolenk } 76*98f40dd2SKiran Ostrolenk fn(vd, s1, vs2, i); 77*98f40dd2SKiran Ostrolenk } 78*98f40dd2SKiran Ostrolenk env->vstart = 0; 79*98f40dd2SKiran Ostrolenk /* set tail elements to 1s */ 80*98f40dd2SKiran Ostrolenk vext_set_elems_1s(vd, vta, vl * esz, total_elems * esz); 81*98f40dd2SKiran Ostrolenk } 82