[dmd-internals] Floating point %= clobbering eax

Daniel Murphy yebblies at gmail.com
Wed Feb 22 22:42:58 PST 2012


Never mind, I think I've got it.

On Thu, Feb 23, 2012 at 17:20, Daniel Murphy <yebblies at gmail.com> wrote:
> With my patch to improve code gen for OPmsw, the compiler can
> eliminate some useless loads of array lengths to eax.
> Unfortunately, it doesn't seem to realize that fnstsw modifies EAX,
> resulting in a crash on the second load.
>
> Does anyone know where/how registers are marked as used?  Nothing I've
> tried seems to affect code generation at all.
>
> The fnstsw instruction is generated around cg87.c:2342
>
> _D5testx6divassFAeeZv PROC NEAR
> ;  COMDEF _D5testx6divassFAeeZv
>        push    ebp                                     ; 0000 _ 55
>        mov     ebp, esp                                ; 0001 _ 8B. EC
>        mov     eax, offset FLAT:?_007                  ; 0003 _ B8,
> 00000030(segrel)
>        push    eax                                     ; 0008 _ 50
>        call    _system                                 ; 0009 _ E8,
> 00000000(rel)
>        add     esp, 4                                  ; 000E _ 83. C4, 04
>        nop                                             ; 0011 _ 90
>        fld     tbyte ptr [ebp+8H]                      ; 0012 _ DB. 6D, 08
>        mov     eax, dword ptr [ebp+18H]                ; 0015 _ 8B. 45, 18
>        fld     tbyte ptr [eax]                         ; 0018 _ DB. 28
> ?_009:  fprem                                           ; 001A _ D9. F8
>        fnstsw  ax                                      ; 001C _ DF. E0
>        sahf                                            ; 001E _ 9E
>        jpe     ?_009                                   ; 001F _ 7A, F9
>        fstp    st(1)                                   ; 0021 _ DD. D9
>        fstp    tbyte ptr [eax]                         ; 0023 _ DB. 38
>        nop                                             ; 0025 _ 90
>        pop     ebp                                     ; 0026 _ 5D
>        ret     20                                      ; 0027 _ C2, 0014
> _D5testx6divassFAeeZv ENDP


More information about the dmd-internals mailing list