digitalmars.D.bugs - [Issue 6877] New: [XMM] regression, clobbered float value
- d-bugmail puremagic.com (63/63) Nov 01 2011 http://d.puremagic.com/issues/show_bug.cgi?id=6877
- d-bugmail puremagic.com (36/36) Nov 01 2011 http://d.puremagic.com/issues/show_bug.cgi?id=6877
- d-bugmail puremagic.com (13/13) Nov 01 2011 http://d.puremagic.com/issues/show_bug.cgi?id=6877
http://d.puremagic.com/issues/show_bug.cgi?id=6877 Summary: [XMM] regression, clobbered float value Product: D Version: D2 Platform: x86_64 OS/Version: Linux Status: NEW Keywords: wrong-code Severity: normal Priority: P2 Component: DMD AssignedTo: nobody puremagic.com ReportedBy: dawg dawgfoto.de struct Matrix { float[3][3] data; ref float[3] opIndex(size_t idx) { assert(0 <= idx && idx <= 2); return this.data[idx]; } static Matrix identityMatrix() { Matrix id; id.data[0][0] = 1.0f; id.data[0][1] = 0.0f; id.data[0][2] = 0.0f; id.data[1][0] = 0.0f; id.data[1][1] = 1.0f; id.data[1][2] = 0.0f; id.data[2][0] = 0.0f; id.data[2][1] = 0.0f; id.data[2][2] = 1.0f; return id; } void setRotate(float deg) { this = identityMatrix(); setSinCos(0.5f * deg, 0.2f * deg); } void setSinCos(float sinV, float cosV) { this[0][0] = cosV; this[0][1] = -sinV; // <- !!! BUG HERE BUG !!! // alternatively with this // *(cast(uint*)&(this[0][1])) = (*cast(uint*)&sinV) ^ 0x80000000; // thus it is not the OPneg that fails this[1][0] = sinV; this[1][1] = cosV; } } extern(C) int printf(in char* format, ...); void main() { Matrix m; m.setRotate(4); // should be -2 printf("%g\n", m.data[0][1]); } --- Needed Flags: -O -inline, NOT -release, compilation with config.fpxmmregs The is NaN where it should have been -2. I could not reduce this test case any further. This regression was introduced with: https://github.com/D-Programming-Language/dmd/commit/82b5c12653c16097426ce990ecacc97525666302 -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 01 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6877 struct Matrix { void setSinCos(float sinV) { // use parameter, so it becomes a register veriable a = sinV * sinV; // refer to value of parameter version (none) val = -sinV; else // which 'eleq' optimizes to *cast(uint*)&val = (*cast(uint*)&sinV) ^ 0x80000000; } float a, val; } extern(C) int printf(in char* format, ...); void main() { Matrix m; printf("%g\n", m.val); // indirect to prevent CTFE auto dg = &m.setSinCos; dg(2.0); printf("%g\n", m.val); } ----------------------------------------------------- sinV is a register variable residing in xmm2. The load for the left xor operand is done with mov %edx, %eax which should be movd %xmm2, %eax instead, same modrm though. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 01 2011
http://d.puremagic.com/issues/show_bug.cgi?id=6877 Walter Bright <bugzilla digitalmars.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED CC| |bugzilla digitalmars.com Resolution| |FIXED 21:19:12 PDT --- https://github.com/D-Programming-Language/dmd/commit/9d68b00cb299a6abdcd2e79b4d4cddf5dd8b28c2 https://github.com/D-Programming-Language/dmd/commit/bcb742282c6a1ac36480e38e505d8b666dcf610a -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Nov 01 2011