#!/usr/bin/perl -w use strict; use POSIX qw(floor); my $fail = 0; sub check_mul { my ($a, $b, $r) = @_; $b = $b / 256; my $m = floor ($a * $b); if ($m > (1 << 15) - 1 || $m < -(1 << 15)) { print "overflow $a * $b = $r ($m)\n"; } elsif ($m == $r) { print "pass $a * $b = $r\n"; } else { print "fail $a * $b = $r ($m)\n"; $fail = 1; } } while (<>) { chomp; if (/^m (-?\d+) (\d+)$/) { my ($a, $b) = ($1, $2); $_ = <>; chomp; next unless (/^r (-?\d+)$/); my $r = $1; $_ = <>; chomp; next unless (/^R (-?\d+)$/); my $R = $1; check_mul $a, $b, $r; check_mul -$a, $b, $R; } } if ($fail) { print "test failled\n"; exit 1; } else { print "test passed\n"; exit 0; }