diff options
author | Thiago Macieira <thiago.macieira@nokia.com> | 2011-03-18 14:00:58 (GMT) |
---|---|---|
committer | Thiago Macieira <thiago.macieira@nokia.com> | 2011-03-22 14:51:41 (GMT) |
commit | 5c948050da09120f8d4a1d90b069c2308949330d (patch) | |
tree | f56b24974a8b7333a5820cd24662664d43a233a2 | |
parent | f9370b13165a3919c1beafca5334284ccdd0526a (diff) | |
download | Qt-5c948050da09120f8d4a1d90b069c2308949330d.zip Qt-5c948050da09120f8d4a1d90b069c2308949330d.tar.gz Qt-5c948050da09120f8d4a1d90b069c2308949330d.tar.bz2 |
Add a script that generates a string table of 8-bits
-rwxr-xr-x | tests/benchmarks/corelib/tools/qstring/generatelist_char.pl | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/tests/benchmarks/corelib/tools/qstring/generatelist_char.pl b/tests/benchmarks/corelib/tools/qstring/generatelist_char.pl new file mode 100755 index 0000000..1c7003a --- /dev/null +++ b/tests/benchmarks/corelib/tools/qstring/generatelist_char.pl @@ -0,0 +1,203 @@ +#!/usr/bin/perl +# -*- mode: utf-8; tabs: nil -*- +## Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +## All rights reserved. +## Contact: Nokia Corporation (qt-info@nokia.com) +## +## This file is part of the QtCore module of the Qt Toolkit. +## +## $QT_BEGIN_LICENSE:LGPL$ +## No Commercial Usage +## This file contains pre-release code and may not be distributed. +## You may use this file in accordance with the terms and conditions +## contained in the Technology Preview License Agreement accompanying +## this package. +## +## GNU Lesser General Public License Usage +## Alternatively, this file may be used under the terms of the GNU Lesser +## General Public License version 2.1 as published by the Free Software +## Foundation and appearing in the file LICENSE.LGPL included in the +## packaging of this file. Please review the following information to +## ensure the GNU Lesser General Public License version 2.1 requirements +## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +## +## In addition, as a special exception, Nokia gives you certain additional +## rights. These rights are described in the Nokia Qt LGPL Exception +## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +## +## If you have questions regarding the use of this file, please contact +## Nokia at qt-info@nokia.com. +## +## +## +## +## +## +## +## +## $QT_END_LICENSE$ +# +# Parses a file (passed as argument) that contains a dump of pairs of +# strings and generates C source code including said data. +# +# The format of the file is: +# LEN = <len> <keyword> <align1> <align2>\n<data1><data2>\n +# where: +# LEN the literal string "LEN" +# <len> the length of the data, in 16-bit words +# <keyword> the literal string "SAME" or "DIFF" +# <align1> the alignment or pointer value of the first data +# <align2> the alignment or pointer value of the second data +# <data1> the first data +# <data2> the second data +# \n newline +# +# The code to write this data would be: +# fprintf(out, "LEN = %d %s %d %d\n", len, +# (p1 == p2) ? "SAME" : "DIFF", +# uint(quintptr(p1)) & 0xfff, uint(quintptr(p2)) & 0xfff); +# fwrite(p1, 2, len, out); +# fwrite(p2, 2, len, out); +# fwrite("\n", 1, 1, out); + +sub printCharArray($$$) { + $str = $_[0]; + $align = $_[1] & 0x3f; + $offset = $_[2]; + + $headpadding = $align & 0xf; + $tailpadding = 16 - (($len + $headpadding) & 0xf); + $multiplecachelines = ($align + $len) > 0x40; + + if ($multiplecachelines) { + # if this string crosses into a new cacheline, then + # replicate the result + $headpadding |= ($offset & ~0x3f); + $headpadding += 0x40 + if ($headpadding < $offset); + $headpadding -= $offset; + ++$cachelinecrosses; + } + + if ($headpadding > 0) { + print " \""; + for $i (1..$headpadding) { + printf "\\%o", 256-$i; + } + print "\"\n"; + } + + print " \""; + for ($i = 0; $i < $len; $i++) { + $c = substr($str, $i, 1); + if (ord($c) >= 0x20 && ord($c) <= 0x7f) { + print $c; + } else { + printf "\\%o\"\"", ord($c); + } + } + + if ($tailpadding > 0) { + print "\"\n \""; + for $i (1..$tailpadding) { + printf "\\%o", 256-$i; + } + } + print "\" // ", $offset + $headpadding + $len + $tailpadding; + print "+" if $multiplecachelines; + print "\n"; + + return ($offset + $headpadding, $offset + $headpadding + $len + $tailpadding); +} + +print "// This is a generated file - DO NOT EDIT\n\n"; + +print "#include \"data.h\"\n\n"; + +$varname = shift @ARGV; +print "const char " . $varname . "Data[] __attribute__((aligned(64))) = {\n"; +$count = 0; +$offset = 0; +$totalsize = 0; +$maxlen = 0; +$cachelinecrosses = 0; + +open IN, "<" . $ARGV[0]; +while (1) { + $line = readline(*IN); + last unless defined($line); + $line =~ /LEN = (\d+) (\w+) (\d+) (\d+)/; + $len = $1; + $data[$count]->{len} = $len; + $sameptr = $2; + $data[$count]->{align1} = $3 - 0; + $data[$count]->{align2} = $4 - 0; + + # statistics + $alignhistogram{$3 & 0xf}++; + $alignhistogram{$4 & 0xf}++; + $samealignments{$3 & 0xf}++ if ($3 & 0xf) == ($4 & 0xf); + + read IN, $a, $len; + read IN, $b, $len; + + <IN>; # Eat the newline + + if ($len == 0) { + $data[$count]->{offset1} = $offset; + $data[$count]->{offset2} = $data[$count]->{offset1}; + ++$data[$count]->{offset2} if ($sameptr eq "DIFF"); + } else { + print " // #$count\n"; + ($data[$count]->{offset1}, $offset) = + printCharArray($a, $data[$count]->{align1}, $offset); + die if ($offset & 0xf) != 0; + + if ($sameptr eq "DIFF") { + ($data[$count]->{offset2}, $offset) = + printCharArray($b, $data[$count]->{align2}, $offset); + } else { + $data[$count]->{offset2} = $data[$count]->{offset1}; + } + print "\n"; + } + ++$count; + + $totalsize += $len; + $maxlen = $len if $len > $maxlen; +} +print "};\n"; +close IN; + +print "const struct StringCollection " . $varname . "[] = {\n"; +for $i (0..$count-1) { + print " {", + $data[$i]->{len}, ", ", + $data[$i]->{offset1}, ", ", + $data[$i]->{offset2}, ", ", + $data[$i]->{align1}, ", ", + $data[$i]->{align2}, + "}, // #$i\n"; + next if $data[$i]->{len} == 0; + die if (($data[$i]->{offset1} & 0xf) != ($data[$i]->{align1} & 0xf)); + die if (($data[$i]->{offset2} & 0xf) != ($data[$i]->{align2} & 0xf)); +} +print "};\n"; + +print "const int " . $varname . "Count = $count;\n"; +print "const int " . $varname . "MaxLen = $maxlen;\n"; +printf "// average comparison length: %.4f\n", ($totalsize * 1.0 / $count); +printf "// cache-line crosses: %d (%.1f%%)\n", + $cachelinecrosses, ($cachelinecrosses * 100.0 / $count / 2); + +print "// alignment histogram:\n"; +for $key (sort { $a <=> $b } keys(%alignhistogram)) { + $value = $alignhistogram{$key}; + $samealigned = $samealignments{$key}; + printf "// 0xXXX%x = %d (%.1f%%) strings, %d (%.1f%%) of which same-aligned\n", + $key, $value, $value * 100.0 / ($count*2), + $samealigned, $samealigned * 100.0 / $value; + $samealignedtotal += $samealigned; +} +printf "// total = %d (100%) strings, %d (%.1f%%) of which same-aligned\n", + $count * 2, $samealignedtotal, $samealignedtotal * 100 / $count / 2; |