[dmd-internals] Floating point %= clobbering eax

Daniel Murphy yebblies at gmail.com
Wed Feb 22 22:20:00 PST 2012


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