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