From patchwork Fri May 12 23:38:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Philippe_Mathieu-Daud=C3=A9?= X-Patchwork-Id: 761881 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org 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 3wPmfW3vwjz9s7w for ; Sat, 13 May 2017 09:39:47 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="d5hfeJDX"; dkim-atps=neutral Received: from localhost ([::1]:55670 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d9K9x-0008Qc-2n for incoming@patchwork.ozlabs.org; Fri, 12 May 2017 19:39:45 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44792) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d9K9F-0008Ol-6Q for qemu-devel@nongnu.org; Fri, 12 May 2017 19:39:02 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d9K9D-0002Tu-RG for qemu-devel@nongnu.org; Fri, 12 May 2017 19:39:01 -0400 Received: from mail-qt0-x22a.google.com ([2607:f8b0:400d:c0d::22a]:36462) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d9K9D-0002T7-Lm for qemu-devel@nongnu.org; Fri, 12 May 2017 19:38:59 -0400 Received: by mail-qt0-x22a.google.com with SMTP id f55so11050777qta.3 for ; Fri, 12 May 2017 16:38:59 -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 :mime-version:content-transfer-encoding; bh=Lf/X7klh0bXzciQF3lh+AdVzTLi16otmJ/GzIO3WPpQ=; b=d5hfeJDXkW0j1KLfbmRFTXRD1Fe8ylbmlzsERQfMu7z/sEpDYYa8GqZRPIh8f40tFI tsKoNRmAYrdufQ8OYMK49ZIgDeOhnzUMfwKRjcsk9oQj/KcaFrT5OGYCvYqPC2/L0JoZ 8nr4Ov12GSmVTXOJC6cndDkq9Vvms33YD9q+FUYP7KsErpiEq/WGwFqwE5FB6Bh6v0yd x88Ua5PiJpApM28QGi19KqzpbDzNK8bzqSpL2k2kuLsgI4sBdCPORwdwMmjdibNX5PY0 yBB/ZYEK8HL7+YGhDvHavD5hif4Bi28a+NIsIRH9IkIYuu5dHUmh9cAX8cXY99ZtA1jO Cd1Q== 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:mime-version:content-transfer-encoding; bh=Lf/X7klh0bXzciQF3lh+AdVzTLi16otmJ/GzIO3WPpQ=; b=N73VX5dQNsWOjOAomWBMwwzoSxTi7fOeEMoEcixGykBFa31j8oKfJE/3egea/lYuGr fEL29ONDyZTBk32cdyRNau8oiwTidApEMWuiv/wkpEoBoZkKd78Ms9G9ne/vgR6M4bCt rsjhpv/O5bhWSdOd4k+z8GevPNKnxs3zjyviLfvqF1uftbNu5PknsEK4HjB43HctGf0I djXKm3SnMd0F2PJTPmD3+Po/NOVnC9q5kU9ldM8S3O+15O4Dz0dXmYd/gjS6LY5VD+vM BS3xePCb41U23MUCMLm9XUSldqZwxWFtrT3a3gnl0KSVNJG7SquuRqtP17yqjOpbzJOr lW6Q== X-Gm-Message-State: AODbwcBXTQdtGaukxEpZt6LAdglpl+zMRF59GNieXtCANqiC1tigHwZZ AjvS7qtQtzqD7A== X-Received: by 10.200.38.227 with SMTP id 32mr5875037qtp.275.1494632339018; Fri, 12 May 2017 16:38:59 -0700 (PDT) Received: from localhost.localdomain ([138.117.48.226]) by smtp.gmail.com with ESMTPSA id n78sm3253857qki.60.2017.05.12.16.38.54 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 12 May 2017 16:38:58 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org, Aurelien Jarno , Richard Henderson , Nikunj A Dadhania , Eric Blake , Markus Armbruster , Laurent Vivier , Michael Tokarev , Eduardo Habkost , Paolo Bonzini Date: Fri, 12 May 2017 20:38:38 -0300 Message-Id: <20170512233843.27713-2-f4bug@amsat.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170512233843.27713-1-f4bug@amsat.org> References: <20170512233843.27713-1-f4bug@amsat.org> MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:400d:c0d::22a Subject: [Qemu-devel] [RFC PATCH v4 1/6] coccinelle: add a script to optimize tcg op using tcg_gen_extract() 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: Julia Lawall , Nicolas Palix , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Markus Elfring Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" If you have coccinelle installed you can apply this script using: $ spatch \ --macro-file scripts/cocci-macro-file.h \ --dir target --in-place You can also use directly Peter Senna Tschudin docker image (easier): $ docker run -v `pwd`:`pwd` -w `pwd` petersenna/coccinelle \ --sp-file scripts/coccinelle/tcg_gen_extract.cocci \ --macro-file scripts/cocci-macro-file.h \ --dir target --in-place Then verified that no manual touchups are required. The following thread was helpful while writing this script: https://github.com/coccinelle/coccinelle/issues/86 Signed-off-by: Philippe Mathieu-Daudé --- scripts/coccinelle/tcg_gen_extract.cocci | 103 +++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 scripts/coccinelle/tcg_gen_extract.cocci diff --git a/scripts/coccinelle/tcg_gen_extract.cocci b/scripts/coccinelle/tcg_gen_extract.cocci new file mode 100644 index 0000000000..37546834ee --- /dev/null +++ b/scripts/coccinelle/tcg_gen_extract.cocci @@ -0,0 +1,103 @@ +// optimize TCG using extract op +// +// Copyright: (C) 2017 Philippe Mathieu-Daudé. GPLv2+. +// Confidence: High +// Options: --macro-file scripts/cocci-macro-file.h +// +// Nikunj A Dadhania optimization: +// http://lists.nongnu.org/archive/html/qemu-devel/2017-02/msg05211.html +// Aurelien Jarno optimization: +// http://lists.nongnu.org/archive/html/qemu-devel/2017-05/msg01466.html +// Coccinelle helpful issue: +// https://github.com/coccinelle/coccinelle/issues/86 + +@initialize:python@ +@@ +import sys +fd = sys.stderr +def debug(msg="", trailer="\n"): + fd.write("[DBG] " + msg + trailer) +def low_bits_count(value): + bits_count = 0 + while (value & (1 << bits_count)): + bits_count += 1 + return bits_count +def Mn(order): # Mersenne number + return (1 << order) - 1 + +@match@ // depends on never match_and_check_reg_used@ +metavariable ret, arg; +constant ofs, msk; +expression tcg_arg; +identifier tcg_func =~ "^tcg_gen_"; +position shr_p, and_p; +@@ +( + tcg_gen_shri_i32@shr_p +| + tcg_gen_shri_i64@shr_p +| + tcg_gen_shri_tl@shr_p +)(ret, arg, ofs); +<... +tcg_func(tcg_arg, ...); +...> +( + tcg_gen_andi_i32@and_p +| + tcg_gen_andi_i64@and_p +| + tcg_gen_andi_tl@and_p +)(ret, ret, msk); + +@script:python verify_len depends on match@ +ret_s << match.ret; +msk_s << match.msk; +shr_p << match.shr_p; +tcg_func << match.tcg_func; +tcg_arg << match.tcg_arg; +extract_len; +@@ +is_optimizable = False +debug("candidate at %s:%s" % (shr_p[0].file, shr_p[0].line)) +if tcg_arg == ret_s: + debug(" %s() modifies argument '%s'" % (tcg_func, ret_s)) +else: + debug("candidate at %s:%s" % (shr_p[0].file, shr_p[0].line)) + try: # only eval integer, no #define like 'SR_M' (cpp did this, else some headers are missing). + msk_v = long(msk_s.strip("UL"), 0) + msk_b = low_bits_count(msk_v) + if msk_b == 0: + debug(" value: 0x%x low_bits: %d" % (msk_v, msk_b)) + else: + debug(" value: 0x%x low_bits: %d [Mersenne prime: 0x%x]" % (msk_v, msk_b, Mn(msk_b))) + is_optimizable = Mn(msk_b) == msk_v # check low_bits + coccinelle.extract_len = "%d" % msk_b + debug(" candidate %s optimizable" % ("IS" if is_optimizable else "is NOT")) + except: + debug(" ERROR (check included headers?)") +cocci.include_match(is_optimizable) +debug() + +@replacement depends on verify_len@ +metavariable match.ret, match.arg; +constant match.ofs, match.msk; +position match.shr_p, match.and_p; +identifier verify_len.extract_len; +@@ +( +-tcg_gen_shri_i32@shr_p(ret, arg, ofs); ++tcg_gen_extract_i32(ret, arg, ofs, extract_len); +... +-tcg_gen_andi_i32@and_p(ret, ret, msk); +| +-tcg_gen_shri_i64@shr_p(ret, arg, ofs); ++tcg_gen_extract_i64(ret, arg, ofs, extract_len); +... +-tcg_gen_andi_i64@and_p(ret, ret, msk); +| +-tcg_gen_shri_tl@shr_p(ret, arg, ofs); ++tcg_gen_extract_tl(ret, arg, ofs, extract_len); +... +-tcg_gen_andi_tl@and_p(ret, ret, msk); +)