[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