* Ping: Make 128 bits the default vector size for NEON
@ 2011-04-21 8:57 Ira Rosen
2011-05-06 10:35 ` Richard Earnshaw
0 siblings, 1 reply; 7+ messages in thread
From: Ira Rosen @ 2011-04-21 8:57 UTC (permalink / raw)
To: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 2281 bytes --]
http://gcc.gnu.org/ml/gcc-patches/2011-03/msg02172.html
The last version:
ChangeLog:
* doc/invoke.texi (preferred-vector-size): Document.
* params.h (PREFERRED_VECTOR_SIZE): Define.
* config/arm/arm.c (arm_preferred_simd_mode): Use param
PREFERRED_VECTOR_SIZE instead of
TARGET_NEON_VECTORIZE_QUAD. Make 128 bits the default.
(arm_autovectorize_vector_sizes): Likewise.
* config/arm/arm.opt (NEON_VECTORIZE_QUAD): Add
RejectNegative.
* params.def (PARAM_PREFERRED_VECTOR_SIZE): Define.
testsuite/ChangeLog:
* lib/target-supports.exp (check_effective_target_vect_multiple_sizes):
New procedure.
(add_options_for_quad_vectors): Replace with ...
(add_options_for_double_vectors): ... this.
* gfortran.dg/vect/pr19049.f90: Expect more printings on targets that
support multiple vector sizes since the vectorizer attempts to
vectorize with both vector sizes.
* gcc.dg/vect/slp-reduc-6.c, gcc.dg/vect/no-vfa-vect-79.c,
gcc.dg/vect/no-vfa-vect-102a.c, gcc.dg/vect/vect-outer-1a.c,
gcc.dg/vect/vect-outer-1b.c, gcc.dg/vect/vect-outer-2b.c,
gcc.dg/vect/vect-outer-3a.c, gcc.dg/vect/no-vfa-vect-37.c,
gcc.dg/vect/vect-outer-3b.c, gcc.dg/vect/no-vfa-vect-101.c,
gcc.dg/vect/no-vfa-vect-102.c, gcc.dg/vect/vect-reduc-dot-s8b.c,
gcc.dg/vect/vect-outer-1.c, gcc.dg/vect/vect-104.c: Likewise.
* gcc.dg/vect/vect-16.c: Rename to...
* gcc.dg/vect/no-fast-math-vect-16.c: ... this to ensure that it runs
without -ffast-math.
* gcc.dg/vect/vect-42.c: Run with 64 bit vectors if applicable.
* gcc.dg/vect/vect-multitypes-6.c, gcc.dg/vect/vect-52.c,
gcc.dg/vect/vect-54.c, gcc.dg/vect/vect-46.c, gcc.dg/vect/vect-48.c,
gcc.dg/vect/vect-96.c, gcc.dg/vect/vect-multitypes-3.c,
gcc.dg/vect/vect-40.c: Likewise.
* gcc.dg/vect/vect-outer-5.c: Remove quad-vectors option as
redundant.
* gcc.dg/vect/vect-109.c, gcc.dg/vect/vect-peel-1.c,
gcc.dg/vect/vect-peel-2.c, gcc.dg/vect/slp-25.c,
gcc.dg/vect/vect-multitypes-1.c, gcc.dg/vect/slp-3.c,
gcc.dg/vect/no-vfa-pr29145.c, gcc.dg/vect/vect-multitypes-4.c:
Likewise.
* gcc.dg/vect/vect.exp: Run no-fast-math-vect*.c tests with
-fno-fast-math.
Thanks,
Ira
[-- Attachment #2: vec-size.txt --]
[-- Type: text/plain, Size: 25827 bytes --]
Index: doc/invoke.texi
===================================================================
--- doc/invoke.texi (revision 171723)
+++ doc/invoke.texi (working copy)
@@ -8874,6 +8874,10 @@ The maximum number of conditional stores paires th
if either vectorization (@option{-ftree-vectorize}) or if-conversion
(@option{-ftree-loop-if-convert}) is disabled. The default is 2.
+@item preferred-vector-size
+Preferred vector size in bits for targets that support multiple vector sizes.
+Invalid values are ignored. The default is 128.
+
@end table
@end table
Index: params.h
===================================================================
--- params.h (revision 171723)
+++ params.h (working copy)
@@ -204,6 +204,8 @@ extern void init_param_values (int *params);
PARAM_VALUE (PARAM_PREFETCH_MIN_INSN_TO_MEM_RATIO)
#define MIN_NONDEBUG_INSN_UID \
PARAM_VALUE (PARAM_MIN_NONDEBUG_INSN_UID)
+#define PREFERRED_VECTOR_SIZE \
+ PARAM_VALUE (PARAM_PREFERRED_VECTOR_SIZE)
#define MAX_STORES_TO_SINK \
PARAM_VALUE (PARAM_MAX_STORES_TO_SINK)
#endif /* ! GCC_PARAMS_H */
Index: testsuite/lib/target-supports.exp
===================================================================
--- testsuite/lib/target-supports.exp (revision 171723)
+++ testsuite/lib/target-supports.exp (working copy)
@@ -3203,6 +3203,24 @@ proc check_effective_target_vect_strided_wide { }
return $et_vect_strided_wide_saved
}
+# Return 1 if the target supports multiple vector sizes
+
+proc check_effective_target_vect_multiple_sizes { } {
+ global et_vect_multiple_sizes
+
+ if [info exists et_vect_multiple_sizes_saved] {
+ verbose "check_effective_target_vect_multiple_sizes: using cached result" 2
+ } else {
+ set et_vect_multiple_sizes_saved 0
+ if { ([istarget arm*-*-*] && [check_effective_target_arm_neon]) } {
+ set et_vect_multiple_sizes_saved 1
+ }
+ }
+
+ verbose "check_effective_target_vect_multiple_sizes: returning $et_vect_multiple_sizes_saved" 2
+ return $et_vect_multiple_sizes_saved
+}
+
# Return 1 if the target supports section-anchors
proc check_effective_target_section_anchors { } {
@@ -3585,9 +3603,9 @@ proc add_options_for_bind_pic_locally { flags } {
# Add to FLAGS the flags needed to enable 128-bit vectors.
-proc add_options_for_quad_vectors { flags } {
+proc add_options_for_double_vectors { flags } {
if [is-effective-target arm_neon_ok] {
- return "$flags -mvectorize-with-neon-quad"
+ return "$flags --param preferred-vector-size=64"
}
return $flags
Index: testsuite/gfortran.dg/vect/pr19049.f90
===================================================================
--- testsuite/gfortran.dg/vect/pr19049.f90 (revision 171723)
+++ testsuite/gfortran.dg/vect/pr19049.f90 (working copy)
@@ -19,6 +19,7 @@ subroutine s111 (ntimes,ld,n,ctime,dtime,a,b,c,d,e
end
! { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } }
-! { dg-final { scan-tree-dump-times "complicated access pattern" 1 "vect" } }
+! { dg-final { scan-tree-dump-times "complicated access pattern" 1 "vect" { xfail vect_multiple_sizes } } }
+! { dg-final { scan-tree-dump-times "complicated access pattern" 2 "vect" { target vect_multiple_sizes } } }
! { dg-final { cleanup-tree-dump "vect" } }
Index: testsuite/gcc.dg/vect/vect-16.c
===================================================================
--- testsuite/gcc.dg/vect/vect-16.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-16.c (working copy)
@@ -1,38 +0,0 @@
-/* { dg-require-effective-target vect_float } */
-
-#include <stdarg.h>
-#include "tree-vect.h"
-
-#define N 16
-#define DIFF 240
-
-__attribute__ ((noinline))
-int main1 ()
-{
- int i;
- float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
- float c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
- float diff;
-
- diff = 0;
- for (i = 0; i < N; i++) {
- diff += (b[i] - c[i]);
- }
-
- /* check results: */
- if (diff != DIFF)
- abort ();
-
- return 0;
-}
-
-int main (void)
-{
- check_vect ();
-
- return main1 ();
-}
-
-/* Requires fast-math. */
-/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-42.c
===================================================================
--- testsuite/gcc.dg/vect/vect-42.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-42.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/slp-reduc-6.c
===================================================================
--- testsuite/gcc.dg/vect/slp-reduc-6.c (revision 171723)
+++ testsuite/gcc.dg/vect/slp-reduc-6.c (working copy)
@@ -44,6 +44,7 @@ int main (void)
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" { xfail { vect_no_int_add || { ! vect_unpack } } } } } */
/* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "different interleaving chains in one node" 1 "vect" { target { ! vect_no_int_add } } } } */
+/* { dg-final { scan-tree-dump-times "different interleaving chains in one node" 1 "vect" { xfail { vect_multiple_sizes || vect_no_int_add } } } } */
+/* { dg-final { scan-tree-dump-times "different interleaving chains in one node" 2 "vect" { target { {! vect_no_int_add} && vect_multiple_sizes } } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-vfa-vect-79.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-79.c (revision 171723)
+++ testsuite/gcc.dg/vect/no-vfa-vect-79.c (working copy)
@@ -46,5 +46,6 @@ int main (void)
If/when the aliasing problems are resolved, unalignment may
prevent vectorization on some targets. */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "can't determine dependence between" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-vfa-vect-102a.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-102a.c (revision 171723)
+++ testsuite/gcc.dg/vect/no-vfa-vect-102a.c (working copy)
@@ -53,6 +53,7 @@ int main (void)
}
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-outer-5.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-5.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-outer-5.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_float } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include <signal.h>
Index: testsuite/gcc.dg/vect/vect-multitypes-6.c
===================================================================
--- testsuite/gcc.dg/vect/vect-multitypes-6.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-multitypes-6.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_int } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-52.c
===================================================================
--- testsuite/gcc.dg/vect/vect-52.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-52.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-109.c
===================================================================
--- testsuite/gcc.dg/vect/vect-109.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-109.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-54.c
===================================================================
--- testsuite/gcc.dg/vect/vect-54.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-54.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-46.c
===================================================================
--- testsuite/gcc.dg/vect/vect-46.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-46.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-peel-1.c
===================================================================
--- testsuite/gcc.dg/vect/vect-peel-1.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-peel-1.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-outer-1a.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-1a.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-outer-1a.c (working copy)
@@ -20,5 +20,6 @@ foo (){
}
/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-peel-2.c
===================================================================
--- testsuite/gcc.dg/vect/vect-peel-2.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-peel-2.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-48.c
===================================================================
--- testsuite/gcc.dg/vect/vect-48.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-48.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-outer-1b.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-1b.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-outer-1b.c (working copy)
@@ -22,5 +22,6 @@ foo (){
}
/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-outer-2b.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-2b.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-outer-2b.c (working copy)
@@ -37,5 +37,6 @@ int main (void)
return 0;
}
-/* { dg-final { scan-tree-dump-times "strided access in outer loop." 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-outer-3a.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-3a.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-outer-3a.c (working copy)
@@ -49,5 +49,6 @@ int main (void)
}
/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail vect_no_align } } } */
-/* { dg-final { scan-tree-dump-times "step doesn't divide the vector-size" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "step doesn't divide the vector-size" 2 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "step doesn't divide the vector-size" 4 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-vfa-vect-37.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-37.c (revision 171723)
+++ testsuite/gcc.dg/vect/no-vfa-vect-37.c (working copy)
@@ -58,5 +58,6 @@ int main (void)
If/when the aliasing problems are resolved, unalignment may
prevent vectorization on some targets. */
/* { dg-final { scan-tree-dump-times "vectorized 2 loops" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "can't determine dependence between" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 2 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 4 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/slp-25.c
===================================================================
--- testsuite/gcc.dg/vect/slp-25.c (revision 171723)
+++ testsuite/gcc.dg/vect/slp-25.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-outer-3b.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-3b.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-outer-3b.c (working copy)
@@ -49,5 +49,6 @@ int main (void)
}
/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 4 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-fast-math-vect-16.c
===================================================================
--- testsuite/gcc.dg/vect/no-fast-math-vect-16.c (revision 0)
+++ testsuite/gcc.dg/vect/no-fast-math-vect-16.c (revision 0)
@@ -0,0 +1,38 @@
+/* { dg-require-effective-target vect_float } */
+
+#include <stdarg.h>
+#include "tree-vect.h"
+
+#define N 16
+#define DIFF 240
+
+__attribute__ ((noinline))
+int main1 ()
+{
+ int i;
+ float b[N] = {0,3,6,9,12,15,18,21,24,27,30,33,36,39,42,45};
+ float c[N] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
+ float diff;
+
+ diff = 0;
+ for (i = 0; i < N; i++) {
+ diff += (b[i] - c[i]);
+ }
+
+ /* check results: */
+ if (diff != DIFF)
+ abort ();
+
+ return 0;
+}
+
+int main (void)
+{
+ check_vect ();
+
+ return main1 ();
+}
+
+/* Requires fast-math. */
+/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */
+/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-vfa-vect-101.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-101.c (revision 171723)
+++ testsuite/gcc.dg/vect/no-vfa-vect-101.c (working copy)
@@ -45,6 +45,7 @@ int main (void)
}
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "can't determine dependence" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "can't determine dependence" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/no-vfa-vect-102.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-vect-102.c (revision 171723)
+++ testsuite/gcc.dg/vect/no-vfa-vect-102.c (working copy)
@@ -53,6 +53,7 @@ int main (void)
}
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-96.c
===================================================================
--- testsuite/gcc.dg/vect/vect-96.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-96.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_int } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-multitypes-1.c
===================================================================
--- testsuite/gcc.dg/vect/vect-multitypes-1.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-multitypes-1.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c
===================================================================
--- testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-reduc-dot-s8b.c (working copy)
@@ -58,7 +58,8 @@ int main (void)
}
/* { dg-final { scan-tree-dump-times "vect_recog_dot_prod_pattern: detected" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "vect_recog_widen_mult_pattern: detected" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 1 "vect" { xfail *-*-* } } } */
Index: testsuite/gcc.dg/vect/vect-outer-1.c
===================================================================
--- testsuite/gcc.dg/vect/vect-outer-1.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-outer-1.c (working copy)
@@ -22,5 +22,6 @@ foo (){
}
/* { dg-final { scan-tree-dump-times "OUTER LOOP VECTORIZED" 1 "vect" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "strided access in outer loop" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/slp-3.c
===================================================================
--- testsuite/gcc.dg/vect/slp-3.c (revision 171723)
+++ testsuite/gcc.dg/vect/slp-3.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
@@ -79,7 +78,7 @@ main1 ()
}
/* check results: */
- for (i = 0; i < N/2; i++)
+ for (i = 0; i < N/4; i++)
{
if (out[i*16] != in[i*16]
|| out[i*16 + 1] != in[i*16 + 1]
Index: testsuite/gcc.dg/vect/no-vfa-pr29145.c
===================================================================
--- testsuite/gcc.dg/vect/no-vfa-pr29145.c (revision 171723)
+++ testsuite/gcc.dg/vect/no-vfa-pr29145.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect.exp
===================================================================
--- testsuite/gcc.dg/vect/vect.exp (revision 171723)
+++ testsuite/gcc.dg/vect/vect.exp (working copy)
@@ -102,6 +102,12 @@ lappend DEFAULT_VECTCFLAGS "-ffast-math"
dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/fast-math-*.\[cS\]]] \
"" $DEFAULT_VECTCFLAGS
+# -fno-fast-math tests
+set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
+lappend DEFAULT_VECTCFLAGS "-fno-fast-math"
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/no-fast-math-*.\[cS\]]] \
+ "" $DEFAULT_VECTCFLAGS
+
# -fno-math-errno tests
set DEFAULT_VECTCFLAGS $SAVED_DEFAULT_VECTCFLAGS
lappend DEFAULT_VECTCFLAGS "-fno-math-errno"
Index: testsuite/gcc.dg/vect/vect-multitypes-3.c
===================================================================
--- testsuite/gcc.dg/vect/vect-multitypes-3.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-multitypes-3.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_int } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-40.c
===================================================================
--- testsuite/gcc.dg/vect/vect-40.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-40.c (working copy)
@@ -1,4 +1,5 @@
/* { dg-require-effective-target vect_float } */
+/* { dg-add-options double_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: testsuite/gcc.dg/vect/vect-104.c
===================================================================
--- testsuite/gcc.dg/vect/vect-104.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-104.c (working copy)
@@ -64,6 +64,7 @@ int main (void)
}
/* { dg-final { scan-tree-dump-times "vectorized 1 loops" 0 "vect" } } */
-/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 1 "vect" { xfail vect_multiple_sizes } } } */
+/* { dg-final { scan-tree-dump-times "possible dependence between data-refs" 2 "vect" { target vect_multiple_sizes } } } */
/* { dg-final { cleanup-tree-dump "vect" } } */
Index: testsuite/gcc.dg/vect/vect-multitypes-4.c
===================================================================
--- testsuite/gcc.dg/vect/vect-multitypes-4.c (revision 171723)
+++ testsuite/gcc.dg/vect/vect-multitypes-4.c (working copy)
@@ -1,5 +1,4 @@
/* { dg-require-effective-target vect_int } */
-/* { dg-add-options quad_vectors } */
#include <stdarg.h>
#include "tree-vect.h"
Index: config/arm/arm.c
===================================================================
--- config/arm/arm.c (revision 171723)
+++ config/arm/arm.c (working copy)
@@ -22297,17 +22297,16 @@ arm_preferred_simd_mode (enum machine_mode mode)
switch (mode)
{
case SFmode:
- return TARGET_NEON_VECTORIZE_QUAD ? V4SFmode : V2SFmode;
+ return (PREFERRED_VECTOR_SIZE == 64) ? V2SFmode : V4SFmode;
case SImode:
- return TARGET_NEON_VECTORIZE_QUAD ? V4SImode : V2SImode;
+ return (PREFERRED_VECTOR_SIZE == 64) ? V2SImode : V4SImode;
case HImode:
- return TARGET_NEON_VECTORIZE_QUAD ? V8HImode : V4HImode;
+ return (PREFERRED_VECTOR_SIZE == 64) ? V4HImode : V8HImode;
case QImode:
- return TARGET_NEON_VECTORIZE_QUAD ? V16QImode : V8QImode;
+ return (PREFERRED_VECTOR_SIZE == 64)? V8QImode : V16QImode;
case DImode:
- if (TARGET_NEON_VECTORIZE_QUAD)
- return V2DImode;
- break;
+ if (PREFERRED_VECTOR_SIZE != 64)
+ return V2DImode;
default:;
}
@@ -23535,7 +23534,7 @@ arm_expand_sync (enum machine_mode mode,
static unsigned int
arm_autovectorize_vector_sizes (void)
{
- return TARGET_NEON_VECTORIZE_QUAD ? 16 | 8 : 0;
+ return (PREFERRED_VECTOR_SIZE != 64) ? 16 | 8 : 0;
}
static bool
Index: config/arm/arm.opt
===================================================================
--- config/arm/arm.opt (revision 171723)
+++ config/arm/arm.opt (working copy)
@@ -158,7 +158,7 @@ Target Report RejectNegative Mask(LITTLE_WORDS)
Assume big endian bytes, little endian words
mvectorize-with-neon-quad
-Target Report Mask(NEON_VECTORIZE_QUAD)
+Target Report RejectNegative Mask(NEON_VECTORIZE_QUAD)
Use Neon quad-word (rather than double-word) registers for vectorization
mword-relocations
Index: params.def
===================================================================
--- params.def (revision 171723)
+++ params.def (working copy)
@@ -880,6 +880,12 @@ DEFPARAM (PARAM_MAX_STORES_TO_SINK,
2, 0, 0)
+/* Preferred vector size in bits. Invalid values are ignored. */
+DEFPARAM (PARAM_PREFERRED_VECTOR_SIZE,
+ "preferred-vector-size",
+ "Preferred vector size in bits",
+ 128, 0, 0)
+
/*
Local variables:
mode:c
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Ping: Make 128 bits the default vector size for NEON
2011-04-21 8:57 Ping: Make 128 bits the default vector size for NEON Ira Rosen
@ 2011-05-06 10:35 ` Richard Earnshaw
2011-05-08 13:42 ` Ira Rosen
0 siblings, 1 reply; 7+ messages in thread
From: Richard Earnshaw @ 2011-05-06 10:35 UTC (permalink / raw)
To: Ira Rosen; +Cc: gcc-patches
On Thu, 2011-04-21 at 09:02 +0300, Ira Rosen wrote:
> http://gcc.gnu.org/ml/gcc-patches/2011-03/msg02172.html
>
> The last version:
>
> ChangeLog:
>
> * doc/invoke.texi (preferred-vector-size): Document.
> * params.h (PREFERRED_VECTOR_SIZE): Define.
> * config/arm/arm.c (arm_preferred_simd_mode): Use param
> PREFERRED_VECTOR_SIZE instead of
> TARGET_NEON_VECTORIZE_QUAD. Make 128 bits the default.
> (arm_autovectorize_vector_sizes): Likewise.
> * config/arm/arm.opt (NEON_VECTORIZE_QUAD): Add
> RejectNegative.
> * params.def (PARAM_PREFERRED_VECTOR_SIZE): Define.
>
> testsuite/ChangeLog:
>
> * lib/target-supports.exp (check_effective_target_vect_multiple_sizes):
> New procedure.
> (add_options_for_quad_vectors): Replace with ...
> (add_options_for_double_vectors): ... this.
> * gfortran.dg/vect/pr19049.f90: Expect more printings on targets that
> support multiple vector sizes since the vectorizer attempts to
> vectorize with both vector sizes.
> * gcc.dg/vect/slp-reduc-6.c, gcc.dg/vect/no-vfa-vect-79.c,
> gcc.dg/vect/no-vfa-vect-102a.c, gcc.dg/vect/vect-outer-1a.c,
> gcc.dg/vect/vect-outer-1b.c, gcc.dg/vect/vect-outer-2b.c,
> gcc.dg/vect/vect-outer-3a.c, gcc.dg/vect/no-vfa-vect-37.c,
> gcc.dg/vect/vect-outer-3b.c, gcc.dg/vect/no-vfa-vect-101.c,
> gcc.dg/vect/no-vfa-vect-102.c, gcc.dg/vect/vect-reduc-dot-s8b.c,
> gcc.dg/vect/vect-outer-1.c, gcc.dg/vect/vect-104.c: Likewise.
> * gcc.dg/vect/vect-16.c: Rename to...
> * gcc.dg/vect/no-fast-math-vect-16.c: ... this to ensure that it runs
> without -ffast-math.
> * gcc.dg/vect/vect-42.c: Run with 64 bit vectors if applicable.
> * gcc.dg/vect/vect-multitypes-6.c, gcc.dg/vect/vect-52.c,
> gcc.dg/vect/vect-54.c, gcc.dg/vect/vect-46.c, gcc.dg/vect/vect-48.c,
> gcc.dg/vect/vect-96.c, gcc.dg/vect/vect-multitypes-3.c,
> gcc.dg/vect/vect-40.c: Likewise.
> * gcc.dg/vect/vect-outer-5.c: Remove quad-vectors option as
> redundant.
> * gcc.dg/vect/vect-109.c, gcc.dg/vect/vect-peel-1.c,
> gcc.dg/vect/vect-peel-2.c, gcc.dg/vect/slp-25.c,
> gcc.dg/vect/vect-multitypes-1.c, gcc.dg/vect/slp-3.c,
> gcc.dg/vect/no-vfa-pr29145.c, gcc.dg/vect/vect-multitypes-4.c:
> Likewise.
> * gcc.dg/vect/vect.exp: Run no-fast-math-vect*.c tests with
> -fno-fast-math.
>
> Thanks,
> Ira
+@item preferred-vector-size
+Preferred vector size in bits for targets that support multiple vector sizes.
+Invalid values are ignored. The default is 128.
+
Shouldn't the preferred size be the largest size supported by the
target? Setting it to 128 might be OK today, but who knows what might
happen in future?
R.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Ping: Make 128 bits the default vector size for NEON
2011-05-06 10:35 ` Richard Earnshaw
@ 2011-05-08 13:42 ` Ira Rosen
2011-05-08 13:56 ` Gerald Pfeifer
0 siblings, 1 reply; 7+ messages in thread
From: Ira Rosen @ 2011-05-08 13:42 UTC (permalink / raw)
To: Richard Earnshaw; +Cc: gcc-patches
On 6 May 2011 13:29, Richard Earnshaw <rearnsha@arm.com> wrote:
>
> On Thu, 2011-04-21 at 09:02 +0300, Ira Rosen wrote:
>> http://gcc.gnu.org/ml/gcc-patches/2011-03/msg02172.html
>>
>> The last version:
>>
>> ChangeLog:
>>
>> * doc/invoke.texi (preferred-vector-size): Document.
>> * params.h (PREFERRED_VECTOR_SIZE): Define.
>> * config/arm/arm.c (arm_preferred_simd_mode): Use param
>> PREFERRED_VECTOR_SIZE instead of
>> TARGET_NEON_VECTORIZE_QUAD. Make 128 bits the default.
>> (arm_autovectorize_vector_sizes): Likewise.
>> * config/arm/arm.opt (NEON_VECTORIZE_QUAD): Add
>> RejectNegative.
>> * params.def (PARAM_PREFERRED_VECTOR_SIZE): Define.
>>
>> testsuite/ChangeLog:
>>
>> * lib/target-supports.exp (check_effective_target_vect_multiple_sizes):
>> New procedure.
>> (add_options_for_quad_vectors): Replace with ...
>> (add_options_for_double_vectors): ... this.
>> * gfortran.dg/vect/pr19049.f90: Expect more printings on targets that
>> support multiple vector sizes since the vectorizer attempts to
>> vectorize with both vector sizes.
>> * gcc.dg/vect/slp-reduc-6.c, gcc.dg/vect/no-vfa-vect-79.c,
>> gcc.dg/vect/no-vfa-vect-102a.c, gcc.dg/vect/vect-outer-1a.c,
>> gcc.dg/vect/vect-outer-1b.c, gcc.dg/vect/vect-outer-2b.c,
>> gcc.dg/vect/vect-outer-3a.c, gcc.dg/vect/no-vfa-vect-37.c,
>> gcc.dg/vect/vect-outer-3b.c, gcc.dg/vect/no-vfa-vect-101.c,
>> gcc.dg/vect/no-vfa-vect-102.c, gcc.dg/vect/vect-reduc-dot-s8b.c,
>> gcc.dg/vect/vect-outer-1.c, gcc.dg/vect/vect-104.c: Likewise.
>> * gcc.dg/vect/vect-16.c: Rename to...
>> * gcc.dg/vect/no-fast-math-vect-16.c: ... this to ensure that it runs
>> without -ffast-math.
>> * gcc.dg/vect/vect-42.c: Run with 64 bit vectors if applicable.
>> * gcc.dg/vect/vect-multitypes-6.c, gcc.dg/vect/vect-52.c,
>> gcc.dg/vect/vect-54.c, gcc.dg/vect/vect-46.c, gcc.dg/vect/vect-48.c,
>> gcc.dg/vect/vect-96.c, gcc.dg/vect/vect-multitypes-3.c,
>> gcc.dg/vect/vect-40.c: Likewise.
>> * gcc.dg/vect/vect-outer-5.c: Remove quad-vectors option as
>> redundant.
>> * gcc.dg/vect/vect-109.c, gcc.dg/vect/vect-peel-1.c,
>> gcc.dg/vect/vect-peel-2.c, gcc.dg/vect/slp-25.c,
>> gcc.dg/vect/vect-multitypes-1.c, gcc.dg/vect/slp-3.c,
>> gcc.dg/vect/no-vfa-pr29145.c, gcc.dg/vect/vect-multitypes-4.c:
>> Likewise.
>> * gcc.dg/vect/vect.exp: Run no-fast-math-vect*.c tests with
>> -fno-fast-math.
>>
>> Thanks,
>> Ira
>
> +@item preferred-vector-size
> +Preferred vector size in bits for targets that support multiple vector sizes.
> +Invalid values are ignored. The default is 128.
> +
>
> Shouldn't the preferred size be the largest size supported by the
> target? Setting it to 128 might be OK today, but who knows what might
> happen in future?
How about ARM specific flag similar to -mprefer-avx128 (not tested)?
Thanks,
Ira
ChangeLog:
* config/arm/arm.c (arm_preferred_simd_mode): Use
flag_prefer_neon_double instead of
TARGET_NEON_VECTORIZE_QUAD. Make 128 bits the default.
(arm_autovectorize_vector_sizes): Likewise.
* config/arm/arm.opt (NEON_VECTORIZE_QUAD): Add
RejectNegative.
(mprefer-neon-double): New flag.
(the testsuite part is unchanged).
Index: config/arm/arm.c
===================================================================
--- config/arm/arm.c (revision 173546)
+++ config/arm/arm.c (working copy)
@@ -22482,16 +22482,16 @@ arm_preferred_simd_mode (enum machine_mode mode)
switch (mode)
{
case SFmode:
- return TARGET_NEON_VECTORIZE_QUAD ? V4SFmode : V2SFmode;
- case SImode:
- return TARGET_NEON_VECTORIZE_QUAD ? V4SImode : V2SImode;
- case HImode:
- return TARGET_NEON_VECTORIZE_QUAD ? V8HImode : V4HImode;
- case QImode:
- return TARGET_NEON_VECTORIZE_QUAD ? V16QImode : V8QImode;
- case DImode:
- if (TARGET_NEON_VECTORIZE_QUAD)
- return V2DImode;
+ return flag_prefer_neon_double ? V2SFmode : V4SFmode;
+ case SImode:
+ return flag_prefer_neon_double ? V2SImode : V4SImode;
+ case HImode:
+ return flag_prefer_neon_double ? V4HImode : V8HImode;
+ case QImode:
+ return flag_prefer_neon_double ? V8QImode : V16QImode;
+ case DImode:
+ if (!flag_prefer_neon_double)
+ return V2DImode;
break;
default:;
@@ -23722,7 +23722,7 @@ arm_expand_sync (enum machine_mode mode,
static unsigned int
arm_autovectorize_vector_sizes (void)
{
- return TARGET_NEON_VECTORIZE_QUAD ? 16 | 8 : 0;
+ return (!flag_prefer_neon_double) ? 16 | 8 : 0;
}
static bool
Index: config/arm/arm.opt
===================================================================
--- config/arm/arm.opt (revision 173546)
+++ config/arm/arm.opt (working copy)
@@ -160,9 +160,13 @@ Target Report RejectNegative Mask(LITTLE_WORDS)
Assume big endian bytes, little endian words
mvectorize-with-neon-quad
-Target Report Mask(NEON_VECTORIZE_QUAD)
+Target Report RejectNegative Mask(NEON_VECTORIZE_QUAD)
Use Neon quad-word (rather than double-word) registers for vectorization
+mprefer-neon-double
+Target Report Var(flag_prefer_neon_double) Init(0)
+Use Neon double-word registers for vectorization
+
mword-relocations
Target Report Var(target_word_relocations)
Init(TARGET_DEFAULT_WORD_RELOCATIONS)
Only generate absolute relocations on word sized values.
>
> R.
>
>
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Ping: Make 128 bits the default vector size for NEON
2011-05-08 13:42 ` Ira Rosen
@ 2011-05-08 13:56 ` Gerald Pfeifer
2011-05-08 14:05 ` Ira Rosen
0 siblings, 1 reply; 7+ messages in thread
From: Gerald Pfeifer @ 2011-05-08 13:56 UTC (permalink / raw)
To: Ira Rosen; +Cc: Richard Earnshaw, gcc-patches
On Sun, 8 May 2011, Ira Rosen wrote:
> How about ARM specific flag similar to -mprefer-avx128 (not tested)?
If this goes in, please also update gcc-4.7/changes.html.
Thanks,
Gerald
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Ping: Make 128 bits the default vector size for NEON
2011-05-08 13:56 ` Gerald Pfeifer
@ 2011-05-08 14:05 ` Ira Rosen
2011-05-09 4:32 ` Gerald Pfeifer
0 siblings, 1 reply; 7+ messages in thread
From: Ira Rosen @ 2011-05-08 14:05 UTC (permalink / raw)
To: Gerald Pfeifer; +Cc: Richard Earnshaw, gcc-patches
On 8 May 2011 15:02, Gerald Pfeifer <gerald@pfeifer.com> wrote:
> On Sun, 8 May 2011, Ira Rosen wrote:
>> How about ARM specific flag similar to -mprefer-avx128 (not tested)?
>
> If this goes in, please also update gcc-4.7/changes.html.
Do you mean that the new flag should be documented?
This patch http://gcc.gnu.org/ml/gcc-patches/2011-04/msg00318.html
updates about the change of the default vector size.
Thanks,
Ira
>
> Thanks,
> Gerald
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Ping: Make 128 bits the default vector size for NEON
2011-05-08 14:05 ` Ira Rosen
@ 2011-05-09 4:32 ` Gerald Pfeifer
2011-05-09 9:33 ` Ira Rosen
0 siblings, 1 reply; 7+ messages in thread
From: Gerald Pfeifer @ 2011-05-09 4:32 UTC (permalink / raw)
To: Ira Rosen; +Cc: Richard Earnshaw, gcc-patches
On Sun, 8 May 2011, Ira Rosen wrote:
>> If this goes in, please also update gcc-4.7/changes.html.
> Do you mean that the new flag should be documented?
Yes, as we're adding new flags, it's (nearly?) always a good idea to
document them as part of the release notes.
> This patch http://gcc.gnu.org/ml/gcc-patches/2011-04/msg00318.html
> updates about the change of the default vector size.
That one I acked, right?
Gerald
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: Ping: Make 128 bits the default vector size for NEON
2011-05-09 4:32 ` Gerald Pfeifer
@ 2011-05-09 9:33 ` Ira Rosen
0 siblings, 0 replies; 7+ messages in thread
From: Ira Rosen @ 2011-05-09 9:33 UTC (permalink / raw)
To: Gerald Pfeifer; +Cc: gcc-patches, Ira Rosen, Richard Earnshaw
Gerald Pfeifer <gerald@pfeifer.com> wrote on 09/05/2011 01:53:35 AM:
>
> On Sun, 8 May 2011, Ira Rosen wrote:
> >> If this goes in, please also update gcc-4.7/changes.html.
> > Do you mean that the new flag should be documented?
>
> Yes, as we're adding new flags, it's (nearly?) always a good idea to
> document them as part of the release notes.
OK.
>
> > This patch http://gcc.gnu.org/ml/gcc-patches/2011-04/msg00318.html
> > updates about the change of the default vector size.
>
> That one I acked, right?
Yes.
Thanks,
Ira
>
> Gerald
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2011-05-09 5:40 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-21 8:57 Ping: Make 128 bits the default vector size for NEON Ira Rosen
2011-05-06 10:35 ` Richard Earnshaw
2011-05-08 13:42 ` Ira Rosen
2011-05-08 13:56 ` Gerald Pfeifer
2011-05-08 14:05 ` Ira Rosen
2011-05-09 4:32 ` Gerald Pfeifer
2011-05-09 9:33 ` Ira Rosen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).