ref: 5d354bf7c61f9fd4ec345978b52f415c54acf5aa
parent: fdc93a79e2ce73bcca7389707e0dae4bc66b3f45
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jun 26 11:13:10 EDT 2016
kernel: more (arm) compiler friendly mul64fract() the arm compiler can lift long->vlong casts on multiplcation and convert 64x64->64 multiplication into a 32x32->64 one with optional 64 bit accumulate.
--- a/sys/src/9/port/mul64fract.c
+++ b/sys/src/9/port/mul64fract.c
@@ -21,19 +21,15 @@
void
mul64fract(uvlong *r, uvlong a, uvlong b)
{- uvlong bh, bl;
- uvlong ah, al;
- uvlong res;
+ ulong bh, bl, ah, al;
- bl = b & 0xffffffffULL;
+ bl = b;
bh = b >> 32;
- al = a & 0xffffffffULL;
+ al = a;
ah = a >> 32;
- res = (al*bl)>>32;
- res += (al*bh);
- res += (ah*bl);
- res += (ah*bh)<<32;
-
- *r = res;
+ *r = (((uvlong)al*(uvlong)bl)>>32)
+ + ((uvlong)al*(uvlong)bh)
+ + ((uvlong)ah*(uvlong)bl)
+ + (((uvlong)ah*(uvlong)bh)<<32);
}
--
⑨