On Mon, Oct 10, 2022 at 11:07:06PM +0000, Joseph Myers wrote: > On Mon, 10 Oct 2022, Paul Iannetta via Gcc-patches wrote: > > > I have a patch to bring this feature to the C front-end as well, and > > would like to hear your opinion on it, especially since it may affect > > the feature-set of the objc front-end as well. > > > Currently, this is only a tentative patch and I did not add any tests > > to the testsuite. > > I think tests (possibly existing C++ tests moved to c-c++-common?) are > necessary to judge such a feature; it could better be judged based on > tests without implementation than based on implementation without tests.
Currently, this feature has the following tests in g++.dg/ext/ - vector9.C - vector19.C - vector21.C - vector22.C - vector23.C - vector27.C - vector28.C provided by Marc Glisse when he implemented the feature for C++. They are all handled by my mirror implementation (after removing C++-only features), save for a case in vector19.C ( v ? '1' : '2', where v is a vector of unsigned char, but '1' and '2' are considered as int, which results in a type mismatch.) I'll move those tests to c-c++-common tomorrow, but will duplicate vector19.C and vector23.C which rely on C++-only features. During my tests, I've been using variations around this: typedef int v2si __attribute__((__vector_size__ (2 * sizeof(int)))); v2si f (v2si a, v2si b, v2si c) { v2si d = a + !b; v2si e = a || b; return c ? (a + !b) && (c - e && a) : (!!b ^ c && e); } It is already possible to express much of the same thing without the syntactic sugar but is is barely legible typedef int v2si __attribute__((__vector_size__ (2 * sizeof(int)))); v2si f (v2si a, v2si b, v2si c) { v2si d = a + (b == 0); v2si e = (a != 0) | (b != 0); return ((c != 0) & (((a + (b == 0)) != 0) & (((c - e) != 0) & (a != 0)))) | ((c == 0) & (((((b == 0) == 0) ^ c) != 0) & (e != 0))); } Paul