diff options
author | Che-Liang Chiou <clchiou@chromium.org> | 2010-12-02 12:09:35 +0800 |
---|---|---|
committer | Simon Glass <sjg@chromium.org> | 2011-08-24 10:00:12 -0700 |
commit | 8ae361cdec953378ba50e1c150af66f56b8a0fe1 (patch) | |
tree | 6b231e343a2f86a110bba8993215eec764327cd6 /tests | |
parent | 383326ee19944471ecc3653f374aafd79f15fade (diff) |
Test code for __aeabi_uldivmod
The test code requires qemu-arm and python, and has to be run inside chroot.
The test cases include
* Divide by zero
* Divide by power of two
* Divide by random non-zero integer
BUG=None
TEST=Run "cd tests; make" and see "TEST PASS" at the end; then run "make clean"
Review URL: http://codereview.chromium.org/5269006
Change-Id: I725990fe188ba7f787f1f162eab0e0b1ec6b5ff6
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile | 71 | ||||
-rw-r--r-- | tests/drive_uldivmod.c | 47 | ||||
-rwxr-xr-x | tests/generate_cases_uldivmod | 109 |
3 files changed, 227 insertions, 0 deletions
diff --git a/tests/Makefile b/tests/Makefile new file mode 100644 index 00000000000..b7323ff1417 --- /dev/null +++ b/tests/Makefile @@ -0,0 +1,71 @@ +# +# Copyright 2010, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Alternatively, this software may be distributed under the terms of the +# GNU General Public License ("GPL") version 2 as published by the Free +# Software Foundation. +# + +ROOT = /build/tegra2_seaboard +TC = armv7a-cros-linux-gnueabi- +CC = $(TC)gcc +LD = $(TC)ld +CFLAGS = -I$(ROOT)/usr/include/ -I$(ROOT)/include/ + +TARGET = $(ROOT)/tmp/test_uldivmod +TESTDATA = $(ROOT)/tmp/testdata +RUN_TARGET = qemu-arm $(ROOT)/lib/ld-linux.so.3 --library-path $(ROOT)/lib \ + $(TARGET) +RUN_TEST = $(RUN_TARGET) < $(TESTDATA) | diff -q - $(TESTDATA) + +DRIVE_SRC = drive_uldivmod.c +DRIVE_OBJ = $(subst .c,.o,$(DRIVE_SRC)) + +ASMSRC_PATH = ../arch/arm/lib +ASM_SRCS = _uldivmod.S _udivsi3.S _divsi3.S +OBJS = $(DRIVE_OBJ) $(subst .S,.o,$(ASM_SRCS)) + +test: $(TARGET) + [ -f "$(TESTDATA)" ] || ./generate_cases_uldivmod $(TESTDATA) + ($(RUN_TEST)) > /dev/null 2>&1 && echo "TEST PASS" || echo "TEST FAIL" + +$(TARGET): $(OBJS) + $(LD) -o $@ $? $(ROOT)/usr/lib/crt?.o -lc + +$(DRIVE_OBJ): $(DRIVE_SRC) + $(CC) -march=armv7-a $(CFLAGS) -c -o $@ $< + +%.o: $(ASMSRC_PATH)/%.S + $(CC) -march=armv7-a -c -o $@ $< + +clean: + rm -f $(TARGET) $(TESTDATA) $(OBJS) + +.PHONY: test clean diff --git a/tests/drive_uldivmod.c b/tests/drive_uldivmod.c new file mode 100644 index 00000000000..1f0a2146dad --- /dev/null +++ b/tests/drive_uldivmod.c @@ -0,0 +1,47 @@ +/* + * Copyright 2010, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Alternatively, this software may be distributed under the terms of the + * GNU General Public License ("GPL") version 2 as published by the Free + * Software Foundation. + */ + +#include <stdio.h> +#include <stdint.h> + +void __div0 (void) {} + +int main(void) +{ + uint64_t a, b, q, r; + while (scanf("%llx %llx %llx %llx", &a, &b, &q, &r) > 0) + printf("%016llx %016llx %016llx %016llx\n", a, b, a / b, a % b); + return 0; +} diff --git a/tests/generate_cases_uldivmod b/tests/generate_cases_uldivmod new file mode 100755 index 00000000000..a3b49942e51 --- /dev/null +++ b/tests/generate_cases_uldivmod @@ -0,0 +1,109 @@ +#!/usr/bin/python2.6 +# +# Copyright 2010, Google Inc. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Alternatively, this software may be distributed under the terms of the +# GNU General Public License ("GPL") version 2 as published by the Free +# Software Foundation. +# + +import sys +from random import seed, randint + +if len(sys.argv) < 2: + print '%s f' % sys.argv[0] + +# Set a specific seed value so that every time we get the same test data +seed(17) + +max_uint64 = 0xffffffffffffffff +max_uint32 = 0xffffffff +n_case = 1000 +fmt = '%016x %016x %016x %016x' + +with open(sys.argv[1], 'w') as f: + # Generate corner cases + corners = (0, 1, + max_uint32 - 1, max_uint32, max_uint32 + 1, + max_uint64 - 1, max_uint64) + for a in corners: + for b in corners: + if b == 0: + print >>f, fmt % (a, b, 0, 0) + else: + print >>f, fmt % (a, b, a / b, a % b) + + # Generate pow2 by pow2 divisions + for i in xrange(64): + for j in xrange(64): + a = 2 ** i + b = 2 ** j + print >>f, fmt % (a, b, a / b, a % b) + + # Some numbers that are gurarnteed not power of 2 + a_ = a = 17 + b_ = b = 11 + print >>f, fmt % (a_, b_, a_ / b_, a_ % b_) + a_ = (a << 32) + a + print >>f, fmt % (a_, b_, a_ / b_, a_ % b_) + b_ = (b << 32) + b + print >>f, fmt % (a_, b_, a_ / b_, a_ % b_) + a_ = (a << 32) + a + b_ = (b << 32) + b + print >>f, fmt % (a_, b_, a_ / b_, a_ % b_) + + # Generate 64 by pow2 divisions + for i in xrange(64): + b = 2 ** i + for _ in xrange(n_case): + a = randint(0, max_uint64) + print >>f, fmt % (a, b, a / b, a % b) + + # Generate random divisions w/ and w/o sign-bits + for range_a in ((0, max_uint32), (max_uint32 + 1, max_uint64)): + for range_b in ((1, max_uint32), (max_uint32 + 1, max_uint64)): + for _ in xrange(n_case): + a = randint(*range_a) + b = randint(*range_b) + print >>f, fmt % (a, b, a / b, a % b) + + # Set sign-bit + a_ = a | (1 << 31) + b_ = b | (1 << 31) + print >>f, fmt % (a_, b_, a_ / b_, a_ % b_) + a_ = a | (1 << 63) + b_ = b | (1 << 31) + print >>f, fmt % (a_, b_, a_ / b_, a_ % b_) + a_ = a | (1 << 31) + b_ = b | (1 << 63) + print >>f, fmt % (a_, b_, a_ / b_, a_ % b_) + a_ = a | (1 << 63) + b_ = b | (1 << 63) + print >>f, fmt % (a_, b_, a_ / b_, a_ % b_) |