On Thu, Dec 11, 2014 at 2:34 PM, Eduardo Lima Mitev <el...@igalia.com> wrote: > From: Iago Toral Quiroga <ito...@igalia.com> > > For code such as this in a vertex or fragment shader: > > uniform float in0; > flat out float out0; > ... > out0 = ceil(in0) > > We generate this IR: > > (assign (x) (var_ref packed:out0) > (expression int bitcast_f2i > (expression float ceil (var_ref in0) ) ) ) > > In i965, this would eventually become: > > rndd(8) g14<1>.xF -g3<0,4,1>.xF > mov(8) g6<1>.xD -g14<4,4,1>.xD > mov(8) g116<1>D g6<4,4,1>D > > which does not produce the expected result. > > The problem has to do with the second instruction, that changes the > type to D at the same time it does the negate. For this to work we > need to negate first with the original type, then change the type > to the bitcast destination so we produce code like this instead: > > rndd(8) g14<1>.xF -g3<0,4,1>.xF > mov(8) g6<1>.xF -g14<4,4,1>.xF > mov(8) g116<1>D g6<4,4,1>D
I found and fixed a problem (in commit 0ae9ca12a8) last year where we would put move the source modifiers out of the bitcast_*(...). In that commit, I just emit a MOV to do the source modifier as a separate step, and then let copy propagation handle getting rid of it when possible. It looks like I didn't notice that ceil also does the in place op[0].negate = !op[0].negate. Instead of special casing the bit cast functions, we should just emit the extra MOV in ceil and let copy propagation clean it up when possible. _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev