079-vararg-deep.c (865B)
1 /* Variadic receive past index 4 — extends §G.2 across the stack-arg 2 * boundary. P1 ABI puts args 0..3 in registers and args 4+ in the 3 * incoming stack-arg area accessed via LDARG. 4 * 5 * sum(6, 1, 2, 4, 8, 16, 32): n=6 named + 6 variadic. 6 * Register-passed: n=6, v0=1, v1=2, v2=4 7 * Stack-passed: v3=8, v4=16, v5=32 8 * Variadic sum = 63 9 */ 10 11 #ifndef CCSCM 12 #include <stdarg.h> 13 #else 14 typedef char *va_list; 15 #define va_start(ap, n) __builtin_va_start(ap, n) 16 #define va_arg(ap, t) __builtin_va_arg(ap, t) 17 #define va_end(ap) __builtin_va_end(ap) 18 #endif 19 20 int sum(int n, ...) { 21 va_list ap; 22 int total; 23 int i; 24 va_start(ap, n); 25 total = 0; 26 i = 0; 27 while (i < n) { 28 total = total + va_arg(ap, int); 29 i = i + 1; 30 } 31 va_end(ap); 32 return total; 33 } 34 35 int main(void) { 36 return sum(6, 1, 2, 4, 8, 16, 32); 37 }