s390: Add testcase for the SRNMT instruction.
Patch by Maran Pakkirisamy (maranp@linux.vnet.ibm.com).
Part of fixing BZ 307113.


git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13325 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/none/tests/s390x/Makefile.am b/none/tests/s390x/Makefile.am
index 1fd02a8..af07ecc 100644
--- a/none/tests/s390x/Makefile.am
+++ b/none/tests/s390x/Makefile.am
@@ -19,7 +19,7 @@
 	     spechelper-icm-1  spechelper-icm-2 spechelper-tmll \
 	     spechelper-tm laa
 if BUILD_DFP_TESTS
-  INSN_TESTS += dfp-1 dfp-2 dfp-3 dfp-4 dfptest dfpext dfpconv
+  INSN_TESTS += dfp-1 dfp-2 dfp-3 dfp-4 dfptest dfpext dfpconv srnmt
 endif
 
 check_PROGRAMS = $(INSN_TESTS) \
@@ -43,7 +43,8 @@
 	dfp-4.stderr.exp dfp-4.stdout.exp dfp-4.vgtest \
 	dfptest.stderr.exp dfptest.stdout.exp dfptest.vgtest \
 	dfpext.stderr.exp dfpext.stdout.exp dfpext.vgtest \
-	dfpconv.stderr.exp dfpconv.stdout.exp dfpconv.vgtest
+	dfpconv.stderr.exp dfpconv.stdout.exp dfpconv.vgtest \
+	srnmt.stderr.exp srnmt.stdout.exp srnmt.vgtest
 
 AM_CFLAGS    += @FLAG_M64@
 AM_CXXFLAGS  += @FLAG_M64@
diff --git a/none/tests/s390x/opcodes.h b/none/tests/s390x/opcodes.h
index 0540c9b..f8a55e2 100644
--- a/none/tests/s390x/opcodes.h
+++ b/none/tests/s390x/opcodes.h
@@ -348,6 +348,7 @@
 #define SRK(r3,r1,r2)                   RRF_R0RR2(b9f9,r3,0,r1,r2)
 #define SRLK(r1,r3,b2,dl2,dh2)          RSY_RRRD(eb,r1,r3,b2,dl2,dh2,de)
 #define SRNMB(b2,d2)                    S_RD(b2b8,b2,d2)
+#define SRNMT(b2,d2)                    S_RD(b2b9,b2,d2)
 #define STAMY(r1,r3,b2,dl2,dh2)         RSY_AARD(eb,r1,r3,b2,dl2,dh2,9b)
 #define STCH(r1,x2,b2,dl2,dh2)          RXY_RRRD(e3,r1,x2,b2,dl2,dh2,c3)
 #define STCMY(r1,r3,b2,dl2,dh2)         RSY_RURD(eb,r1,r3,b2,dl2,dh2,2d)
diff --git a/none/tests/s390x/srnmt.c b/none/tests/s390x/srnmt.c
new file mode 100644
index 0000000..7776c86
--- /dev/null
+++ b/none/tests/s390x/srnmt.c
@@ -0,0 +1,61 @@
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "opcodes.h"
+
+#define srnmt(b,d) \
+   ({ \
+      __asm__ volatile ( "lghi 8," #b "\n\t" \
+                         SRNMT(8,d) \
+                         ::: "8"); \
+   })
+
+
+/* Like srnmt above, except it uses r0 as a base register */
+#define srnmt0(d) \
+   ({ \
+      __asm__ volatile ( SRNMT(0,d) \
+                         ::: "0"); \
+   })
+
+unsigned
+get_dfp_rounding_mode(void)
+{
+   unsigned fpc;
+
+   __asm__ volatile ("stfpc  %0\n\t" : "=m"(fpc));
+
+   return (fpc & 0x70) >> 4;
+}
+
+int main(void)
+{
+   printf("initial rounding mode = %u\n", get_dfp_rounding_mode());
+
+   /* Set basic rounding modes in various ways */
+   srnmt(1,002);  // 1 + 2 = 3
+   printf("rounding mode = %u\n", get_dfp_rounding_mode());
+
+   srnmt(2,000);
+   printf("rounding mode = %u\n", get_dfp_rounding_mode());
+
+   srnmt(0,001);
+   printf("rounding mode = %u\n", get_dfp_rounding_mode());
+
+   srnmt(0,000);
+   printf("rounding mode = %u\n", get_dfp_rounding_mode());
+
+   srnmt(7,000);
+   printf("rounding mode = %u\n", get_dfp_rounding_mode());
+
+   srnmt(0,006);
+   printf("rounding mode = %u\n", get_dfp_rounding_mode());
+
+   srnmt0(005);
+   printf("rounding mode = %u\n", get_dfp_rounding_mode());
+
+   srnmt0(004);
+   printf("rounding mode = %u\n", get_dfp_rounding_mode());
+
+   return 0;
+}
diff --git a/none/tests/s390x/srnmt.stderr.exp b/none/tests/s390x/srnmt.stderr.exp
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/none/tests/s390x/srnmt.stderr.exp
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/s390x/srnmt.stdout.exp b/none/tests/s390x/srnmt.stdout.exp
new file mode 100644
index 0000000..581d3f2
--- /dev/null
+++ b/none/tests/s390x/srnmt.stdout.exp
@@ -0,0 +1,9 @@
+initial rounding mode = 0
+rounding mode = 3
+rounding mode = 2
+rounding mode = 1
+rounding mode = 0
+rounding mode = 7
+rounding mode = 6
+rounding mode = 5
+rounding mode = 4
diff --git a/none/tests/s390x/srnmt.vgtest b/none/tests/s390x/srnmt.vgtest
new file mode 100644
index 0000000..cb7a448
--- /dev/null
+++ b/none/tests/s390x/srnmt.vgtest
@@ -0,0 +1,2 @@
+prog: srnmt
+prereq: test -e srnmt && ../../../tests/s390x_features s390x-dfp