On Thu, 18 Jul 2024, Richard Biener wrote:

> >    If both b and c are scalars and the type of true?b:c has the same size
> >    as the element type of a, then b and c are converted to a vector type
> >    whose elements have this type and with the same number of elements as a.
> > 
> > (in https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html )
> 
> But sizeof(typeof(true?‘a‘:‘b‘)) is four nevertheless the C++ frontend 
> produces vectors of char.

It is 1 in C++; in C it is four because 'a' has type int, not char.

(also, in C op2 and op3 of a ternary operator always have integer promotions
applied, but for vector selection we should use unpromoted types)

> > I think we require that sizes match because that's natural considering
> > how it is lowered (bitwise blending of comparison mask with op2/op3).
> 
> It works naturally for mixed sizes with for example AVX512 and better lowering
> could be implemented for SSE.

Yeah, I'm just saying it makes sense to me from a historical perspective.
I won't object if in C vector c?a:b is more useful than in C++.

Alexander

Reply via email to