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