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