On Tue, Aug 16, 2011 at 11:12 PM, Artem Shinkarov <artyom.shinkar...@gmail.com> wrote: > Hi, here is a new version of the patch with the adjustments. > > Two important comments. > 1) At the moment when I expand expression mask ? vec0 : vec1, I > replace mask with (mask == {-1,-1,..}). The first reason is that > expand_vec_cond_expr requires first operand to be a comparison. Second > reason is that a mask {3, 4, -1, 5} should be transformed into > {0,0,-1,0} in order to simulate vcond as ((vec0 & mask) | (vec1 & > ~mask)). So in both cases we need this adjustment.
Well. From a middle-end view I'd say that mask ? vec0 : vec1 should return (vec0 & mask) | (vec1 & ~mask) which is what the XOP vcond instructions do, btw. Only by defining v1 < v2 to return a mask constrained to {-1|0, -1|0, ...} the combination v1 < v2 ? vec0 : vec1 gets it's vector element selection semantic (instead of being just a bitwise selection, which it really is). So no, I don't think we need to convert {3, 4, -1, 5} to {0,0,-1,0} (that would surprise my anyway, I'd have expected {-1,-1,-1,-1} ;)). Does OpenCL somehow support you here? > 2) Vector comparison through optab. > As far as I just have adjusted expand_vector_operation in > tree-vect-generic.c, it would be called only when there is no > sufficient optab. I is being checked in expand_vector_operations_1. So > the only place where I try to find an optab for the comparison is > expand_vec_cond_expr_piecewise, which I adjusted. > > As for the vector hook, it will be triggered only when we don't have > an appropriate optab. > > bootstrapped and tested on x86_64-unknown-linux-gnu. > Anything else? I didn't yet look at the updated patch, I'll wait for another update that eventually follows my comments to your earlier mail. Richard. > > Artem. >