1
0
Files
irix-657m-src/irix/cmd/stress/IP28debug/t5spec
2022-09-29 17:59:04 +03:00

119 lines
2.3 KiB
Perl
Executable File

#!/usr/sbin/perl
$curfunc = ""; # name of current function
$pc = "";
$storeok = 0; # we've seen a cache instruction in this basic block
$BDLstoreok = 0; # Branch delay slot of previous basic block
$curblock = 0; # Current basic block
$blocks = 0; # how many basic blocks
# cache speculative execution barrier instructions
@cachekeys = qw(
cache
dmfc0
dmtc0
mfc0
mtc0
c0
);
@cache{@cachekeys} = (1) x @cachekeys;
# branch instructions
@branchkeys = qw(
b
j
jal
jalr
jr
beq
bgez
bgtz
blez
bltz
bne
bltzal
bgezal
bgtzal
blezal
);
@branch{@branchkeys} = (1) x @branchkeys;
# store instructions
@storekeys = qw(
sb
sc
scd
sd
sdl
sdr
sh
sw
swl
swr
);
@store{@storekeys} = (1) x @storekeys;
open(BRANCHTARG, "branchtarg") or die "Can't open branchtarg file\n";
while (<BRANCHTARG>) {
($block{$blocks} = $_) =~ s/^(.*)\n/$1/;
$blocks++;
}
while (<>) {
if (/^[_a-zA-Z][_a-zA-Z0-9]*:$/) {
($curfunc = $_) =~ s/:\n//;
$storeok = 0;
$BDLstoreok = 0;
next;
}
if ($curfunc eq "") {
# Still reading initial disassembly header
next;
}
if (($instr = $_) !~ s/^.* ([_a-z0-9]*)\t.*\n/$1/) {
if ($instr !~ s/^.* ([_a-z0-9]*)\n/$1/) {
print "$ARGV, $., $curfunc: warning: unknown line format:\n";
print ">> $_";
next;
}
}
if (($pc = $_) !~ s/^.*(0x[0-9a-f]*):.*\n/$1/) {
print "$curfunc: warning: could not extract pc:\n";
next;
}
if ($pc eq $block{$curblock}) {
# We have reached a new basic block
$storeok = 0;
$BDLstoreok = 0;
$curblock++;
}
if (exists $cache{$instr}) {
$storeok = 1;
next;
}
if (exists $store{$instr} && !($storeok || $BDLstoreok)
&& !(/,-?[0-9]+\(gp\)\n/ || /,-?[0-9]+\(sp\)\n/ || /,-?[0-9]+\(zero\)\n/)) {
print "$., $pc $curfunc: store without cache barrier.\n";
print ">> $_";
next;
}
if ($instr eq "pref" && !($storeok || $BDLstoreok)
&& (/1,.*\n/ || /3,.*\n/ || /5,.*\n/ || /7,.*\n/)) {
print "$., $pc $curfunc: prefetch hint generates store without barrier.\n";
print ">> $_";
next;
}
if (exists $branch{$instr}) {
$BDLstoreok = $storeok;
$storeok = 0;
next;
} else {
$BDLstoreok = 0;
}
} continue {
if (eof) {
# reset line number counter $.
close ARGV;
}
}