t-zdisp2.pl revision 1.1.1.2 1 1.1 mrg #!/usr/bin/perl -w
2 1.1 mrg #
3 1.1 mrg # Copyright 2001, 2002 Free Software Foundation, Inc.
4 1.1 mrg #
5 1.1.1.2 mrg # This file is part of the GNU MP Library.
6 1.1 mrg #
7 1.1.1.2 mrg # The GNU MP Library is free software; you can redistribute it and/or modify
8 1.1.1.2 mrg # it under the terms of either:
9 1.1 mrg #
10 1.1.1.2 mrg # * the GNU Lesser General Public License as published by the Free
11 1.1.1.2 mrg # Software Foundation; either version 3 of the License, or (at your
12 1.1.1.2 mrg # option) any later version.
13 1.1.1.2 mrg #
14 1.1.1.2 mrg # or
15 1.1.1.2 mrg #
16 1.1.1.2 mrg # * the GNU General Public License as published by the Free Software
17 1.1.1.2 mrg # Foundation; either version 2 of the License, or (at your option) any
18 1.1.1.2 mrg # later version.
19 1.1.1.2 mrg #
20 1.1.1.2 mrg # or both in parallel, as here.
21 1.1.1.2 mrg #
22 1.1.1.2 mrg # The GNU MP Library is distributed in the hope that it will be useful, but
23 1.1.1.2 mrg # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24 1.1.1.2 mrg # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 1.1.1.2 mrg # for more details.
26 1.1.1.2 mrg #
27 1.1.1.2 mrg # You should have received copies of the GNU General Public License and the
28 1.1.1.2 mrg # GNU Lesser General Public License along with the GNU MP Library. If not,
29 1.1.1.2 mrg # see https://www.gnu.org/licenses/.
30 1.1 mrg
31 1.1 mrg
32 1.1 mrg # Usage: cd $(builddir)/mpn
33 1.1 mrg # $(srcdir)/x86/t-zdisp2.pl
34 1.1 mrg #
35 1.1 mrg # Grep for any "0(reg...)" addressing modes coming out of the x86 .asm
36 1.1 mrg # files. Additive expressions like "12+4-16" are recognised too.
37 1.1 mrg #
38 1.1 mrg # Old gas doesn't preserve the "0" displacement, so if it's wanted then
39 1.1 mrg # Zdisp ought to be used to give explicit .byte sequences. See
40 1.1 mrg # mpn/x86/README.
41 1.1 mrg #
42 1.1 mrg # No output means everything is ok. All the asm files are put through m4 in
43 1.1 mrg # PIC and non-PIC modes, and in each multi-function form, all of which can
44 1.1 mrg # take a while to run.
45 1.1 mrg #
46 1.1 mrg # This program is only meant for use during development.
47 1.1 mrg
48 1.1 mrg use strict;
49 1.1 mrg use File::Find;
50 1.1 mrg use File::Basename;
51 1.1 mrg use Getopt::Std;
52 1.1 mrg
53 1.1 mrg my %opt;
54 1.1 mrg getopts('t', \%opt);
55 1.1 mrg
56 1.1 mrg
57 1.1 mrg my $srcdir;
58 1.1 mrg open IN, '<Makefile' or die;
59 1.1 mrg while (<IN>) {
60 1.1 mrg if (/^srcdir[ \t]*=[ \t]*(.*)/) {
61 1.1 mrg $srcdir = $1;
62 1.1 mrg last;
63 1.1 mrg }
64 1.1 mrg }
65 1.1 mrg close IN or die;
66 1.1 mrg defined $srcdir or die "Cannot find \$srcdir in Makefile\n";
67 1.1 mrg
68 1.1 mrg my $filecount = 0;
69 1.1 mrg
70 1.1 mrg my $tempfile = 't-zdisp2.tmp';
71 1.1 mrg open KARA, ">$tempfile" or die;
72 1.1 mrg close KARA or die;
73 1.1 mrg
74 1.1 mrg find({ wanted => \&process, preprocess => \&process_mparam, no_chdir => 1 },
75 1.1 mrg "$srcdir/x86");
76 1.1 mrg
77 1.1 mrg sub process {
78 1.1 mrg if (/gmp-mparam.h$/) {
79 1.1 mrg process_mparam($_);
80 1.1 mrg } elsif (/\.asm$/) {
81 1.1 mrg process_asm($_);
82 1.1 mrg }
83 1.1 mrg }
84 1.1 mrg
85 1.1 mrg # Ensure we're using the right SQR_TOOM2_THRESHOLD for the part of the
86 1.1 mrg # tree being processed.
87 1.1 mrg sub process_mparam {
88 1.1 mrg my $file = "$File::Find::dir/gmp-mparam.h";
89 1.1 mrg if (-f $file) {
90 1.1 mrg print "$file\n" if $opt{'t'};
91 1.1 mrg open MPARAM, "<$file" or die;
92 1.1 mrg while (<MPARAM>) {
93 1.1 mrg if (/^#define SQR_TOOM2_THRESHOLD[ \t]*([0-9][0-9]*)/) {
94 1.1 mrg open KARA, ">$tempfile" or die;
95 1.1 mrg print KARA "define(\`SQR_TOOM2_THRESHOLD',$1)\n\n";
96 1.1 mrg print "define(\`SQR_TOOM2_THRESHOLD',$1)\n" if $opt{'t'};
97 1.1 mrg close KARA or die;
98 1.1 mrg last;
99 1.1 mrg }
100 1.1 mrg }
101 1.1 mrg close MPARAM or die;
102 1.1 mrg }
103 1.1 mrg return @_;
104 1.1 mrg }
105 1.1 mrg
106 1.1 mrg sub process_asm {
107 1.1 mrg my ($file) = @_;
108 1.1 mrg my $base = basename ($file, '.asm');
109 1.1 mrg
110 1.1 mrg my @funs;
111 1.1 mrg if ($base eq 'aors_n') { @funs = qw(add_n sub_n); }
112 1.1 mrg elsif ($base eq 'aorsmul_1') { @funs = qw(addmul_1 submul_1); }
113 1.1 mrg elsif ($base eq 'popham') { @funs = qw(popcount hamdist); }
114 1.1 mrg elsif ($base eq 'logops_n') { @funs = qw(and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n); }
115 1.1 mrg elsif ($base eq 'lorrshift') { @funs = qw(lshift rshift); }
116 1.1 mrg else { @funs = ($base); }
117 1.1 mrg
118 1.1 mrg foreach my $fun (@funs) {
119 1.1 mrg foreach my $pic ('', ' -DPIC') {
120 1.1 mrg my $header = "$file: 0: $pic\n";
121 1.1 mrg $filecount++;
122 1.1 mrg
123 1.1 mrg my $m4 = "m4 -DHAVE_HOST_CPU_athlon -DOPERATION_$fun $pic ../config.m4 $tempfile $file";
124 1.1 mrg print "$m4\n" if $opt{'t'};
125 1.1 mrg
126 1.1 mrg open IN, "$m4 |" or die;
127 1.1 mrg while (<IN>) {
128 1.1 mrg next unless /([0-9+-][0-9 \t+-]*)\(%/;
129 1.1 mrg my $pat=$1;
130 1.1 mrg $pat = eval($pat);
131 1.1 mrg next if ($pat != 0);
132 1.1 mrg print "$header$_";
133 1.1 mrg $header='';
134 1.1 mrg }
135 1.1 mrg close IN or die;
136 1.1 mrg }
137 1.1 mrg }
138 1.1 mrg }
139 1.1 mrg
140 1.1 mrg unlink($tempfile);
141 1.1 mrg print "total $filecount processed\n";
142 1.1 mrg exit 0;
143 1.1 mrg
144 1.1 mrg
145 1.1 mrg # Local variables:
146 1.1 mrg # perl-indent-level: 2
147 1.1 mrg # End:
148