[Mesa-dev] Mesa (master): glsl: fix assorted MSVC warnings

José Fonseca jfonseca at vmware.com
Tue Nov 16 13:01:31 PST 2010


On Tue, 2010-11-16 at 11:55 -0800, Ian Romanick wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> On 11/15/2010 05:48 PM, Brian Paul wrote:
> 
> >     case ir_unop_b2f:
> >        assert(op[0]->type->base_type == GLSL_TYPE_BOOL);
> >        for (unsigned c = 0; c < op[0]->type->components(); c++) {
> > -	 data.f[c] = op[0]->value.b[c] ? 1.0 : 0.0;
> > +	 data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F;
> 
> Please don't do this.  This particular MSVC warning should just be
> disabled.  If this warning were generated for non-literals and for
> literals that actually did lose precision being stored to a float, it
> might have a chance at having some value.  Instead, it's just noise.
> 
> Individual warnings can be disabled with a pragma, and this one should
> probably be disabled in mesa/compiler.h:
> 
> #pragma warning(disable: 4244)
> 
> There may be a way to do it from the command line, but I don't know what
> it is.

It's -wd4244.

> The F suffixes on constants are also worthless, and they make the code
> ugly. 

I had the impression it was more than a warning, namely that the
compilers would use double precision intermediates instead of single
precision floats when constants don't have the 'f' suffix.

Gcc does it. Take for example:

         float foo(float x)
        {
        	return 1.0 / x + 5.0;
        }
        
        float foof(float x)
        {
        	return 1.0f / x + 5.0f;
        }
        
If you compile it on x64 with

    gcc -g0 -O3 -S -o - test.c

you'll get 
   
        	.file	"foo.c"
        	.text
        	.p2align 4,,15
        .globl foo
        	.type	foo, @function
        foo:
        .LFB0:
        	.cfi_startproc
        	unpcklps	%xmm0, %xmm0
        	cvtps2pd	%xmm0, %xmm1
        	movsd	.LC0(%rip), %xmm0
        	divsd	%xmm1, %xmm0
        	addsd	.LC1(%rip), %xmm0
        	unpcklpd	%xmm0, %xmm0
        	cvtpd2ps	%xmm0, %xmm0
        	ret
        	.cfi_endproc
        .LFE0:
        	.size	foo, .-foo
        	.p2align 4,,15
        .globl foof
        	.type	foof, @function
        foof:
        .LFB1:
        	.cfi_startproc
        	movaps	%xmm0, %xmm1
        	movss	.LC2(%rip), %xmm0
        	divss	%xmm1, %xmm0
        	addss	.LC3(%rip), %xmm0
        	ret
        	.cfi_endproc
        .LFE1:
        	.size	foof, .-foof
        	.section	.rodata.cst8,"aM", at progbits,8
        	.align 8
        .LC0:
        	.long	0
        	.long	1072693248
        	.align 8
        .LC1:
        	.long	0
        	.long	1075052544
        	.section	.rodata.cst4,"aM", at progbits,4
        	.align 4
        .LC2:
        	.long	1065353216
        	.align 4
        .LC3:
        	.long	1084227584
        	.ident	"GCC: (Debian 4.4.5-6) 4.4.5"
        	.section	.note.GNU-stack,"", at progbits

And as you can see, one function uses double precision, and the other
uses floating point.

Code quality is much better in the latter.

> Expecting that they will be added everywhere when no other
> compiler generates this warning is a losing battle.

I really think this is a battle everybody should fight. Perhaps the 

   condition ? 1.0 : 0.0

is something that a compiler should eliminate, but "single precision
expressions should use 'f' suffix on constants" seems to be a good rule
of thumb to follow.

Jose



More information about the mesa-dev mailing list