[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v4 1/6] coccinelle: add a script to optimize tcg
From: |
Philippe Mathieu-Daudé |
Subject: |
[Qemu-devel] [RFC PATCH v4 1/6] coccinelle: add a script to optimize tcg op using tcg_gen_extract() |
Date: |
Fri, 12 May 2017 20:38:38 -0300 |
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é <address@hidden>
---
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
+
address@hidden: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
+
address@hidden@ // 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;
+@@
+(
+ address@hidden
+|
+ address@hidden
+|
+ address@hidden
+)(ret, arg, ofs);
+<...
+tcg_func(tcg_arg, ...);
+...>
+(
+ address@hidden
+|
+ address@hidden
+|
+ address@hidden
+)(ret, ret, msk);
+
address@hidden: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()
+
address@hidden 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;
+@@
+(
address@hidden(ret, arg, ofs);
++tcg_gen_extract_i32(ret, arg, ofs, extract_len);
+...
address@hidden(ret, ret, msk);
+|
address@hidden(ret, arg, ofs);
++tcg_gen_extract_i64(ret, arg, ofs, extract_len);
+...
address@hidden(ret, ret, msk);
+|
address@hidden(ret, arg, ofs);
++tcg_gen_extract_tl(ret, arg, ofs, extract_len);
+...
address@hidden(ret, ret, msk);
+)
--
2.11.0
- [Qemu-devel] [RFC PATCH v4 0/6] optimize various tcg_gen() functions using extract op, Philippe Mathieu-Daudé, 2017/05/12
- [Qemu-devel] [RFC PATCH v4 1/6] coccinelle: add a script to optimize tcg op using tcg_gen_extract(),
Philippe Mathieu-Daudé <=
- [Qemu-devel] [PATCH v4 2/6] target/alpha: optimize cvtlq() using extract op, Philippe Mathieu-Daudé, 2017/05/12
- [Qemu-devel] [PATCH v4 3/6] target/arm: optimize rev16() using extract op, Philippe Mathieu-Daudé, 2017/05/12
- [Qemu-devel] [PATCH v4 4/6] target/m68k: optimize bcd_flags() using extract op, Philippe Mathieu-Daudé, 2017/05/12
- [Qemu-devel] [PATCH v4 5/6] target/ppc: optimize various functions using extract op, Philippe Mathieu-Daudé, 2017/05/12