aboutsummaryrefslogtreecommitdiff
path: root/docs/history/13-gap-fixes/code/examples/wiring.zc
blob: ed30935440bd3a96f50e2bfc8ebc51a9d42a1df7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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 0x55555555; x = sub x r1"
	"; r1 = shr x 2; r1 = and r1 0x33333333; x = and x 0x33333333; x = add x r1"
	"; r1 = shr x 4; x = add x r1; x = and x 0x0f0f0f0f; x = mul x 0x01010101; x = shr x 24";
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 minmax(a, b) -> 2 micro "r2 = min a b; r1 = max a b; r0 = r2";
let lo, hi;
fn main()
{
	putn(popcount(0xff00ff)); putc(' ');
	putn(div10(12345)); putc(' ');
	putn(hypot2(3, 4)); putc(' ');
	asm { 9 4 minmax hi ! lo ! }
	putn(lo); putc('/'); putn(hi); putc(10);
	return 0;
}