Home | History | Annotate | Line # | Download | only in x86
      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