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: