lightning
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Lightning] Floating point branches


From: Mike Spivey
Subject: [Lightning] Floating point branches
Date: Mon, 16 Feb 2009 18:02:41 +0000
User-agent: Thunderbird 2.0.0.19 (X11/20090105)

I encountered three problems with floating point branches on i386 with
the GIT version of lightning.  The patches shown below seem to work for
me, but I haven't made extensive tests.

-- Mike

(i) Instructions beqr_f, ... are not defined, but only beqr_d, ...  On
i386, they are the same, but maybe not on other architectures.
Solution:

#ifndef jit_beqr_f
#define jit_beqr_f(lab, a, b) jit_beqr_d(lab, a, b)
#define jit_bner_f(lab, a, b) jit_bner_d(lab, a, b)
#define jit_bgtr_f(lab, a, b) jit_bgtr_d(lab, a, b)
#define jit_bger_f(lab, a, b) jit_bger_d(lab, a, b)
#define jit_bltr_f(lab, a, b) jit_bltr_d(lab, a, b)
#define jit_bler_f(lab, a, b) jit_bler_d(lab, a, b)
#endif

(ii) The floating point branches depend on the existence of operations
JCm and JNCm that don't exist.  They should be synonyms for JBm and
JNBm.  Solution:

#ifndef JCm
#define JCm JBm
#define JNCm JNBm
#endif

(iii) The macro jit_fp_btest wrongly ends with a call to
res ((d), 0, 0, 0).  This should read res (d).  Solution:

#undef jit_fp_btest

#define jit_fp_btest(d, s1, s2, n, _and, cmp, res)             \
       (((s1) == 0 ? FUCOMr((s2)) : (FLDr((s1)), FUCOMPr((s2) + 1))),    \
        PUSHLr(_EAX),                                          \
        FNSTSWr(_EAX),                                         \
        SHRLir(n, _EAX),                                       \
        ((_and) ? ANDLir ((_and), _EAX) : 0),                  \
        ((cmp) ? CMPLir ((cmp), _AL) : 0),                     \
        POPLr(_EAX),                                           \
        res (d),                                               \
        _jit.x.pc)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]