From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:46470) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VohNn-0007kr-Gu for qemu-devel@nongnu.org; Thu, 05 Dec 2013 17:27:03 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1VohNf-00021W-40 for qemu-devel@nongnu.org; Thu, 05 Dec 2013 17:26:55 -0500 Received: from mail-yh0-x232.google.com ([2607:f8b0:4002:c01::232]:54449) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1VohNe-00020r-Ub for qemu-devel@nongnu.org; Thu, 05 Dec 2013 17:26:47 -0500 Received: by mail-yh0-f50.google.com with SMTP id b6so13206000yha.37 for ; Thu, 05 Dec 2013 14:26:46 -0800 (PST) Sender: Richard Henderson Message-ID: <52A0FD9D.4000104@twiddle.net> Date: Fri, 06 Dec 2013 11:26:37 +1300 From: Richard Henderson MIME-Version: 1.0 References: <1386280289-27636-1-git-send-email-peter.maydell@linaro.org> <1386280289-27636-2-git-send-email-peter.maydell@linaro.org> In-Reply-To: <1386280289-27636-2-git-send-email-peter.maydell@linaro.org> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 01/13] target-arm: A64: add support for conditional select List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell , qemu-devel@nongnu.org Cc: patches@linaro.org, Michael Matz , Claudio Fontana , Dirk Mueller , Will Newton , Laurent Desnogues , =?ISO-8859-1?Q?Alex_Benn=E9e?= , kvmarm@lists.cs.columbia.edu, Christoffer Dall On 12/06/2013 10:51 AM, Peter Maydell wrote: > + if (cond >= 0x0e) { /* condition "always" */ > + tcg_src = read_cpu_reg(s, rn, sf); > + tcg_gen_mov_i64(tcg_rd, tcg_src); I wonder if it's worth adding that 0x0[ef] case to the generic condition processing rather than keep replicating it everywhere. > + } else { > + /* OPTME: we could use movcond here, at the cost of duplicating > + * a lot of the arm_gen_test_cc() logic. > + */ Honestly, arm_gen_test_cc should get refactored to a real test (as opposed to branch) sooner rather than later. Longer term it's probably worth recognizing the special case of Rm==31 && Rn==31 && else_inc as setcond as opposed to movcond. > + arm_gen_test_cc(cond, label_match); > + /* nomatch: */ > + tcg_src = read_cpu_reg(s, rm, sf); > + tcg_gen_mov_i64(tcg_rd, tcg_src); > + if (else_inv) { > + tcg_gen_not_i64(tcg_rd, tcg_rd); > + } > + if (else_inc) { > + tcg_gen_addi_i64(tcg_rd, tcg_rd, 1); > + } I think better as if (else_inv && else_inc) { tcg_gen_neg_i64(tcg_rd, tcg_src); } else if (else_inv) { tcg_gen_not_i64(tcg_rd, tcg_src); } else if (else_inc) { tcg_gen_addi_i64(tcg_rd, tcg_src, 1); } else { tcg_gen_mov_i64(tcg_rd, tcg_src); } > + if (!sf) { > + tcg_gen_ext32u_i64(tcg_rd, tcg_rd); > + } I do wonder about the usefulness of passing SF (as opposed to hardcoding 1) to read_cpu_reg to begin, since the ext32u that it generates is redundant with the one here at the end, and likely cannot be optimized away. r~