From patchwork Tue Aug 21 02:50:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pavel Zbitskiy X-Patchwork-Id: 960067 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=2001:4830:134:3::11; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="HFKl+WVr"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 41vZwC57yQz9s4Z for ; Tue, 21 Aug 2018 12:52:27 +1000 (AEST) Received: from localhost ([::1]:50361 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1frwmP-00048H-Bv for incoming@patchwork.ozlabs.org; Mon, 20 Aug 2018 22:52:25 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54327) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1frwlW-00046g-C7 for qemu-devel@nongnu.org; Mon, 20 Aug 2018 22:51:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1frwlV-0004gY-JJ for qemu-devel@nongnu.org; Mon, 20 Aug 2018 22:51:30 -0400 Received: from mail-qt0-x241.google.com ([2607:f8b0:400d:c0d::241]:37409) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1frwlV-0004gN-Et; Mon, 20 Aug 2018 22:51:29 -0400 Received: by mail-qt0-x241.google.com with SMTP id n6-v6so18638207qtl.4; Mon, 20 Aug 2018 19:51:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=DpbgLp8wct0YhozG0iWNjnDk+BOlqqTiSDODFGUJjZc=; b=HFKl+WVrsbGPV7Esible+66NDOtbLQya1fDbbsEGcw11VQgaZIbk82lvCLFfsuw4Y7 KXoLVCDYKvSysnBMf8Ra8kejAmwd/3v5nl40b8A03kyjMKUGWf/B6AKZz0bMvhwBGcTi jtN7YpiwMo74nrzzxZH0N5dzlWDSf0k0kui6zCsbux97seis/6RzOFcqFDooUBTPU/1k lfkjEll3fl13hbolZlxpvz3ZHBskxZkz+cti3QVN4U16YuI0CIFrwN5XyGQdxfqO0lQx b9wMhJ9gA8a2aYesPQ7Bd2hQAMEY9kWzLFYO22HZ5A3ADHaeW+CLO7vUdHKH5oLB2Tab zDRA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DpbgLp8wct0YhozG0iWNjnDk+BOlqqTiSDODFGUJjZc=; b=idDGtk6va2kD78R3Yi9sOvfA25jQSrTY8hbArNOabNe7F9oh/pmzprHCDcMo2wsGh1 D6cwoyZyqX49OPm/a/P+wJ2YldNSIwkIbZZGZ9t2QYWEzzV1P1PjuwhQb+/0pocZC5h5 7KxzZK93CY8wA17vGLEPuEFifM0lVDFK+ctOwgx+b0SbfnlgKxUP8fuRbF/sKlGqpzc+ FGev+Gk1ZvD2wTUW3BpT4BqtOOJvotSI9pVsSjoIKIZXieselexHYmJR99RYJFwjjYqd qMoir376ZqYwtZd9O54CqEplcs0BoHAvMPUuEfsqyEF2WKGov+FOddiPya8faTIurZAr BBow== X-Gm-Message-State: AOUpUlFNftOFY6EikUo4B5+OMvwbzkC2M5J7WtrnEXpCgvrOWL2wREfU sU1hs4jgknbC+9v0Yh5fqkT8JQYorwA= X-Google-Smtp-Source: AA+uWPypXPcbjXKTwvhW3da3RIiPWgKAk2Xi7Esny6kuhnfMrLcmblvRGPpYXZXjofAk+vg6M+mDbQ== X-Received: by 2002:a0c:891a:: with SMTP id 26-v6mr44402860qvp.195.1534819888889; Mon, 20 Aug 2018 19:51:28 -0700 (PDT) Received: from WAL-L-PZ01.rocketsoftware.com (inet-64-112-177-9.bos.netblazr.com. [64.112.177.9]) by smtp.gmail.com with ESMTPSA id d100-v6sm4897991qkh.34.2018.08.20.19.51.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 20 Aug 2018 19:51:28 -0700 (PDT) From: Pavel Zbitskiy To: qemu-devel@nongnu.org Date: Mon, 20 Aug 2018 22:50:59 -0400 Message-Id: <20180821025104.19604-3-pavel.zbitskiy@gmail.com> In-Reply-To: <20180821025104.19604-1-pavel.zbitskiy@gmail.com> References: <20180821025104.19604-1-pavel.zbitskiy@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::241 Subject: [Qemu-devel] [PATCH 2/7] target/s390x: add BAL and BALR instructions 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: Pavel Zbitskiy , david@redhat.com, cohuck@redhat.com, richard.henderson@linaro.org, Alexander Graf , qemu-s390x@nongnu.org, Richard Henderson Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" These instructions are provided for compatibility purposes and are used only by old software, in the new code BAS and BASR are preferred. The difference between the old and new instruction exists only in the 24-bit mode. In addition, fix BAS polluting high 32 bits of the first operand in 24- and 31-bit addressing modes. Signed-off-by: Pavel Zbitskiy Reviewed-by: David Hildenbrand --- target/s390x/insn-data.def | 3 +++ target/s390x/translate.c | 55 +++++++++++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 7 deletions(-) diff --git a/target/s390x/insn-data.def b/target/s390x/insn-data.def index 5c6f33ed9c..9c7b434fca 100644 --- a/target/s390x/insn-data.def +++ b/target/s390x/insn-data.def @@ -102,6 +102,9 @@ D(0x9400, NI, SI, Z, la1, i2_8u, new, 0, ni, nz64, MO_UB) D(0xeb54, NIY, SIY, LD, la1, i2_8u, new, 0, ni, nz64, MO_UB) +/* BRANCH AND LINK */ + C(0x0500, BALR, RR_a, Z, 0, r2_nz, r1, 0, bal, 0) + C(0x4500, BAL, RX_a, Z, 0, a2, r1, 0, bal, 0) /* BRANCH AND SAVE */ C(0x0d00, BASR, RR_a, Z, 0, r2_nz, r1, 0, bas, 0) C(0x4d00, BAS, RX_a, Z, 0, a2, r1, 0, bas, 0) diff --git a/target/s390x/translate.c b/target/s390x/translate.c index 57c03cbf58..111d575c41 100644 --- a/target/s390x/translate.c +++ b/target/s390x/translate.c @@ -84,14 +84,22 @@ static uint64_t inline_branch_hit[CC_OP_MAX]; static uint64_t inline_branch_miss[CC_OP_MAX]; #endif -static uint64_t pc_to_link_info(DisasContext *s, uint64_t pc) +static void pc_to_link_info(TCGv_i64 out, DisasContext *s, uint64_t pc) { - if (!(s->base.tb->flags & FLAG_MASK_64)) { - if (s->base.tb->flags & FLAG_MASK_32) { - return pc | 0x80000000; + TCGv_i64 tmp; + + if (s->base.tb->flags & FLAG_MASK_32) { + if (s->base.tb->flags & FLAG_MASK_64) { + tcg_gen_movi_i64(out, pc); + return; } + pc |= 0x80000000; } - return pc; + assert(!(s->base.tb->flags & FLAG_MASK_64)); + tmp = tcg_temp_new_i64(); + tcg_gen_movi_i64(tmp, pc); + tcg_gen_deposit_i64(out, out, tmp, 0, 32); + tcg_temp_free_i64(tmp); } static TCGv_i64 psw_addr; @@ -1453,7 +1461,40 @@ static DisasJumpType op_ni(DisasContext *s, DisasOps *o) static DisasJumpType op_bas(DisasContext *s, DisasOps *o) { - tcg_gen_movi_i64(o->out, pc_to_link_info(s, s->pc_tmp)); + pc_to_link_info(o->out, s, s->pc_tmp); + if (o->in2) { + tcg_gen_mov_i64(psw_addr, o->in2); + per_branch(s, false); + return DISAS_PC_UPDATED; + } else { + return DISAS_NEXT; + } +} + +static void save_link_info(DisasContext *s, DisasOps *o) +{ + TCGv_i64 t; + + if (s->base.tb->flags & (FLAG_MASK_32 | FLAG_MASK_64)) { + pc_to_link_info(o->out, s, s->pc_tmp); + return; + } + gen_op_calc_cc(s); + tcg_gen_andi_i64(o->out, o->out, 0xffffffff00000000ull); + tcg_gen_ori_i64(o->out, o->out, ((s->ilen / 2) << 30) | s->pc_tmp); + t = tcg_temp_new_i64(); + tcg_gen_shri_i64(t, psw_mask, 16); + tcg_gen_andi_i64(t, t, 0x0f000000); + tcg_gen_or_i64(o->out, o->out, t); + tcg_gen_extu_i32_i64(t, cc_op); + tcg_gen_shli_i64(t, t, 28); + tcg_gen_or_i64(o->out, o->out, t); + tcg_temp_free_i64(t); +} + +static DisasJumpType op_bal(DisasContext *s, DisasOps *o) +{ + save_link_info(s, o); if (o->in2) { tcg_gen_mov_i64(psw_addr, o->in2); per_branch(s, false); @@ -1465,7 +1506,7 @@ static DisasJumpType op_bas(DisasContext *s, DisasOps *o) static DisasJumpType op_basi(DisasContext *s, DisasOps *o) { - tcg_gen_movi_i64(o->out, pc_to_link_info(s, s->pc_tmp)); + pc_to_link_info(o->out, s, s->pc_tmp); return help_goto_direct(s, s->base.pc_next + 2 * get_field(s->fields, i2)); }