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
(9) |
2
(11) |
3
(3) |
4
(7) |
5
(15) |
|
6
(10) |
7
(9) |
8
(12) |
9
(10) |
10
(6) |
11
(12) |
12
(12) |
|
13
(11) |
14
(14) |
15
(18) |
16
(15) |
17
(19) |
18
(15) |
19
(9) |
|
20
|
21
(5) |
22
(10) |
23
(15) |
24
(18) |
25
(20) |
26
(15) |
|
27
(14) |
28
(11) |
29
(17) |
30
(17) |
31
(23) |
|
|
|
From: Julian S. <js...@ac...> - 2014-07-22 20:55:51
|
> What I stumbled upon was: why does the ops array contain the > Iop_INVALID value in the first place? Given that you never want to > return it. The arm64 simd instructions operate on 128-bit registers. Pretty much all of the instructions contain a two-bit "size" field indicating the lane configuration, like this 00 16 lanes of 8 bits (8x16) 01 8 lanes of 16 bits (16x8) 10 4 lanes of 32 bits (32x4) 11 2 lanes of 64 bits (64x2) and it is convenient to simply take the field and pass it to one of the mkVecXXX functions, to get an IR primitive with the correct laneage. The problem is that not all instructions support all lane formats -- for example add supports all formats, but mul does not support 64x2, and that is reflected by Iop_INVALID in the last entry for mkVecMUL. Other instructions don't support the narrowest configuration (00). Removing the leading Iop_INVALID array entries in these cases (eg, mkVecQDMULLS) would require the caller subtracting 1 from the size field in the instruction, which is kind of inconvenient and inconsistent. How it is at the moment, the mkVecXXX functions have a uniform interface in that you just give them a "size" value without regard to which values are actually valid, and if you give it something invalid then you get back Iop_INVALID. In fact the callers of the mkVecXXX functions are very careful to throw out size values that are not supported by the hardware, so that the front end doesn't accidentally accept non-existent instructions. So in fact there should be no calls that really result in Iop_INVALID being returned. J |
|
From: Florian K. <fl...@ei...> - 2014-07-22 17:54:23
|
On 22.07.2014 18:21, Julian Seward wrote:
>
>> const IROp ops[] // let the compiler figure out # elements
>> = { Iop_INVALID, Iop_QDMulHi16Sx8, Iop_QDMulHi32Sx4, Iop_INVALID };
>> vassert(size < sizeof ops);
>
> That's neater. Although .. shouldn't that be:
> size < sizeof(ops)/sizeof(ops[0]) ?
You're absolutely right.
>
>> I also noticed that at the call site a return value of Iop_INVALID would
>> cause an IRExpr of that kind to be created which would cause some
>> indigestion downstream. Perhaps that value should not be returned here ?
>
> The IR sanity checker would eventually jump on it. But in fact that
> wouldn't happen because the call sites are very careful to only call
> with valid size values, in this case 1 or 2. So there are two levels
> of protection.
All true. What I stumbled upon was: why does the ops array contain the
Iop_INVALID value in the first place? Given that you never want to
return it.
Florian
|
|
From: Julian S. <js...@ac...> - 2014-07-22 16:21:38
|
> const IROp ops[] // let the compiler figure out # elements
> = { Iop_INVALID, Iop_QDMulHi16Sx8, Iop_QDMulHi32Sx4, Iop_INVALID };
> vassert(size < sizeof ops);
That's neater. Although .. shouldn't that be:
size < sizeof(ops)/sizeof(ops[0]) ?
> I also noticed that at the call site a return value of Iop_INVALID would
> cause an IRExpr of that kind to be created which would cause some
> indigestion downstream. Perhaps that value should not be returned here ?
The IR sanity checker would eventually jump on it. But in fact that
wouldn't happen because the call sites are very careful to only call
with valid size values, in this case 1 or 2. So there are two levels
of protection.
J
|
|
From: Florian K. <fl...@ei...> - 2014-07-22 09:44:32
|
On 22.07.2014 11:27, sv...@va... wrote:
>
> +static IROp mkVecQDMULHIS ( UInt size ) {
> + const IROp ops[4]
> + = { Iop_INVALID, Iop_QDMulHi16Sx8, Iop_QDMulHi32Sx4, Iop_INVALID };
> + vassert(size < 4);
> + return ops[size];
> +}
If it's possible that more IROps are added here in the future, then the
following would be better as it wouldn't need adjustment of the magic
constant 4:
const IROp ops[] // let the compiler figure out # elements
= { Iop_INVALID, Iop_QDMulHi16Sx8, Iop_QDMulHi32Sx4, Iop_INVALID };
vassert(size < sizeof ops);
I also noticed that at the call site a return value of Iop_INVALID would
cause an IRExpr of that kind to be created which would cause some
indigestion downstream. Perhaps that value should not be returned here ?
> +
> +static IROp mkVecQRDMULHIS ( UInt size ) {
> + const IROp ops[4]
> + = { Iop_INVALID, Iop_QRDMulHi16Sx8, Iop_QRDMulHi32Sx4, Iop_INVALID };
> + vassert(size < 4);
> + return ops[size];
Likewise.
Florian
|
|
From: <sv...@va...> - 2014-07-22 09:28:59
|
Author: sewardj
Date: Tue Jul 22 09:28:52 2014
New Revision: 14180
Log:
Enable test cases for:
{sqdmlal,sqdmlsl,sqdmull}{d_s_s[],s_h_h[]}
{sqdmlal,sqdmlsl,sqdmull}{d_s_s,s_h_h}
{sqdmlal,sqdmlsl,sqdmull}{2d_(2s_2s)/(4s_4s), 4s_(4h_4h)/(8h_8h)}
sqrdmulh 4s,2s,8h,4h (vector)
Modified:
trunk/none/tests/arm64/fp_and_simd.c
Modified: trunk/none/tests/arm64/fp_and_simd.c
==============================================================================
--- trunk/none/tests/arm64/fp_and_simd.c (original)
+++ trunk/none/tests/arm64/fp_and_simd.c Tue Jul 22 09:28:52 2014
@@ -4354,18 +4354,18 @@
// sqdmlal d_s_s[], s_h_h[]
// sqdmlsl d_s_s[], s_h_h[]
// sqdmull d_s_s[], s_h_h[]
- if (0) test_sqdmlal_d_s_s0(TyS);
- if (0) test_sqdmlal_d_s_s3(TyS);
- if (0) test_sqdmlal_s_h_h1(TyH);
- if (0) test_sqdmlal_s_h_h5(TyH);
- if (0) test_sqdmlsl_d_s_s0(TyS);
- if (0) test_sqdmlsl_d_s_s3(TyS);
- if (0) test_sqdmlsl_s_h_h1(TyH);
- if (0) test_sqdmlsl_s_h_h5(TyH);
- if (0) test_sqdmull_d_s_s0(TyS);
- if (0) test_sqdmull_d_s_s3(TyS);
- if (0) test_sqdmull_s_h_h1(TyH);
- if (0) test_sqdmull_s_h_h5(TyH);
+ if (1) test_sqdmlal_d_s_s0(TyS);
+ if (1) test_sqdmlal_d_s_s3(TyS);
+ if (1) test_sqdmlal_s_h_h1(TyH);
+ if (1) test_sqdmlal_s_h_h5(TyH);
+ if (1) test_sqdmlsl_d_s_s0(TyS);
+ if (1) test_sqdmlsl_d_s_s3(TyS);
+ if (1) test_sqdmlsl_s_h_h1(TyH);
+ if (1) test_sqdmlsl_s_h_h5(TyH);
+ if (1) test_sqdmull_d_s_s0(TyS);
+ if (1) test_sqdmull_d_s_s3(TyS);
+ if (1) test_sqdmull_s_h_h1(TyH);
+ if (1) test_sqdmull_s_h_h5(TyH);
// sqdmlal{2} 2d_2s/4s_s[], 4s_4h/8h_h[]
// sqdmlsl{2} 2d_2s/4s_s[], 4s_4h/8h_h[]
@@ -4398,28 +4398,28 @@
// sqdmlal d_s_s, s_h_h
// sqdmlsl d_s_s, s_h_h
// sqdmull d_s_s, s_h_h
- if (0) test_sqdmlal_d_s_s(TyS);
- if (0) test_sqdmlal_s_h_h(TyH);
- if (0) test_sqdmlsl_d_s_s(TyS);
- if (0) test_sqdmlsl_s_h_h(TyH);
- if (0) test_sqdmull_d_s_s(TyS);
- if (0) test_sqdmull_s_h_h(TyH);
+ if (1) test_sqdmlal_d_s_s(TyS);
+ if (1) test_sqdmlal_s_h_h(TyH);
+ if (1) test_sqdmlsl_d_s_s(TyS);
+ if (1) test_sqdmlsl_s_h_h(TyH);
+ if (1) test_sqdmull_d_s_s(TyS);
+ if (1) test_sqdmull_s_h_h(TyH);
// sqdmlal{2} 2d_(2s_2s)/(4s_4s), 4s_(4h_4h)/(8h_8h)
// sqdmlsl{2} 2d_(2s_2s)/(4s_4s), 4s_(4h_4h)/(8h_8h)
// sqdmull{2} 2d_(2s_2s)/(4s_4s), 4s_(4h_4h)/(8h_8h)
- if (0) test_sqdmlal_2d_2s_2s(TyS);
- if (0) test_sqdmlal2_2d_4s_4s(TyS);
- if (0) test_sqdmlal_4s_4h_4h(TyH);
- if (0) test_sqdmlal2_4s_8h_8h(TyH);
- if (0) test_sqdmlsl_2d_2s_2s(TyS);
- if (0) test_sqdmlsl2_2d_4s_4s(TyS);
- if (0) test_sqdmlsl_4s_4h_4h(TyH);
- if (0) test_sqdmlsl2_4s_8h_8h(TyH);
- if (0) test_sqdmull_2d_2s_2s(TyS);
- if (0) test_sqdmull2_2d_4s_4s(TyS);
- if (0) test_sqdmull_4s_4h_4h(TyH);
- if (0) test_sqdmull2_4s_8h_8h(TyH);
+ if (1) test_sqdmlal_2d_2s_2s(TyS);
+ if (1) test_sqdmlal2_2d_4s_4s(TyS);
+ if (1) test_sqdmlal_4s_4h_4h(TyH);
+ if (1) test_sqdmlal2_4s_8h_8h(TyH);
+ if (1) test_sqdmlsl_2d_2s_2s(TyS);
+ if (1) test_sqdmlsl2_2d_4s_4s(TyS);
+ if (1) test_sqdmlsl_4s_4h_4h(TyH);
+ if (1) test_sqdmlsl2_4s_8h_8h(TyH);
+ if (1) test_sqdmull_2d_2s_2s(TyS);
+ if (1) test_sqdmull2_2d_4s_4s(TyS);
+ if (1) test_sqdmull_4s_4h_4h(TyH);
+ if (1) test_sqdmull2_4s_8h_8h(TyH);
// sqdmulh s_s_s[], h_h_h[]
// sqrdmulh s_s_s[], h_h_h[]
@@ -4460,14 +4460,14 @@
// sqdmulh 4s,2s,8h,4h
// sqrdmulh 4s,2s,8h,4h
- if (0) test_sqdmulh_4s_4s_4s(TyS);
- if (0) test_sqdmulh_2s_2s_2s(TyS);
- if (0) test_sqdmulh_8h_8h_8h(TyH);
- if (0) test_sqdmulh_4h_4h_4h(TyH);
- if (0) test_sqrdmulh_4s_4s_4s(TyS);
- if (0) test_sqrdmulh_2s_2s_2s(TyS);
- if (0) test_sqrdmulh_8h_8h_8h(TyH);
- if (0) test_sqrdmulh_4h_4h_4h(TyH);
+ if (1) test_sqdmulh_4s_4s_4s(TyS);
+ if (1) test_sqdmulh_2s_2s_2s(TyS);
+ if (1) test_sqdmulh_8h_8h_8h(TyH);
+ if (1) test_sqdmulh_4h_4h_4h(TyH);
+ if (1) test_sqrdmulh_4s_4s_4s(TyS);
+ if (1) test_sqrdmulh_2s_2s_2s(TyS);
+ if (1) test_sqrdmulh_8h_8h_8h(TyH);
+ if (1) test_sqrdmulh_4h_4h_4h(TyH);
// sqshl (reg) d,s,h,b
// uqshl (reg) d,s,h,b
|
|
From: <sv...@va...> - 2014-07-22 09:27:57
|
Author: sewardj
Date: Tue Jul 22 09:27:49 2014
New Revision: 2909
Log:
arm64: implement:
{sqdmlal,sqdmlsl,sqdmull}{d_s_s[],s_h_h[]}
{sqdmlal,sqdmlsl,sqdmull}{d_s_s,s_h_h}
{sqdmlal,sqdmlsl,sqdmull}{2d_(2s_2s)/(4s_4s), 4s_(4h_4h)/(8h_8h)}
sqrdmulh 4s,2s,8h,4h (vector)
Modified:
trunk/priv/guest_arm64_toIR.c
trunk/priv/host_arm64_defs.c
trunk/priv/host_arm64_defs.h
trunk/priv/host_arm64_isel.c
Modified: trunk/priv/guest_arm64_toIR.c
==============================================================================
--- trunk/priv/guest_arm64_toIR.c (original)
+++ trunk/priv/guest_arm64_toIR.c Tue Jul 22 09:27:49 2014
@@ -392,7 +392,6 @@
*t2 = newTempV128();
}
-/* Initialise V128 temporaries en masse. */
static
void newTempsV128_3(IRTemp* t1, IRTemp* t2, IRTemp* t3)
{
@@ -404,6 +403,19 @@
*t3 = newTempV128();
}
+//static
+//void newTempsV128_4(IRTemp* t1, IRTemp* t2, IRTemp* t3, IRTemp* t4)
+//{
+// vassert(t1 && *t1 == IRTemp_INVALID);
+// vassert(t2 && *t2 == IRTemp_INVALID);
+// vassert(t3 && *t3 == IRTemp_INVALID);
+// vassert(t4 && *t4 == IRTemp_INVALID);
+// *t1 = newTempV128();
+// *t2 = newTempV128();
+// *t3 = newTempV128();
+// *t4 = newTempV128();
+//}
+
static
void newTempsV128_7(IRTemp* t1, IRTemp* t2, IRTemp* t3,
IRTemp* t4, IRTemp* t5, IRTemp* t6, IRTemp* t7)
@@ -782,6 +794,20 @@
}
}
+static IROp mkVecQDMULHIS ( UInt size ) {
+ const IROp ops[4]
+ = { Iop_INVALID, Iop_QDMulHi16Sx8, Iop_QDMulHi32Sx4, Iop_INVALID };
+ vassert(size < 4);
+ return ops[size];
+}
+
+static IROp mkVecQRDMULHIS ( UInt size ) {
+ const IROp ops[4]
+ = { Iop_INVALID, Iop_QRDMulHi16Sx8, Iop_QRDMulHi32Sx4, Iop_INVALID };
+ vassert(size < 4);
+ return ops[size];
+}
+
/* Generate IR to create 'arg rotated right by imm', for sane values
of 'ty' and 'imm'. */
static IRTemp mathROR ( IRType ty, IRTemp arg, UInt imm )
@@ -6362,22 +6388,105 @@
}
+/* Generate IR for widening signed vector multiplies. The operands
+ have their lane width signedly widened, and they are then multiplied
+ at the wider width, returning results in two new IRTemps. */
+static
+void math_MULLS ( /*OUT*/IRTemp* resHI, /*OUT*/IRTemp* resLO,
+ UInt sizeNarrow, IRTemp argL, IRTemp argR )
+{
+ vassert(sizeNarrow <= 2);
+ newTempsV128_2(resHI, resLO);
+ IRTemp argLhi = newTemp(Ity_I64);
+ IRTemp argLlo = newTemp(Ity_I64);
+ IRTemp argRhi = newTemp(Ity_I64);
+ IRTemp argRlo = newTemp(Ity_I64);
+ assign(argLhi, unop(Iop_V128HIto64, mkexpr(argL)));
+ assign(argLlo, unop(Iop_V128to64, mkexpr(argL)));
+ assign(argRhi, unop(Iop_V128HIto64, mkexpr(argR)));
+ assign(argRlo, unop(Iop_V128to64, mkexpr(argR)));
+ IROp opMulls = mkVecMULLS(sizeNarrow);
+ assign(*resHI, binop(opMulls, mkexpr(argLhi), mkexpr(argRhi)));
+ assign(*resLO, binop(opMulls, mkexpr(argLlo), mkexpr(argRlo)));
+}
+
+
+static
+void math_SQDMULH ( /*OUT*/IRTemp* res,
+ /*OUT*/IRTemp* sat1q, /*OUT*/IRTemp* sat1n,
+ Bool isR, UInt size, IRTemp vN, IRTemp vM )
+{
+ vassert(size == X01 || size == X10); /* s or h only */
+
+ newTempsV128_3(res, sat1q, sat1n);
+
+ IRTemp mullsHI = IRTemp_INVALID, mullsLO = IRTemp_INVALID;
+ math_MULLS(&mullsHI, &mullsLO, size, vN, vM);
+
+ IRTemp addWide = mkVecADD(size+1);
+
+ if (isR) {
+ assign(*sat1q, binop(mkVecQRDMULHIS(size), mkexpr(vN), mkexpr(vM)));
+
+ Int rcShift = size == X01 ? 15 : 31;
+ IRTemp roundConst = math_VEC_DUP_IMM(size+1, 1ULL << rcShift);
+ assign(*sat1n,
+ binop(mkVecCATODDLANES(size),
+ binop(addWide,
+ binop(addWide, mkexpr(mullsHI), mkexpr(mullsHI)),
+ mkexpr(roundConst)),
+ binop(addWide,
+ binop(addWide, mkexpr(mullsLO), mkexpr(mullsLO)),
+ mkexpr(roundConst))));
+ } else {
+ assign(*sat1q, binop(mkVecQDMULHIS(size), mkexpr(vN), mkexpr(vM)));
+
+ assign(*sat1n,
+ binop(mkVecCATODDLANES(size),
+ binop(addWide, mkexpr(mullsHI), mkexpr(mullsHI)),
+ binop(addWide, mkexpr(mullsLO), mkexpr(mullsLO))));
+ }
+
+ assign(*res, mkexpr(*sat1q));
+}
+
+
/* QCFLAG tracks the SIMD sticky saturation status. Update the status
- thusly: if |qres| and |nres| hold the same value, leave QCFLAG
- unchanged. Otherwise, set it (implicitly) to 1. */
+ thusly: if, after application of |opZHI| to both |qres| and |nres|,
+ they have the same value, leave QCFLAG unchanged. Otherwise, set it
+ (implicitly) to 1. |opZHI| may only be one of the Iop_ZeroHIxxofV128
+ operators, or Iop_INVALID, in which case |qres| and |nres| are used
+ unmodified. The presence |opZHI| means this function can be used to
+ generate QCFLAG update code for both scalar and vector SIMD operations.
+*/
static
-void updateQCFLAGwithDifference ( IRTemp qres, IRTemp nres )
+void updateQCFLAGwithDifferenceZHI ( IRTemp qres, IRTemp nres, IROp opZHI )
{
IRTemp diff = newTempV128();
IRTemp oldQCFLAG = newTempV128();
IRTemp newQCFLAG = newTempV128();
- assign(diff, binop(Iop_XorV128, mkexpr(qres), mkexpr(nres)));
+ if (opZHI == Iop_INVALID) {
+ assign(diff, binop(Iop_XorV128, mkexpr(qres), mkexpr(nres)));
+ } else {
+ vassert(opZHI == Iop_ZeroHI64ofV128 || opZHI == Iop_ZeroHI96ofV128);
+ assign(diff, unop(opZHI, binop(Iop_XorV128, mkexpr(qres), mkexpr(nres))));
+ }
assign(oldQCFLAG, IRExpr_Get(OFFB_QCFLAG, Ity_V128));
assign(newQCFLAG, binop(Iop_OrV128, mkexpr(oldQCFLAG), mkexpr(diff)));
stmt(IRStmt_Put(OFFB_QCFLAG, mkexpr(newQCFLAG)));
}
+/* A variant of updateQCFLAGwithDifferenceZHI in which |qres| and |nres|
+ are used unmodified, hence suitable for QCFLAG updates for whole-vector
+ operations. */
+static
+void updateQCFLAGwithDifference ( IRTemp qres, IRTemp nres )
+{
+ updateQCFLAGwithDifferenceZHI(qres, nres, Iop_INVALID);
+}
+
+
/*------------------------------------------------------------*/
/*--- SIMD and FP instructions ---*/
/*------------------------------------------------------------*/
@@ -7270,7 +7379,67 @@
static
Bool dis_AdvSIMD_scalar_three_different(/*MB_OUT*/DisResult* dres, UInt insn)
{
+ /* 31 29 28 23 21 20 15 11 9 4
+ 01 U 11110 size 1 m opcode 00 n d
+ Decode fields: u,opcode
+ */
# define INSN(_bMax,_bMin) SLICE_UInt(insn, (_bMax), (_bMin))
+ if (INSN(31,30) != BITS2(0,1)
+ || INSN(28,24) != BITS5(1,1,1,1,0)
+ || INSN(21,21) != 1
+ || INSN(11,10) != BITS2(0,0)) {
+ return False;
+ }
+ UInt bitU = INSN(29,29);
+ UInt size = INSN(23,22);
+ UInt mm = INSN(20,16);
+ UInt opcode = INSN(15,12);
+ UInt nn = INSN(9,5);
+ UInt dd = INSN(4,0);
+ vassert(size < 4);
+
+ if (bitU == 0
+ && (opcode == BITS4(1,1,0,1)
+ || opcode == BITS4(1,0,0,1) || opcode == BITS4(1,0,1,1))) {
+ /* -------- 0,1101 SQDMULL -------- */ // 0 (ks)
+ /* -------- 0,1001 SQDMLAL -------- */ // 1
+ /* -------- 0,1011 SQDMLSL -------- */ // 2
+ /* Widens, and size refers to the narrowed lanes. */
+ UInt ks = 3;
+ switch (opcode) {
+ case BITS4(1,1,0,1): ks = 0; break;
+ case BITS4(1,0,0,1): ks = 1; break;
+ case BITS4(1,0,1,1): ks = 2; break;
+ default: vassert(0);
+ }
+ vassert(ks >= 0 && ks <= 2);
+ if (size == X00 || size == X11) return False;
+ vassert(size <= 2);
+ IRTemp vecN, vecM, vecD, res, sat1q, sat1n, sat2q, sat2n;
+ vecN = vecM = vecD = res = sat1q = sat1n = sat2q = sat2n = IRTemp_INVALID;
+ newTempsV128_3(&vecN, &vecM, &vecD);
+ assign(vecN, getQReg128(nn));
+ assign(vecM, getQReg128(mm));
+ assign(vecD, getQReg128(dd));
+ math_SQDMULL_ACC(&res, &sat1q, &sat1n, &sat2q, &sat2n,
+ False/*!is2*/, size, "mas"[ks],
+ vecN, vecM, ks == 0 ? IRTemp_INVALID : vecD);
+ IROp opZHI = mkVecZEROHIxxOFV128(size+1);
+ putQReg128(dd, unop(opZHI, mkexpr(res)));
+ vassert(sat1q != IRTemp_INVALID && sat1n != IRTemp_INVALID);
+ updateQCFLAGwithDifferenceZHI(sat1q, sat1n, opZHI);
+ if (sat2q != IRTemp_INVALID || sat2n != IRTemp_INVALID) {
+ updateQCFLAGwithDifferenceZHI(sat2q, sat2n, opZHI);
+ }
+ const HChar* nm = ks == 0 ? "sqdmull"
+ : (ks == 1 ? "sqdmlal" : "sqdmlsl");
+ const HChar arrNarrow = "bhsd"[size];
+ const HChar arrWide = "bhsd"[size+1];
+ DIP("%s %c%d, %c%d, %c%d\n",
+ nm, arrWide, dd, arrNarrow, nn, arrNarrow, mm);
+ return True;
+ }
+
return False;
# undef INSN
}
@@ -7523,7 +7692,84 @@
static
Bool dis_AdvSIMD_scalar_x_indexed_element(/*MB_OUT*/DisResult* dres, UInt insn)
{
+ /* 31 28 23 21 20 19 15 11 9 4
+ 01 U 11111 size L M m opcode H 0 n d
+ Decode fields are: u,size,opcode
+ M is really part of the mm register number. Individual
+ cases need to inspect L and H though.
+ */
# define INSN(_bMax,_bMin) SLICE_UInt(insn, (_bMax), (_bMin))
+ if (INSN(31,30) != BITS2(0,1)
+ || INSN(28,24) != BITS5(1,1,1,1,1) || INSN(10,10) !=0) {
+ return False;
+ }
+ UInt bitU = INSN(29,29);
+ UInt size = INSN(23,22);
+ UInt bitL = INSN(21,21);
+ UInt bitM = INSN(20,20);
+ UInt mmLO4 = INSN(19,16);
+ UInt opcode = INSN(15,12);
+ UInt bitH = INSN(11,11);
+ UInt nn = INSN(9,5);
+ UInt dd = INSN(4,0);
+ vassert(size < 4);
+ vassert(bitH < 2 && bitM < 2 && bitL < 2);
+
+ if (bitU == 0
+ && (opcode == BITS4(1,0,1,1)
+ || opcode == BITS4(0,0,1,1) || opcode == BITS4(0,1,1,1))) {
+ /* -------- 0,xx,1011 SQDMULL s/h variants only -------- */ // 0 (ks)
+ /* -------- 0,xx,0011 SQDMLAL s/h variants only -------- */ // 1
+ /* -------- 0,xx,0111 SQDMLSL s/h variants only -------- */ // 2
+ /* Widens, and size refers to the narrowed lanes. */
+ UInt ks = 3;
+ switch (opcode) {
+ case BITS4(1,0,1,1): ks = 0; break;
+ case BITS4(0,0,1,1): ks = 1; break;
+ case BITS4(0,1,1,1): ks = 2; break;
+ default: vassert(0);
+ }
+ vassert(ks >= 0 && ks <= 2);
+ UInt mm = 32; // invalid
+ UInt ix = 16; // invalid
+ switch (size) {
+ case X00:
+ return False; // h_b_b[] case is not allowed
+ case X01:
+ mm = mmLO4; ix = (bitH << 2) | (bitL << 1) | (bitM << 0); break;
+ case X10:
+ mm = (bitM << 4) | mmLO4; ix = (bitH << 1) | (bitL << 0); break;
+ case X11:
+ return False; // q_d_d[] case is not allowed
+ default:
+ vassert(0);
+ }
+ vassert(mm < 32 && ix < 16);
+ IRTemp vecN, vecD, res, sat1q, sat1n, sat2q, sat2n;
+ vecN = vecD = res = sat1q = sat1n = sat2q = sat2n = IRTemp_INVALID;
+ newTempsV128_2(&vecN, &vecD);
+ assign(vecN, getQReg128(nn));
+ IRTemp vecM = math_DUP_VEC_ELEM(getQReg128(mm), size, ix);
+ assign(vecD, getQReg128(dd));
+ math_SQDMULL_ACC(&res, &sat1q, &sat1n, &sat2q, &sat2n,
+ False/*!is2*/, size, "mas"[ks],
+ vecN, vecM, ks == 0 ? IRTemp_INVALID : vecD);
+ IROp opZHI = mkVecZEROHIxxOFV128(size+1);
+ putQReg128(dd, unop(opZHI, mkexpr(res)));
+ vassert(sat1q != IRTemp_INVALID && sat1n != IRTemp_INVALID);
+ updateQCFLAGwithDifferenceZHI(sat1q, sat1n, opZHI);
+ if (sat2q != IRTemp_INVALID || sat2n != IRTemp_INVALID) {
+ updateQCFLAGwithDifferenceZHI(sat2q, sat2n, opZHI);
+ }
+ const HChar* nm = ks == 0 ? "sqmull"
+ : (ks == 1 ? "sqdmlal" : "sqdmlsl");
+ const HChar arrNarrow = "bhsd"[size];
+ const HChar arrWide = "bhsd"[size+1];
+ DIP("%s %c%d, %c%d, v%d.%c[%u]\n",
+ nm, arrWide, dd, arrNarrow, nn, dd, arrNarrow, ix);
+ return True;
+ }
+
return False;
# undef INSN
}
@@ -7814,8 +8060,6 @@
/* -------- 0,0010 SSUBL{2} -------- */
/* -------- 1,0010 USUBL{2} -------- */
/* Widens, and size refers to the narrowed lanes. */
- const IROp opADD[3] = { Iop_Add16x8, Iop_Add32x4, Iop_Add64x2 };
- const IROp opSUB[3] = { Iop_Sub16x8, Iop_Sub32x4, Iop_Sub64x2 };
if (size == X11) return False;
vassert(size <= 2);
Bool isU = bitU == 1;
@@ -7823,7 +8067,7 @@
IRTemp argL = math_WIDEN_LO_OR_HI_LANES(isU, is2, size, getQReg128(nn));
IRTemp argR = math_WIDEN_LO_OR_HI_LANES(isU, is2, size, getQReg128(mm));
IRTemp res = newTempV128();
- assign(res, binop(isADD ? opADD[size] : opSUB[size],
+ assign(res, binop(isADD ? mkVecADD(size+1) : mkVecSUB(size+1),
mkexpr(argL), mkexpr(argR)));
putQReg128(dd, mkexpr(res));
const HChar* arrNarrow = nameArr_Q_SZ(bitQ, size);
@@ -7966,6 +8210,48 @@
return True;
}
+ if (bitU == 0
+ && (opcode == BITS4(1,1,0,1)
+ || opcode == BITS4(1,0,0,1) || opcode == BITS4(1,0,1,1))) {
+ /* -------- 0,1101 SQDMULL{2} -------- */ // 0 (ks)
+ /* -------- 0,1001 SQDMLAL{2} -------- */ // 1
+ /* -------- 0,1011 SQDMLSL{2} -------- */ // 2
+ /* Widens, and size refers to the narrowed lanes. */
+ UInt ks = 3;
+ switch (opcode) {
+ case BITS4(1,1,0,1): ks = 0; break;
+ case BITS4(1,0,0,1): ks = 1; break;
+ case BITS4(1,0,1,1): ks = 2; break;
+ default: vassert(0);
+ }
+ vassert(ks >= 0 && ks <= 2);
+ if (size == X00 || size == X11) return False;
+ vassert(size <= 2);
+ IRTemp vecN, vecM, vecD, res, sat1q, sat1n, sat2q, sat2n;
+ vecN = vecM = vecD = res = sat1q = sat1n = sat2q = sat2n = IRTemp_INVALID;
+ newTempsV128_3(&vecN, &vecM, &vecD);
+ assign(vecN, getQReg128(nn));
+ assign(vecM, getQReg128(mm));
+ assign(vecD, getQReg128(dd));
+ math_SQDMULL_ACC(&res, &sat1q, &sat1n, &sat2q, &sat2n,
+ is2, size, "mas"[ks],
+ vecN, vecM, ks == 0 ? IRTemp_INVALID : vecD);
+ putQReg128(dd, mkexpr(res));
+ vassert(sat1q != IRTemp_INVALID && sat1n != IRTemp_INVALID);
+ updateQCFLAGwithDifference(sat1q, sat1n);
+ if (sat2q != IRTemp_INVALID || sat2n != IRTemp_INVALID) {
+ updateQCFLAGwithDifference(sat2q, sat2n);
+ }
+ const HChar* arrNarrow = nameArr_Q_SZ(bitQ, size);
+ const HChar* arrWide = nameArr_Q_SZ(1, size+1);
+ const HChar* nm = ks == 0 ? "sqdmull"
+ : (ks == 1 ? "sqdmlal" : "sqdmlsl");
+ DIP("%s%s %s.%s, %s.%s, %s.%s\n", nm, is2 ? "2" : "",
+ nameQReg128(dd), arrWide,
+ nameQReg128(nn), arrNarrow, nameQReg128(mm), arrNarrow);
+ return True;
+ }
+
if (bitU == 0 && opcode == BITS4(1,1,1,0)) {
/* -------- 0,1110 PMULL{2} -------- */
/* Widens, and size refers to the narrowed lanes. */
@@ -8351,6 +8637,27 @@
return True;
}
+ if (opcode == BITS5(1,0,1,1,0)) {
+ /* -------- 0,xx,10110 SQDMULH s and h variants only -------- */
+ /* -------- 1,xx,10110 SQRDMULH s and h variants only -------- */
+ if (size == X00 || size == X11) return False;
+ Bool isR = bitU == 1;
+ IRTemp res, sat1q, sat1n, vN, vM;
+ res = sat1q = sat1n = vN = vM = IRTemp_INVALID;
+ newTempsV128_2(&vN, &vM);
+ assign(vN, getQReg128(nn));
+ assign(vM, getQReg128(mm));
+ math_SQDMULH(&res, &sat1q, &sat1n, isR, size, vN, vM);
+ putQReg128(dd, math_MAYBE_ZERO_HI64(bitQ, res));
+ IROp opZHI = bitQ == 0 ? Iop_ZeroHI64ofV128 : Iop_INVALID;
+ updateQCFLAGwithDifferenceZHI(sat1q, sat1n, opZHI);
+ const HChar* arr = nameArr_Q_SZ(bitQ, size);
+ const HChar* nm = isR ? "sqrdmulh" : "sqdmulh";
+ DIP("%s %s.%s, %s.%s, %s.%s\n", nm,
+ nameQReg128(dd), arr, nameQReg128(nn), arr, nameQReg128(mm), arr);
+ return True;
+ }
+
if (bitU == 0 && opcode == BITS5(1,0,1,1,1)) {
/* -------- 0,xx,10111 ADDP std7_std7_std7 -------- */
if (bitQ == 0 && size == X11) return False; // implied 1d case
@@ -9080,7 +9387,7 @@
if (sat2q != IRTemp_INVALID || sat2n != IRTemp_INVALID) {
updateQCFLAGwithDifference(sat2q, sat2n);
}
- const HChar* nm = ks == 0 ? "sqmull"
+ const HChar* nm = ks == 0 ? "sqdmull"
: (ks == 1 ? "sqdmlal" : "sqdmlsl");
const HChar* arrNarrow = nameArr_Q_SZ(bitQ, size);
const HChar* arrWide = nameArr_Q_SZ(1, size+1);
Modified: trunk/priv/host_arm64_defs.c
==============================================================================
--- trunk/priv/host_arm64_defs.c (original)
+++ trunk/priv/host_arm64_defs.c Tue Jul 22 09:27:49 2014
@@ -947,6 +947,10 @@
case ARM64vecb_UQSUB8x16: *nm = "uqsub"; *ar = "16b"; return;
case ARM64vecb_SQDMULL2DSS: *nm = "sqdmull"; *ar = "2dss"; return;
case ARM64vecb_SQDMULL4SHH: *nm = "sqdmull"; *ar = "4shh"; return;
+ case ARM64vecb_SQDMULH32x4: *nm = "sqdmulh"; *ar = "4s"; return;
+ case ARM64vecb_SQDMULH16x8: *nm = "sqdmulh"; *ar = "8h"; return;
+ case ARM64vecb_SQRDMULH32x4: *nm = "sqrdmulh"; *ar = "4s"; return;
+ case ARM64vecb_SQRDMULH16x8: *nm = "sqrdmulh"; *ar = "8h"; return;
default: vpanic("showARM64VecBinOp");
}
}
@@ -3506,6 +3510,7 @@
#define X100101 BITS8(0,0, 1,0,0,1,0,1)
#define X100110 BITS8(0,0, 1,0,0,1,1,0)
#define X100111 BITS8(0,0, 1,0,0,1,1,1)
+#define X101101 BITS8(0,0, 1,0,1,1,0,1)
#define X101110 BITS8(0,0, 1,0,1,1,1,0)
#define X110000 BITS8(0,0, 1,1,0,0,0,0)
#define X110001 BITS8(0,0, 1,1,0,0,0,1)
@@ -5195,6 +5200,11 @@
000 01110 10 1 m 110100 n d SQDMULL Vd.2d, Vn.2s, Vm.2s
000 01110 01 1 m 110100 n d SQDMULL Vd.4s, Vn.4h, Vm.4h
+
+ 010 01110 10 1 m 101101 n d SQDMULH Vd.4s, Vn.4s, Vm.4s
+ 010 01110 01 1 m 101101 n d SQDMULH Vd.8h, Vn.8h, Vm.8h
+ 011 01110 10 1 m 101101 n d SQRDMULH Vd.4s, Vn.4s, Vm.4s
+ 011 01110 10 1 m 101101 n d SQRDMULH Vd.8h, Vn.8h, Vm.8h
*/
UInt vD = qregNo(i->ARM64in.VBinV.dst);
UInt vN = qregNo(i->ARM64in.VBinV.argL);
@@ -5505,6 +5515,19 @@
*p++ = X_3_8_5_6_5_5(X000, X01110011, vM, X110100, vN, vD);
break;
+ case ARM64vecb_SQDMULH32x4:
+ *p++ = X_3_8_5_6_5_5(X010, X01110101, vM, X101101, vN, vD);
+ break;
+ case ARM64vecb_SQDMULH16x8:
+ *p++ = X_3_8_5_6_5_5(X010, X01110011, vM, X101101, vN, vD);
+ break;
+ case ARM64vecb_SQRDMULH32x4:
+ *p++ = X_3_8_5_6_5_5(X011, X01110101, vM, X101101, vN, vD);
+ break;
+ case ARM64vecb_SQRDMULH16x8:
+ *p++ = X_3_8_5_6_5_5(X011, X01110011, vM, X101101, vN, vD);
+ break;
+
default:
goto bad;
}
Modified: trunk/priv/host_arm64_defs.h
==============================================================================
--- trunk/priv/host_arm64_defs.h (original)
+++ trunk/priv/host_arm64_defs.h Tue Jul 22 09:27:49 2014
@@ -360,7 +360,10 @@
ARM64vecb_UQSUB16x8, ARM64vecb_UQSUB8x16,
ARM64vecb_SQDMULL2DSS,
ARM64vecb_SQDMULL4SHH,
-
+ ARM64vecb_SQDMULH32x4,
+ ARM64vecb_SQDMULH16x8,
+ ARM64vecb_SQRDMULH32x4,
+ ARM64vecb_SQRDMULH16x8,
ARM64vecb_INVALID
}
ARM64VecBinOp;
Modified: trunk/priv/host_arm64_isel.c
==============================================================================
--- trunk/priv/host_arm64_isel.c (original)
+++ trunk/priv/host_arm64_isel.c Tue Jul 22 09:27:49 2014
@@ -4951,6 +4951,8 @@
case Iop_QSub16Sx8: case Iop_QSub8Sx16:
case Iop_QSub64Ux2: case Iop_QSub32Ux4:
case Iop_QSub16Ux8: case Iop_QSub8Ux16:
+ case Iop_QDMulHi32Sx4: case Iop_QDMulHi16Sx8:
+ case Iop_QRDMulHi32Sx4: case Iop_QRDMulHi16Sx8:
{
HReg res = newVRegV(env);
HReg argL = iselV128Expr(env, e->Iex.Binop.arg1);
@@ -5032,22 +5034,26 @@
case Iop_InterleaveLO8x16: op = ARM64vecb_ZIP18x16; sw = True;
break;
case Iop_PolynomialMul8x16: op = ARM64vecb_PMUL8x16; break;
- case Iop_QAdd64Sx2: op = ARM64vecb_SQADD64x2; break;
- case Iop_QAdd32Sx4: op = ARM64vecb_SQADD32x4; break;
- case Iop_QAdd16Sx8: op = ARM64vecb_SQADD16x8; break;
- case Iop_QAdd8Sx16: op = ARM64vecb_SQADD8x16; break;
- case Iop_QAdd64Ux2: op = ARM64vecb_UQADD64x2; break;
- case Iop_QAdd32Ux4: op = ARM64vecb_UQADD32x4; break;
- case Iop_QAdd16Ux8: op = ARM64vecb_UQADD16x8; break;
- case Iop_QAdd8Ux16: op = ARM64vecb_UQADD8x16; break;
- case Iop_QSub64Sx2: op = ARM64vecb_SQSUB64x2; break;
- case Iop_QSub32Sx4: op = ARM64vecb_SQSUB32x4; break;
- case Iop_QSub16Sx8: op = ARM64vecb_SQSUB16x8; break;
- case Iop_QSub8Sx16: op = ARM64vecb_SQSUB8x16; break;
- case Iop_QSub64Ux2: op = ARM64vecb_UQSUB64x2; break;
- case Iop_QSub32Ux4: op = ARM64vecb_UQSUB32x4; break;
- case Iop_QSub16Ux8: op = ARM64vecb_UQSUB16x8; break;
- case Iop_QSub8Ux16: op = ARM64vecb_UQSUB8x16; break;
+ case Iop_QAdd64Sx2: op = ARM64vecb_SQADD64x2; break;
+ case Iop_QAdd32Sx4: op = ARM64vecb_SQADD32x4; break;
+ case Iop_QAdd16Sx8: op = ARM64vecb_SQADD16x8; break;
+ case Iop_QAdd8Sx16: op = ARM64vecb_SQADD8x16; break;
+ case Iop_QAdd64Ux2: op = ARM64vecb_UQADD64x2; break;
+ case Iop_QAdd32Ux4: op = ARM64vecb_UQADD32x4; break;
+ case Iop_QAdd16Ux8: op = ARM64vecb_UQADD16x8; break;
+ case Iop_QAdd8Ux16: op = ARM64vecb_UQADD8x16; break;
+ case Iop_QSub64Sx2: op = ARM64vecb_SQSUB64x2; break;
+ case Iop_QSub32Sx4: op = ARM64vecb_SQSUB32x4; break;
+ case Iop_QSub16Sx8: op = ARM64vecb_SQSUB16x8; break;
+ case Iop_QSub8Sx16: op = ARM64vecb_SQSUB8x16; break;
+ case Iop_QSub64Ux2: op = ARM64vecb_UQSUB64x2; break;
+ case Iop_QSub32Ux4: op = ARM64vecb_UQSUB32x4; break;
+ case Iop_QSub16Ux8: op = ARM64vecb_UQSUB16x8; break;
+ case Iop_QSub8Ux16: op = ARM64vecb_UQSUB8x16; break;
+ case Iop_QDMulHi32Sx4: op = ARM64vecb_SQDMULH32x4; break;
+ case Iop_QDMulHi16Sx8: op = ARM64vecb_SQDMULH16x8; break;
+ case Iop_QRDMulHi32Sx4: op = ARM64vecb_SQRDMULH32x4; break;
+ case Iop_QRDMulHi16Sx8: op = ARM64vecb_SQRDMULH16x8; break;
default: vassert(0);
}
if (sw) {
|
|
From: <sv...@va...> - 2014-07-22 09:26:45
|
Author: sewardj
Date: Tue Jul 22 09:26:36 2014
New Revision: 2908
Log:
Comment-only change.
Modified:
trunk/pub/libvex_ir.h
Modified: trunk/pub/libvex_ir.h
==============================================================================
--- trunk/pub/libvex_ir.h (original)
+++ trunk/pub/libvex_ir.h Tue Jul 22 09:26:36 2014
@@ -1421,13 +1421,20 @@
Iop_QDMull16Sx4, Iop_QDMull32Sx2,
/* Vector Saturating Doubling Multiply Returning High Half and
- Vector Saturating Rounding Doubling Multiply Returning High Half */
- /* These IROps multiply corresponding elements in two vectors, double
+ Vector Saturating Rounding Doubling Multiply Returning High Half.
+ These IROps multiply corresponding elements in two vectors, double
the results, and place the most significant half of the final results
- in the destination vector. The results are truncated or rounded. If
- any of the results overflow, they are saturated. */
- Iop_QDMulHi16Sx8, Iop_QDMulHi32Sx4,
- Iop_QRDMulHi16Sx8, Iop_QRDMulHi32Sx4,
+ in the destination vector. The results are truncated or rounded. If
+ any of the results overflow, they are saturated. To be more precise,
+ for each lane, the computed result is:
+ QDMulHi:
+ hi-half( sign-extend(laneL) *q sign-extend(laneR) *q 2 )
+ QRDMulHi:
+ hi-half( sign-extend(laneL) *q sign-extend(laneR) *q 2
+ +q (1 << (lane-width-in-bits - 1)) )
+ */
+ Iop_QDMulHi16Sx8, Iop_QDMulHi32Sx4, /* (V128, V128) -> V128 */
+ Iop_QRDMulHi16Sx8, Iop_QRDMulHi32Sx4, /* (V128, V128) -> V128 */
/* Polynomial multiplication treats its arguments as
coefficients of polynomials over {0, 1}. */
|
|
From: Christian B. <bor...@de...> - 2014-07-22 04:12:41
|
valgrind revision: 14179 VEX revision: 2907 C compiler: gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973] GDB: GNU gdb (GDB) SUSE (7.5.1-0.7.29) Assembler: GNU assembler (GNU Binutils; SUSE Linux Enterprise 11) 2.23.1 C library: GNU C Library stable release version 2.11.3 (20110527) uname -mrs: Linux 3.0.101-0.31-default s390x Vendor version: Welcome to SUSE Linux Enterprise Server 11 SP3 (s390x) - Kernel %r (%t). Nightly build on sless390 ( SUSE Linux Enterprise Server 11 SP3 gcc 4.3.4 on z196 (s390x) ) Started at 2014-07-22 03:45:01 CEST Ended at 2014-07-22 06:12:27 CEST 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 == 657 tests, 3 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures == memcheck/tests/origin5-bz2 (stderr) helgrind/tests/pth_cond_destroy_busy (stderr) helgrind/tests/tc20_verifywrap (stderr) --tools=none,memcheck,callgrind,helgrind,cachegrind,drd,massif --reps=3 --vg=../valgrind-new --vg=../valgrind-old -- Running tests in perf ---------------------------------------------- -- bigcode1 -- bigcode1 valgrind-new:0.22s no: 5.1s (23.2x, -----) me: 6.2s (28.1x, -----) ca:26.9s (122.1x, -----) he: 5.8s (26.1x, -----) ca: 9.1s (41.5x, -----) dr: 4.8s (22.0x, -----) ma: 4.9s (22.3x, -----) bigcode1 valgrind-old:0.22s no: 4.7s (21.4x, 7.6%) me: 5.8s (26.4x, 6.1%) ca:26.5s (120.5x, 1.3%) he: 5.7s (26.1x, 0.2%) ca: 9.1s (41.5x, 0.0%) dr: 4.8s (22.0x, 0.2%) ma: 4.9s (22.4x, -0.4%) -- bigcode2 -- bigcode2 valgrind-new:0.24s no: 7.7s (32.2x, -----) me:13.1s (54.7x, -----) ca:40.0s (166.8x, -----) he:10.8s (44.8x, -----) ca:14.3s (59.7x, -----) dr: 9.0s (37.6x, -----) ma: 8.3s (34.8x, -----) bigcode2 valgrind-old:0.24s no: 7.7s (31.9x, 0.9%) me:12.8s (53.2x, 2.7%) ca:40.5s (168.6x, -1.1%) he:10.7s (44.8x, 0.1%) ca:14.3s (59.6x, 0.1%) dr: 9.0s (37.4x, 0.7%) ma: 8.3s (34.8x, -0.1%) -- bz2 -- bz2 valgrind-new:0.70s no: 5.9s ( 8.5x, -----) me:12.7s (18.2x, -----) ca:30.7s (43.8x, -----) he:19.6s (28.0x, -----) ca:34.4s (49.2x, -----) dr:30.8s (44.0x, -----) ma: 5.2s ( 7.5x, -----) bz2 valgrind-old:0.70s no: 5.9s ( 8.5x, 0.0%) me:12.6s (18.0x, 1.0%) ca:30.7s (43.8x, 0.0%) he:19.6s (28.0x, 0.2%) ca:34.4s (49.1x, 0.0%) dr:28.9s (41.3x, 6.1%) ma: 5.2s ( 7.5x, 0.0%) -- fbench -- fbench valgrind-new:0.41s no: 1.6s ( 3.9x, -----) me: 4.3s (10.4x, -----) ca: 9.4s (22.9x, -----) he: 6.4s (15.6x, -----) ca: 7.2s (17.7x, -----) dr: 5.8s (14.2x, -----) ma: 1.7s ( 4.0x, -----) fbench valgrind-old:0.41s no: 1.6s ( 4.0x, -0.6%) me: 4.3s (10.5x, -0.7%) ca: 9.3s (22.7x, 0.7%) he: 6.3s (15.5x, 0.6%) ca: 7.3s (17.7x, -0.3%) dr: 5.5s (13.5x, 4.8%) ma: 1.7s ( 4.0x, 0.0%) -- ffbench -- ffbench valgrind-new:0.24s no: 1.1s ( 4.8x, -----) me: 3.0s (12.7x, -----) ca: 3.1s (12.8x, -----) he:43.1s (179.7x, -----) ca: 9.7s (40.4x, -----) dr: 7.0s (29.3x, -----) ma: 1.0s ( 4.3x, -----) ffbench valgrind-old:0.24s no: 1.2s ( 4.9x, -2.6%) me: 3.1s (12.8x, -0.7%) ca: 3.1s (12.8x, 0.0%) he:43.1s (179.7x, 0.0%) ca: 9.7s (40.5x, -0.2%) dr: 7.0s (29.0x, 1.0%) ma: 1.0s ( 4.3x, 0.0%) -- heap -- heap valgrind-new:0.23s no: 2.2s ( 9.4x, -----) me: 9.0s (39.0x, -----) ca:13.2s (57.5x, -----) he:13.0s (56.3x, -----) ca:11.4s (49.4x, -----) dr: 8.3s (35.9x, -----) ma: 7.9s (34.3x, -----) heap valgrind-old:0.23s no: 2.1s ( 9.3x, 0.5%) me: 8.8s (38.3x, 1.8%) ca:13.2s (57.6x, -0.2%) he:12.9s (56.1x, 0.4%) ca:11.4s (49.4x, 0.1%) dr: 7.7s (33.5x, 6.8%) ma: 7.9s (34.3x, -0.3%) -- heap_pdb4 -- heap_pdb4 valgrind-new:0.22s no: 2.6s (11.6x, -----) me:13.3s (60.5x, -----) ca:14.4s (65.3x, -----) he:14.5s (65.9x, -----) ca:12.4s (56.3x, -----) dr: 9.2s (41.7x, -----) ma: 8.0s (36.5x, -----) heap_pdb4 valgrind-old:0.22s no: 2.4s (11.0x, 5.5%) me:12.8s (58.2x, 3.8%) ca:14.3s (65.0x, 0.4%) he:14.1s (64.3x, 2.4%) ca:12.4s (56.5x, -0.4%) dr: 8.8s (39.8x, 4.6%) ma: 8.3s (37.7x, -3.5%) -- many-loss-records -- many-loss-records valgrind-new:0.02s no: 0.5s (26.0x, -----) me: 2.1s (107.0x, -----) ca: 1.9s (97.5x, -----) he: 2.2s (109.0x, -----) ca: 1.9s (96.5x, -----) dr: 1.8s (91.0x, -----) ma: 1.7s (83.0x, -----) many-loss-records valgrind-old:0.02s no: 0.5s (26.0x, 0.0%) me: 2.1s (105.0x, 1.9%) ca: 1.9s (97.5x, 0.0%) he: 2.1s (107.5x, 1.4%) ca: 1.9s (96.5x, 0.0%) dr: 1.8s (88.0x, 3.3%) ma: 1.7s (83.0x, 0.0%) -- many-xpts -- many-xpts valgrind-new:0.07s no: 0.7s ( 9.4x, -----) me: 3.2s (46.4x, -----) ca:387.3s (5532.9x, -----) he: 6.6s (94.9x, -----) ca: 2.8s (40.4x, -----) dr: 2.7s (38.4x, -----) ma: 2.6s (36.7x, -----) many-xpts valgrind-old:0.07s no: 0.7s ( 9.6x, -1.5%) me: 3.2s (46.1x, 0.6%) ca:381.1s (5444.3x, 1.6%) he: 6.6s (94.9x, 0.0%) ca: 2.8s (40.6x, -0.4%) dr: 2.5s (36.1x, 5.9%) ma: 2.6s (37.0x, -0.8%) -- sarp -- sarp valgrind-new:0.03s no: 0.6s (20.0x, -----) me: 3.6s (121.7x, -----) ca: 3.2s (105.3x, -----) he:17.3s (577.0x, -----) ca: 2.0s (68.3x, -----) dr: 1.6s (55.0x, -----) ma: 0.5s (16.0x, -----) sarp valgrind-old:0.03s no: 0.6s (20.0x, 0.0%) me: 3.9s (129.7x, -6.6%) ca: 3.2s (105.3x, 0.0%) he:17.3s (577.0x, 0.0%) ca: 2.0s (68.3x, 0.0%) dr: 1.4s (45.0x, 18.2%) ma: 0.5s (16.0x, 0.0%) -- tinycc -- tinycc valgrind-new:0.22s no: 3.1s (14.3x, -----) me:14.7s (66.7x, -----) ca:30.3s (137.6x, -----) he:28.0s (127.3x, -----) ca:21.4s (97.5x, -----) dr:22.1s (100.5x, -----) ma: 4.1s (18.7x, -----) tinycc valgrind-old:0.22s no: 3.1s (14.3x, -0.3%) me:14.6s (66.4x, 0.4%) ca:30.2s (137.2x, 0.3%) he:28.2s (128.0x, -0.5%) ca:21.5s (97.5x, -0.0%) dr:20.8s (94.4x, 6.1%) ma: 4.1s (18.8x, -0.2%) -- Finished tests in perf ---------------------------------------------- == 11 programs, 154 timings ================= real 113m43.361s user 113m5.564s sys 0m31.325s |
|
From: Rich C. <rc...@wi...> - 2014-07-22 02:26:31
|
valgrind revision: 14179
VEX revision: 2907
C compiler: gcc (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388]
GDB: GNU gdb (GDB; openSUSE Factory) 7.6.50.20130731-cvs
Assembler: GNU assembler (GNU Binutils; openSUSE Factory) 2.23.2
C library: GNU C Library (GNU libc) stable release version 2.18 (git )
uname -mrs: Linux 3.11.4-3-desktop x86_64
Vendor version: Welcome to openSUSE 13.1 "Bottle" Beta 1 - Kernel %r (%t).
Nightly build on rodan ( Linux 3.11.4-3-desktop x86_64 )
Started at 2014-07-21 19:22:01 CDT
Ended at 2014-07-21 21:26:19 CDT
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
== 607 tests, 5 stderr failures, 0 stdout failures, 0 stderrB failures, 0 stdoutB failures, 0 post failures ==
memcheck/tests/err_disable3 (stderr)
memcheck/tests/err_disable4 (stderr)
memcheck/tests/threadname (stderr)
memcheck/tests/threadname_xml (stderr)
exp-sgcheck/tests/hackedbz2 (stderr)
=================================================
./valgrind-new/exp-sgcheck/tests/hackedbz2.stderr.diff-glibc28-amd64
=================================================
--- hackedbz2.stderr.exp-glibc28-amd64 2014-07-21 20:23:57.409989222 -0500
+++ hackedbz2.stderr.out 2014-07-21 21:25:08.110308307 -0500
@@ -1,7 +1,6 @@
Invalid read of size 1
- at 0x........: vex_strlen (hackedbz2.c:1006)
- by 0x........: add_to_myprintf_buf (hackedbz2.c:1284)
+ at 0x........: add_to_myprintf_buf (hackedbz2.c:1006)
by 0x........: vex_printf (hackedbz2.c:1155)
by 0x........: BZ2_compressBlock (hackedbz2.c:4039)
by 0x........: handle_compress (hackedbz2.c:4761)
=================================================
./valgrind-new/memcheck/tests/err_disable3.stderr.diff
=================================================
--- err_disable3.stderr.exp 2014-07-21 20:23:15.988542471 -0500
+++ err_disable3.stderr.out 2014-07-21 20:45:51.977137286 -0500
@@ -10,8 +10,6 @@
Thread 2:
Invalid read of size 1
at 0x........: err (err_disable3.c:25)
- by 0x........: child_fn (err_disable3.c:31)
- ...
Address 0x........ is 5 bytes inside a block of size 10 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (err_disable3.c:42)
=================================================
./valgrind-new/memcheck/tests/err_disable4.stderr.diff
=================================================
--- err_disable4.stderr.exp 2014-07-21 20:23:25.497645025 -0500
+++ err_disable4.stderr.out 2014-07-21 20:45:57.622198068 -0500
@@ -1501,8 +1501,6 @@
Thread x:
Invalid read of size 1
at 0x........: err (err_disable4.c:41)
- by 0x........: child_fn_2 (err_disable4.c:55)
- ...
Address 0x........ is 5 bytes inside a block of size 10 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (err_disable4.c:68)
=================================================
./valgrind-new/memcheck/tests/threadname.stderr.diff
=================================================
--- threadname.stderr.exp 2014-07-21 20:23:21.610603104 -0500
+++ threadname.stderr.out 2014-07-21 20:52:11.852230462 -0500
@@ -9,36 +9,12 @@
Thread 2:
Invalid write of size 1
at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_0 (threadname.c:53)
- ...
Address 0x........ is 0 bytes after a block of size 2 alloc'd
at 0x........: malloc (vg_replace_malloc.c:...)
by 0x........: bad_things (threadname.c:15)
by 0x........: child_fn_0 (threadname.c:53)
...
-Thread 3 try1:
-Invalid write of size 1
- at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_1 (threadname.c:38)
- ...
- Address 0x........ is 0 bytes after a block of size 3 alloc'd
- at 0x........: malloc (vg_replace_malloc.c:...)
- by 0x........: bad_things (threadname.c:15)
- by 0x........: child_fn_1 (threadname.c:38)
- ...
-
-Thread 4 012345678901234:
-Invalid write of size 1
- at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_2 (threadname.c:26)
- ...
- Address 0x........ is 0 bytes after a block of size 4 alloc'd
- at 0x........: malloc (vg_replace_malloc.c:...)
- by 0x........: bad_things (threadname.c:15)
- by 0x........: child_fn_2 (threadname.c:26)
- ...
-
Thread 1:
Invalid write of size 1
at 0x........: bad_things (threadname.c:16)
=================================================
./valgrind-new/memcheck/tests/threadname_xml.stderr.diff
=================================================
--- threadname_xml.stderr.exp 2014-07-21 20:23:18.644571116 -0500
+++ threadname_xml.stderr.out 2014-07-21 20:52:13.923252793 -0500
@@ -94,14 +94,6 @@
<file>threadname.c</file>
<line>...</line>
</frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_0</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
</stack>
<auxwhat>Address 0x........ is 0 bytes after a block of size 2 alloc'd</auxwhat>
<stack>
@@ -135,112 +127,6 @@
<error>
<unique>0x........</unique>
<tid>...</tid>
- <threadname>try1</threadname>
- <kind>InvalidWrite</kind>
- <what>Invalid write of size 1</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_1</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
- <auxwhat>Address 0x........ is 0 bytes after a block of size 3 alloc'd</auxwhat>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>malloc</fn>
- <dir>...</dir>
- <file>vg_replace_malloc.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_1</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
-</error>
-
-<error>
- <unique>0x........</unique>
- <tid>...</tid>
- <threadname>012345678901234</threadname>
- <kind>InvalidWrite</kind>
- <what>Invalid write of size 1</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_2</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
- <auxwhat>Address 0x........ is 0 bytes after a block of size 4 alloc'd</auxwhat>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
<truncated beyond 100 lines>
=================================================
./valgrind-old/exp-sgcheck/tests/hackedbz2.stderr.diff-glibc28-amd64
=================================================
--- hackedbz2.stderr.exp-glibc28-amd64 2014-07-21 19:23:02.287869515 -0500
+++ hackedbz2.stderr.out 2014-07-21 20:21:42.149530624 -0500
@@ -1,7 +1,6 @@
Invalid read of size 1
- at 0x........: vex_strlen (hackedbz2.c:1006)
- by 0x........: add_to_myprintf_buf (hackedbz2.c:1284)
+ at 0x........: add_to_myprintf_buf (hackedbz2.c:1006)
by 0x........: vex_printf (hackedbz2.c:1155)
by 0x........: BZ2_compressBlock (hackedbz2.c:4039)
by 0x........: handle_compress (hackedbz2.c:4761)
=================================================
./valgrind-old/memcheck/tests/err_disable3.stderr.diff
=================================================
--- err_disable3.stderr.exp 2014-07-21 19:23:12.301976102 -0500
+++ err_disable3.stderr.out 2014-07-21 19:42:25.103220252 -0500
@@ -10,8 +10,6 @@
Thread 2:
Invalid read of size 1
at 0x........: err (err_disable3.c:25)
- by 0x........: child_fn (err_disable3.c:31)
- ...
Address 0x........ is 5 bytes inside a block of size 10 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (err_disable3.c:42)
=================================================
./valgrind-old/memcheck/tests/err_disable4.stderr.diff
=================================================
--- err_disable4.stderr.exp 2014-07-21 19:23:13.391987704 -0500
+++ err_disable4.stderr.out 2014-07-21 19:42:33.354308199 -0500
@@ -1501,8 +1501,6 @@
Thread x:
Invalid read of size 1
at 0x........: err (err_disable4.c:41)
- by 0x........: child_fn_2 (err_disable4.c:55)
- ...
Address 0x........ is 5 bytes inside a block of size 10 free'd
at 0x........: free (vg_replace_malloc.c:...)
by 0x........: main (err_disable4.c:68)
=================================================
./valgrind-old/memcheck/tests/threadname.stderr.diff
=================================================
--- threadname.stderr.exp 2014-07-21 19:23:04.950897859 -0500
+++ threadname.stderr.out 2014-07-21 19:48:45.216290840 -0500
@@ -9,36 +9,12 @@
Thread 2:
Invalid write of size 1
at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_0 (threadname.c:53)
- ...
Address 0x........ is 0 bytes after a block of size 2 alloc'd
at 0x........: malloc (vg_replace_malloc.c:...)
by 0x........: bad_things (threadname.c:15)
by 0x........: child_fn_0 (threadname.c:53)
...
-Thread 3 try1:
-Invalid write of size 1
- at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_1 (threadname.c:38)
- ...
- Address 0x........ is 0 bytes after a block of size 3 alloc'd
- at 0x........: malloc (vg_replace_malloc.c:...)
- by 0x........: bad_things (threadname.c:15)
- by 0x........: child_fn_1 (threadname.c:38)
- ...
-
-Thread 4 012345678901234:
-Invalid write of size 1
- at 0x........: bad_things (threadname.c:16)
- by 0x........: child_fn_2 (threadname.c:26)
- ...
- Address 0x........ is 0 bytes after a block of size 4 alloc'd
- at 0x........: malloc (vg_replace_malloc.c:...)
- by 0x........: bad_things (threadname.c:15)
- by 0x........: child_fn_2 (threadname.c:26)
- ...
-
Thread 1:
Invalid write of size 1
at 0x........: bad_things (threadname.c:16)
=================================================
./valgrind-old/memcheck/tests/threadname_xml.stderr.diff
=================================================
--- threadname_xml.stderr.exp 2014-07-21 19:23:07.692927044 -0500
+++ threadname_xml.stderr.out 2014-07-21 19:48:47.273312899 -0500
@@ -94,14 +94,6 @@
<file>threadname.c</file>
<line>...</line>
</frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_0</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
</stack>
<auxwhat>Address 0x........ is 0 bytes after a block of size 2 alloc'd</auxwhat>
<stack>
@@ -135,112 +127,6 @@
<error>
<unique>0x........</unique>
<tid>...</tid>
- <threadname>try1</threadname>
- <kind>InvalidWrite</kind>
- <what>Invalid write of size 1</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_1</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
- <auxwhat>Address 0x........ is 0 bytes after a block of size 3 alloc'd</auxwhat>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>malloc</fn>
- <dir>...</dir>
- <file>vg_replace_malloc.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_1</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
-</error>
-
-<error>
- <unique>0x........</unique>
- <tid>...</tid>
- <threadname>012345678901234</threadname>
- <kind>InvalidWrite</kind>
- <what>Invalid write of size 1</what>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>bad_things</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
- <fn>child_fn_2</fn>
- <dir>...</dir>
- <file>threadname.c</file>
- <line>...</line>
- </frame>
- </stack>
- <auxwhat>Address 0x........ is 0 bytes after a block of size 4 alloc'd</auxwhat>
- <stack>
- <frame>
- <ip>0x........</ip>
- <obj>...</obj>
<truncated beyond 100 lines>
|