aboutsummaryrefslogtreecommitdiff
path: root/examples/wiring.zc
blob: d10ecf5b7f730eb34d5e4897ab428d9a0ac6bb91 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// virtual enhancements: custom opcodes wired into the cpu while compiling.
// the recipes run through the core's optimizer; the jit inlines the result.
enhance popcount(x) micro
	"r1 = shr x 1; r1 = and r1 0x5555555555555555; x = sub x r1"
	"; r1 = shr x 2; r1 = and r1 0x3333333333333333; x = and x 0x3333333333333333; x = add x r1"
	"; r1 = shr x 4; x = add x r1; x = and x 0x0f0f0f0f0f0f0f0f; x = mul x 0x0101010101010101; x = shr x 56";
enhance div10(x) micro "x = udiv x 10";		// becomes a multiply-high, no divide
enhance hypot2(a, b) vm { 0 $ * ~ 0 $ * + };	// lifted from vm code
enhance 2 minmax(a, b) micro "r2 = min a b; r1 = max a b; r0 = r2";
let lo, hi;
fn main() {
	put_n(popcount(0xff00ff)); put_c(' ');
	put_n(div10(12345)); put_c(' ');
	put_n(hypot2(3, 4)); put_c(' ');
	asm { 9 4 minmax hi ! lo ! }
	put_n(lo); put_c('/'); put_n(hi); put_c(10);
	return 0;
}