On 18 April 2011 22:00, Aurelien Jarno <aurel...@aurel32.net> wrote: > Signed-off-by: Aurelien Jarno <aurel...@aurel32.net> > --- > target-i386/op_helper.c | 7 ++++--- > 1 files changed, 4 insertions(+), 3 deletions(-) > > diff --git a/target-i386/op_helper.c b/target-i386/op_helper.c > index f614893..7dddd37 100644 > --- a/target-i386/op_helper.c > +++ b/target-i386/op_helper.c > @@ -3920,9 +3920,10 @@ void helper_fbld_ST0(target_ulong ptr) > v = ldub(ptr + i); > val = (val * 100) + ((v >> 4) * 10) + (v & 0xf); > } > - tmp = val; > - if (ldub(ptr + 9) & 0x80) > - tmp = -tmp; > + if (ldub(ptr + 9) & 0x80) { > + val = -val; > + } > + tmp = int64_to_floatx(val, &env->fp_status); > fpush(); > ST0 = tmp; > }
This doesn't do the right thing for -0 (should generate -0, not +0). I think: tmp = int64_to_floatx(val, &env->fp_status); if (ldub(ptr + 9) & 0x80) { floatx_chs(tmp); } ought to do the right thing and work for both softfloat and sf-native, but I haven't tested it. -- PMM