t-zdisp2.pl
上传用户:qaz666999
上传日期:2022-08-06
资源大小:2570k
文件大小:4k
源码类别:

数学计算

开发平台:

Unix_Linux

  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 3 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.  If not, see http://www.gnu.org/licenses/.
  19. # Usage: cd $(builddir)/mpn
  20. #        $(srcdir)/x86/t-zdisp2.pl
  21. #
  22. # Grep for any "0(reg...)" addressing modes coming out of the x86 .asm
  23. # files.  Additive expressions like "12+4-16" are recognised too.
  24. #
  25. # Old gas doesn't preserve the "0" displacement, so if it's wanted then
  26. # Zdisp ought to be used to give explicit .byte sequences.  See
  27. # mpn/x86/README.
  28. #
  29. # No output means everything is ok.  All the asm files are put through m4 in
  30. # PIC and non-PIC modes, and in each multi-function form, all of which can
  31. # take a while to run.
  32. #
  33. # This program is only meant for use during development.
  34. use strict;
  35. use File::Find;
  36. use File::Basename;
  37. use Getopt::Std;
  38. my %opt;
  39. getopts('t', %opt);
  40. my $srcdir;
  41. open IN, '<Makefile' or die;
  42. while (<IN>) {
  43.   if (/^srcdir[ t]*=[ t]*(.*)/) {
  44.     $srcdir = $1;
  45.     last;
  46.   }
  47. }
  48. close IN or die;
  49. defined $srcdir or die "Cannot find $srcdir in Makefilen";
  50. my $filecount = 0;
  51. my $tempfile = 't-zdisp2.tmp';
  52. open KARA, ">$tempfile" or die;
  53. close KARA or die;
  54. find({ wanted => &process, preprocess => &process_mparam, no_chdir => 1 },
  55.      "$srcdir/x86");
  56. sub process {
  57.   if (/gmp-mparam.h$/) {
  58.     process_mparam($_);
  59.   } elsif (/.asm$/) {
  60.     process_asm($_);
  61.   }
  62. }
  63. # Ensure we're using the right SQR_TOOM2_THRESHOLD for the part of the
  64. # tree being processed.
  65. sub process_mparam {
  66.   my $file = "$File::Find::dir/gmp-mparam.h";
  67.   if (-f $file) {
  68.     print "$filen" if $opt{'t'};
  69.     open MPARAM, "<$file" or die;
  70.     while (<MPARAM>) {
  71.       if (/^#define SQR_TOOM2_THRESHOLD[ t]*([0-9][0-9]*)/) {
  72.         open KARA, ">$tempfile" or die;
  73.         print KARA "define(`SQR_TOOM2_THRESHOLD',$1)nn";
  74.         print "define(`SQR_TOOM2_THRESHOLD',$1)n" if $opt{'t'};
  75.         close KARA or die;
  76.         last;
  77.       }
  78.     }
  79.     close MPARAM or die;
  80.   }
  81.   return @_;
  82. }
  83. sub process_asm {
  84.   my ($file) = @_;
  85.   my $base = basename ($file, '.asm');
  86.   my @funs;
  87.   if    ($base eq 'aors_n')    { @funs = qw(add_n sub_n); }
  88.   elsif ($base eq 'aorsmul_1') { @funs = qw(addmul_1 submul_1); }
  89.   elsif ($base eq 'popham')    { @funs = qw(popcount hamdist); }
  90.   elsif ($base eq 'logops_n')  { @funs = qw(and_n andn_n nand_n ior_n iorn_n nior_n xor_n xnor_n); }
  91.   elsif ($base eq 'lorrshift') { @funs = qw(lshift rshift); }
  92.   else                         { @funs = ($base); }
  93.   foreach my $fun (@funs) {
  94.     foreach my $pic ('', ' -DPIC') {
  95.       my $header = "$file: 0: $picn";
  96.       $filecount++;
  97.       my $m4 = "m4 -DHAVE_HOST_CPU_athlon -DOPERATION_$fun $pic ../config.m4 $tempfile $file";
  98.       print "$m4n" if $opt{'t'};
  99.       open IN, "$m4 |" or die;
  100.       while (<IN>) {
  101.         next unless /([0-9+-][0-9 t+-]*)(%/;
  102.         my $pat=$1;
  103.         $pat = eval($pat);
  104.         next if ($pat != 0);
  105.         print "$header$_";
  106.         $header='';
  107.       }
  108.       close IN or die;
  109.     }
  110.   }
  111. }
  112. unlink($tempfile);
  113. print "total $filecount processedn";
  114. exit 0;
  115. # Local variables:
  116. # perl-indent-level: 2
  117. # End: