#include struct regs { unsigned char c_regs[8]; unsigned s_regs[128]; }; unsigned add_32 (unsigned a, unsigned b) { return a + b; } unsigned sub_32 (unsigned a, unsigned b) { return a - b; } unsigned ld_32 (unsigned * const b) { return *b; } void st_32 (unsigned a, unsigned * const b) { *b = a; } unsigned char cmp_lt_32 (unsigned a, unsigned b) { return a < b; } void fib (unsigned * const r, unsigned * const n) { struct regs gpu_reg_p; gpu_reg_p.s_regs[1] = ld_32(n); gpu_reg_p.c_regs[1] = cmp_lt_32(gpu_reg_p.s_regs[1], 3); if (gpu_reg_p.c_regs[1]) { goto ret; } unsigned p; { unsigned nm2; unsigned res; gpu_reg_p.s_regs[2] = sub_32(gpu_reg_p.s_regs[1], 2); st_32(gpu_reg_p.s_regs[2], &nm2); fib(&res, &nm2); gpu_reg_p.s_regs[2] = ld_32(&res); } st_32(gpu_reg_p.s_regs[2], &p); { unsigned nm2; unsigned res; gpu_reg_p.s_regs[2] = sub_32(gpu_reg_p.s_regs[1], 1); st_32(gpu_reg_p.s_regs[2], &nm2); fib(&res, &nm2); gpu_reg_p.s_regs[2] = ld_32(&res); } gpu_reg_p.s_regs[3] = ld_32(&p); gpu_reg_p.s_regs[2] = add_32(gpu_reg_p.s_regs[2], gpu_reg_p.s_regs[3]); st_32(gpu_reg_p.s_regs[2], r); return; ret: st_32(1, r); return; } void fibKernel (unsigned * const r_ptr, unsigned * const n_ptr) { struct regs gpu_reg_p; { unsigned r; unsigned n; gpu_reg_p.s_regs[0] = *n_ptr; st_32(gpu_reg_p.s_regs[0], &n); fib(&r, &n); gpu_reg_p.s_regs[0] = ld_32(&r); //s1 = *r_ptr; //*((unsigned *)s1) = s0; *r_ptr = gpu_reg_p.s_regs[0]; } return; } int main (void) { unsigned r; unsigned i; for (i = 1; i < 20; i++) { fibKernel(&r, &i); printf("%u ", r); } return 0; }