166633Sdfr/*	$NetBSD$	*/
266633Sdfr
366633Sdfr/*
4139815Simp * tsftomsu - convert from a time stamp fraction to milliseconds
5139815Simp */
666633Sdfr#include "ntp_fp.h"
766633Sdfr#include "ntp_stdlib.h"
866633Sdfr
966633Sdfrint
1066633Sdfrtsftomsu(
1166633Sdfr	u_long tsf,
1266633Sdfr	int round
1366633Sdfr	)
1466633Sdfr{
1566633Sdfr	register long val_ui, val_uf;
1666633Sdfr	register long tmp_ui, tmp_uf;
1766633Sdfr	register int i;
1866633Sdfr
1966633Sdfr	/*
2066633Sdfr	 * Essentially, multiply by 10 three times in l_fp form.
2166633Sdfr	 * The integral part is the milliseconds.
2266633Sdfr	 */
2366633Sdfr	val_ui = 0;
2466633Sdfr	val_uf = tsf;
2566633Sdfr	for (i = 3; i > 0; i--) {
2666633Sdfr		M_LSHIFT(val_ui, val_uf);
2766633Sdfr		tmp_ui = val_ui;
2866633Sdfr		tmp_uf = val_uf;
2966633Sdfr		M_LSHIFT(val_ui, val_uf);
3066633Sdfr		M_LSHIFT(val_ui, val_uf);
3166633Sdfr		M_ADD(val_ui, val_uf, tmp_ui, tmp_uf);
3266633Sdfr	}
3366633Sdfr
3466633Sdfr	/*
3566633Sdfr	 * Round the value if need be, then return it.
3666633Sdfr	 */
3766633Sdfr	if (round && (val_uf & 0x80000000))
3866633Sdfr	    val_ui++;
3966633Sdfr	return (int)val_ui;
4066633Sdfr}
4166633Sdfr