From 2b5b00b0ffef0b42d5a0c80f339eec216a3f899c Mon Sep 17 00:00:00 2001 From: Marcus Meissner Date: Mon, 26 Apr 2004 20:05:52 +0000 Subject: [PATCH] Fixed position of tmp.f assigned like in dlls/d3d8/shader.c. Fixed strict aliasing problem. --- dlls/wined3d/vertexshader.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c index 014f6d3e143..7773b9baf36 100644 --- a/dlls/wined3d/vertexshader.c +++ b/dlls/wined3d/vertexshader.c @@ -116,14 +116,17 @@ void vshader_dst(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0, D3DSHADERVECTOR* s1) { } void vshader_expp(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0) { - float tmp_f = floorf(s0->w); - DWORD tmp_d = 0; - tmp_f = powf(2.0f, s0->w); - tmp_d = *((DWORD*) &tmp_f) & 0xFFFFFF00; + union { + float f; + DWORD d; + } tmp; - d->x = powf(2.0f, tmp_f); - d->y = s0->w - tmp_f; - d->z = *((float*) &tmp_d); + tmp.f = floorf(s0->w); + d->x = powf(2.0f, tmp.f); + d->y = s0->w - tmp.f; + tmp.f = powf(2.0f, s0->w); + tmp.d &= 0xFFFFFF00U; + d->z = tmp.f; d->w = 1.0f; VSTRACE(("executing exp: s0=(%f, %f, %f, %f) => d=(%f, %f, %f, %f)\n", s0->x, s0->y, s0->z, s0->w, d->x, d->y, d->z, d->w));