summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorChe-Liang Chiou <clchiou@chromium.org>2010-12-02 12:09:35 +0800
committerSimon Glass <sjg@chromium.org>2011-08-24 10:00:12 -0700
commit8ae361cdec953378ba50e1c150af66f56b8a0fe1 (patch)
tree6b231e343a2f86a110bba8993215eec764327cd6 /tests
parent383326ee19944471ecc3653f374aafd79f15fade (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/Makefile71
-rw-r--r--tests/drive_uldivmod.c47
-rwxr-xr-xtests/generate_cases_uldivmod109
3 files changed, 227 insertions, 0 deletions
diff --git a/tests/Makefile b/tests/Makefile
new file mode 100644
index 0000000000..b7323ff141
--- /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 0000000000..1f0a2146da
--- /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 0000000000..a3b49942e5
--- /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_)