From nobody Wed Nov 5 18:23:03 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; dkim=fail spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496599832622377.48203521777316; Sun, 4 Jun 2017 11:10:32 -0700 (PDT) Received: from localhost ([::1]:57981 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHZyx-0006mH-1m for importer@patchew.org; Sun, 04 Jun 2017 14:10:31 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50784) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHZS7-0008Gu-Td for qemu-devel@nongnu.org; Sun, 04 Jun 2017 13:36:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dHZS3-0003xv-Vz for qemu-devel@nongnu.org; Sun, 04 Jun 2017 13:36:35 -0400 Received: from mail-pf0-x243.google.com ([2607:f8b0:400e:c00::243]:33403) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1dHZS3-0003wr-Nw for qemu-devel@nongnu.org; Sun, 04 Jun 2017 13:36:31 -0400 Received: by mail-pf0-x243.google.com with SMTP id f27so18146954pfe.0 for ; Sun, 04 Jun 2017 10:36:31 -0700 (PDT) Received: from bigtime.ASUS (cpe-98-155-27-246.hawaii.res.rr.com. [98.155.27.246]) by smtp.gmail.com with ESMTPSA id j191sm52854419pgc.53.2017.06.04.10.36.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 04 Jun 2017 10:36:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=d7djbnB8ck/1QpOhf/B7FKEGcIKO0DwcfySYZq8pIW0=; b=GnPR1LRZ5cIyMUJFKpA+edkJ4DbDlXSiscfWv2PFpIQBL56bmCkh/cjhau9eJlnKCs HdSgK2PWONzy1M/YVgOMcaRcr/skfHPsPUP3ZBlhK5SaoeEbe/KLWo67YH1st/h3aN5o UUxKuvAc6a2pk1kPCUW2r5fHAuQNcdD+/6FOZbCw4PmFz85Mahxr6wbXJ1kwXgasd+oE iVnPjRfQP7PIEN5o5vbMSKsWoZ2V4h6FWIdNNE1Ou38nhv0tbgERUvP+I2RcE5zr8az9 XwQ2IhYTInBs7J0I65he+ID8aCwPgiYC+O7SuXLC9QspU4puNv1qLaXLZ4u/pDRk5jeN DaoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references; bh=d7djbnB8ck/1QpOhf/B7FKEGcIKO0DwcfySYZq8pIW0=; b=lcIPuwRkpjCwKBbuegtvQDfKfKFI376QoX8SCKRo/j8bNciQx82/gqkJLCFXfmPPR9 48q5AWRDUJuOKe+Wbvba3qHwotwO5wve03pctj6V4jaxl2zGczlMdgBjPcTvbhzYIaSi Rt8gfP7s12NpepUn/vZuW2W83yuPGYdLBNE4S1hGTF/Q2vXwyUzfd5w6+2kRjz6cT8k8 u14d3lle7hvTG6OxWIZly/k7c1GLiWRX1Y4WptjQhxIcpGKF+uUjzIeGua1EY2agEveh FfHMLu3O0u5T0oqR5lZdnHyPZsiTYEvCHfN77R9ns39rAJxZx2NPMTT2mKxp1g6Ppnk7 JnTA== X-Gm-Message-State: AODbwcDsWCjjj+nwpGnSIAHjRGN3UDLehQrAA8CBHX43fT15iDnonkuY Up7t5hGHDDDgAImNrlo= X-Received: by 10.99.5.147 with SMTP id 141mr17152349pgf.134.1496597790652; Sun, 04 Jun 2017 10:36:30 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Sun, 4 Jun 2017 10:34:57 -0700 Message-Id: <20170604173509.29684-58-rth@twiddle.net> X-Mailer: git-send-email 2.9.4 In-Reply-To: <20170604173509.29684-1-rth@twiddle.net> References: <20170604173509.29684-1-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::243 Subject: [Qemu-devel] [PULL 57/69] target/s390x: implement COMPARE LOGICAL LONG X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, aurelien@aurel32.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" From: Aurelien Jarno As CLCL and CLCLE mostly differ by their operands, use a common do_clcl helper. Another difference is that CLCL is not interruptible. Reviewed-by: Richard Henderson Signed-off-by: Aurelien Jarno Message-Id: <20170531220129.27724-19-aurelien@aurel32.net> Signed-off-by: Richard Henderson --- target/s390x/helper.h | 1 + target/s390x/insn-data.def | 2 ++ target/s390x/mem_helper.c | 84 +++++++++++++++++++++++++++++++++---------= ---- target/s390x/translate.c | 21 ++++++++++++ 4 files changed, 84 insertions(+), 24 deletions(-) diff --git a/target/s390x/helper.h b/target/s390x/helper.h index ba21e4d..546beec 100644 --- a/target/s390x/helper.h +++ b/target/s390x/helper.h @@ -6,6 +6,7 @@ DEF_HELPER_FLAGS_4(mvc, TCG_CALL_NO_WG, void, env, i32, i64= , i64) DEF_HELPER_FLAGS_4(mvcin, TCG_CALL_NO_WG, void, env, i32, i64, i64) DEF_HELPER_FLAGS_4(clc, TCG_CALL_NO_WG, i32, env, i32, i64, i64) DEF_HELPER_3(mvcl, i32, env, i32, i32) +DEF_HELPER_3(clcl, i32, env, i32, i32) DEF_HELPER_FLAGS_4(clm, TCG_CALL_NO_WG, i32, env, i32, i32, i64) DEF_HELPER_FLAGS_3(divs32, TCG_CALL_NO_WG, s64, env, s64, s64) DEF_HELPER_FLAGS_3(divu32, TCG_CALL_NO_WG, i64, env, i64, i64) diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index b40611b..1aa2b8b 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -216,6 +216,8 @@ C(0xc60e, CLGFRL, RIL_b, GIE, r1_o, mri2_32u, 0, 0, 0, cmpu64) C(0xc607, CLHRL, RIL_b, GIE, r1_o, mri2_16u, 0, 0, 0, cmpu32) C(0xc606, CLGHRL, RIL_b, GIE, r1_o, mri2_16u, 0, 0, 0, cmpu64) +/* COMPARE LOGICAL LONG */ + C(0x0f00, CLCL, RR_a, Z, 0, 0, 0, 0, clcl, 0) /* COMPARE LOGICAL LONG EXTENDED */ C(0xa900, CLCLE, RS_a, Z, 0, a2, 0, 0, clcle, 0) /* COMPARE LOGICAL CHARACTERS UNDER MASK */ diff --git a/target/s390x/mem_helper.c b/target/s390x/mem_helper.c index e992fd9..aaa347c 100644 --- a/target/s390x/mem_helper.c +++ b/target/s390x/mem_helper.c @@ -661,17 +661,14 @@ uint32_t HELPER(mvcle)(CPUS390XState *env, uint32_t r= 1, uint64_t a2, return cc; } =20 -/* compare logical long extended memcompare insn with padding */ -uint32_t HELPER(clcle)(CPUS390XState *env, uint32_t r1, uint64_t a2, - uint32_t r3) -{ - uintptr_t ra =3D GETPC(); - uint64_t src1len =3D get_length(env, r1 + 1); - uint64_t src1 =3D get_address(env, r1); - uint64_t src3len =3D get_length(env, r3 + 1); - uint64_t src3 =3D get_address(env, r3); - uint8_t pad =3D a2 & 0xff; - uint64_t len =3D MAX(src1len, src3len); +/* compare logical long helper */ +static inline uint32_t do_clcl(CPUS390XState *env, + uint64_t *src1, uint64_t *src1len, + uint64_t *src3, uint64_t *src3len, + uint8_t pad, uint64_t limit, + uintptr_t ra) +{ + uint64_t len =3D MAX(*src1len, *src3len); uint32_t cc =3D 0; =20 if (!len) { @@ -679,9 +676,9 @@ uint32_t HELPER(clcle)(CPUS390XState *env, uint32_t r1,= uint64_t a2, } =20 /* Lest we fail to service interrupts in a timely manner, limit the - amount of work we're willing to do. For now, let's cap at 8k. */ - if (len > 0x2000) { - len =3D 0x2000; + amount of work we're willing to do. */ + if (len > limit) { + len =3D limit; cc =3D 3; } =20 @@ -689,11 +686,11 @@ uint32_t HELPER(clcle)(CPUS390XState *env, uint32_t r= 1, uint64_t a2, uint8_t v1 =3D pad; uint8_t v3 =3D pad; =20 - if (src1len) { - v1 =3D cpu_ldub_data_ra(env, src1, ra); + if (*src1len) { + v1 =3D cpu_ldub_data_ra(env, *src1, ra); } - if (src3len) { - v3 =3D cpu_ldub_data_ra(env, src3, ra); + if (*src3len) { + v3 =3D cpu_ldub_data_ra(env, *src3, ra); } =20 if (v1 !=3D v3) { @@ -701,16 +698,55 @@ uint32_t HELPER(clcle)(CPUS390XState *env, uint32_t r= 1, uint64_t a2, break; } =20 - if (src1len) { - src1++; - src1len--; + if (*src1len) { + *src1 +=3D 1; + *src1len -=3D 1; } - if (src3len) { - src3++; - src3len--; + if (*src3len) { + *src3 +=3D 1; + *src3len -=3D 1; } } =20 + return cc; +} + + +/* compare logical long */ +uint32_t HELPER(clcl)(CPUS390XState *env, uint32_t r1, uint32_t r2) +{ + uintptr_t ra =3D GETPC(); + uint64_t src1len =3D extract64(env->regs[r1 + 1], 0, 24); + uint64_t src1 =3D get_address(env, r1); + uint64_t src3len =3D extract64(env->regs[r2 + 1], 0, 24); + uint64_t src3 =3D get_address(env, r2); + uint8_t pad =3D env->regs[r2 + 1] >> 24; + uint32_t cc; + + cc =3D do_clcl(env, &src1, &src1len, &src3, &src3len, pad, -1, ra); + + env->regs[r1 + 1] =3D deposit64(env->regs[r1 + 1], 0, 24, src1len); + env->regs[r2 + 1] =3D deposit64(env->regs[r2 + 1], 0, 24, src3len); + set_address(env, r1, src1); + set_address(env, r2, src3); + + return cc; +} + +/* compare logical long extended memcompare insn with padding */ +uint32_t HELPER(clcle)(CPUS390XState *env, uint32_t r1, uint64_t a2, + uint32_t r3) +{ + uintptr_t ra =3D GETPC(); + uint64_t src1len =3D get_length(env, r1 + 1); + uint64_t src1 =3D get_address(env, r1); + uint64_t src3len =3D get_length(env, r3 + 1); + uint64_t src3 =3D get_address(env, r3); + uint8_t pad =3D a2; + uint32_t cc; + + cc =3D do_clcl(env, &src1, &src1len, &src3, &src3len, pad, 0x2000, ra); + set_length(env, r1 + 1, src1len); set_length(env, r3 + 1, src3len); set_address(env, r1, src1); diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 9309e58..999d716 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -1915,6 +1915,27 @@ static ExitStatus op_clc(DisasContext *s, DisasOps *= o) return NO_EXIT; } =20 +static ExitStatus op_clcl(DisasContext *s, DisasOps *o) +{ + int r1 =3D get_field(s->fields, r1); + int r2 =3D get_field(s->fields, r2); + TCGv_i32 t1, t2; + + /* r1 and r2 must be even. */ + if (r1 & 1 || r2 & 1) { + gen_program_exception(s, PGM_SPECIFICATION); + return EXIT_NORETURN; + } + + t1 =3D tcg_const_i32(r1); + t2 =3D tcg_const_i32(r2); + gen_helper_clcl(cc_op, cpu_env, t1, t2); + tcg_temp_free_i32(t1); + tcg_temp_free_i32(t2); + set_cc_static(s); + return NO_EXIT; +} + static ExitStatus op_clcle(DisasContext *s, DisasOps *o) { int r1 =3D get_field(s->fields, r1); --=20 2.9.4