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 48use strict; 49use File::Find; 50use File::Basename; 51use Getopt::Std; 52 53my %opt; 54getopts('t', \%opt); 55 56 57my $srcdir; 58open IN, '<Makefile' or die; 59while (<IN>) { 60 if (/^srcdir[ \t]*=[ \t]*(.*)/) { 61 $srcdir = $1; 62 last; 63 } 64} 65close IN or die; 66defined $srcdir or die "Cannot find \$srcdir in Makefile\n"; 67 68my $filecount = 0; 69 70my $tempfile = 't-zdisp2.tmp'; 71open KARA, ">$tempfile" or die; 72close KARA or die; 73 74find({ wanted => \&process, preprocess => \&process_mparam, no_chdir => 1 }, 75 "$srcdir/x86"); 76 77sub 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. 87sub 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 106sub 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 140unlink($tempfile); 141print "total $filecount processed\n"; 142exit 0; 143 144 145# Local variables: 146# perl-indent-level: 2 147# End: 148