value range propagation for _bitwise_ OR

Adam D. Ruppe destructionator at gmail.com
Sat Apr 10 16:38:07 PDT 2010


On Sat, Apr 10, 2010 at 04:02:05PM -0400, Adam D. Ruppe wrote:
> That breaks it. Back to the drawing board.

I *might* have it, but I'm not 100% confident in my test program. Here's my
implementation:

====
import std.intrinsic;

uint max(uint a, uint b) { return (a >= b) ? a : b; }
uint min(uint a, uint b) { return (a >= b) ? b : a; }
uint numbits(uint a) { return a == 0 ? a : (bsr(a) + 1); }

uint max_c(uint a, uint b) {
	uint mn = min(a, b);
	uint mx = max(a, b);
	if(mn == 0)
		return mx;
	// if there is a bit we can reuse, it grants us everything before it too
	uint reusable = mn & mx;
	if(reusable)
		return (mx | ((1 << numbits(reusable)) - 1)) | mn;
	else
		return mx | mn;
}

uint min_c(uint min_a, uint min_b) {
	return max(min_a, min_b);
}
=====

I can't believe I spent all day on this...

-- 
Adam D. Ruppe
http://arsdnet.net



More information about the Digitalmars-d mailing list