xref: /netbsd-src/external/lgpl3/gmp/dist/mpn/x86/t-zdisp2.pl (revision 1580a27b92f58fcdcb23fdfbc04a7c2b54a0b7c8)
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