|
From: <sv...@va...> - 2012-09-18 20:25:31
|
florian 2012-09-18 21:25:23 +0100 (Tue, 18 Sep 2012)
New Revision: 12997
Log:
s390: Add testcases for srnm and srnmb. Update opcode status list.
Added files:
trunk/none/tests/s390x/srnm.c
trunk/none/tests/s390x/srnm.stderr.exp
trunk/none/tests/s390x/srnm.stdout.exp
trunk/none/tests/s390x/srnm.vgtest
trunk/none/tests/s390x/srnmb.c
trunk/none/tests/s390x/srnmb.stderr.exp
trunk/none/tests/s390x/srnmb.stdout.exp
trunk/none/tests/s390x/srnmb.vgtest
Modified directories:
trunk/none/tests/s390x/
Modified files:
trunk/docs/internals/s390-opcodes.csv
trunk/none/tests/s390x/Makefile.am
trunk/none/tests/s390x/opcodes.h
Modified: trunk/none/tests/s390x/
Added: trunk/none/tests/s390x/srnmb.c (+67 -0)
===================================================================
--- trunk/none/tests/s390x/srnmb.c 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/srnmb.c 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -0,0 +1,67 @@
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "opcodes.h"
+
+#define srnmb(b,d) \
+ ({ \
+ __asm__ volatile ( "lghi 8," #b "\n\t" \
+ SRNMB(8,d) \
+ ::: "8"); \
+ })
+
+
+/* Like srnm above, except it uses r0 as a base register */
+#define srnmb0(d) \
+ ({ \
+ __asm__ volatile ( SRNMB(0,d) \
+ ::: "0"); \
+ })
+
+unsigned
+get_rounding_mode(void)
+{
+ unsigned fpc;
+
+ __asm__ volatile ("stfpc %0\n\t" : "=m"(fpc));
+
+ return fpc & 0x7;
+}
+
+int main(void)
+{
+ printf("initial rounding mode = %u\n", get_rounding_mode());
+
+ /* Set basic rounding modes in various ways */
+ srnmb(1,002); // 1 + 2 = 3
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnmb(2,000);
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnmb(0,001);
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnmb(0,000);
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+#if 0
+ // fpext
+ srnmb(7,000); // -> 7
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnmb(0,000); // -> 0
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnmb(0,007); // -> 7
+ printf("rounding mode = %u\n", get_rounding_mode());
+#endif
+
+ srnmb(0,001);
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnmb0(004); // -> emul warning invalid rounding mode
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ return 0;
+}
Added: trunk/none/tests/s390x/srnmb.stdout.exp (+7 -0)
===================================================================
--- trunk/none/tests/s390x/srnmb.stdout.exp 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/srnmb.stdout.exp 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -0,0 +1,7 @@
+initial rounding mode = 0
+rounding mode = 3
+rounding mode = 2
+rounding mode = 1
+rounding mode = 0
+rounding mode = 1
+rounding mode = 0
Property changed: trunk/none/tests/s390x (+0 -0)
___________________________________________________________________
Name: svn:ignore
- .deps
add
add_EI
add_GE
allexec
and
and_EI
clc
clcle
cvb
cvd
div
ex_clone
ex_sig
flogr
icm
insert
insert_EI
lam_stam
lpr
Makefile
Makefile.in
mul
mul_GE
mvst
or
or_EI
srst
sub
sub_EI
tcxb
xc
xor
xor_EI
stck
stcke
stckf
op_exception
fgx
condloadstore
fold_And16
stfle
op00
cksm
clcl
mvcl
troo
trot
trto
trtt
tr
tre
clrj
clgrj
crj
cgrj
clij
clgij
cij
cgij
cs
csg
cds
cdsg
cu21
cu21_1
cu24
cu24_1
cu42
cu12
cu12_1
cu14
cu14_1
cu41
ecag
fpext
fpext_warn
fpconv
rounding-1
rounding-2
rounding-3
rounding-4
rounding-5
bfp-1
bfp-2
bfp-3
bfp-4
+ .deps
add
add_EI
add_GE
allexec
and
and_EI
clc
clcle
cvb
cvd
div
ex_clone
ex_sig
flogr
icm
insert
insert_EI
lam_stam
lpr
Makefile
Makefile.in
mul
mul_GE
mvst
or
or_EI
srst
sub
sub_EI
tcxb
xc
xor
xor_EI
stck
stcke
stckf
op_exception
fgx
condloadstore
fold_And16
stfle
op00
cksm
clcl
mvcl
troo
trot
trto
trtt
tr
tre
clrj
clgrj
crj
cgrj
clij
clgij
cij
cgij
cs
csg
cds
cdsg
cu21
cu21_1
cu24
cu24_1
cu42
cu12
cu12_1
cu14
cu14_1
cu41
ecag
fpext
fpext_warn
fpconv
rounding-1
rounding-2
rounding-3
rounding-4
rounding-5
bfp-1
bfp-2
bfp-3
bfp-4
srnm
srnmb
Added: trunk/none/tests/s390x/srnmb.vgtest (+2 -0)
===================================================================
--- trunk/none/tests/s390x/srnmb.vgtest 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/srnmb.vgtest 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -0,0 +1,2 @@
+prog: srnmb
+vgopts: --show-emwarns=yes
Added: trunk/none/tests/s390x/srnm.stderr.exp (+2 -0)
===================================================================
--- trunk/none/tests/s390x/srnm.stderr.exp 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/srnm.stderr.exp 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -0,0 +1,2 @@
+
+
Added: trunk/none/tests/s390x/srnmb.stderr.exp (+6 -0)
===================================================================
--- trunk/none/tests/s390x/srnmb.stderr.exp 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/srnmb.stderr.exp 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -0,0 +1,6 @@
+
+Emulation warning: unsupported action:
+ The specified rounding mode is invalid.
+ Continuing using 'round to nearest'. Results may differ!
+ at 0x........: main (srnmb.c:64)
+
Modified: trunk/docs/internals/s390-opcodes.csv (+1 -1)
===================================================================
--- trunk/docs/internals/s390-opcodes.csv 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/docs/internals/s390-opcodes.csv 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -959,4 +959,4 @@
mxtra,"multiply extended dfp with rounding mode","not implemented","new to z196"
sdtra,"subtract long dfp with rounding mode","not implemented","new to z196"
sxtra,"subtract extended dfp with rounding mode","not implemented","new to z196"
-srnmb,"set 3 bit bfp rounding mode","not implemented",
+srnmb,"set 3 bit bfp rounding mode",implemented,
Added: trunk/none/tests/s390x/srnm.c (+50 -0)
===================================================================
--- trunk/none/tests/s390x/srnm.c 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/srnm.c 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -0,0 +1,50 @@
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include "opcodes.h"
+
+#define srnm(b,d) \
+ ({ \
+ __asm__ volatile ( "lghi 8," #b "\n\t" \
+ "srnm " #d "(8)\n\t" ::: "8"); \
+ })
+
+unsigned
+get_rounding_mode(void)
+{
+ unsigned fpc;
+
+ __asm__ volatile ("stfpc %0\n\t" : "=m"(fpc));
+
+ return fpc & 0x7;
+}
+
+int main(void)
+{
+ printf("initial rounding mode = %u\n", get_rounding_mode());
+
+ /* Set basic rounding modes in various ways */
+ srnm(1,2); // 1 + 2 = 3
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnm(2,0);
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnm(0,1);
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnm(0,0);
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ /* Some rounding modes with bits to be ignored */
+ srnm(0xff,0); // -> 3
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnm(0,0xfe); // -> 2
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ srnm(0xf0,0x0f); // -> 3
+ printf("rounding mode = %u\n", get_rounding_mode());
+
+ return 0;
+}
Modified: trunk/none/tests/s390x/Makefile.am (+1 -1)
===================================================================
--- trunk/none/tests/s390x/Makefile.am 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/Makefile.am 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -10,7 +10,7 @@
cs csg cds cdsg cu21 cu21_1 cu24 cu24_1 cu42 cu12 cu12_1 \
ex_sig ex_clone cu14 cu14_1 cu41 fpconv ecag fpext fpext_warn \
rounding-1 rounding-2 rounding-3 rounding-4 rounding-5 bfp-1 \
- bfp-2 bfp-3 bfp-4
+ bfp-2 bfp-3 bfp-4 srnm srnmb
check_PROGRAMS = $(INSN_TESTS) \
allexec \
Added: trunk/none/tests/s390x/srnm.vgtest (+1 -0)
===================================================================
--- trunk/none/tests/s390x/srnm.vgtest 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/srnm.vgtest 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -0,0 +1 @@
+prog: srnm
Added: trunk/none/tests/s390x/srnm.stdout.exp (+8 -0)
===================================================================
--- trunk/none/tests/s390x/srnm.stdout.exp 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/srnm.stdout.exp 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -0,0 +1,8 @@
+initial rounding mode = 0
+rounding mode = 3
+rounding mode = 2
+rounding mode = 1
+rounding mode = 0
+rounding mode = 3
+rounding mode = 2
+rounding mode = 3
Modified: trunk/none/tests/s390x/opcodes.h (+2 -0)
===================================================================
--- trunk/none/tests/s390x/opcodes.h 2012-09-18 20:24:58 +01:00 (rev 12996)
+++ trunk/none/tests/s390x/opcodes.h 2012-09-18 21:25:23 +01:00 (rev 12997)
@@ -98,6 +98,7 @@
".short 0x" #op1 #r1 #r2 "\n\t" \
".long 0x" #i3 #i4 #i5 #op2 "\n\t"
#define RRF_M0RERE(op,m3,r1,r2) ".long 0x" #op #m3 "0" #r1 #r2 "\n\t"
+#define S_RD(op,b2,d2) ".long 0x" #op #b2 #d2 "\n\t"
#define AFI(r1,i2) RIL_RI(c2,r1,9,i2)
#define AGFI(r1,i2) RIL_RI(c2,r1,8,i2)
@@ -318,6 +319,7 @@
#define SRAK(r1,r3,b2,dl2,dh2) RSY_RRRD(eb,r1,r3,b2,dl2,dh2,dc)
#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 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)
|