[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH v3 1/5] coccinelle: add a script to optimize tcg
From: |
Philippe Mathieu-Daudé |
Subject: |
[Qemu-devel] [RFC PATCH v3 1/5] coccinelle: add a script to optimize tcg op using tcg_gen_extract() |
Date: |
Fri, 12 May 2017 00:35:39 -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 | 71 ++++++++++++++++++++++++++++++++
1 file changed, 71 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..4823073005
--- /dev/null
+++ b/scripts/coccinelle/tcg_gen_extract.cocci
@@ -0,0 +1,71 @@
+// 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@ // match shri*+andi* pattern, calls script verify_len
+identifier ret, arg;
+constant ofs, len;
+identifier shr_fn =~ "^tcg_gen_shri_";
+identifier and_fn =~ "^tcg_gen_andi_";
+position shr_p;
+position and_p;
+@@
+(
address@hidden(ret, arg, ofs);
address@hidden(ret, ret, len);
+)
+
address@hidden:python verify_len@
+ret_s << match.ret;
+len_s << match.len;
+shr_s << match.shr_fn;
+and_s << match.and_fn;
+shr_p << match.shr_p;
+extract_fn;
+@@
+print "candidate at %s:%s" % (shr_p[0].file, shr_p[0].line)
+len_fn=len("tcg_gen_shri_")
+shr_sz=shr_s[len_fn:]
+and_sz=and_s[len_fn:]
+# TODO: op_size shr<and allowed?
+is_same_op_size = shr_sz == and_sz
+print " op_size: %s/%s (%s)" % (shr_sz, and_sz, "same" if is_same_op_size
else "DIFFERENT")
+is_optimizable = False
+if is_same_op_size:
+ try: # only eval integer, no #define like 'SR_M' (cpp did this, else some
headers are missing).
+ len_v = long(len_s.strip("UL"), 0)
+ low_bits = 0
+ while (len_v & (1 << low_bits)):
+ low_bits += 1
+ print " low_bits:", low_bits, "(value: 0x%x)" % ((1 << low_bits) - 1)
+ print " len: 0x%x" % len_v
+ is_optimizable = ((1 << low_bits) - 1) == len_v # check low_bits
+ print " len_bits %s= low_bits" % ("=" if is_optimizable else "!")
+ print " candidate", "IS" if is_optimizable else "is NOT",
"optimizable"
+ coccinelle.extract_fn = "tcg_gen_extract_" + and_sz
+ except:
+ print " ERROR (check included headers?)"
+ cocci.include_match(is_optimizable)
+print
+
address@hidden depends on verify_len@
+identifier match.ret, match.arg;
+constant match.ofs, match.len;
+identifier match.shr_fn;
+identifier match.and_fn;
+position match.shr_p;
+position match.and_p;
+identifier verify_len.extract_fn;
+@@
address@hidden(ret, arg, ofs);
address@hidden(ret, ret, len);
++extract_fn(ret, arg, ofs, len);
--
2.11.0
[Qemu-devel] [PATCH v3 2/5] target/arm: optimize rev16() using extract op, Philippe Mathieu-Daudé, 2017/05/11