This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[mips] Change the definition of macro SHIFT_COUNT_TRUNCATED


Hello,

This patch change the definition of macro SHIFT_COUNT_TRUNCATED. This
can fix the bug on Loongson for such an test case,

/* { dg-do run } */
/* { dg-options "isa=loongson -mhard-float -mno-mips16 -O1" } */

#include "loongson.h"
#include <assert.h>

typedef union { int32x2_t v; int32_t a[2]; } int32x2_encap_t;

void
main1 (int shift)
{
  int32x2_encap_t s;
  int32x2_encap_t r;

  s.a[0] = 0xffffffff;
  s.a[1] = 0xffffffff;
  /* Loongson SIMD use low-order 7 bits to specify the shift amount. Thus
   V2SI << 0x40 == 0. The below expression 'shift & 0x3f' will be mis-optimized
   as 'shift', if SHIFT_COUNT_TRUNCATED is nonzero. */
  r.v = psllw_s (s.v, (shift & 0x3f));
  assert (r.a[0] == 0xffffffff);
  assert (r.a[1] == 0xffffffff);
}

int
main (void)
{
  main1 (0x40);
  return 0;
}

ChangeLog:
2010-08-28  Mingjie Xing  <mingjie.xing@gmail.com>

        * config/mips/mips.h (SHIFT_COUNT_TRUNCATED) : Define to 0 for
Loongson targets, 1 otherwise.

Is it OK?

BTW, I'm not sure if I should commit the test case.

Thanks,
Mingjie
Index: config/mips/mips.h
===================================================================
--- config/mips/mips.h	(revision 163612)
+++ config/mips/mips.h	(working copy)
@@ -2422,8 +2422,11 @@ typedef struct mips_args {
 #define SLOW_BYTE_ACCESS (!TARGET_MIPS16)
 
 /* Define this to be nonzero if shift instructions ignore all but the low-order
-   few bits.  */
-#define SHIFT_COUNT_TRUNCATED 1
+   few bits.
+
+   For Loongson targets, the Loongson specific vector shift instructions are
+   not SHIFT_COUNT_TRUNCATED. */
+#define SHIFT_COUNT_TRUNCATED (TARGET_LOONGSON_2EF ? 0 : 1)
 
 /* Value is 1 if truncating an integer of INPREC bits to OUTPREC bits
    is done just by pretending it is already truncated.  */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]