1#!/usr/bin/env perl -w
2#
3# Copyright (c) 2005 Marcel Moolenaar
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9#
10# 1. Redistributions of source code must retain the above copyright
11#    notice, this list of conditions and the following disclaimer.
12# 2. Redistributions in binary form must reproduce the above copyright
13#    notice, this list of conditions and the following disclaimer in the
14#    documentation and/or other materials provided with the distribution.
15#
16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26#
27# $FreeBSD$
28
29my $srcdir = `dirname $0`;
30chomp $srcdir;
31
32my @accesses = ("Load", "Store");
33my @types = ("Integer", "FloatingPoint");
34my @sizes = ("Small", "Medium", "Large");
35my @postincs = ("NoPostInc", "MinConstPostInc", "PlusConstPostInc",
36		"ScratchRegPostInc", "PreservedRegPostInc");
37
38sub run ($$$$$) {
39    local ($nr, $access, $type, $size, $postinc) = @_;
40    local $test = "${access}_${type}_${size}_${postinc}";
41    local $tmpfile = "/tmp/" . $$ . "_$test";
42    local $st;
43
44    $st = system("cc -o $tmpfile -DACCESS=$access -DTYPE=$type -DSIZE=$size -DPOSTINC=$postinc -Wall -O -g $srcdir/test.c");
45    if ($st != 0) {
46	print "not ok $nr $test # compiling $test\n";
47    }
48    else {
49	$st = system($tmpfile);
50	if ($st == 0) {
51	    print "ok $nr $test\n";
52	}
53	elsif ($st == 256) {
54	    print "not ok $nr $test # invalid combination\n";
55	}
56	elsif ($st == 512) {
57	    print "not ok $nr $test # value mismatch\n";
58	}
59	elsif ($st == 1024) {
60	    print "not ok $nr $test # post increment mismatch\n";
61	}
62	else {
63	    print "not ok $nr $test # signalled (exit status $st)\n";
64	    return; # Preserve the executable
65	}
66    }
67    unlink $tmpfile;
68}
69
70system("sysctl debug.unaligned_test=1");
71if (`sysctl -n debug.unaligned_test` != "1") {
72    print "1..0 # SKIP The debug.unaligned_test sysctl could not be set\n";
73    exit 0;
74}
75
76my $count = @accesses * @types * @sizes * @postincs;
77
78# There's no register based post inc. for stores.
79$count -= 12;
80
81print "1..$count\n";
82
83my $nr=0;
84foreach $access (@accesses) {
85    foreach $postinc (@postincs) {
86	$_ = "$access $postinc";
87	if (! /Store.+RegPostInc/) {
88	    foreach $type (@types) {
89		foreach $size (@sizes) {
90		    run ++$nr, $access, $type, $size, $postinc;
91		}
92	    }
93	}
94    }
95}
96
97system("sysctl debug.unaligned_test=0");
98
99exit 0;
100