From patchwork Fri May 4 05:40:20 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 134930 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp423771lji; Thu, 3 May 2018 22:43:51 -0700 (PDT) X-Google-Smtp-Source: AB8JxZosup/bZ+LVcNPwWQDb+4xu451wT05/VyGQOQ71h1M4phzfLzYbdkc6SKZnx6/tAO8draQq X-Received: by 2002:ac8:27c9:: with SMTP id x9-v6mr21577417qtx.374.1525412631588; Thu, 03 May 2018 22:43:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525412631; cv=none; d=google.com; s=arc-20160816; b=snIw11RYEsy4sLQPzf3TFDZQXKti7IWnYXKR3+AJWqxYU8u5wh0FwlzPpXY88BqOCD IyUaak+dxbIz1pufuYIkSW6BTM083uyHCI9ulFq0+Yp4OoRCCgH7COwErjbQ6X/GXq6f 7sPrLUj+otqL73ta1EZx8YiqRHb1kEoJwPdw+XGcCV/fYPwTS690Y4Gkqeg1h8Zmkyn2 22b7OFYj+pG16QglE9VSZA1fT6B86zShvYhJxHIZqKxvOhXONrr1x7xnkhu+Ndx9Jetl JGtEZdrcdA29baYvTjMBa+BvlJ8zvuU4AcXy15V19+/OqEsQNi8xVggXG8chhlbRmuJz jsgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:subject:references:in-reply-to :message-id:date:to:from:dkim-signature:arc-authentication-results; bh=VqI5NcpIlQNdjgLTUSjECMaoWz9uWqWPyVMj3nJr4gI=; b=vgVIDwZ7oE+jhSC6+mSKGAN26Jxmrl63fQMA5Io39rv//hsWffDYrOssPiAf5glkyb 3wr84NsSl4vZtSvav3gPlb53PjIb9HjiRMgZAv45vFgq7ubKLSQxuXe4SjA/Q6EpWjSh J62ekMPW8EkfErTmbzWJkhKGzZ3PV/1ExAchpCSB5K+VB+GRmqAMoNMdNSi0NZlepC9z SoMEzB+RCutisdYTAPAnIaEPcqHt2UY1ofVSRM2ONS5/riJkkpR2GB8mkuzHmviKXoaL 553KMAP23GLSH8UNBJ7xBs3ik7468ZiEr9AwJP5S2hY0X6jMuV6zHru5Vjo6TDXYcBMc Ciew== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=fytMC80y; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lists.gnu.org (lists.gnu.org. [2001:4830:134:3::11]) by mx.google.com with ESMTPS id j60-v6si1503083qtb.402.2018.05.03.22.43.51 for (version=TLS1 cipher=AES128-SHA bits=128/128); Thu, 03 May 2018 22:43:51 -0700 (PDT) Received-SPF: pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) client-ip=2001:4830:134:3::11; Authentication-Results: mx.google.com; dkim=fail header.i=@linaro.org header.s=google header.b=fytMC80y; spf=pass (google.com: domain of qemu-devel-bounces+patch=linaro.org@nongnu.org designates 2001:4830:134:3::11 as permitted sender) smtp.mailfrom=qemu-devel-bounces+patch=linaro.org@nongnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from localhost ([::1]:60554 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fETVX-0002GL-15 for patch@linaro.org; Fri, 04 May 2018 01:43:51 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38285) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fETSR-0008Pf-Ma for qemu-devel@nongnu.org; Fri, 04 May 2018 01:40:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fETSQ-0004h2-Bc for qemu-devel@nongnu.org; Fri, 04 May 2018 01:40:39 -0400 Received: from mail-pf0-x241.google.com ([2607:f8b0:400e:c00::241]:37855) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fETSQ-0004fv-4G for qemu-devel@nongnu.org; Fri, 04 May 2018 01:40:38 -0400 Received: by mail-pf0-x241.google.com with SMTP id e9so12582298pfi.4 for ; Thu, 03 May 2018 22:40:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=VqI5NcpIlQNdjgLTUSjECMaoWz9uWqWPyVMj3nJr4gI=; b=fytMC80y4DZqb3yYpk+Q4qao6LZ75uAB+XUSThOitImvpsqFE8ZIh08bzNLmYMVhxb TxDKh3Uyu1AOFbO9qrw3kcUDQ4Z7kaDpS//cyeoqKjmn6T9ucrHqPuAkFwFfLWgtlOiy ZUoFXPcYecnzt3ZfIzEACkvjgnfC7r+gImuZY= 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=VqI5NcpIlQNdjgLTUSjECMaoWz9uWqWPyVMj3nJr4gI=; b=YT7bTpB3n2jq24MKvnA4LaAO+1ZGmwJeap5j3iAaF+uRukpnUoSFR7ZIQNaX7CfQYB FSfofZANAFNhb/EnKCudw35hY5pDkrFPjES+nimQHVTZhTUA/wgfxBCOdFbQc/AshfA4 XEgVEyLZHW7sVyHxyKb5m37xlGjW+rgqmLDSloG6G29Bzt77ibVM4VO5WKF+GEsxC3WO ABjVy6CQUBZBjmmQkUolKAz8cNXcjrADxbFcELVs7kUhCZhemPqBgg5kMa/WAqiiOf9O e448MqGnFxR+88FUpKXd/J9pVWluQ5LwzlwAu8D3kHSw0GKoXacznvVfr4QNwUzWfL2l 7Q6w== X-Gm-Message-State: ALQs6tCha3I9zyq50UKsAo40h2WkpX7GFSKjimtbGrOqYZEDOxqrs1YY NRnIZfAEwn7MGmo2yTuwV/Xd63ga8gI= X-Received: by 2002:a17:902:8d8b:: with SMTP id v11-v6mr27310110plo.9.1525412436770; Thu, 03 May 2018 22:40:36 -0700 (PDT) Received: from cloudburst.twiddle.net (97-113-2-170.tukw.qwest.net. [97.113.2.170]) by smtp.gmail.com with ESMTPSA id t23-v6sm26550809pgu.41.2018.05.03.22.40.35 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Thu, 03 May 2018 22:40:35 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Thu, 3 May 2018 22:40:20 -0700 Message-Id: <20180504054030.24527-4-richard.henderson@linaro.org> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180504054030.24527-1-richard.henderson@linaro.org> References: <20180504054030.24527-1-richard.henderson@linaro.org> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400e:c00::241 Subject: [Qemu-devel] [PATCH 03/13] target/openrisc: Convert branch insns 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: Stafford Horne Errors-To: qemu-devel-bounces+patch=linaro.org@nongnu.org Sender: "Qemu-devel" Signed-off-by: Richard Henderson --- target/openrisc/translate.c | 149 +++++++++++++++++++++---------------------- target/openrisc/insns.decode | 12 ++++ 2 files changed, 83 insertions(+), 78 deletions(-) -- 2.14.3 Acked-by: Stafford Horne diff --git a/target/openrisc/translate.c b/target/openrisc/translate.c index 40b21a5db1..95e4f17b8a 100644 --- a/target/openrisc/translate.c +++ b/target/openrisc/translate.c @@ -195,52 +195,6 @@ static void gen_goto_tb(DisasContext *dc, int n, target_ulong dest) } } -static void gen_jump(DisasContext *dc, int32_t n26, uint32_t reg, uint32_t op0) -{ - target_ulong tmp_pc = dc->pc + n26 * 4; - - switch (op0) { - case 0x00: /* l.j */ - tcg_gen_movi_tl(jmp_pc, tmp_pc); - break; - case 0x01: /* l.jal */ - tcg_gen_movi_tl(cpu_R[9], dc->pc + 8); - /* Optimize jal being used to load the PC for PIC. */ - if (tmp_pc == dc->pc + 8) { - return; - } - tcg_gen_movi_tl(jmp_pc, tmp_pc); - break; - case 0x03: /* l.bnf */ - case 0x04: /* l.bf */ - { - TCGv t_next = tcg_const_tl(dc->pc + 8); - TCGv t_true = tcg_const_tl(tmp_pc); - TCGv t_zero = tcg_const_tl(0); - - tcg_gen_movcond_tl(op0 == 0x03 ? TCG_COND_EQ : TCG_COND_NE, - jmp_pc, cpu_sr_f, t_zero, t_true, t_next); - - tcg_temp_free(t_next); - tcg_temp_free(t_true); - tcg_temp_free(t_zero); - } - break; - case 0x11: /* l.jr */ - tcg_gen_mov_tl(jmp_pc, cpu_R[reg]); - break; - case 0x12: /* l.jalr */ - tcg_gen_movi_tl(cpu_R[9], (dc->pc + 8)); - tcg_gen_mov_tl(jmp_pc, cpu_R[reg]); - break; - default: - gen_illegal_exception(dc); - break; - } - - dc->delayed_branch = 2; -} - static void gen_ove_cy(DisasContext *dc) { if (dc->tb_flags & SR_OVE) { @@ -715,12 +669,82 @@ static void dec_calc(DisasContext *dc, uint32_t insn) gen_illegal_exception(dc); } +static bool trans_l_j(DisasContext *dc, arg_l_j *a, uint32_t insn) +{ + target_ulong tmp_pc = dc->pc + a->n * 4; + + LOG_DIS("l.j %d\n", a->n); + tcg_gen_movi_tl(jmp_pc, tmp_pc); + dc->delayed_branch = 2; + return true; +} + +static bool trans_l_jal(DisasContext *dc, arg_l_jal *a, uint32_t insn) +{ + target_ulong tmp_pc = dc->pc + a->n * 4; + + LOG_DIS("l.jal %d\n", a->n); + tcg_gen_movi_tl(cpu_R[9], dc->pc + 8); + /* Optimize jal being used to load the PC for PIC. */ + if (tmp_pc != dc->pc + 8) { + tcg_gen_movi_tl(jmp_pc, tmp_pc); + dc->delayed_branch = 2; + } + return true; +} + +static void do_bf(DisasContext *dc, arg_l_bf *a, TCGCond cond) +{ + target_ulong tmp_pc = dc->pc + a->n * 4; + TCGv t_next = tcg_const_tl(dc->pc + 8); + TCGv t_true = tcg_const_tl(tmp_pc); + TCGv t_zero = tcg_const_tl(0); + + tcg_gen_movcond_tl(cond, jmp_pc, cpu_sr_f, t_zero, t_true, t_next); + + tcg_temp_free(t_next); + tcg_temp_free(t_true); + tcg_temp_free(t_zero); + dc->delayed_branch = 2; +} + +static bool trans_l_bf(DisasContext *dc, arg_l_bf *a, uint32_t insn) +{ + LOG_DIS("l.bf %d\n", a->n); + do_bf(dc, a, TCG_COND_NE); + return true; +} + +static bool trans_l_bnf(DisasContext *dc, arg_l_bf *a, uint32_t insn) +{ + LOG_DIS("l.bnf %d\n", a->n); + do_bf(dc, a, TCG_COND_EQ); + return true; +} + +static bool trans_l_jr(DisasContext *dc, arg_l_jr *a, uint32_t insn) +{ + LOG_DIS("l.jr r%d\n", a->b); + tcg_gen_mov_tl(jmp_pc, cpu_R[a->b]); + dc->delayed_branch = 2; + return true; +} + +static bool trans_l_jalr(DisasContext *dc, arg_l_jalr *a, uint32_t insn) +{ + LOG_DIS("l.jalr r%d\n", a->b); + tcg_gen_mov_tl(jmp_pc, cpu_R[a->b]); + tcg_gen_movi_tl(cpu_R[9], dc->pc + 8); + dc->delayed_branch = 2; + return true; +} + static void dec_misc(DisasContext *dc, uint32_t insn) { uint32_t op0, op1; uint32_t ra, rb, rd; uint32_t L6, K5, K16, K5_11; - int32_t I16, I5_11, N26; + int32_t I16, I5_11; TCGMemOp mop; TCGv t0; @@ -733,31 +757,10 @@ static void dec_misc(DisasContext *dc, uint32_t insn) K5 = extract32(insn, 0, 5); K16 = extract32(insn, 0, 16); I16 = (int16_t)K16; - N26 = sextract32(insn, 0, 26); K5_11 = (extract32(insn, 21, 5) << 11) | extract32(insn, 0, 11); I5_11 = (int16_t)K5_11; switch (op0) { - case 0x00: /* l.j */ - LOG_DIS("l.j %d\n", N26); - gen_jump(dc, N26, 0, op0); - break; - - case 0x01: /* l.jal */ - LOG_DIS("l.jal %d\n", N26); - gen_jump(dc, N26, 0, op0); - break; - - case 0x03: /* l.bnf */ - LOG_DIS("l.bnf %d\n", N26); - gen_jump(dc, N26, 0, op0); - break; - - case 0x04: /* l.bf */ - LOG_DIS("l.bf %d\n", N26); - gen_jump(dc, N26, 0, op0); - break; - case 0x05: switch (op1) { case 0x01: /* l.nop */ @@ -770,16 +773,6 @@ static void dec_misc(DisasContext *dc, uint32_t insn) } break; - case 0x11: /* l.jr */ - LOG_DIS("l.jr r%d\n", rb); - gen_jump(dc, 0, rb, op0); - break; - - case 0x12: /* l.jalr */ - LOG_DIS("l.jalr r%d\n", rb); - gen_jump(dc, 0, rb, op0); - break; - case 0x13: /* l.maci */ LOG_DIS("l.maci r%d, %d\n", ra, I16); t0 = tcg_const_tl(I16); diff --git a/target/openrisc/insns.decode b/target/openrisc/insns.decode index 47d31afc5b..8d35011eab 100644 --- a/target/openrisc/insns.decode +++ b/target/openrisc/insns.decode @@ -26,3 +26,15 @@ l_trap 001000 0100000000 k:16 l_msync 001000 1000000000 00000000 00000000 l_psync 001000 1010000000 00000000 00000000 l_csync 001000 1100000000 00000000 00000000 + +#### +# Branch Instructions +#### + +l_j 000000 n:s26 +l_jal 000001 n:s26 +l_bnf 000011 n:s26 +l_bf 000100 n:s26 + +l_jr 010001 ---------- b:5 ----------- +l_jalr 010010 ---------- b:5 -----------