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