* [PATCH v2 0/2] target/s390x: Emulate CVDG @ 2024-01-25 12:29 Ilya Leoshkevich 2024-01-25 12:29 ` [PATCH v2 1/2] " Ilya Leoshkevich 2024-01-25 12:29 ` [PATCH v2 2/2] tests/tcg/s390x: Test CONVERT TO DECIMAL Ilya Leoshkevich 0 siblings, 2 replies; 4+ messages in thread From: Ilya Leoshkevich @ 2024-01-25 12:29 UTC (permalink / raw) To: Richard Henderson, David Hildenbrand, Thomas Huth Cc: qemu-s390x, qemu-devel, Ilya Leoshkevich v1: https://lists.gnu.org/archive/html/qemu-devel/2024-01/msg02865.html v1 -> v2: Fix !CONFIG_INT128 builds (Richard). Hi, Ido reported that we are missing the CVDG emulation (which is very similar to the existing CVD emulation). This series adds it along with a test. Best regards, Ilya Ilya Leoshkevich (2): target/s390x: Emulate CVDG tests/tcg/s390x: Test CONVERT TO DECIMAL target/s390x/helper.h | 1 + target/s390x/tcg/insn-data.h.inc | 1 + target/s390x/tcg/int_helper.c | 21 ++++++++++++++++ target/s390x/tcg/translate.c | 8 ++++++ tests/tcg/s390x/Makefile.target | 1 + tests/tcg/s390x/cvd.c | 42 ++++++++++++++++++++++++++++++++ 6 files changed, 74 insertions(+) create mode 100644 tests/tcg/s390x/cvd.c -- 2.43.0 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/2] target/s390x: Emulate CVDG 2024-01-25 12:29 [PATCH v2 0/2] target/s390x: Emulate CVDG Ilya Leoshkevich @ 2024-01-25 12:29 ` Ilya Leoshkevich 2024-01-27 2:59 ` Richard Henderson 2024-01-25 12:29 ` [PATCH v2 2/2] tests/tcg/s390x: Test CONVERT TO DECIMAL Ilya Leoshkevich 1 sibling, 1 reply; 4+ messages in thread From: Ilya Leoshkevich @ 2024-01-25 12:29 UTC (permalink / raw) To: Richard Henderson, David Hildenbrand, Thomas Huth Cc: qemu-s390x, qemu-devel, Ilya Leoshkevich, Ido Plat CVDG is the same as CVD, except that it converts 64 bits into 128, rather than 32 into 64. Create a new helper, which uses Int128 wrappers. Reported-by: Ido Plat <Ido.Plat@ibm.com> Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- target/s390x/helper.h | 1 + target/s390x/tcg/insn-data.h.inc | 1 + target/s390x/tcg/int_helper.c | 21 +++++++++++++++++++++ target/s390x/tcg/translate.c | 8 ++++++++ 4 files changed, 31 insertions(+) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index 05102578fc9..332a9a9c632 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -89,6 +89,7 @@ DEF_HELPER_FLAGS_2(sqeb, TCG_CALL_NO_WG, i64, env, i64) DEF_HELPER_FLAGS_2(sqdb, TCG_CALL_NO_WG, i64, env, i64) DEF_HELPER_FLAGS_2(sqxb, TCG_CALL_NO_WG, i128, env, i128) DEF_HELPER_FLAGS_1(cvd, TCG_CALL_NO_RWG_SE, i64, s32) +DEF_HELPER_FLAGS_1(cvdg, TCG_CALL_NO_RWG_SE, i128, s64) DEF_HELPER_FLAGS_4(pack, TCG_CALL_NO_WG, void, env, i32, i64, i64) DEF_HELPER_FLAGS_4(pka, TCG_CALL_NO_WG, void, env, i64, i64, i32) DEF_HELPER_FLAGS_4(pku, TCG_CALL_NO_WG, void, env, i64, i64, i32) diff --git a/target/s390x/tcg/insn-data.h.inc b/target/s390x/tcg/insn-data.h.inc index 2f07f39d9cb..388dcb8dbbc 100644 --- a/target/s390x/tcg/insn-data.h.inc +++ b/target/s390x/tcg/insn-data.h.inc @@ -296,6 +296,7 @@ /* CONVERT TO DECIMAL */ C(0x4e00, CVD, RX_a, Z, r1_o, a2, 0, 0, cvd, 0) C(0xe326, CVDY, RXY_a, LD, r1_o, a2, 0, 0, cvd, 0) + C(0xe32e, CVDG, RXY_a, Z, r1_o, a2, 0, 0, cvdg, 0) /* CONVERT TO FIXED */ F(0xb398, CFEBR, RRF_e, Z, 0, e2, new, r1_32, cfeb, 0, IF_BFP) F(0xb399, CFDBR, RRF_e, Z, 0, f2, new, r1_32, cfdb, 0, IF_BFP) diff --git a/target/s390x/tcg/int_helper.c b/target/s390x/tcg/int_helper.c index eb8e6dd1b57..121e3006a65 100644 --- a/target/s390x/tcg/int_helper.c +++ b/target/s390x/tcg/int_helper.c @@ -118,6 +118,27 @@ uint64_t HELPER(cvd)(int32_t reg) return dec; } +Int128 HELPER(cvdg)(int64_t reg) +{ + /* positive 0 */ + Int128 dec = int128_make64(0x0c); + Int128 bin = int128_makes64(reg); + Int128 base = int128_make64(10); + int shift; + + if (!int128_nonneg(bin)) { + bin = int128_neg(bin); + dec = int128_make64(0x0d); + } + + for (shift = 4; (shift < 128) && int128_nz(bin); shift += 4) { + dec = int128_or(dec, int128_lshift(int128_remu(bin, base), shift)); + bin = int128_divu(bin, base); + } + + return dec; +} + uint64_t HELPER(popcnt)(uint64_t val) { /* Note that we don't fold past bytes. */ diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c index 8df00b7df9f..2d417337695 100644 --- a/target/s390x/tcg/translate.c +++ b/target/s390x/tcg/translate.c @@ -2233,6 +2233,14 @@ static DisasJumpType op_cvd(DisasContext *s, DisasOps *o) return DISAS_NEXT; } +static DisasJumpType op_cvdg(DisasContext *s, DisasOps *o) +{ + TCGv_i128 t = tcg_temp_new_i128(); + gen_helper_cvdg(t, o->in1); + tcg_gen_qemu_st_i128(t, o->in2, get_mem_index(s), MO_TE | MO_128); + return DISAS_NEXT; +} + static DisasJumpType op_ct(DisasContext *s, DisasOps *o) { int m3 = get_field(s, m3); -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 1/2] target/s390x: Emulate CVDG 2024-01-25 12:29 ` [PATCH v2 1/2] " Ilya Leoshkevich @ 2024-01-27 2:59 ` Richard Henderson 0 siblings, 0 replies; 4+ messages in thread From: Richard Henderson @ 2024-01-27 2:59 UTC (permalink / raw) To: Ilya Leoshkevich, David Hildenbrand, Thomas Huth Cc: qemu-s390x, qemu-devel, Ido Plat On 1/25/24 22:29, Ilya Leoshkevich wrote: > CVDG is the same as CVD, except that it converts 64 bits into 128, > rather than 32 into 64. Create a new helper, which uses Int128 > wrappers. > > Reported-by: Ido Plat<Ido.Plat@ibm.com> > Signed-off-by: Ilya Leoshkevich<iii@linux.ibm.com> > --- > target/s390x/helper.h | 1 + > target/s390x/tcg/insn-data.h.inc | 1 + > target/s390x/tcg/int_helper.c | 21 +++++++++++++++++++++ > target/s390x/tcg/translate.c | 8 ++++++++ > 4 files changed, 31 insertions(+) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~ ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 2/2] tests/tcg/s390x: Test CONVERT TO DECIMAL 2024-01-25 12:29 [PATCH v2 0/2] target/s390x: Emulate CVDG Ilya Leoshkevich 2024-01-25 12:29 ` [PATCH v2 1/2] " Ilya Leoshkevich @ 2024-01-25 12:29 ` Ilya Leoshkevich 1 sibling, 0 replies; 4+ messages in thread From: Ilya Leoshkevich @ 2024-01-25 12:29 UTC (permalink / raw) To: Richard Henderson, David Hildenbrand, Thomas Huth Cc: qemu-s390x, qemu-devel, Ilya Leoshkevich Check the CVD's and CVDG's corner cases. Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com> --- tests/tcg/s390x/Makefile.target | 1 + tests/tcg/s390x/cvd.c | 42 +++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 tests/tcg/s390x/cvd.c diff --git a/tests/tcg/s390x/Makefile.target b/tests/tcg/s390x/Makefile.target index 30994dcf9c2..04e4bddd83d 100644 --- a/tests/tcg/s390x/Makefile.target +++ b/tests/tcg/s390x/Makefile.target @@ -45,6 +45,7 @@ TESTS+=clc TESTS+=laalg TESTS+=add-logical-with-carry TESTS+=lae +TESTS+=cvd cdsg: CFLAGS+=-pthread cdsg: LDFLAGS+=-pthread diff --git a/tests/tcg/s390x/cvd.c b/tests/tcg/s390x/cvd.c new file mode 100644 index 00000000000..4d12282c6aa --- /dev/null +++ b/tests/tcg/s390x/cvd.c @@ -0,0 +1,42 @@ +/* + * Test the CONVERT TO DECIMAL instruction. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ +#include <assert.h> +#include <stdint.h> + +static uint64_t cvd(int32_t x) +{ + uint64_t ret; + + asm("cvd %[x],%[ret]" : [ret] "=R" (ret) : [x] "r" (x)); + + return ret; +} + +static __uint128_t cvdg(int64_t x) +{ + __uint128_t ret; + + asm("cvdg %[x],%[ret]" : [ret] "=T" (ret) : [x] "r" (x)); + + return ret; +} + +int main(void) +{ + __uint128_t m = (((__uint128_t)0x9223372036854775) << 16) | 0x8070; + + assert(cvd(0) == 0xc); + assert(cvd(1) == 0x1c); + assert(cvd(-1) == 0x1d); + assert(cvd(0x7fffffff) == 0x2147483647c); + assert(cvd(-0x7fffffff) == 0x2147483647d); + + assert(cvdg(0) == 0xc); + assert(cvdg(1) == 0x1c); + assert(cvdg(-1) == 0x1d); + assert(cvdg(0x7fffffffffffffff) == (m | 0xc)); + assert(cvdg(-0x7fffffffffffffff) == (m | 0xd)); +} -- 2.43.0 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-01-27 3:00 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-01-25 12:29 [PATCH v2 0/2] target/s390x: Emulate CVDG Ilya Leoshkevich 2024-01-25 12:29 ` [PATCH v2 1/2] " Ilya Leoshkevich 2024-01-27 2:59 ` Richard Henderson 2024-01-25 12:29 ` [PATCH v2 2/2] tests/tcg/s390x: Test CONVERT TO DECIMAL Ilya Leoshkevich
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.