Before: %st(0) = left, %st(1) = right, stack unchanged.
After: with SetFloat, %eax = left op right, stack unchanged.
public override sealed void OperateFloat(CGenState state) { // In the beginning, %st(0) = Left, %st(1) = Right. // // float stack: // +-----+ // | rhs | <- %st(1) // +-----+ // | lfs | <- %st(0) // +-----+ // // 1. Do comparison between %st(0) and %st(1). // Pop one Value from FPU stack. // // float stack: // +-----+ // | rhs | <- %st(0) // +-----+ // state.FUCOMIP(); // 2. Pop another Value from FPU stack. // // float stack: // +-----+ empty // state.FSTP(Reg.ST0); // 3. Set bit based on comparison result. SetFloat(state); state.MOVZBL(Reg.AL, Reg.EAX); }