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

数学计算

开发平台:

Unix_Linux

  1. #!/usr/bin/perl -w
  2. # Copyright 2000, 2001, 2003, 2004, 2005 Free Software Foundation, Inc.
  3. #
  4. # This file is part of the GNU MP Library.
  5. #
  6. # The GNU MP Library is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU Lesser General Public License as published
  8. # by the Free Software Foundation; either version 3 of the License, or (at
  9. # your option) any later version.
  10. #
  11. # The GNU MP Library is distributed in the hope that it will be useful, but
  12. # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  13. # or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
  14. # License for more details.
  15. #
  16. # You should have received a copy of the GNU Lesser General Public License
  17. # along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
  18. # Usage: slot.pl [filename.o]...
  19. #
  20. # Run "objdump" to produce a disassembly of the given object file(s) and
  21. # annotate the output with "U" or "L" slotting which Alpha EV6 will use.
  22. #
  23. # When an instruction is E (ie. either U or L), an "eU" or "eL" is shown, as
  24. # a reminder that it wasn't a fixed requirement that gave the U or L, but
  25. # the octaword slotting rules.
  26. #
  27. # If an instruction is not recognised, that octaword does not get any U/L
  28. # shown, only lower-case "u", "l" or "e" for the instructions which are
  29. # known.  Add any unknown instructions to %optable below.
  30. use strict;
  31. # The U or L which various instructions demand, or E if either.
  32. #
  33. my %optable =
  34.   (
  35.    'addq'   => 'E',
  36.    'and'    => 'E',
  37.    'beq'    => 'U',
  38.    'bge'    => 'U',
  39.    'bgt'    => 'U',
  40.    'blt'    => 'U',
  41.    'bne'    => 'U',
  42.    'br'     => 'L',
  43.    'clr'    => 'E',
  44.    'cmpule' => 'E',
  45.    'cmpult' => 'E',
  46.    'cmpeq'  => 'E',
  47.    'cmoveq' => 'E',
  48.    'cmovne' => 'E',
  49.    'ctpop'  => 'U',
  50.    'ctlz'   => 'U',
  51.    'cttz'   => 'U',
  52.    'extbl'  => 'U',
  53.    'extlh'  => 'U',
  54.    'extll'  => 'U',
  55.    'extqh'  => 'U',
  56.    'extql'  => 'U',
  57.    'extwh'  => 'U',
  58.    'extwl'  => 'U',
  59.    'jsr'    => 'L',
  60.    'lda'    => 'E',
  61.    'ldah'   => 'E',
  62.    'ldbu'   => 'L',
  63.    'ldl'    => 'L',
  64.    'ldq'    => 'L',
  65.    'ldt'    => 'L',
  66.    'ret'    => 'L',
  67.    'mov'    => 'E',
  68.    'mulq'   => 'U',
  69.    'negq'   => 'E',
  70.    'nop'    => 'E',
  71.    'not'    => 'E',
  72.    's8addq' => 'E',
  73.    's8subq' => 'E',
  74.    # 'sextb'  => ?
  75.    # 'sextl'  => ?
  76.    'sll'    => 'U',
  77.    'srl'    => 'U',
  78.    'stq'    => 'L',
  79.    'subq'   => 'E',
  80.    'umulh'  => 'U',
  81.    'unop'   => 'E',
  82.    'xor'    => 'E',
  83.   );
  84. # Slottings used for a given pattern of U/L/E in an octaword.  This is as
  85. # per the "Ebox Slotting" section of the EV6 hardware reference manual.
  86. #
  87. my %slottable =
  88.   (
  89.    'EEEE' => 'ULUL',
  90.    'EEEL' => 'ULUL',
  91.    'EEEU' => 'ULLU',
  92.    'EELE' => 'ULLU',
  93.    'EELL' => 'UULL',
  94.    'EELU' => 'ULLU',
  95.    'EEUE' => 'ULUL',
  96.    'EEUL' => 'ULUL',
  97.    'EEUU' => 'LLUU',
  98.    'ELEE' => 'ULUL',
  99.    'ELEL' => 'ULUL',
  100.    'ELEU' => 'ULLU',
  101.    'ELLE' => 'ULLU',
  102.    'ELLL' => 'ULLL',
  103.    'ELLU' => 'ULLU',
  104.    'ELUE' => 'ULUL',
  105.    'ELUL' => 'ULUL',
  106.    'LLLL' => 'LLLL',
  107.    'LLLU' => 'LLLU',
  108.    'LLUE' => 'LLUU',
  109.    'LLUL' => 'LLUL',
  110.    'LLUU' => 'LLUU',
  111.    'LUEE' => 'LULU',
  112.    'LUEL' => 'LUUL',
  113.    'LUEU' => 'LULU',
  114.    'LULE' => 'LULU',
  115.    'LULL' => 'LULL',
  116.    'LULU' => 'LULU',
  117.    'LUUE' => 'LUUL',
  118.    'LUUL' => 'LUUL',
  119.    'LUUU' => 'LUUU',
  120.    'UEEE' => 'ULUL',
  121.    'UEEL' => 'ULUL',
  122.    'UEEU' => 'ULLU',
  123.    'ELUU' => 'LLUU',
  124.    'EUEE' => 'LULU',
  125.    'EUEL' => 'LUUL',
  126.    'EUEU' => 'LULU',
  127.    'EULE' => 'LULU',
  128.    'EULL' => 'UULL',
  129.    'EULU' => 'LULU',
  130.    'EUUE' => 'LUUL',
  131.    'EUUL' => 'LUUL',
  132.    'EUUU' => 'LUUU',
  133.    'LEEE' => 'LULU',
  134.    'LEEL' => 'LUUL',
  135.    'LEEU' => 'LULU',
  136.    'LELE' => 'LULU',
  137.    'LELL' => 'LULL',
  138.    'LELU' => 'LULU',
  139.    'LEUE' => 'LUUL',
  140.    'LEUL' => 'LUUL',
  141.    'LEUU' => 'LLUU',
  142.    'LLEE' => 'LLUU',
  143.    'LLEL' => 'LLUL',
  144.    'LLEU' => 'LLUU',
  145.    'LLLE' => 'LLLU',
  146.    'UELE' => 'ULLU',
  147.    'UELL' => 'UULL',
  148.    'UELU' => 'ULLU',
  149.    'UEUE' => 'ULUL',
  150.    'UEUL' => 'ULUL',
  151.    'UEUU' => 'ULUU',
  152.    'ULEE' => 'ULUL',
  153.    'ULEL' => 'ULUL',
  154.    'ULEU' => 'ULLU',
  155.    'ULLE' => 'ULLU',
  156.    'ULLL' => 'ULLL',
  157.    'ULLU' => 'ULLU',
  158.    'ULUE' => 'ULUL',
  159.    'ULUL' => 'ULUL',
  160.    'ULUU' => 'ULUU',
  161.    'UUEE' => 'UULL',
  162.    'UUEL' => 'UULL',
  163.    'UUEU' => 'UULU',
  164.    'UULE' => 'UULL',
  165.    'UULL' => 'UULL',
  166.    'UULU' => 'UULU',
  167.    'UUUE' => 'UUUL',
  168.    'UUUL' => 'UUUL',
  169.    'UUUU' => 'UUUU',
  170.   );
  171. # Check all combinations of U/L/E are present in %slottable.
  172. sub coverage {
  173.   foreach my $a ('U', 'L', 'E') {
  174.     foreach my $b ('U', 'L', 'E') {
  175.       foreach my $c ('U', 'L', 'E') {
  176.         foreach my $d ('U', 'L', 'E') {
  177.           my $x = $a . $b . $c . $d;
  178.           if (! defined $slottable{$x}) {
  179.             print "slottable missing: $xn"
  180.           }
  181.         }
  182.       }
  183.     }
  184.   }
  185. }
  186. # Certain consistency checks for %slottable.
  187. sub check {
  188.   foreach my $x (keys %slottable) {
  189.     my $a = substr($x,0,1);
  190.     my $b = substr($x,1,1);
  191.     my $c = substr($x,2,1);
  192.     my $d = substr($x,3,1);
  193.     my $es = ($a eq 'E') + ($b eq 'E') + ($c eq 'E') + ($d eq 'E');
  194.     my $ls = ($a eq 'L') + ($b eq 'L') + ($c eq 'L') + ($d eq 'L');
  195.     my $us = ($a eq 'U') + ($b eq 'U') + ($c eq 'U') + ($d eq 'U');
  196.     my $got = $slottable{$x};
  197.     my $want = $x;
  198.     if ($es == 0) {
  199.     } elsif ($es == 1) {
  200.       # when only one E, it's mapped to whichever of U or L is otherwise
  201.       # used the least
  202.       if ($ls > $us) {
  203.         $want =~ s/E/U/;
  204.       } else {
  205.         $want =~ s/E/L/;
  206.       }
  207.     } elsif ($es == 2) {
  208.       # when two E's and two U, then the E's map to L; vice versa for two E
  209.       # and two L
  210.       if ($ls == 2) {
  211.         $want =~ s/E/U/g;
  212.       } elsif ($us == 2) {
  213.         $want =~ s/E/L/g;
  214.       } else {
  215.         next;
  216.       }
  217.     } elsif ($es == 3) {
  218.       next;
  219.     } else { # $es == 4
  220.       next;
  221.     }
  222.     if ($want ne $got) {
  223.       print "slottable $x want $want got $gotn";
  224.     }
  225.   }
  226. }
  227. sub disassemble {
  228.   my ($file) = @_;
  229.   open (IN, "objdump -Srfh $file |") || die "Cannot open pipe from objdumpn";
  230.   my (%pre, %post, %type);
  231.   while (<IN>) {
  232.     my $line = $_ . "";
  233.     if ($line =~ /(^[ t]*[0-9a-f]*([0-9a-f]):[ t]*[0-9a-f][0-9a-f] [0-9a-f][0-9a-f] [0-9a-f][0-9a-f] [0-9a-f][0-9a-f] )t(([a-z0-9]+).*)/) {
  234.       my ($this_pre, $addr, $this_post, $opcode) = ($1, $2, $3, $4);
  235.       my $this_type = $optable{$opcode};
  236.       if (! defined ($this_type)) { $this_type = ' '; }
  237.       $pre{$addr} = $this_pre;
  238.       $post{$addr} = $this_post;
  239.       $type{$addr} = $this_type;
  240.       if ($addr eq 'c') {
  241.         my %slot = ('0'=>' ', '4'=>' ', '8'=>' ', 'c'=>' ');
  242.         my $str = $type{'c'} . $type{'8'} . $type{'4'} . $type{'0'};
  243.         $str = $slottable{$str};
  244.         if (defined $str) {
  245.           $slot{'c'} = substr($str,0,1);
  246.           $slot{'8'} = substr($str,1,1);
  247.           $slot{'4'} = substr($str,2,1);
  248.           $slot{'0'} = substr($str,3,1);
  249.         }
  250.         foreach my $i ('0', '4', '8', 'c') {
  251.           if ($slot{$i} eq $type{$i}) { $type{$i} = ' '; }
  252.           print $pre{$i}, ' ', lc($type{$i}),$slot{$i}, '  ', $post{$i}, "n";
  253.         }
  254.         %pre = ();
  255.         %type = ();
  256.         %post = ();
  257.       }
  258.     }
  259.   }
  260.   close IN || die "Error from objdump (or objdump not available)n";
  261. }
  262. coverage();
  263. check();
  264. my @files;
  265. if ($#ARGV >= 0) {
  266.   @files = @ARGV;
  267. } else {
  268.   die
  269. }
  270. foreach (@files)  {
  271.     disassemble($_);
  272. }