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;
}
|