Loading target/s390x/helper.h +2 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,8 @@ DEF_HELPER_FLAGS_4(gvec_vmo32, TCG_CALL_NO_RWG, void, ptr, cptr, cptr, i32) DEF_HELPER_FLAGS_4(gvec_vmlo8, TCG_CALL_NO_RWG, void, ptr, cptr, cptr, i32) DEF_HELPER_FLAGS_4(gvec_vmlo16, TCG_CALL_NO_RWG, void, ptr, cptr, cptr, i32) DEF_HELPER_FLAGS_4(gvec_vmlo32, TCG_CALL_NO_RWG, void, ptr, cptr, cptr, i32) DEF_HELPER_FLAGS_3(gvec_vpopct8, TCG_CALL_NO_RWG, void, ptr, cptr, i32) DEF_HELPER_FLAGS_3(gvec_vpopct16, TCG_CALL_NO_RWG, void, ptr, cptr, i32) #ifndef CONFIG_USER_ONLY DEF_HELPER_3(servc, i32, env, i64, i64) Loading target/s390x/insn-data.def +2 −0 Original line number Diff line number Diff line Loading @@ -1144,6 +1144,8 @@ F(0xe76a, VO, VRR_c, V, 0, 0, 0, 0, vo, 0, IF_VEC) /* VECTOR OR WITH COMPLEMENT */ F(0xe76f, VOC, VRR_c, VE, 0, 0, 0, 0, voc, 0, IF_VEC) /* VECTOR POPULATION COUNT */ F(0xe750, VPOPCT, VRR_a, V, 0, 0, 0, 0, vpopct, 0, IF_VEC) #ifndef CONFIG_USER_ONLY /* COMPARE AND SWAP AND PURGE */ Loading target/s390x/translate_vx.inc.c +19 −0 Original line number Diff line number Diff line Loading @@ -1826,3 +1826,22 @@ static DisasJumpType op_voc(DisasContext *s, DisasOps *o) get_field(s->fields, v3)); return DISAS_NEXT; } static DisasJumpType op_vpopct(DisasContext *s, DisasOps *o) { const uint8_t es = get_field(s->fields, m3); static const GVecGen2 g[4] = { { .fno = gen_helper_gvec_vpopct8, }, { .fno = gen_helper_gvec_vpopct16, }, { .fni4 = tcg_gen_ctpop_i32, }, { .fni8 = tcg_gen_ctpop_i64, }, }; if (es > ES_64 || (es != ES_8 && !s390_has_feat(S390_FEAT_VECTOR_ENH))) { gen_program_exception(s, PGM_SPECIFICATION); return DISAS_NORETURN; } gen_gvec_2(get_field(s->fields, v1), get_field(s->fields, v2), &g[es]); return DISAS_NEXT; } target/s390x/vec_int_helper.c +14 −0 Original line number Diff line number Diff line Loading @@ -464,3 +464,17 @@ void HELPER(gvec_vmlo##BITS)(void *v1, const void *v2, const void *v3, \ DEF_VMLO(8, 16) DEF_VMLO(16, 32) DEF_VMLO(32, 64) #define DEF_VPOPCT(BITS) \ void HELPER(gvec_vpopct##BITS)(void *v1, const void *v2, uint32_t desc) \ { \ int i; \ \ for (i = 0; i < (128 / BITS); i++) { \ const uint##BITS##_t a = s390_vec_read_element##BITS(v2, i); \ \ s390_vec_write_element##BITS(v1, i, ctpop32(a)); \ } \ } DEF_VPOPCT(8) DEF_VPOPCT(16) Loading
target/s390x/helper.h +2 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,8 @@ DEF_HELPER_FLAGS_4(gvec_vmo32, TCG_CALL_NO_RWG, void, ptr, cptr, cptr, i32) DEF_HELPER_FLAGS_4(gvec_vmlo8, TCG_CALL_NO_RWG, void, ptr, cptr, cptr, i32) DEF_HELPER_FLAGS_4(gvec_vmlo16, TCG_CALL_NO_RWG, void, ptr, cptr, cptr, i32) DEF_HELPER_FLAGS_4(gvec_vmlo32, TCG_CALL_NO_RWG, void, ptr, cptr, cptr, i32) DEF_HELPER_FLAGS_3(gvec_vpopct8, TCG_CALL_NO_RWG, void, ptr, cptr, i32) DEF_HELPER_FLAGS_3(gvec_vpopct16, TCG_CALL_NO_RWG, void, ptr, cptr, i32) #ifndef CONFIG_USER_ONLY DEF_HELPER_3(servc, i32, env, i64, i64) Loading
target/s390x/insn-data.def +2 −0 Original line number Diff line number Diff line Loading @@ -1144,6 +1144,8 @@ F(0xe76a, VO, VRR_c, V, 0, 0, 0, 0, vo, 0, IF_VEC) /* VECTOR OR WITH COMPLEMENT */ F(0xe76f, VOC, VRR_c, VE, 0, 0, 0, 0, voc, 0, IF_VEC) /* VECTOR POPULATION COUNT */ F(0xe750, VPOPCT, VRR_a, V, 0, 0, 0, 0, vpopct, 0, IF_VEC) #ifndef CONFIG_USER_ONLY /* COMPARE AND SWAP AND PURGE */ Loading
target/s390x/translate_vx.inc.c +19 −0 Original line number Diff line number Diff line Loading @@ -1826,3 +1826,22 @@ static DisasJumpType op_voc(DisasContext *s, DisasOps *o) get_field(s->fields, v3)); return DISAS_NEXT; } static DisasJumpType op_vpopct(DisasContext *s, DisasOps *o) { const uint8_t es = get_field(s->fields, m3); static const GVecGen2 g[4] = { { .fno = gen_helper_gvec_vpopct8, }, { .fno = gen_helper_gvec_vpopct16, }, { .fni4 = tcg_gen_ctpop_i32, }, { .fni8 = tcg_gen_ctpop_i64, }, }; if (es > ES_64 || (es != ES_8 && !s390_has_feat(S390_FEAT_VECTOR_ENH))) { gen_program_exception(s, PGM_SPECIFICATION); return DISAS_NORETURN; } gen_gvec_2(get_field(s->fields, v1), get_field(s->fields, v2), &g[es]); return DISAS_NEXT; }
target/s390x/vec_int_helper.c +14 −0 Original line number Diff line number Diff line Loading @@ -464,3 +464,17 @@ void HELPER(gvec_vmlo##BITS)(void *v1, const void *v2, const void *v3, \ DEF_VMLO(8, 16) DEF_VMLO(16, 32) DEF_VMLO(32, 64) #define DEF_VPOPCT(BITS) \ void HELPER(gvec_vpopct##BITS)(void *v1, const void *v2, uint32_t desc) \ { \ int i; \ \ for (i = 0; i < (128 / BITS); i++) { \ const uint##BITS##_t a = s390_vec_read_element##BITS(v2, i); \ \ s390_vec_write_element##BITS(v1, i, ctpop32(a)); \ } \ } DEF_VPOPCT(8) DEF_VPOPCT(16)