You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(1) |
Oct
(122) |
Nov
(152) |
Dec
(69) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(6) |
Feb
(25) |
Mar
(73) |
Apr
(82) |
May
(24) |
Jun
(25) |
Jul
(10) |
Aug
(11) |
Sep
(10) |
Oct
(54) |
Nov
(203) |
Dec
(182) |
| 2004 |
Jan
(307) |
Feb
(305) |
Mar
(430) |
Apr
(312) |
May
(187) |
Jun
(342) |
Jul
(487) |
Aug
(637) |
Sep
(336) |
Oct
(373) |
Nov
(441) |
Dec
(210) |
| 2005 |
Jan
(385) |
Feb
(480) |
Mar
(636) |
Apr
(544) |
May
(679) |
Jun
(625) |
Jul
(810) |
Aug
(838) |
Sep
(634) |
Oct
(521) |
Nov
(965) |
Dec
(543) |
| 2006 |
Jan
(494) |
Feb
(431) |
Mar
(546) |
Apr
(411) |
May
(406) |
Jun
(322) |
Jul
(256) |
Aug
(401) |
Sep
(345) |
Oct
(542) |
Nov
(308) |
Dec
(481) |
| 2007 |
Jan
(427) |
Feb
(326) |
Mar
(367) |
Apr
(255) |
May
(244) |
Jun
(204) |
Jul
(223) |
Aug
(231) |
Sep
(354) |
Oct
(374) |
Nov
(497) |
Dec
(362) |
| 2008 |
Jan
(322) |
Feb
(482) |
Mar
(658) |
Apr
(422) |
May
(476) |
Jun
(396) |
Jul
(455) |
Aug
(267) |
Sep
(280) |
Oct
(253) |
Nov
(232) |
Dec
(304) |
| 2009 |
Jan
(486) |
Feb
(470) |
Mar
(458) |
Apr
(423) |
May
(696) |
Jun
(461) |
Jul
(551) |
Aug
(575) |
Sep
(134) |
Oct
(110) |
Nov
(157) |
Dec
(102) |
| 2010 |
Jan
(226) |
Feb
(86) |
Mar
(147) |
Apr
(117) |
May
(107) |
Jun
(203) |
Jul
(193) |
Aug
(238) |
Sep
(300) |
Oct
(246) |
Nov
(23) |
Dec
(75) |
| 2011 |
Jan
(133) |
Feb
(195) |
Mar
(315) |
Apr
(200) |
May
(267) |
Jun
(293) |
Jul
(353) |
Aug
(237) |
Sep
(278) |
Oct
(611) |
Nov
(274) |
Dec
(260) |
| 2012 |
Jan
(303) |
Feb
(391) |
Mar
(417) |
Apr
(441) |
May
(488) |
Jun
(655) |
Jul
(590) |
Aug
(610) |
Sep
(526) |
Oct
(478) |
Nov
(359) |
Dec
(372) |
| 2013 |
Jan
(467) |
Feb
(226) |
Mar
(391) |
Apr
(281) |
May
(299) |
Jun
(252) |
Jul
(311) |
Aug
(352) |
Sep
(481) |
Oct
(571) |
Nov
(222) |
Dec
(231) |
| 2014 |
Jan
(185) |
Feb
(329) |
Mar
(245) |
Apr
(238) |
May
(281) |
Jun
(399) |
Jul
(382) |
Aug
(500) |
Sep
(579) |
Oct
(435) |
Nov
(487) |
Dec
(256) |
| 2015 |
Jan
(338) |
Feb
(357) |
Mar
(330) |
Apr
(294) |
May
(191) |
Jun
(108) |
Jul
(142) |
Aug
(261) |
Sep
(190) |
Oct
(54) |
Nov
(83) |
Dec
(22) |
| 2016 |
Jan
(49) |
Feb
(89) |
Mar
(33) |
Apr
(50) |
May
(27) |
Jun
(34) |
Jul
(53) |
Aug
(53) |
Sep
(98) |
Oct
(206) |
Nov
(93) |
Dec
(53) |
| 2017 |
Jan
(65) |
Feb
(82) |
Mar
(102) |
Apr
(86) |
May
(187) |
Jun
(67) |
Jul
(23) |
Aug
(93) |
Sep
(65) |
Oct
(45) |
Nov
(35) |
Dec
(17) |
| 2018 |
Jan
(26) |
Feb
(35) |
Mar
(38) |
Apr
(32) |
May
(8) |
Jun
(43) |
Jul
(27) |
Aug
(30) |
Sep
(43) |
Oct
(42) |
Nov
(38) |
Dec
(67) |
| 2019 |
Jan
(32) |
Feb
(37) |
Mar
(53) |
Apr
(64) |
May
(49) |
Jun
(18) |
Jul
(14) |
Aug
(53) |
Sep
(25) |
Oct
(30) |
Nov
(49) |
Dec
(31) |
| 2020 |
Jan
(87) |
Feb
(45) |
Mar
(37) |
Apr
(51) |
May
(99) |
Jun
(36) |
Jul
(11) |
Aug
(14) |
Sep
(20) |
Oct
(24) |
Nov
(40) |
Dec
(23) |
| 2021 |
Jan
(14) |
Feb
(53) |
Mar
(85) |
Apr
(15) |
May
(19) |
Jun
(3) |
Jul
(14) |
Aug
(1) |
Sep
(57) |
Oct
(73) |
Nov
(56) |
Dec
(22) |
| 2022 |
Jan
(3) |
Feb
(22) |
Mar
(6) |
Apr
(55) |
May
(46) |
Jun
(39) |
Jul
(15) |
Aug
(9) |
Sep
(11) |
Oct
(34) |
Nov
(20) |
Dec
(36) |
| 2023 |
Jan
(79) |
Feb
(41) |
Mar
(99) |
Apr
(169) |
May
(48) |
Jun
(16) |
Jul
(16) |
Aug
(57) |
Sep
(19) |
Oct
|
Nov
|
Dec
|
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
|
|
|
1
(5) |
2
(4) |
3
(8) |
4
(11) |
5
(23) |
|
6
(14) |
7
(17) |
8
(10) |
9
(8) |
10
(13) |
11
(10) |
12
(15) |
|
13
(12) |
14
(8) |
15
(15) |
16
(10) |
17
(19) |
18
(10) |
19
(5) |
|
20
(9) |
21
(8) |
22
(7) |
23
(4) |
24
(15) |
25
(6) |
26
(11) |
|
27
(5) |
28
(11) |
29
(9) |
30
(9) |
31
(4) |
|
|
|
From: Christian B. <bor...@de...> - 2011-03-24 21:35:28
|
Nightly build on sless390 ( SUSE Linux Enterprise Server 11 SP1 gcc 4.3.4 on z10 (s390x) ) Started at 2011-03-24 22:10:01 CET Ended at 2011-03-24 22:35:20 CET Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 457 tests, 6 stderr failures, 0 stdout failures, 0 post failures == none/tests/faultstatus (stderr) helgrind/tests/tc06_two_races_xml (stderr) helgrind/tests/tc23_bogus_condwait (stderr) drd/tests/tc04_free_lock (stderr) drd/tests/tc09_bad_unlock (stderr) drd/tests/tc23_bogus_condwait (stderr) |
|
From: Christian B. <bor...@de...> - 2011-03-24 21:30:57
|
Nightly build on fedora390 ( Fedora 13/14/15 mix with gcc 3.5.3 on z196 (s390x) ) Started at 2011-03-24 22:10:01 CET Ended at 2011-03-24 22:29:51 CET Results unchanged from 24 hours ago Checking out valgrind source tree ... done Configuring valgrind ... done Building valgrind ... done Running regression tests ... failed Regression test results follow == 441 tests, 10 stderr failures, 0 stdout failures, 0 post failures == helgrind/tests/tc06_two_races_xml (stderr) helgrind/tests/tc23_bogus_condwait (stderr) drd/tests/annotate_spinlock (stderr) drd/tests/sem_open (stderr) drd/tests/sem_open2 (stderr) drd/tests/sem_open3 (stderr) drd/tests/sem_open_traced (stderr) drd/tests/tc04_free_lock (stderr) drd/tests/tc09_bad_unlock (stderr) drd/tests/tc23_bogus_condwait (stderr) |
|
From: Philippe W. <phi...@sk...> - 2011-03-24 21:13:21
|
I understood the macro VG_ is needed to avoid name clashes between the Valgrind symbols and the symbols of the program being run under Valgrind. However, I did not succeed create a name clash between the guest program symbols and Valgrind symbols. Moreover, nm on a valgrind tool (e.g. memcheck) gives a lot of globally visible text symbols (T) which do not start with the vgPlain prefix. => is using this macro (still?) needed ? (and how do we create a name clash then ?) Thanks |
|
From: Florian K. <br...@ac...> - 2011-03-24 20:44:26
|
On 03/24/2011 04:29 PM, Bart Van Assche wrote: > On Thu, Mar 24, 2011 at 8:55 PM, Florian Krohm <br...@ac...> wrote: > > Thanks for the patch. But I have to admit that I'm surprised to see > such behavior - as far as I remember on x86 and on PPC gcc 4.2.x and > g++ 4.2.x are consistent with regard to support for built-in functions > for atomic memory access. > Sorry, my mistake. I was in fact using GCC 3.4.6. Florian |
|
From: Bart V. A. <bva...@ac...> - 2011-03-24 20:30:22
|
On Thu, Mar 24, 2011 at 8:55 PM, Florian Krohm <br...@ac...> wrote: > > I'm using GCC 4.2.1 and some of the DRD test cases that are written in C++ > fail during make check. The reason is that g++ 4.2.1 does not support > __sync_add_and_fetch and friends (the C compiler does). So we need to enhance > the configury and test for the C++ compiler as well. Attached is a patch, that > fixes the problem. Thanks for the patch. But I have to admit that I'm surprised to see such behavior - as far as I remember on x86 and on PPC gcc 4.2.x and g++ 4.2.x are consistent with regard to support for built-in functions for atomic memory access. Bart. |
|
From: <sv...@va...> - 2011-03-24 20:28:04
|
Author: bart Date: 2011-03-24 20:27:54 +0000 (Thu, 24 Mar 2011) New Revision: 11665 Log: Test separately whether g++ and/or gcc support built-in functions for atomic memory access. Apparently for some distributions gcc 4.2 has that support but g++ 4.2 doesn't. This patch has been supplied by Florian Krohm. Modified: trunk/configure.in trunk/drd/tests/Makefile.am Modified: trunk/configure.in =================================================================== --- trunk/configure.in 2011-03-24 11:34:12 UTC (rev 11664) +++ trunk/configure.in 2011-03-24 20:27:54 UTC (rev 11665) @@ -1848,7 +1848,7 @@ [ ac_have_builtin_atomic=yes AC_MSG_RESULT([yes]) - AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Define to 1 if gcc supports __sync_bool_compare_and_swap() a.o.]) + AC_DEFINE(HAVE_BUILTIN_ATOMIC, 1, [Define to 1 if gcc supports __sync_bool_compare_and_swap() and __sync_add_and_fetch()]) ], [ ac_have_builtin_atomic=no @@ -1859,7 +1859,34 @@ AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC], [test x$ac_have_builtin_atomic = xyes]) +# does g++ have built-in functions for atomic memory access ? +AC_MSG_CHECKING([if g++ supports __sync_bool_compare_and_swap]) +safe_CXXFLAGS=$CXXFLAGS +CXXFLAGS="$mflag_primary" + +AC_LANG_PUSH(C++) +AC_TRY_LINK(, +[ + int variable = 1; + return (__sync_bool_compare_and_swap(&variable, 1, 2) + && __sync_add_and_fetch(&variable, 1) ? 1 : 0) +], +[ + ac_have_builtin_atomic_cxx=yes + AC_MSG_RESULT([yes]) + AC_DEFINE(HAVE_BUILTIN_ATOMIC_CXX, 1, [Define to 1 if g++ supports __sync_bool_compare_and_swap() and __sync_add_and_fetch()]) +], +[ + ac_have_builtin_atomic_cxx=no + AC_MSG_RESULT([no]) +]) +AC_LANG_POP(C++) + +CXXFLAGS=$safe_CXXFLAGS + +AM_CONDITIONAL([HAVE_BUILTIN_ATOMIC_CXX], [test x$ac_have_builtin_atomic_cxx = xyes]) + #---------------------------------------------------------------------------- # Ok. We're done checking. #---------------------------------------------------------------------------- Modified: trunk/drd/tests/Makefile.am =================================================================== --- trunk/drd/tests/Makefile.am 2011-03-24 11:34:12 UTC (rev 11664) +++ trunk/drd/tests/Makefile.am 2011-03-24 20:27:54 UTC (rev 11665) @@ -323,9 +323,13 @@ check_PROGRAMS += \ annotate_barrier \ annotate_rwlock \ + atomic_var \ + circular_buffer +endif + +if HAVE_BUILTIN_ATOMIC_CXX +check_PROGRAMS += \ annotate_smart_pointer \ - atomic_var \ - circular_buffer \ tsan_unittest endif |
|
From: Florian K. <br...@ac...> - 2011-03-24 20:16:12
|
Hello, can somebody with svn write access please add the files listed below to the respective svn:ignore lists? They are all specific to s390x except the last two which are in VEX. Thanks, Florian helgrind/vgpreload_helgrind-s390x-linux.so helgrind/helgrind-s390x-linux callgrind/callgrind-s390x-linux exp-dhat/vgpreload_exp-dhat-s390x-linux.so memcheck/memcheck-s390x-linux massif/massif-s390x-linux cachegrind/cachegrind-s390x-linux none/none-s390x-linux none/tests/s390x/add none/tests/s390x/add_EI none/tests/s390x/add_GE none/tests/s390x/and none/tests/s390x/and_EI none/tests/s390x/clc none/tests/s390x/clcle none/tests/s390x/cvb none/tests/s390x/cvd none/tests/s390x/div none/tests/s390x/ex_clone none/tests/s390x/ex_sig none/tests/s390x/flogr none/tests/s390x/icm none/tests/s390x/insert none/tests/s390x/insert_EI none/tests/s390x/lam_stam none/tests/s390x/lpr none/tests/s390x/mul none/tests/s390x/mul_GE none/tests/s390x/mvst none/tests/s390x/or none/tests/s390x/or_EI none/tests/s390x/srst none/tests/s390x/sub none/tests/s390x/sub_EI none/tests/s390x/tcxb none/tests/s390x/xc none/tests/s390x/xor none/tests/s390x/xor_EI lackey/lackey-s390x-linux drd/drd-s390x-linux drd/vgpreload_drd-s390x-linux.so VEX/.deps VEX/Makefile |
|
From: Florian K. <br...@ac...> - 2011-03-24 19:55:40
|
Hi Bart, I'm using GCC 4.2.1 and some of the DRD test cases that are written in C++ fail during make check. The reason is that g++ 4.2.1 does not support __sync_add_and_fetch and friends (the C compiler does). So we need to enhance the configury and test for the C++ compiler as well. Attached is a patch, that fixes the problem. Cheers, Florian |
|
From: <sv...@va...> - 2011-03-24 11:34:19
|
Author: sewardj
Date: 2011-03-24 11:34:12 +0000 (Thu, 24 Mar 2011)
New Revision: 11664
Log:
Add support for sys_ptrace. Fixes #269079.
(Ulrich Weigand, uwe...@de...)
Modified:
trunk/coregrind/m_syswrap/syswrap-arm-linux.c
Modified: trunk/coregrind/m_syswrap/syswrap-arm-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-arm-linux.c 2011-03-24 11:33:00 UTC (rev 11663)
+++ trunk/coregrind/m_syswrap/syswrap-arm-linux.c 2011-03-24 11:34:12 UTC (rev 11664)
@@ -342,6 +342,7 @@
DECL_TEMPLATE(arm_linux, sys_rt_sigreturn);
DECL_TEMPLATE(arm_linux, sys_set_tls);
DECL_TEMPLATE(arm_linux, sys_cacheflush);
+DECL_TEMPLATE(arm_linux, sys_ptrace);
PRE(sys_socketcall)
{
@@ -1205,7 +1206,125 @@
SET_STATUS_Success(0);
}
+// ARG3 is only used for pointers into the traced process's address
+// space and for offsets into the traced process's struct
+// user_regs_struct. It is never a pointer into this process's memory
+// space, and we should therefore not check anything it points to.
+PRE(sys_ptrace)
+{
+ PRINT("sys_ptrace ( %ld, %ld, %#lx, %#lx )", ARG1,ARG2,ARG3,ARG4);
+ PRE_REG_READ4(int, "ptrace",
+ long, request, long, pid, long, addr, long, data);
+ switch (ARG1) {
+ case VKI_PTRACE_PEEKTEXT:
+ case VKI_PTRACE_PEEKDATA:
+ case VKI_PTRACE_PEEKUSR:
+ PRE_MEM_WRITE( "ptrace(peek)", ARG4,
+ sizeof (long));
+ break;
+ case VKI_PTRACE_GETREGS:
+ PRE_MEM_WRITE( "ptrace(getregs)", ARG4,
+ sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_GETFPREGS:
+ PRE_MEM_WRITE( "ptrace(getfpregs)", ARG4,
+ sizeof (struct vki_user_fp));
+ break;
+ case VKI_PTRACE_GETWMMXREGS:
+ PRE_MEM_WRITE( "ptrace(getwmmxregs)", ARG4,
+ VKI_IWMMXT_SIZE);
+ break;
+ case VKI_PTRACE_GETCRUNCHREGS:
+ PRE_MEM_WRITE( "ptrace(getcrunchregs)", ARG4,
+ VKI_CRUNCH_SIZE);
+ break;
+ case VKI_PTRACE_GETVFPREGS:
+ PRE_MEM_WRITE( "ptrace(getvfpregs)", ARG4,
+ sizeof (struct vki_user_vfp) );
+ break;
+ case VKI_PTRACE_GETHBPREGS:
+ PRE_MEM_WRITE( "ptrace(gethbpregs)", ARG4,
+ sizeof (unsigned long) );
+ break;
+ case VKI_PTRACE_SETREGS:
+ PRE_MEM_READ( "ptrace(setregs)", ARG4,
+ sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_SETFPREGS:
+ PRE_MEM_READ( "ptrace(setfpregs)", ARG4,
+ sizeof (struct vki_user_fp));
+ break;
+ case VKI_PTRACE_SETWMMXREGS:
+ PRE_MEM_READ( "ptrace(setwmmxregs)", ARG4,
+ VKI_IWMMXT_SIZE);
+ break;
+ case VKI_PTRACE_SETCRUNCHREGS:
+ PRE_MEM_READ( "ptrace(setcrunchregs)", ARG4,
+ VKI_CRUNCH_SIZE);
+ break;
+ case VKI_PTRACE_SETVFPREGS:
+ PRE_MEM_READ( "ptrace(setvfpregs)", ARG4,
+ sizeof (struct vki_user_vfp));
+ break;
+ case VKI_PTRACE_SETHBPREGS:
+ PRE_MEM_READ( "ptrace(sethbpregs)", ARG4, sizeof(unsigned long));
+ break;
+ case VKI_PTRACE_GET_THREAD_AREA:
+ PRE_MEM_WRITE( "ptrace(get_thread_area)", ARG4, sizeof(unsigned long));
+ break;
+ case VKI_PTRACE_GETEVENTMSG:
+ PRE_MEM_WRITE( "ptrace(geteventmsg)", ARG4, sizeof(unsigned long));
+ break;
+ case VKI_PTRACE_GETSIGINFO:
+ PRE_MEM_WRITE( "ptrace(getsiginfo)", ARG4, sizeof(vki_siginfo_t));
+ break;
+ case VKI_PTRACE_SETSIGINFO:
+ PRE_MEM_READ( "ptrace(setsiginfo)", ARG4, sizeof(vki_siginfo_t));
+ break;
+ default:
+ break;
+ }
+}
+POST(sys_ptrace)
+{
+ switch (ARG1) {
+ case VKI_PTRACE_PEEKTEXT:
+ case VKI_PTRACE_PEEKDATA:
+ case VKI_PTRACE_PEEKUSR:
+ POST_MEM_WRITE( ARG4, sizeof (long));
+ break;
+ case VKI_PTRACE_GETREGS:
+ POST_MEM_WRITE( ARG4, sizeof (struct vki_user_regs_struct));
+ break;
+ case VKI_PTRACE_GETFPREGS:
+ POST_MEM_WRITE( ARG4, sizeof (struct vki_user_fp));
+ break;
+ case VKI_PTRACE_GETWMMXREGS:
+ POST_MEM_WRITE( ARG4, VKI_IWMMXT_SIZE);
+ break;
+ case VKI_PTRACE_GETCRUNCHREGS:
+ POST_MEM_WRITE( ARG4, VKI_CRUNCH_SIZE);
+ break;
+ case VKI_PTRACE_GETVFPREGS:
+ POST_MEM_WRITE( ARG4, sizeof(struct vki_user_vfp));
+ break;
+ case VKI_PTRACE_GET_THREAD_AREA:
+ case VKI_PTRACE_GETHBPREGS:
+ case VKI_PTRACE_GETEVENTMSG:
+ POST_MEM_WRITE( ARG4, sizeof(unsigned long));
+ break;
+ case VKI_PTRACE_GETSIGINFO:
+ /* XXX: This is a simplification. Different parts of the
+ * siginfo_t are valid depending on the type of signal.
+ */
+ POST_MEM_WRITE( ARG4, sizeof(vki_siginfo_t));
+ break;
+ default:
+ break;
+ }
+}
+
#undef PRE
#undef POST
@@ -1262,7 +1381,7 @@
LINX_(__NR_getuid, sys_getuid16), // 24 ## P
//zz
//zz // (__NR_stime, sys_stime), // 25 * (SVr4,SVID,X/OPEN)
-// PLAXY(__NR_ptrace, sys_ptrace), // 26
+ PLAXY(__NR_ptrace, sys_ptrace), // 26
GENX_(__NR_alarm, sys_alarm), // 27
//zz // (__NR_oldfstat, sys_fstat), // 28 * L -- obsolete
GENX_(__NR_pause, sys_pause), // 29
|
|
From: <sv...@va...> - 2011-03-24 11:33:08
|
Author: sewardj
Date: 2011-03-24 11:33:00 +0000 (Thu, 24 Mar 2011)
New Revision: 11663
Log:
Definitions relating to ptrace: replace bogus x86 versions with
arm specific versions. Partial fix for #269079.
(Ulrich Weigand, uwe...@de...)
Modified:
trunk/include/vki/vki-arm-linux.h
Modified: trunk/include/vki/vki-arm-linux.h
===================================================================
--- trunk/include/vki/vki-arm-linux.h 2011-03-24 08:58:42 UTC (rev 11662)
+++ trunk/include/vki/vki-arm-linux.h 2011-03-24 11:33:00 UTC (rev 11663)
@@ -34,6 +34,10 @@
// arm is little-endian.
#define VKI_LITTLE_ENDIAN 1
+// The various comments below indicating i386-ness should be regarded
+// with great skepticism -- they are quite possibly wrong. But see
+// also bug 269079 comment 0.
+
//----------------------------------------------------------------------
// From linux-2.6.8.1/include/asm-i386/types.h
//----------------------------------------------------------------------
@@ -190,43 +194,6 @@
// From linux-2.6.8.1/include/asm-i386/sigcontext.h
//----------------------------------------------------------------------
-struct _vki_fpreg {
- unsigned short significand[4];
- unsigned short exponent;
-};
-
-struct _vki_fpxreg {
- unsigned short significand[4];
- unsigned short exponent;
- unsigned short padding[3];
-};
-
-struct _vki_xmmreg {
- unsigned long element[4];
-};
-
-struct _vki_fpstate {
- /* Regular FPU environment */
- unsigned long cw;
- unsigned long sw;
- unsigned long tag;
- unsigned long ipoff;
- unsigned long cssel;
- unsigned long dataoff;
- unsigned long datasel;
- struct _vki_fpreg _st[8];
- unsigned short status;
- unsigned short magic; /* 0xffff = regular FPU data only */
-
- /* FXSR FPU environment */
- unsigned long _fxsr_env[6]; /* FXSR FPU env is ignored */
- unsigned long mxcsr;
- unsigned long reserved;
- struct _vki_fpxreg _fxsr_st[8]; /* FXSR FPU reg data is ignored */
- struct _vki_xmmreg _xmm[8];
- unsigned long padding[56];
-};
-
struct vki_sigcontext {
unsigned long trap_no;
unsigned long error_code;
@@ -546,33 +513,41 @@
// From linux-2.6.8.1/include/asm-i386/user.h
//----------------------------------------------------------------------
-struct vki_user_i387_struct {
- long cwd;
- long swd;
- long twd;
- long fip;
- long fcs;
- long foo;
- long fos;
- long st_space[20]; /* 8*10 bytes for each FP-reg = 80 bytes */
+struct vki_user_fp {
+ struct vki_fp_reg {
+ unsigned int sign1:1;
+ unsigned int unused:15;
+ unsigned int sign2:1;
+ unsigned int exponent:14;
+ unsigned int j:1;
+ unsigned int mantissa1:31;
+ unsigned int mantissa0:32;
+ } fpregs[8];
+ unsigned int fpsr:32;
+ unsigned int fpcr:32;
+ unsigned char ftype[8];
+ unsigned int init_flag;
};
-struct vki_user_fxsr_struct {
- unsigned short cwd;
- unsigned short swd;
- unsigned short twd;
- unsigned short fop;
- long fip;
- long fcs;
- long foo;
- long fos;
- long mxcsr;
- long reserved;
- long st_space[32]; /* 8*16 bytes for each FP-reg = 128 bytes */
- long xmm_space[32]; /* 8*16 bytes for each XMM-reg = 128 bytes */
- long padding[56];
+struct vki_user_vfp {
+ unsigned long long fpregs[32];
+ unsigned long fpscr;
};
+#define VKI_IWMMXT_SIZE 0x98
+
+struct vki_iwmmxt_struct {
+ unsigned int save[VKI_IWMMXT_SIZE / sizeof(unsigned int)];
+};
+
+struct vki_crunch_state {
+ unsigned int mvdx[16][2];
+ unsigned int mvax[4][3];
+ unsigned int dspsc[2];
+};
+
+#define VKI_CRUNCH_SIZE sizeof(struct vki_crunch_state)
+
struct vki_user_regs_struct {
long uregs[18];
};
@@ -603,8 +578,7 @@
#define VKI_ELF_NGREG (sizeof (struct vki_user_regs_struct) / sizeof(vki_elf_greg_t))
typedef vki_elf_greg_t vki_elf_gregset_t[VKI_ELF_NGREG];
-typedef struct vki_user_i387_struct vki_elf_fpregset_t;
-typedef struct vki_user_fxsr_struct vki_elf_fpxregset_t;
+typedef struct vki_user_fp vki_elf_fpregset_t;
#define VKI_AT_SYSINFO 32
@@ -799,8 +773,16 @@
#define VKI_PTRACE_SETREGS 13
#define VKI_PTRACE_GETFPREGS 14
#define VKI_PTRACE_SETFPREGS 15
-#define VKI_PTRACE_GETFPXREGS 18
-#define VKI_PTRACE_SETFPXREGS 19
+#define VKI_PTRACE_GETWMMXREGS 18
+#define VKI_PTRACE_SETWMMXREGS 19
+#define VKI_PTRACE_GET_THREAD_AREA 22
+#define VKI_PTRACE_SET_SYSCALL 23
+#define VKI_PTRACE_GETCRUNCHREGS 25
+#define VKI_PTRACE_SETCRUNCHREGS 26
+#define VKI_PTRACE_GETVFPREGS 27
+#define VKI_PTRACE_SETVFPREGS 28
+#define VKI_PTRACE_GETHBPREGS 29
+#define VKI_PTRACE_SETHBPREGS 30
//----------------------------------------------------------------------
// From linux-2.6.15.4/include/asm-i386/vm86.h
|
|
From: <sv...@va...> - 2011-03-24 11:14:10
|
Author: sewardj
Date: 2011-03-24 11:14:02 +0000 (Thu, 24 Mar 2011)
New Revision: 2116
Log:
Handle more cases of SUB (SP minus immediate/register). Also
tighten up checks for SP plus register. Fixes #269078.
(Ulrich Weigand, uwe...@de...)
Modified:
trunk/priv/guest_arm_toIR.c
Modified: trunk/priv/guest_arm_toIR.c
===================================================================
--- trunk/priv/guest_arm_toIR.c 2011-03-24 09:01:50 UTC (rev 2115)
+++ trunk/priv/guest_arm_toIR.c 2011-03-24 11:14:02 UTC (rev 2116)
@@ -16010,8 +16010,9 @@
UInt rN = INSN0(3,0);
UInt rD = INSN1(11,8);
Bool valid = !isBadRegT(rN) && !isBadRegT(rD);
- /* but allow "sub.w sp, sp, #constT" */
- if (!valid && !isRSB && rN == 13 && rD == 13)
+ /* but allow "sub{s}.w reg, sp, #constT
+ this is (T2) of "SUB (SP minus immediate)" */
+ if (!valid && !isRSB && rN == 13 && rD != 15)
valid = True;
if (valid) {
IRTemp argL = newTemp(Ity_I32);
@@ -16158,14 +16159,16 @@
UInt how = INSN1(5,4);
Bool valid = !isBadRegT(rD) && !isBadRegT(rN) && !isBadRegT(rM);
- /* but allow "add.w reg, sp, reg w/ no shift */
+ /* but allow "add.w reg, sp, reg w/ no shift
+ (T3) "ADD (SP plus register) */
if (!valid && INSN0(8,5) == BITS4(1,0,0,0) // add
- && rN == 13 && imm5 == 0 && how == 0) {
+ && rD != 15 && rN == 13 && imm5 == 0 && how == 0) {
valid = True;
}
- /* also allow "sub.w sp, sp, reg w/ no shift */
- if (!valid && INSN0(8,5) == BITS4(1,1,0,1) // add
- && rD == 13 && rN == 13 && imm5 == 0 && how == 0) {
+ /* also allow "sub.w reg, sp, reg w/ no shift
+ (T1) "SUB (SP minus register) */
+ if (!valid && INSN0(8,5) == BITS4(1,1,0,1) // sub
+ && rD != 15 && rN == 13 && imm5 == 0 && how == 0) {
valid = True;
}
if (valid) {
|
|
From: <sv...@va...> - 2011-03-24 09:01:59
|
Author: sewardj
Date: 2011-03-24 09:01:50 +0000 (Thu, 24 Mar 2011)
New Revision: 2115
Log:
s390x: MHY is not universally available. Fixes #268930.
(Florian Krohm, br...@ac...)
Modified:
trunk/priv/host_s390_defs.c
Modified: trunk/priv/host_s390_defs.c
===================================================================
--- trunk/priv/host_s390_defs.c 2011-03-24 08:57:29 UTC (rev 2114)
+++ trunk/priv/host_s390_defs.c 2011-03-24 09:01:50 UTC (rev 2115)
@@ -3338,7 +3338,7 @@
/*--- Wrapper functions ---*/
/*------------------------------------------------------------*/
-/* r1[32:63],r1+1[32:63] = r1+1[32:63] * memory[op2addr][32:63] */
+/* r1[32:63],r1+1[32:63] = r1+1[32:63] * memory[op2addr][0:31] */
static UChar *
s390_emit_MFYw(UChar *p, UChar r1, UChar x, UChar b, UShort dl, UChar dh)
{
@@ -3351,6 +3351,19 @@
return s390_emit_MR(p, r1, R0);
}
+/* r1[32:63] = r1[32:63] * memory[op2addr][0:15] */
+static UChar *
+s390_emit_MHYw(UChar *p, UChar r1, UChar x, UChar b, UShort dl, UChar dh)
+{
+ if (s390_host_has_gie) {
+ return s390_emit_MHY(p, r1, x, b, dl, dh);
+ }
+
+ /* Load from memory into R0, then MULTIPLY with R1 */
+ p = s390_emit_LHY(p, R0, x, b, dl, dh);
+ return s390_emit_MSR(p, r1, R0);
+}
+
/* r1[32:63] = r1[32:63] * i2 */
static UChar *
s390_emit_MSFIw(UChar *p, UChar r1, UInt i2)
@@ -5023,7 +5036,7 @@
return s390_emit_SHY(buf, dst, x, b, DISP20(d));
case S390_ALU_MUL:
- return s390_emit_MHY(buf, dst, x, b, DISP20(d));
+ return s390_emit_MHYw(buf, dst, x, b, DISP20(d));
/* For bitwise operations: Move two bytes from memory into scratch
register r0; then perform operation */
|
|
From: <sv...@va...> - 2011-03-24 08:58:50
|
Author: sewardj
Date: 2011-03-24 08:58:42 +0000 (Thu, 24 Mar 2011)
New Revision: 11662
Log:
Test improvements for FLOGR. Part of #268715.
(Florian Krohm, br...@ac...)
Modified:
trunk/none/tests/s390x/flogr.c
Modified: trunk/none/tests/s390x/flogr.c
===================================================================
--- trunk/none/tests/s390x/flogr.c 2011-03-22 16:49:25 UTC (rev 11661)
+++ trunk/none/tests/s390x/flogr.c 2011-03-24 08:58:42 UTC (rev 11662)
@@ -1,15 +1,25 @@
#include <stdio.h>
+/* The FLOGR insn reads from register R2 and writes to register R1 and
+ R1 + 1. So we need to distinguish three cases:
+ (1) All three registers R1, R1 + 1, and R2 are distinct
+ (2) R2 == R1
+ (3) R2 == R1 + 1
+
+ These are tested by flogr1, flogr2, and flogr3, respectively. */
+
/* Call FLOGR on INPUT. The results are returned through the parms. */
+
+/* R2 != R1 && R2 != R1 + 1 */
void
-flogr(unsigned long input, unsigned long *bitpos, unsigned long *modval,
- unsigned int *cc)
+flogr1(unsigned long input, unsigned long *bitpos, unsigned long *modval,
+ unsigned int *cc)
{
unsigned int psw;
register unsigned long value asm("4") = input;
- asm volatile ( "flogr 2, %[val]\n\t"
+ asm volatile ( ".long 0xB9830024\n\t" // "flogr 2, %[val]\n\t"
"ipm %[psw]\n\t"
"stg 2, %[bitpos]\n\t"
"stg 3, %[modval]\n\t"
@@ -25,16 +35,65 @@
#endif
}
+/* R2 == R1 */
void
-runtest(void)
+flogr2(unsigned long input, unsigned long *bitpos, unsigned long *modval,
+ unsigned int *cc)
{
+ unsigned int psw;
+ register unsigned long value asm("2") = input;
+
+ asm volatile ( ".long 0xB9830022\n\t" // "flogr 2, %[val]\n\t"
+ "ipm %[psw]\n\t"
+ "stg 2, %[bitpos]\n\t"
+ "stg 3, %[modval]\n\t"
+ : [bitpos]"=m"(*bitpos), [modval]"=m"(*modval),
+ [psw]"=d"(psw), [val] "+d"(value)
+ :
+ : "3", "cc");
+
+ *cc = psw >> 28;
+#if 0
+ printf("value = %lx, bitpos = %lu, modval = %lx, cc = %d\n",
+ value, *bitpos, *modval, *cc);
+#endif
+}
+
+/* R2 == R1 + 1 */
+void
+flogr3(unsigned long input, unsigned long *bitpos, unsigned long *modval,
+ unsigned int *cc)
+{
+ unsigned int psw;
+ register unsigned long value asm("3") = input;
+
+ asm volatile ( ".long 0xB9830023\n\t" // "flogr 2, %[val]\n\t"
+ "ipm %[psw]\n\t"
+ "stg 2, %[bitpos]\n\t"
+ "stg 3, %[modval]\n\t"
+ : [bitpos]"=m"(*bitpos), [modval]"=m"(*modval),
+ [psw]"=d"(psw), [val] "+d"(value)
+ :
+ : "2", "cc");
+
+ *cc = psw >> 28;
+#if 0
+ printf("value = %lx, bitpos = %lu, modval = %lx, cc = %d\n",
+ value, *bitpos, *modval, *cc);
+#endif
+}
+
+void
+runtest(void (*func)(unsigned long, unsigned long *, unsigned long *,
+ unsigned int *))
+{
unsigned long bitpos, modval, value;
unsigned int cc;
int i;
/* Value 0 is special */
value = 0;
- flogr(value, &bitpos, &modval, &cc);
+ func(value, &bitpos, &modval, &cc);
if (modval != 0) fprintf(stderr, "modval is wrong for %lx\n", value);
if (bitpos != 64) fprintf(stderr, "bitpos is wrong for %lx\n", value);
if (cc != 0) fprintf(stderr, "cc is wrong for %lx\n", value);
@@ -42,7 +101,7 @@
/* Test with exactly 1 bit set */
for (i = 0; i < 64; ++i) {
value = 1ull << i;
- flogr(value, &bitpos, &modval, &cc);
+ func(value, &bitpos, &modval, &cc);
if (modval != 0) fprintf(stderr, "modval is wrong for %lx\n", value);
if (bitpos != 63 - i) fprintf(stderr, "bitpos is wrong for %lx\n", value);
if (cc != 2) fprintf(stderr, "cc is wrong for %lx\n", value);
@@ -52,7 +111,7 @@
for (i = 1; i < 64; ++i) {
value = 1ull << i;
value = value | (value - 1);
- flogr(value, &bitpos, &modval, &cc);
+ func(value, &bitpos, &modval, &cc);
if (modval != (value >> 1)) fprintf(stderr, "modval is wrong for %lx\n", value);
if (bitpos != 63 - i) fprintf(stderr, "bitpos is wrong for %lx\n", value);
if (cc != 2) fprintf(stderr, "cc is wrong for %lx\n", value);
@@ -62,7 +121,9 @@
int main()
{
- runtest();
+ runtest(flogr1);
+ runtest(flogr2);
+ runtest(flogr3);
return 0;
}
|
|
From: <sv...@va...> - 2011-03-24 08:57:38
|
Author: sewardj
Date: 2011-03-24 08:57:29 +0000 (Thu, 24 Mar 2011)
New Revision: 2114
Log:
s390x: FLOGR is not universally available. Fixes #268715.
(Florian Krohm, br...@ac...)
Modified:
trunk/priv/host_s390_defs.c
trunk/priv/host_s390_defs.h
trunk/priv/host_s390_isel.c
Modified: trunk/priv/host_s390_defs.c
===================================================================
--- trunk/priv/host_s390_defs.c 2011-03-24 08:50:04 UTC (rev 2113)
+++ trunk/priv/host_s390_defs.c 2011-03-24 08:57:29 UTC (rev 2114)
@@ -574,10 +574,10 @@
s390_opnd_RMI_get_reg_usage(u, insn->variant.divs.op2);
break;
- case S390_INSN_FLOGR:
- addHRegUse(u, HRmWrite, insn->variant.flogr.bitpos);
- addHRegUse(u, HRmWrite, insn->variant.flogr.modval);
- s390_opnd_RMI_get_reg_usage(u, insn->variant.flogr.src);
+ case S390_INSN_CLZ:
+ addHRegUse(u, HRmWrite, insn->variant.clz.num_bits);
+ addHRegUse(u, HRmWrite, insn->variant.clz.clobber);
+ s390_opnd_RMI_get_reg_usage(u, insn->variant.clz.src);
break;
case S390_INSN_UNOP:
@@ -781,10 +781,10 @@
s390_opnd_RMI_map_regs(m, &insn->variant.divs.op2);
break;
- case S390_INSN_FLOGR:
- insn->variant.flogr.bitpos = lookupHRegRemap(m, insn->variant.flogr.bitpos);
- insn->variant.flogr.modval = lookupHRegRemap(m, insn->variant.flogr.modval);
- s390_opnd_RMI_map_regs(m, &insn->variant.flogr.src);
+ case S390_INSN_CLZ:
+ insn->variant.clz.num_bits = lookupHRegRemap(m, insn->variant.clz.num_bits);
+ insn->variant.clz.clobber = lookupHRegRemap(m, insn->variant.clz.clobber);
+ s390_opnd_RMI_map_regs(m, &insn->variant.clz.src);
break;
case S390_INSN_UNOP:
@@ -3818,19 +3818,19 @@
s390_insn *
-s390_insn_flogr(UChar size, HReg bitpos, HReg modval, s390_opnd_RMI src)
+s390_insn_clz(UChar size, HReg num_bits, HReg clobber, s390_opnd_RMI src)
{
s390_insn *insn = LibVEX_Alloc(sizeof(s390_insn));
vassert(size == 8);
- vassert(! hregIsVirtual(bitpos));
- vassert(! hregIsVirtual(modval));
+ vassert(! hregIsVirtual(num_bits));
+ vassert(! hregIsVirtual(clobber));
- insn->tag = S390_INSN_FLOGR;
+ insn->tag = S390_INSN_CLZ;
insn->size = size;
- insn->variant.flogr.bitpos = bitpos; /* bit position */
- insn->variant.flogr.modval = modval; /* modified input value */
- insn->variant.flogr.src = src;
+ insn->variant.clz.num_bits = num_bits;
+ insn->variant.clz.clobber = clobber;
+ insn->variant.clz.src = src;
return insn;
}
@@ -4329,9 +4329,9 @@
&insn->variant.divs.op2);
break;
- case S390_INSN_FLOGR:
- s390_sprintf(buf, "%M %R,%O", "v-flogr", insn->variant.flogr.bitpos,
- &insn->variant.flogr.src);
+ case S390_INSN_CLZ:
+ s390_sprintf(buf, "%M %R,%O", "v-clz", insn->variant.clz.num_bits,
+ &insn->variant.clz.src);
break;
case S390_INSN_UNOP:
@@ -6003,49 +6003,75 @@
static UChar *
-s390_insn_flogr_emit(UChar *buf, const s390_insn *insn)
+s390_insn_clz_emit(UChar *buf, const s390_insn *insn)
{
s390_opnd_RMI src;
- UChar r1, r1p1;
+ UChar r1, r1p1, r2, *p;
- r1 = hregNumber(insn->variant.flogr.bitpos);
- r1p1 = hregNumber(insn->variant.flogr.modval);
+ r1 = hregNumber(insn->variant.clz.num_bits);
+ r1p1 = hregNumber(insn->variant.clz.clobber);
vassert((r1 & 0x1) == 0);
vassert(r1p1 == r1 + 1);
- src = insn->variant.flogr.src;
+ p = buf;
+ src = insn->variant.clz.src;
+ /* Get operand and move it to r2 */
switch (src.tag) {
- case S390_OPND_REG: {
- UInt r2 = hregNumber(src.variant.reg);
+ case S390_OPND_REG:
+ r2 = hregNumber(src.variant.reg);
+ break;
- return s390_emit_FLOGR(buf, r1, r2);
- }
-
case S390_OPND_AMODE: {
const s390_amode *am = src.variant.am;
UChar b = hregNumber(am->b);
UChar x = hregNumber(am->x);
Int d = am->d;
- buf = s390_emit_LG(buf, R0, x, b, DISP20(d));
- return s390_emit_FLOGR(buf, r1, R0);
+ p = s390_emit_LG(p, R0, x, b, DISP20(d));
+ r2 = R0;
+ break;
}
case S390_OPND_IMMEDIATE: {
ULong value = src.variant.imm;
- buf = s390_emit_load_64imm(buf, R0, value);
- return s390_emit_FLOGR(buf, r1, R0);
+ p = s390_emit_load_64imm(p, R0, value);
+ r2 = R0;
+ break;
}
default:
goto fail;
}
+ /* Use FLOGR if you can */
+ if (s390_host_has_eimm) {
+ return s390_emit_FLOGR(p, r1, r2);
+ }
+
+ /*
+ r0 = r2;
+ r1 = 64;
+ while (r0 != 0) {
+ r1 -= 1;
+ r0 >>= 1;
+ }
+ */
+ p = s390_emit_LTGR(p, R0, r2);
+ p = s390_emit_LLILL(p, r1, 64);
+
+ p = s390_emit_BRC(p, S390_CC_E, (4 + 4 + 6 + 4 + 4)/ 2); /* 4 bytes */
+ p = s390_emit_AGHI(p, r1, (UShort)-1); /* r1 -= 1; 4 bytes */
+ p = s390_emit_SRLG(p, R0, R0, R0, DISP20(1)); /* r0 >>= 1; 6 bytes */
+ p = s390_emit_LTGR(p, R0, R0); /* set cc 4 bytes */
+ p = s390_emit_BRC(p, S390_CC_NE, /* 4 bytes */
+ (UShort)(-(4 + 6 + 4) / 2));
+ return p;
+
fail:
- vpanic("s390_insn_flogr_emit");
+ vpanic("s390_insn_clz_emit");
}
@@ -6721,8 +6747,8 @@
end = s390_insn_divs_emit(buf, insn);
break;
- case S390_INSN_FLOGR:
- end = s390_insn_flogr_emit(buf, insn);
+ case S390_INSN_CLZ:
+ end = s390_insn_clz_emit(buf, insn);
break;
case S390_INSN_UNOP:
Modified: trunk/priv/host_s390_defs.h
===================================================================
--- trunk/priv/host_s390_defs.h 2011-03-24 08:50:04 UTC (rev 2113)
+++ trunk/priv/host_s390_defs.h 2011-03-24 08:57:29 UTC (rev 2114)
@@ -131,7 +131,7 @@
S390_INSN_MUL, /* n-bit operands; 2n-bit result */
S390_INSN_DIV, /* 2n-bit dividend; n-bit divisor; n-bit quot/rem */
S390_INSN_DIVS, /* n-bit dividend; n-bit divisor; n-bit quot/rem */
- S390_INSN_FLOGR,
+ S390_INSN_CLZ, /* count left-most zeroes */
S390_INSN_UNOP,
S390_INSN_TEST, /* test operand and set cc */
S390_INSN_CC2BOOL,/* convert condition code to 0/1 */
@@ -308,10 +308,10 @@
s390_opnd_RMI op2;
} divs;
struct {
- HReg bitpos; /* position of leftmost '1' bit r10 */
- HReg modval; /* modified input value r11 */
+ HReg num_bits; /* number of leftmost '0' bits r10 */
+ HReg clobber; /* unspecified r11 */
s390_opnd_RMI src;
- } flogr;
+ } clz;
struct {
s390_unop_t tag;
HReg dst;
@@ -418,8 +418,8 @@
s390_insn *s390_insn_div(UChar size, HReg op1_hi, HReg op1_lo,
s390_opnd_RMI op2, Bool signed_divide);
s390_insn *s390_insn_divs(UChar size, HReg rem, HReg op1, s390_opnd_RMI op2);
-s390_insn *s390_insn_flogr(UChar size, HReg bitpos, HReg modval,
- s390_opnd_RMI op);
+s390_insn *s390_insn_clz(UChar size, HReg num_bits, HReg clobber,
+ s390_opnd_RMI op);
s390_insn *s390_insn_cas(UChar size, HReg op1, s390_amode *op2, HReg op3,
HReg old);
s390_insn *s390_insn_unop(UChar size, s390_unop_t tag, HReg dst,
Modified: trunk/priv/host_s390_isel.c
===================================================================
--- trunk/priv/host_s390_isel.c 2011-03-24 08:50:04 UTC (rev 2113)
+++ trunk/priv/host_s390_isel.c 2011-03-24 08:57:29 UTC (rev 2114)
@@ -1182,17 +1182,14 @@
case Iop_Clz64: {
HReg r10, r11;
- /* We use non-virtual registers r10 and r11 as pair for the two
- output values */
+ /* This will be implemented using FLOGR, if possible. So we need to
+ set aside a pair of non-virtual registers. The result (number of
+ left-most zero bits) will be in r10. The value in r11 is unspecified
+ and must not be used. */
r10 = make_gpr(env, 10);
r11 = make_gpr(env, 11);
- /* flogr */
- addInstr(env, s390_insn_flogr(8, r10, r11, opnd));
-
- /* The result is in registers r10 (bit position) and r11 (modified
- input value). The value in r11 is not needed and will be
- discarded. */
+ addInstr(env, s390_insn_clz(8, r10, r11, opnd));
addInstr(env, s390_insn_move(8, dst, r10));
return dst;
}
|
|
From: <sv...@va...> - 2011-03-24 08:50:13
|
Author: sewardj
Date: 2011-03-24 08:50:04 +0000 (Thu, 24 Mar 2011)
New Revision: 2113
Log:
s390x: improve IR generation for XC. Fixes #268621.
(Florian Krohm, br...@ac...)
Modified:
trunk/priv/guest_s390_toIR.c
Modified: trunk/priv/guest_s390_toIR.c
===================================================================
--- trunk/priv/guest_s390_toIR.c 2011-03-22 16:51:38 UTC (rev 2112)
+++ trunk/priv/guest_s390_toIR.c 2011-03-24 08:50:04 UTC (rev 2113)
@@ -9112,6 +9112,45 @@
return "xc";
}
+static void
+s390_irgen_XC_sameloc(UChar length, UChar b, UShort d)
+{
+ IRTemp counter = newTemp(Ity_I32);
+ IRTemp start = newTemp(Ity_I64);
+ IRTemp addr = newTemp(Ity_I64);
+
+ assign(start,
+ binop(Iop_Add64, mkU64(d), b != 0 ? get_gpr_dw0(b) : mkU64(0)));
+
+ if (length < 8) {
+ UInt i;
+
+ for (i = 0; i <= length; ++i) {
+ store(binop(Iop_Add64, mkexpr(start), mkU64(i)), mkU8(0));
+ }
+ } else {
+ assign(counter, get_counter_w0());
+
+ assign(addr, binop(Iop_Add64, mkexpr(start),
+ unop(Iop_32Uto64, mkexpr(counter))));
+
+ store(mkexpr(addr), mkU8(0));
+
+ /* Check for end of field */
+ put_counter_w0(binop(Iop_Add32, mkexpr(counter), mkU32(1)));
+ if_condition_goto(binop(Iop_CmpNE32, mkexpr(counter), mkU32(length)),
+ guest_IA_curr_instr);
+
+ /* Reset counter */
+ put_counter_dw0(mkU64(0));
+ }
+
+ s390_cc_thunk_put1(S390_CC_OP_BITWISE, mktemp(Ity_I32, mkU32(0)), False);
+
+ if (unlikely(vex_traceflags & VEX_TRACE_FE))
+ s390_disasm(ENC3(MNM, UDLB, UDXB), "xc", d, length, b, d, 0, b);
+}
+
static HChar *
s390_irgen_NC(UChar length, IRTemp start1, IRTemp start2)
{
@@ -12565,9 +12604,14 @@
case 0xd6ULL: s390_format_SS_L0RDRD(s390_irgen_OC, ovl.fmt.SS.l,
ovl.fmt.SS.b1, ovl.fmt.SS.d1,
ovl.fmt.SS.b2, ovl.fmt.SS.d2); goto ok;
- case 0xd7ULL: s390_format_SS_L0RDRD(s390_irgen_XC, ovl.fmt.SS.l,
- ovl.fmt.SS.b1, ovl.fmt.SS.d1,
- ovl.fmt.SS.b2, ovl.fmt.SS.d2); goto ok;
+ case 0xd7ULL:
+ if (ovl.fmt.SS.b1 == ovl.fmt.SS.b2 && ovl.fmt.SS.d1 == ovl.fmt.SS.d2)
+ s390_irgen_XC_sameloc(ovl.fmt.SS.l, ovl.fmt.SS.b1, ovl.fmt.SS.d1);
+ else
+ s390_format_SS_L0RDRD(s390_irgen_XC, ovl.fmt.SS.l,
+ ovl.fmt.SS.b1, ovl.fmt.SS.d1,
+ ovl.fmt.SS.b2, ovl.fmt.SS.d2);
+ goto ok;
case 0xd9ULL: /* MVCK */ goto unimplemented;
case 0xdaULL: /* MVCP */ goto unimplemented;
case 0xdbULL: /* MVCS */ goto unimplemented;
|