github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/mpn/x86/t-zdisp2.pl (about)

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