[dmd-internals] 64 bit bug: rndtol fails.
Walter Bright
walter at digitalmars.com
Tue Jan 18 20:39:12 PST 2011
Thanks, Brad & Don. Commit 882.
Brad Roberts wrote:
> On 1/12/2011 1:45 PM, Don Clugston wrote:
>
>> ---
>> import std.math;
>>
>> void main()
>> {
>> assert( rndtol(-3.0) == -3 );
>> }
>> ---
>>
>> This is the only failure in std.mathspecial.
>>
>
> Confirmed buggy in d1 as well.
>
> The generated code:
> _Dmain:
> push RBP
> mov RBP,RSP
> sub RSP,010h
> fld tbyte ptr FLAT:.rodata[00h][RIP]
> fistp long64 ptr -8[RBP]
> mov EAX,-8[RBP]
> cmp RAX,0FFFFFFFDh
> je L25
> mov EDI,7
> call _D3bug8__assertFiZv at PC32
> L25: xor EAX,EAX
> leave
> ret
>
> Comparing it with the 32 bit version, the tbyte ptr part is fine, but the mov
> EAX is almost certainly wrong.
>
> Try this change.. tested only with this repro case so far:
>
> Index: backend/cg87.c
> ===================================================================
> --- backend/cg87.c (revision 880)
> +++ backend/cg87.c (working copy)
> @@ -3063,7 +3063,11 @@
> genfltreg(c2,0x8B,findreglsw(retregs),0);
> }
> else
> + {
> c2 = genfltreg(c2,0x8B,reg,0); // MOV reg,floatreg
> + if (tysize(tym) == 8 && I64)
> + code_orrex(c2, REX_W);
> + }
> c2 = cat(c2,fixresult(e,retregs,pretregs));
>
> return cat(c1,c2);
>
> _______________________________________________
> dmd-internals mailing list
> dmd-internals at puremagic.com
> http://lists.puremagic.com/mailman/listinfo/dmd-internals
>
>
>
More information about the dmd-internals
mailing list