diff options
author | Cho, Yu-Chen <acho@suse.com> | 2021-07-07 18:53:17 +0800 |
---|---|---|
committer | Cornelia Huck <cohuck@redhat.com> | 2021-07-07 14:01:56 +0200 |
commit | c9274b6bf0571ecbaaed3e9c3b229e17607a0ea2 (patch) | |
tree | ed9756bc3e44ba8db0e02bc9975347f6b898f1c1 /target/s390x/vec_helper.c | |
parent | b6b4722307f31491ee553c674ded2a8bba6173e1 (diff) |
target/s390x: start moving TCG-only code to tcg/
move everything related to translate, as well as HELPER code in tcg/
mmu_helper.c stays put for now, as it contains both TCG and KVM code.
After the reshuffling, update MAINTAINERS accordingly.
Make use of the new directory:
target/s390x/tcg/
Signed-off-by: Claudio Fontana <cfontana@suse.de>
Signed-off-by: Cho, Yu-Chen <acho@suse.com>
Acked-by: David Hildenbrand <david@redhat.com>
Acked-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20210707105324.23400-8-acho@suse.com>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Diffstat (limited to 'target/s390x/vec_helper.c')
-rw-r--r-- | target/s390x/vec_helper.c | 214 |
1 files changed, 0 insertions, 214 deletions
diff --git a/target/s390x/vec_helper.c b/target/s390x/vec_helper.c deleted file mode 100644 index ededf13cf0..0000000000 --- a/target/s390x/vec_helper.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * QEMU TCG support -- s390x vector support instructions - * - * Copyright (C) 2019 Red Hat Inc - * - * Authors: - * David Hildenbrand <david@redhat.com> - * - * This work is licensed under the terms of the GNU GPL, version 2 or later. - * See the COPYING file in the top-level directory. - */ -#include "qemu/osdep.h" -#include "cpu.h" -#include "s390x-internal.h" -#include "vec.h" -#include "tcg/tcg.h" -#include "tcg/tcg-gvec-desc.h" -#include "exec/helper-proto.h" -#include "exec/cpu_ldst.h" -#include "exec/exec-all.h" - -void HELPER(gvec_vbperm)(void *v1, const void *v2, const void *v3, - uint32_t desc) -{ - S390Vector tmp = {}; - uint16_t result = 0; - int i; - - for (i = 0; i < 16; i++) { - const uint8_t bit_nr = s390_vec_read_element8(v3, i); - uint16_t bit; - - if (bit_nr >= 128) { - continue; - } - bit = (s390_vec_read_element8(v2, bit_nr / 8) - >> (7 - (bit_nr % 8))) & 1; - result |= (bit << (15 - i)); - } - s390_vec_write_element16(&tmp, 3, result); - *(S390Vector *)v1 = tmp; -} - -void HELPER(vll)(CPUS390XState *env, void *v1, uint64_t addr, uint64_t bytes) -{ - if (likely(bytes >= 16)) { - uint64_t t0, t1; - - t0 = cpu_ldq_data_ra(env, addr, GETPC()); - addr = wrap_address(env, addr + 8); - t1 = cpu_ldq_data_ra(env, addr, GETPC()); - s390_vec_write_element64(v1, 0, t0); - s390_vec_write_element64(v1, 1, t1); - } else { - S390Vector tmp = {}; - int i; - - for (i = 0; i < bytes; i++) { - uint8_t byte = cpu_ldub_data_ra(env, addr, GETPC()); - - s390_vec_write_element8(&tmp, i, byte); - addr = wrap_address(env, addr + 1); - } - *(S390Vector *)v1 = tmp; - } -} - -#define DEF_VPK_HFN(BITS, TBITS) \ -typedef uint##TBITS##_t (*vpk##BITS##_fn)(uint##BITS##_t, int *); \ -static int vpk##BITS##_hfn(S390Vector *v1, const S390Vector *v2, \ - const S390Vector *v3, vpk##BITS##_fn fn) \ -{ \ - int i, saturated = 0; \ - S390Vector tmp; \ - \ - for (i = 0; i < (128 / TBITS); i++) { \ - uint##BITS##_t src; \ - \ - if (i < (128 / BITS)) { \ - src = s390_vec_read_element##BITS(v2, i); \ - } else { \ - src = s390_vec_read_element##BITS(v3, i - (128 / BITS)); \ - } \ - s390_vec_write_element##TBITS(&tmp, i, fn(src, &saturated)); \ - } \ - *v1 = tmp; \ - return saturated; \ -} -DEF_VPK_HFN(64, 32) -DEF_VPK_HFN(32, 16) -DEF_VPK_HFN(16, 8) - -#define DEF_VPK(BITS, TBITS) \ -static uint##TBITS##_t vpk##BITS##e(uint##BITS##_t src, int *saturated) \ -{ \ - return src; \ -} \ -void HELPER(gvec_vpk##BITS)(void *v1, const void *v2, const void *v3, \ - uint32_t desc) \ -{ \ - vpk##BITS##_hfn(v1, v2, v3, vpk##BITS##e); \ -} -DEF_VPK(64, 32) -DEF_VPK(32, 16) -DEF_VPK(16, 8) - -#define DEF_VPKS(BITS, TBITS) \ -static uint##TBITS##_t vpks##BITS##e(uint##BITS##_t src, int *saturated) \ -{ \ - if ((int##BITS##_t)src > INT##TBITS##_MAX) { \ - (*saturated)++; \ - return INT##TBITS##_MAX; \ - } else if ((int##BITS##_t)src < INT##TBITS##_MIN) { \ - (*saturated)++; \ - return INT##TBITS##_MIN; \ - } \ - return src; \ -} \ -void HELPER(gvec_vpks##BITS)(void *v1, const void *v2, const void *v3, \ - uint32_t desc) \ -{ \ - vpk##BITS##_hfn(v1, v2, v3, vpks##BITS##e); \ -} \ -void HELPER(gvec_vpks_cc##BITS)(void *v1, const void *v2, const void *v3, \ - CPUS390XState *env, uint32_t desc) \ -{ \ - int saturated = vpk##BITS##_hfn(v1, v2, v3, vpks##BITS##e); \ - \ - if (saturated == (128 / TBITS)) { \ - env->cc_op = 3; \ - } else if (saturated) { \ - env->cc_op = 1; \ - } else { \ - env->cc_op = 0; \ - } \ -} -DEF_VPKS(64, 32) -DEF_VPKS(32, 16) -DEF_VPKS(16, 8) - -#define DEF_VPKLS(BITS, TBITS) \ -static uint##TBITS##_t vpkls##BITS##e(uint##BITS##_t src, int *saturated) \ -{ \ - if (src > UINT##TBITS##_MAX) { \ - (*saturated)++; \ - return UINT##TBITS##_MAX; \ - } \ - return src; \ -} \ -void HELPER(gvec_vpkls##BITS)(void *v1, const void *v2, const void *v3, \ - uint32_t desc) \ -{ \ - vpk##BITS##_hfn(v1, v2, v3, vpkls##BITS##e); \ -} \ -void HELPER(gvec_vpkls_cc##BITS)(void *v1, const void *v2, const void *v3, \ - CPUS390XState *env, uint32_t desc) \ -{ \ - int saturated = vpk##BITS##_hfn(v1, v2, v3, vpkls##BITS##e); \ - \ - if (saturated == (128 / TBITS)) { \ - env->cc_op = 3; \ - } else if (saturated) { \ - env->cc_op = 1; \ - } else { \ - env->cc_op = 0; \ - } \ -} -DEF_VPKLS(64, 32) -DEF_VPKLS(32, 16) -DEF_VPKLS(16, 8) - -void HELPER(gvec_vperm)(void *v1, const void *v2, const void *v3, - const void *v4, uint32_t desc) -{ - S390Vector tmp; - int i; - - for (i = 0; i < 16; i++) { - const uint8_t selector = s390_vec_read_element8(v4, i) & 0x1f; - uint8_t byte; - - if (selector < 16) { - byte = s390_vec_read_element8(v2, selector); - } else { - byte = s390_vec_read_element8(v3, selector - 16); - } - s390_vec_write_element8(&tmp, i, byte); - } - *(S390Vector *)v1 = tmp; -} - -void HELPER(vstl)(CPUS390XState *env, const void *v1, uint64_t addr, - uint64_t bytes) -{ - /* Probe write access before actually modifying memory */ - probe_write_access(env, addr, bytes, GETPC()); - - if (likely(bytes >= 16)) { - cpu_stq_data_ra(env, addr, s390_vec_read_element64(v1, 0), GETPC()); - addr = wrap_address(env, addr + 8); - cpu_stq_data_ra(env, addr, s390_vec_read_element64(v1, 1), GETPC()); - } else { - S390Vector tmp = {}; - int i; - - for (i = 0; i < bytes; i++) { - uint8_t byte = s390_vec_read_element8(v1, i); - - cpu_stb_data_ra(env, addr, byte, GETPC()); - addr = wrap_address(env, addr + 1); - } - *(S390Vector *)v1 = tmp; - } -} |