From: Julian Seward Date: Wed, 27 Apr 2011 12:00:51 +0000 (+0000) Subject: s390x: fpr - gpr transfer facility -- valgrind side fixes, X-Git-Tag: svn/VALGRIND_3_7_0~524 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=482237674c34e737c73e6b7819dfabee3e09c848;p=thirdparty%2Fvalgrind.git s390x: fpr - gpr transfer facility -- valgrind side fixes, and test cases. Fixes #268619. (Florian Krohm, britzel@acm.org) git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11713 --- diff --git a/coregrind/m_machine.c b/coregrind/m_machine.c index c324afb225..bfa5fda122 100644 --- a/coregrind/m_machine.c +++ b/coregrind/m_machine.c @@ -1000,7 +1000,7 @@ Bool VG_(machine_get_hwcaps)( void ) vki_sigaction_fromK_t saved_sigill_act; vki_sigaction_toK_t tmp_sigill_act; - volatile Bool have_LDISP, have_EIMM, have_GIE, have_DFP; + volatile Bool have_LDISP, have_EIMM, have_GIE, have_DFP, have_FGX; Int r, model; /* Unblock SIGILL and stash away the old action for that signal */ @@ -1061,6 +1061,13 @@ Bool VG_(machine_get_hwcaps)( void ) : : : "r0", "cc", "memory"); /* adtr r0,r0,r0 */ } + have_FGX = True; + if (VG_MINIMAL_SETJMP(env_unsup_insn)) { + have_FGX = False; + } else { + __asm__ __volatile__(".long 0xb3cd0000" : : : "r0"); /* lgdr r0,f0 */ + } + /* Restore signals */ r = VG_(sigaction)(VKI_SIGILL, &saved_sigill_act, NULL); vg_assert(r == 0); @@ -1070,8 +1077,9 @@ Bool VG_(machine_get_hwcaps)( void ) model = VG_(get_machine_model)(); - VG_(debugLog)(1, "machine", "machine %d LDISP %d EIMM %d GIE %d DFP %d\n", - model, have_LDISP, have_EIMM, have_GIE, have_DFP); + VG_(debugLog)(1, "machine", "machine %d LDISP %d EIMM %d GIE %d DFP %d " + "FGX %d\n", model, have_LDISP, have_EIMM, have_GIE, + have_DFP, have_FGX); if (model == VEX_S390X_MODEL_INVALID) return False; @@ -1085,6 +1093,7 @@ Bool VG_(machine_get_hwcaps)( void ) if (have_EIMM) vai.hwcaps |= VEX_HWCAPS_S390X_EIMM; if (have_GIE) vai.hwcaps |= VEX_HWCAPS_S390X_GIE; if (have_DFP) vai.hwcaps |= VEX_HWCAPS_S390X_DFP; + if (have_FGX) vai.hwcaps |= VEX_HWCAPS_S390X_FGX; VG_(debugLog)(1, "machine", "hwcaps = 0x%x\n", vai.hwcaps); diff --git a/none/tests/s390x/Makefile.am b/none/tests/s390x/Makefile.am index a521449911..2f85b3d183 100644 --- a/none/tests/s390x/Makefile.am +++ b/none/tests/s390x/Makefile.am @@ -5,7 +5,7 @@ dist_noinst_SCRIPTS = filter_stderr INSN_TESTS = clc clcle cvb cvd icm lpr tcxb lam_stam xc mvst add sub mul \ and or xor insert div srst fold_And16 flogr sub_EI add_EI \ and_EI or_EI xor_EI insert_EI mul_GE add_GE condloadstore \ - op_exception + op_exception fgx check_PROGRAMS = $(INSN_TESTS) \ ex_sig \ diff --git a/none/tests/s390x/fgx.c b/none/tests/s390x/fgx.c new file mode 100644 index 0000000000..83d9723c0d --- /dev/null +++ b/none/tests/s390x/fgx.c @@ -0,0 +1,32 @@ +#include +#include "opcodes.h" + +int main() +{ + register long g asm("r7"); + register double f asm("f8"); + double f1; + + memset(&f1, 0x0f, sizeof(double)); + f = f1; + g = 42; + printf("test LGDR\n\n"); + printf("before g = %ld\n", g); + printf("before f = %a\n", f); + printf("copy f to g\n"); + asm volatile ( LGDR(7,8) : "=d"(g) : "f"(f)); + printf("after g = %16.16lx\n", g); /* 0x0x0x0...... */ + printf("after f = %a\n", f); + + printf("\ntest LDGR\n\n"); + f = 3.14; + printf("before g = %16.16lx\n", g); /* 0x0x0x0...... */ + printf("before f = %a\n", f); + printf("copy g to f\n"); + asm volatile ( LDGR(8,7) : "=f"(f) : "d"(g)); + printf("after g = %16.16lx\n", g); /* 0x0x0x0...... */ + printf("after f = %a\n", f); + + return 0; +} + diff --git a/none/tests/s390x/fgx.stderr.exp b/none/tests/s390x/fgx.stderr.exp new file mode 100644 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/s390x/fgx.stderr.exp @@ -0,0 +1,2 @@ + + diff --git a/none/tests/s390x/fgx.stdout.exp b/none/tests/s390x/fgx.stdout.exp new file mode 100644 index 0000000000..242ff5ed84 --- /dev/null +++ b/none/tests/s390x/fgx.stdout.exp @@ -0,0 +1,15 @@ +test LGDR + +before g = 42 +before f = 0x1.f0f0f0f0f0f0fp-783 +copy f to g +after g = 0f0f0f0f0f0f0f0f +after f = 0x1.f0f0f0f0f0f0fp-783 + +test LDGR + +before g = 0f0f0f0f0f0f0f0f +before f = 0x1.91eb851eb851fp+1 +copy g to f +after g = 0f0f0f0f0f0f0f0f +after f = 0x1.f0f0f0f0f0f0fp-783 diff --git a/none/tests/s390x/fgx.vgtest b/none/tests/s390x/fgx.vgtest new file mode 100644 index 0000000000..7bd7dac43a --- /dev/null +++ b/none/tests/s390x/fgx.vgtest @@ -0,0 +1 @@ +prog: fgx