boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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 }