demo.toy (1457B)
1 let seed: i64 = 5; 2 var counter: i64 = 3; 3 var counter_ptr: *i64 = &counter; 4 5 fn id(x: i64): i64 { 6 return x; 7 } 8 9 fn id_tail(x: i64): i64 { 10 return tail id(x); 11 } 12 13 fn fib(n: i64): i64 { 14 if n < 2 { 15 return n; 16 } 17 return fib(n - 1) + fib(n - 2); 18 } 19 20 fn sum_to(n: i64): i64 { 21 var i: i64 = 0; 22 var sum: i64 = 0; 23 while i < n { 24 i = i + 1; 25 if i == 3 { 26 continue; 27 } 28 if i > 6 { 29 break; 30 } 31 sum = sum + i; 32 } 33 return sum; 34 } 35 36 fn memory_demo(): i64 { 37 var a: i64 = 0; 38 var b: i64 = 0; 39 let p: *i64 = &a; 40 let q: *i64 = &b; 41 42 p[0] = 42; 43 @memset(q, 0, 8, 8); 44 @memcpy(q, p, 8, 8); 45 return q[0]; 46 } 47 48 fn atomic_demo(): i64 { 49 @atomic_store<i64>(counter_ptr, 10, .seq_cst); 50 let before: i64 = @atomic_rmw<i64>(.add, counter_ptr, 5, .seq_cst); 51 let after: i64 = @atomic_load<i64>(counter_ptr, .seq_cst); 52 let cas = @atomic_cmpxchg<i64>(counter_ptr, after, 21, .seq_cst, .relaxed, 53 .strong); 54 @atomic_fence(.seq_cst); 55 return before + after + (cas.ok as i64); 56 } 57 58 fn intrin_demo(x: i64): i64 { 59 return @popcount(x) + @ctz(8) + @clz(1) + @expect(1, 1) + @bswap(1); 60 } 61 62 fn api_demo(): i64 { 63 @asm<void>("", outputs(), inputs()); 64 return 1 + 42 + 42; 65 } 66 67 fn main(): i64 { 68 let local: i64 = seed + counter_ptr.*; 69 counter = counter + 2; 70 return id_tail(local) 71 + fib(6) 72 + sum_to(8) 73 + memory_demo() 74 + atomic_demo() 75 + intrin_demo(7) 76 + api_demo(); 77 }