From patchwork Mon Jul 24 01:01:06 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matt Brown X-Patchwork-Id: 792606 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xG38Q178Zz9s7F for ; Mon, 24 Jul 2017 11:05:42 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="d+7xejA5"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xG38P6shwzDrH1 for ; Mon, 24 Jul 2017 11:05:41 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="d+7xejA5"; dkim-atps=neutral X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Received: from mail-pf0-x244.google.com (mail-pf0-x244.google.com [IPv6:2607:f8b0:400e:c00::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xG33W5WyYzDrH7 for ; Mon, 24 Jul 2017 11:01:27 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="d+7xejA5"; dkim-atps=neutral Received: by mail-pf0-x244.google.com with SMTP id 1so1107418pfi.3 for ; Sun, 23 Jul 2017 18:01:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=85kn4bmMavsMhWRHsNzJTkJhvVEIHrzNpaffmoW6+BU=; b=d+7xejA5k2xArctwmhCu1hJkBDdL1GBTWMIA9dk1QORWSYRin/4cw41Vb6O2G2Va/U tNF1/tebrYvhnlBtEct31MkIwavJotlbTJGcf8/TQWcdtEtnB6QXnby3ho3p0zRRsEYA SMhYfn9vl4HDFeSX3W8V7dLre4v9p9nkY8an/gCo3vpfG51zi17APZIheNndIOO3ugaU 4abLkyyUp/cSW4SVZuupVqLNzlePtZyACZi1X58vsx6MkX24OSvriuWKF5K1VBhuNAMk nYIz3xVSayVF+8P6i4lbtK+/rn5RhRXrP1E1yEAXuY1I8lSfR/3nAYt3SiaLrLubGaRr BNNg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=85kn4bmMavsMhWRHsNzJTkJhvVEIHrzNpaffmoW6+BU=; b=YM/1xoT+f2GVqCqA4+bwUdlWYet+sGsRq5LZ+MzgPq2gROnjtMlrDUoWzVW5PIguNZ kALAHzCJJTADqU4hNnFT1IZAWFQmq8LrPm/iPeG4N9VAtSnqL8IISTHg9QXYq1eeNkQX 7x5V0JOc8hNLqDBW2/mBd52j4DiU7AOtc8smNbDw9/KvRvcMjyQ5kgTV5151YXvHOJbE rR3B2RSWmgx+sl36WVohAlcdGNPsYNKM0EDzumPXQC63ptxHUp+5F12WUO1Y+CxGD2/h UCsl4GWjyXcQe8OLRenLfp5U0LskqkNipxB/4N3LksD3FznH1I/BDPlFiEvVPMtY4dWE T4vQ== X-Gm-Message-State: AIVw113BzQ6o2m5+W+kQBOdMy7yHsBswDtPZomGmz2PZz/R6luzc9SLs 65xV9jEgBY9ElYt9 X-Received: by 10.98.61.93 with SMTP id k90mr14416388pfa.174.1500858085087; Sun, 23 Jul 2017 18:01:25 -0700 (PDT) Received: from matt.ozlabs.ibm.com ([122.99.82.10]) by smtp.gmail.com with ESMTPSA id i5sm22043976pgk.61.2017.07.23.18.01.23 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 23 Jul 2017 18:01:24 -0700 (PDT) From: Matt Brown To: linuxppc-dev@lists.ozlabs.org Subject: [PATCH v2 2/5] powerpc/lib/sstep: Add popcnt instruction emulation Date: Mon, 24 Jul 2017 11:01:06 +1000 Message-Id: <20170724010109.21263-2-matthew.brown.dev@gmail.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170724010109.21263-1-matthew.brown.dev@gmail.com> References: <20170724010109.21263-1-matthew.brown.dev@gmail.com> X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" This adds emulations for the popcntb, popcntw, and popcntd instructions. Tested for correctness against the popcnt{b,w,d} instructions on ppc64le. Signed-off-by: Matt Brown --- v2: - fixed opcodes - fixed typecasting - fixed bitshifting error for both 32 and 64bit arch --- arch/powerpc/lib/sstep.c | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/lib/sstep.c b/arch/powerpc/lib/sstep.c index 87d277f..e6a16a3 100644 --- a/arch/powerpc/lib/sstep.c +++ b/arch/powerpc/lib/sstep.c @@ -612,6 +612,35 @@ static nokprobe_inline void do_cmpb(struct pt_regs *regs, unsigned long v1, regs->gpr[rd] = out_val; } +/* + * The size parameter is used to adjust the equivalent popcnt instruction. + * popcntb = 8, popcntw = 32, popcntd = 64 + */ +static nokprobe_inline void do_popcnt(struct pt_regs *regs, unsigned long v1, + int size, int ra) +{ + unsigned long long high, low, mask; + unsigned int n; + int i, j; + + high = 0; + low = 0; + + for (i = 0; i < (64 / size); i++) { + n = 0; + for (j = 0; j < size; j++) { + mask = 1UL << (j + (i * size)); + if (v1 & mask) + n++; + } + if ((i * size) < 32) + low |= n << (i * size); + else + high |= n << ((i * size) - 32); + } + regs->gpr[ra] = (high << 32) | low; +} + static nokprobe_inline int trap_compare(long v1, long v2) { int ret = 0; @@ -1194,6 +1223,10 @@ int analyse_instr(struct instruction_op *op, struct pt_regs *regs, regs->gpr[ra] = regs->gpr[rd] & ~regs->gpr[rb]; goto logical_done; + case 122: /* popcntb */ + do_popcnt(regs, regs->gpr[rd], 8, ra); + goto logical_done; + case 124: /* nor */ regs->gpr[ra] = ~(regs->gpr[rd] | regs->gpr[rb]); goto logical_done; @@ -1206,6 +1239,10 @@ int analyse_instr(struct instruction_op *op, struct pt_regs *regs, regs->gpr[ra] = regs->gpr[rd] ^ regs->gpr[rb]; goto logical_done; + case 378: /* popcntw */ + do_popcnt(regs, regs->gpr[rd], 32, ra); + goto logical_done; + case 412: /* orc */ regs->gpr[ra] = regs->gpr[rd] | ~regs->gpr[rb]; goto logical_done; @@ -1217,7 +1254,11 @@ int analyse_instr(struct instruction_op *op, struct pt_regs *regs, case 476: /* nand */ regs->gpr[ra] = ~(regs->gpr[rd] & regs->gpr[rb]); goto logical_done; - +#ifdef __powerpc64__ + case 506: /* popcntd */ + do_popcnt(regs, regs->gpr[rd], 64, ra); + goto logical_done; +#endif case 922: /* extsh */ regs->gpr[ra] = (signed short) regs->gpr[rd]; goto logical_done;