|
From: <sv...@va...> - 2013-04-11 13:59:02
|
sewardj 2013-04-11 14:58:48 +0100 (Thu, 11 Apr 2013)
New Revision: 13365
Log:
Add test cases for SDIV and UDIV. Pertains to #314178.
Added files:
trunk/none/tests/arm/intdiv.c
trunk/none/tests/arm/intdiv.stderr.exp
trunk/none/tests/arm/intdiv.stdout.exp
trunk/none/tests/arm/intdiv.vgtest
Modified files:
trunk/none/tests/arm/Makefile.am
Added: trunk/none/tests/arm/intdiv.vgtest (+2 -0)
===================================================================
--- trunk/none/tests/arm/intdiv.vgtest 2013-04-11 11:58:18 +01:00 (rev 13364)
+++ trunk/none/tests/arm/intdiv.vgtest 2013-04-11 14:58:48 +01:00 (rev 13365)
@@ -0,0 +1,2 @@
+prog: intdiv
+vgopts: -q
Added: trunk/none/tests/arm/intdiv.stderr.exp (+0 -0)
===================================================================
Added: trunk/none/tests/arm/intdiv.stdout.exp (+14 -0)
===================================================================
--- trunk/none/tests/arm/intdiv.stdout.exp 2013-04-11 11:58:18 +01:00 (rev 13364)
+++ trunk/none/tests/arm/intdiv.stdout.exp 2013-04-11 14:58:48 +01:00 (rev 13365)
@@ -0,0 +1,14 @@
+000001f4 00000032 -> u:0000000a s:0000000a
+000001f4 ffffffce -> u:00000000 s:fffffff6
+fffffe0c 00000032 -> u:051eb847 s:fffffff6
+fffffe0c ffffffce -> u:00000000 s:0000000a
+00000064 00000007 -> u:0000000e s:0000000e
+ffffff9c 00000007 -> u:24924916 s:fffffff2
+00000064 fffffff9 -> u:00000000 s:fffffff2
+ffffff9c fffffff9 -> u:00000000 s:0000000e
+00000001 00000000 -> u:00000000 s:00000000
+00000000 00000000 -> u:00000000 s:00000000
+ffffffff 00000000 -> u:00000000 s:00000000
+80000000 00000000 -> u:00000000 s:00000000
+7fffffff 00000000 -> u:00000000 s:00000000
+80000000 ffffffff -> u:00000000 s:80000000
Added: trunk/none/tests/arm/intdiv.c (+55 -0)
===================================================================
--- trunk/none/tests/arm/intdiv.c 2013-04-11 11:58:18 +01:00 (rev 13364)
+++ trunk/none/tests/arm/intdiv.c 2013-04-11 14:58:48 +01:00 (rev 13365)
@@ -0,0 +1,55 @@
+
+#include <stdio.h>
+
+typedef signed int Int;
+typedef unsigned int UInt;
+
+__attribute__((noinline)) UInt do_udiv32 ( UInt x, UInt y )
+{
+ UInt res;
+ __asm__ __volatile__(
+ "mov r9, %1 ; mov r10, %2 ; udiv r3,r9,r10 ; mov %0, r3"
+ : "=r"(res) : "r"(x), "r"(y) : "r3", "r9", "r10"
+ );
+ return res;
+}
+
+__attribute__((noinline)) Int do_sdiv32 ( Int x, Int y )
+{
+ UInt res;
+ __asm__ __volatile__(
+ "mov r9, %1 ; mov r10, %2 ; sdiv r3,r9,r10 ; mov %0, r3"
+ : "=r"(res) : "r"(x), "r"(y) : "r3", "r9", "r10"
+ );
+ return res;
+}
+
+void test ( UInt x, UInt y )
+{
+ UInt ru = do_udiv32(x,y);
+ Int rs = do_sdiv32(x,y);
+ printf( "%08x %08x -> u:%08x s:%08x\n", x, y, ru, (UInt)rs);
+}
+
+int main ( void )
+{
+ // Check basic operation
+ test( 500, 50 );
+ test( 500, -50 );
+ test( -500, 50 );
+ test( -500, -50 );
+ // Check for rounding towards zero
+ test( 100, 7 ); // 14.285
+ test( -100, 7 );
+ test( 100, -7 );
+ test( -100, -7 );
+ // Division by zero produces zero
+ test( 1, 0 );
+ test( 0, 0 );
+ test( -1, 0 );
+ test( 0x80000000, 0 );
+ test( 0x7FFFFFFF, 0 );
+ // Test signed range ends
+ test( 0x80000000, -1 ); // unrepresentable as signed 32
+ return 0;
+}
Modified: trunk/none/tests/arm/Makefile.am (+4 -1)
===================================================================
--- trunk/none/tests/arm/Makefile.am 2013-04-11 11:58:18 +01:00 (rev 13364)
+++ trunk/none/tests/arm/Makefile.am 2013-04-11 14:58:48 +01:00 (rev 13365)
@@ -4,6 +4,7 @@
dist_noinst_SCRIPTS = filter_stderr
EXTRA_DIST = \
+ intdiv.stdout.exp intdiv.stderr.exp intdiv.vgtest \
ldrt.stdout.exp ldrt.stderr.exp ldrt.vgtest \
neon128.stdout.exp neon128.stderr.exp neon128.vgtest \
neon64.stdout.exp neon64.stderr.exp neon64.vgtest \
@@ -16,6 +17,7 @@
check_PROGRAMS = \
allexec \
+ intdiv \
ldrt \
neon128 \
neon64 \
@@ -56,4 +58,5 @@
-mfpu=neon \
-mthumb
-ldrt_CFLAGS = $(AM_CFLAGS) -g -O0 -mcpu=cortex-a8 -mthumb
+intdiv_CFLAGS = $(AM_CFLAGS) -g -mcpu=cortex-a15 -mthumb
+ldrt_CFLAGS = $(AM_CFLAGS) -g -mcpu=cortex-a8 -mthumb
|