19_cg_api_variadic_asm.toy (694B)
1 fn sum_first(n: i64, ...): i64 { 2 var ap: va_list; 3 @va_start(ap); 4 5 var cp: va_list; 6 @va_copy(cp, ap); 7 let first: i64 = @va_arg<i64>(cp); 8 @va_end(cp); 9 10 var i: i64 = 0; 11 var s: i64 = 0; 12 while i < n { 13 s = s + @va_arg<i64>(ap); 14 i = i + 1; 15 } 16 @va_end(ap); 17 return s + first; 18 } 19 20 fn __user_main(): i64 { 21 var v: i64 = @asm<isize>( 22 "", 23 outputs(inout("+r", 42 as isize)), 24 inputs(), 25 clobbers(), 26 flags(.volatile) 27 ); 28 var s: i64 = 23; 29 @asm<void>("", outputs(), inputs(in("r", 19), in("r", 23))); 30 @asm<void>("", outputs(), inputs()); 31 s = sum_first(3, 5 as i64, 6 as i64, 7 as i64); 32 return s + v; 33 } 34 35 fn main(): i32 { return __user_main() as i32; }