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