Message ID | 20110505130829.1ad5f3d2@rex.config |
---|---|
State | New |
Headers | show |
On Thu, 2011-05-05 at 13:08 +0100, Julian Brown wrote: > On Tue, 03 May 2011 15:49:38 +0100 > Richard Earnshaw <rearnsha@arm.com> wrote: > > > > > On Tue, 2011-05-03 at 13:49 +0100, Julian Brown wrote: > > > Hi, > > > > > > This patch fixes vset_lane intrinsic variants for D-register sized > > > variables. A typo meant that the wrong lane would be set in many > > > circumstances. > > > > > > Tested manually only. OK to apply? > > > > > > Thanks, > > > > > > Julian > > > > > > ChangeLog > > > > > > gcc/ > > > * config/arm/neon.md (vec_set<mode>_internal): Fix misplaced > > > parenthesis in D-register case. > > > > Presumably this is a silent 'wrong-code' bug. If so, what about > > released compilers? > > Yes, this is a silent wrong-code bug. It affects branches back to at > gcc-4.4-branch at least: the patch will apply trivially to those, if > deemed appropriate (I think it's obvious enough to be risk-free). > > Joseph wrote: > > > And what about an execution testcase that fails before and passes > > after the patch? Is it hard to add one for some reason? > > I've added a testcase, and also done a regression run at Ramana's > request, which doesn't show up anything untoward. > > So: OK to apply to trunk? Other branches? (Which?) > Yes, and all open release branches. R. > Thanks, > > Julian > > ChangeLog > > gcc/ > * config/arm/neon.md (vec_set<mode>_internal): Fix misplaced > parenthesis in D-register case. > > gcc/testsuite/ > * gcc.target/arm/neon-vset_lanes8.c: New test.
Index: gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c =================================================================== --- gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c (revision 0) +++ gcc/testsuite/gcc.target/arm/neon-vset_lanes8.c (revision 0) @@ -0,0 +1,21 @@ +/* Test the `vset_lane_s8' ARM Neon intrinsic. */ + +/* { dg-do run } */ +/* { dg-require-effective-target arm_neon_hw } */ +/* { dg-options "-O0" } */ +/* { dg-add-options arm_neon } */ + +#include "arm_neon.h" +#include <stdlib.h> +#include <string.h> + +int8x8_t x = { 1, 2, 3, 4, 5, 6, 7, 8 }; +int8x8_t y = { 1, 2, 3, 16, 5, 6, 7, 8 }; + +int main (void) +{ + x = vset_lane_s8 (16, x, 3); + if (memcmp (&x, &y, sizeof (x)) != 0) + abort(); + return 0; +} Index: gcc/config/arm/neon.md =================================================================== --- gcc/config/arm/neon.md (revision 173299) +++ gcc/config/arm/neon.md (working copy) @@ -426,7 +426,7 @@ (match_operand:SI 2 "immediate_operand" "i")))] "TARGET_NEON" { - int elt = ffs ((int) INTVAL (operands[2]) - 1); + int elt = ffs ((int) INTVAL (operands[2])) - 1; if (BYTES_BIG_ENDIAN) elt = GET_MODE_NUNITS (<MODE>mode) - 1 - elt; operands[2] = GEN_INT (elt);