Nonworking scalarization patch
Eric S. Raymond
esr at thyrsus.com
Wed Jan 4 05:53:45 UTC 2017
Hal, I've enclosed the should-be-working-but-isn't scalarization patch
for l_fp. This is the one that passes unit tests but stalls the
protocol machine in INIT.
(Another reason I didn't mention for wanting this done is that neither
of the languages we might move to has the equivalent of C unions, so I'm
trying to clean unions out of the code. This is the last essential one.)
I have to pay attention to my meatspace life tomorrow - medical
damn-I-hate-needles appointment and some other things. If you
have time, please do the diagnostic thing you were suggesting to me.
(You'll probably do it better than I would, anyway.)
I'll be back at work on Thursday.
--
<a href="http://www.catb.org/~esr/">Eric S. Raymond</a>
-------------- next part --------------
diff --git a/include/ntp_fp.h b/include/ntp_fp.h
index 76e4e89..68a757e 100644
--- a/include/ntp_fp.h
+++ b/include/ntp_fp.h
@@ -29,39 +29,32 @@
* +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
*
*/
-typedef struct {
- union {
- uint32_t Xl_ui; /* unsigned integral part */
- int32_t Xl_i; /* signed integral part */
- } Ul_i;
- uint32_t l_uf;
-} l_fp;
-
-#define lfpfrac(n) ((n).l_uf)
-#define setlfpfrac(n, v) (n).l_uf = (v)
-#define lfpsint(n) (n).Ul_i.Xl_i
-#define setlfpsint(n, v) (n).Ul_i.Xl_i = (v)
-#define bumplfpsint(n, i) (n).Ul_i.Xl_i += (i)
-#define lfpuint(n) (n).Ul_i.Xl_ui
-#define setlfpuint(n, v) (n).Ul_i.Xl_ui = (v)
-#define bumplfpuint(n, i) (n).Ul_i.Xl_ui += (i)
+typedef uint64_t l_fp;
+#define LOW32 0x00000000ffffffffUL
+#define HIGH32 0xffffffff00000000UL
+#define BUMP 0x0000000100000000UL
+#define lfpfrac(n) ((uint32_t)((n) & LOW32))
+#define setlfpfrac(n, v) (n) = (((n) & HIGH32) | ((v) & LOW32))
+#define lfpsint(n) (int32_t)(((n) & HIGH32) >> 32)
+#define setlfpsint(n, v) (n) = (int64_t)((((int64_t)(v)) << 32) | ((n) & LOW32))
+#define bumplfpsint(n, i) (n) += (i)*BUMP
+#define lfpuint(n) (uint32_t)(((n) & HIGH32) >> 32)
+#define setlfpuint(n, v) (n) = (uint64_t)((((uint64_t)(v)) << 32) | ((n) & LOW32))
+#define bumplfpuint(n, i) (n) += (i)*BUMP
static inline uint64_t lfp_to_uint64(const l_fp lfp)
{
- return (uint64_t)lfpuint(lfp) << 32 | (uint64_t)lfpfrac(lfp);
+ return lfp;
}
static inline l_fp uint64_to_lfp(uint64_t x)
{
- l_fp fp;
- setlfpuint(fp, x >> 32);
- setlfpfrac(fp, x & 0xFFFFFFFFUL);
- return fp;
+ return x;
}
static inline l_fp lfpinit(int32_t hi, uint32_t lo)
{
- l_fp tmp;
+ l_fp tmp = 0;
setlfpsint(tmp, hi);
setlfpfrac(tmp, lo);
return tmp;
diff --git a/libntp/refidsmear.c b/libntp/refidsmear.c
index 96e1bcc..ce3ed51 100644
--- a/libntp/refidsmear.c
+++ b/libntp/refidsmear.c
@@ -17,7 +17,7 @@
l_fp
convertRefIDToLFP(uint32_t r)
{
- l_fp temp;
+ l_fp temp = 0;
r = ntohl(r);
More information about the devel
mailing list